js-draw 1.26.0 → 1.27.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. package/dist/Editor.css +1 -1
  2. package/dist/bundle.js +42 -37
  3. package/dist/bundledStyles.js +1 -1
  4. package/dist/cjs/Editor.d.ts +0 -2
  5. package/dist/cjs/components/AbstractComponent.d.ts +15 -0
  6. package/dist/cjs/components/AbstractComponent.js +16 -0
  7. package/dist/cjs/components/Stroke.d.ts +1 -0
  8. package/dist/cjs/components/Stroke.js +7 -0
  9. package/dist/cjs/toolbar/IconProvider.d.ts +2 -1
  10. package/dist/cjs/toolbar/IconProvider.js +18 -8
  11. package/dist/cjs/toolbar/localization.d.ts +2 -0
  12. package/dist/cjs/toolbar/localization.js +2 -0
  13. package/dist/cjs/toolbar/widgets/SelectionToolWidget.d.ts +7 -0
  14. package/dist/cjs/toolbar/widgets/SelectionToolWidget.js +109 -28
  15. package/dist/cjs/toolbar/widgets/components/makeButtonGrid.d.ts +17 -0
  16. package/dist/cjs/toolbar/widgets/components/makeButtonGrid.js +40 -0
  17. package/dist/cjs/tools/SelectionTool/Selection.d.ts +2 -3
  18. package/dist/cjs/tools/SelectionTool/Selection.js +19 -40
  19. package/dist/cjs/tools/SelectionTool/SelectionBuilders/LassoSelectionBuilder.d.ts +17 -0
  20. package/dist/cjs/tools/SelectionTool/SelectionBuilders/LassoSelectionBuilder.js +67 -0
  21. package/dist/cjs/tools/SelectionTool/SelectionBuilders/RectSelectionBuilder.d.ts +13 -0
  22. package/dist/cjs/tools/SelectionTool/SelectionBuilders/RectSelectionBuilder.js +33 -0
  23. package/dist/cjs/tools/SelectionTool/SelectionBuilders/SelectionBuilder.d.ts +15 -0
  24. package/dist/cjs/tools/SelectionTool/SelectionBuilders/SelectionBuilder.js +39 -0
  25. package/dist/cjs/tools/SelectionTool/SelectionTool.d.ts +10 -2
  26. package/dist/cjs/tools/SelectionTool/SelectionTool.js +68 -55
  27. package/dist/cjs/tools/SelectionTool/types.d.ts +4 -0
  28. package/dist/cjs/tools/SelectionTool/types.js +6 -1
  29. package/dist/cjs/tools/lib.d.ts +1 -1
  30. package/dist/cjs/tools/lib.js +2 -1
  31. package/dist/cjs/util/ReactiveValue.js +2 -6
  32. package/dist/cjs/version.js +1 -1
  33. package/dist/mjs/Editor.d.ts +0 -2
  34. package/dist/mjs/components/AbstractComponent.d.ts +15 -0
  35. package/dist/mjs/components/AbstractComponent.mjs +16 -0
  36. package/dist/mjs/components/Stroke.d.ts +1 -0
  37. package/dist/mjs/components/Stroke.mjs +7 -0
  38. package/dist/mjs/toolbar/IconProvider.d.ts +2 -1
  39. package/dist/mjs/toolbar/IconProvider.mjs +18 -8
  40. package/dist/mjs/toolbar/localization.d.ts +2 -0
  41. package/dist/mjs/toolbar/localization.mjs +2 -0
  42. package/dist/mjs/toolbar/widgets/SelectionToolWidget.d.ts +7 -0
  43. package/dist/mjs/toolbar/widgets/SelectionToolWidget.mjs +109 -28
  44. package/dist/mjs/toolbar/widgets/components/makeButtonGrid.d.ts +17 -0
  45. package/dist/mjs/toolbar/widgets/components/makeButtonGrid.mjs +35 -0
  46. package/dist/mjs/tools/SelectionTool/Selection.d.ts +2 -3
  47. package/dist/mjs/tools/SelectionTool/Selection.mjs +19 -40
  48. package/dist/mjs/tools/SelectionTool/SelectionBuilders/LassoSelectionBuilder.d.ts +17 -0
  49. package/dist/mjs/tools/SelectionTool/SelectionBuilders/LassoSelectionBuilder.mjs +61 -0
  50. package/dist/mjs/tools/SelectionTool/SelectionBuilders/RectSelectionBuilder.d.ts +13 -0
  51. package/dist/mjs/tools/SelectionTool/SelectionBuilders/RectSelectionBuilder.mjs +27 -0
  52. package/dist/mjs/tools/SelectionTool/SelectionBuilders/SelectionBuilder.d.ts +15 -0
  53. package/dist/mjs/tools/SelectionTool/SelectionBuilders/SelectionBuilder.mjs +36 -0
  54. package/dist/mjs/tools/SelectionTool/SelectionTool.d.ts +10 -2
  55. package/dist/mjs/tools/SelectionTool/SelectionTool.mjs +68 -55
  56. package/dist/mjs/tools/SelectionTool/types.d.ts +4 -0
  57. package/dist/mjs/tools/SelectionTool/types.mjs +5 -0
  58. package/dist/mjs/tools/lib.d.ts +1 -1
  59. package/dist/mjs/tools/lib.mjs +1 -1
  60. package/dist/mjs/util/ReactiveValue.mjs +2 -6
  61. package/dist/mjs/version.mjs +1 -1
  62. package/package.json +4 -4
  63. package/src/toolbar/EdgeToolbar.scss +6 -1
  64. package/src/toolbar/widgets/components/components.scss +1 -0
  65. package/src/toolbar/widgets/components/makeButtonGrid.scss +25 -0
  66. package/src/tools/SelectionTool/SelectionTool.scss +1 -0
  67. package/src/tools/util/createMenuOverlay.scss +3 -2
package/dist/bundle.js CHANGED
@@ -1,9 +1,9 @@
1
- "use strict";var jsdraw=(()=>{var fn=Object.defineProperty;var oa=Object.getOwnPropertyDescriptor;var ra=Object.getOwnPropertyNames;var na=Object.prototype.hasOwnProperty;var ia=(s,o)=>{for(var e in o)fn(s,e,{get:o[e],enumerable:!0})},sa=(s,o,e,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of ra(o))!na.call(s,n)&&n!==e&&fn(s,n,{get:()=>o[n],enumerable:!(r=oa(o,n))||r.enumerable});return s};var aa=s=>sa(fn({},"__esModule",{value:!0}),s);var Pl={};ia(Pl,{Abstract2DShape:()=>bo,AbstractComponent:()=>q,AbstractRenderer:()=>Le,AbstractToolbar:()=>it,ActionButtonWidget:()=>xe,BackgroundComponent:()=>ae,BackgroundComponentBackgroundType:()=>so,BaseTool:()=>W,BaseToolWidget:()=>ye,BaseWidget:()=>ue,CanvasRenderer:()=>Ie,Color4:()=>L,Command:()=>Be,ComponentSizingMode:()=>Qt,Display:()=>Ot,DocumentPropertiesWidget:()=>jt,DummyRenderer:()=>ot,Duplicate:()=>Rt,Editor:()=>pn,EditorEventType:()=>Z,EditorImage:()=>_,Erase:()=>J,EraserMode:()=>no,EraserTool:()=>Je,EraserToolWidget:()=>$t,EventDispatcher:()=>He,HTMLToolbar:()=>it,HandToolWidget:()=>Kt,IconProvider:()=>Ft,ImageComponent:()=>be,InputEvtType:()=>Ne,InputMapper:()=>ze,InsertImageWidget:()=>Gt,KeyBinding:()=>Tt,KeyboardShortcutManager:()=>H,LineSegment2:()=>ce,Mat33:()=>k,MutableReactiveValue:()=>pe,PanZoomMode:()=>Do,PanZoomTool:()=>Ce,Parameterized2DShape:()=>vo,PasteHandler:()=>Bt,Path:()=>G,PathCommandType:()=>Ee,PenTool:()=>$e,PenToolWidget:()=>Nt,Pointer:()=>Re,PointerDevice:()=>Ge,QuadraticBezier:()=>Ae,ReactiveValue:()=>j,Rect2:()=>B,RenderingMode:()=>Gr,SVGLoader:()=>et,SVGRenderer:()=>me,SelectAllShortcutHandler:()=>Mt,SelectionTool:()=>ve,SelectionToolWidget:()=>Ut,SerializableCommand:()=>U,SoundUITool:()=>At,Stroke:()=>ee,StrokeComponent:()=>ee,StrokeSmoother:()=>rs,Text:()=>re,TextComponent:()=>re,TextTool:()=>Ue,TextToolWidget:()=>Wt,ToolController:()=>Vt,ToolEnabledGroup:()=>mt,ToolSwitcherShortcut:()=>It,ToolbarShortcutHandler:()=>tt,ToolbarWidgetTag:()=>Ht,UndoEventType:()=>kn,UndoRedoHistory:()=>Wr,UndoRedoShortcut:()=>zt,Vec2:()=>w,Vec3:()=>F,Viewport:()=>$,__js_draw__version:()=>fo,adjustEditorThemeForContrast:()=>Ks,comparePathIndices:()=>So,createRestyleComponentCommand:()=>ut,default:()=>Sl,defaultEditorLocalization:()=>Xe,getLocalizationTable:()=>yr,invertCommand:()=>$s,isPointerEvt:()=>Jt,isRestylableComponent:()=>Mo,keyPressEventFromHTMLEvent:()=>Ro,keyUpEventFromHTMLEvent:()=>ko,makeArrowBuilder:()=>en,makeColorInput:()=>Ss,makeDropdownToolbar:()=>Us,makeEdgeToolbar:()=>Is,makeFilledRectangleBuilder:()=>rn,makeFreehandLineBuilder:()=>Qe,makeLineBuilder:()=>on,makeOutlinedCircleBuilder:()=>sn,makeOutlinedRectangleBuilder:()=>nn,makePolylineBuilder:()=>ft,makePressureSensitiveFreehandLineBuilder:()=>Dt,matchingLocalizationTable:()=>zo,pathFromRenderable:()=>ht,pathToRenderable:()=>Y,pathVisualEquivalent:()=>zr,sendPenEvent:()=>Xr,sendTouchEvent:()=>Ws,stepPathIndexBy:()=>hr,toRoundedString:()=>de,uniteCommands:()=>se});(()=>{if(typeof document<"u"&&typeof document.createElement=="function"){let s=document.createElement("style");s.textContent='\uFEFF:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content>div>div{padding:5px}:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content>div{min-height:0}:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content img{max-width:100%;max-height:100%;display:block;margin-left:auto;margin-right:auto}:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content .insert-image-image-status-view{display:flex;justify-content:space-between;padding-bottom:0}:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content .action-button-row{margin-top:4px;display:flex;flex-direction:row;justify-content:flex-end;padding-bottom:0;margin-bottom:0}:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content .action-button-row>button{flex-grow:1;text-align:end;max-width:50%;min-width:min(100%,40px)}.toolbar-overflow-widget-overflow-list{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:center}.toolbar-overflow-widget-overflow-list>.toolbar-toolContainer>.toolbar-button{height:var(--toolbar-button-height)}.toolbar-overflow-widget.horizontal .toolbar-overflow-widget-overflow-list{flex-direction:row}.toolbar-overflow-widget.horizontal>.toolbar-dropdown{max-width:100%;left:15px;right:15px;margin-left:0 !important;translate:none !important;padding:4px}:root .toolbar--pen-tool-toggle-buttons.toolbar--pen-tool-toggle-buttons{display:flex;justify-content:stretch;padding-top:0;padding-bottom:5px;direction:ltr}:root .toolbar--pen-tool-toggle-buttons.toolbar--pen-tool-toggle-buttons>*{flex-grow:1;text-align:start;margin-inline-end:5px}:root .toolbar--pen-tool-toggle-buttons.toolbar--pen-tool-toggle-buttons>* .icon{margin:0;margin-inline-start:4px;margin-inline-end:10px}:root .toolbar--pen-tool-toggle-buttons.toolbar--pen-tool-toggle-buttons>:nth-child(1){direction:ltr}:root .toolbar--pen-tool-toggle-buttons.toolbar--pen-tool-toggle-buttons>:last-child{direction:rtl}.toolbar-zoomLevelEditor{display:flex;flex-direction:row;align-items:center}.toolbar-zoomLevelEditor .zoomDisplay{flex-grow:1}.toolbar-zoomLevelEditor button{min-width:48px}.selection-format-menu.disabled{opacity:.5}.toolbar-document-properties-widget button.about-button{width:100%;text-align:end}.toolbar-document-properties-widget>*{--align-items-to-x: 120px}.toolbar-document-properties-widget .js-draw-size-input-row.js-draw-size-input-row{display:flex}.toolbar-document-properties-widget .js-draw-size-input-row.js-draw-size-input-row.size-input-row--automatic-size{display:none}.toolbar-thicknessSliderContainer{display:flex;flex-direction:row}.toolbar-thicknessSliderContainer input{flex-grow:1}.toolbar-element .clr-field *{cursor:pointer}.toolbar-element .clr-field button{width:1.2em;height:1.2em;top:50%;left:0;border-radius:50%;margin-left:0;margin-right:0}.toolbar-element .clr-field input{opacity:0}.color-input-container{display:inline-flex;flex-direction:row}.color-input-container .coloris_input{height:calc(100% - 6px)}.color-input-container.picker-open .clr-field{pointer-events:none}:root .color-input-container>button.pipetteButton{width:30px;height:30px;padding:0;display:inline-flex}.color-input-container>.color-input-wrapper{display:flex;justify-content:stretch}.color-input-container .pipetteButton>svg{width:100%}.color-input-container .pipetteButton .pickColorInstructions{display:none;font-size:1em;position:absolute;margin-left:30px;background-color:var(--background-color-1);border-radius:30px;padding:4px;opacity:0;transition:.2s ease opacity}@media(prefers-reduced-motion: reduce){.color-input-container .pipetteButton .pickColorInstructions{transition:none}}.color-input-container .pipetteButton.active{background-color:var(--selection-background-color);--icon-color: var(--selection-foreground-color)}.color-input-container .pipetteButton.active .pickColorInstructions{display:block;opacity:.8}.tool-dropdown-separator{--border-color: rgba(100, 100, 100, 0.2);--border-color: color-mix(in srgb, var(--foreground-color-1), rgba(0, 0, 0, 0) 80%);border-top:1px solid var(--border-color);padding-left:2px;margin-top:10px;margin-bottom:10px}.toolbar-element .toolbar--file-input-container{display:flex}.toolbar-element .toolbar--file-input-container.-loading{opacity:.8}.toolbar-element .toolbar--file-input-container>input.file-input{opacity:0;width:0;min-width:0 !important;max-width:0;height:0;overflow:hidden;padding:0;margin:0}.toolbar-element .toolbar--file-input-container>label{display:block;flex-grow:1;padding:0 !important;padding-bottom:5px;--active-border-color: rgba(100, 100, 100, 0.5);--active-border-color: color-mix(in srgb, var(--foreground-color-1), transparent)}.toolbar-element .toolbar--file-input-container>label .cancel-button{padding-left:3px;padding-right:3px}.toolbar-element .toolbar--file-input-container>label>.toolbar--file-input-description{background-color:var(--background-color-3);color:var(--foreground-color-3);border:1px dashed var(--active-border-color);padding:10px;margin-top:10px;display:flex;flex-direction:column;align-items:center;text-align:center;--action-color: var(--primary-action-foreground-color);--icon-color: var(--action-color)}.toolbar-element .toolbar--file-input-container>label>.toolbar--file-input-description>span{white-space:pre-wrap}.toolbar-element .toolbar--file-input-container>label>.toolbar--file-input-description>span>b{color:var(--action-color);cursor:pointer}.toolbar-element .toolbar--file-input-container>label>.toolbar--file-input-description>.icon{width:min(50vw,42px);height:min(50vw,42px);margin-bottom:8px;display:block}.toolbar-element .toolbar--file-input-container>label:active,.toolbar-element .toolbar--file-input-container>label:hover,.toolbar-element .toolbar--file-input-container>label.drag-target{--active-border-color: var(--foreground-color-1)}.toolbar-element .toolbar--file-input-container>label.drag-target>.toolbar--file-input-description{border-width:2px}.toolbar-grid-selector{position:relative}.toolbar-grid-selector>div{display:flex;flex-direction:row;max-width:350px;flex-wrap:wrap;--button-size: 48px}.toolbar-grid-selector .choice-button{display:flex;flex-direction:column-reverse;box-sizing:border-box;cursor:pointer;flex-shrink:1;margin:2px}.toolbar-grid-selector .choice-button.focus-visible{outline:2px solid var(--foreground-color-1)}.toolbar-grid-selector .choice-button input{opacity:0;height:0}.toolbar-grid-selector .choice-button label{display:flex;flex-direction:column;box-sizing:border-box;width:var(--button-size);height:var(--button-size);font-size:.7rem;align-items:center;justify-content:center;padding:4px;user-select:none;-webkit-user-select:none}.toolbar-grid-selector .choice-button .icon{flex-grow:1;flex-shrink:1;width:100%}.toolbar-grid-selector .choice-button.checked{background-color:var(--selection-background-color);color:var(--selection-foreground-color);--icon-color: var(--selection-foreground-color)}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list{height:min(200px,50vh);position:relative;display:flex;align-items:center}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.scroller{display:flex;flex-direction:column;overflow-y:auto;scroll-snap-type:y mandatory;height:100%;width:100%;flex-grow:1}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.scroller>.item{height:100%;width:100%;flex-shrink:0;display:flex;justify-content:center;align-items:center;scroll-snap-align:start;scroll-snap-stop:always;box-sizing:border-box}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.-empty{display:none}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.page-markers{overflow:hidden;display:flex;flex-direction:column;align-items:center;max-height:100%;min-height:0}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.page-markers.-one-element{visibility:hidden}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.page-markers>.marker{padding:2px;opacity:.1;cursor:pointer;left:0;transition:left .2s ease}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.page-markers>.marker>.content{background-color:var(--foreground-color-1);border-radius:2px;padding:2px}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.page-markers>.marker.-active{position:relative;left:2px;opacity:.2}.toolbar-root{background-color:var(--background-color-1);--icon-color: var(--foreground-color-1);--toolbar-button-height: min(20vh, 60px);flex-wrap:wrap;box-sizing:border-box;width:100%;display:flex;flex-direction:row;justify-content:center}.toolbar-element{z-index:1;font-family:system-ui,-apple-system,sans-serif}.toolbar-element details>summary{cursor:pointer}.toolbar-element>.toolbar-toolContainer>.toolbar-button,.toolbar-element>.toolbar-toolContainer>*>button,.toolbar-element>.toolbar-buttonGroup>button,.toolbar-element>.toolbar-button{white-space:pre;height:var(--toolbar-button-height)}.toolbar-dropdown .toolbar-button>.toolbar-icon{max-width:50px;width:100%}.toolbar-button.disabled{filter:sepia(0.2);opacity:.45;cursor:unset}.toolbar-button,.toolbar-element button{cursor:pointer;text-align:center;border-radius:6px;border:none;box-shadow:0px 0px 2px var(--shadow-color);user-select:none;-webkit-user-select:none;transition:background-color .15s ease,box-shadow .25s ease,opacity .2s ease}.toolbar-button,.toolbar-buttonGroup>button,.toolbar-toolContainer>*>button,.toolbar-root>button{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-left:3px;padding-right:3px;min-width:40px;max-width:105px;width:min-content;font-size:1em}.toolbar-button>label{cursor:inherit;user-select:none;-webkit-user-select:none}.toolbar-root>.toolbar-toolContainer>.toolbar-button>label.long-label{font-size:.75em}.toolbar-dropdown>.toolbar-toolContainer>button,.toolbar-dropdown>.toolbar-toolContainer>.toolbar-button{width:6em}.toolbar-button:not(.disabled):hover,.toolbar-root button:not(:disabled):hover{box-shadow:0px 2px 4px var(--shadow-color)}.toolbar-root button:disabled{cursor:inherit;opacity:.5}.toolbar-root .toolbar-icon{flex-shrink:1;user-select:none;width:100%;min-width:20px;min-height:20px}.toolbar-toolContainer.selected>.toolbar-button{background-color:var(--selection-background-color);color:var(--selection-foreground-color);--icon-color: var(--selection-foreground-color)}.toolbar-toolContainer:not(.selected):not(.dropdownShowable)>.toolbar-button>.toolbar-showHideDropdownIcon{display:none}.toolbar-toolContainer>.toolbar-button>.toolbar-showHideDropdownIcon{height:15px;transition:transform .25s ease}.toolbar-toolContainer.dropdownVisible>.toolbar-button>.toolbar-showHideDropdownIcon{transform:rotate(180deg)}.toolbar-dropdown.hidden,.toolbar-toolContainer:not(.selected):not(.dropdownShowable)>.toolbar-dropdown:not(.hiding){display:none}.toolbar-dropdown{position:absolute;padding:15px;padding-top:5px;display:flex;flex-wrap:wrap;flex-direction:column;max-height:80vh;max-width:fit-content;z-index:2;background-color:var(--background-color-1);box-shadow:0px 3px 3px var(--shadow-color)}@keyframes dropdown-transition-in{0%{opacity:0;transform:scale(1, 0)}100%{opacity:1;transform:scale(1, 1)}}@keyframes dropdown-transition-out{0%{opacity:1;transform:scale(1, 1)}100%{opacity:0;transform:scale(1, 0)}}.toolbar-dropdown{transform-origin:top left;--dropdown-show-animation: dropdown-transition-in;--dropdown-hide-animation: dropdown-transition-out}@media(prefers-reduced-motion: reduce){.toolbar-dropdown{--dropdown-show-animation: none;--dropdown-hide-animation: none}.toolbar-dropdown.hiding{display:none}.toolbar-toolContainer>.toolbar-button>.toolbar-showHideDropdownIcon{transition:none}:root .toolbar-button,.toolbar-root button{transition:none}}.toolbar-buttonGroup{display:flex;flex-direction:row;justify-content:center}.toolbar-element .toolbar--toggle-button{color:var(--foreground-color-1);font-weight:normal}.toolbar-element .toolbar--toggle-button[aria-checked=true]{background:var(--selection-background-color);color:var(--selection-foreground-color)}.toolbar-element .toolbar--toggle-button>.icon{width:25px;height:25px;margin:0 5px}.toolbar-element .toolbar--toggle-button>*{vertical-align:middle}.toolbar-closeColorPickerOverlay{display:none;position:fixed;top:0;left:0;bottom:0;right:0;touch-action:none;background-color:var(--background-color-1);opacity:.3;z-index:2}.toolbar-spacedList>*{padding-bottom:5px;padding-top:5px}.toolbar-indentedList{padding-left:10px}@media print{.toolbar-element{display:none}}@keyframes rehide-label{0%{opacity:.8}80%{opacity:.8}100%{opacity:.1}}@keyframes show-label-delayed{0%{opacity:0}80%{opacity:0}100%{opacity:.8}}@keyframes show-label-now{0%{opacity:0}5%{opacity:0}100%{opacity:.8}}@keyframes keep-label-hidden{0%{opacity:0}100%{opacity:0}}@keyframes toolbar--edgemenu-transition-in{from{transform:translate(0, 100%)}to{transform:translate(0, 0)}}@keyframes toolbar--edgemenu-transition-in-reduce-motion{from{opacity:0}to{opacity:1}}@keyframes toolbar--edgemenu-transition-out{to{transform:translate(0, 100%)}}@keyframes toolbar--edgemenu-transition-out-reduce-motion{from{opacity:1}to{opacity:0}}@keyframes toolbar--edgemenu-container-transition-in{from{overflow-y:hidden}to{overflow-y:hidden}}@keyframes toolbar--edgemenu-container-transition-out{from{overflow-y:hidden}to{overflow-y:hidden}}.toolbar-edge-toolbar{--toolbar-button-height: min(20vh, 48px);--toolbar-button-size: var(--toolbar-button-height);--label-hover-offset-size: calc(14px + var(--toolbar-button-height));box-sizing:border-box;flex-direction:row;justify-content:space-around;--button-label-hover-offset-y: var(--label-hover-offset-size);--button-label-hover-offset-x: 0}@media screen and (min-width: 540px){.toolbar-edge-toolbar{flex-wrap:nowrap}.toolbar-edge-toolbar>.toolbar-action-row{max-width:50vw;flex-grow:0;flex-shrink:0}}@media screen and (max-width: 700px){.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline{font-size:.9em}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button{width:var(--toolbar-button-size)}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button label{opacity:0;animation:.2s linear hide-initially}@keyframes hide-initially{from{opacity:0}to{opacity:0}}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):hover:not(:focus-visible)>label,.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):active>label{opacity:.8;animation:1s ease show-label-delayed}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button.has-long-press-or-hover>label{opacity:.8}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button:focus-visible>label,.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button.focus-visible>label{animation:1.5s ease rehide-label;opacity:0}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button:has(:focus-visible)>label{animation:1.5s ease rehide-label;opacity:0}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button>label{opacity:0;position:absolute;margin-top:var(--button-label-hover-offset-y);margin-left:var(--button-label-hover-offset-x);z-index:1;pointer-events:none;background-color:var(--background-color-1);color:var(--foreground-color-1);border-radius:25px;padding:10px;transition:.3s ease opacity,.2s ease margin-top}}@media screen and (max-width: 700px)and (prefers-reduced-motion: reduce){.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button>label{transition:none}}@media screen and (max-width: 700px){.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button>.toolbar-icon.toolbar-icon{margin-left:0;margin-right:0}}.toolbar-edge-toolbar>div.toolbar-element{flex-direction:row;display:flex;flex-grow:1;justify-content:center;background-color:var(--background-color-2);color:var(--foreground-color-2);--icon-color: var(--foreground-color-2);--extra-left-right-padding: 0px}.toolbar-edge-toolbar>div.toolbar-element::-webkit-scrollbar{width:3px;height:3px}.toolbar-edge-toolbar>div.toolbar-element::-webkit-scrollbar-thumb{background-color:var(--shadow-color)}.toolbar-edge-toolbar>div.toolbar-element.toolbar-tool-row{overflow-x:auto;overflow-y:hidden;flex-grow:100}.toolbar-edge-toolbar>div.toolbar-element.toolbar-action-row{z-index:2;background-color:var(--background-color-3);color:var(--foreground-color-3);--icon-color: var(--foreground-color-3)}.toolbar-edge-toolbar>div.toolbar-element.has-scroll{justify-content:start;position:relative;--button-label-hover-offset-y: 0;--button-label-hover-offset-x: calc(0px - var(--label-hover-offset-size))}.toolbar-edge-toolbar>div.toolbar-element.has-scroll>:nth-child(1){--button-label-hover-offset-x: var(--label-hover-offset-size)}.toolbar-edge-toolbar .toolbar-toolContainer.selected>.toolbar-button{background-color:var(--selection-background-color);color:var(--selection-foreground-color);--icon-color: var(--selection-foreground-color)}.toolbar-edge-toolbar .toolbar-button{box-sizing:border-box;background-color:rgba(0,0,0,0)}.toolbar-edge-toolbar .toolbar-button .toolbar-showHideDropdownIcon{flex-shrink:.01;height:12px}.toolbar-edge-toolbar .toolbar-toolContainer{order:1}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline{flex-grow:1;display:flex;--button-flex-direction: row}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline.label-left{justify-content:end;--button-flex-direction: row-reverse;order:100}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline.label-left>.toolbar-button>.toolbar-icon{margin-left:7px;margin-right:0}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline.label-right{order:-1}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline>.toolbar-button{width:auto;flex-direction:var(--button-flex-direction)}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline>.toolbar-button>.toolbar-icon{height:100%;margin-right:7px;margin-left:0;width:22px}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button{width:calc(var(--toolbar-button-size) + var(--extra-left-right-padding));height:var(--toolbar-button-size)}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):hover:not(:focus-visible)>label,.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):active>label{opacity:.8;animation:1s ease show-label-delayed}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button.has-long-press-or-hover>label{opacity:.8}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button:focus-visible>label,.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button.focus-visible>label{animation:1.5s ease rehide-label;opacity:0}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button:has(:focus-visible)>label{animation:1.5s ease rehide-label;opacity:0}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button>label{opacity:0;position:absolute;margin-top:var(--button-label-hover-offset-y);margin-left:var(--button-label-hover-offset-x);z-index:1;pointer-events:none;background-color:var(--background-color-1);color:var(--foreground-color-1);border-radius:25px;padding:10px;transition:.3s ease opacity,.2s ease margin-top}@media(prefers-reduced-motion: reduce){.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button>label{transition:none}}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline).dropdownVisible>.toolbar-button>label{opacity:.8;animation:1.5s ease rehide-label .3s,1s ease keep-label-hidden 1.8s infinite}.toolbar-edge-toolbar>div>.toolbar-toolContainer:not(.selected):not(.dropdownShowable)>.toolbar-button>.toolbar-showHideDropdownIcon{display:block;visibility:hidden}.toolbar-edge-toolbar .toolbar-toolContainer>.toolbar-button{margin:0;border-radius:0;padding:8px;box-shadow:none}.toolbar-edge-toolbar .toolbar-toolContainer>.toolbar-button.has-dropdown{padding-left:8px;padding-right:8px;padding-top:8px;padding-bottom:0px}.imageEditorContainer.pipette--color-selection-in-progress .toolbar-edgemenu-container{height:0;background-color:rgba(0,0,0,0);opacity:.9}.imageEditorContainer.pipette--color-selection-in-progress .toolbar-edgemenu-container .toolbar-edgemenu{position:absolute}.toolbar-edgemenu-container{background-color:var(--background-color-transparent);transition:.15s ease-in-out height,.15s ease-in-out background-color,.2s ease-in-out opacity;position:absolute;width:var(--editor-current-width-px);height:var(--editor-current-height-px);box-sizing:border-box;display:flex;flex-direction:column-reverse;align-items:center;z-index:2}@media(prefers-reduced-motion: reduce){.toolbar-edgemenu-container{transition:.15s ease-in-out background-color,.2s ease-in-out opacity}}.toolbar-edgemenu-container.dropdown-below-edge{overflow-y:hidden}.toolbar-edgemenu-container button{font-size:1.2em;box-shadow:none;border:none;padding:10px;transition:.2s ease box-shadow;font-weight:bold;color:var(--primary-action-foreground-color)}.toolbar-edgemenu-container button:not(:disabled):hover{box-shadow:0 1px 2px var(--shadow-color)}.toolbar-edgemenu-container button:disabled{opacity:.5;font-weight:unset;cursor:unset;color:var(--foreground-color-1)}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button{--button-label-hover-offset-y: var(--button-size)}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):hover:not(:focus-visible)>label>.button-label-text,.toolbar-edgemenu-container .toolbar-grid-selector .choice-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):active>label>.button-label-text{opacity:.8;animation:1s ease show-label-delayed}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button.has-long-press-or-hover>label>.button-label-text{opacity:.8}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button:focus-visible>label>.button-label-text,.toolbar-edgemenu-container .toolbar-grid-selector .choice-button.focus-visible>label>.button-label-text{animation:1.5s ease rehide-label;opacity:0}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button:has(:focus-visible)>label>.button-label-text{animation:1.5s ease rehide-label;opacity:0}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button>label>.button-label-text{opacity:0;position:absolute;margin-top:var(--button-label-hover-offset-y);margin-left:var(--button-label-hover-offset-x);z-index:1;pointer-events:none;background-color:var(--background-color-1);color:var(--foreground-color-1);border-radius:25px;padding:10px;transition:.3s ease opacity,.2s ease margin-top}@media(prefers-reduced-motion: reduce){.toolbar-edgemenu-container .toolbar-grid-selector .choice-button>label>.button-label-text{transition:none}}.toolbar-edgemenu-container .toolbar-help-overlay-button{align-items:last baseline}.toolbar-edgemenu-container .toolbar-edgemenu{--toolbar-button-height: 48px;touch-action:none;user-select:none;-webkit-user-select:none;background-color:var(--background-color-2);color:var(--foreground-color-2);--icon-color: var(--foreground-color-2);box-shadow:0px 0px 1px var(--shadow-color);padding-left:10px;padding-right:10px;width:min(400px,100vw);box-sizing:border-box;border-top-left-radius:30px;border-top-right-radius:30px;transition:transform .1s ease,padding-bottom .1s ease}.toolbar-edgemenu-container .toolbar-edgemenu input,.toolbar-edgemenu-container .toolbar-edgemenu textarea{user-select:auto;-webkit-user-select:auto}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer{display:inline-block}.toolbar-edgemenu-container .toolbar-edgemenu button{background-color:rgba(0,0,0,0)}.toolbar-edgemenu-container .toolbar-edgemenu>button.drag-elem{height:40px;display:block;cursor:ns-resize;position:relative;margin-top:-15px;margin-bottom:10px;width:100%;border:none;box-shadow:none;background:rgba(0,0,0,0)}.toolbar-edgemenu-container .toolbar-edgemenu>button.drag-elem::before{content:"";background-color:var(--icon-color);opacity:.2;display:block;position:relative;top:10px;height:5px;border-radius:5px;width:min(80%,40px);margin-left:auto;margin-right:auto}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer{display:block}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer .toolbar-button{flex-direction:row;max-width:unset;width:100%;box-sizing:border-box;justify-content:flex-start;box-shadow:none;padding:2px}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer .toolbar-button>.toolbar-icon{width:25px;height:25px;padding:13px;margin-right:15px}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer .toolbar-button label,.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer .toolbar-button>label.long-label{font-size:1em}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-nonbutton-controls-main-list{padding-left:10px;padding-right:10px}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList{box-sizing:border-box;--align-items-to-x: 105px}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList>div{display:flex;align-items:center;margin-top:5px;min-height:35px}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList>div:first-child{margin-top:0}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList>div>label{padding-right:35px;min-width:var(--align-items-to-x);flex-shrink:1;box-sizing:border-box}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList>div>input[type=checkbox]{width:20px;height:20px;margin-left:0}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList>div>input:not([type=checkbox]){flex-grow:1;min-width:48px;flex-shrink:1}.toolbar-dropdown-toolbar button,.toolbar-dropdown-toolbar .toolbar-button{background-color:var(--background-color-2);color:var(--foreground-color-2);--icon-color: var(--foreground-color-2)}.toolbar-dropdown-toolbar,.toolbar-dropdown-toolbar .toolbar-dropdown{background-color:var(--background-color-3);color:var(--foreground-color-3)}.toolbar-dropdown-toolbar .toolbar-spacedList>div>label{padding-right:10px;min-width:50px}.toolbar-dropdown-toolbar .clr-field button{width:100%;height:100%;top:50%;left:0;border-radius:5px}.toolbar-dropdown-toolbar .toolbar-grid-selector>div{--button-size: 57px}.toolbar-dropdown-toolbar .toolbar-dropdown>div>.toolbar-toolContainer{display:inline-block}.toolbar-help-overlay{width:100%;height:100%;max-width:none;max-height:none;border:none;margin:0;padding:0;z-index:5;touch-action:none;overflow:hidden;color:#fff;--icon-color: white;background-color:rgba(0,0,0,0);display:flex;flex-direction:column;transition:.3s ease transform}.toolbar-help-overlay::backdrop{background-color:rgba(0,0,0,.8);backdrop-filter:blur(1px);-webkit-backdrop-filter:blur(1px)}.toolbar-help-overlay,.toolbar-help-overlay::backdrop{animation:.25s ease transition-in}@keyframes transition-in{0%{opacity:0}100%{opacity:1}}@keyframes transition-out{0%{opacity:1}100%{opacity:0}}.toolbar-help-overlay.-hiding,.toolbar-help-overlay.-hiding::backdrop{animation:.25s ease transition-out;opacity:0}.toolbar-help-overlay.-dragging{transition:none}@media(prefers-reduced-motion: reduce){.toolbar-help-overlay{transition:none}}@media screen and (min-width: 800px){.toolbar-help-overlay>.navigation-buttons{order:1;margin-top:auto}}.toolbar-help-overlay .with-text-shadow,.toolbar-help-overlay .help-page-container>.label,.toolbar-help-overlay button{text-shadow:0 0 3px rgba(20,20,20,.9);filter:drop-shadow(0px 0px 2px rgba(0, 0, 0, 0.5))}.toolbar-help-overlay button:not(:disabled){cursor:pointer}.toolbar-help-overlay button{background:rgba(0,0,0,0);border:none;color:var(--help-overlay-foreground);border-radius:15px}.toolbar-help-overlay .close-button{align-self:flex-start;width:48px;height:48px;z-index:1}.toolbar-help-overlay .close-button>svg{width:100%}.toolbar-help-overlay .navigation-content{flex-grow:1;display:flex}.toolbar-help-overlay .help-page-container{display:flex;align-items:center;flex-grow:1;touch-action:none}.toolbar-help-overlay .help-page-container>.label{flex-grow:1;text-align:center;font-size:18.5pt;margin-left:15px;margin-right:15px;margin-top:0px;z-index:1;transition:.5s ease margin-top}.toolbar-help-overlay .help-page-container>.label.-large-space-below{margin-top:0;margin-bottom:auto}.toolbar-help-overlay .help-page-container>.label.-small-space-above{margin-top:40px;margin-bottom:auto}.toolbar-help-overlay .help-page-container>.label.-large-space-above{margin-top:auto;margin-bottom:10px}@media(prefers-reduced-motion: reduce){.toolbar-help-overlay .help-page-container>.label{transition:none}}.toolbar-help-overlay .help-page-container>.cloned-element-container{position:absolute;z-index:0;user-select:none;-webkit-user-select:none;border-radius:10px;opacity:.01;background-color:rgba(100,100,100,.01);box-shadow:none;transition:.5s ease opacity,.5s ease background-color}.toolbar-help-overlay .help-page-container>.cloned-element-container *{pointer-events:none !important}.toolbar-help-overlay .help-page-container>.cloned-element-container>*{margin:0;opacity:.01 !important;transition:.3s ease opacity !important}.toolbar-help-overlay .help-page-container>.cloned-element-container:not(.-clickable) *{cursor:unset !important}.toolbar-help-overlay .help-page-container>.cloned-element-container.-clickable,.toolbar-help-overlay .help-page-container>.cloned-element-container.-background{z-index:1;touch-action:none}.toolbar-help-overlay .help-page-container>.cloned-element-container.-clickable{cursor:pointer;z-index:2}.toolbar-help-overlay .help-page-container>.cloned-element-container.-clickable.has-long-press-or-hover{opacity:.5 !important}.toolbar-help-overlay .help-page-container>.cloned-element-container.-clickable.has-long-press-or-hover,.toolbar-help-overlay .help-page-container>.cloned-element-container.-active{background-color:var(--background-color-1)}.toolbar-help-overlay .help-page-container>.cloned-element-container.-active{opacity:1;background-color:var(--background-color-1);box-shadow:0 0 3px rgba(100,100,100,.5)}.toolbar-help-overlay .help-page-container>.cloned-element-container.-active>*{opacity:1 !important}.toolbar-help-overlay .navigation-buttons{display:flex;flex-direction:row;justify-content:space-between;direction:ltr}.toolbar-help-overlay .navigation-buttons>button:disabled{opacity:.5}.toolbar-help-overlay .navigation-buttons>.next,.toolbar-help-overlay .navigation-buttons>.previous{font-size:1em;padding:10px;transition:.2s ease font-size;z-index:3}@media(prefers-reduced-motion: reduce){.toolbar-help-overlay .navigation-buttons>.next,.toolbar-help-overlay .navigation-buttons>.previous{transition:none}}.toolbar-help-overlay .navigation-buttons:not(.-has-previous)>.next:not(:disabled){animation:.5s ease highlight-button .5s}@keyframes highlight-button{0%{transform:scale(1)}50%{transform:scale(1.2)}55%{transform:scale(1.2) rotate(2deg)}65%{transform:scale(1.2) rotate(-2deg)}100%{transform:scale(1)}}@media(prefers-reduced-motion: reduce){.toolbar-help-overlay .navigation-buttons:not(.-has-previous)>.next:not(:disabled){animation:none}}.toolbar-help-overlay .navigation-buttons>.next::after{content:"\u276F";margin-left:3px}.toolbar-help-overlay .navigation-buttons>.previous::before{content:"\u276E";margin-right:3px}.toolbar-help-overlay .navigation-buttons.-has-next>.next{font-size:1.4em}.toolbar-help-overlay .navigation-buttons.-has-previous>.previous{font-size:1.4em}.toolbar-help-overlay .navigation-buttons.-highlight-next>.next,.toolbar-help-overlay .navigation-buttons.-highlight-previous>.previous{font-weight:bold;background-color:rgba(200,200,200,.1);font-size:1.4em}.toolbar-help-overlay .navigation-help{margin-top:1em;font-size:.7em}.toolbar-element .toolbar-help-overlay-button{height:0;position:relative;display:flex;justify-content:end}.toolbar-element .toolbar-help-overlay-button>.button{margin:0;padding:5px;padding-top:0;padding-bottom:0;box-shadow:none;text-align:center;opacity:.5}.toolbar-element .toolbar-help-overlay-button>.button>.icon{width:1.18em;height:1.18em;transition:.2s ease filter}.toolbar-element .toolbar-help-overlay-button>.button:focus-visible>.icon,.toolbar-element .toolbar-help-overlay-button>.button:hover>.icon{filter:drop-shadow(0px 0px 1px var(--shadow-color))}.ScrollbarTool-overlay{width:0;height:0;overflow:visible;opacity:.2;pointer-events:none;--fade-out-animation: 1s ease 0s fade-out;--scrollbar-size: 3px}@media(prefers-reduced-motion: reduce){.ScrollbarTool-overlay{--fade-out-animation: none !important}}@keyframes fade-out{from{opacity:.2}to{opacity:0}}.ScrollbarTool-overlay:not(.just-updated){animation:var(--fade-out-animation);opacity:0}.ScrollbarTool-overlay .vertical-scrollbar,.ScrollbarTool-overlay .horizontal-scrollbar{width:var(--scrollbar-size);height:var(--scrollbar-size);min-width:var(--scrollbar-size);min-height:var(--scrollbar-size);background-color:var(--foreground-color-1);border-radius:var(--scrollbar-size);position:absolute}.ScrollbarTool-overlay .vertical-scrollbar.represents-no-scroll,.ScrollbarTool-overlay .horizontal-scrollbar.represents-no-scroll{animation:var(--fade-out-animation);opacity:0}.ScrollbarTool-overlay:not(.scrollbar-left) .vertical-scrollbar{margin-left:calc(var(--editor-current-display-width-px) - var(--scrollbar-size))}.ScrollbarTool-overlay:not(.scrollbar-top) .horizontal-scrollbar{margin-top:calc(var(--editor-current-display-height-px) - var(--scrollbar-size))}.clipboard-error-dialog details>summary{cursor:pointer}.clipboard-error-dialog details[open]{margin-bottom:12px}.clipboard-error-dialog textarea{width:100%;box-sizing:border-box}.selection-tool-selection-background{background-color:var(--selection-background-color);opacity:.5;overflow:visible}.selection-tool-handle{position:absolute;box-sizing:border-box;display:flex;align-items:center;justify-content:center;--max-size: 17px}.selection-tool-handle .selection-tool-content{border:1px solid var(--foreground-color-1);background:var(--background-color-1);box-sizing:border-box;max-width:var(--max-size);max-height:var(--max-size);width:100%;height:100%;display:flex;justify-content:center;align-items:center;padding:3px}.selection-tool-handle .selection-tool-content .icon{width:100%;height:100%}.selection-tool-handle.selection-tool-circle .selection-tool-content{border-radius:100%}.selection-tool-handle.selection-tool-rotate{--max-size: 28px;cursor:grab}.selection-tool-handle.selection-tool-resize-x{cursor:ew-resize}.selection-tool-handle.selection-tool-resize-y{cursor:ns-resize}.selection-tool-handle.selection-tool-resize-xy{cursor:nwse-resize}.selection-tool-rotated-near-perpendicular .selection-tool-handle.selection-tool-resize-x{cursor:ns-resize}.selection-tool-rotated-near-perpendicular .selection-tool-handle.selection-tool-resize-y{cursor:ew-resize}.selection-tool-rotated-near-perpendicular .selection-tool-handle.selection-tool-resize-xy{cursor:nesw-resize}.selection-tool-selection-menu>button{max-height:var(--vertical-offset);background-color:var(--background-color-1);width:24px;height:24px;padding:6px;font-size:14px;user-select:none;-webkit-user-select:none;color:var(--foreground-color-1);border:.5px solid var(--foreground-color-1);border-radius:3px;opacity:.8;transition:.2s ease opacity}.selection-tool-selection-menu>button:hover,.selection-tool-selection-menu>button:focus-visible{background-color:var(--background-color-2);color:var(--foreground-color-2);cursor:pointer;opacity:1}.selection-tool-selection-menu>button>.icon{width:100%;height:100%}.overlay.handleOverlay{touch-action:none;direction:ltr}.overlay.handleOverlay,.overlay.handleOverlay .selection-tool-selection-outer-container{height:0;overflow:visible}.overlay.handleOverlay .selection-tool-selection-inner-container{width:var(--editor-current-display-width-px);height:var(--editor-current-display-height-px);overflow:hidden;pointer-events:none}.overlay.handleOverlay .selection-tool-selection-inner-container>*{pointer-events:all}.overlay.handleOverlay .selection-tool-selection-inner-container.-empty{opacity:0}.overlay.handleOverlay .selection-tool-selection-inner-container.-hide-handles .selection-tool-handle{display:none}@keyframes selection-duplicated-animation{0%{scale:1 1}50%{scale:1.02 1.02}100%{scale:1 1}}@media(prefers-reduced-motion: reduce){@keyframes selection-duplicated-animation{}}.find-tool-overlay{order:-1;position:absolute}.js-draw-sound-ui-toggle{width:0px;height:0px;overflow:hidden;user-select:none;-webkit-user-select:none}.js-draw-sound-ui-toggle button{margin-top:1px}.js-draw-sound-ui-toggle:focus-within,.js-draw-sound-ui-toggle.sound-ui-tool-enabled{overflow:visible;z-index:5}.js-draw-sound-ui-toggle:not(:focus-within):not(:hover).sound-ui-tool-enabled{opacity:.5}@keyframes show-popup-menu-animation{from{opacity:0}to{opacity:1}}.editor-popup-menu{width:100%;height:100%;background-color:rgba(0,0,0,0);border:none;animation:var(--hide-menu-animation-timeout) ease show-popup-menu-animation;opacity:1;transition:var(--hide-menu-animation-timeout) ease opacity;overflow:hidden}.editor-popup-menu.-hide{opacity:0}.editor-popup-menu>.content{position:absolute;left:var(--anchor-x);top:var(--anchor-y);display:flex;flex-direction:column;overflow:clip;border-radius:6px;box-shadow:0px 1px 2px var(--shadow-color);background-color:var(--background-color-1)}.editor-popup-menu::backdrop{background:rgba(0,0,0,0)}.editor-popup-menu-option{display:flex;justify-content:start;cursor:pointer;padding:5px;padding-top:6px;padding-bottom:6px;background-color:rgba(0,0,0,0);color:var(--foreground-color-1);--icon-color: currentColor;border:none;font-size:1em}.editor-popup-menu-option:hover,.editor-popup-menu-option:focus-visible{background-color:var(--background-color-2);color:var(--foreground-color-2)}.editor-popup-menu-option>:first-child{width:1em;height:1em;flex-shrink:0;margin-inline-start:0em;margin-inline-end:.25em}.about-dialog-content>.scroll{white-space:pre-wrap;font-family:monospace}.about-dialog-content>.scroll>details>summary{cursor:pointer}.about-dialog-content>.scroll>h2,.about-dialog-content>.scroll>details>summary{margin-top:15px;font-size:1.2em;font-weight:bold}.about-dialog-content>.scroll>h2 a,.about-dialog-content>.scroll>details>summary a{color:var(--foreground-color-1);text-decoration:underline}@keyframes fade-in{from{opacity:0}to{opacity:1}}.message-dialog-container dialog{display:flex}.message-dialog-container dialog.-closing{opacity:0}.message-dialog-container dialog.-closing::backdrop{opacity:0}.message-dialog-container dialog,.message-dialog-container dialog::backdrop{transition:opacity .2s ease;animation:fade-in .2s ease}.message-dialog-content{display:flex;flex-direction:column;flex-grow:1}.message-dialog-content>.close{display:block;margin-left:auto;margin-right:auto}.message-dialog-content>.scroll{flex-grow:1;flex-shrink:1;overflow-y:auto;margin-left:20px;margin-right:20px;padding-bottom:20px}.dialog-container>dialog{background-color:var(--background-color-1);color:var(--foreground-color-1);border:none;outline:none;box-shadow:0 0 2px var(--shadow-color);border-radius:8px;max-height:90vh;width:min(100%,500px);box-sizing:border-box}.dialog-container>dialog::backdrop{backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);background-color:var(--background-color-transparent)}#clr-picker{--clr-slider-size: 30px}#clr-picker #clr-color-area,#clr-picker .clr_hue{touch-action:none}#clr-picker .clr-alpha{margin-top:15px;margin-bottom:15px}#clr-picker.clr-picker input[type=range]::-moz-range-thumb{width:var(--clr-slider-size);height:var(--clr-slider-size)}#clr-picker.clr-picker input[type=range]::-webkit-slider-thumb{width:var(--clr-slider-size);height:var(--clr-slider-size)}#clr-picker.clr-picker input[type=range]::-webkit-slider-runnable-track{height:var(--clr-slider-size)}#clr-picker.clr-picker input[type=range]::-moz-range-track{height:var(--clr-slider-size)}.imageEditorContainer{--background-color-1: white;--foreground-color-1: black;--background-color-2: #f5f5f5;--foreground-color-2: #2c303a;--background-color-3: #e5e5e5;--foreground-color-3: #1c202a;--selection-background-color: #cbdaf1;--selection-foreground-color: #2c303a;--background-color-transparent: rgba(105, 100, 100, 0.5);--shadow-color: rgba(0, 0, 0, 0.5);--primary-action-foreground-color: #15b}@media(prefers-color-scheme: dark){.imageEditorContainer{--background-color-1: #151515;--foreground-color-1: white;--background-color-2: #222;--foreground-color-2: #efefef;--background-color-3: #272627;--foreground-color-3: #eee;--selection-background-color: #607;--selection-foreground-color: white;--shadow-color: rgba(250, 250, 250, 0.5);--background-color-transparent: rgba(50, 50, 50, 0.5);--primary-action-foreground-color: #7ae}}.imageEditorContainer{--icon-color: var(--foreground-color-1)}.imageEditorContainer{color:var(--foreground-color-1);font-family:system-ui,-apple-system,sans-serif;background-color:var(--background-color-1);width:100%;height:400px;min-height:220px;min-width:100px;writing-mode:horizontal-tb;box-sizing:border-box;display:flex;flex-direction:column-reverse}.imageEditorContainer input{accent-color:var(--primary-action-foreground-color)}.imageEditorContainer .imageEditorRenderArea{display:grid;grid-template-columns:1fr;flex-grow:2;flex-shrink:1;min-height:100px;min-width:0;width:100%;height:100%}.imageEditorContainer .imageEditorRenderArea canvas{grid-row:1/1;grid-column:1/1;touch-action:none;box-sizing:border-box;width:100%;height:100%;min-width:0;max-width:inherit;min-height:0px;max-height:inherit;user-select:none;-webkit-user-select:none;-webkit-user-drag:none}.imageEditorContainer .loadingMessage{position:fixed;text-align:center;font-size:2em;text-shadow:0px 0px 1px var(--background-color-1);bottom:0;left:0;right:0}.imageEditorContainer .accessibilityAnnouncement{opacity:0;width:0;height:0;overflow:hidden;pointer-events:none;user-select:none;-webkit-user-select:none}.imageEditorContainer .textRendererOutputContainer{width:.001px;height:.001px;overflow:hidden;-webkit-user-select:none;user-select:none}.imageEditorContainer .textRendererOutputContainer:focus-within{overflow:visible;z-index:5}.imageEditorContainer .anchored-element-overlay{overflow:visible;height:0}.imageEditorContainer .anchored-element-overlay>.content-wrapper{width:var(--editor-current-display-width-px);height:var(--editor-current-display-height-px);overflow:hidden;position:relative;pointer-events:none}.imageEditorContainer .anchored-element-overlay>.content-wrapper>.content{position:absolute;left:var(--position-x);top:var(--position-y);transform:scale(var(--scale)) rotate(var(--rotation));transform-origin:left top;margin:0;pointer-events:all}@media print{.imageEditorContainer .loadingMessage{display:none}.imageEditorContainer .imageEditorRenderArea canvas{width:100%;height:initial}}',document.head.appendChild(s)}})();(()=>{if(typeof document<"u"&&typeof document.createElement=="function"){let s=document.createElement("style");s.textContent='.clr-picker{display:none;flex-wrap:wrap;position:absolute;width:200px;z-index:1000;border-radius:10px;background-color:#fff;justify-content:flex-end;direction:ltr;box-shadow:0 0 5px rgba(0, 0, 0, 0.05),0 5px 20px rgba(0, 0, 0, 0.1);-moz-user-select:none;-webkit-user-select:none;user-select:none}.clr-picker.clr-open,.clr-picker[data-inline=true]{display:flex}.clr-picker[data-inline=true]{position:relative}.clr-gradient{position:relative;width:100%;height:100px;margin-bottom:15px;border-radius:3px 3px 0 0;background-image:linear-gradient(rgba(0, 0, 0, 0), #000),linear-gradient(90deg, #fff, currentColor);cursor:pointer}.clr-marker{position:absolute;width:12px;height:12px;margin:-6px 0 0 -6px;border:1px solid #fff;border-radius:50%;background-color:currentColor;cursor:pointer}.clr-picker input[type=range]::-webkit-slider-runnable-track{width:100%;height:16px}.clr-picker input[type=range]::-webkit-slider-thumb{width:16px;height:16px;-webkit-appearance:none}.clr-picker input[type=range]::-moz-range-track{width:100%;height:16px;border:0}.clr-picker input[type=range]::-moz-range-thumb{width:16px;height:16px;border:0}.clr-hue{background-image:linear-gradient(to right, #f00 0%, #ff0 16.66%, #0f0 33.33%, #0ff 50%, #00f 66.66%, #f0f 83.33%, #f00 100%)}.clr-hue,.clr-alpha{position:relative;width:calc(100% - 40px);height:8px;margin:5px 20px;border-radius:4px}.clr-alpha span{display:block;height:100%;width:100%;border-radius:inherit;background-image:linear-gradient(90deg, rgba(0, 0, 0, 0), currentColor)}.clr-hue input,.clr-alpha input{position:absolute;width:calc(100% + 32px);height:16px;left:-16px;top:-4px;margin:0;background-color:transparent;opacity:0;cursor:pointer;appearance:none;-webkit-appearance:none}.clr-hue div,.clr-alpha div{position:absolute;width:16px;height:16px;left:0;top:50%;margin-left:-8px;transform:translateY(-50%);border:2px solid #fff;border-radius:50%;background-color:currentColor;box-shadow:0 0 1px #888;pointer-events:none}.clr-alpha div:before{content:"";position:absolute;height:100%;width:100%;left:0;top:0;border-radius:50%;background-color:currentColor}.clr-format{display:none;order:1;width:calc(100% - 40px);margin:0 20px 20px}.clr-segmented{display:flex;position:relative;width:100%;margin:0;padding:0;border:1px solid #ddd;border-radius:15px;box-sizing:border-box;color:#999;font-size:12px}.clr-segmented input,.clr-segmented legend{position:absolute;width:100%;height:100%;margin:0;padding:0;border:0;left:0;top:0;opacity:0;pointer-events:none}.clr-segmented label{flex-grow:1;margin:0;padding:4px 0;font-size:inherit;font-weight:normal;line-height:initial;text-align:center;cursor:pointer}.clr-segmented label:first-of-type{border-radius:10px 0 0 10px}.clr-segmented label:last-of-type{border-radius:0 10px 10px 0}.clr-segmented input:checked+label{color:#fff;background-color:#666}.clr-swatches{order:2;width:calc(100% - 32px);margin:0 16px}.clr-swatches div{display:flex;flex-wrap:wrap;padding-bottom:12px;justify-content:center}.clr-swatches button{position:relative;width:20px;height:20px;margin:0 4px 6px 4px;padding:0;border:0;border-radius:50%;color:inherit;text-indent:-1000px;white-space:nowrap;overflow:hidden;cursor:pointer}.clr-swatches button:after{content:"";display:block;position:absolute;width:100%;height:100%;left:0;top:0;border-radius:inherit;background-color:currentColor;box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.1)}input.clr-color{order:1;width:calc(100% - 80px);height:32px;margin:15px 20px 20px auto;padding:0 10px;border:1px solid #ddd;border-radius:16px;color:#444;background-color:#fff;font-family:sans-serif;font-size:14px;text-align:center;box-shadow:none}input.clr-color:focus{outline:none;border:1px solid #1e90ff}.clr-close,.clr-clear{display:none;order:2;height:24px;margin:0 20px 20px;padding:0 20px;border:0;border-radius:12px;color:#fff;background-color:#666;font-family:inherit;font-size:12px;font-weight:400;cursor:pointer}.clr-close{display:block;margin:0 20px 20px auto}.clr-preview{position:relative;width:32px;height:32px;margin:15px 0 20px 20px;border-radius:50%;overflow:hidden}.clr-preview:before,.clr-preview:after{content:"";position:absolute;height:100%;width:100%;left:0;top:0;border:1px solid #fff;border-radius:50%}.clr-preview:after{border:0;background-color:currentColor;box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.1)}.clr-preview button{position:absolute;width:100%;height:100%;z-index:1;margin:0;padding:0;border:0;border-radius:50%;outline-offset:-2px;background-color:transparent;text-indent:-9999px;cursor:pointer;overflow:hidden}.clr-marker,.clr-hue div,.clr-alpha div,.clr-color{box-sizing:border-box}.clr-field{display:inline-block;position:relative;color:transparent}.clr-field input{margin:0;direction:ltr}.clr-field.clr-rtl input{text-align:right}.clr-field button{position:absolute;width:30px;height:100%;right:0;top:50%;transform:translateY(-50%);margin:0;padding:0;border:0;color:inherit;text-indent:-1000px;white-space:nowrap;overflow:hidden;pointer-events:none}.clr-field.clr-rtl button{right:auto;left:0}.clr-field button:after{content:"";display:block;position:absolute;width:100%;height:100%;left:0;top:0;border-radius:inherit;background-color:currentColor;box-shadow:inset 0 0 1px rgba(0, 0, 0, 0.5)}.clr-alpha,.clr-alpha div,.clr-swatches button,.clr-preview:before,.clr-field button{background-image:repeating-linear-gradient(45deg, #aaa 25%, transparent 25%, transparent 75%, #aaa 75%, #aaa),repeating-linear-gradient(45deg, #aaa 25%, #fff 25%, #fff 75%, #aaa 75%, #aaa);background-position:0 0,4px 4px;background-size:8px 8px}.clr-marker:focus{outline:none}.clr-keyboard-nav .clr-marker:focus,.clr-keyboard-nav .clr-hue input:focus+div,.clr-keyboard-nav .clr-alpha input:focus+div,.clr-keyboard-nav .clr-segmented input:focus+label{outline:none;box-shadow:0 0 0 2px #1e90ff,0 0 2px 2px #fff}.clr-picker[data-alpha=false] .clr-alpha{display:none}.clr-picker[data-minimal=true]{padding-top:16px}.clr-picker[data-minimal=true] .clr-gradient,.clr-picker[data-minimal=true] .clr-hue,.clr-picker[data-minimal=true] .clr-alpha,.clr-picker[data-minimal=true] .clr-color,.clr-picker[data-minimal=true] .clr-preview{display:none}.clr-dark{background-color:#444}.clr-dark .clr-segmented{border-color:#777}.clr-dark .clr-swatches button:after{box-shadow:inset 0 0 0 1px rgba(255, 255, 255, 0.3)}.clr-dark input.clr-color{color:#fff;border-color:#777;background-color:#555}.clr-dark input.clr-color:focus{border-color:#1e90ff}.clr-dark .clr-preview:after{box-shadow:inset 0 0 0 1px rgba(255, 255, 255, 0.5)}.clr-dark .clr-alpha,.clr-dark .clr-alpha div,.clr-dark .clr-swatches button,.clr-dark .clr-preview:before{background-image:repeating-linear-gradient(45deg, #666 25%, transparent 25%, transparent 75%, #888 75%, #888),repeating-linear-gradient(45deg, #888 25%, #444 25%, #444 75%, #888 75%, #888)}.clr-picker.clr-polaroid{border-radius:6px;box-shadow:0 0 5px rgba(0, 0, 0, 0.1),0 5px 30px rgba(0, 0, 0, 0.2)}.clr-picker.clr-polaroid:before{content:"";display:block;position:absolute;width:16px;height:10px;left:20px;top:-10px;border:solid transparent;border-width:0 8px 10px 8px;border-bottom-color:currentColor;box-sizing:border-box;color:#fff;filter:drop-shadow(0 -4px 3px rgba(0, 0, 0, 0.1));pointer-events:none}.clr-picker.clr-polaroid.clr-dark:before{color:#444}.clr-picker.clr-polaroid.clr-left:before{left:auto;right:20px}.clr-picker.clr-polaroid.clr-top:before{top:auto;bottom:-10px;transform:rotateZ(180deg)}.clr-polaroid .clr-gradient{width:calc(100% - 20px);height:120px;margin:10px;border-radius:3px}.clr-polaroid .clr-hue,.clr-polaroid .clr-alpha{width:calc(100% - 30px);height:10px;margin:6px 15px;border-radius:5px}.clr-polaroid .clr-hue div,.clr-polaroid .clr-alpha div{box-shadow:0 0 5px rgba(0, 0, 0, 0.2)}.clr-polaroid .clr-format{width:calc(100% - 20px);margin:0 10px 15px}.clr-polaroid .clr-swatches{width:calc(100% - 12px);margin:0 6px}.clr-polaroid .clr-swatches div{padding-bottom:10px}.clr-polaroid .clr-swatches button{width:22px;height:22px}.clr-polaroid input.clr-color{width:calc(100% - 60px);margin:10px 10px 15px auto}.clr-polaroid .clr-clear{margin:0 10px 15px 10px}.clr-polaroid .clr-close{margin:0 10px 15px auto}.clr-polaroid .clr-preview{margin:10px 0 15px 10px}.clr-picker.clr-large{width:275px}.clr-large .clr-gradient{height:150px}.clr-large .clr-swatches button{width:22px;height:22px}.clr-picker.clr-pill{width:380px;padding-left:180px;box-sizing:border-box}.clr-pill .clr-gradient{position:absolute;width:180px;height:100%;left:0;top:0;margin-bottom:0;border-radius:3px 0 0 3px}.clr-pill .clr-hue{margin-top:20px}',document.head.appendChild(s)}})();var gn=class s{onDrop(o){}static union(o,e){return new class extends s{apply(r){o.apply(r),e.apply(r)}unapply(r){e.unapply(r),o.unapply(r)}description(r,n){let i=o.description(r,n),a=e.description(r,n);return i===a?i:`${i}, ${a}`}}}static{this.empty=new class extends s{description(o,e){return""}apply(o){}unapply(o){}}}},Be=gn;var bn=class{constructor(o,e,r){this.x=o;this.y=e;this.z=r}get xy(){return{x:this.x,y:this.y}}at(o){if(o===0)return this.x;if(o===1)return this.y;if(o===2)return this.z;throw new Error(`${o} out of bounds!`)}length(){return this.magnitude()}magnitude(){return Math.sqrt(this.magnitudeSquared())}magnitudeSquared(){return this.x*this.x+this.y*this.y+this.z*this.z}squareDistanceTo(o){let e=this.x-o.x,r=this.y-o.y,n=this.z-o.z;return e*e+r*r+n*n}distanceTo(o){return Math.sqrt(this.squareDistanceTo(o))}maximumEntryMagnitude(){return Math.max(Math.abs(this.x),Math.max(Math.abs(this.y),Math.abs(this.z)))}angle(){return Math.atan2(this.y,this.x)}normalized(){let o=this.magnitude();return F.of(this.x/o,this.y/o,this.z/o)}normalizedOrZero(){return this.eq(F.zero)?F.zero:this.normalized()}times(o){return F.of(this.x*o,this.y*o,this.z*o)}plus(o){return F.of(this.x+o.x,this.y+o.y,this.z+o.z)}minus(o){return F.of(this.x-o.x,this.y-o.y,this.z-o.z)}dot(o){return this.x*o.x+this.y*o.y+this.z*o.z}cross(o){return F.of(this.y*o.z-o.y*this.z,o.x*this.z-this.x*o.z,this.x*o.y-o.x*this.y)}scale(o){return typeof o=="number"?this.times(o):F.of(this.x*o.x,this.y*o.y,this.z*o.z)}orthog(){return this.dot(F.unitX)===0&&this.dot(F.unitY)===0?this.dot(F.unitX)===0?F.unitX:this.cross(F.unitX).normalized():this.cross(F.unitZ.times(-1)).normalized()}extend(o,e){return this.plus(e.normalized().times(o))}lerp(o,e){return this.times(1-e).plus(o.times(e))}zip(o,e){return F.of(e(o.x,this.x),e(o.y,this.y),e(o.z,this.z))}map(o){return F.of(o(this.x,0),o(this.y,1),o(this.z,2))}asArray(){return[this.x,this.y,this.z]}eq(o,e=1e-10){return Math.abs(o.x-this.x)<=e&&Math.abs(o.y-this.y)<=e&&Math.abs(o.z-this.z)<=e}toString(){return`Vec(${this.x}, ${this.y}, ${this.z})`}},vn=class{constructor(o,e){this.x=o;this.y=e}get z(){return 0}get xy(){return{x:this.x,y:this.y}}at(o){if(o===0)return this.x;if(o===1)return this.y;if(o===2)return 0;throw new Error(`${o} out of bounds!`)}length(){return this.magnitude()}magnitude(){return Math.sqrt(this.x*this.x+this.y*this.y)}magnitudeSquared(){return this.x*this.x+this.y*this.y}squareDistanceTo(o){let e=this.x-o.x,r=this.y-o.y;return e*e+r*r+o.z*o.z}distanceTo(o){return Math.sqrt(this.squareDistanceTo(o))}maximumEntryMagnitude(){return Math.max(Math.abs(this.x),Math.abs(this.y))}angle(){return Math.atan2(this.y,this.x)}normalized(){let o=this.magnitude();return w.of(this.x/o,this.y/o)}normalizedOrZero(){return this.eq(F.zero)?F.zero:this.normalized()}times(o){return w.of(this.x*o,this.y*o)}plus(o){return F.of(this.x+o.x,this.y+o.y,o.z)}minus(o){return F.of(this.x-o.x,this.y-o.y,-o.z)}dot(o){return this.x*o.x+this.y*o.y}cross(o){return F.of(this.y*o.z,-this.x*o.z,this.x*o.y-o.x*this.y)}scale(o){return typeof o=="number"?this.times(o):w.of(this.x*o.x,this.y*o.y)}orthog(){return this.dot(F.unitX)===0&&this.dot(F.unitY)===0?this.dot(F.unitX)===0?F.unitX:this.cross(F.unitX).normalized():this.cross(F.unitZ.times(-1)).normalized()}extend(o,e){return this.plus(e.normalized().times(o))}lerp(o,e){return this.times(1-e).plus(o.times(e))}zip(o,e){return F.of(e(o.x,this.x),e(o.y,this.y),e(o.z,0))}map(o){return F.of(o(this.x,0),o(this.y,1),o(0,2))}asArray(){return[this.x,this.y,0]}eq(o,e=1e-10){return Math.abs(o.x-this.x)<=e&&Math.abs(o.y-this.y)<=e&&Math.abs(o.z)<=e}toString(){return`Vec(${this.x}, ${this.y})`}},w;(i=>(i.of=(a,l)=>new vn(a,l),i.ofXY=({x:a,y:l})=>i.of(a,l),i.unitX=i.of(1,0),i.unitY=i.of(0,1),i.zero=i.of(0,0)))(w||={});var F;(i=>(i.of=(a,l,c)=>c===0?w.of(a,l):new bn(a,l,c),i.unitX=w.unitX,i.unitY=w.unitY,i.zero=w.zero,i.unitZ=i.of(0,0,1)))(F||={});var Pe=F;var k=class s{constructor(o,e,r,n,i,a,l,c,d){this.a1=o;this.a2=e;this.a3=r;this.b1=n;this.b2=i;this.b3=a;this.c1=l;this.c2=c;this.c3=d;this.cachedInverse=void 0;this.rows=[Pe.of(o,e,r),Pe.of(n,i,a),Pe.of(l,c,d)]}static ofRows(o,e,r){return new s(o.x,o.y,o.z,e.x,e.y,e.z,r.x,r.y,r.z)}static{this.identity=new s(1,0,0,0,1,0,0,0,1)}inverse(){return this.computeInverse()??s.identity}invertable(){return this.computeInverse()!==null}computeInverse(){if(this.cachedInverse!==void 0)return this.cachedInverse;let o=[this.rows[0],this.rows[1],this.rows[2]],e=[Pe.unitX,Pe.unitY,Pe.unitZ];for(let n=0;n<3;n++){let i=o[n].at(n),a=1e-10;if(Math.abs(i)<a){let p=-1;for(let m=1;m<=2;m++){let g=(n+m)%3;if(Math.abs(o[g].at(n))>=a){p=g;break}}if(p===-1)return this.cachedInverse=null,null;let u=o[n],h=e[n];o[n]=o[p],e[n]=e[p],o[p]=u,e[p]=h,i=o[n].at(n)}let l=1/i;o[n]=o[n].times(l),e[n]=e[n].times(l);let c=o[n],d=e[n];for(let p=1;p<=2;p++){let u=(n+p)%3;l=-o[u].at(n),o[u]=o[u].plus(c.times(l)),e[u]=e[u].plus(d.times(l))}}let r=s.ofRows(e[0],e[1],e[2]);return this.cachedInverse=r,r}transposed(){return new s(this.a1,this.b1,this.c1,this.a2,this.b2,this.c2,this.a3,this.b3,this.c3)}rightMul(o){o=o.transposed();let e=(r,n)=>this.rows[r].dot(o.rows[n]);return new s(e(0,0),e(0,1),e(0,2),e(1,0),e(1,1),e(1,2),e(2,0),e(2,1),e(2,2))}transformVec2(o){let e=Pe.of(o.x,o.y,1);return e=this.transformVec3(e),w.of(e.x,e.y)}transformVec3(o){return Pe.of(this.rows[0].dot(o),this.rows[1].dot(o),this.rows[2].dot(o))}isIdentity(){return this===s.identity?!0:this.eq(s.identity)}eq(o,e=0){for(let r=0;r<3;r++)if(!this.rows[r].eq(o.rows[r],e))return!1;return!0}toString(){let o="",e=[0,0,0];for(let r of this.rows)for(let n=0;n<3;n++)e[n]=Math.max(e[0],`${r.at(n)}`.length);for(let r=0;r<3;r++){r===0?o+="\u23A1 ":r===1?o+="\u23A2 ":o+="\u23A3 ";for(let n=0;n<3;n++){let i=this.rows[r].at(n).toString(),a="";for(let l=i.length;l<e[n];l++)a+=" ";o+=i+", "+a}r===0?o+=" \u23A4":r===1?o+=" \u23A5":o+=" \u23A6",o+=`
2
- `}return o.trimEnd()}toArray(){return[this.a1,this.a2,this.a3,this.b1,this.b2,this.b3,this.c1,this.c2,this.c3]}mapEntries(o){return new s(o(this.a1,[0,0]),o(this.a2,[0,1]),o(this.a3,[0,2]),o(this.b1,[1,0]),o(this.b2,[1,1]),o(this.b3,[1,2]),o(this.c1,[2,0]),o(this.c2,[2,1]),o(this.c3,[2,2]))}getScaleFactor(){return Math.hypot(this.a1,this.a2)}getColumn(o){return Pe.of(this.rows[0].at(o),this.rows[1].at(o),this.rows[2].at(o))}maximumEntryMagnitude(){let o=Math.abs(this.a1);for(let e of this.toArray())o=Math.max(o,Math.abs(e));return o}static translation(o){return new s(1,0,o.x,0,1,o.y,0,0,1)}static zRotation(o,e=w.zero){if(o===0)return s.identity;let r=Math.cos(o),n=Math.sin(o),i=s.translation(e);return i=i.rightMul(new s(r,-n,0,n,r,0,0,0,1)),i.rightMul(s.translation(e.times(-1)))}static scaling2D(o,e=w.zero){let r=s.translation(e),n,i;return typeof o=="number"?(n=o,i=o):(n=o.x,i=o.y),r=r.rightMul(new s(n,0,0,0,i,0,0,0,1)),r.rightMul(s.translation(e.times(-1)))}toCSSMatrix(){return`matrix(${this.a1},${this.b1},${this.a2},${this.b2},${this.a3},${this.b3})`}static fromCSSMatrix(o){if(o===""||o==="none")return s.identity;o=o.trim().replace(/\s+/g," ");let e=l=>l.split(/[, \t\n]+/g).map(d=>{if(d.trim()==="")return null;let p=!1;if(d.endsWith("%")&&(p=!0,d=d.substring(0,d.length-1)),d=d.replace(/px$/gi,""),!/^[-]?\d*(?:\.\d*)?(?:[eE][-+]?\d+)?$/i.exec(d))throw new Error(`All arguments to transform functions must be numeric (state: ${JSON.stringify({currentArgument:d,allArguments:l})})`);let h=parseFloat(d);return p&&(h/=100),h}).filter(d=>d!==null),r={matrix:l=>{if(l.length!==6)throw new Error(`Invalid matrix argument: ${l}. Must have length 6`);let c=l[0],d=l[1],p=l[2],u=l[3],h=l[4],m=l[5];return new s(c,p,h,d,u,m,0,0,1)},scale:l=>{let c,d;if(l.length===1)c=l[0],d=l[0];else if(l.length===2)c=l[0],d=l[1];else throw new Error(`The scale() function only supports two arguments. Given: ${l}`);return s.scaling2D(w.of(c,d))},translate:l=>{let c=0,d=0;if(l.length===1)c=l[0];else if(l.length===2)c=l[0],d=l[1];else throw new Error(`The translate() function requires either 1 or 2 arguments. Given ${l}`);return s.translation(w.of(c,d))}},n=/(?:^|\W)(\w+)\s?\(([^)]*)\)/gi,i,a=null;for(;(i=n.exec(o))!==null;){let l=i[1].toLowerCase();if(!(l in r))throw new Error(`Unsupported CSS transform action: ${l}`);let c=e(i[2]),d=r[l](c);a?a=a.rightMul(d):a=d}return a??s.identity}},zi=k;var bo=class s{static{this.smallValue=1e-12}distance(o){return Math.abs(this.signedDistance(o))}containsPoint(o,e=s.smallValue){return this.signedDistance(o)<e}getLooseBoundingBox(){return this.getTightBoundingBox()}},sr=bo;var B=class s extends sr{constructor(e,r,n,i){super();this.x=e;this.y=r;this.w=n;this.h=i;n<0&&(this.x+=n,this.w=Math.abs(n)),i<0&&(this.y+=i,this.h=Math.abs(i)),this.topLeft=w.of(this.x,this.y),this.size=w.of(this.w,this.h),this.area=this.w*this.h}translatedBy(e){return new s(e.x+this.x,e.y+this.y,this.w,this.h)}resizedTo(e){return new s(this.x,this.y,e.x,e.y)}containsPoint(e){return this.x<=e.x&&this.y<=e.y&&this.x+this.w>=e.x&&this.y+this.h>=e.y}containsRect(e){return this.x<=e.x&&this.y<=e.y&&this.x+this.w>=e.x+e.w&&this.y+this.h>=e.y+e.h}intersects(e){let r=this.x,n=r+this.w,i=e.x,a=e.x+e.w;if(n<i||r>a)return!1;let l=this.y,c=l+this.h,d=e.y,p=e.y+e.h;return!(c<d||l>p)}intersection(e){if(!this.intersects(e))return null;let r=this.topLeft.zip(e.topLeft,Math.max),n=this.bottomRight.zip(e.bottomRight,Math.min);return s.fromCorners(r,n)}union(e){return s.union(this,e)}divideIntoGrid(e,r){let n=[];if(e<=0||r<=0)return n;let i=this.w/e,a=this.h/r;i===0&&(e=1),a===0&&(r=1);for(let l=0;l<r;l++)for(let c=0;c<e;c++){let d=i*c+this.x,p=a*l+this.y;n.push(new s(d,p,i,a))}return n}grownToPoint(e,r=0){let n=new s(e.x-r,e.y-r,r*2,r*2);return this.union(n)}grownBy(e){if(e===0)return this;if(e<0){let r=-Math.min(-e,this.w/2),n=-Math.min(-e,this.h/2);return new s(this.x-r,this.y-n,this.w+r*2,this.h+n*2)}return new s(this.x-e,this.y-e,this.w+e*2,this.h+e*2)}grownToSize(e){if(this.width>=e.x&&this.height>=e.y)return this;let r=Math.max(0,e.x-this.width),n=Math.max(0,e.y-this.height);return new s(this.x-r/2,this.y-n/2,this.width+r,this.height+n)}getClosestPointOnBoundaryTo(e){let r=this.getEdges().map(a=>a.closestPointTo(e)),n=null,i=null;for(let a of r){let l=a.distanceTo(e);(i===null||l<i)&&(n=a,i=l)}return n}isWithinRadiusOf(e,r){if(this.maxDimension>e)return!1;let n=e*e;return this.corners.every(i=>i.minus(r).magnitudeSquared()<n)}get corners(){return[this.bottomRight,this.topRight,this.topLeft,this.bottomLeft]}get maxDimension(){return Math.max(this.w,this.h)}get minDimension(){return Math.min(this.w,this.h)}get bottomRight(){return this.topLeft.plus(this.size)}get topRight(){return this.bottomRight.plus(w.of(0,-this.h))}get bottomLeft(){return this.topLeft.plus(w.of(0,this.h))}get width(){return this.w}get height(){return this.h}get center(){return w.of(this.x+this.w/2,this.y+this.h/2)}getEdges(){let e=this.corners;return[new De(e[0],e[1]),new De(e[1],e[2]),new De(e[2],e[3]),new De(e[3],e[0])]}intersectsLineSegment(e){let r=[];for(let n of this.getEdges())n.intersectsLineSegment(e).forEach(a=>r.push(a));return r}signedDistance(e){let r=this.getClosestPointOnBoundaryTo(e),n=e.minus(r).magnitude();return this.containsPoint(e)?-n:n}getTightBoundingBox(){return this}transformedBoundingBox(e){return e===zi.identity?this:s.bboxOf(this.corners.map(r=>e.transformVec2(r)))}eq(e,r=0){return this.topLeft.eq(e.topLeft,r)&&this.size.eq(e.size,r)}toString(){return`Rect(point(${this.x}, ${this.y}), size(${this.w}, ${this.h}))`}static fromCorners(e,r){return new s(Math.min(e.x,r.x),Math.min(e.y,r.y),Math.abs(e.x-r.x),Math.abs(e.y-r.y))}static bboxOf(e,r=0){let n=0,i=0,a=0,l=0,c=!0;for(let d of e)c&&(n=d.x,i=d.y,a=d.x,l=d.y,c=!1),n=Math.min(n,d.x),i=Math.min(i,d.y),a=Math.max(a,d.x),l=Math.max(l,d.y);return s.fromCorners(w.of(n-r,i-r),w.of(a+r,l+r))}static union(...e){if(e.length===0)return s.empty;let r=e[0],n=r.x,i=r.y,a=r.x+r.w,l=r.y+r.h;for(let c=1;c<e.length;c++){let d=e[c];n=Math.min(n,d.x),i=Math.min(i,d.y),a=Math.max(a,d.x+d.w),l=Math.max(l,d.y+d.h)}return new s(n,i,a-n,l-i)}static of(e){let r=e.width??e.w??0,n=e.height??e.h??0;return new s(e.x,e.y,r,n)}static{this.empty=new s(0,0,0,0)}static{this.unitSquare=new s(0,0,1,1)}},he=B;var vo=class extends sr{intersectsLineSegment(o){return this.argIntersectsLineSegment(o).map(e=>this.at(e))}},_t=vo;var ce=class s extends _t{constructor(e,r){super();this.point1=e;this.point2=r;this.bbox=he.bboxOf([e,r]),this.direction=r.minus(e),this.length=this.direction.magnitude(),this.length>0&&(this.direction=this.direction.times(1/this.length))}static ofSmallestContainingPoints(e){if(e.length<=1)return null;let r=[...e].sort((i,a)=>i.x!==a.x?i.x-a.x:i.y-a.y),n=new s(r[0],r[r.length-1]);for(let i of r)if(!n.containsPoint(i))return null;return n}get p1(){return this.point1}get p2(){return this.point2}get center(){return this.point1.lerp(this.point2,.5)}get(e){return this.point1.plus(this.direction.times(e))}at(e){return this.get(e*this.length)}normalAt(e){return this.direction.orthog()}tangentAt(e){return this.direction}splitAt(e){return e<=0||e>=1?[this]:[new s(this.point1,this.at(e)),new s(this.at(e),this.point2)]}intersection(e){let r,n;if(Math.abs(this.direction.x)<4e-13){if(e.direction.x===0||this.direction.y===0)return null;let p=this.point1.x,u=(this.point1.x-e.point1.x)*e.direction.y/e.direction.x+e.point1.y;r=w.of(p,u),n=(u-this.point1.y)/this.direction.y}else{let p=(this.point1.y-e.point1.y)*this.direction.x*e.direction.x+this.direction.x*e.direction.y*e.point1.x-this.direction.y*e.direction.x*this.point1.x,u=e.direction.y*this.direction.x-this.direction.y*e.direction.x;if(u===0)return null;let h=p/u,m=(h-this.point1.x)/this.direction.x,g=this.point1.y+this.direction.y*m;r=w.of(h,g),n=(h-this.point1.x)/this.direction.x}let a=r.distanceTo(this.point1),l=r.distanceTo(this.point2),c=r.distanceTo(e.point1),d=r.distanceTo(e.point2);return a>this.length||l>this.length||c>e.length||d>e.length?null:{point:r,t:n}}intersects(e){return this.intersection(e)!==null}argIntersectsLineSegment(e){let r=this.intersection(e);return r?[r.t/this.length]:[]}intersectsLineSegment(e){let r=this.intersection(e);return r?[r.point]:[]}closestPointTo(e){return this.nearestPointTo(e).point}nearestPointTo(e){let r=e.minus(this.p1).dot(this.direction),n=this.length-r,i=this.p1.plus(this.direction.times(r));return r>0&&r<this.length?{point:i,parameterValue:r/this.length}:Math.abs(n)<Math.abs(r)?{point:this.p2,parameterValue:1}:{point:this.p1,parameterValue:0}}signedDistance(e){return this.closestPointTo(e).minus(e).magnitude()}transformedBy(e){return new s(e.transformVec2(this.p1),e.transformVec2(this.p2))}getTightBoundingBox(){return this.bbox}toString(){return`LineSegment(${this.p1.toString()}, ${this.p2.toString()})`}eq(e,r){if(!(e instanceof s))return!1;let n=r?.tolerance,i=r?.ignoreDirection??!0;return e.p1.eq(this.p1,n)&&e.p2.eq(this.p2,n)||i&&e.p1.eq(this.p2,n)&&e.p2.eq(this.p1,n)}},De=ce;var{abs:yo,cos:Ze,sin:Zt,acos:la,atan2:xo,sqrt:ct,pow:Me}=Math;function wo(s){return s<0?-Me(-s,1/3):Me(s,1/3)}var Li=Math.PI,ar=2*Li,dt=Li/2,ca=1e-6,yn=Number.MAX_SAFE_INTEGER||9007199254740991,xn=Number.MIN_SAFE_INTEGER||-9007199254740991,da={x:0,y:0,z:0},I={Tvalues:[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues:[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],arcfn:function(s,o){let e=o(s),r=e.x*e.x+e.y*e.y;return typeof e.z<"u"&&(r+=e.z*e.z),ct(r)},compute:function(s,o,e){if(s===0)return o[0].t=0,o[0];let r=o.length-1;if(s===1)return o[r].t=1,o[r];let n=1-s,i=o;if(r===0)return o[0].t=s,o[0];if(r===1){let l={x:n*i[0].x+s*i[1].x,y:n*i[0].y+s*i[1].y,t:s};return e&&(l.z=n*i[0].z+s*i[1].z),l}if(r<4){let l=n*n,c=s*s,d,p,u,h=0;r===2?(i=[i[0],i[1],i[2],da],d=l,p=n*s*2,u=c):r===3&&(d=l*n,p=l*s*3,u=n*c*3,h=s*c);let m={x:d*i[0].x+p*i[1].x+u*i[2].x+h*i[3].x,y:d*i[0].y+p*i[1].y+u*i[2].y+h*i[3].y,t:s};return e&&(m.z=d*i[0].z+p*i[1].z+u*i[2].z+h*i[3].z),m}let a=JSON.parse(JSON.stringify(o));for(;a.length>1;){for(let l=0;l<a.length-1;l++)a[l]={x:a[l].x+(a[l+1].x-a[l].x)*s,y:a[l].y+(a[l+1].y-a[l].y)*s},typeof a[l].z<"u"&&(a[l]=a[l].z+(a[l+1].z-a[l].z)*s);a.splice(a.length-1,1)}return a[0].t=s,a[0]},computeWithRatios:function(s,o,e,r){let n=1-s,i=e,a=o,l=i[0],c=i[1],d=i[2],p=i[3],u;if(l*=n,c*=s,a.length===2)return u=l+c,{x:(l*a[0].x+c*a[1].x)/u,y:(l*a[0].y+c*a[1].y)/u,z:r?(l*a[0].z+c*a[1].z)/u:!1,t:s};if(l*=n,c*=2*n,d*=s*s,a.length===3)return u=l+c+d,{x:(l*a[0].x+c*a[1].x+d*a[2].x)/u,y:(l*a[0].y+c*a[1].y+d*a[2].y)/u,z:r?(l*a[0].z+c*a[1].z+d*a[2].z)/u:!1,t:s};if(l*=n,c*=1.5*n,d*=3*n,p*=s*s*s,a.length===4)return u=l+c+d+p,{x:(l*a[0].x+c*a[1].x+d*a[2].x+p*a[3].x)/u,y:(l*a[0].y+c*a[1].y+d*a[2].y+p*a[3].y)/u,z:r?(l*a[0].z+c*a[1].z+d*a[2].z+p*a[3].z)/u:!1,t:s}},derive:function(s,o){let e=[];for(let r=s,n=r.length,i=n-1;n>1;n--,i--){let a=[];for(let l=0,c;l<i;l++)c={x:i*(r[l+1].x-r[l].x),y:i*(r[l+1].y-r[l].y)},o&&(c.z=i*(r[l+1].z-r[l].z)),a.push(c);e.push(a),r=a}return e},between:function(s,o,e){return o<=s&&s<=e||I.approximately(s,o)||I.approximately(s,e)},approximately:function(s,o,e){return yo(s-o)<=(e||ca)},length:function(s){let e=I.Tvalues.length,r=0;for(let n=0,i;n<e;n++)i=.5*I.Tvalues[n]+.5,r+=I.Cvalues[n]*I.arcfn(i,s);return .5*r},map:function(s,o,e,r,n){let i=e-o,a=n-r,l=s-o,c=l/i;return r+a*c},lerp:function(s,o,e){let r={x:o.x+s*(e.x-o.x),y:o.y+s*(e.y-o.y)};return o.z!==void 0&&e.z!==void 0&&(r.z=o.z+s*(e.z-o.z)),r},pointToString:function(s){let o=s.x+"/"+s.y;return typeof s.z<"u"&&(o+="/"+s.z),o},pointsToString:function(s){return"["+s.map(I.pointToString).join(", ")+"]"},copy:function(s){return JSON.parse(JSON.stringify(s))},angle:function(s,o,e){let r=o.x-s.x,n=o.y-s.y,i=e.x-s.x,a=e.y-s.y,l=r*a-n*i,c=r*i+n*a;return xo(l,c)},round:function(s,o){let e=""+s,r=e.indexOf(".");return parseFloat(e.substring(0,r+1+o))},dist:function(s,o){let e=s.x-o.x,r=s.y-o.y;return ct(e*e+r*r)},closest:function(s,o){let e=Me(2,63),r,n;return s.forEach(function(i,a){n=I.dist(o,i),n<e&&(e=n,r=a)}),{mdist:e,mpos:r}},abcratio:function(s,o){if(o!==2&&o!==3)return!1;if(typeof s>"u")s=.5;else if(s===0||s===1)return s;let e=Me(s,o)+Me(1-s,o),r=e-1;return yo(r/e)},projectionratio:function(s,o){if(o!==2&&o!==3)return!1;if(typeof s>"u")s=.5;else if(s===0||s===1)return s;let e=Me(1-s,o),r=Me(s,o)+e;return e/r},lli8:function(s,o,e,r,n,i,a,l){let c=(s*r-o*e)*(n-a)-(s-e)*(n*l-i*a),d=(s*r-o*e)*(i-l)-(o-r)*(n*l-i*a),p=(s-e)*(i-l)-(o-r)*(n-a);return p==0?!1:{x:c/p,y:d/p}},lli4:function(s,o,e,r){let n=s.x,i=s.y,a=o.x,l=o.y,c=e.x,d=e.y,p=r.x,u=r.y;return I.lli8(n,i,a,l,c,d,p,u)},lli:function(s,o){return I.lli4(s,s.c,o,o.c)},makeline:function(s,o){return new Yt(s.x,s.y,(s.x+o.x)/2,(s.y+o.y)/2,o.x,o.y)},findbbox:function(s){let o=yn,e=yn,r=xn,n=xn;return s.forEach(function(i){let a=i.bbox();o>a.x.min&&(o=a.x.min),e>a.y.min&&(e=a.y.min),r<a.x.max&&(r=a.x.max),n<a.y.max&&(n=a.y.max)}),{x:{min:o,mid:(o+r)/2,max:r,size:r-o},y:{min:e,mid:(e+n)/2,max:n,size:n-e}}},shapeintersections:function(s,o,e,r,n){if(!I.bboxoverlap(o,r))return[];let i=[],a=[s.startcap,s.forward,s.back,s.endcap],l=[e.startcap,e.forward,e.back,e.endcap];return a.forEach(function(c){c.virtual||l.forEach(function(d){if(d.virtual)return;let p=c.intersects(d,n);p.length>0&&(p.c1=c,p.c2=d,p.s1=s,p.s2=e,i.push(p))})}),i},makeshape:function(s,o,e){let r=o.points.length,n=s.points.length,i=I.makeline(o.points[r-1],s.points[0]),a=I.makeline(s.points[n-1],o.points[0]),l={startcap:i,forward:s,back:o,endcap:a,bbox:I.findbbox([i,s,o,a])};return l.intersections=function(c){return I.shapeintersections(l,l.bbox,c,c.bbox,e)},l},getminmax:function(s,o,e){if(!e)return{min:0,max:0};let r=yn,n=xn,i,a;e.indexOf(0)===-1&&(e=[0].concat(e)),e.indexOf(1)===-1&&e.push(1);for(let l=0,c=e.length;l<c;l++)i=e[l],a=s.get(i),a[o]<r&&(r=a[o]),a[o]>n&&(n=a[o]);return{min:r,mid:(r+n)/2,max:n,size:n-r}},align:function(s,o){let e=o.p1.x,r=o.p1.y,n=-xo(o.p2.y-r,o.p2.x-e),i=function(a){return{x:(a.x-e)*Ze(n)-(a.y-r)*Zt(n),y:(a.x-e)*Zt(n)+(a.y-r)*Ze(n)}};return s.map(i)},roots:function(s,o){o=o||{p1:{x:0,y:0},p2:{x:1,y:0}};let e=s.length-1,r=I.align(s,o),n=function(C){return 0<=C&&C<=1};if(e===2){let C=r[0].y,V=r[1].y,O=r[2].y,K=C-2*V+O;if(K!==0){let ie=-ct(V*V-C*O),te=-C+V,fe=-(ie+te)/K,Se=-(-ie+te)/K;return[fe,Se].filter(n)}else if(V!==O&&K===0)return[(2*V-O)/(2*V-2*O)].filter(n);return[]}let i=r[0].y,a=r[1].y,l=r[2].y,c=r[3].y,d=-i+3*a-3*l+c,p=3*i-6*a+3*l,u=-3*i+3*a,h=i;if(I.approximately(d,0)){if(I.approximately(p,0))return I.approximately(u,0)?[]:[-h/u].filter(n);let C=ct(u*u-4*p*h),V=2*p;return[(C-u)/V,(-u-C)/V].filter(n)}p/=d,u/=d,h/=d;let m=(3*u-p*p)/3,g=m/3,v=(2*p*p*p-9*p*u+27*h)/27,b=v/2,y=b*b+g*g*g,f,T,P,S,E;if(y<0){let C=-m/3,V=C*C*C,O=ct(V),K=-v/(2*O),ie=K<-1?-1:K>1?1:K,te=la(ie),fe=wo(O),Se=2*fe;return P=Se*Ze(te/3)-p/3,S=Se*Ze((te+ar)/3)-p/3,E=Se*Ze((te+2*ar)/3)-p/3,[P,S,E].filter(n)}else{if(y===0)return f=b<0?wo(-b):-wo(b),P=2*f-p/3,S=-f-p/3,[P,S].filter(n);{let C=ct(y);return f=wo(-b+C),T=wo(b+C),[f-T-p/3].filter(n)}}},droots:function(s){if(s.length===3){let o=s[0],e=s[1],r=s[2],n=o-2*e+r;if(n!==0){let i=-ct(e*e-o*r),a=-o+e,l=-(i+a)/n,c=-(-i+a)/n;return[l,c]}else if(e!==r&&n===0)return[(2*e-r)/(2*(e-r))];return[]}if(s.length===2){let o=s[0],e=s[1];return o!==e?[o/(o-e)]:[]}return[]},curvature:function(s,o,e,r,n){let i,a,l,c,d=0,p=0,u=I.compute(s,o),h=I.compute(s,e),m=u.x*u.x+u.y*u.y;if(r?(i=ct(Me(u.y*h.z-h.y*u.z,2)+Me(u.z*h.x-h.z*u.x,2)+Me(u.x*h.y-h.x*u.y,2)),a=Me(m+u.z*u.z,3/2)):(i=u.x*h.y-u.y*h.x,a=Me(m,3/2)),i===0||a===0)return{k:0,r:0};if(d=i/a,p=a/i,!n){let g=I.curvature(s-.001,o,e,r,!0).k,v=I.curvature(s+.001,o,e,r,!0).k;c=(v-d+(d-g))/2,l=(yo(v-d)+yo(d-g))/2}return{k:d,r:p,dk:c,adk:l}},inflections:function(s){if(s.length<4)return[];let o=I.align(s,{p1:s[0],p2:s.slice(-1)[0]}),e=o[2].x*o[1].y,r=o[3].x*o[1].y,n=o[1].x*o[2].y,i=o[3].x*o[2].y,a=18*(-3*e+2*r+3*n-i),l=18*(3*e-r-3*n),c=18*(n-e);if(I.approximately(a,0)){if(!I.approximately(l,0)){let h=-c/l;if(0<=h&&h<=1)return[h]}return[]}let d=2*a;if(I.approximately(d,0))return[];let p=l*l-4*a*c;if(p<0)return[];let u=Math.sqrt(p);return[(u-l)/d,-(l+u)/d].filter(function(h){return 0<=h&&h<=1})},bboxoverlap:function(s,o){let e=["x","y"],r=e.length;for(let n=0,i,a,l,c;n<r;n++)if(i=e[n],a=s[i].mid,l=o[i].mid,c=(s[i].size+o[i].size)/2,yo(a-l)>=c)return!1;return!0},expandbox:function(s,o){o.x.min<s.x.min&&(s.x.min=o.x.min),o.y.min<s.y.min&&(s.y.min=o.y.min),o.z&&o.z.min<s.z.min&&(s.z.min=o.z.min),o.x.max>s.x.max&&(s.x.max=o.x.max),o.y.max>s.y.max&&(s.y.max=o.y.max),o.z&&o.z.max>s.z.max&&(s.z.max=o.z.max),s.x.mid=(s.x.min+s.x.max)/2,s.y.mid=(s.y.min+s.y.max)/2,s.z&&(s.z.mid=(s.z.min+s.z.max)/2),s.x.size=s.x.max-s.x.min,s.y.size=s.y.max-s.y.min,s.z&&(s.z.size=s.z.max-s.z.min)},pairiteration:function(s,o,e){let r=s.bbox(),n=o.bbox(),i=1e5,a=e||.5;if(r.x.size+r.y.size<a&&n.x.size+n.y.size<a)return[(i*(s._t1+s._t2)/2|0)/i+"/"+(i*(o._t1+o._t2)/2|0)/i];let l=s.split(.5),c=o.split(.5),d=[{left:l.left,right:c.left},{left:l.left,right:c.right},{left:l.right,right:c.right},{left:l.right,right:c.left}];d=d.filter(function(u){return I.bboxoverlap(u.left.bbox(),u.right.bbox())});let p=[];return d.length===0||(d.forEach(function(u){p=p.concat(I.pairiteration(u.left,u.right,a))}),p=p.filter(function(u,h){return p.indexOf(u)===h})),p},getccenter:function(s,o,e){let r=o.x-s.x,n=o.y-s.y,i=e.x-o.x,a=e.y-o.y,l=r*Ze(dt)-n*Zt(dt),c=r*Zt(dt)+n*Ze(dt),d=i*Ze(dt)-a*Zt(dt),p=i*Zt(dt)+a*Ze(dt),u=(s.x+o.x)/2,h=(s.y+o.y)/2,m=(o.x+e.x)/2,g=(o.y+e.y)/2,v=u+l,b=h+c,y=m+d,f=g+p,T=I.lli8(u,h,v,b,m,g,y,f),P=I.dist(T,s),S=xo(s.y-T.y,s.x-T.x),E=xo(o.y-T.y,o.x-T.x),C=xo(e.y-T.y,e.x-T.x),V;return S<C?((S>E||E>C)&&(S+=ar),S>C&&(V=C,C=S,S=V)):C<E&&E<S?(V=C,C=S,S=V):C+=ar,T.s=S,T.e=C,T.r=P,T},numberSort:function(s,o){return s-o}};var Xt=class s{constructor(o){this.curves=[],this._3d=!1,o&&(this.curves=o,this._3d=this.curves[0]._3d)}valueOf(){return this.toString()}toString(){return"["+this.curves.map(function(o){return I.pointsToString(o.points)}).join(", ")+"]"}addCurve(o){this.curves.push(o),this._3d=this._3d||o._3d}length(){return this.curves.map(function(o){return o.length()}).reduce(function(o,e){return o+e})}curve(o){return this.curves[o]}bbox(){let o=this.curves;for(var e=o[0].bbox(),r=1;r<o.length;r++)I.expandbox(e,o[r].bbox());return e}offset(o){let e=[];return this.curves.forEach(function(r){e.push(...r.offset(o))}),new s(e)}};var{abs:Co,min:Ii,max:Bi,cos:pa,sin:ua,acos:ha,sqrt:To}=Math,ma=Math.PI;var Yt=class s{constructor(o){let e=o&&o.forEach?o:Array.from(arguments).slice(),r=!1;if(typeof e[0]=="object"){r=e.length;let m=[];e.forEach(function(g){["x","y","z"].forEach(function(v){typeof g[v]<"u"&&m.push(g[v])})}),e=m}let n=!1,i=e.length;if(r){if(r>4){if(arguments.length!==1)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");n=!0}}else if(i!==6&&i!==8&&i!==9&&i!==12&&arguments.length!==1)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");let a=this._3d=!n&&(i===9||i===12)||o&&o[0]&&typeof o[0].z<"u",l=this.points=[];for(let m=0,g=a?3:2;m<i;m+=g){var c={x:e[m],y:e[m+1]};a&&(c.z=e[m+2]),l.push(c)}let d=this.order=l.length-1,p=this.dims=["x","y"];a&&p.push("z"),this.dimlen=p.length;let u=I.align(l,{p1:l[0],p2:l[d]}),h=I.dist(l[0],l[d]);this._linear=u.reduce((m,g)=>m+Co(g.y),0)<h/50,this._lut=[],this._t1=0,this._t2=1,this.update()}static quadraticFromPoints(o,e,r,n){if(typeof n>"u"&&(n=.5),n===0)return new s(e,e,r);if(n===1)return new s(o,e,e);let i=s.getABC(2,o,e,r,n);return new s(o,i.A,r)}static cubicFromPoints(o,e,r,n,i){typeof n>"u"&&(n=.5);let a=s.getABC(3,o,e,r,n);typeof i>"u"&&(i=I.dist(e,a.C));let l=i*(1-n)/n,c=I.dist(o,r),d=(r.x-o.x)/c,p=(r.y-o.y)/c,u=i*d,h=i*p,m=l*d,g=l*p,v={x:e.x-u,y:e.y-h},b={x:e.x+m,y:e.y+g},y=a.A,f={x:y.x+(v.x-y.x)/(1-n),y:y.y+(v.y-y.y)/(1-n)},T={x:y.x+(b.x-y.x)/n,y:y.y+(b.y-y.y)/n},P={x:o.x+(f.x-o.x)/n,y:o.y+(f.y-o.y)/n},S={x:r.x+(T.x-r.x)/(1-n),y:r.y+(T.y-r.y)/(1-n)};return new s(o,P,S,r)}static getUtils(){return I}getUtils(){return s.getUtils()}static get PolyBezier(){return Xt}valueOf(){return this.toString()}toString(){return I.pointsToString(this.points)}toSVG(){if(this._3d)return!1;let o=this.points,e=o[0].x,r=o[0].y,n=["M",e,r,this.order===2?"Q":"C"];for(let i=1,a=o.length;i<a;i++)n.push(o[i].x),n.push(o[i].y);return n.join(" ")}setRatios(o){if(o.length!==this.points.length)throw new Error("incorrect number of ratio values");this.ratios=o,this._lut=[]}verify(){let o=this.coordDigest();o!==this._print&&(this._print=o,this.update())}coordDigest(){return this.points.map(function(o,e){return""+e+o.x+o.y+(o.z?o.z:0)}).join("")}update(){this._lut=[],this.dpoints=I.derive(this.points,this._3d),this.computedirection()}computedirection(){let o=this.points,e=I.angle(o[0],o[this.order],o[1]);this.clockwise=e>0}length(){return I.length(this.derivative.bind(this))}static getABC(o=2,e,r,n,i=.5){let a=I.projectionratio(i,o),l=1-a,c={x:a*e.x+l*n.x,y:a*e.y+l*n.y},d=I.abcratio(i,o);return{A:{x:r.x+(r.x-c.x)/d,y:r.y+(r.y-c.y)/d},B:r,C:c,S:e,E:n}}getABC(o,e){e=e||this.get(o);let r=this.points[0],n=this.points[this.order];return s.getABC(this.order,r,e,n,o)}getLUT(o){if(this.verify(),o=o||100,this._lut.length===o+1)return this._lut;this._lut=[],o++,this._lut=[];for(let e=0,r,n;e<o;e++)n=e/(o-1),r=this.compute(n),r.t=n,this._lut.push(r);return this._lut}on(o,e){e=e||5;let r=this.getLUT(),n=[];for(let i=0,a,l=0;i<r.length;i++)a=r[i],I.dist(a,o)<e&&(n.push(a),l+=i/r.length);return n.length?t/=n.length:!1}project(o){let e=this.getLUT(),r=e.length-1,n=I.closest(e,o),i=n.mpos,a=(i-1)/r,l=(i+1)/r,c=.1/r,d=n.mdist,p=a,u=p,h;d+=1;for(let m;p<l+c;p+=c)h=this.compute(p),m=I.dist(o,h),m<d&&(d=m,u=p);return u=u<0?0:u>1?1:u,h=this.compute(u),h.t=u,h.d=d,h}get(o){return this.compute(o)}point(o){return this.points[o]}compute(o){return this.ratios?I.computeWithRatios(o,this.points,this.ratios,this._3d):I.compute(o,this.points,this._3d,this.ratios)}raise(){let o=this.points,e=[o[0]],r=o.length;for(let n=1,i,a;n<r;n++)i=o[n],a=o[n-1],e[n]={x:(r-n)/r*i.x+n/r*a.x,y:(r-n)/r*i.y+n/r*a.y};return e[r]=o[r-1],new s(e)}derivative(o){return I.compute(o,this.dpoints[0],this._3d)}dderivative(o){return I.compute(o,this.dpoints[1],this._3d)}align(){let o=this.points;return new s(I.align(o,{p1:o[0],p2:o[o.length-1]}))}curvature(o){return I.curvature(o,this.dpoints[0],this.dpoints[1],this._3d)}inflections(){return I.inflections(this.points)}normal(o){return this._3d?this.__normal3(o):this.__normal2(o)}__normal2(o){let e=this.derivative(o),r=To(e.x*e.x+e.y*e.y);return{t:o,x:-e.y/r,y:e.x/r}}__normal3(o){let e=this.derivative(o),r=this.derivative(o+.01),n=To(e.x*e.x+e.y*e.y+e.z*e.z),i=To(r.x*r.x+r.y*r.y+r.z*r.z);e.x/=n,e.y/=n,e.z/=n,r.x/=i,r.y/=i,r.z/=i;let a={x:r.y*e.z-r.z*e.y,y:r.z*e.x-r.x*e.z,z:r.x*e.y-r.y*e.x},l=To(a.x*a.x+a.y*a.y+a.z*a.z);a.x/=l,a.y/=l,a.z/=l;let c=[a.x*a.x,a.x*a.y-a.z,a.x*a.z+a.y,a.x*a.y+a.z,a.y*a.y,a.y*a.z-a.x,a.x*a.z-a.y,a.y*a.z+a.x,a.z*a.z];return{t:o,x:c[0]*e.x+c[1]*e.y+c[2]*e.z,y:c[3]*e.x+c[4]*e.y+c[5]*e.z,z:c[6]*e.x+c[7]*e.y+c[8]*e.z}}hull(o){let e=this.points,r=[],n=[],i=0;for(n[i++]=e[0],n[i++]=e[1],n[i++]=e[2],this.order===3&&(n[i++]=e[3]);e.length>1;){r=[];for(let a=0,l,c=e.length-1;a<c;a++)l=I.lerp(o,e[a],e[a+1]),n[i++]=l,r.push(l);e=r}return n}split(o,e){if(o===0&&e)return this.split(e).left;if(e===1)return this.split(o).right;let r=this.hull(o),n={left:this.order===2?new s([r[0],r[3],r[5]]):new s([r[0],r[4],r[7],r[9]]),right:this.order===2?new s([r[5],r[4],r[2]]):new s([r[9],r[8],r[6],r[3]]),span:r};return n.left._t1=I.map(0,0,1,this._t1,this._t2),n.left._t2=I.map(o,0,1,this._t1,this._t2),n.right._t1=I.map(o,0,1,this._t1,this._t2),n.right._t2=I.map(1,0,1,this._t1,this._t2),e?(e=I.map(e,o,1,0,1),n.right.split(e).left):n}extrema(){let o={},e=[];return this.dims.forEach(function(r){let n=function(a){return a[r]},i=this.dpoints[0].map(n);o[r]=I.droots(i),this.order===3&&(i=this.dpoints[1].map(n),o[r]=o[r].concat(I.droots(i))),o[r]=o[r].filter(function(a){return a>=0&&a<=1}),e=e.concat(o[r].sort(I.numberSort))}.bind(this)),o.values=e.sort(I.numberSort).filter(function(r,n){return e.indexOf(r)===n}),o}bbox(){let o=this.extrema(),e={};return this.dims.forEach(function(r){e[r]=I.getminmax(this,r,o[r])}.bind(this)),e}overlaps(o){let e=this.bbox(),r=o.bbox();return I.bboxoverlap(e,r)}offset(o,e){if(typeof e<"u"){let r=this.get(o),n=this.normal(o),i={c:r,n,x:r.x+n.x*e,y:r.y+n.y*e};return this._3d&&(i.z=r.z+n.z*e),i}if(this._linear){let r=this.normal(0),n=this.points.map(function(i){let a={x:i.x+o*r.x,y:i.y+o*r.y};return i.z&&r.z&&(a.z=i.z+o*r.z),a});return[new s(n)]}return this.reduce().map(function(r){return r._linear?r.offset(o)[0]:r.scale(o)})}simple(){if(this.order===3){let n=I.angle(this.points[0],this.points[3],this.points[1]),i=I.angle(this.points[0],this.points[3],this.points[2]);if(n>0&&i<0||n<0&&i>0)return!1}let o=this.normal(0),e=this.normal(1),r=o.x*e.x+o.y*e.y;return this._3d&&(r+=o.z*e.z),Co(ha(r))<ma/3}reduce(){let o,e=0,r=0,n=.01,i,a=[],l=[],c=this.extrema().values;for(c.indexOf(0)===-1&&(c=[0].concat(c)),c.indexOf(1)===-1&&c.push(1),e=c[0],o=1;o<c.length;o++)r=c[o],i=this.split(e,r),i._t1=e,i._t2=r,a.push(i),e=r;return a.forEach(function(d){for(e=0,r=0;r<=1;)for(r=e+n;r<=1+n;r+=n)if(i=d.split(e,r),!i.simple()){if(r-=n,Co(e-r)<n)return[];i=d.split(e,r),i._t1=I.map(e,0,1,d._t1,d._t2),i._t2=I.map(r,0,1,d._t1,d._t2),l.push(i),e=r;break}e<1&&(i=d.split(e,1),i._t1=I.map(e,0,1,d._t1,d._t2),i._t2=d._t2,l.push(i))}),l}translate(o,e,r){r=typeof r=="number"?r:e;let n=this.order,i=this.points.map((a,l)=>(1-l/n)*e+l/n*r);return new s(this.points.map((a,l)=>({x:a.x+o.x*i[l],y:a.y+o.y*i[l]})))}scale(o){let e=this.order,r=!1;if(typeof o=="function"&&(r=o),r&&e===2)return this.raise().scale(r);let n=this.clockwise,i=this.points;if(this._linear)return this.translate(this.normal(0),r?r(0):o,r?r(1):o);let a=r?r(0):o,l=r?r(1):o,c=[this.offset(0,10),this.offset(1,10)],d=[],p=I.lli4(c[0],c[0].c,c[1],c[1].c);if(!p)throw new Error("cannot scale this curve. Try reducing it first.");return[0,1].forEach(function(u){let h=d[u*e]=I.copy(i[u*e]);h.x+=(u?l:a)*c[u].n.x,h.y+=(u?l:a)*c[u].n.y}),r?([0,1].forEach(function(u){if(!(e===2&&u)){var h=i[u+1],m={x:h.x-p.x,y:h.y-p.y},g=r?r((u+1)/e):o;r&&!n&&(g=-g);var v=To(m.x*m.x+m.y*m.y);m.x/=v,m.y/=v,d[u+1]={x:h.x+g*m.x,y:h.y+g*m.y}}}),new s(d)):([0,1].forEach(u=>{if(e===2&&u)return;let h=d[u*e],m=this.derivative(u),g={x:h.x+m.x,y:h.y+m.y};d[u+1]=I.lli4(h,g,p,i[u+1])}),new s(d))}outline(o,e,r,n){if(e=e===void 0?o:e,this._linear){let S=this.normal(0),E=this.points[0],C=this.points[this.points.length-1],V,O,K;r===void 0&&(r=o,n=e),V={x:E.x+S.x*o,y:E.y+S.y*o},K={x:C.x+S.x*r,y:C.y+S.y*r},O={x:(V.x+K.x)/2,y:(V.y+K.y)/2};let ie=[V,O,K];V={x:E.x-S.x*e,y:E.y-S.y*e},K={x:C.x-S.x*n,y:C.y-S.y*n},O={x:(V.x+K.x)/2,y:(V.y+K.y)/2};let te=[K,O,V],fe=I.makeline(te[2],ie[0]),Se=I.makeline(ie[2],te[0]),le=[fe,new s(ie),Se,new s(te)];return new Xt(le)}let i=this.reduce(),a=i.length,l=[],c=[],d,p=0,u=this.length(),h=typeof r<"u"&&typeof n<"u";function m(S,E,C,V,O){return function(K){let ie=V/C,te=(V+O)/C,fe=E-S;return I.map(K,0,1,S+ie*fe,S+te*fe)}}i.forEach(function(S){let E=S.length();h?(l.push(S.scale(m(o,r,u,p,E))),c.push(S.scale(m(-e,-n,u,p,E)))):(l.push(S.scale(o)),c.push(S.scale(-e))),p+=E}),c=c.map(function(S){return d=S.points,d[3]?S.points=[d[3],d[2],d[1],d[0]]:S.points=[d[2],d[1],d[0]],S}).reverse();let g=l[0].points[0],v=l[a-1].points[l[a-1].points.length-1],b=c[a-1].points[c[a-1].points.length-1],y=c[0].points[0],f=I.makeline(b,g),T=I.makeline(v,y),P=[f].concat(l).concat([T]).concat(c);return new Xt(P)}outlineshapes(o,e,r){e=e||o;let n=this.outline(o,e).curves,i=[];for(let a=1,l=n.length;a<l/2;a++){let c=I.makeshape(n[a],n[l-a],r);c.startcap.virtual=a>1,c.endcap.virtual=a<l/2-1,i.push(c)}return i}intersects(o,e){return o?o.p1&&o.p2?this.lineIntersects(o):(o instanceof s&&(o=o.reduce()),this.curveintersects(this.reduce(),o,e)):this.selfintersects(e)}lineIntersects(o){let e=Ii(o.p1.x,o.p2.x),r=Ii(o.p1.y,o.p2.y),n=Bi(o.p1.x,o.p2.x),i=Bi(o.p1.y,o.p2.y);return I.roots(this.points,o).filter(a=>{var l=this.get(a);return I.between(l.x,e,n)&&I.between(l.y,r,i)})}selfintersects(o){let e=this.reduce(),r=e.length-2,n=[];for(let i=0,a,l,c;i<r;i++)l=e.slice(i,i+1),c=e.slice(i+2),a=this.curveintersects(l,c,o),n.push(...a);return n}curveintersects(o,e,r){let n=[];o.forEach(function(a){e.forEach(function(l){a.overlaps(l)&&n.push({left:a,right:l})})});let i=[];return n.forEach(function(a){let l=I.pairiteration(a.left,a.right,r);l.length>0&&(i=i.concat(l))}),i}arcs(o){return o=o||.5,this._iterate(o,[])}_error(o,e,r,n){let i=(n-r)/4,a=this.get(r+i),l=this.get(n-i),c=I.dist(o,e),d=I.dist(o,a),p=I.dist(o,l);return Co(d-c)+Co(p-c)}_iterate(o,e){let r=0,n=1,i;do{i=0,n=1;let a=this.get(r),l,c,d,p,u=!1,h=!1,m,g=n,v=1,b=0;do if(h=u,p=d,g=(r+n)/2,b++,l=this.get(g),c=this.get(n),d=I.getccenter(a,l,c),d.interval={start:r,end:n},u=this._error(d,a,r,n)<=o,m=h&&!u,m||(v=n),u){if(n>=1){if(d.interval.end=v=1,p=d,n>1){let f={x:d.x+d.r*pa(d.e),y:d.y+d.r*ua(d.e)};d.e+=I.angle({x:d.x,y:d.y},f,this.get(1))}break}n=n+(n-r)/2}else n=g;while(!m&&i++<100);if(i>=100)break;p=p||d,e.push(p),r=v}while(n<1);return e}};var lr=class extends _t{#e=null;constructor(o){super(),o&&(this.#e=o)}getBezier(){return this.#e||(this.#e=new Yt(this.getPoints().map(o=>o.xy))),this.#e}signedDistance(o){return this.nearestPointTo(o).point.distanceTo(o)}distance(o){return this.signedDistance(o)}at(o){return w.ofXY(this.getBezier().get(o))}derivativeAt(o){return w.ofXY(this.getBezier().derivative(o))}secondDerivativeAt(o){return w.ofXY(this.getBezier().dderivative(o))}normal(o){return w.ofXY(this.getBezier().normal(o))}normalAt(o){return this.normal(o)}tangentAt(o){return this.derivativeAt(o).normalized()}getTightBoundingBox(){let o=this.getBezier().bbox(),e=o.x.max-o.x.min,r=o.y.max-o.y.min;return new he(o.x.min,o.y.min,e,r)}argIntersectsLineSegment(o){let e=De.ofSmallestContainingPoints(this.getPoints());return e?e.intersectsLineSegment(o).map(i=>this.nearestPointTo(i).parameterValue):this.getBezier().intersects(o).map(n=>{typeof n=="string"&&(n=parseFloat(n));let i=w.ofXY(this.at(n));return i.distanceTo(o.p1)>o.length||i.distanceTo(o.p2)>o.length?null:n}).filter(n=>n!==null)}splitAt(o){if(o<=0||o>=1)return[this];let r=this.getBezier().split(o);return[new cr(r.left.points.map(n=>w.ofXY(n)),r.left),new cr(r.right.points.map(n=>w.ofXY(n)),r.right)]}nearestPointTo(o){let e=p=>o.squareDistanceTo(this.at(p)),r=e(0),n=0,i=r,a=4;for(let p=0;p<a;p++){let u=p/(a-1),h=e(u);h<i&&(n=u,i=h)}let l=p=>{let u=this.at(p),h=this.derivativeAt(p),m=this.secondDerivativeAt(p);return 2*h.x*h.x+2*u.x*m.x-2*o.x*m.x+2*h.y*h.y+2*u.y*m.y-2*o.y*m.y},c=p=>{let u=this.at(p),h=this.derivativeAt(p);return 2*u.x*h.x-2*o.x*h.x+2*u.y*h.y-2*o.y*h.y},d=()=>{let p=l(n);if(p===0)return;n=(0-c(n))/p+n,n>1?n=1:n<0&&(n=0)};for(let p=0;p<12;p++)d();return{parameterValue:n,point:this.at(n)}}intersectsBezier(o){let e=this.getBezier().intersects(o.getBezier());if(!e||e.length===0)return[];let r=[];for(let n of e){let i=/^([-0-9.eE]+)\/([-0-9.eE]+)$/.exec(n);if(!i)throw new Error(`Incorrect format returned by .intersects: ${e} should be array of "number/number"!`);let a=parseFloat(i[1]);r.push({parameterValue:a,point:this.at(a)})}return r}toString(){return`B\xE9zier(${this.getPoints().map(o=>o.toString()).join(", ")})`}},cr=class extends lr{constructor(e,r){super(r);this.controlPoints=e}getPoints(){return this.controlPoints}},dr=lr;var wn=class extends dr{constructor(e,r,n,i){super();this.p0=e;this.p1=r;this.p2=n;this.p3=i}getPoints(){return[this.p0,this.p1,this.p2,this.p3]}getLooseBoundingBox(){return he.bboxOf([this.p0,this.p1,this.p2,this.p3])}},Di=wn;var fa=(s,o,e)=>{if(s===0){let l;return o===0?l=e===0?0:NaN:l=-e/o,[l,l]}let r=o*o-4*s*e;if(r<0)return[NaN,NaN];let n=Math.sqrt(r),i=(-o+n)/(2*s),a=(-o-n)/(2*s);return i>a?[i,a]:[a,i]},Mi=fa;var Ae=class s extends dr{constructor(e,r,n){super();this.p0=e;this.p1=r;this.p2=n}static componentAt(e,r,n,i){return r+e*(-2*r+2*n)+e*e*(r-2*n+i)}static derivativeComponentAt(e,r,n,i){return-2*r+2*n+2*e*(r-2*n+i)}static secondDerivativeComponentAt(e,r,n,i){return 2*(r-2*n+i)}at(e){if(e===0)return this.p0;if(e===1)return this.p2;let r=this.p0,n=this.p1,i=this.p2;return w.of(s.componentAt(e,r.x,n.x,i.x),s.componentAt(e,r.y,n.y,i.y))}derivativeAt(e){let r=this.p0,n=this.p1,i=this.p2;return w.of(s.derivativeComponentAt(e,r.x,n.x,i.x),s.derivativeComponentAt(e,r.y,n.y,i.y))}secondDerivativeAt(e){let r=this.p0,n=this.p1,i=this.p2;return w.of(s.secondDerivativeComponentAt(e,r.x,n.x,i.x),s.secondDerivativeComponentAt(e,r.y,n.y,i.y))}normal(e){return this.derivativeAt(e).orthog().normalized()}getLooseBoundingBox(){return he.bboxOf([this.p0,this.p1,this.p2])}approximateDistance(e){let r=this.p0.x-e.x,n=-2*this.p0.x+2*this.p1.x,i=this.p0.x-2*this.p1.x+this.p2.x,a=this.p0.y-e.y,l=-2*this.p0.y+2*this.p1.y,c=this.p0.y-2*this.p1.y+this.p2.y,d=2*r*n+2*a*l-e.x*n-e.y*l,p=2*n*n+2*l*l+2*i*r+2*c*a-e.x*i-e.y*c,u=2*l*c+2*n*i+2*i*n+2*c*l,h=d,m=p,g=2*u,[v,b]=Mi(g/2,m,h);isNaN(v)&&(v=.25),isNaN(b)&&(b=.75);let y=this.at(v),f=this.at(b),T=y.squareDistanceTo(e),P=f.squareDistanceTo(e),S=this.at(0).squareDistanceTo(e),E=this.at(1).squareDistanceTo(e);return Math.sqrt(Math.min(T,P,S,E))}getPoints(){return[this.p0,this.p1,this.p2]}},Ai=Ae;var Cn=class extends _t{constructor(e){super();this.p=e}signedDistance(e){return this.p.distanceTo(e)}argIntersectsLineSegment(e,r){return e.containsPoint(this.p,r)?[0]:[]}getTightBoundingBox(){return new he(this.p.x,this.p.y,0,0)}at(e){return this.p}normalAt(e){return w.unitY}tangentAt(e){return w.unitX}splitAt(e){return[this]}nearestPointTo(e){return{point:this.p,parameterValue:0}}},Vi=Cn;var ga=s=>{if(s.indexOf("e")>0&&s.match(/[eE][-]\d{2,}$/))return"0";let o=s.charAt(s.length-1);(o==="0"||o===".")&&(s=s.replace(/([.]\d*[^0])0+$/,"$1"),s=s.replace(/[.]0+$/,"."),s=s.replace(/[.]$/,""));let e=s.charAt(0);return(e==="0"||e==="-")&&(s=s.replace(/^(0+)[.]/,"."),s=s.replace(/^-(0+)[.]/,"-."),s=s.replace(/^(-?)0+$/,"$10")),s==="-0"?"0":s},pr=ga;var de=s=>{let o=/^([-]?\d*\.\d{3,})0{4,}\d{1,4}$/,e=/^([-]?)(\d*)\.(\d{3,}9{4,})\d{1,4}$/,r=s.toString(10);if(r.indexOf(".")===-1)return r;let n=e.exec(r);if(n){let i=n[1],a=n[3],l=parseInt(a.charAt(a.length-1),10),c=parseInt(a,10),d=parseInt(n[2],10),p=n[3],u=(c+10-l).toString(),h=0;for(u.length>c.toString().length&&(u=u.substring(1),h=1);u.length<p.length;)u=h.toString(10)+u,h=0;r=`${i+(d+h).toString()}.${u}`}return r=r.replace(o,"$1"),pr(r)},xt=de;var ur=/^([-]?)(\d*)[.](\d+)$/;var ba=s=>{let o=ur.exec(s);return o?o[3].length:s.search(/[eE]/)!==-1||/^[a-zA-Z]+$/.exec(s)?-1:0},Oi=ba;var va=(s,...o)=>{let e=s.toString(10),r=ur.exec(e);if(!r)return e;let n=-1;for(let d of o)n=Math.max(Oi(d),n);if(n===-1)return xt(s);let i=r[3].substring(0,n),a=r[2],l=r[3].charAt(n);if(l!==""&&parseInt(l,10)>=5){if(i.length>0){let p=/^(0+)(\d*)$/.exec(i),u="",h=i;p&&(u=p[1],h=p[2]),i=(parseInt(i)+1).toString(),i.length>h.length&&u.length>0&&(u=u.substring(1)),i=u+i}(i.length===0||i.length>n)&&(a=(parseInt(a)+1).toString(),i=i.substring(1))}let c=r[1];return pr(`${c}${a}.${i}`)},Tn=va;var ya=s=>{if(s.length===0)return[];let o=s.reduce((i,a)=>a.y<i.y?a:i,s[0]),e=[o],r=[...s.filter(i=>!i.eq(o))],n=w.of(-1,0);for(;r.length>0;){let i=e[e.length-1],a=n.dot(o.minus(i).normalizedOrZero()),l=o;for(let d of r){let p=n.dot(d.minus(i).normalizedOrZero());p<=a&&(l=d,a=p)}r=r.filter(d=>!d.eq(l));let c=l.minus(i).normalized();if(Math.abs(c.dot(n))===1&&e.length>1&&e.pop(),l.eq(o))break;e.push(l),n=i.minus(l).normalized()}return e},Fi=ya;var Ee=(n=>(n[n.LineTo=0]="LineTo",n[n.MoveTo=1]="MoveTo",n[n.CubicBezierTo=2]="CubicBezierTo",n[n.QuadraticBezierTo=3]="QuadraticBezierTo",n))(Ee||{}),So=(s,o)=>{let e=s.curveIndex-o.curveIndex;return e===0?s.parameterValue-o.parameterValue:e},hr=(s,o)=>s.parameterValue+o>1?{curveIndex:s.curveIndex+1,parameterValue:s.parameterValue+o-1}:s.parameterValue+o<0?s.curveIndex===0?{curveIndex:0,parameterValue:0}:{curveIndex:s.curveIndex-1,parameterValue:s.parameterValue+o+1}:{curveIndex:s.curveIndex,parameterValue:s.parameterValue+o},G=class s{constructor(o,e){this.startPoint=o;this.cachedGeometry=null;this.cachedPolylineApproximation=null;this.cachedStringVersion=null;this.parts=e,this.bbox=he.bboxOf([o]);for(let r of this.parts)this.bbox=this.bbox.union(s.computeBBoxForSegment(o,r))}getExactBBox(){let o=[];for(let e of this.geometry)o.push(e.getTightBoundingBox());return he.union(...o)}get geometry(){if(this.cachedGeometry)return this.cachedGeometry;let o=this.startPoint,e=[];for(let r of this.parts){let n;switch(r.kind){case 2:e.push(new Di(o,r.controlPoint1,r.controlPoint2,r.endPoint)),o=r.endPoint;break;case 3:e.push(new Ai(o,r.controlPoint,r.endPoint)),o=r.endPoint;break;case 0:e.push(new De(o,r.point)),o=r.point;break;case 1:e.push(new Vi(r.point)),o=r.point;break;default:return n=r,n}}return this.cachedGeometry=e,this.cachedGeometry}*startEndPoints(){yield this.startPoint;for(let o of this.parts){let e;switch(o.kind){case 2:yield o.endPoint;break;case 3:yield o.endPoint;break;case 0:yield o.point;break;case 1:yield o.point;break;default:return e=o,e}}}polylineApproximation(){if(this.cachedPolylineApproximation)return this.cachedPolylineApproximation;let o=[];for(let n of this.parts)switch(n.kind){case 2:o.push(n.controlPoint1,n.controlPoint2,n.endPoint);break;case 3:o.push(n.controlPoint,n.endPoint);break;case 1:case 0:o.push(n.point);break}let e=[],r=this.startPoint;for(let n of o)e.push(new De(r,n)),r=n;return e}static computeBBoxForSegment(o,e){let r=[o],n;switch(e.kind){case 1:case 0:r.push(e.point);break;case 2:r.push(e.controlPoint1,e.controlPoint2,e.endPoint);break;case 3:r.push(e.controlPoint,e.endPoint);break;default:return n=e,n}return he.bboxOf(r)}signedDistance(o,e){let r=1/0;for(let n of this.geometry){let i=n.signedDistance(o)-e;i<r&&(r=i)}return r}raymarchIntersectionWith(o,e,r=[]){if(!o.bbox.intersects(this.bbox.grownBy(e)))return[];let n=o.length,i=[];for(let g of this.geometry){let v=g.getTightBoundingBox().grownBy(e);if(!v.intersects(o.bbox))continue;let b=f=>g.signedDistance(f),y=f=>b(f)-e;y(o.p1)>n&&y(o.p2)>n||i.push({part:g,distFn:b,bbox:v})}if(i.length===0)return[];let a=g=>{let v=1/0,b=null,y=[];for(let f of i){let{part:T,distFn:P,bbox:S}=f;if(!S.containsPoint(g)){y.push(f);continue}let E=P(g);E<=v&&(v=E,b=T)}for(let{part:f,distFn:T,bbox:P}of y){if(isFinite(v)&&!P.grownBy(v).containsPoint(g))continue;let S=T(g);S<=v&&(v=S,b=f)}return[b,v-e]},l=8,c=[o.p1,...r,o.p2],d=g=>g.minus(o.p1).dot(o.direction);c.sort((g,v)=>{let b=d(g),y=d(v);return b-y});let p=[],u=e/1e3,h=(g,v,b)=>{let y=g,[f,T]=a(y),P=d(y);if(T>n)return P;let S=o.direction.times(v);for(let C=0;C<l;C++){let V=T;if(y=y.plus(S.times(V)),P=d(y),P<=b)return P;let[O,K]=a(y);if(Math.abs(K)>Math.abs(T))return null;if(T=K,f=O,Math.abs(T)<u)break}let E=P>=0&&P<=n;if(f&&E&&Math.abs(T)<u){p.push({point:y,parameterValue:f.nearestPointTo(y).parameterValue,curve:f,curveIndex:this.geometry.indexOf(f)});let C=e/20/o.length;P+=isFinite(C)?C:0}return P},m=0;for(let g=0;g<c.length;g++){let v=c[g];m=Math.max(m,h(v,1,m)??m),m=Math.max(m,h(v,-1,m)??m)}return p}intersection(o,e){let r=[];if(!o.bbox.intersects(this.bbox.grownBy(e??0)))return[];if(this.parts.length===0)return new s(this.startPoint,[{kind:1,point:this.startPoint}]).intersection(o,e);let n=0;for(let a of this.geometry){let l=a.argIntersectsLineSegment(o);for(let c of l)r.push({curve:a,curveIndex:n,point:a.at(c),parameterValue:c});n++}if(e&&e>1e-8){let a=r.map(l=>l.point);r=this.raymarchIntersectionWith(o,e,a)}return r}nearestPointTo(o){let e=1/0,r=0,n=0,i=this.startPoint;for(let a=0;a<this.geometry.length;a++){let c=this.geometry[a].nearestPointTo(o),d=c.point.squareDistanceTo(o);(a===0||d<e)&&(r=a,e=d,n=c.parameterValue,i=c.point)}return{curve:this.geometry[r],curveIndex:r,parameterValue:n,point:i}}at(o){return o.curveIndex===0&&o.parameterValue===0?this.startPoint:this.geometry[o.curveIndex].at(o.parameterValue)}tangentAt(o){return this.geometry[o.curveIndex].tangentAt(o.parameterValue)}splitNear(o,e){let r=this.nearestPointTo(o);return this.splitAt(r,e)}spliced(o,e,r,n){if(((a,l)=>a.curveIndex<l.curveIndex||a.curveIndex===l.curveIndex&&a.parameterValue<=l.parameterValue)(o,e)){let a=this.splitAt(o,n),l=this.splitAt(e,n),c=a[0],d=l[l.length-1];return r?c.union(r).union(d):c.union(d)}else{let c=this.splitAt([o],n)[0].splitNear(this.at(e),n),d=c[c.length-1];return r?d.union(r):d}}splitAt(o,e){for(Array.isArray(o)||(o=[o]),o=[...o],o.sort(So);o.length>0&&o[o.length-1].curveIndex>=this.parts.length-1&&o[o.length-1].parameterValue>=1;)o.pop();for(o.reverse();o.length>0&&o[o.length-1].curveIndex<=0&&o[o.length-1].parameterValue<=0;)o.pop();if(o.length===0||this.parts.length===0)return[this];let r=o.length+1,n=e?.mapNewPoint??(p=>p),i=[],a=this.startPoint,l=[],{curveIndex:c,parameterValue:d}=o.pop();for(let p=0;p<this.parts.length;p++)if(p!==c)l.push(this.parts[p]);else{let u=this.parts[p],h=this.geometry[p];for(;p===c;){let m,g=[];switch(u.kind){case 1:l.push({kind:u.kind,point:u.point}),m=u.point;break;case 0:{let b=h.splitAt(d);l.push({kind:u.kind,point:n(b[0].p2)}),m=b[0].p2,b.length>1&&(console.assert(b.length===2),g.push({kind:u.kind,point:b[1].p2}),h=b[1])}break;case 3:case 2:{let b=h.splitAt(d),y=b.length===2;for(let f of b){h=f;let T=y?l:g,P=f.getPoints();u.kind===2?T.push({kind:u.kind,controlPoint1:n(P[1]),controlPoint2:n(P[2]),endPoint:n(P[3])}):T.push({kind:u.kind,controlPoint:n(P[1]),endPoint:n(P[2])}),y||(m=P[0]),y=!1}}break;default:return u}i.push(new s(a,[...l])),a=n(m),console.assert(!!a,"should have a start point"),l=g,u=g[g.length-1]??u;let v=o.pop();if(v)if(c=v.curveIndex,p===c){let b=this.at(v);d=h.nearestPointTo(b).parameterValue,l=[]}else d=v.parameterValue;else break}}return i.push(new s(a,l)),console.assert(i.length===r,`should split into splitAt.length + 1 splits (was ${i.length}, expected ${r})`),i}asClosed(){let o=[],e=!1;for(let n of this.parts)n.kind===1?(o.push({kind:0,point:n.point}),e=!0):o.push(n);if(this.getEndPoint().eq(this.startPoint)||(o.push({kind:0,point:this.startPoint}),e=!0),!e)return this;let r=new s(this.startPoint,o);return console.assert(r.getEndPoint().eq(r.startPoint)),r}static mapPathCommand(o,e){switch(o.kind){case 1:case 0:return{kind:o.kind,point:e(o.point)};case 2:return{kind:o.kind,controlPoint1:e(o.controlPoint1),controlPoint2:e(o.controlPoint2),endPoint:e(o.endPoint)};case 3:return{kind:o.kind,controlPoint:e(o.controlPoint),endPoint:e(o.endPoint)}}return o}mapPoints(o){let e=o(this.startPoint),r=[];for(let n of this.parts)r.push(s.mapPathCommand(n,o));return new s(e,r)}transformedBy(o){return o.isIdentity()?this:this.mapPoints(e=>o.transformVec2(e))}closedContainsPoint(o){let e=this.getExactBBox();if(!e.containsPoint(o))return!1;let r=o.plus(w.of(e.width,0)),n=this.asClosed(),i=new De(o,r);return n.intersection(i).length%2===1}union(o,e={allowReverse:!0}){if(!o)return this;if(Array.isArray(o))return new s(this.startPoint,[...this.parts,...o]);let r=this.getEndPoint(),n=[];if(r.eq(o.startPoint))n=this.parts.concat(o.parts);else{if(e.allowReverse&&this.startPoint.eq(o.getEndPoint()))return o.union(this,{allowReverse:!1});if(e.allowReverse&&this.startPoint.eq(o.startPoint))return this.union(o.reversed(),{allowReverse:!1});n=[...this.parts,{kind:1,point:o.startPoint},...o.parts]}return new s(this.startPoint,n)}reversed(){let o=this.getEndPoint(),e=[],r=this.startPoint;for(let n of this.parts)switch(n.kind){case 0:case 1:e.push({kind:n.kind,point:r}),r=n.point;break;case 2:e.push({kind:n.kind,controlPoint1:n.controlPoint2,controlPoint2:n.controlPoint1,endPoint:r}),r=n.endPoint;break;case 3:e.push({kind:n.kind,controlPoint:n.controlPoint,endPoint:r}),r=n.endPoint;break;default:return n}return e.reverse(),new s(o,e)}getEndPoint(){if(this.parts.length===0)return this.startPoint;let o=this.parts[this.parts.length-1];return o.kind===3||o.kind===2?o.endPoint:o.point}roughlyIntersects(o,e=0){if(this.parts.length===0)return o.containsPoint(this.startPoint);if(this.startPoint.eq(this.getEndPoint())&&e===0)return this.closedRoughlyIntersects(o);if(o.containsRect(this.bbox))return!0;let n=this.startPoint;for(let i of this.parts){let a=s.computeBBoxForSegment(n,i).grownBy(e);if(i.kind===0||i.kind===1?n=i.point:n=i.endPoint,o.intersects(a))return!0}return!1}closedRoughlyIntersects(o){if(o.containsRect(this.bbox))return!0;let e=this.bbox.topLeft.minus(w.of(1,1)),r=o.corners,n=this.polylineApproximation();for(let l of r){let c=new De(l,e),d=0;for(let p of n)p.intersects(c)&&d++;if(d%2===1)return!0}let i=o.grownBy(Math.min(o.size.x,o.size.y)),a=[];for(let l of i.divideIntoGrid(4,4))a.push(...l.getEdges());for(let l of a)for(let c of n)if(l.intersects(c))return!0;return!1}eq(o,e){if(o.parts.length!==this.parts.length)return!1;for(let r=0;r<this.parts.length;r++){let n=this.parts[r],i=o.parts[r];switch(n.kind){case 0:case 1:if(n.kind!==i.kind)return!1;if(!n.point.eq(i.point,e))return!1;break;case 2:if(n.kind!==i.kind)return!1;if(!n.controlPoint1.eq(i.controlPoint1,e)||!n.controlPoint2.eq(i.controlPoint2,e)||!n.endPoint.eq(i.endPoint,e))return!1;break;case 3:if(n.kind!==i.kind)return!1;if(!n.controlPoint.eq(i.controlPoint,e)||!n.endPoint.eq(i.endPoint,e))return!1;break;default:return n}}return!0}static fromRect(o,e=null){let r=[],n,i;if(e!==null){let a=w.of(e,e).times(.5),l=he.fromCorners(o.topLeft.plus(a),o.bottomRight.minus(a)),c=he.fromCorners(o.topLeft.minus(a),o.bottomRight.plus(a));n=[l.corners[3],...l.corners,...c.corners.reverse()],i=c.corners[3]}else n=o.corners.slice(1),i=o.corners[0];for(let a of n)r.push({kind:0,point:a});return r.push({kind:0,point:i}),new s(i,r)}toString(o,e=!1){if(this.cachedStringVersion&&!e)return this.cachedStringVersion;o===void 0&&(o=Math.abs(this.bbox.topLeft.x)>10&&Math.abs(this.bbox.topLeft.y)>10);let r=s.toString(this.startPoint,this.parts,!o);return this.cachedStringVersion=r,r}serialize(){return this.toString()}static toString(o,e,r){let n=[],i,a=(c,...d)=>{let p=[],u=[],h=!i||r,m=i?xt(i.x):"",g=i?xt(i.y):"";for(let b of d){let y=xt(b.x),f=xt(b.y);if(h)p.push(`${y},${f}`);else{let T=Tn(b.x-i.x,y,m,g),P=Tn(b.y-i.y,f,m,g);P.charAt(0)==="-"?u.push(`${T}${P}`):u.push(`${T},${P}`)}}let v;h?v=`${c}${p.join(" ")}`:v=`${c.toLowerCase()}${u.join(" ")}`,!(v==="l0,0"||v==="m0,0")&&(n.push(v),d.length>0&&(i=d[d.length-1]))};e[0]?.kind!==1&&a("M",o);let l;for(let c=0;c<e.length;c++){let d=e[c];switch(d.kind){case 1:a("M",d.point);break;case 0:a("L",d.point);break;case 2:a("C",d.controlPoint1,d.controlPoint2,d.endPoint);break;case 3:a("Q",d.controlPoint,d.endPoint);break;default:return l=d,l}}return n.join("")}static fromString(o){o=o.split(`
3
- `).join(" ");let e=w.zero,r=null,n=null,i=!0,a=[],l=v=>{if(i){i=!1;return}a.push({kind:1,point:v})},c=v=>{if(i){i=!1;return}a.push({kind:0,point:v})},d=(v,b,y)=>{a.push({kind:2,controlPoint1:v,controlPoint2:b,endPoint:y})},p=(v,b)=>{a.push({kind:3,controlPoint:v,endPoint:b})},u={m:1,l:1,c:3,q:2,z:0,h:1,v:1},h=/([MZLHVCSQTA])\s*([^MZLHVCSQTA]*)/gi,m;for(;(m=h.exec(o))!==null;){let b=m[2].trim().split(/[^0-9Ee.-]/).filter(S=>S.length>0).reduce((S,E)=>{E=E.replace(/([^eE])[-]/g,"$1 -");let C=E.split(" -");return C[0]!==""&&S.push(C[0]),S.push(...C.slice(1).map(V=>`-${V}`)),S},[]).map(S=>parseFloat(S)),y=m[1].toLowerCase(),f=m[1]!==y;if(y==="v"||y==="h")b=b.reduce((S,E)=>y==="v"?S.concat(f?e.x:0,E):S.concat(E,f?e.y:0),[]),y="l";else if(y==="z"){if(r)b=[r.x,r.y],r=e;else continue;f=!0,y="l"}let T=u[y]??0,P=b.reduce((S,E,C,V)=>{if(C%2!==0){let O=E,K=V[C-1];return S.concat(w.of(K,O))}else return S},[]).map((S,E)=>{let C;return f?C=S:C=e.plus(S),(E+1)%T===0&&(e=C),C});if(P.length%T!==0)throw new Error([`Incorrect number of arguments: got ${JSON.stringify(P)} with a length of ${P.length} \u2260 ${T}k, k \u2208 \u2124.`,`The number of arguments to ${y} must be a multiple of ${T}!`,`Command: ${m[0]}`].join(`
4
- `));for(let S=0;S<P.length;S+=T){let E=P.slice(S,S+T);switch(y.toLowerCase()){case"m":S===0?l(E[0]):c(E[0]);break;case"l":c(E[0]);break;case"c":d(E[0],E[1],E[2]);break;case"q":p(E[0],E[1]);break;default:throw new Error(`Unknown path command ${y}`)}i=!1}P.length>0&&(r??=P[0],n??=r,e=P[P.length-1])}let g=new s(n??w.zero,a);return g.cachedStringVersion=o,g}static fromConvexHullOf(o){if(o.length===0)return s.empty;let e=Fi(o),r=e.slice(1).map(n=>({kind:0,point:n}));return r.push({kind:0,point:e[0]}),new s(e[0],r)}static{this.empty=new s(w.zero,[])}};var L=class s{constructor(o,e,r,n){this.r=o;this.g=e;this.b=r;this.a=n;this.hexString=null}static ofRGB(o,e,r){return s.ofRGBA(o,e,r,1)}static ofRGBA(o,e,r,n){return o=Math.max(0,Math.min(o,1)),e=Math.max(0,Math.min(e,1)),r=Math.max(0,Math.min(r,1)),n=Math.max(0,Math.min(n,1)),new s(o,e,r,n)}static fromRGBArray(o,e=255){let r=o[0],n=o[1]??r,i=o[2]??r,a=255;return 3<o.length&&(a=o[3]),s.ofRGBA(r/e,n/e,i/e,a/e)}static fromHex(o){if(o=(o.match(/^[#]?(.*)$/)??[])[1],o=o.toUpperCase(),!o.match(/^[0-9A-F]+$/))throw new Error(`${o} is not in a valid format.`);(o.length===3||o.length===4)&&(o=o.split("").map(n=>`${n}0`).join("")),o.length===6&&(o+="FF");let e=[];for(let r=2;r<=o.length;r+=2){let n=o.substring(r-2,r);e.push(parseInt(n,16)/255)}if(e.length!==4)throw new Error(`Unable to parse ${o}: Wrong number of components.`);return s.ofRGBA(e[0],e[1],e[2],e[3])}static fromString(o){if(o.startsWith("#"))return s.fromHex(o);if(o==="none"||o==="transparent")return s.transparent;if(o==="")return s.black;let e=/^rgba?\(([,0-9.]+)\)$/i,r=o.replace(/\s*/g,"").match(e);if(r){let u=r[1],h=JSON.parse(`[ ${u} ]`);if(h.length===3)return s.ofRGB(h[0]/255,h[1]/255,h[2]/255);if(h.length===4)return s.ofRGBA(h[0]/255,h[1]/255,h[2]/255,h[3]);throw new Error(`RGB string, ${o}, has wrong number of components: ${h.length}`)}let n=document.createElement("canvas");n.width=1,n.height=1;let i=n.getContext("2d");if(!i)return s.black;i.fillStyle=o,i.fillRect(0,0,1,1);let a=i.getImageData(0,0,1,1),l=a.data[0]/255,c=a.data[1]/255,d=a.data[2]/255,p=a.data[3]/255;return s.ofRGBA(l,c,d,p)}eq(o){return o==null?!1:this.a===0&&o.a===0?!0:this.toHexString()===o.toHexString()}mix(o,e){e=Math.min(Math.max(e,0),1);let r=1-e;return new s(this.r*r+o.r*e,this.g*r+o.g*e,this.b*r+o.b*e,this.a*r+o.a*e)}get rgb(){return Pe.of(this.r,this.g,this.b)}relativeLuminance(){let o=[this.r,this.g,this.b].map(e=>e<.03928?e/12.92:Math.pow((e+.055)/1.055,2.4));return .2126*o[0]+.7152*o[1]+.0722*o[2]}static contrastRatio(o,e){let r=o.relativeLuminance(),n=e.relativeLuminance();return(Math.max(r,n)+.05)/(Math.min(r,n)+.05)}static average(o){let e=0,r=0,n=0,i=0;for(let a of o)e+=a.a,r+=a.r,n+=a.g,i+=a.b;return o.length>0&&(e/=o.length,r/=o.length,n/=o.length,i/=o.length),new s(r,n,i,e)}asHSV(){let o=Math.min(this.r,this.g,this.b),e=Math.max(this.r,this.g,this.b),r=e-o,n;r===0?n=0:this.r>=this.g&&this.r>=this.b?n=(this.g-this.b)/r%6:this.g>=this.r&&this.g>=this.b?n=(this.b-this.r)/r+2:n=(this.r-this.g)/r+4,n*=60,n*=Math.PI/180,n<0&&(n+=Math.PI*2);let i=e,a=i>0?r/i:0;return Pe.of(n,a,i)}static fromHSV(o,e,r){o<0&&(o+=Math.PI*2),o%=Math.PI*2,r=Math.max(0,Math.min(1,r)),e=Math.max(0,Math.min(1,e));let n=r*e,i=o/(Math.PI/3),a=n*(1-Math.abs(i%2-1)),l;i<1?l=[n,a,0]:i<2?l=[a,n,0]:i<3?l=[0,n,a]:i<4?l=[0,a,n]:i<5?l=[a,0,n]:l=[n,0,a];let c=r-n;return s.ofRGB(l[0]+c,l[1]+c,l[2]+c)}static fromRGBVector(o,e){return s.ofRGBA(o.x,o.y,o.z,e??1)}toHexString(){if(this.hexString)return this.hexString;let o=a=>{let l=Math.round(255*a).toString(16);return l.length===1?`0${l}`:l},e=o(this.a),r=o(this.r),n=o(this.g),i=o(this.b);return e==="ff"?`#${r}${n}${i}`:(this.hexString=`#${r}${n}${i}${e}`,this.hexString)}toString(){return this.toHexString()}static{this.transparent=s.ofRGBA(0,0,0,0)}static{this.red=s.ofRGB(1,0,0)}static{this.orange=s.ofRGB(1,.65,0)}static{this.green=s.ofRGB(0,1,0)}static{this.blue=s.ofRGB(0,0,1)}static{this.purple=s.ofRGB(.5,.2,.5)}static{this.yellow=s.ofRGB(1,1,.1)}static{this.clay=s.ofRGB(.8,.4,.2)}static{this.black=s.ofRGB(0,0,0)}static{this.gray=s.ofRGB(.5,.5,.5)}static{this.white=s.ofRGB(1,1,1)}};var Sn=class extends Be{},ke=class s{constructor(o){this.onTransformChangeCallback=o;this.resetTransform(k.identity),this.screenRect=B.empty}static{this.ViewportTransform=class extends Sn{constructor(e){super();this.transform=e;this.#e=e.inverse()}#e;apply(e){let r=e.viewport;r.resetTransform(r.transform.rightMul(this.transform)),e.queueRerender()}unapply(e){let r=e.viewport;r.resetTransform(r.transform.rightMul(this.#e)),e.queueRerender()}description(e,r){let n=[],i=e.viewport.visibleRect.center,a=this.transform.transformVec3(w.unitX),l=this.transform.transformVec2(i),c=a.magnitude(),d=180/Math.PI*a.angle(),p=l.minus(i);c>1.2?n.push(r.zoomedIn):c<.8&&n.push(r.zoomedOut),Math.floor(Math.abs(d))>0&&n.push(r.rotatedBy(Math.round(d)));let u=1e-4;return p.x>u?n.push(r.movedLeft):p.x<-u&&n.push(r.movedRight),p.y<-u?n.push(r.movedDown):p.y>u&&n.push(r.movedUp),n.join("; ")}}}getTemporaryClone(){let o=new s(()=>{});return o.transform=this.transform,o.inverseTransform=this.inverseTransform,o.screenRect=this.screenRect,o}updateScreenSize(o){this.screenRect=this.screenRect.resizedTo(o)}get visibleRect(){return this.screenRect.transformedBoundingBox(this.inverseTransform)}screenToCanvas(o){return this.inverseTransform.transformVec2(o)}canvasToScreen(o){return this.transform.transformVec2(o)}static transformBy(o){return new s.ViewportTransform(o)}resetTransform(o=k.identity){let e=this.transform;this.transform=o,this.inverseTransform=o.inverse(),this.onTransformChangeCallback?.(e,o)}get screenToCanvasTransform(){return this.inverseTransform}get canvasToScreenTransform(){return this.transform}getScreenRectSize(){return this.screenRect.size}getResolution(){return this.getScreenRectSize()}getScaleFactor(){return this.transform.transformVec3(F.unitX).magnitude()}getScaleFactorToNearestPowerOfTen(){return this.getScaleFactorToNearestPowerOf(10)}getScaleFactorToNearestPowerOf(o){let e=this.getScaleFactor();return Math.pow(o,Math.round(Math.log(e)/Math.log(o)))}static getGridSize(o){return 50/o}snapToGrid(o){let e=this.getScaleFactorToNearestPowerOf(2),r=i=>{let a=1/s.getGridSize(e);return Math.round(i*a)/a};return w.of(r(o.x),r(o.y))}getSizeOfPixelOnCanvas(){return 1/this.getScaleFactor()}getRotationAngle(){return this.transform.transformVec3(F.unitX).angle()}static roundPoint(o,e){let r=10**Math.floor(Math.log10(e)),n=i=>Math.round(i/r)*r;return typeof o=="number"?n(o):o.map(n)}roundPoint(o){return s.roundPoint(o,1/this.getScaleFactor())}static roundScaleRatio(o,e=1){if(Math.abs(o)<=1e-12)return 0;let r=10**Math.floor(Math.log10(Math.abs(o))),n=2**e;return o=Math.round(o/r*n)/n*r,o}computeZoomToTransform(o,e=!0,r=!0){let n=k.identity;if(o.w===0||o.h===0){let d=Math.max(o.w,o.h);d===0&&(d=50,e=!1,r=!1),o=new B(o.x,o.y,d,d)}if(isNaN(o.size.magnitude()))throw new Error(`${o.toString()} rectangle has NaN size! Cannot zoom to!`);let i=()=>{let d=this.visibleRect.transformedBoundingBox(n.inverse());return d.transformedBoundingBox(k.scaling2D(4/5,d.center))},a=i(),l=a.w<o.w||a.h<o.h,c=o.maxDimension/a.maxDimension<1/3;if(l&&r||c&&e){let d=Math.max(o.w/a.w,o.h/a.h),u=k.scaling2D(d,a.topLeft).inverse();n=n.rightMul(u)}if(a=i(),!a.containsRect(o)){let d=o.center.minus(a.center),u=k.translation(d).inverse();n=n.rightMul(u)}return n.invertable()||(console.warn("Unable to zoom to ",o,"! Computed transform",n,"is singular."),n=k.identity),n}zoomTo(o,e=!0,r=!0){let n=this.computeZoomToTransform(o,e,r);return new s.ViewportTransform(n)}},$=ke;var U=class s extends Be{#e;constructor(o){if(super(),!(o in s.deserializationCallbacks))throw new Error(`Command ${o} must have a registered deserialization callback. To do this, call SerializableCommand.register.`);this.#e=o}static{this.deserializationCallbacks={}}serialize(){return{data:this.serializeToJSON(),commandType:this.#e}}static deserialize(o,e){let r=typeof o=="string"?JSON.parse(o):o,n=r.commandType;if(!(n in s.deserializationCallbacks))throw new Error(`Unrecognised command type ${n}!`);return s.deserializationCallbacks[n](r.data,e)}static register(o,e){s.deserializationCallbacks[o]=e}};var wt=class extends U{constructor(o,e,r){super(o),this.component=r??null,this.componentID=e}resolveComponent(o){if(this.component)return;let e=o.lookupElement(this.componentID);if(!e)throw new Error(`Unable to resolve component with ID ${this.componentID}`);this.component=e}};var Qt=(r=>(r[r.BoundingBox=0]="BoundingBox",r[r.FillScreen=1]="FillScreen",r[r.Anywhere=2]="Anywhere",r))(Qt||{}),q=class s{constructor(o,e){this.componentKind=o;this.loadSaveData={};if(this.lastChangedTime=new Date().getTime(),e!==void 0?this.zIndex=e:this.zIndex=s.zIndexCounter++,this.id=`${new Date().getTime()}-${Math.random()}`,s.deserializationCallbacks[o]===void 0)throw new Error(`Component ${o} has not been registered using AbstractComponent.registerComponent`)}static{this.zIndexCounter=0}getId(){return this.id}static{this.deserializationCallbacks={}}static registerComponent(o,e){this.deserializationCallbacks[o]=e??null}attachLoadSaveData(o,e){this.loadSaveData[o]||(this.loadSaveData[o]=[]),this.loadSaveData[o].push(e)}getLoadSaveData(){return this.loadSaveData}getZIndex(){return this.zIndex}getBBox(){return this.contentBBox}getExactBBox(){return this.getBBox()}getSizingMode(){return 0}occludesEverythingBelowWhenRenderedInRect(o){return!1}onAddToImage(o){}onRemoveFromImage(){}intersectsRect(o){return o.containsRect(this.getExactBBox())?!0:o.getEdges().some(r=>this.intersects(r))}isSelectable(){return!0}isBackground(){return!1}getProportionalRenderingTime(){return 1}transformBy(o){return new s.TransformElementCommand(o,this.getId(),this)}setZIndex(o){return new s.TransformElementCommand(k.identity,this.getId(),this,o)}setZIndexAndTransformBy(o,e,r){return new s.TransformElementCommand(o,this.getId(),this,e,r)}static{this.transformElementCommandId="transform-element"}static{this.TransformElementCommand=class extends wt{constructor(e,r,n,i,a){super(s.transformElementCommandId,r,n);this.affineTransfm=e;this.origZIndex=a;this.targetZIndex=i??s.zIndexCounter++,this.targetZIndex>=s.zIndexCounter&&(s.zIndexCounter=this.targetZIndex+1),n&&a===void 0&&(this.origZIndex=n.getZIndex())}resolveComponent(e){this.component||(super.resolveComponent(e),this.origZIndex??=this.component.getZIndex())}updateTransform(e,r,n){if(!this.component)throw new Error("this.component is undefined or null!");let i=e.image.findParent(this.component),a=!1;i&&(i.remove(),a=!0),this.component.applyTransformation(r),this.component.zIndex=n,this.component.lastChangedTime=new Date().getTime(),n>=s.zIndexCounter&&(s.zIndexCounter=n+1),a&&_.addElement(this.component).apply(e)}apply(e){this.resolveComponent(e.image),this.updateTransform(e,this.affineTransfm,this.targetZIndex),e.queueRerender()}unapply(e){this.resolveComponent(e.image),this.updateTransform(e,this.affineTransfm.inverse(),this.origZIndex),e.queueRerender()}description(e,r){return r.transformedElements(1)}static{U.register(s.transformElementCommandId,(e,r)=>{let n=r.image.lookupElement(e.id)??void 0,i=new k(...e.transfm),a=e.targetZIndex,l=e.origZIndex??void 0;return new s.TransformElementCommand(i,e.id,n,a,l)})}serializeToJSON(){return{id:this.componentID,transfm:this.affineTransfm.toArray(),targetZIndex:this.targetZIndex,origZIndex:this.origZIndex}}}}clone(){let o=this.createClone();for(let e in this.loadSaveData)for(let r of this.loadSaveData[e])o.attachLoadSaveData(e,r);return o}serialize(){let o=this.serializeToJSON();if(o===null)throw new Error(`${this} cannot be serialized.`);return{name:this.componentKind,zIndex:this.zIndex,id:this.id,loadSaveData:this.loadSaveData,data:o}}static isNotDeserializable(o){return typeof o=="string"&&(o=JSON.parse(o)),typeof o!="object"||!this.deserializationCallbacks[o?.name]||!o.data}static deserialize(o){if(typeof o=="string"&&(o=JSON.parse(o)),s.isNotDeserializable(o))throw new Error(`Element with data ${o} cannot be deserialized.`);let e=this.deserializationCallbacks[o.name](o.data);return e.id=o.id,isFinite(o.zIndex)&&(e.zIndex=o.zIndex,s.zIndexCounter=Math.max(s.zIndexCounter,e.zIndex+1)),e}};var He=class{constructor(){this.listeners={}}dispatch(o,e){let r=this.listeners[o];if(r)for(let n=0;n<r.length;n++)r[n](e)}on(o,e){return this.listeners[o]||(this.listeners[o]=[]),this.listeners[o].push(e),{remove:()=>{let r=this.listeners[o];return this.off(o,e),r.length!==this.listeners[o].length}}}off(o,e){let r=this.listeners[o];r&&(this.listeners[o]=r.filter(n=>n!==e))}};function Hi(s){throw new Error(`Should be unreachable. Key: ${s}.`)}function pt(s,o=!1){if(typeof s!="number"||!o&&isNaN(s))throw new Error("Given value is not a number")}function xa(s){if(!Array.isArray(s))throw new Error("Asserting isArray: Given entity is not an array")}function Po(s,o=!1){xa(s),pt(s.length);for(let e of s)pt(e,o)}function Pn(s){if(typeof s!="boolean")throw new Error("Given value is not a boolean")}function Ni(s){if(!s)throw new Error(`${JSON.stringify(s)} is not truthy`)}function mr(s){if(typeof s!="object")throw new Error(`AssertIsObject: Given entity is not an object (type = ${typeof s})`)}var Ct=s=>{s.sort((o,e)=>o.getContent().getZIndex()-e.getContent().getZIndex())};var fr=!1,_=class s{constructor(){this.componentCount=0;this.settingExportRect=!1;this.root=new gr,this.background=new gr,this.componentsById=Object.create(null),this.notifier=new He,this.importExportViewport=new $(()=>{this.onExportViewportChanged()}),this.importExportViewport.updateScreenSize(w.of(500,500)),this.shouldAutoresizeExportViewport=!1}getBackgroundComponents(){let o=[],e=this.background.getLeaves();Ct(e);for(let r of e){let n=r.getContent();n&&o.push(n)}return o}findParent(o){return this.background.getChildWithContent(o)??this.root.getChildWithContent(o)}queueRerenderOf(o){let e=this.findParent(o);e&&(e.remove(),this.addElementDirectly(o))}renderWithCache(o,e,r){this.background.render(o,r.visibleRect),fr?this.root.render(o,r.visibleRect):e.render(o,this.root,r)}render(o,e){this.background.render(o,e?.visibleRect),this.root.render(o,e?.visibleRect)}async renderAllAsync(o,e){return await this.background.renderAllAsync(o,e)?await this.root.renderAllAsync(o,e):!1}renderAll(o){this.render(o,null)}getAllElements(){let o=this.root.getLeaves();return Ct(o),o.map(e=>e.getContent())}estimateNumElements(){return this.componentCount}getElementsIntersectingRegion(o,e=!1){let r=this.root.getLeavesIntersectingRegion(o);return e&&(r=r.concat(this.background.getLeavesIntersectingRegion(o))),Ct(r),r.map(n=>n.getContent())}onDestroyElement(o){this.componentCount--,delete this.componentsById[o.getId()],this.autoresizeExportViewport()}onElementAdded(o){this.componentCount++,this.componentsById[o.getId()]=o,this.autoresizeExportViewport()}lookupElement(o){return this.componentsById[o]??null}addElementDirectly(o){o.onAddToImage(this);let r=(o.isBackground()?this.background:this.root).addLeaf(o);return this.onElementAdded(o),r}removeElementDirectly(o){let e=this.findParent(o);return e?.remove(),e?(this.onDestroyElement(o),!0):!1}static addElement(o,e=!1){return new s.AddElementCommand(o,e)}addElement(o,e){return s.addElement(o,e)}static{this.AddElementCommand=class extends U{constructor(e,r=!1){super("add-element");this.element=e;this.applyByFlattening=r;this.serializedElem=null;if(this.serializedElem=null,isNaN(e.getBBox().area))throw new Error("Elements in the image cannot have NaN bounding boxes")}apply(e){e.image.addElementDirectly(this.element),this.applyByFlattening?(this.applyByFlattening=!1,e.display.flatten()):e.queueRerender()}unapply(e){e.image.removeElementDirectly(this.element),e.queueRerender()}description(e,r){return r.addElementAction(this.element.description(r))}serializeToJSON(){return{elemData:this.serializedElem??this.element.serialize()}}static{U.register("add-element",(e,r)=>{let n=e.elemData.id,a=r.image.lookupElement(n)??q.deserialize(e.elemData),l=new s.AddElementCommand(a);return l.serializedElem=e.elemData,l})}}}getImportExportViewport(){return this.importExportViewport}getImportExportRect(){return this.getImportExportViewport().visibleRect}setImportExportRect(o){return s.SetImportExportRectCommand.of(this,o,!1)}getAutoresizeEnabled(){return this.shouldAutoresizeExportViewport}setAutoresizeEnabled(o){if(o===this.shouldAutoresizeExportViewport)return Be.empty;let e=this.root.getBBox();return s.SetImportExportRectCommand.of(this,e,o)}setAutoresizeEnabledDirectly(o){o!==this.shouldAutoresizeExportViewport&&(this.shouldAutoresizeExportViewport=o,this.notifier.dispatch(1,{image:this}))}autoresizeExportViewport(){this.shouldAutoresizeExportViewport&&this.setExportRectDirectly(this.root.getBBox())}setExportRectDirectly(o){let e=this.getImportExportViewport(),r=e.getScreenRectSize(),n=e.canvasToScreenTransform,i=k.translation(o.topLeft.times(-1));return!r.eq(o.size)||!n.eq(i)?(this.settingExportRect=!0,e.updateScreenSize(o.size),e.resetTransform(i),this.settingExportRect=!1,this.onExportViewportChanged(),!0):!1}onExportViewportChanged(){this.settingExportRect||this.notifier.dispatch(0,{image:this})}static setDebugMode(o){fr=o}static{this.SetImportExportRectCommand=class extends U{constructor(e,r,n,i,a){super(s.SetImportExportRectCommand.commandId);this.originalSize=e;this.originalTransform=r;this.originalAutoresize=n;this.newExportRect=i;this.newAutoresize=a}static{this.commandId="set-import-export-rect"}static of(e,r,n){let i=e.getImportExportViewport(),a=i.visibleRect.size,l=i.canvasToScreenTransform,c=e.getAutoresizeEnabled();return new s.SetImportExportRectCommand(a,l,c,r,n)}apply(e){e.image.setAutoresizeEnabledDirectly(this.newAutoresize),e.image.setExportRectDirectly(this.newExportRect),e.queueRerender()}unapply(e){let r=e.image.getImportExportViewport();e.image.setAutoresizeEnabledDirectly(this.originalAutoresize),r.updateScreenSize(this.originalSize),r.resetTransform(this.originalTransform),e.queueRerender()}description(e,r){return this.newAutoresize!==this.originalAutoresize?this.newAutoresize?r.enabledAutoresizeOutputCommand:r.disabledAutoresizeOutputCommand:r.resizeOutputCommand(this.newExportRect)}serializeToJSON(){return{originalSize:this.originalSize.xy,originalTransform:this.originalTransform.toArray(),newRegion:{x:this.newExportRect.x,y:this.newExportRect.y,w:this.newExportRect.w,h:this.newExportRect.h},autoresize:this.newAutoresize,originalAutoresize:this.originalAutoresize}}static{let e=this.commandId;U.register(e,(r,n)=>{pt(r.originalSize.x),pt(r.originalSize.y),Po(r.originalTransform),Po([r.newRegion.x,r.newRegion.y,r.newRegion.w,r.newRegion.h]),Pn(r.autoresize??!1),Pn(r.originalAutoresize??!1);let i=w.ofXY(r.originalSize),a=new k(...r.originalTransform),l=new B(r.newRegion.x,r.newRegion.y,r.newRegion.w,r.newRegion.h),c=r.autoresize??!1,d=r.originalAutoresize??!1;return new s.SetImportExportRectCommand(i,a,d,l,c)})}}}},En=(s,o)=>{let e=0;if(o){for(let r=s.length-1;r>=1;r--)if(s[r].getBBox().containsRect(o)&&s[r].getContent()?.occludesEverythingBelowWhenRenderedInRect(o)){e=r;break}}return e},Eo=class s{constructor(o=null){this.parent=o;this.targetChildCount=30;this.children=[],this.bbox=B.empty,this.content=null,this.id=s.idCounter++}static{this.idCounter=0}getId(){return this.id}onContentChange(){this.id=s.idCounter++}getContent(){return this.content}getParent(){return this.parent}getChildrenIntersectingRegion(o,e){return this.children.filter(r=>{let n=r.getBBox();return!e?.(n)&&n.intersects(o)})}getChildrenOrSelfIntersectingRegion(o,e){return this.content&&this.bbox.intersects(o)&&!e?.(this.bbox)?[this]:this.getChildrenIntersectingRegion(o,e)}getLeavesIntersectingRegion(o,e){let r=[],n=[];for(n.push(this);n.length>0;){let a=n.pop().getChildrenOrSelfIntersectingRegion(o,e);for(let l of a)l.content?r.push(l):n.push(l)}return r}getChildWithContent(o){let e=this.getLeavesIntersectingRegion(o.getBBox());for(let r of e)if(r.getContent()===o)return r;return null}getLeaves(){if(this.content)return[this];let o=[];for(let e of this.children)o.push(...e.getLeaves());return o}addLeaf(o){if(this.onContentChange(),this.content===null&&this.children.length===0)return this.content=o,this.recomputeBBox(!0),this;if(this.content!==null){console.assert(this.children.length===0);let i=new s(this);i.content=this.content,this.content=null,this.children.push(i),i.recomputeBBox(!1)}let e=o.getBBox();if(e.containsRect(this.getBBox())){let i=new s(this);if(this.children.length<this.targetChildCount)this.children.push(i);else{let a=new s(this);a.children=this.children,this.children=[i,a],a.updateParents(),a.recomputeBBox(!0)}return i.addLeaf(o)}let r=this.children.filter(i=>i.getBBox().containsRect(e));if(r.length>0&&this.children.length>=this.targetChildCount){r.sort((a,l)=>a.getBBox().area-l.getBBox().area);let i=r[0].addLeaf(o);return i.rebalance(),i}let n=s.createLeafNode(this,o);return this.children.push(n),n.recomputeBBox(!0),this.children.length>=this.targetChildCount&&this.rebalance(),n}static createLeafNode(o,e){let r=new s(o);return r.content=e,r}getBBox(){return this.bbox}recomputeBBox(o){let e=this.bbox;this.content!==null?this.bbox=this.content.getBBox():this.bbox=B.union(...this.children.map(r=>r.getBBox())),o&&!e.eq(this.bbox)&&(this.bbox.containsRect(e)?this.parent?.unionBBoxWith(this.bbox):this.parent?.recomputeBBox(!0)),this.checkRep()}unionBBoxWith(o){this.bbox=this.bbox.union(o),this.parent?.unionBBoxWith(o)}updateParents(o=!1){for(let e of this.children)e.parent=this,o&&e.updateParents(o)}rebalance(){if(this.parent&&this.parent.children.length===1){console.assert(this.parent.content===null),console.assert(this.parent.children[0]===this);let o=this.parent;if(o.parent!==null){let e=o.parent;e.children=e.children.filter(r=>r!==o),o.parent=null,o.children=[],this.parent=e,e.children.push(this),this.parent.recomputeBBox(!1)}else this.content===null&&(this.parent.children=this.children,this.parent.updateParents(),this.parent=null)}if(this.children.length>this.targetChildCount*10){let o=this.getBBox().divideIntoGrid(4,4),e=[];for(;e.length<o.length;)e.push(0);for(let a of this.children)for(let l=0;l<o.length;l++)o[l].containsRect(a.getBBox())&&e[l]++;let r=0,n=e[0];for(let a=1;a<e.length;a++)e[a]>n&&(r=a,n=e[a]);let i=o[r];if(n>4){let a=[],l=[];for(let c of this.children)i.containsRect(c.getBBox())?l.push(c):a.push(c);if(l.length<this.children.length){this.children=a;let c=new s(this);this.children.push(c),c.children=l,c.updateParents(!1),c.recomputeBBox(!1),c.rebalance()}}}this.parent&&this.children.length===0&&this.content===null&&this.remove()}removeChild(o){this.checkRep();let e=this.children.length;this.children=this.children.filter(r=>r!==o),console.assert(this.children.length===e-1,`${e-1} \u2260 ${this.children.length} after removing all nodes equal to ${o}. Nodes should only be removed once.`),this.children.forEach(r=>{r.rebalance()}),this.recomputeBBox(!0),this.rebalance(),this.checkRep()}remove(){if(this.content?.onRemoveFromImage(),!this.parent){this.content=null,this.children=[];return}this.parent.removeChild(this),this.parent=null,this.content=null,this.children=[],this.checkRep()}async renderAllAsync(o,e){let r=this.getLeaves();Ct(r);let n=r.length;for(let i=0;i<n;i++){let l=r[i].getContent();if(!l)continue;if(!await e(l,i,n))return!1;l.render(o,void 0)}return!0}render(o,e){let r;e?r=this.getLeavesIntersectingRegion(e,i=>o.isTooSmallToRender(i)):r=this.getLeaves(),Ct(r);let n=En(r);for(let i=n;i<r.length;i++)r[i].getContent().render(o,e);fr&&e&&(n!==0&&console.log("EditorImage: skipped ",n,"nodes due to occlusion"),this.renderDebugBoundingBoxes(o,e))}renderDebugBoundingBoxes(o,e,r=0){let n=this.getBBox(),i=1/(o.getSizeOfCanvasPixelOnScreen()||1);if(n.maxDimension<3*i||!n.intersects(e))return;o.startObject(n);let a=!!this.content,l=a?L.ofRGBA(1,0,1,.4):L.ofRGBA(0,1,Math.sin(r),.6),c=a?1*i:2*i;if(o.drawRect(n.intersection(e),c,{fill:l}),o.endObject(),n.maxDimension>e.maxDimension/3){let d={fontFamily:"monospace",size:n.minDimension/20,renderingStyle:{fill:L.red}};o.drawText(`Depth: ${r}`,k.translation(n.bottomLeft),d)}for(let d of this.children)d.renderDebugBoundingBoxes(o,e,r+1)}checkRep(o=0){if(fr){if(this.parent&&!this.parent.children.includes(this))throw new Error(`Parent does not have this node as a child. (depth: ${o})`);let e=null,r=new Set;for(let i of this.children){if(e??=i.getBBox(),e=e.union(i.getBBox()),i.parent!==this)throw new Error(`Child with bbox ${i.getBBox()} and ${i.children.length} has wrong parent (was ${i.parent}).`);if(r.has(i))throw new Error(`Child ${i} is present twice or more in its parent's child list`);r.add(i)}let n=this.bbox.minDimension/100;if(e&&!this.bbox.eq(e,n))throw new Error(`Wrong bounding box ${e} \\neq ${this.bbox} (depth: ${o})`)}}},gr=class extends Eo{constructor(){super(...arguments);this.fullscreenChildren=[];this.dataComponents=[]}getChildrenIntersectingRegion(e,r){let n=super.getChildrenIntersectingRegion(e);for(let i of this.fullscreenChildren)n.push(i);return n}getChildrenOrSelfIntersectingRegion(e,r){let n=this.getContent();return n&&n.getSizingMode()===1?[this]:super.getChildrenOrSelfIntersectingRegion(e,r)}getLeaves(){let e=super.getLeaves();return this.dataComponents.concat(this.fullscreenChildren,e)}removeChild(e){let r=!1,n=i=>{let a=i===e;return r||=a,!a};this.dataComponents=this.dataComponents.filter(n),this.fullscreenChildren=this.fullscreenChildren.filter(n),r||super.removeChild(e)}getChildWithContent(e){let r=()=>{let n=this.fullscreenChildren.concat(this.dataComponents);for(let i of n)if(i.getContent()===e)return i;return null};return e.getSizingMode()===0?super.getChildWithContent(e)??r():super.getChildWithContent(e)??r()}addLeaf(e){let r=e.getSizingMode();if(r===0)return super.addLeaf(e);if(r===1){this.onContentChange();let n=Eo.createLeafNode(this,e);return this.fullscreenChildren.push(n),n}else if(r===2){this.onContentChange();let n=Eo.createLeafNode(this,e);return this.dataComponents.push(n),n}else{let n=r;throw new Error(`Invalid sizing mode, ${r}`)}}};var Z=(g=>(g[g.ToolEnabled=0]="ToolEnabled",g[g.ToolDisabled=1]="ToolDisabled",g[g.ToolUpdated=2]="ToolUpdated",g[g.UndoRedoStackUpdated=3]="UndoRedoStackUpdated",g[g.CommandDone=4]="CommandDone",g[g.CommandUndone=5]="CommandUndone",g[g.ObjectAdded=6]="ObjectAdded",g[g.ViewportChanged=7]="ViewportChanged",g[g.DisplayResized=8]="DisplayResized",g[g.SelectionUpdated=9]="SelectionUpdated",g[g.ReadOnlyModeToggled=10]="ReadOnlyModeToggled",g[g.ColorPickerToggled=11]="ColorPickerToggled",g[g.ColorPickerColorSelected=12]="ColorPickerColorSelected",g[g.ToolbarDropdownShown=13]="ToolbarDropdownShown",g))(Z||{}),kn=(r=>(r[r.CommandDone=0]="CommandDone",r[r.CommandUndone=1]="CommandUndone",r[r.CommandRedone=2]="CommandRedone",r))(kn||{});var Ge=(a=>(a[a.Pen=0]="Pen",a[a.Eraser=1]="Eraser",a[a.Touch=2]="Touch",a[a.PrimaryButtonMouse=3]="PrimaryButtonMouse",a[a.RightButtonMouse=4]="RightButtonMouse",a[a.Other=5]="Other",a))(Ge||{}),Re=class s{constructor(o,e,r,n,i,a,l,c){this.screenPos=o;this.canvasPos=e;this.pressure=r;this.isPrimary=n;this.down=i;this.device=a;this.id=l;this.timeStamp=c}snappedToGrid(o){let e=o.snapToGrid(this.canvasPos);return this.withCanvasPosition(e,o)}lockedToXYAxesScreen(o,e){let n=this.screenPos.minus(o),i=w.unitX.times(n.x),a=w.unitY.times(n.y),l;return n.dot(i)>n.dot(a)?l=i:l=a,l=l.plus(o),this.withScreenPosition(l,e)}withScreenPosition(o,e){let r=e.screenToCanvas(o);return this.withCanvasPosition(r,e)}withTimestamp(o){return new s(this.screenPos,this.canvasPos,this.pressure,this.isPrimary,this.down,this.device,this.id,o)}withCanvasPosition(o,e){let r=e.canvasToScreen(o);return new s(r,o,this.pressure,this.isPrimary,this.down,this.device,this.id,this.timeStamp)}static ofEvent(o,e,r,n){let i=w.of(o.clientX,o.clientY);if(n){let u=n.getBoundingClientRect();i=i.minus(w.of(u.left,u.top))}let l={mouse:3,pen:0,touch:2}[o.pointerType]??5;l===0&&o.buttons&32&&(l=1);let d=o.timeStamp,p=r.roundPoint(r.screenToCanvas(i));return l===3&&o.buttons&2&&(l=4),new s(i,p,o.pressure??null,o.isPrimary,e,l,o.pointerId,d)}static ofCanvasPoint(o,e,r,n=0,i=0,a=!0,l=null,c=null){let d=r.canvasToScreen(o);return c??=performance.now(),new s(d,o,l,a,e,i,n,c)}static ofScreenPoint(o,e,r,n=0,i=0,a=!0,l=null,c=null){let d=r.screenToCanvas(o);return c??=performance.now(),new s(o,d,l,a,e,i,n,c)}};var wa=()=>new Promise(s=>{requestAnimationFrame(()=>s())}),Ye=wa;var Ne=(p=>(p[p.PointerDownEvt=0]="PointerDownEvt",p[p.PointerMoveEvt=1]="PointerMoveEvt",p[p.PointerUpEvt=2]="PointerUpEvt",p[p.GestureCancelEvt=3]="GestureCancelEvt",p[p.WheelEvt=4]="WheelEvt",p[p.KeyPressEvent=5]="KeyPressEvent",p[p.KeyUpEvent=6]="KeyUpEvent",p[p.CopyEvent=7]="CopyEvent",p[p.PasteEvent=8]="PasteEvent",p[p.ContextMenu=9]="ContextMenu",p))(Ne||{}),$i=(s,o)=>({kind:s,key:o.key,code:o.code,ctrlKey:o.ctrlKey||o.metaKey,altKey:o.altKey,shiftKey:o.shiftKey}),ko=s=>$i(6,s),Ro=s=>$i(5,s),Jt=s=>s.kind===0||s.kind===1||s.kind===2;var Ui={remove(){}},Ca=()=>Ui,j=class s{waitForNextUpdate(){return new Promise(o=>{let e=this.onUpdate(r=>{e.remove(),o(r)})})}static fromInitialValue(o){return new br(o)}static fromImmutable(o){return{get:()=>o,onUpdate:Ca,onUpdateAndNow:e=>(e(o),Ui),waitForNextUpdate:()=>new Promise(()=>{})}}static fromCallback(o,e){let r=new br(o()),n=window.WeakRef?new window.WeakRef(r):{deref:()=>r};for(let i of e){let a=i.onUpdate(()=>{let l=n.deref();l?l.set(o()):a.remove()})}return r}static map(o,e,r){let n=s.fromInitialValue(e(o.get())),i=n.get();return o.onUpdate(a=>{i=e(a),n.set(i)}),r&&n.onUpdate(a=>{a!==i&&o.set(r(a))}),n}static union(o){return s.fromCallback(()=>o.map(e=>e.get()),o)}},pe=class extends j{static fromProperty(o,e){let r=j.fromInitialValue(o.get()[e]),n=window.WeakRef?new window.WeakRef(r):{deref:()=>r},i=o.onUpdate(a=>{let l=n.deref();l?l.set(a[e]):i.remove()});return r.onUpdate(a=>{o.set({...o.get(),[e]:a})}),r}},br=class extends pe{#e;#t;constructor(o){super(),this.#e=o,this.#t=[]}set(o){if(this.#e!==o){this.#e=o;for(let e of this.#t)e(o)}}get(){return this.#e}onUpdate(o){return this.#t.push(o),{remove:()=>{this.#t=this.#t.filter(e=>e!==o)}}}onUpdateAndNow(o){return o(this.get()),this.onUpdate(o)}},vr=j;var W=class{constructor(o,e){this.notifier=o;this.description=e;this.#e=j.fromInitialValue(!0),this.#e.onUpdate(r=>{r?(this.#t?.notifyEnabled(this),this.notifier.dispatch(0,{kind:0,tool:this})):this.notifier.dispatch(1,{kind:1,tool:this})})}#e;#t=null;#o=null;#r=null;canReceiveInputInReadOnlyEditor(){return!1}setInputMapper(o){this.#o=o,o&&o.setEmitListener(e=>this.dispatchEventToCallback(e))}getInputMapper(){return this.#o}dispatchEventToCallback(o){let e;switch(o.kind){case 0:return this.onPointerDown(o);case 1:this.onPointerMove(o);break;case 2:return this.onPointerUp(o)??!1;case 3:this.onGestureCancel(o);break;case 4:return this.onWheel(o);case 5:return this.onKeyPress(o);case 6:return this.onKeyUp(o);case 7:return this.onCopy(o);case 8:return this.onPaste(o);case 9:return this.onContextMenu(o);default:return e=o,e}return!0}onEvent(o){return this.#o?this.#o.onEvent(o):this.dispatchEventToCallback(o)}onPointerDown(o){return!1}onPointerMove(o){}onPointerUp(o){}onGestureCancel(o){}onWheel(o){return!1}onCopy(o){return!1}onPaste(o){return!1}onKeyPress(o){return!1}onKeyUp(o){return!1}onContextMenu(o){return!1}eventCanBeDeliveredToNonActiveTool(o){return!0}setEnabled(o){this.#e.set(o)}isEnabled(){return this.#e.get()}enabledValue(){return this.#e}setToolGroup(o){this.isEnabled()&&o.notifyEnabled(this),this.#t=o}getToolGroup(){return this.#t?this.#t:null}onDestroy(){this.#r?.remove(),this.#r=null,this.#t=null}};var Wi={updatedViewport:"Transformed Viewport",transformedElements:s=>`Transformed ${s} element${s===1?"":"s"}`,resizeOutputCommand:s=>`Resized image to ${s.w}x${s.h}`,enabledAutoresizeOutputCommand:"Enabled output autoresize",disabledAutoresizeOutputCommand:"Disabled output autoresize",addElementAction:s=>`Added ${s}`,eraseAction:(s,o)=>`Erased ${o} ${s}`,duplicateAction:(s,o)=>`Duplicated ${o} ${s}`,unionOf:(s,o)=>`Union: ${o} ${s}`,inverseOf:s=>`Inverse of ${s}`,elements:"Elements",erasedNoElements:"Erased nothing",duplicatedNoElements:"Duplicated nothing",rotatedBy:s=>`Rotated by ${Math.abs(s)} degrees ${s<0?"clockwise":"counter-clockwise"}`,movedLeft:"Moved left",movedUp:"Moved up",movedDown:"Moved down",movedRight:"Moved right",zoomedOut:"Zoomed out",zoomedIn:"Zoomed in",andNMoreCommands:s=>`And ${s} more commands.`,selectedElements:s=>`Selected ${s} element${s===1?"":"s"}`};var Ki={unlabeledImageNode:"Unlabeled image node",stroke:"Stroke",svgObject:"SVG Object",emptyBackground:"Empty background",gridBackground:"Grid background",filledBackgroundWithColor:s=>`Filled background (${s})`,text:s=>`Text object: ${s}`,imageNode:s=>`Image: ${s}`,restyledElement:s=>`Restyled ${s}`};var Gi={pathNodeCount:s=>`There are ${s} visible path objects.`,textNodeCount:s=>`There are ${s} visible text nodes.`,imageNodeCount:s=>`There are ${s} visible image nodes.`,textNode:s=>`Text: ${s}`,imageNode:s=>`Image: ${s}`,unlabeledImageNode:"Unlabeled image",rerenderAsText:"Re-render as text"};var ji={help:"Help",helpHidden:"Help hidden",next:"Next",previous:"Previous",close:"Close",helpScreenNavigationHelp:"Click on a control for more information."};var eo={...ji,pen:"Pen",eraser:"Eraser",select:"Select",handTool:"Pan",zoom:"Zoom",image:"Image",reformatSelection:"Format selection",inputAltText:"Alt text",decreaseImageSize:"Decrease size",resetImage:"Reset",chooseFile:"Choose file",dragAndDropHereOrBrowse:`Drag and drop here
1
+ "use strict";var jsdraw=(()=>{var yn=Object.defineProperty;var la=Object.getOwnPropertyDescriptor;var ca=Object.getOwnPropertyNames;var da=Object.prototype.hasOwnProperty;var ua=(s,o)=>{for(var e in o)yn(s,e,{get:o[e],enumerable:!0})},pa=(s,o,e,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of ca(o))!da.call(s,n)&&n!==e&&yn(s,n,{get:()=>o[n],enumerable:!(r=la(o,n))||r.enumerable});return s};var ha=s=>pa(yn({},"__esModule",{value:!0}),s);var Bl={};ua(Bl,{Abstract2DShape:()=>yo,AbstractComponent:()=>_,AbstractRenderer:()=>ze,AbstractToolbar:()=>it,ActionButtonWidget:()=>Ue,BackgroundComponent:()=>ce,BackgroundComponentBackgroundType:()=>co,BaseTool:()=>K,BaseToolWidget:()=>ye,BaseWidget:()=>ae,CanvasRenderer:()=>Le,Color4:()=>L,Command:()=>Ie,ComponentSizingMode:()=>to,Display:()=>Nt,DocumentPropertiesWidget:()=>Zt,DummyRenderer:()=>ot,Duplicate:()=>zt,Editor:()=>fn,EditorEventType:()=>Y,EditorImage:()=>q,Erase:()=>J,EraserMode:()=>ao,EraserTool:()=>Je,EraserToolWidget:()=>Kt,EventDispatcher:()=>Fe,HTMLToolbar:()=>it,HandToolWidget:()=>_t,IconProvider:()=>$t,ImageComponent:()=>be,InputEvtType:()=>He,InputMapper:()=>Re,InsertImageWidget:()=>qt,KeyBinding:()=>St,KeyboardShortcutManager:()=>H,LineSegment2:()=>ue,Mat33:()=>k,MutableReactiveValue:()=>te,PanZoomMode:()=>Ao,PanZoomTool:()=>Ce,Parameterized2DShape:()=>xo,PasteHandler:()=>At,Path:()=>$,PathCommandType:()=>we,PenTool:()=>Ne,PenToolWidget:()=>Wt,Pointer:()=>ke,PointerDevice:()=>Ge,QuadraticBezier:()=>De,ReactiveValue:()=>j,Rect2:()=>I,RenderingMode:()=>Yr,SVGLoader:()=>et,SVGRenderer:()=>me,SelectAllShortcutHandler:()=>Ot,SelectionMode:()=>Lt,SelectionTool:()=>ve,SelectionToolWidget:()=>Gt,SerializableCommand:()=>W,SoundUITool:()=>Ft,Stroke:()=>ee,StrokeComponent:()=>ee,StrokeSmoother:()=>ls,Text:()=>ne,TextComponent:()=>ne,TextTool:()=>$e,TextToolWidget:()=>jt,ToolController:()=>Ht,ToolEnabledGroup:()=>mt,ToolSwitcherShortcut:()=>Dt,ToolbarShortcutHandler:()=>tt,ToolbarWidgetTag:()=>Ut,UndoEventType:()=>In,UndoRedoHistory:()=>qr,UndoRedoShortcut:()=>Bt,Vec2:()=>w,Vec3:()=>F,Viewport:()=>U,__js_draw__version:()=>bo,adjustEditorThemeForContrast:()=>Ys,comparePathIndices:()=>Eo,createRestyleComponentCommand:()=>pt,default:()=>Il,defaultEditorLocalization:()=>Xe,getLocalizationTable:()=>Sr,invertCommand:()=>_s,isPointerEvt:()=>oo,isRestylableComponent:()=>Vo,keyPressEventFromHTMLEvent:()=>Lo,keyUpEventFromHTMLEvent:()=>zo,makeArrowBuilder:()=>sn,makeColorInput:()=>zs,makeDropdownToolbar:()=>qs,makeEdgeToolbar:()=>Os,makeFilledRectangleBuilder:()=>cn,makeFreehandLineBuilder:()=>Qe,makeLineBuilder:()=>ln,makeOutlinedCircleBuilder:()=>un,makeOutlinedRectangleBuilder:()=>dn,makePolylineBuilder:()=>ft,makePressureSensitiveFreehandLineBuilder:()=>Vt,matchingLocalizationTable:()=>Io,pathFromRenderable:()=>ht,pathToRenderable:()=>Z,pathVisualEquivalent:()=>Dr,sendPenEvent:()=>on,sendTouchEvent:()=>Zs,stepPathIndexBy:()=>vr,toRoundedString:()=>pe,uniteCommands:()=>le});(()=>{if(typeof document<"u"&&typeof document.createElement=="function"){let s=document.createElement("style");s.textContent='\uFEFF:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content>div>div{padding:5px}:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content>div{min-height:0}:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content img{max-width:100%;max-height:100%;display:block;margin-left:auto;margin-right:auto}:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content .insert-image-image-status-view{display:flex;justify-content:space-between;padding-bottom:0}:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content .action-button-row{margin-top:4px;display:flex;flex-direction:row;justify-content:flex-end;padding-bottom:0;margin-bottom:0}:root .insert-image-widget-dropdown-content.insert-image-widget-dropdown-content.insert-image-widget-dropdown-content .action-button-row>button{flex-grow:1;text-align:end;max-width:50%;min-width:min(100%,40px)}.toolbar-overflow-widget-overflow-list{display:flex;flex-direction:column;flex-wrap:wrap;justify-content:center}.toolbar-overflow-widget-overflow-list>.toolbar-toolContainer>.toolbar-button{height:var(--toolbar-button-height)}.toolbar-overflow-widget.horizontal .toolbar-overflow-widget-overflow-list{flex-direction:row}.toolbar-overflow-widget.horizontal>.toolbar-dropdown{max-width:100%;left:15px;right:15px;margin-left:0 !important;translate:none !important;padding:4px}:root .toolbar--pen-tool-toggle-buttons.toolbar--pen-tool-toggle-buttons{display:flex;justify-content:stretch;padding-top:0;padding-bottom:5px;direction:ltr}:root .toolbar--pen-tool-toggle-buttons.toolbar--pen-tool-toggle-buttons>*{flex-grow:1;text-align:start;margin-inline-end:5px}:root .toolbar--pen-tool-toggle-buttons.toolbar--pen-tool-toggle-buttons>* .icon{margin:0;margin-inline-start:4px;margin-inline-end:10px}:root .toolbar--pen-tool-toggle-buttons.toolbar--pen-tool-toggle-buttons>:nth-child(1){direction:ltr}:root .toolbar--pen-tool-toggle-buttons.toolbar--pen-tool-toggle-buttons>:last-child{direction:rtl}.toolbar-zoomLevelEditor{display:flex;flex-direction:row;align-items:center}.toolbar-zoomLevelEditor .zoomDisplay{flex-grow:1}.toolbar-zoomLevelEditor button{min-width:48px}.selection-format-menu.disabled{opacity:.5}.toolbar-document-properties-widget button.about-button{width:100%;text-align:end}.toolbar-document-properties-widget>*{--align-items-to-x: 120px}.toolbar-document-properties-widget .js-draw-size-input-row.js-draw-size-input-row{display:flex}.toolbar-document-properties-widget .js-draw-size-input-row.js-draw-size-input-row.size-input-row--automatic-size{display:none}.toolbar-thicknessSliderContainer{display:flex;flex-direction:row}.toolbar-thicknessSliderContainer input{flex-grow:1}.toolbar-element .clr-field *{cursor:pointer}.toolbar-element .clr-field button{width:1.2em;height:1.2em;top:50%;left:0;border-radius:50%;margin-left:0;margin-right:0}.toolbar-element .clr-field input{opacity:0}.color-input-container{display:inline-flex;flex-direction:row}.color-input-container .coloris_input{height:calc(100% - 6px)}.color-input-container.picker-open .clr-field{pointer-events:none}:root .color-input-container>button.pipetteButton{width:30px;height:30px;padding:0;display:inline-flex}.color-input-container>.color-input-wrapper{display:flex;justify-content:stretch}.color-input-container .pipetteButton>svg{width:100%}.color-input-container .pipetteButton .pickColorInstructions{display:none;font-size:1em;position:absolute;margin-left:30px;background-color:var(--background-color-1);border-radius:30px;padding:4px;opacity:0;transition:.2s ease opacity}@media(prefers-reduced-motion: reduce){.color-input-container .pipetteButton .pickColorInstructions{transition:none}}.color-input-container .pipetteButton.active{background-color:var(--selection-background-color);--icon-color: var(--selection-foreground-color)}.color-input-container .pipetteButton.active .pickColorInstructions{display:block;opacity:.8}.tool-dropdown-separator{--border-color: rgba(100, 100, 100, 0.2);--border-color: color-mix(in srgb, var(--foreground-color-1), rgba(0, 0, 0, 0) 80%);border-top:1px solid var(--border-color);padding-left:2px;margin-top:10px;margin-bottom:10px}.toolbar-element .toolbar--file-input-container{display:flex}.toolbar-element .toolbar--file-input-container.-loading{opacity:.8}.toolbar-element .toolbar--file-input-container>input.file-input{opacity:0;width:0;min-width:0 !important;max-width:0;height:0;overflow:hidden;padding:0;margin:0}.toolbar-element .toolbar--file-input-container>label{display:block;flex-grow:1;padding:0 !important;padding-bottom:5px;--active-border-color: rgba(100, 100, 100, 0.5);--active-border-color: color-mix(in srgb, var(--foreground-color-1), transparent)}.toolbar-element .toolbar--file-input-container>label .cancel-button{padding-left:3px;padding-right:3px}.toolbar-element .toolbar--file-input-container>label>.toolbar--file-input-description{background-color:var(--background-color-3);color:var(--foreground-color-3);border:1px dashed var(--active-border-color);padding:10px;margin-top:10px;display:flex;flex-direction:column;align-items:center;text-align:center;--action-color: var(--primary-action-foreground-color);--icon-color: var(--action-color)}.toolbar-element .toolbar--file-input-container>label>.toolbar--file-input-description>span{white-space:pre-wrap}.toolbar-element .toolbar--file-input-container>label>.toolbar--file-input-description>span>b{color:var(--action-color);cursor:pointer}.toolbar-element .toolbar--file-input-container>label>.toolbar--file-input-description>.icon{width:min(50vw,42px);height:min(50vw,42px);margin-bottom:8px;display:block}.toolbar-element .toolbar--file-input-container>label:active,.toolbar-element .toolbar--file-input-container>label:hover,.toolbar-element .toolbar--file-input-container>label.drag-target{--active-border-color: var(--foreground-color-1)}.toolbar-element .toolbar--file-input-container>label.drag-target>.toolbar--file-input-description{border-width:2px}.toolbar-grid-selector{position:relative}.toolbar-grid-selector>div{display:flex;flex-direction:row;max-width:350px;flex-wrap:wrap;--button-size: 48px}.toolbar-grid-selector .choice-button{display:flex;flex-direction:column-reverse;box-sizing:border-box;cursor:pointer;flex-shrink:1;margin:2px}.toolbar-grid-selector .choice-button.focus-visible{outline:2px solid var(--foreground-color-1)}.toolbar-grid-selector .choice-button input{opacity:0;height:0}.toolbar-grid-selector .choice-button label{display:flex;flex-direction:column;box-sizing:border-box;width:var(--button-size);height:var(--button-size);font-size:.7rem;align-items:center;justify-content:center;padding:4px;user-select:none;-webkit-user-select:none}.toolbar-grid-selector .choice-button .icon{flex-grow:1;flex-shrink:1;width:100%}.toolbar-grid-selector .choice-button.checked{background-color:var(--selection-background-color);color:var(--selection-foreground-color);--icon-color: var(--selection-foreground-color)}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list{height:min(200px,50vh);position:relative;display:flex;align-items:center}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.scroller{display:flex;flex-direction:column;overflow-y:auto;scroll-snap-type:y mandatory;height:100%;width:100%;flex-grow:1}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.scroller>.item{height:100%;width:100%;flex-shrink:0;display:flex;justify-content:center;align-items:center;scroll-snap-align:start;scroll-snap-stop:always;box-sizing:border-box}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.-empty{display:none}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.page-markers{overflow:hidden;display:flex;flex-direction:column;align-items:center;max-height:100%;min-height:0}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.page-markers.-one-element{visibility:hidden}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.page-markers>.marker{padding:2px;opacity:.1;cursor:pointer;left:0;transition:left .2s ease}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.page-markers>.marker>.content{background-color:var(--foreground-color-1);border-radius:2px;padding:2px}:root .toolbar-snapped-scroll-list.toolbar-snapped-scroll-list.toolbar-snapped-scroll-list>.page-markers>.marker.-active{position:relative;left:2px;opacity:.2}.toolbar-button-grid{display:grid;grid-template-columns:repeat(var(--column-count), 1fr);justify-items:center;--button-size: 30px}.toolbar-button-grid>.button{font-size:1em;width:min-content}.toolbar-button-grid>.button>.icon{max-width:var(--button-size);max-height:var(--button-size);width:48px;height:48px}.toolbar-button-grid>.button>label{display:block;font-weight:normal}.toolbar-root{background-color:var(--background-color-1);--icon-color: var(--foreground-color-1);--toolbar-button-height: min(20vh, 60px);flex-wrap:wrap;box-sizing:border-box;width:100%;display:flex;flex-direction:row;justify-content:center}.toolbar-element{z-index:1;font-family:system-ui,-apple-system,sans-serif}.toolbar-element details>summary{cursor:pointer}.toolbar-element>.toolbar-toolContainer>.toolbar-button,.toolbar-element>.toolbar-toolContainer>*>button,.toolbar-element>.toolbar-buttonGroup>button,.toolbar-element>.toolbar-button{white-space:pre;height:var(--toolbar-button-height)}.toolbar-dropdown .toolbar-button>.toolbar-icon{max-width:50px;width:100%}.toolbar-button.disabled{filter:sepia(0.2);opacity:.45;cursor:unset}.toolbar-button,.toolbar-element button{cursor:pointer;text-align:center;border-radius:6px;border:none;box-shadow:0px 0px 2px var(--shadow-color);user-select:none;-webkit-user-select:none;transition:background-color .15s ease,box-shadow .25s ease,opacity .2s ease}.toolbar-button,.toolbar-buttonGroup>button,.toolbar-toolContainer>*>button,.toolbar-root>button{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-left:3px;padding-right:3px;min-width:40px;max-width:105px;width:min-content;font-size:1em}.toolbar-button>label{cursor:inherit;user-select:none;-webkit-user-select:none}.toolbar-root>.toolbar-toolContainer>.toolbar-button>label.long-label{font-size:.75em}.toolbar-dropdown>.toolbar-toolContainer>button,.toolbar-dropdown>.toolbar-toolContainer>.toolbar-button{width:6em}.toolbar-button:not(.disabled):hover,.toolbar-root button:not(:disabled):hover{box-shadow:0px 2px 4px var(--shadow-color)}.toolbar-root button:disabled{cursor:inherit;opacity:.5}.toolbar-root .toolbar-icon{flex-shrink:1;user-select:none;width:100%;min-width:20px;min-height:20px}.toolbar-toolContainer.selected>.toolbar-button{background-color:var(--selection-background-color);color:var(--selection-foreground-color);--icon-color: var(--selection-foreground-color)}.toolbar-toolContainer:not(.selected):not(.dropdownShowable)>.toolbar-button>.toolbar-showHideDropdownIcon{display:none}.toolbar-toolContainer>.toolbar-button>.toolbar-showHideDropdownIcon{height:15px;transition:transform .25s ease}.toolbar-toolContainer.dropdownVisible>.toolbar-button>.toolbar-showHideDropdownIcon{transform:rotate(180deg)}.toolbar-dropdown.hidden,.toolbar-toolContainer:not(.selected):not(.dropdownShowable)>.toolbar-dropdown:not(.hiding){display:none}.toolbar-dropdown{position:absolute;padding:15px;padding-top:5px;display:flex;flex-wrap:wrap;flex-direction:column;max-height:80vh;max-width:fit-content;z-index:2;background-color:var(--background-color-1);box-shadow:0px 3px 3px var(--shadow-color)}@keyframes dropdown-transition-in{0%{opacity:0;transform:scale(1, 0)}100%{opacity:1;transform:scale(1, 1)}}@keyframes dropdown-transition-out{0%{opacity:1;transform:scale(1, 1)}100%{opacity:0;transform:scale(1, 0)}}.toolbar-dropdown{transform-origin:top left;--dropdown-show-animation: dropdown-transition-in;--dropdown-hide-animation: dropdown-transition-out}@media(prefers-reduced-motion: reduce){.toolbar-dropdown{--dropdown-show-animation: none;--dropdown-hide-animation: none}.toolbar-dropdown.hiding{display:none}.toolbar-toolContainer>.toolbar-button>.toolbar-showHideDropdownIcon{transition:none}:root .toolbar-button,.toolbar-root button{transition:none}}.toolbar-buttonGroup{display:flex;flex-direction:row;justify-content:center}.toolbar-element .toolbar--toggle-button{color:var(--foreground-color-1);font-weight:normal}.toolbar-element .toolbar--toggle-button[aria-checked=true]{background:var(--selection-background-color);color:var(--selection-foreground-color)}.toolbar-element .toolbar--toggle-button>.icon{width:25px;height:25px;margin:0 5px}.toolbar-element .toolbar--toggle-button>*{vertical-align:middle}.toolbar-closeColorPickerOverlay{display:none;position:fixed;top:0;left:0;bottom:0;right:0;touch-action:none;background-color:var(--background-color-1);opacity:.3;z-index:2}.toolbar-spacedList>*{padding-bottom:5px;padding-top:5px}.toolbar-indentedList{padding-left:10px}@media print{.toolbar-element{display:none}}@keyframes rehide-label{0%{opacity:.8}80%{opacity:.8}100%{opacity:.1}}@keyframes show-label-delayed{0%{opacity:0}80%{opacity:0}100%{opacity:.8}}@keyframes show-label-now{0%{opacity:0}5%{opacity:0}100%{opacity:.8}}@keyframes keep-label-hidden{0%{opacity:0}100%{opacity:0}}@keyframes toolbar--edgemenu-transition-in{from{transform:translate(0, 100%)}to{transform:translate(0, 0)}}@keyframes toolbar--edgemenu-transition-in-reduce-motion{from{opacity:0}to{opacity:1}}@keyframes toolbar--edgemenu-transition-out{to{transform:translate(0, 100%)}}@keyframes toolbar--edgemenu-transition-out-reduce-motion{from{opacity:1}to{opacity:0}}@keyframes toolbar--edgemenu-container-transition-in{from{overflow-y:hidden}to{overflow-y:hidden}}@keyframes toolbar--edgemenu-container-transition-out{from{overflow-y:hidden}to{overflow-y:hidden}}.toolbar-edge-toolbar{--toolbar-button-height: min(20vh, 48px);--toolbar-button-size: var(--toolbar-button-height);--label-hover-offset-size: calc(14px + var(--toolbar-button-height));box-sizing:border-box;flex-direction:row;justify-content:space-around;--button-label-hover-offset-y: var(--label-hover-offset-size);--button-label-hover-offset-x: 0}@media screen and (min-width: 540px){.toolbar-edge-toolbar{flex-wrap:nowrap}.toolbar-edge-toolbar>.toolbar-action-row{max-width:50vw;flex-grow:0;flex-shrink:0}}@media screen and (max-width: 700px){.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline{font-size:.9em}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button{width:var(--toolbar-button-size)}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button label{opacity:0;animation:.2s linear hide-initially}@keyframes hide-initially{from{opacity:0}to{opacity:0}}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):hover:not(:focus-visible)>label,.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):active>label{opacity:.8;animation:1s ease show-label-delayed}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button.has-long-press-or-hover>label{opacity:.8}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button:focus-visible>label,.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button.focus-visible>label{animation:1.5s ease rehide-label;opacity:0}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button:has(:focus-visible)>label{animation:1.5s ease rehide-label;opacity:0}.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button>label{opacity:0;position:absolute;margin-top:var(--button-label-hover-offset-y);margin-left:var(--button-label-hover-offset-x);z-index:1;pointer-events:none;background-color:var(--background-color-1);color:var(--foreground-color-1);border-radius:25px;padding:10px;transition:.3s ease opacity,.2s ease margin-top}}@media screen and (max-width: 700px)and (prefers-reduced-motion: reduce){.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button>label{transition:none}}@media screen and (max-width: 700px){.toolbar-edge-toolbar.one-row>*>.toolbar-toolContainer.label-inline>.toolbar-button>.toolbar-icon.toolbar-icon{margin-left:0;margin-right:0}}.toolbar-edge-toolbar>div.toolbar-element{flex-direction:row;display:flex;flex-grow:1;justify-content:center;background-color:var(--background-color-2);color:var(--foreground-color-2);--icon-color: var(--foreground-color-2);--extra-left-right-padding: 0px}.toolbar-edge-toolbar>div.toolbar-element::-webkit-scrollbar{width:3px;height:3px}.toolbar-edge-toolbar>div.toolbar-element::-webkit-scrollbar-thumb{background-color:var(--shadow-color)}.toolbar-edge-toolbar>div.toolbar-element.toolbar-tool-row{overflow-x:auto;overflow-y:hidden;flex-grow:100}.toolbar-edge-toolbar>div.toolbar-element.toolbar-action-row{z-index:2;background-color:var(--background-color-3);color:var(--foreground-color-3);--icon-color: var(--foreground-color-3)}.toolbar-edge-toolbar>div.toolbar-element.has-scroll{justify-content:start;position:relative;--button-label-hover-offset-y: 0;--button-label-hover-offset-x: calc(0px - var(--label-hover-offset-size))}.toolbar-edge-toolbar>div.toolbar-element.has-scroll>:nth-child(1){--button-label-hover-offset-x: var(--label-hover-offset-size)}.toolbar-edge-toolbar .toolbar-toolContainer.selected>.toolbar-button{background-color:var(--selection-background-color);color:var(--selection-foreground-color);--icon-color: var(--selection-foreground-color)}.toolbar-edge-toolbar .toolbar-button{box-sizing:border-box;background-color:rgba(0,0,0,0)}.toolbar-edge-toolbar .toolbar-button .toolbar-showHideDropdownIcon{flex-shrink:.01;height:12px}.toolbar-edge-toolbar .toolbar-toolContainer{order:1}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline{flex-grow:1;display:flex;--button-flex-direction: row}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline.label-left{justify-content:end;--button-flex-direction: row-reverse;order:100}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline.label-left>.toolbar-button>.toolbar-icon{margin-left:7px;margin-right:0}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline.label-right{order:-1}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline>.toolbar-button{width:auto;flex-direction:var(--button-flex-direction)}.toolbar-edge-toolbar .toolbar-toolContainer.label-inline>.toolbar-button>.toolbar-icon{height:100%;margin-right:7px;margin-left:0;width:22px}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button{width:calc(var(--toolbar-button-size) + var(--extra-left-right-padding));height:var(--toolbar-button-size)}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):hover:not(:focus-visible)>label,.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):active>label{opacity:.8;animation:1s ease show-label-delayed}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button.has-long-press-or-hover>label{opacity:.8}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button:focus-visible>label,.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button.focus-visible>label{animation:1.5s ease rehide-label;opacity:0}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button:has(:focus-visible)>label{animation:1.5s ease rehide-label;opacity:0}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button>label{opacity:0;position:absolute;margin-top:var(--button-label-hover-offset-y);margin-left:var(--button-label-hover-offset-x);z-index:1;pointer-events:none;background-color:var(--background-color-1);color:var(--foreground-color-1);border-radius:25px;padding:10px;transition:.3s ease opacity,.2s ease margin-top}@media(prefers-reduced-motion: reduce){.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline) .toolbar-button>label{transition:none}}.toolbar-edge-toolbar .toolbar-toolContainer:not(.no-icon):not(.label-inline).dropdownVisible>.toolbar-button>label{opacity:.8;animation:1.5s ease rehide-label .3s,1s ease keep-label-hidden 1.8s infinite}.toolbar-edge-toolbar>div>.toolbar-toolContainer:not(.selected):not(.dropdownShowable)>.toolbar-button>.toolbar-showHideDropdownIcon{display:block;visibility:hidden}.toolbar-edge-toolbar .toolbar-toolContainer>.toolbar-button{margin:0;border-radius:0;padding:8px;box-shadow:none}.toolbar-edge-toolbar .toolbar-toolContainer>.toolbar-button.has-dropdown{padding-left:8px;padding-right:8px;padding-top:8px;padding-bottom:0px}.imageEditorContainer.pipette--color-selection-in-progress .toolbar-edgemenu-container{height:0;background-color:rgba(0,0,0,0);opacity:.9}.imageEditorContainer.pipette--color-selection-in-progress .toolbar-edgemenu-container .toolbar-edgemenu{position:absolute}.toolbar-edgemenu-container{background-color:var(--background-color-transparent);transition:.15s ease-in-out height,.15s ease-in-out background-color,.2s ease-in-out opacity;position:absolute;width:var(--editor-current-width-px);height:var(--editor-current-height-px);box-sizing:border-box;display:flex;flex-direction:column-reverse;align-items:center;z-index:2}@media(prefers-reduced-motion: reduce){.toolbar-edgemenu-container{transition:.15s ease-in-out background-color,.2s ease-in-out opacity}}.toolbar-edgemenu-container.dropdown-below-edge{overflow-y:hidden}.toolbar-edgemenu-container button{font-size:1.2em;box-shadow:none;border:none;padding:10px;transition:.2s ease box-shadow;font-weight:bold;color:var(--primary-action-foreground-color)}.toolbar-edgemenu-container button:not(:disabled):hover{box-shadow:0 0px 2px var(--shadow-color)}.toolbar-edgemenu-container button:disabled{opacity:.5;font-weight:unset;cursor:unset;color:var(--foreground-color-1)}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button{--button-label-hover-offset-y: var(--button-size)}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):hover:not(:focus-visible)>label>.button-label-text,.toolbar-edgemenu-container .toolbar-grid-selector .choice-button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):active>label>.button-label-text{opacity:.8;animation:1s ease show-label-delayed}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button.has-long-press-or-hover>label>.button-label-text{opacity:.8}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button:focus-visible>label>.button-label-text,.toolbar-edgemenu-container .toolbar-grid-selector .choice-button.focus-visible>label>.button-label-text{animation:1.5s ease rehide-label;opacity:0}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button:has(:focus-visible)>label>.button-label-text{animation:1.5s ease rehide-label;opacity:0}.toolbar-edgemenu-container .toolbar-grid-selector .choice-button>label>.button-label-text{opacity:0;position:absolute;margin-top:var(--button-label-hover-offset-y);margin-left:var(--button-label-hover-offset-x);z-index:1;pointer-events:none;background-color:var(--background-color-1);color:var(--foreground-color-1);border-radius:25px;padding:10px;transition:.3s ease opacity,.2s ease margin-top}@media(prefers-reduced-motion: reduce){.toolbar-edgemenu-container .toolbar-grid-selector .choice-button>label>.button-label-text{transition:none}}.toolbar-edgemenu-container .toolbar-button-grid button{--button-label-hover-offset-y: 0}.toolbar-edgemenu-container .toolbar-button-grid button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):hover:not(:focus-visible)>label,.toolbar-edgemenu-container .toolbar-button-grid button:not(.no-long-press-or-hover):not(.has-long-press-or-hover):active>label{opacity:.8;animation:1s ease show-label-delayed}.toolbar-edgemenu-container .toolbar-button-grid button.has-long-press-or-hover>label{opacity:.8}.toolbar-edgemenu-container .toolbar-button-grid button:focus-visible>label,.toolbar-edgemenu-container .toolbar-button-grid button.focus-visible>label{animation:1.5s ease rehide-label;opacity:0}.toolbar-edgemenu-container .toolbar-button-grid button:has(:focus-visible)>label{animation:1.5s ease rehide-label;opacity:0}.toolbar-edgemenu-container .toolbar-button-grid button>label{opacity:0;position:absolute;margin-top:var(--button-label-hover-offset-y);margin-left:var(--button-label-hover-offset-x);z-index:1;pointer-events:none;background-color:var(--background-color-1);color:var(--foreground-color-1);border-radius:25px;padding:10px;transition:.3s ease opacity,.2s ease margin-top}@media(prefers-reduced-motion: reduce){.toolbar-edgemenu-container .toolbar-button-grid button>label{transition:none}}.toolbar-edgemenu-container .toolbar-help-overlay-button{align-items:last baseline}.toolbar-edgemenu-container .toolbar-edgemenu{--toolbar-button-height: 48px;touch-action:none;user-select:none;-webkit-user-select:none;background-color:var(--background-color-2);color:var(--foreground-color-2);--icon-color: var(--foreground-color-2);box-shadow:0px 0px 1px var(--shadow-color);padding-left:10px;padding-right:10px;width:min(400px,100vw);box-sizing:border-box;border-top-left-radius:30px;border-top-right-radius:30px;transition:transform .1s ease,padding-bottom .1s ease}.toolbar-edgemenu-container .toolbar-edgemenu input,.toolbar-edgemenu-container .toolbar-edgemenu textarea{user-select:auto;-webkit-user-select:auto}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer{display:inline-block}.toolbar-edgemenu-container .toolbar-edgemenu button{background-color:rgba(0,0,0,0)}.toolbar-edgemenu-container .toolbar-edgemenu>button.drag-elem{height:40px;display:block;cursor:ns-resize;position:relative;margin-top:-15px;margin-bottom:10px;width:100%;border:none;box-shadow:none;background:rgba(0,0,0,0)}.toolbar-edgemenu-container .toolbar-edgemenu>button.drag-elem::before{content:"";background-color:var(--icon-color);opacity:.2;display:block;position:relative;top:10px;height:5px;border-radius:5px;width:min(80%,40px);margin-left:auto;margin-right:auto}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer{display:block}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer .toolbar-button{flex-direction:row;max-width:unset;width:100%;box-sizing:border-box;justify-content:flex-start;box-shadow:none;padding:2px}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer .toolbar-button>.toolbar-icon{width:25px;height:25px;padding:13px;margin-right:15px}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer .toolbar-button label,.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-toolContainer .toolbar-button>label.long-label{font-size:1em}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-nonbutton-controls-main-list{padding-left:10px;padding-right:10px}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList{box-sizing:border-box;--align-items-to-x: 105px}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList>div{display:flex;align-items:center;margin-top:5px;min-height:35px}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList>div:first-child{margin-top:0}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList>div>label{padding-right:35px;min-width:var(--align-items-to-x);flex-shrink:1;box-sizing:border-box}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList>div>input[type=checkbox]{width:20px;height:20px;margin-left:0}.toolbar-edgemenu-container .toolbar-edgemenu .toolbar-spacedList>div>input:not([type=checkbox]){flex-grow:1;min-width:48px;flex-shrink:1}.toolbar-dropdown-toolbar button,.toolbar-dropdown-toolbar .toolbar-button{background-color:var(--background-color-2);color:var(--foreground-color-2);--icon-color: var(--foreground-color-2)}.toolbar-dropdown-toolbar,.toolbar-dropdown-toolbar .toolbar-dropdown{background-color:var(--background-color-3);color:var(--foreground-color-3)}.toolbar-dropdown-toolbar .toolbar-spacedList>div>label{padding-right:10px;min-width:50px}.toolbar-dropdown-toolbar .clr-field button{width:100%;height:100%;top:50%;left:0;border-radius:5px}.toolbar-dropdown-toolbar .toolbar-grid-selector>div{--button-size: 57px}.toolbar-dropdown-toolbar .toolbar-dropdown>div>.toolbar-toolContainer{display:inline-block}.toolbar-help-overlay{width:100%;height:100%;max-width:none;max-height:none;border:none;margin:0;padding:0;z-index:5;touch-action:none;overflow:hidden;color:#fff;--icon-color: white;background-color:rgba(0,0,0,0);display:flex;flex-direction:column;transition:.3s ease transform}.toolbar-help-overlay::backdrop{background-color:rgba(0,0,0,.8);backdrop-filter:blur(1px);-webkit-backdrop-filter:blur(1px)}.toolbar-help-overlay,.toolbar-help-overlay::backdrop{animation:.25s ease transition-in}@keyframes transition-in{0%{opacity:0}100%{opacity:1}}@keyframes transition-out{0%{opacity:1}100%{opacity:0}}.toolbar-help-overlay.-hiding,.toolbar-help-overlay.-hiding::backdrop{animation:.25s ease transition-out;opacity:0}.toolbar-help-overlay.-dragging{transition:none}@media(prefers-reduced-motion: reduce){.toolbar-help-overlay{transition:none}}@media screen and (min-width: 800px){.toolbar-help-overlay>.navigation-buttons{order:1;margin-top:auto}}.toolbar-help-overlay .with-text-shadow,.toolbar-help-overlay .help-page-container>.label,.toolbar-help-overlay button{text-shadow:0 0 3px rgba(20,20,20,.9);filter:drop-shadow(0px 0px 2px rgba(0, 0, 0, 0.5))}.toolbar-help-overlay button:not(:disabled){cursor:pointer}.toolbar-help-overlay button{background:rgba(0,0,0,0);border:none;color:var(--help-overlay-foreground);border-radius:15px}.toolbar-help-overlay .close-button{align-self:flex-start;width:48px;height:48px;z-index:1}.toolbar-help-overlay .close-button>svg{width:100%}.toolbar-help-overlay .navigation-content{flex-grow:1;display:flex}.toolbar-help-overlay .help-page-container{display:flex;align-items:center;flex-grow:1;touch-action:none}.toolbar-help-overlay .help-page-container>.label{flex-grow:1;text-align:center;font-size:18.5pt;margin-left:15px;margin-right:15px;margin-top:0px;z-index:1;transition:.5s ease margin-top}.toolbar-help-overlay .help-page-container>.label.-large-space-below{margin-top:0;margin-bottom:auto}.toolbar-help-overlay .help-page-container>.label.-small-space-above{margin-top:40px;margin-bottom:auto}.toolbar-help-overlay .help-page-container>.label.-large-space-above{margin-top:auto;margin-bottom:10px}@media(prefers-reduced-motion: reduce){.toolbar-help-overlay .help-page-container>.label{transition:none}}.toolbar-help-overlay .help-page-container>.cloned-element-container{position:absolute;z-index:0;user-select:none;-webkit-user-select:none;border-radius:10px;opacity:.01;background-color:rgba(100,100,100,.01);box-shadow:none;transition:.5s ease opacity,.5s ease background-color}.toolbar-help-overlay .help-page-container>.cloned-element-container *{pointer-events:none !important}.toolbar-help-overlay .help-page-container>.cloned-element-container>*{margin:0;opacity:.01 !important;transition:.3s ease opacity !important}.toolbar-help-overlay .help-page-container>.cloned-element-container:not(.-clickable) *{cursor:unset !important}.toolbar-help-overlay .help-page-container>.cloned-element-container.-clickable,.toolbar-help-overlay .help-page-container>.cloned-element-container.-background{z-index:1;touch-action:none}.toolbar-help-overlay .help-page-container>.cloned-element-container.-clickable{cursor:pointer;z-index:2}.toolbar-help-overlay .help-page-container>.cloned-element-container.-clickable.has-long-press-or-hover{opacity:.5 !important}.toolbar-help-overlay .help-page-container>.cloned-element-container.-clickable.has-long-press-or-hover,.toolbar-help-overlay .help-page-container>.cloned-element-container.-active{background-color:var(--background-color-1)}.toolbar-help-overlay .help-page-container>.cloned-element-container.-active{opacity:1;background-color:var(--background-color-1);box-shadow:0 0 3px rgba(100,100,100,.5)}.toolbar-help-overlay .help-page-container>.cloned-element-container.-active>*{opacity:1 !important}.toolbar-help-overlay .navigation-buttons{display:flex;flex-direction:row;justify-content:space-between;direction:ltr}.toolbar-help-overlay .navigation-buttons>button:disabled{opacity:.5}.toolbar-help-overlay .navigation-buttons>.next,.toolbar-help-overlay .navigation-buttons>.previous{font-size:1em;padding:10px;transition:.2s ease font-size;z-index:3}@media(prefers-reduced-motion: reduce){.toolbar-help-overlay .navigation-buttons>.next,.toolbar-help-overlay .navigation-buttons>.previous{transition:none}}.toolbar-help-overlay .navigation-buttons:not(.-has-previous)>.next:not(:disabled){animation:.5s ease highlight-button .5s}@keyframes highlight-button{0%{transform:scale(1)}50%{transform:scale(1.2)}55%{transform:scale(1.2) rotate(2deg)}65%{transform:scale(1.2) rotate(-2deg)}100%{transform:scale(1)}}@media(prefers-reduced-motion: reduce){.toolbar-help-overlay .navigation-buttons:not(.-has-previous)>.next:not(:disabled){animation:none}}.toolbar-help-overlay .navigation-buttons>.next::after{content:"\u276F";margin-left:3px}.toolbar-help-overlay .navigation-buttons>.previous::before{content:"\u276E";margin-right:3px}.toolbar-help-overlay .navigation-buttons.-has-next>.next{font-size:1.4em}.toolbar-help-overlay .navigation-buttons.-has-previous>.previous{font-size:1.4em}.toolbar-help-overlay .navigation-buttons.-highlight-next>.next,.toolbar-help-overlay .navigation-buttons.-highlight-previous>.previous{font-weight:bold;background-color:rgba(200,200,200,.1);font-size:1.4em}.toolbar-help-overlay .navigation-help{margin-top:1em;font-size:.7em}.toolbar-element .toolbar-help-overlay-button{height:0;position:relative;display:flex;justify-content:end}.toolbar-element .toolbar-help-overlay-button>.button{margin:0;padding:5px;padding-top:0;padding-bottom:0;box-shadow:none;text-align:center;opacity:.5}.toolbar-element .toolbar-help-overlay-button>.button>.icon{width:1.18em;height:1.18em;transition:.2s ease filter}.toolbar-element .toolbar-help-overlay-button>.button:focus-visible>.icon,.toolbar-element .toolbar-help-overlay-button>.button:hover>.icon{filter:drop-shadow(0px 0px 1px var(--shadow-color))}.ScrollbarTool-overlay{width:0;height:0;overflow:visible;opacity:.2;pointer-events:none;--fade-out-animation: 1s ease 0s fade-out;--scrollbar-size: 3px}@media(prefers-reduced-motion: reduce){.ScrollbarTool-overlay{--fade-out-animation: none !important}}@keyframes fade-out{from{opacity:.2}to{opacity:0}}.ScrollbarTool-overlay:not(.just-updated){animation:var(--fade-out-animation);opacity:0}.ScrollbarTool-overlay .vertical-scrollbar,.ScrollbarTool-overlay .horizontal-scrollbar{width:var(--scrollbar-size);height:var(--scrollbar-size);min-width:var(--scrollbar-size);min-height:var(--scrollbar-size);background-color:var(--foreground-color-1);border-radius:var(--scrollbar-size);position:absolute}.ScrollbarTool-overlay .vertical-scrollbar.represents-no-scroll,.ScrollbarTool-overlay .horizontal-scrollbar.represents-no-scroll{animation:var(--fade-out-animation);opacity:0}.ScrollbarTool-overlay:not(.scrollbar-left) .vertical-scrollbar{margin-left:calc(var(--editor-current-display-width-px) - var(--scrollbar-size))}.ScrollbarTool-overlay:not(.scrollbar-top) .horizontal-scrollbar{margin-top:calc(var(--editor-current-display-height-px) - var(--scrollbar-size))}.clipboard-error-dialog details>summary{cursor:pointer}.clipboard-error-dialog details[open]{margin-bottom:12px}.clipboard-error-dialog textarea{width:100%;box-sizing:border-box}.selection-tool-selection-background{background-color:var(--selection-background-color);opacity:.5;overflow:visible}.selection-tool-handle{position:absolute;box-sizing:border-box;display:flex;align-items:center;justify-content:center;--max-size: 17px}.selection-tool-handle .selection-tool-content{border:1px solid var(--foreground-color-1);background:var(--background-color-1);box-sizing:border-box;max-width:var(--max-size);max-height:var(--max-size);width:100%;height:100%;display:flex;justify-content:center;align-items:center;padding:3px}.selection-tool-handle .selection-tool-content .icon{width:100%;height:100%}.selection-tool-handle.selection-tool-circle .selection-tool-content{border-radius:100%}.selection-tool-handle.selection-tool-rotate{--max-size: 28px;cursor:grab}.selection-tool-handle.selection-tool-resize-x{cursor:ew-resize}.selection-tool-handle.selection-tool-resize-y{cursor:ns-resize}.selection-tool-handle.selection-tool-resize-xy{cursor:nwse-resize}.selection-tool-rotated-near-perpendicular .selection-tool-handle.selection-tool-resize-x{cursor:ns-resize}.selection-tool-rotated-near-perpendicular .selection-tool-handle.selection-tool-resize-y{cursor:ew-resize}.selection-tool-rotated-near-perpendicular .selection-tool-handle.selection-tool-resize-xy{cursor:nesw-resize}.selection-tool-selection-menu>button{max-height:var(--vertical-offset);background-color:var(--background-color-1);width:24px;height:24px;padding:6px;font-size:14px;user-select:none;-webkit-user-select:none;color:var(--foreground-color-1);border:.5px solid var(--foreground-color-1);border-radius:3px;opacity:.8;transition:.2s ease opacity}.selection-tool-selection-menu>button:hover,.selection-tool-selection-menu>button:focus-visible{background-color:var(--background-color-2);color:var(--foreground-color-2);cursor:pointer;opacity:1}.selection-tool-selection-menu>button>.icon{width:100%;height:100%}.overlay.handleOverlay{touch-action:none;direction:ltr}.overlay.handleOverlay,.overlay.handleOverlay .selection-tool-selection-outer-container{height:0;overflow:visible}.overlay.handleOverlay .selection-tool-selection-inner-container{width:var(--editor-current-display-width-px);height:var(--editor-current-display-height-px);overflow:hidden;pointer-events:none}.overlay.handleOverlay .selection-tool-selection-inner-container>*{pointer-events:all}.overlay.handleOverlay .selection-tool-selection-inner-container.-empty{opacity:0;display:none}.overlay.handleOverlay .selection-tool-selection-inner-container.-hide-handles .selection-tool-handle{display:none}@keyframes selection-duplicated-animation{0%{scale:1 1}50%{scale:1.02 1.02}100%{scale:1 1}}@media(prefers-reduced-motion: reduce){@keyframes selection-duplicated-animation{}}.find-tool-overlay{order:-1;position:absolute}.js-draw-sound-ui-toggle{width:0px;height:0px;overflow:hidden;user-select:none;-webkit-user-select:none}.js-draw-sound-ui-toggle button{margin-top:1px}.js-draw-sound-ui-toggle:focus-within,.js-draw-sound-ui-toggle.sound-ui-tool-enabled{overflow:visible;z-index:5}.js-draw-sound-ui-toggle:not(:focus-within):not(:hover).sound-ui-tool-enabled{opacity:.5}@keyframes show-popup-menu-animation{from{opacity:0}to{opacity:1}}.editor-popup-menu{width:100%;height:100%;background-color:rgba(0,0,0,0);border:none;animation:var(--hide-menu-animation-timeout) ease show-popup-menu-animation;opacity:1;transition:var(--hide-menu-animation-timeout) ease opacity;overflow:hidden}.editor-popup-menu.-hide{opacity:0}.editor-popup-menu>.content{position:absolute;left:var(--anchor-x);top:var(--anchor-y);display:flex;flex-direction:column;overflow:clip;border-radius:6px;box-shadow:0px 0px 2px var(--shadow-color);background-color:var(--background-color-1)}.editor-popup-menu::backdrop{background:rgba(0,0,0,0)}.editor-popup-menu-option{display:flex;justify-content:start;cursor:pointer;padding:5px;padding-top:6px;padding-bottom:6px;background-color:rgba(0,0,0,0);color:var(--foreground-color-1);--icon-color: currentColor;border:none;font-size:1em}.editor-popup-menu-option:hover,.editor-popup-menu-option:focus-visible{background-color:var(--background-color-2);color:var(--foreground-color-2)}.editor-popup-menu-option>:first-child{width:1em;height:1em;flex-shrink:0;align-self:center;margin-inline-start:0em;margin-inline-end:.32em}.about-dialog-content>.scroll{white-space:pre-wrap;font-family:monospace}.about-dialog-content>.scroll>details>summary{cursor:pointer}.about-dialog-content>.scroll>h2,.about-dialog-content>.scroll>details>summary{margin-top:15px;font-size:1.2em;font-weight:bold}.about-dialog-content>.scroll>h2 a,.about-dialog-content>.scroll>details>summary a{color:var(--foreground-color-1);text-decoration:underline}@keyframes fade-in{from{opacity:0}to{opacity:1}}.message-dialog-container dialog{display:flex}.message-dialog-container dialog.-closing{opacity:0}.message-dialog-container dialog.-closing::backdrop{opacity:0}.message-dialog-container dialog,.message-dialog-container dialog::backdrop{transition:opacity .2s ease;animation:fade-in .2s ease}.message-dialog-content{display:flex;flex-direction:column;flex-grow:1}.message-dialog-content>.close{display:block;margin-left:auto;margin-right:auto}.message-dialog-content>.scroll{flex-grow:1;flex-shrink:1;overflow-y:auto;margin-left:20px;margin-right:20px;padding-bottom:20px}.dialog-container>dialog{background-color:var(--background-color-1);color:var(--foreground-color-1);border:none;outline:none;box-shadow:0 0 2px var(--shadow-color);border-radius:8px;max-height:90vh;width:min(100%,500px);box-sizing:border-box}.dialog-container>dialog::backdrop{backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);background-color:var(--background-color-transparent)}#clr-picker{--clr-slider-size: 30px}#clr-picker #clr-color-area,#clr-picker .clr_hue{touch-action:none}#clr-picker .clr-alpha{margin-top:15px;margin-bottom:15px}#clr-picker.clr-picker input[type=range]::-moz-range-thumb{width:var(--clr-slider-size);height:var(--clr-slider-size)}#clr-picker.clr-picker input[type=range]::-webkit-slider-thumb{width:var(--clr-slider-size);height:var(--clr-slider-size)}#clr-picker.clr-picker input[type=range]::-webkit-slider-runnable-track{height:var(--clr-slider-size)}#clr-picker.clr-picker input[type=range]::-moz-range-track{height:var(--clr-slider-size)}.imageEditorContainer{--background-color-1: white;--foreground-color-1: black;--background-color-2: #f5f5f5;--foreground-color-2: #2c303a;--background-color-3: #e5e5e5;--foreground-color-3: #1c202a;--selection-background-color: #cbdaf1;--selection-foreground-color: #2c303a;--background-color-transparent: rgba(105, 100, 100, 0.5);--shadow-color: rgba(0, 0, 0, 0.5);--primary-action-foreground-color: #15b}@media(prefers-color-scheme: dark){.imageEditorContainer{--background-color-1: #151515;--foreground-color-1: white;--background-color-2: #222;--foreground-color-2: #efefef;--background-color-3: #272627;--foreground-color-3: #eee;--selection-background-color: #607;--selection-foreground-color: white;--shadow-color: rgba(250, 250, 250, 0.5);--background-color-transparent: rgba(50, 50, 50, 0.5);--primary-action-foreground-color: #7ae}}.imageEditorContainer{--icon-color: var(--foreground-color-1)}.imageEditorContainer{color:var(--foreground-color-1);font-family:system-ui,-apple-system,sans-serif;background-color:var(--background-color-1);width:100%;height:400px;min-height:220px;min-width:100px;writing-mode:horizontal-tb;box-sizing:border-box;display:flex;flex-direction:column-reverse}.imageEditorContainer input{accent-color:var(--primary-action-foreground-color)}.imageEditorContainer .imageEditorRenderArea{display:grid;grid-template-columns:1fr;flex-grow:2;flex-shrink:1;min-height:100px;min-width:0;width:100%;height:100%}.imageEditorContainer .imageEditorRenderArea canvas{grid-row:1/1;grid-column:1/1;touch-action:none;box-sizing:border-box;width:100%;height:100%;min-width:0;max-width:inherit;min-height:0px;max-height:inherit;user-select:none;-webkit-user-select:none;-webkit-user-drag:none}.imageEditorContainer .loadingMessage{position:fixed;text-align:center;font-size:2em;text-shadow:0px 0px 1px var(--background-color-1);bottom:0;left:0;right:0}.imageEditorContainer .accessibilityAnnouncement{opacity:0;width:0;height:0;overflow:hidden;pointer-events:none;user-select:none;-webkit-user-select:none}.imageEditorContainer .textRendererOutputContainer{width:.001px;height:.001px;overflow:hidden;-webkit-user-select:none;user-select:none}.imageEditorContainer .textRendererOutputContainer:focus-within{overflow:visible;z-index:5}.imageEditorContainer .anchored-element-overlay{overflow:visible;height:0}.imageEditorContainer .anchored-element-overlay>.content-wrapper{width:var(--editor-current-display-width-px);height:var(--editor-current-display-height-px);overflow:hidden;position:relative;pointer-events:none}.imageEditorContainer .anchored-element-overlay>.content-wrapper>.content{position:absolute;left:var(--position-x);top:var(--position-y);transform:scale(var(--scale)) rotate(var(--rotation));transform-origin:left top;margin:0;pointer-events:all}@media print{.imageEditorContainer .loadingMessage{display:none}.imageEditorContainer .imageEditorRenderArea canvas{width:100%;height:initial}}',document.head.appendChild(s)}})();(()=>{if(typeof document<"u"&&typeof document.createElement=="function"){let s=document.createElement("style");s.textContent='.clr-picker{display:none;flex-wrap:wrap;position:absolute;width:200px;z-index:1000;border-radius:10px;background-color:#fff;justify-content:flex-end;direction:ltr;box-shadow:0 0 5px rgba(0, 0, 0, 0.05),0 5px 20px rgba(0, 0, 0, 0.1);-moz-user-select:none;-webkit-user-select:none;user-select:none}.clr-picker.clr-open,.clr-picker[data-inline=true]{display:flex}.clr-picker[data-inline=true]{position:relative}.clr-gradient{position:relative;width:100%;height:100px;margin-bottom:15px;border-radius:3px 3px 0 0;background-image:linear-gradient(rgba(0, 0, 0, 0), #000),linear-gradient(90deg, #fff, currentColor);cursor:pointer}.clr-marker{position:absolute;width:12px;height:12px;margin:-6px 0 0 -6px;border:1px solid #fff;border-radius:50%;background-color:currentColor;cursor:pointer}.clr-picker input[type=range]::-webkit-slider-runnable-track{width:100%;height:16px}.clr-picker input[type=range]::-webkit-slider-thumb{width:16px;height:16px;-webkit-appearance:none}.clr-picker input[type=range]::-moz-range-track{width:100%;height:16px;border:0}.clr-picker input[type=range]::-moz-range-thumb{width:16px;height:16px;border:0}.clr-hue{background-image:linear-gradient(to right, #f00 0%, #ff0 16.66%, #0f0 33.33%, #0ff 50%, #00f 66.66%, #f0f 83.33%, #f00 100%)}.clr-hue,.clr-alpha{position:relative;width:calc(100% - 40px);height:8px;margin:5px 20px;border-radius:4px}.clr-alpha span{display:block;height:100%;width:100%;border-radius:inherit;background-image:linear-gradient(90deg, rgba(0, 0, 0, 0), currentColor)}.clr-hue input,.clr-alpha input{position:absolute;width:calc(100% + 32px);height:16px;left:-16px;top:-4px;margin:0;background-color:transparent;opacity:0;cursor:pointer;appearance:none;-webkit-appearance:none}.clr-hue div,.clr-alpha div{position:absolute;width:16px;height:16px;left:0;top:50%;margin-left:-8px;transform:translateY(-50%);border:2px solid #fff;border-radius:50%;background-color:currentColor;box-shadow:0 0 1px #888;pointer-events:none}.clr-alpha div:before{content:"";position:absolute;height:100%;width:100%;left:0;top:0;border-radius:50%;background-color:currentColor}.clr-format{display:none;order:1;width:calc(100% - 40px);margin:0 20px 20px}.clr-segmented{display:flex;position:relative;width:100%;margin:0;padding:0;border:1px solid #ddd;border-radius:15px;box-sizing:border-box;color:#999;font-size:12px}.clr-segmented input,.clr-segmented legend{position:absolute;width:100%;height:100%;margin:0;padding:0;border:0;left:0;top:0;opacity:0;pointer-events:none}.clr-segmented label{flex-grow:1;margin:0;padding:4px 0;font-size:inherit;font-weight:normal;line-height:initial;text-align:center;cursor:pointer}.clr-segmented label:first-of-type{border-radius:10px 0 0 10px}.clr-segmented label:last-of-type{border-radius:0 10px 10px 0}.clr-segmented input:checked+label{color:#fff;background-color:#666}.clr-swatches{order:2;width:calc(100% - 32px);margin:0 16px}.clr-swatches div{display:flex;flex-wrap:wrap;padding-bottom:12px;justify-content:center}.clr-swatches button{position:relative;width:20px;height:20px;margin:0 4px 6px 4px;padding:0;border:0;border-radius:50%;color:inherit;text-indent:-1000px;white-space:nowrap;overflow:hidden;cursor:pointer}.clr-swatches button:after{content:"";display:block;position:absolute;width:100%;height:100%;left:0;top:0;border-radius:inherit;background-color:currentColor;box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.1)}input.clr-color{order:1;width:calc(100% - 80px);height:32px;margin:15px 20px 20px auto;padding:0 10px;border:1px solid #ddd;border-radius:16px;color:#444;background-color:#fff;font-family:sans-serif;font-size:14px;text-align:center;box-shadow:none}input.clr-color:focus{outline:none;border:1px solid #1e90ff}.clr-close,.clr-clear{display:none;order:2;height:24px;margin:0 20px 20px;padding:0 20px;border:0;border-radius:12px;color:#fff;background-color:#666;font-family:inherit;font-size:12px;font-weight:400;cursor:pointer}.clr-close{display:block;margin:0 20px 20px auto}.clr-preview{position:relative;width:32px;height:32px;margin:15px 0 20px 20px;border-radius:50%;overflow:hidden}.clr-preview:before,.clr-preview:after{content:"";position:absolute;height:100%;width:100%;left:0;top:0;border:1px solid #fff;border-radius:50%}.clr-preview:after{border:0;background-color:currentColor;box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.1)}.clr-preview button{position:absolute;width:100%;height:100%;z-index:1;margin:0;padding:0;border:0;border-radius:50%;outline-offset:-2px;background-color:transparent;text-indent:-9999px;cursor:pointer;overflow:hidden}.clr-marker,.clr-hue div,.clr-alpha div,.clr-color{box-sizing:border-box}.clr-field{display:inline-block;position:relative;color:transparent}.clr-field input{margin:0;direction:ltr}.clr-field.clr-rtl input{text-align:right}.clr-field button{position:absolute;width:30px;height:100%;right:0;top:50%;transform:translateY(-50%);margin:0;padding:0;border:0;color:inherit;text-indent:-1000px;white-space:nowrap;overflow:hidden;pointer-events:none}.clr-field.clr-rtl button{right:auto;left:0}.clr-field button:after{content:"";display:block;position:absolute;width:100%;height:100%;left:0;top:0;border-radius:inherit;background-color:currentColor;box-shadow:inset 0 0 1px rgba(0, 0, 0, 0.5)}.clr-alpha,.clr-alpha div,.clr-swatches button,.clr-preview:before,.clr-field button{background-image:repeating-linear-gradient(45deg, #aaa 25%, transparent 25%, transparent 75%, #aaa 75%, #aaa),repeating-linear-gradient(45deg, #aaa 25%, #fff 25%, #fff 75%, #aaa 75%, #aaa);background-position:0 0,4px 4px;background-size:8px 8px}.clr-marker:focus{outline:none}.clr-keyboard-nav .clr-marker:focus,.clr-keyboard-nav .clr-hue input:focus+div,.clr-keyboard-nav .clr-alpha input:focus+div,.clr-keyboard-nav .clr-segmented input:focus+label{outline:none;box-shadow:0 0 0 2px #1e90ff,0 0 2px 2px #fff}.clr-picker[data-alpha=false] .clr-alpha{display:none}.clr-picker[data-minimal=true]{padding-top:16px}.clr-picker[data-minimal=true] .clr-gradient,.clr-picker[data-minimal=true] .clr-hue,.clr-picker[data-minimal=true] .clr-alpha,.clr-picker[data-minimal=true] .clr-color,.clr-picker[data-minimal=true] .clr-preview{display:none}.clr-dark{background-color:#444}.clr-dark .clr-segmented{border-color:#777}.clr-dark .clr-swatches button:after{box-shadow:inset 0 0 0 1px rgba(255, 255, 255, 0.3)}.clr-dark input.clr-color{color:#fff;border-color:#777;background-color:#555}.clr-dark input.clr-color:focus{border-color:#1e90ff}.clr-dark .clr-preview:after{box-shadow:inset 0 0 0 1px rgba(255, 255, 255, 0.5)}.clr-dark .clr-alpha,.clr-dark .clr-alpha div,.clr-dark .clr-swatches button,.clr-dark .clr-preview:before{background-image:repeating-linear-gradient(45deg, #666 25%, transparent 25%, transparent 75%, #888 75%, #888),repeating-linear-gradient(45deg, #888 25%, #444 25%, #444 75%, #888 75%, #888)}.clr-picker.clr-polaroid{border-radius:6px;box-shadow:0 0 5px rgba(0, 0, 0, 0.1),0 5px 30px rgba(0, 0, 0, 0.2)}.clr-picker.clr-polaroid:before{content:"";display:block;position:absolute;width:16px;height:10px;left:20px;top:-10px;border:solid transparent;border-width:0 8px 10px 8px;border-bottom-color:currentColor;box-sizing:border-box;color:#fff;filter:drop-shadow(0 -4px 3px rgba(0, 0, 0, 0.1));pointer-events:none}.clr-picker.clr-polaroid.clr-dark:before{color:#444}.clr-picker.clr-polaroid.clr-left:before{left:auto;right:20px}.clr-picker.clr-polaroid.clr-top:before{top:auto;bottom:-10px;transform:rotateZ(180deg)}.clr-polaroid .clr-gradient{width:calc(100% - 20px);height:120px;margin:10px;border-radius:3px}.clr-polaroid .clr-hue,.clr-polaroid .clr-alpha{width:calc(100% - 30px);height:10px;margin:6px 15px;border-radius:5px}.clr-polaroid .clr-hue div,.clr-polaroid .clr-alpha div{box-shadow:0 0 5px rgba(0, 0, 0, 0.2)}.clr-polaroid .clr-format{width:calc(100% - 20px);margin:0 10px 15px}.clr-polaroid .clr-swatches{width:calc(100% - 12px);margin:0 6px}.clr-polaroid .clr-swatches div{padding-bottom:10px}.clr-polaroid .clr-swatches button{width:22px;height:22px}.clr-polaroid input.clr-color{width:calc(100% - 60px);margin:10px 10px 15px auto}.clr-polaroid .clr-clear{margin:0 10px 15px 10px}.clr-polaroid .clr-close{margin:0 10px 15px auto}.clr-polaroid .clr-preview{margin:10px 0 15px 10px}.clr-picker.clr-large{width:275px}.clr-large .clr-gradient{height:150px}.clr-large .clr-swatches button{width:22px;height:22px}.clr-picker.clr-pill{width:380px;padding-left:180px;box-sizing:border-box}.clr-pill .clr-gradient{position:absolute;width:180px;height:100%;left:0;top:0;margin-bottom:0;border-radius:3px 0 0 3px}.clr-pill .clr-hue{margin-top:20px}',document.head.appendChild(s)}})();var xn=class s{onDrop(o){}static union(o,e){return new class extends s{apply(r){o.apply(r),e.apply(r)}unapply(r){e.unapply(r),o.unapply(r)}description(r,n){let i=o.description(r,n),a=e.description(r,n);return i===a?i:`${i}, ${a}`}}}static{this.empty=new class extends s{description(o,e){return""}apply(o){}unapply(o){}}}},Ie=xn;var wn=class{constructor(o,e,r){this.x=o;this.y=e;this.z=r}get xy(){return{x:this.x,y:this.y}}at(o){if(o===0)return this.x;if(o===1)return this.y;if(o===2)return this.z;throw new Error(`${o} out of bounds!`)}length(){return this.magnitude()}magnitude(){return Math.sqrt(this.magnitudeSquared())}magnitudeSquared(){return this.x*this.x+this.y*this.y+this.z*this.z}squareDistanceTo(o){let e=this.x-o.x,r=this.y-o.y,n=this.z-o.z;return e*e+r*r+n*n}distanceTo(o){return Math.sqrt(this.squareDistanceTo(o))}maximumEntryMagnitude(){return Math.max(Math.abs(this.x),Math.max(Math.abs(this.y),Math.abs(this.z)))}angle(){return Math.atan2(this.y,this.x)}normalized(){let o=this.magnitude();return F.of(this.x/o,this.y/o,this.z/o)}normalizedOrZero(){return this.eq(F.zero)?F.zero:this.normalized()}times(o){return F.of(this.x*o,this.y*o,this.z*o)}plus(o){return F.of(this.x+o.x,this.y+o.y,this.z+o.z)}minus(o){return F.of(this.x-o.x,this.y-o.y,this.z-o.z)}dot(o){return this.x*o.x+this.y*o.y+this.z*o.z}cross(o){return F.of(this.y*o.z-o.y*this.z,o.x*this.z-this.x*o.z,this.x*o.y-o.x*this.y)}scale(o){return typeof o=="number"?this.times(o):F.of(this.x*o.x,this.y*o.y,this.z*o.z)}orthog(){return this.dot(F.unitX)===0&&this.dot(F.unitY)===0?this.dot(F.unitX)===0?F.unitX:this.cross(F.unitX).normalized():this.cross(F.unitZ.times(-1)).normalized()}extend(o,e){return this.plus(e.normalized().times(o))}lerp(o,e){return this.times(1-e).plus(o.times(e))}zip(o,e){return F.of(e(o.x,this.x),e(o.y,this.y),e(o.z,this.z))}map(o){return F.of(o(this.x,0),o(this.y,1),o(this.z,2))}asArray(){return[this.x,this.y,this.z]}eq(o,e=1e-10){return Math.abs(o.x-this.x)<=e&&Math.abs(o.y-this.y)<=e&&Math.abs(o.z-this.z)<=e}toString(){return`Vec(${this.x}, ${this.y}, ${this.z})`}},Cn=class{constructor(o,e){this.x=o;this.y=e}get z(){return 0}get xy(){return{x:this.x,y:this.y}}at(o){if(o===0)return this.x;if(o===1)return this.y;if(o===2)return 0;throw new Error(`${o} out of bounds!`)}length(){return this.magnitude()}magnitude(){return Math.sqrt(this.x*this.x+this.y*this.y)}magnitudeSquared(){return this.x*this.x+this.y*this.y}squareDistanceTo(o){let e=this.x-o.x,r=this.y-o.y;return e*e+r*r+o.z*o.z}distanceTo(o){return Math.sqrt(this.squareDistanceTo(o))}maximumEntryMagnitude(){return Math.max(Math.abs(this.x),Math.abs(this.y))}angle(){return Math.atan2(this.y,this.x)}normalized(){let o=this.magnitude();return w.of(this.x/o,this.y/o)}normalizedOrZero(){return this.eq(F.zero)?F.zero:this.normalized()}times(o){return w.of(this.x*o,this.y*o)}plus(o){return F.of(this.x+o.x,this.y+o.y,o.z)}minus(o){return F.of(this.x-o.x,this.y-o.y,-o.z)}dot(o){return this.x*o.x+this.y*o.y}cross(o){return F.of(this.y*o.z,-this.x*o.z,this.x*o.y-o.x*this.y)}scale(o){return typeof o=="number"?this.times(o):w.of(this.x*o.x,this.y*o.y)}orthog(){return this.dot(F.unitX)===0&&this.dot(F.unitY)===0?this.dot(F.unitX)===0?F.unitX:this.cross(F.unitX).normalized():this.cross(F.unitZ.times(-1)).normalized()}extend(o,e){return this.plus(e.normalized().times(o))}lerp(o,e){return this.times(1-e).plus(o.times(e))}zip(o,e){return F.of(e(o.x,this.x),e(o.y,this.y),e(o.z,0))}map(o){return F.of(o(this.x,0),o(this.y,1),o(0,2))}asArray(){return[this.x,this.y,0]}eq(o,e=1e-10){return Math.abs(o.x-this.x)<=e&&Math.abs(o.y-this.y)<=e&&Math.abs(o.z)<=e}toString(){return`Vec(${this.x}, ${this.y})`}},w;(i=>(i.of=(a,l)=>new Cn(a,l),i.ofXY=({x:a,y:l})=>i.of(a,l),i.unitX=i.of(1,0),i.unitY=i.of(0,1),i.zero=i.of(0,0)))(w||={});var F;(i=>(i.of=(a,l,c)=>c===0?w.of(a,l):new wn(a,l,c),i.unitX=w.unitX,i.unitY=w.unitY,i.zero=w.zero,i.unitZ=i.of(0,0,1)))(F||={});var Pe=F;var k=class s{constructor(o,e,r,n,i,a,l,c,d){this.a1=o;this.a2=e;this.a3=r;this.b1=n;this.b2=i;this.b3=a;this.c1=l;this.c2=c;this.c3=d;this.cachedInverse=void 0;this.rows=[Pe.of(o,e,r),Pe.of(n,i,a),Pe.of(l,c,d)]}static ofRows(o,e,r){return new s(o.x,o.y,o.z,e.x,e.y,e.z,r.x,r.y,r.z)}static{this.identity=new s(1,0,0,0,1,0,0,0,1)}inverse(){return this.computeInverse()??s.identity}invertable(){return this.computeInverse()!==null}computeInverse(){if(this.cachedInverse!==void 0)return this.cachedInverse;let o=[this.rows[0],this.rows[1],this.rows[2]],e=[Pe.unitX,Pe.unitY,Pe.unitZ];for(let n=0;n<3;n++){let i=o[n].at(n),a=1e-10;if(Math.abs(i)<a){let u=-1;for(let m=1;m<=2;m++){let g=(n+m)%3;if(Math.abs(o[g].at(n))>=a){u=g;break}}if(u===-1)return this.cachedInverse=null,null;let p=o[n],h=e[n];o[n]=o[u],e[n]=e[u],o[u]=p,e[u]=h,i=o[n].at(n)}let l=1/i;o[n]=o[n].times(l),e[n]=e[n].times(l);let c=o[n],d=e[n];for(let u=1;u<=2;u++){let p=(n+u)%3;l=-o[p].at(n),o[p]=o[p].plus(c.times(l)),e[p]=e[p].plus(d.times(l))}}let r=s.ofRows(e[0],e[1],e[2]);return this.cachedInverse=r,r}transposed(){return new s(this.a1,this.b1,this.c1,this.a2,this.b2,this.c2,this.a3,this.b3,this.c3)}rightMul(o){o=o.transposed();let e=(r,n)=>this.rows[r].dot(o.rows[n]);return new s(e(0,0),e(0,1),e(0,2),e(1,0),e(1,1),e(1,2),e(2,0),e(2,1),e(2,2))}transformVec2(o){let e=Pe.of(o.x,o.y,1);return e=this.transformVec3(e),w.of(e.x,e.y)}transformVec3(o){return Pe.of(this.rows[0].dot(o),this.rows[1].dot(o),this.rows[2].dot(o))}isIdentity(){return this===s.identity?!0:this.eq(s.identity)}eq(o,e=0){for(let r=0;r<3;r++)if(!this.rows[r].eq(o.rows[r],e))return!1;return!0}toString(){let o="",e=[0,0,0];for(let r of this.rows)for(let n=0;n<3;n++)e[n]=Math.max(e[0],`${r.at(n)}`.length);for(let r=0;r<3;r++){r===0?o+="\u23A1 ":r===1?o+="\u23A2 ":o+="\u23A3 ";for(let n=0;n<3;n++){let i=this.rows[r].at(n).toString(),a="";for(let l=i.length;l<e[n];l++)a+=" ";o+=i+", "+a}r===0?o+=" \u23A4":r===1?o+=" \u23A5":o+=" \u23A6",o+=`
2
+ `}return o.trimEnd()}toArray(){return[this.a1,this.a2,this.a3,this.b1,this.b2,this.b3,this.c1,this.c2,this.c3]}mapEntries(o){return new s(o(this.a1,[0,0]),o(this.a2,[0,1]),o(this.a3,[0,2]),o(this.b1,[1,0]),o(this.b2,[1,1]),o(this.b3,[1,2]),o(this.c1,[2,0]),o(this.c2,[2,1]),o(this.c3,[2,2]))}getScaleFactor(){return Math.hypot(this.a1,this.a2)}getColumn(o){return Pe.of(this.rows[0].at(o),this.rows[1].at(o),this.rows[2].at(o))}maximumEntryMagnitude(){let o=Math.abs(this.a1);for(let e of this.toArray())o=Math.max(o,Math.abs(e));return o}static translation(o){return new s(1,0,o.x,0,1,o.y,0,0,1)}static zRotation(o,e=w.zero){if(o===0)return s.identity;let r=Math.cos(o),n=Math.sin(o),i=s.translation(e);return i=i.rightMul(new s(r,-n,0,n,r,0,0,0,1)),i.rightMul(s.translation(e.times(-1)))}static scaling2D(o,e=w.zero){let r=s.translation(e),n,i;return typeof o=="number"?(n=o,i=o):(n=o.x,i=o.y),r=r.rightMul(new s(n,0,0,0,i,0,0,0,1)),r.rightMul(s.translation(e.times(-1)))}toCSSMatrix(){return`matrix(${this.a1},${this.b1},${this.a2},${this.b2},${this.a3},${this.b3})`}static fromCSSMatrix(o){if(o===""||o==="none")return s.identity;o=o.trim().replace(/\s+/g," ");let e=l=>l.split(/[, \t\n]+/g).map(d=>{if(d.trim()==="")return null;let u=!1;if(d.endsWith("%")&&(u=!0,d=d.substring(0,d.length-1)),d=d.replace(/px$/gi,""),!/^[-]?\d*(?:\.\d*)?(?:[eE][-+]?\d+)?$/i.exec(d))throw new Error(`All arguments to transform functions must be numeric (state: ${JSON.stringify({currentArgument:d,allArguments:l})})`);let h=parseFloat(d);return u&&(h/=100),h}).filter(d=>d!==null),r={matrix:l=>{if(l.length!==6)throw new Error(`Invalid matrix argument: ${l}. Must have length 6`);let c=l[0],d=l[1],u=l[2],p=l[3],h=l[4],m=l[5];return new s(c,u,h,d,p,m,0,0,1)},scale:l=>{let c,d;if(l.length===1)c=l[0],d=l[0];else if(l.length===2)c=l[0],d=l[1];else throw new Error(`The scale() function only supports two arguments. Given: ${l}`);return s.scaling2D(w.of(c,d))},translate:l=>{let c=0,d=0;if(l.length===1)c=l[0];else if(l.length===2)c=l[0],d=l[1];else throw new Error(`The translate() function requires either 1 or 2 arguments. Given ${l}`);return s.translation(w.of(c,d))}},n=/(?:^|\W)(\w+)\s?\(([^)]*)\)/gi,i,a=null;for(;(i=n.exec(o))!==null;){let l=i[1].toLowerCase();if(!(l in r))throw new Error(`Unsupported CSS transform action: ${l}`);let c=e(i[2]),d=r[l](c);a?a=a.rightMul(d):a=d}return a??s.identity}},Di=k;var yo=class s{static{this.smallValue=1e-12}distance(o){return Math.abs(this.signedDistance(o))}containsPoint(o,e=s.smallValue){return this.signedDistance(o)<e}getLooseBoundingBox(){return this.getTightBoundingBox()}},ur=yo;var I=class s extends ur{constructor(e,r,n,i){super();this.x=e;this.y=r;this.w=n;this.h=i;n<0&&(this.x+=n,this.w=Math.abs(n)),i<0&&(this.y+=i,this.h=Math.abs(i)),this.topLeft=w.of(this.x,this.y),this.size=w.of(this.w,this.h),this.area=this.w*this.h}translatedBy(e){return new s(e.x+this.x,e.y+this.y,this.w,this.h)}resizedTo(e){return new s(this.x,this.y,e.x,e.y)}containsPoint(e){return this.x<=e.x&&this.y<=e.y&&this.x+this.w>=e.x&&this.y+this.h>=e.y}containsRect(e){return this.x<=e.x&&this.y<=e.y&&this.x+this.w>=e.x+e.w&&this.y+this.h>=e.y+e.h}intersects(e){let r=this.x,n=r+this.w,i=e.x,a=e.x+e.w;if(n<i||r>a)return!1;let l=this.y,c=l+this.h,d=e.y,u=e.y+e.h;return!(c<d||l>u)}intersection(e){if(!this.intersects(e))return null;let r=this.topLeft.zip(e.topLeft,Math.max),n=this.bottomRight.zip(e.bottomRight,Math.min);return s.fromCorners(r,n)}union(e){return s.union(this,e)}divideIntoGrid(e,r){let n=[];if(e<=0||r<=0)return n;let i=this.w/e,a=this.h/r;i===0&&(e=1),a===0&&(r=1);for(let l=0;l<r;l++)for(let c=0;c<e;c++){let d=i*c+this.x,u=a*l+this.y;n.push(new s(d,u,i,a))}return n}grownToPoint(e,r=0){let n=new s(e.x-r,e.y-r,r*2,r*2);return this.union(n)}grownBy(e){if(e===0)return this;if(e<0){let r=-Math.min(-e,this.w/2),n=-Math.min(-e,this.h/2);return new s(this.x-r,this.y-n,this.w+r*2,this.h+n*2)}return new s(this.x-e,this.y-e,this.w+e*2,this.h+e*2)}grownToSize(e){if(this.width>=e.x&&this.height>=e.y)return this;let r=Math.max(0,e.x-this.width),n=Math.max(0,e.y-this.height);return new s(this.x-r/2,this.y-n/2,this.width+r,this.height+n)}getClosestPointOnBoundaryTo(e){let r=this.getEdges().map(a=>a.closestPointTo(e)),n=null,i=null;for(let a of r){let l=a.distanceTo(e);(i===null||l<i)&&(n=a,i=l)}return n}isWithinRadiusOf(e,r){if(this.maxDimension>e)return!1;let n=e*e;return this.corners.every(i=>i.minus(r).magnitudeSquared()<n)}get corners(){return[this.bottomRight,this.topRight,this.topLeft,this.bottomLeft]}get maxDimension(){return Math.max(this.w,this.h)}get minDimension(){return Math.min(this.w,this.h)}get bottomRight(){return this.topLeft.plus(this.size)}get topRight(){return this.bottomRight.plus(w.of(0,-this.h))}get bottomLeft(){return this.topLeft.plus(w.of(0,this.h))}get width(){return this.w}get height(){return this.h}get center(){return w.of(this.x+this.w/2,this.y+this.h/2)}getEdges(){let e=this.corners;return[new Be(e[0],e[1]),new Be(e[1],e[2]),new Be(e[2],e[3]),new Be(e[3],e[0])]}intersectsLineSegment(e){let r=[];for(let n of this.getEdges())n.intersectsLineSegment(e).forEach(a=>r.push(a));return r}signedDistance(e){let r=this.getClosestPointOnBoundaryTo(e),n=e.minus(r).magnitude();return this.containsPoint(e)?-n:n}getTightBoundingBox(){return this}transformedBoundingBox(e){return e===Di.identity?this:s.bboxOf(this.corners.map(r=>e.transformVec2(r)))}eq(e,r=0){return this.topLeft.eq(e.topLeft,r)&&this.size.eq(e.size,r)}toString(){return`Rect(point(${this.x}, ${this.y}), size(${this.w}, ${this.h}))`}static fromCorners(e,r){return new s(Math.min(e.x,r.x),Math.min(e.y,r.y),Math.abs(e.x-r.x),Math.abs(e.y-r.y))}static bboxOf(e,r=0){let n=0,i=0,a=0,l=0,c=!0;for(let d of e)c&&(n=d.x,i=d.y,a=d.x,l=d.y,c=!1),n=Math.min(n,d.x),i=Math.min(i,d.y),a=Math.max(a,d.x),l=Math.max(l,d.y);return s.fromCorners(w.of(n-r,i-r),w.of(a+r,l+r))}static union(...e){if(e.length===0)return s.empty;let r=e[0],n=r.x,i=r.y,a=r.x+r.w,l=r.y+r.h;for(let c=1;c<e.length;c++){let d=e[c];n=Math.min(n,d.x),i=Math.min(i,d.y),a=Math.max(a,d.x+d.w),l=Math.max(l,d.y+d.h)}return new s(n,i,a-n,l-i)}static of(e){let r=e.width??e.w??0,n=e.height??e.h??0;return new s(e.x,e.y,r,n)}static{this.empty=new s(0,0,0,0)}static{this.unitSquare=new s(0,0,1,1)}},he=I;var xo=class extends ur{intersectsLineSegment(o){return this.argIntersectsLineSegment(o).map(e=>this.at(e))}},Xt=xo;var ue=class s extends Xt{constructor(e,r){super();this.point1=e;this.point2=r;this.bbox=he.bboxOf([e,r]),this.direction=r.minus(e),this.length=this.direction.magnitude(),this.length>0&&(this.direction=this.direction.times(1/this.length))}static ofSmallestContainingPoints(e){if(e.length<=1)return null;let r=[...e].sort((i,a)=>i.x!==a.x?i.x-a.x:i.y-a.y),n=new s(r[0],r[r.length-1]);for(let i of r)if(!n.containsPoint(i))return null;return n}get p1(){return this.point1}get p2(){return this.point2}get center(){return this.point1.lerp(this.point2,.5)}get(e){return this.point1.plus(this.direction.times(e))}at(e){return this.get(e*this.length)}normalAt(e){return this.direction.orthog()}tangentAt(e){return this.direction}splitAt(e){return e<=0||e>=1?[this]:[new s(this.point1,this.at(e)),new s(this.at(e),this.point2)]}intersection(e){let r,n;if(Math.abs(this.direction.x)<4e-13){if(e.direction.x===0||this.direction.y===0)return null;let u=this.point1.x,p=(this.point1.x-e.point1.x)*e.direction.y/e.direction.x+e.point1.y;r=w.of(u,p),n=(p-this.point1.y)/this.direction.y}else{let u=(this.point1.y-e.point1.y)*this.direction.x*e.direction.x+this.direction.x*e.direction.y*e.point1.x-this.direction.y*e.direction.x*this.point1.x,p=e.direction.y*this.direction.x-this.direction.y*e.direction.x;if(p===0)return null;let h=u/p,m=(h-this.point1.x)/this.direction.x,g=this.point1.y+this.direction.y*m;r=w.of(h,g),n=(h-this.point1.x)/this.direction.x}let a=r.distanceTo(this.point1),l=r.distanceTo(this.point2),c=r.distanceTo(e.point1),d=r.distanceTo(e.point2);return a>this.length||l>this.length||c>e.length||d>e.length?null:{point:r,t:n}}intersects(e){return this.intersection(e)!==null}argIntersectsLineSegment(e){let r=this.intersection(e);return r?[r.t/this.length]:[]}intersectsLineSegment(e){let r=this.intersection(e);return r?[r.point]:[]}closestPointTo(e){return this.nearestPointTo(e).point}nearestPointTo(e){let r=e.minus(this.p1).dot(this.direction),n=this.length-r,i=this.p1.plus(this.direction.times(r));return r>0&&r<this.length?{point:i,parameterValue:r/this.length}:Math.abs(n)<Math.abs(r)?{point:this.p2,parameterValue:1}:{point:this.p1,parameterValue:0}}signedDistance(e){return this.closestPointTo(e).minus(e).magnitude()}transformedBy(e){return new s(e.transformVec2(this.p1),e.transformVec2(this.p2))}getTightBoundingBox(){return this.bbox}toString(){return`LineSegment(${this.p1.toString()}, ${this.p2.toString()})`}eq(e,r){if(!(e instanceof s))return!1;let n=r?.tolerance,i=r?.ignoreDirection??!0;return e.p1.eq(this.p1,n)&&e.p2.eq(this.p2,n)||i&&e.p1.eq(this.p2,n)&&e.p2.eq(this.p1,n)}},Be=ue;var{abs:wo,cos:Ze,sin:Qt,acos:ma,atan2:Co,sqrt:ct,pow:Me}=Math;function To(s){return s<0?-Me(-s,1/3):Me(s,1/3)}var Ai=Math.PI,pr=2*Ai,dt=Ai/2,fa=1e-6,Tn=Number.MAX_SAFE_INTEGER||9007199254740991,Sn=Number.MIN_SAFE_INTEGER||-9007199254740991,ga={x:0,y:0,z:0},B={Tvalues:[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Cvalues:[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],arcfn:function(s,o){let e=o(s),r=e.x*e.x+e.y*e.y;return typeof e.z<"u"&&(r+=e.z*e.z),ct(r)},compute:function(s,o,e){if(s===0)return o[0].t=0,o[0];let r=o.length-1;if(s===1)return o[r].t=1,o[r];let n=1-s,i=o;if(r===0)return o[0].t=s,o[0];if(r===1){let l={x:n*i[0].x+s*i[1].x,y:n*i[0].y+s*i[1].y,t:s};return e&&(l.z=n*i[0].z+s*i[1].z),l}if(r<4){let l=n*n,c=s*s,d,u,p,h=0;r===2?(i=[i[0],i[1],i[2],ga],d=l,u=n*s*2,p=c):r===3&&(d=l*n,u=l*s*3,p=n*c*3,h=s*c);let m={x:d*i[0].x+u*i[1].x+p*i[2].x+h*i[3].x,y:d*i[0].y+u*i[1].y+p*i[2].y+h*i[3].y,t:s};return e&&(m.z=d*i[0].z+u*i[1].z+p*i[2].z+h*i[3].z),m}let a=JSON.parse(JSON.stringify(o));for(;a.length>1;){for(let l=0;l<a.length-1;l++)a[l]={x:a[l].x+(a[l+1].x-a[l].x)*s,y:a[l].y+(a[l+1].y-a[l].y)*s},typeof a[l].z<"u"&&(a[l]=a[l].z+(a[l+1].z-a[l].z)*s);a.splice(a.length-1,1)}return a[0].t=s,a[0]},computeWithRatios:function(s,o,e,r){let n=1-s,i=e,a=o,l=i[0],c=i[1],d=i[2],u=i[3],p;if(l*=n,c*=s,a.length===2)return p=l+c,{x:(l*a[0].x+c*a[1].x)/p,y:(l*a[0].y+c*a[1].y)/p,z:r?(l*a[0].z+c*a[1].z)/p:!1,t:s};if(l*=n,c*=2*n,d*=s*s,a.length===3)return p=l+c+d,{x:(l*a[0].x+c*a[1].x+d*a[2].x)/p,y:(l*a[0].y+c*a[1].y+d*a[2].y)/p,z:r?(l*a[0].z+c*a[1].z+d*a[2].z)/p:!1,t:s};if(l*=n,c*=1.5*n,d*=3*n,u*=s*s*s,a.length===4)return p=l+c+d+u,{x:(l*a[0].x+c*a[1].x+d*a[2].x+u*a[3].x)/p,y:(l*a[0].y+c*a[1].y+d*a[2].y+u*a[3].y)/p,z:r?(l*a[0].z+c*a[1].z+d*a[2].z+u*a[3].z)/p:!1,t:s}},derive:function(s,o){let e=[];for(let r=s,n=r.length,i=n-1;n>1;n--,i--){let a=[];for(let l=0,c;l<i;l++)c={x:i*(r[l+1].x-r[l].x),y:i*(r[l+1].y-r[l].y)},o&&(c.z=i*(r[l+1].z-r[l].z)),a.push(c);e.push(a),r=a}return e},between:function(s,o,e){return o<=s&&s<=e||B.approximately(s,o)||B.approximately(s,e)},approximately:function(s,o,e){return wo(s-o)<=(e||fa)},length:function(s){let e=B.Tvalues.length,r=0;for(let n=0,i;n<e;n++)i=.5*B.Tvalues[n]+.5,r+=B.Cvalues[n]*B.arcfn(i,s);return .5*r},map:function(s,o,e,r,n){let i=e-o,a=n-r,l=s-o,c=l/i;return r+a*c},lerp:function(s,o,e){let r={x:o.x+s*(e.x-o.x),y:o.y+s*(e.y-o.y)};return o.z!==void 0&&e.z!==void 0&&(r.z=o.z+s*(e.z-o.z)),r},pointToString:function(s){let o=s.x+"/"+s.y;return typeof s.z<"u"&&(o+="/"+s.z),o},pointsToString:function(s){return"["+s.map(B.pointToString).join(", ")+"]"},copy:function(s){return JSON.parse(JSON.stringify(s))},angle:function(s,o,e){let r=o.x-s.x,n=o.y-s.y,i=e.x-s.x,a=e.y-s.y,l=r*a-n*i,c=r*i+n*a;return Co(l,c)},round:function(s,o){let e=""+s,r=e.indexOf(".");return parseFloat(e.substring(0,r+1+o))},dist:function(s,o){let e=s.x-o.x,r=s.y-o.y;return ct(e*e+r*r)},closest:function(s,o){let e=Me(2,63),r,n;return s.forEach(function(i,a){n=B.dist(o,i),n<e&&(e=n,r=a)}),{mdist:e,mpos:r}},abcratio:function(s,o){if(o!==2&&o!==3)return!1;if(typeof s>"u")s=.5;else if(s===0||s===1)return s;let e=Me(s,o)+Me(1-s,o),r=e-1;return wo(r/e)},projectionratio:function(s,o){if(o!==2&&o!==3)return!1;if(typeof s>"u")s=.5;else if(s===0||s===1)return s;let e=Me(1-s,o),r=Me(s,o)+e;return e/r},lli8:function(s,o,e,r,n,i,a,l){let c=(s*r-o*e)*(n-a)-(s-e)*(n*l-i*a),d=(s*r-o*e)*(i-l)-(o-r)*(n*l-i*a),u=(s-e)*(i-l)-(o-r)*(n-a);return u==0?!1:{x:c/u,y:d/u}},lli4:function(s,o,e,r){let n=s.x,i=s.y,a=o.x,l=o.y,c=e.x,d=e.y,u=r.x,p=r.y;return B.lli8(n,i,a,l,c,d,u,p)},lli:function(s,o){return B.lli4(s,s.c,o,o.c)},makeline:function(s,o){return new Jt(s.x,s.y,(s.x+o.x)/2,(s.y+o.y)/2,o.x,o.y)},findbbox:function(s){let o=Tn,e=Tn,r=Sn,n=Sn;return s.forEach(function(i){let a=i.bbox();o>a.x.min&&(o=a.x.min),e>a.y.min&&(e=a.y.min),r<a.x.max&&(r=a.x.max),n<a.y.max&&(n=a.y.max)}),{x:{min:o,mid:(o+r)/2,max:r,size:r-o},y:{min:e,mid:(e+n)/2,max:n,size:n-e}}},shapeintersections:function(s,o,e,r,n){if(!B.bboxoverlap(o,r))return[];let i=[],a=[s.startcap,s.forward,s.back,s.endcap],l=[e.startcap,e.forward,e.back,e.endcap];return a.forEach(function(c){c.virtual||l.forEach(function(d){if(d.virtual)return;let u=c.intersects(d,n);u.length>0&&(u.c1=c,u.c2=d,u.s1=s,u.s2=e,i.push(u))})}),i},makeshape:function(s,o,e){let r=o.points.length,n=s.points.length,i=B.makeline(o.points[r-1],s.points[0]),a=B.makeline(s.points[n-1],o.points[0]),l={startcap:i,forward:s,back:o,endcap:a,bbox:B.findbbox([i,s,o,a])};return l.intersections=function(c){return B.shapeintersections(l,l.bbox,c,c.bbox,e)},l},getminmax:function(s,o,e){if(!e)return{min:0,max:0};let r=Tn,n=Sn,i,a;e.indexOf(0)===-1&&(e=[0].concat(e)),e.indexOf(1)===-1&&e.push(1);for(let l=0,c=e.length;l<c;l++)i=e[l],a=s.get(i),a[o]<r&&(r=a[o]),a[o]>n&&(n=a[o]);return{min:r,mid:(r+n)/2,max:n,size:n-r}},align:function(s,o){let e=o.p1.x,r=o.p1.y,n=-Co(o.p2.y-r,o.p2.x-e),i=function(a){return{x:(a.x-e)*Ze(n)-(a.y-r)*Qt(n),y:(a.x-e)*Qt(n)+(a.y-r)*Ze(n)}};return s.map(i)},roots:function(s,o){o=o||{p1:{x:0,y:0},p2:{x:1,y:0}};let e=s.length-1,r=B.align(s,o),n=function(C){return 0<=C&&C<=1};if(e===2){let C=r[0].y,V=r[1].y,O=r[2].y,G=C-2*V+O;if(G!==0){let se=-ct(V*V-C*O),oe=-C+V,fe=-(se+oe)/G,Se=-(-se+oe)/G;return[fe,Se].filter(n)}else if(V!==O&&G===0)return[(2*V-O)/(2*V-2*O)].filter(n);return[]}let i=r[0].y,a=r[1].y,l=r[2].y,c=r[3].y,d=-i+3*a-3*l+c,u=3*i-6*a+3*l,p=-3*i+3*a,h=i;if(B.approximately(d,0)){if(B.approximately(u,0))return B.approximately(p,0)?[]:[-h/p].filter(n);let C=ct(p*p-4*u*h),V=2*u;return[(C-p)/V,(-p-C)/V].filter(n)}u/=d,p/=d,h/=d;let m=(3*p-u*u)/3,g=m/3,v=(2*u*u*u-9*u*p+27*h)/27,b=v/2,y=b*b+g*g*g,f,T,P,S,E;if(y<0){let C=-m/3,V=C*C*C,O=ct(V),G=-v/(2*O),se=G<-1?-1:G>1?1:G,oe=ma(se),fe=To(O),Se=2*fe;return P=Se*Ze(oe/3)-u/3,S=Se*Ze((oe+pr)/3)-u/3,E=Se*Ze((oe+2*pr)/3)-u/3,[P,S,E].filter(n)}else{if(y===0)return f=b<0?To(-b):-To(b),P=2*f-u/3,S=-f-u/3,[P,S].filter(n);{let C=ct(y);return f=To(-b+C),T=To(b+C),[f-T-u/3].filter(n)}}},droots:function(s){if(s.length===3){let o=s[0],e=s[1],r=s[2],n=o-2*e+r;if(n!==0){let i=-ct(e*e-o*r),a=-o+e,l=-(i+a)/n,c=-(-i+a)/n;return[l,c]}else if(e!==r&&n===0)return[(2*e-r)/(2*(e-r))];return[]}if(s.length===2){let o=s[0],e=s[1];return o!==e?[o/(o-e)]:[]}return[]},curvature:function(s,o,e,r,n){let i,a,l,c,d=0,u=0,p=B.compute(s,o),h=B.compute(s,e),m=p.x*p.x+p.y*p.y;if(r?(i=ct(Me(p.y*h.z-h.y*p.z,2)+Me(p.z*h.x-h.z*p.x,2)+Me(p.x*h.y-h.x*p.y,2)),a=Me(m+p.z*p.z,3/2)):(i=p.x*h.y-p.y*h.x,a=Me(m,3/2)),i===0||a===0)return{k:0,r:0};if(d=i/a,u=a/i,!n){let g=B.curvature(s-.001,o,e,r,!0).k,v=B.curvature(s+.001,o,e,r,!0).k;c=(v-d+(d-g))/2,l=(wo(v-d)+wo(d-g))/2}return{k:d,r:u,dk:c,adk:l}},inflections:function(s){if(s.length<4)return[];let o=B.align(s,{p1:s[0],p2:s.slice(-1)[0]}),e=o[2].x*o[1].y,r=o[3].x*o[1].y,n=o[1].x*o[2].y,i=o[3].x*o[2].y,a=18*(-3*e+2*r+3*n-i),l=18*(3*e-r-3*n),c=18*(n-e);if(B.approximately(a,0)){if(!B.approximately(l,0)){let h=-c/l;if(0<=h&&h<=1)return[h]}return[]}let d=2*a;if(B.approximately(d,0))return[];let u=l*l-4*a*c;if(u<0)return[];let p=Math.sqrt(u);return[(p-l)/d,-(l+p)/d].filter(function(h){return 0<=h&&h<=1})},bboxoverlap:function(s,o){let e=["x","y"],r=e.length;for(let n=0,i,a,l,c;n<r;n++)if(i=e[n],a=s[i].mid,l=o[i].mid,c=(s[i].size+o[i].size)/2,wo(a-l)>=c)return!1;return!0},expandbox:function(s,o){o.x.min<s.x.min&&(s.x.min=o.x.min),o.y.min<s.y.min&&(s.y.min=o.y.min),o.z&&o.z.min<s.z.min&&(s.z.min=o.z.min),o.x.max>s.x.max&&(s.x.max=o.x.max),o.y.max>s.y.max&&(s.y.max=o.y.max),o.z&&o.z.max>s.z.max&&(s.z.max=o.z.max),s.x.mid=(s.x.min+s.x.max)/2,s.y.mid=(s.y.min+s.y.max)/2,s.z&&(s.z.mid=(s.z.min+s.z.max)/2),s.x.size=s.x.max-s.x.min,s.y.size=s.y.max-s.y.min,s.z&&(s.z.size=s.z.max-s.z.min)},pairiteration:function(s,o,e){let r=s.bbox(),n=o.bbox(),i=1e5,a=e||.5;if(r.x.size+r.y.size<a&&n.x.size+n.y.size<a)return[(i*(s._t1+s._t2)/2|0)/i+"/"+(i*(o._t1+o._t2)/2|0)/i];let l=s.split(.5),c=o.split(.5),d=[{left:l.left,right:c.left},{left:l.left,right:c.right},{left:l.right,right:c.right},{left:l.right,right:c.left}];d=d.filter(function(p){return B.bboxoverlap(p.left.bbox(),p.right.bbox())});let u=[];return d.length===0||(d.forEach(function(p){u=u.concat(B.pairiteration(p.left,p.right,a))}),u=u.filter(function(p,h){return u.indexOf(p)===h})),u},getccenter:function(s,o,e){let r=o.x-s.x,n=o.y-s.y,i=e.x-o.x,a=e.y-o.y,l=r*Ze(dt)-n*Qt(dt),c=r*Qt(dt)+n*Ze(dt),d=i*Ze(dt)-a*Qt(dt),u=i*Qt(dt)+a*Ze(dt),p=(s.x+o.x)/2,h=(s.y+o.y)/2,m=(o.x+e.x)/2,g=(o.y+e.y)/2,v=p+l,b=h+c,y=m+d,f=g+u,T=B.lli8(p,h,v,b,m,g,y,f),P=B.dist(T,s),S=Co(s.y-T.y,s.x-T.x),E=Co(o.y-T.y,o.x-T.x),C=Co(e.y-T.y,e.x-T.x),V;return S<C?((S>E||E>C)&&(S+=pr),S>C&&(V=C,C=S,S=V)):C<E&&E<S?(V=C,C=S,S=V):C+=pr,T.s=S,T.e=C,T.r=P,T},numberSort:function(s,o){return s-o}};var eo=class s{constructor(o){this.curves=[],this._3d=!1,o&&(this.curves=o,this._3d=this.curves[0]._3d)}valueOf(){return this.toString()}toString(){return"["+this.curves.map(function(o){return B.pointsToString(o.points)}).join(", ")+"]"}addCurve(o){this.curves.push(o),this._3d=this._3d||o._3d}length(){return this.curves.map(function(o){return o.length()}).reduce(function(o,e){return o+e})}curve(o){return this.curves[o]}bbox(){let o=this.curves;for(var e=o[0].bbox(),r=1;r<o.length;r++)B.expandbox(e,o[r].bbox());return e}offset(o){let e=[];return this.curves.forEach(function(r){e.push(...r.offset(o))}),new s(e)}};var{abs:So,min:Vi,max:Oi,cos:ba,sin:va,acos:ya,sqrt:Po}=Math,xa=Math.PI;var Jt=class s{constructor(o){let e=o&&o.forEach?o:Array.from(arguments).slice(),r=!1;if(typeof e[0]=="object"){r=e.length;let m=[];e.forEach(function(g){["x","y","z"].forEach(function(v){typeof g[v]<"u"&&m.push(g[v])})}),e=m}let n=!1,i=e.length;if(r){if(r>4){if(arguments.length!==1)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");n=!0}}else if(i!==6&&i!==8&&i!==9&&i!==12&&arguments.length!==1)throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");let a=this._3d=!n&&(i===9||i===12)||o&&o[0]&&typeof o[0].z<"u",l=this.points=[];for(let m=0,g=a?3:2;m<i;m+=g){var c={x:e[m],y:e[m+1]};a&&(c.z=e[m+2]),l.push(c)}let d=this.order=l.length-1,u=this.dims=["x","y"];a&&u.push("z"),this.dimlen=u.length;let p=B.align(l,{p1:l[0],p2:l[d]}),h=B.dist(l[0],l[d]);this._linear=p.reduce((m,g)=>m+So(g.y),0)<h/50,this._lut=[],this._t1=0,this._t2=1,this.update()}static quadraticFromPoints(o,e,r,n){if(typeof n>"u"&&(n=.5),n===0)return new s(e,e,r);if(n===1)return new s(o,e,e);let i=s.getABC(2,o,e,r,n);return new s(o,i.A,r)}static cubicFromPoints(o,e,r,n,i){typeof n>"u"&&(n=.5);let a=s.getABC(3,o,e,r,n);typeof i>"u"&&(i=B.dist(e,a.C));let l=i*(1-n)/n,c=B.dist(o,r),d=(r.x-o.x)/c,u=(r.y-o.y)/c,p=i*d,h=i*u,m=l*d,g=l*u,v={x:e.x-p,y:e.y-h},b={x:e.x+m,y:e.y+g},y=a.A,f={x:y.x+(v.x-y.x)/(1-n),y:y.y+(v.y-y.y)/(1-n)},T={x:y.x+(b.x-y.x)/n,y:y.y+(b.y-y.y)/n},P={x:o.x+(f.x-o.x)/n,y:o.y+(f.y-o.y)/n},S={x:r.x+(T.x-r.x)/(1-n),y:r.y+(T.y-r.y)/(1-n)};return new s(o,P,S,r)}static getUtils(){return B}getUtils(){return s.getUtils()}static get PolyBezier(){return eo}valueOf(){return this.toString()}toString(){return B.pointsToString(this.points)}toSVG(){if(this._3d)return!1;let o=this.points,e=o[0].x,r=o[0].y,n=["M",e,r,this.order===2?"Q":"C"];for(let i=1,a=o.length;i<a;i++)n.push(o[i].x),n.push(o[i].y);return n.join(" ")}setRatios(o){if(o.length!==this.points.length)throw new Error("incorrect number of ratio values");this.ratios=o,this._lut=[]}verify(){let o=this.coordDigest();o!==this._print&&(this._print=o,this.update())}coordDigest(){return this.points.map(function(o,e){return""+e+o.x+o.y+(o.z?o.z:0)}).join("")}update(){this._lut=[],this.dpoints=B.derive(this.points,this._3d),this.computedirection()}computedirection(){let o=this.points,e=B.angle(o[0],o[this.order],o[1]);this.clockwise=e>0}length(){return B.length(this.derivative.bind(this))}static getABC(o=2,e,r,n,i=.5){let a=B.projectionratio(i,o),l=1-a,c={x:a*e.x+l*n.x,y:a*e.y+l*n.y},d=B.abcratio(i,o);return{A:{x:r.x+(r.x-c.x)/d,y:r.y+(r.y-c.y)/d},B:r,C:c,S:e,E:n}}getABC(o,e){e=e||this.get(o);let r=this.points[0],n=this.points[this.order];return s.getABC(this.order,r,e,n,o)}getLUT(o){if(this.verify(),o=o||100,this._lut.length===o+1)return this._lut;this._lut=[],o++,this._lut=[];for(let e=0,r,n;e<o;e++)n=e/(o-1),r=this.compute(n),r.t=n,this._lut.push(r);return this._lut}on(o,e){e=e||5;let r=this.getLUT(),n=[];for(let i=0,a,l=0;i<r.length;i++)a=r[i],B.dist(a,o)<e&&(n.push(a),l+=i/r.length);return n.length?t/=n.length:!1}project(o){let e=this.getLUT(),r=e.length-1,n=B.closest(e,o),i=n.mpos,a=(i-1)/r,l=(i+1)/r,c=.1/r,d=n.mdist,u=a,p=u,h;d+=1;for(let m;u<l+c;u+=c)h=this.compute(u),m=B.dist(o,h),m<d&&(d=m,p=u);return p=p<0?0:p>1?1:p,h=this.compute(p),h.t=p,h.d=d,h}get(o){return this.compute(o)}point(o){return this.points[o]}compute(o){return this.ratios?B.computeWithRatios(o,this.points,this.ratios,this._3d):B.compute(o,this.points,this._3d,this.ratios)}raise(){let o=this.points,e=[o[0]],r=o.length;for(let n=1,i,a;n<r;n++)i=o[n],a=o[n-1],e[n]={x:(r-n)/r*i.x+n/r*a.x,y:(r-n)/r*i.y+n/r*a.y};return e[r]=o[r-1],new s(e)}derivative(o){return B.compute(o,this.dpoints[0],this._3d)}dderivative(o){return B.compute(o,this.dpoints[1],this._3d)}align(){let o=this.points;return new s(B.align(o,{p1:o[0],p2:o[o.length-1]}))}curvature(o){return B.curvature(o,this.dpoints[0],this.dpoints[1],this._3d)}inflections(){return B.inflections(this.points)}normal(o){return this._3d?this.__normal3(o):this.__normal2(o)}__normal2(o){let e=this.derivative(o),r=Po(e.x*e.x+e.y*e.y);return{t:o,x:-e.y/r,y:e.x/r}}__normal3(o){let e=this.derivative(o),r=this.derivative(o+.01),n=Po(e.x*e.x+e.y*e.y+e.z*e.z),i=Po(r.x*r.x+r.y*r.y+r.z*r.z);e.x/=n,e.y/=n,e.z/=n,r.x/=i,r.y/=i,r.z/=i;let a={x:r.y*e.z-r.z*e.y,y:r.z*e.x-r.x*e.z,z:r.x*e.y-r.y*e.x},l=Po(a.x*a.x+a.y*a.y+a.z*a.z);a.x/=l,a.y/=l,a.z/=l;let c=[a.x*a.x,a.x*a.y-a.z,a.x*a.z+a.y,a.x*a.y+a.z,a.y*a.y,a.y*a.z-a.x,a.x*a.z-a.y,a.y*a.z+a.x,a.z*a.z];return{t:o,x:c[0]*e.x+c[1]*e.y+c[2]*e.z,y:c[3]*e.x+c[4]*e.y+c[5]*e.z,z:c[6]*e.x+c[7]*e.y+c[8]*e.z}}hull(o){let e=this.points,r=[],n=[],i=0;for(n[i++]=e[0],n[i++]=e[1],n[i++]=e[2],this.order===3&&(n[i++]=e[3]);e.length>1;){r=[];for(let a=0,l,c=e.length-1;a<c;a++)l=B.lerp(o,e[a],e[a+1]),n[i++]=l,r.push(l);e=r}return n}split(o,e){if(o===0&&e)return this.split(e).left;if(e===1)return this.split(o).right;let r=this.hull(o),n={left:this.order===2?new s([r[0],r[3],r[5]]):new s([r[0],r[4],r[7],r[9]]),right:this.order===2?new s([r[5],r[4],r[2]]):new s([r[9],r[8],r[6],r[3]]),span:r};return n.left._t1=B.map(0,0,1,this._t1,this._t2),n.left._t2=B.map(o,0,1,this._t1,this._t2),n.right._t1=B.map(o,0,1,this._t1,this._t2),n.right._t2=B.map(1,0,1,this._t1,this._t2),e?(e=B.map(e,o,1,0,1),n.right.split(e).left):n}extrema(){let o={},e=[];return this.dims.forEach(function(r){let n=function(a){return a[r]},i=this.dpoints[0].map(n);o[r]=B.droots(i),this.order===3&&(i=this.dpoints[1].map(n),o[r]=o[r].concat(B.droots(i))),o[r]=o[r].filter(function(a){return a>=0&&a<=1}),e=e.concat(o[r].sort(B.numberSort))}.bind(this)),o.values=e.sort(B.numberSort).filter(function(r,n){return e.indexOf(r)===n}),o}bbox(){let o=this.extrema(),e={};return this.dims.forEach(function(r){e[r]=B.getminmax(this,r,o[r])}.bind(this)),e}overlaps(o){let e=this.bbox(),r=o.bbox();return B.bboxoverlap(e,r)}offset(o,e){if(typeof e<"u"){let r=this.get(o),n=this.normal(o),i={c:r,n,x:r.x+n.x*e,y:r.y+n.y*e};return this._3d&&(i.z=r.z+n.z*e),i}if(this._linear){let r=this.normal(0),n=this.points.map(function(i){let a={x:i.x+o*r.x,y:i.y+o*r.y};return i.z&&r.z&&(a.z=i.z+o*r.z),a});return[new s(n)]}return this.reduce().map(function(r){return r._linear?r.offset(o)[0]:r.scale(o)})}simple(){if(this.order===3){let n=B.angle(this.points[0],this.points[3],this.points[1]),i=B.angle(this.points[0],this.points[3],this.points[2]);if(n>0&&i<0||n<0&&i>0)return!1}let o=this.normal(0),e=this.normal(1),r=o.x*e.x+o.y*e.y;return this._3d&&(r+=o.z*e.z),So(ya(r))<xa/3}reduce(){let o,e=0,r=0,n=.01,i,a=[],l=[],c=this.extrema().values;for(c.indexOf(0)===-1&&(c=[0].concat(c)),c.indexOf(1)===-1&&c.push(1),e=c[0],o=1;o<c.length;o++)r=c[o],i=this.split(e,r),i._t1=e,i._t2=r,a.push(i),e=r;return a.forEach(function(d){for(e=0,r=0;r<=1;)for(r=e+n;r<=1+n;r+=n)if(i=d.split(e,r),!i.simple()){if(r-=n,So(e-r)<n)return[];i=d.split(e,r),i._t1=B.map(e,0,1,d._t1,d._t2),i._t2=B.map(r,0,1,d._t1,d._t2),l.push(i),e=r;break}e<1&&(i=d.split(e,1),i._t1=B.map(e,0,1,d._t1,d._t2),i._t2=d._t2,l.push(i))}),l}translate(o,e,r){r=typeof r=="number"?r:e;let n=this.order,i=this.points.map((a,l)=>(1-l/n)*e+l/n*r);return new s(this.points.map((a,l)=>({x:a.x+o.x*i[l],y:a.y+o.y*i[l]})))}scale(o){let e=this.order,r=!1;if(typeof o=="function"&&(r=o),r&&e===2)return this.raise().scale(r);let n=this.clockwise,i=this.points;if(this._linear)return this.translate(this.normal(0),r?r(0):o,r?r(1):o);let a=r?r(0):o,l=r?r(1):o,c=[this.offset(0,10),this.offset(1,10)],d=[],u=B.lli4(c[0],c[0].c,c[1],c[1].c);if(!u)throw new Error("cannot scale this curve. Try reducing it first.");return[0,1].forEach(function(p){let h=d[p*e]=B.copy(i[p*e]);h.x+=(p?l:a)*c[p].n.x,h.y+=(p?l:a)*c[p].n.y}),r?([0,1].forEach(function(p){if(!(e===2&&p)){var h=i[p+1],m={x:h.x-u.x,y:h.y-u.y},g=r?r((p+1)/e):o;r&&!n&&(g=-g);var v=Po(m.x*m.x+m.y*m.y);m.x/=v,m.y/=v,d[p+1]={x:h.x+g*m.x,y:h.y+g*m.y}}}),new s(d)):([0,1].forEach(p=>{if(e===2&&p)return;let h=d[p*e],m=this.derivative(p),g={x:h.x+m.x,y:h.y+m.y};d[p+1]=B.lli4(h,g,u,i[p+1])}),new s(d))}outline(o,e,r,n){if(e=e===void 0?o:e,this._linear){let S=this.normal(0),E=this.points[0],C=this.points[this.points.length-1],V,O,G;r===void 0&&(r=o,n=e),V={x:E.x+S.x*o,y:E.y+S.y*o},G={x:C.x+S.x*r,y:C.y+S.y*r},O={x:(V.x+G.x)/2,y:(V.y+G.y)/2};let se=[V,O,G];V={x:E.x-S.x*e,y:E.y-S.y*e},G={x:C.x-S.x*n,y:C.y-S.y*n},O={x:(V.x+G.x)/2,y:(V.y+G.y)/2};let oe=[G,O,V],fe=B.makeline(oe[2],se[0]),Se=B.makeline(se[2],oe[0]),de=[fe,new s(se),Se,new s(oe)];return new eo(de)}let i=this.reduce(),a=i.length,l=[],c=[],d,u=0,p=this.length(),h=typeof r<"u"&&typeof n<"u";function m(S,E,C,V,O){return function(G){let se=V/C,oe=(V+O)/C,fe=E-S;return B.map(G,0,1,S+se*fe,S+oe*fe)}}i.forEach(function(S){let E=S.length();h?(l.push(S.scale(m(o,r,p,u,E))),c.push(S.scale(m(-e,-n,p,u,E)))):(l.push(S.scale(o)),c.push(S.scale(-e))),u+=E}),c=c.map(function(S){return d=S.points,d[3]?S.points=[d[3],d[2],d[1],d[0]]:S.points=[d[2],d[1],d[0]],S}).reverse();let g=l[0].points[0],v=l[a-1].points[l[a-1].points.length-1],b=c[a-1].points[c[a-1].points.length-1],y=c[0].points[0],f=B.makeline(b,g),T=B.makeline(v,y),P=[f].concat(l).concat([T]).concat(c);return new eo(P)}outlineshapes(o,e,r){e=e||o;let n=this.outline(o,e).curves,i=[];for(let a=1,l=n.length;a<l/2;a++){let c=B.makeshape(n[a],n[l-a],r);c.startcap.virtual=a>1,c.endcap.virtual=a<l/2-1,i.push(c)}return i}intersects(o,e){return o?o.p1&&o.p2?this.lineIntersects(o):(o instanceof s&&(o=o.reduce()),this.curveintersects(this.reduce(),o,e)):this.selfintersects(e)}lineIntersects(o){let e=Vi(o.p1.x,o.p2.x),r=Vi(o.p1.y,o.p2.y),n=Oi(o.p1.x,o.p2.x),i=Oi(o.p1.y,o.p2.y);return B.roots(this.points,o).filter(a=>{var l=this.get(a);return B.between(l.x,e,n)&&B.between(l.y,r,i)})}selfintersects(o){let e=this.reduce(),r=e.length-2,n=[];for(let i=0,a,l,c;i<r;i++)l=e.slice(i,i+1),c=e.slice(i+2),a=this.curveintersects(l,c,o),n.push(...a);return n}curveintersects(o,e,r){let n=[];o.forEach(function(a){e.forEach(function(l){a.overlaps(l)&&n.push({left:a,right:l})})});let i=[];return n.forEach(function(a){let l=B.pairiteration(a.left,a.right,r);l.length>0&&(i=i.concat(l))}),i}arcs(o){return o=o||.5,this._iterate(o,[])}_error(o,e,r,n){let i=(n-r)/4,a=this.get(r+i),l=this.get(n-i),c=B.dist(o,e),d=B.dist(o,a),u=B.dist(o,l);return So(d-c)+So(u-c)}_iterate(o,e){let r=0,n=1,i;do{i=0,n=1;let a=this.get(r),l,c,d,u,p=!1,h=!1,m,g=n,v=1,b=0;do if(h=p,u=d,g=(r+n)/2,b++,l=this.get(g),c=this.get(n),d=B.getccenter(a,l,c),d.interval={start:r,end:n},p=this._error(d,a,r,n)<=o,m=h&&!p,m||(v=n),p){if(n>=1){if(d.interval.end=v=1,u=d,n>1){let f={x:d.x+d.r*ba(d.e),y:d.y+d.r*va(d.e)};d.e+=B.angle({x:d.x,y:d.y},f,this.get(1))}break}n=n+(n-r)/2}else n=g;while(!m&&i++<100);if(i>=100)break;u=u||d,e.push(u),r=v}while(n<1);return e}};var hr=class extends Xt{#e=null;constructor(o){super(),o&&(this.#e=o)}getBezier(){return this.#e||(this.#e=new Jt(this.getPoints().map(o=>o.xy))),this.#e}signedDistance(o){return this.nearestPointTo(o).point.distanceTo(o)}distance(o){return this.signedDistance(o)}at(o){return w.ofXY(this.getBezier().get(o))}derivativeAt(o){return w.ofXY(this.getBezier().derivative(o))}secondDerivativeAt(o){return w.ofXY(this.getBezier().dderivative(o))}normal(o){return w.ofXY(this.getBezier().normal(o))}normalAt(o){return this.normal(o)}tangentAt(o){return this.derivativeAt(o).normalized()}getTightBoundingBox(){let o=this.getBezier().bbox(),e=o.x.max-o.x.min,r=o.y.max-o.y.min;return new he(o.x.min,o.y.min,e,r)}argIntersectsLineSegment(o){let e=Be.ofSmallestContainingPoints(this.getPoints());return e?e.intersectsLineSegment(o).map(i=>this.nearestPointTo(i).parameterValue):this.getBezier().intersects(o).map(n=>{typeof n=="string"&&(n=parseFloat(n));let i=w.ofXY(this.at(n));return i.distanceTo(o.p1)>o.length||i.distanceTo(o.p2)>o.length?null:n}).filter(n=>n!==null)}splitAt(o){if(o<=0||o>=1)return[this];let r=this.getBezier().split(o);return[new mr(r.left.points.map(n=>w.ofXY(n)),r.left),new mr(r.right.points.map(n=>w.ofXY(n)),r.right)]}nearestPointTo(o){let e=u=>o.squareDistanceTo(this.at(u)),r=e(0),n=0,i=r,a=4;for(let u=0;u<a;u++){let p=u/(a-1),h=e(p);h<i&&(n=p,i=h)}let l=u=>{let p=this.at(u),h=this.derivativeAt(u),m=this.secondDerivativeAt(u);return 2*h.x*h.x+2*p.x*m.x-2*o.x*m.x+2*h.y*h.y+2*p.y*m.y-2*o.y*m.y},c=u=>{let p=this.at(u),h=this.derivativeAt(u);return 2*p.x*h.x-2*o.x*h.x+2*p.y*h.y-2*o.y*h.y},d=()=>{let u=l(n);if(u===0)return;n=(0-c(n))/u+n,n>1?n=1:n<0&&(n=0)};for(let u=0;u<12;u++)d();return{parameterValue:n,point:this.at(n)}}intersectsBezier(o){let e=this.getBezier().intersects(o.getBezier());if(!e||e.length===0)return[];let r=[];for(let n of e){let i=/^([-0-9.eE]+)\/([-0-9.eE]+)$/.exec(n);if(!i)throw new Error(`Incorrect format returned by .intersects: ${e} should be array of "number/number"!`);let a=parseFloat(i[1]);r.push({parameterValue:a,point:this.at(a)})}return r}toString(){return`B\xE9zier(${this.getPoints().map(o=>o.toString()).join(", ")})`}},mr=class extends hr{constructor(e,r){super(r);this.controlPoints=e}getPoints(){return this.controlPoints}},fr=hr;var Pn=class extends fr{constructor(e,r,n,i){super();this.p0=e;this.p1=r;this.p2=n;this.p3=i}getPoints(){return[this.p0,this.p1,this.p2,this.p3]}getLooseBoundingBox(){return he.bboxOf([this.p0,this.p1,this.p2,this.p3])}},Fi=Pn;var wa=(s,o,e)=>{if(s===0){let l;return o===0?l=e===0?0:NaN:l=-e/o,[l,l]}let r=o*o-4*s*e;if(r<0)return[NaN,NaN];let n=Math.sqrt(r),i=(-o+n)/(2*s),a=(-o-n)/(2*s);return i>a?[i,a]:[a,i]},Hi=wa;var De=class s extends fr{constructor(e,r,n){super();this.p0=e;this.p1=r;this.p2=n}static componentAt(e,r,n,i){return r+e*(-2*r+2*n)+e*e*(r-2*n+i)}static derivativeComponentAt(e,r,n,i){return-2*r+2*n+2*e*(r-2*n+i)}static secondDerivativeComponentAt(e,r,n,i){return 2*(r-2*n+i)}at(e){if(e===0)return this.p0;if(e===1)return this.p2;let r=this.p0,n=this.p1,i=this.p2;return w.of(s.componentAt(e,r.x,n.x,i.x),s.componentAt(e,r.y,n.y,i.y))}derivativeAt(e){let r=this.p0,n=this.p1,i=this.p2;return w.of(s.derivativeComponentAt(e,r.x,n.x,i.x),s.derivativeComponentAt(e,r.y,n.y,i.y))}secondDerivativeAt(e){let r=this.p0,n=this.p1,i=this.p2;return w.of(s.secondDerivativeComponentAt(e,r.x,n.x,i.x),s.secondDerivativeComponentAt(e,r.y,n.y,i.y))}normal(e){return this.derivativeAt(e).orthog().normalized()}getLooseBoundingBox(){return he.bboxOf([this.p0,this.p1,this.p2])}approximateDistance(e){let r=this.p0.x-e.x,n=-2*this.p0.x+2*this.p1.x,i=this.p0.x-2*this.p1.x+this.p2.x,a=this.p0.y-e.y,l=-2*this.p0.y+2*this.p1.y,c=this.p0.y-2*this.p1.y+this.p2.y,d=2*r*n+2*a*l-e.x*n-e.y*l,u=2*n*n+2*l*l+2*i*r+2*c*a-e.x*i-e.y*c,p=2*l*c+2*n*i+2*i*n+2*c*l,h=d,m=u,g=2*p,[v,b]=Hi(g/2,m,h);isNaN(v)&&(v=.25),isNaN(b)&&(b=.75);let y=this.at(v),f=this.at(b),T=y.squareDistanceTo(e),P=f.squareDistanceTo(e),S=this.at(0).squareDistanceTo(e),E=this.at(1).squareDistanceTo(e);return Math.sqrt(Math.min(T,P,S,E))}getPoints(){return[this.p0,this.p1,this.p2]}},Ni=De;var En=class extends Xt{constructor(e){super();this.p=e}signedDistance(e){return this.p.distanceTo(e)}argIntersectsLineSegment(e,r){return e.containsPoint(this.p,r)?[0]:[]}getTightBoundingBox(){return new he(this.p.x,this.p.y,0,0)}at(e){return this.p}normalAt(e){return w.unitY}tangentAt(e){return w.unitX}splitAt(e){return[this]}nearestPointTo(e){return{point:this.p,parameterValue:0}}},$i=En;var Ca=s=>{if(s.indexOf("e")>0&&s.match(/[eE][-]\d{2,}$/))return"0";let o=s.charAt(s.length-1);(o==="0"||o===".")&&(s=s.replace(/([.]\d*[^0])0+$/,"$1"),s=s.replace(/[.]0+$/,"."),s=s.replace(/[.]$/,""));let e=s.charAt(0);return(e==="0"||e==="-")&&(s=s.replace(/^(0+)[.]/,"."),s=s.replace(/^-(0+)[.]/,"-."),s=s.replace(/^(-?)0+$/,"$10")),s==="-0"?"0":s},gr=Ca;var pe=s=>{let o=/^([-]?\d*\.\d{3,})0{4,}\d{1,4}$/,e=/^([-]?)(\d*)\.(\d{3,}9{4,})\d{1,4}$/,r=s.toString(10);if(r.indexOf(".")===-1)return r;let n=e.exec(r);if(n){let i=n[1],a=n[3],l=parseInt(a.charAt(a.length-1),10),c=parseInt(a,10),d=parseInt(n[2],10),u=n[3],p=(c+10-l).toString(),h=0;for(p.length>c.toString().length&&(p=p.substring(1),h=1);p.length<u.length;)p=h.toString(10)+p,h=0;r=`${i+(d+h).toString()}.${p}`}return r=r.replace(o,"$1"),gr(r)},wt=pe;var br=/^([-]?)(\d*)[.](\d+)$/;var Ta=s=>{let o=br.exec(s);return o?o[3].length:s.search(/[eE]/)!==-1||/^[a-zA-Z]+$/.exec(s)?-1:0},Ui=Ta;var Sa=(s,...o)=>{let e=s.toString(10),r=br.exec(e);if(!r)return e;let n=-1;for(let d of o)n=Math.max(Ui(d),n);if(n===-1)return wt(s);let i=r[3].substring(0,n),a=r[2],l=r[3].charAt(n);if(l!==""&&parseInt(l,10)>=5){if(i.length>0){let u=/^(0+)(\d*)$/.exec(i),p="",h=i;u&&(p=u[1],h=u[2]),i=(parseInt(i)+1).toString(),i.length>h.length&&p.length>0&&(p=p.substring(1)),i=p+i}(i.length===0||i.length>n)&&(a=(parseInt(a)+1).toString(),i=i.substring(1))}let c=r[1];return gr(`${c}${a}.${i}`)},kn=Sa;var Pa=s=>{if(s.length===0)return[];let o=s.reduce((i,a)=>a.y<i.y?a:i,s[0]),e=[o],r=[...s.filter(i=>!i.eq(o))],n=w.of(-1,0);for(;r.length>0;){let i=e[e.length-1],a=n.dot(o.minus(i).normalizedOrZero()),l=o;for(let d of r){let u=n.dot(d.minus(i).normalizedOrZero());u<=a&&(l=d,a=u)}r=r.filter(d=>!d.eq(l));let c=l.minus(i).normalized();if(Math.abs(c.dot(n))===1&&e.length>1&&e.pop(),l.eq(o))break;e.push(l),n=i.minus(l).normalized()}return e},Wi=Pa;var we=(n=>(n[n.LineTo=0]="LineTo",n[n.MoveTo=1]="MoveTo",n[n.CubicBezierTo=2]="CubicBezierTo",n[n.QuadraticBezierTo=3]="QuadraticBezierTo",n))(we||{}),Eo=(s,o)=>{let e=s.curveIndex-o.curveIndex;return e===0?s.parameterValue-o.parameterValue:e},vr=(s,o)=>s.parameterValue+o>1?{curveIndex:s.curveIndex+1,parameterValue:s.parameterValue+o-1}:s.parameterValue+o<0?s.curveIndex===0?{curveIndex:0,parameterValue:0}:{curveIndex:s.curveIndex-1,parameterValue:s.parameterValue+o+1}:{curveIndex:s.curveIndex,parameterValue:s.parameterValue+o},$=class s{constructor(o,e){this.startPoint=o;this.cachedGeometry=null;this.cachedPolylineApproximation=null;this.cachedStringVersion=null;this.parts=e,this.bbox=he.bboxOf([o]);for(let r of this.parts)this.bbox=this.bbox.union(s.computeBBoxForSegment(o,r))}getExactBBox(){let o=[];for(let e of this.geometry)o.push(e.getTightBoundingBox());return he.union(...o)}get geometry(){if(this.cachedGeometry)return this.cachedGeometry;let o=this.startPoint,e=[];for(let r of this.parts){let n;switch(r.kind){case 2:e.push(new Fi(o,r.controlPoint1,r.controlPoint2,r.endPoint)),o=r.endPoint;break;case 3:e.push(new Ni(o,r.controlPoint,r.endPoint)),o=r.endPoint;break;case 0:e.push(new Be(o,r.point)),o=r.point;break;case 1:e.push(new $i(r.point)),o=r.point;break;default:return n=r,n}}return this.cachedGeometry=e,this.cachedGeometry}*startEndPoints(){yield this.startPoint;for(let o of this.parts){let e;switch(o.kind){case 2:yield o.endPoint;break;case 3:yield o.endPoint;break;case 0:yield o.point;break;case 1:yield o.point;break;default:return e=o,e}}}polylineApproximation(){if(this.cachedPolylineApproximation)return this.cachedPolylineApproximation;let o=[];for(let n of this.parts)switch(n.kind){case 2:o.push(n.controlPoint1,n.controlPoint2,n.endPoint);break;case 3:o.push(n.controlPoint,n.endPoint);break;case 1:case 0:o.push(n.point);break}let e=[],r=this.startPoint;for(let n of o)e.push(new Be(r,n)),r=n;return e}static computeBBoxForSegment(o,e){let r=[o],n;switch(e.kind){case 1:case 0:r.push(e.point);break;case 2:r.push(e.controlPoint1,e.controlPoint2,e.endPoint);break;case 3:r.push(e.controlPoint,e.endPoint);break;default:return n=e,n}return he.bboxOf(r)}signedDistance(o,e){let r=1/0;for(let n of this.geometry){let i=n.signedDistance(o)-e;i<r&&(r=i)}return r}raymarchIntersectionWith(o,e,r=[]){if(!o.bbox.intersects(this.bbox.grownBy(e)))return[];let n=o.length,i=[];for(let g of this.geometry){let v=g.getTightBoundingBox().grownBy(e);if(!v.intersects(o.bbox))continue;let b=f=>g.signedDistance(f),y=f=>b(f)-e;y(o.p1)>n&&y(o.p2)>n||i.push({part:g,distFn:b,bbox:v})}if(i.length===0)return[];let a=g=>{let v=1/0,b=null,y=[];for(let f of i){let{part:T,distFn:P,bbox:S}=f;if(!S.containsPoint(g)){y.push(f);continue}let E=P(g);E<=v&&(v=E,b=T)}for(let{part:f,distFn:T,bbox:P}of y){if(isFinite(v)&&!P.grownBy(v).containsPoint(g))continue;let S=T(g);S<=v&&(v=S,b=f)}return[b,v-e]},l=8,c=[o.p1,...r,o.p2],d=g=>g.minus(o.p1).dot(o.direction);c.sort((g,v)=>{let b=d(g),y=d(v);return b-y});let u=[],p=e/1e3,h=(g,v,b)=>{let y=g,[f,T]=a(y),P=d(y);if(T>n)return P;let S=o.direction.times(v);for(let C=0;C<l;C++){let V=T;if(y=y.plus(S.times(V)),P=d(y),P<=b)return P;let[O,G]=a(y);if(Math.abs(G)>Math.abs(T))return null;if(T=G,f=O,Math.abs(T)<p)break}let E=P>=0&&P<=n;if(f&&E&&Math.abs(T)<p){u.push({point:y,parameterValue:f.nearestPointTo(y).parameterValue,curve:f,curveIndex:this.geometry.indexOf(f)});let C=e/20/o.length;P+=isFinite(C)?C:0}return P},m=0;for(let g=0;g<c.length;g++){let v=c[g];m=Math.max(m,h(v,1,m)??m),m=Math.max(m,h(v,-1,m)??m)}return u}intersection(o,e){let r=[];if(!o.bbox.intersects(this.bbox.grownBy(e??0)))return[];if(this.parts.length===0)return new s(this.startPoint,[{kind:1,point:this.startPoint}]).intersection(o,e);let n=0;for(let a of this.geometry){let l=a.argIntersectsLineSegment(o);for(let c of l)r.push({curve:a,curveIndex:n,point:a.at(c),parameterValue:c});n++}if(e&&e>1e-8){let a=r.map(l=>l.point);r=this.raymarchIntersectionWith(o,e,a)}return r}nearestPointTo(o){let e=1/0,r=0,n=0,i=this.startPoint;for(let a=0;a<this.geometry.length;a++){let c=this.geometry[a].nearestPointTo(o),d=c.point.squareDistanceTo(o);(a===0||d<e)&&(r=a,e=d,n=c.parameterValue,i=c.point)}return{curve:this.geometry[r],curveIndex:r,parameterValue:n,point:i}}at(o){return o.curveIndex===0&&o.parameterValue===0?this.startPoint:this.geometry[o.curveIndex].at(o.parameterValue)}tangentAt(o){return this.geometry[o.curveIndex].tangentAt(o.parameterValue)}splitNear(o,e){let r=this.nearestPointTo(o);return this.splitAt(r,e)}spliced(o,e,r,n){if(((a,l)=>a.curveIndex<l.curveIndex||a.curveIndex===l.curveIndex&&a.parameterValue<=l.parameterValue)(o,e)){let a=this.splitAt(o,n),l=this.splitAt(e,n),c=a[0],d=l[l.length-1];return r?c.union(r).union(d):c.union(d)}else{let c=this.splitAt([o],n)[0].splitNear(this.at(e),n),d=c[c.length-1];return r?d.union(r):d}}splitAt(o,e){for(Array.isArray(o)||(o=[o]),o=[...o],o.sort(Eo);o.length>0&&o[o.length-1].curveIndex>=this.parts.length-1&&o[o.length-1].parameterValue>=1;)o.pop();for(o.reverse();o.length>0&&o[o.length-1].curveIndex<=0&&o[o.length-1].parameterValue<=0;)o.pop();if(o.length===0||this.parts.length===0)return[this];let r=o.length+1,n=e?.mapNewPoint??(u=>u),i=[],a=this.startPoint,l=[],{curveIndex:c,parameterValue:d}=o.pop();for(let u=0;u<this.parts.length;u++)if(u!==c)l.push(this.parts[u]);else{let p=this.parts[u],h=this.geometry[u];for(;u===c;){let m,g=[];switch(p.kind){case 1:l.push({kind:p.kind,point:p.point}),m=p.point;break;case 0:{let b=h.splitAt(d);l.push({kind:p.kind,point:n(b[0].p2)}),m=b[0].p2,b.length>1&&(console.assert(b.length===2),g.push({kind:p.kind,point:b[1].p2}),h=b[1])}break;case 3:case 2:{let b=h.splitAt(d),y=b.length===2;for(let f of b){h=f;let T=y?l:g,P=f.getPoints();p.kind===2?T.push({kind:p.kind,controlPoint1:n(P[1]),controlPoint2:n(P[2]),endPoint:n(P[3])}):T.push({kind:p.kind,controlPoint:n(P[1]),endPoint:n(P[2])}),y||(m=P[0]),y=!1}}break;default:return p}i.push(new s(a,[...l])),a=n(m),console.assert(!!a,"should have a start point"),l=g,p=g[g.length-1]??p;let v=o.pop();if(v)if(c=v.curveIndex,u===c){let b=this.at(v);d=h.nearestPointTo(b).parameterValue,l=[]}else d=v.parameterValue;else break}}return i.push(new s(a,l)),console.assert(i.length===r,`should split into splitAt.length + 1 splits (was ${i.length}, expected ${r})`),i}asClosed(){let o=[],e=!1;for(let n of this.parts)n.kind===1?(o.push({kind:0,point:n.point}),e=!0):o.push(n);if(this.getEndPoint().eq(this.startPoint)||(o.push({kind:0,point:this.startPoint}),e=!0),!e)return this;let r=new s(this.startPoint,o);return console.assert(r.getEndPoint().eq(r.startPoint)),r}static mapPathCommand(o,e){switch(o.kind){case 1:case 0:return{kind:o.kind,point:e(o.point)};case 2:return{kind:o.kind,controlPoint1:e(o.controlPoint1),controlPoint2:e(o.controlPoint2),endPoint:e(o.endPoint)};case 3:return{kind:o.kind,controlPoint:e(o.controlPoint),endPoint:e(o.endPoint)}}return o}mapPoints(o){let e=o(this.startPoint),r=[];for(let n of this.parts)r.push(s.mapPathCommand(n,o));return new s(e,r)}transformedBy(o){return o.isIdentity()?this:this.mapPoints(e=>o.transformVec2(e))}closedContainsPoint(o){let e=this.getExactBBox();if(!e.containsPoint(o))return!1;let r=o.plus(w.of(e.width,0)),n=this.asClosed(),i=new Be(o,r),a=n.intersection(i);return a.filter((c,d)=>d===0?!0:!(a[d-1].parameterValue>=1&&c.parameterValue<=0)).length%2===1}closedContainsRect(o){if(!this.bbox.containsRect(o)||!o.corners.every(e=>this.closedContainsPoint(e)))return!1;for(let e of o.getEdges())if(this.intersection(e).length)return!1;return!0}union(o,e={allowReverse:!0}){if(!o)return this;if(Array.isArray(o))return new s(this.startPoint,[...this.parts,...o]);let r=this.getEndPoint(),n=[];if(r.eq(o.startPoint))n=this.parts.concat(o.parts);else{if(e.allowReverse&&this.startPoint.eq(o.getEndPoint()))return o.union(this,{allowReverse:!1});if(e.allowReverse&&this.startPoint.eq(o.startPoint))return this.union(o.reversed(),{allowReverse:!1});n=[...this.parts,{kind:1,point:o.startPoint},...o.parts]}return new s(this.startPoint,n)}reversed(){let o=this.getEndPoint(),e=[],r=this.startPoint;for(let n of this.parts)switch(n.kind){case 0:case 1:e.push({kind:n.kind,point:r}),r=n.point;break;case 2:e.push({kind:n.kind,controlPoint1:n.controlPoint2,controlPoint2:n.controlPoint1,endPoint:r}),r=n.endPoint;break;case 3:e.push({kind:n.kind,controlPoint:n.controlPoint,endPoint:r}),r=n.endPoint;break;default:return n}return e.reverse(),new s(o,e)}getEndPoint(){if(this.parts.length===0)return this.startPoint;let o=this.parts[this.parts.length-1];return o.kind===3||o.kind===2?o.endPoint:o.point}roughlyIntersects(o,e=0){if(this.parts.length===0)return o.containsPoint(this.startPoint);if(this.startPoint.eq(this.getEndPoint())&&e===0)return this.closedRoughlyIntersects(o);if(o.containsRect(this.bbox))return!0;let n=this.startPoint;for(let i of this.parts){let a=s.computeBBoxForSegment(n,i).grownBy(e);if(i.kind===0||i.kind===1?n=i.point:n=i.endPoint,o.intersects(a))return!0}return!1}closedRoughlyIntersects(o){if(o.containsRect(this.bbox))return!0;let e=this.bbox.topLeft.minus(w.of(1,1)),r=o.corners,n=this.polylineApproximation();for(let l of r){let c=new Be(l,e),d=0;for(let u of n)u.intersects(c)&&d++;if(d%2===1)return!0}let i=o.grownBy(Math.min(o.size.x,o.size.y)),a=[];for(let l of i.divideIntoGrid(4,4))a.push(...l.getEdges());for(let l of a)for(let c of n)if(l.intersects(c))return!0;return!1}eq(o,e){if(o.parts.length!==this.parts.length)return!1;for(let r=0;r<this.parts.length;r++){let n=this.parts[r],i=o.parts[r];switch(n.kind){case 0:case 1:if(n.kind!==i.kind)return!1;if(!n.point.eq(i.point,e))return!1;break;case 2:if(n.kind!==i.kind)return!1;if(!n.controlPoint1.eq(i.controlPoint1,e)||!n.controlPoint2.eq(i.controlPoint2,e)||!n.endPoint.eq(i.endPoint,e))return!1;break;case 3:if(n.kind!==i.kind)return!1;if(!n.controlPoint.eq(i.controlPoint,e)||!n.endPoint.eq(i.endPoint,e))return!1;break;default:return n}}return!0}static fromRect(o,e=null){let r=[],n,i;if(e!==null){let a=w.of(e,e).times(.5),l=he.fromCorners(o.topLeft.plus(a),o.bottomRight.minus(a)),c=he.fromCorners(o.topLeft.minus(a),o.bottomRight.plus(a));n=[l.corners[3],...l.corners,...c.corners.reverse()],i=c.corners[3]}else n=o.corners.slice(1),i=o.corners[0];for(let a of n)r.push({kind:0,point:a});return r.push({kind:0,point:i}),new s(i,r)}toString(o,e=!1){if(this.cachedStringVersion&&!e)return this.cachedStringVersion;o===void 0&&(o=Math.abs(this.bbox.topLeft.x)>10&&Math.abs(this.bbox.topLeft.y)>10);let r=s.toString(this.startPoint,this.parts,!o);return this.cachedStringVersion=r,r}serialize(){return this.toString()}static toString(o,e,r){let n=[],i,a=(c,...d)=>{let u=[],p=[],h=!i||r,m=i?wt(i.x):"",g=i?wt(i.y):"";for(let b of d){let y=wt(b.x),f=wt(b.y);if(h)u.push(`${y},${f}`);else{let T=kn(b.x-i.x,y,m,g),P=kn(b.y-i.y,f,m,g);P.charAt(0)==="-"?p.push(`${T}${P}`):p.push(`${T},${P}`)}}let v;h?v=`${c}${u.join(" ")}`:v=`${c.toLowerCase()}${p.join(" ")}`,!(v==="l0,0"||v==="m0,0")&&(n.push(v),d.length>0&&(i=d[d.length-1]))};e[0]?.kind!==1&&a("M",o);let l;for(let c=0;c<e.length;c++){let d=e[c];switch(d.kind){case 1:a("M",d.point);break;case 0:a("L",d.point);break;case 2:a("C",d.controlPoint1,d.controlPoint2,d.endPoint);break;case 3:a("Q",d.controlPoint,d.endPoint);break;default:return l=d,l}}return n.join("")}static fromString(o){o=o.split(`
3
+ `).join(" ");let e=w.zero,r=null,n=null,i=!0,a=[],l=v=>{if(i){i=!1;return}a.push({kind:1,point:v})},c=v=>{if(i){i=!1;return}a.push({kind:0,point:v})},d=(v,b,y)=>{a.push({kind:2,controlPoint1:v,controlPoint2:b,endPoint:y})},u=(v,b)=>{a.push({kind:3,controlPoint:v,endPoint:b})},p={m:1,l:1,c:3,q:2,z:0,h:1,v:1},h=/([MZLHVCSQTA])\s*([^MZLHVCSQTA]*)/gi,m;for(;(m=h.exec(o))!==null;){let b=m[2].trim().split(/[^0-9Ee.-]/).filter(S=>S.length>0).reduce((S,E)=>{E=E.replace(/([^eE])[-]/g,"$1 -");let C=E.split(" -");return C[0]!==""&&S.push(C[0]),S.push(...C.slice(1).map(V=>`-${V}`)),S},[]).map(S=>parseFloat(S)),y=m[1].toLowerCase(),f=m[1]!==y;if(y==="v"||y==="h")b=b.reduce((S,E)=>y==="v"?S.concat(f?e.x:0,E):S.concat(E,f?e.y:0),[]),y="l";else if(y==="z"){if(r)b=[r.x,r.y],r=e;else continue;f=!0,y="l"}let T=p[y]??0,P=b.reduce((S,E,C,V)=>{if(C%2!==0){let O=E,G=V[C-1];return S.concat(w.of(G,O))}else return S},[]).map((S,E)=>{let C;return f?C=S:C=e.plus(S),(E+1)%T===0&&(e=C),C});if(P.length%T!==0)throw new Error([`Incorrect number of arguments: got ${JSON.stringify(P)} with a length of ${P.length} \u2260 ${T}k, k \u2208 \u2124.`,`The number of arguments to ${y} must be a multiple of ${T}!`,`Command: ${m[0]}`].join(`
4
+ `));for(let S=0;S<P.length;S+=T){let E=P.slice(S,S+T);switch(y.toLowerCase()){case"m":S===0?l(E[0]):c(E[0]);break;case"l":c(E[0]);break;case"c":d(E[0],E[1],E[2]);break;case"q":u(E[0],E[1]);break;default:throw new Error(`Unknown path command ${y}`)}i=!1}P.length>0&&(r??=P[0],n??=r,e=P[P.length-1])}let g=new s(n??w.zero,a);return g.cachedStringVersion=o,g}static fromConvexHullOf(o){if(o.length===0)return s.empty;let e=Wi(o),r=e.slice(1).map(n=>({kind:0,point:n}));return r.push({kind:0,point:e[0]}),new s(e[0],r)}static{this.empty=new s(w.zero,[])}};var L=class s{constructor(o,e,r,n){this.r=o;this.g=e;this.b=r;this.a=n;this.hexString=null}static ofRGB(o,e,r){return s.ofRGBA(o,e,r,1)}static ofRGBA(o,e,r,n){return o=Math.max(0,Math.min(o,1)),e=Math.max(0,Math.min(e,1)),r=Math.max(0,Math.min(r,1)),n=Math.max(0,Math.min(n,1)),new s(o,e,r,n)}static fromRGBArray(o,e=255){let r=o[0],n=o[1]??r,i=o[2]??r,a=255;return 3<o.length&&(a=o[3]),s.ofRGBA(r/e,n/e,i/e,a/e)}static fromHex(o){if(o=(o.match(/^[#]?(.*)$/)??[])[1],o=o.toUpperCase(),!o.match(/^[0-9A-F]+$/))throw new Error(`${o} is not in a valid format.`);(o.length===3||o.length===4)&&(o=o.split("").map(n=>`${n}0`).join("")),o.length===6&&(o+="FF");let e=[];for(let r=2;r<=o.length;r+=2){let n=o.substring(r-2,r);e.push(parseInt(n,16)/255)}if(e.length!==4)throw new Error(`Unable to parse ${o}: Wrong number of components.`);return s.ofRGBA(e[0],e[1],e[2],e[3])}static fromString(o){if(o.startsWith("#"))return s.fromHex(o);if(o==="none"||o==="transparent")return s.transparent;if(o==="")return s.black;let e=/^rgba?\(([,0-9.]+)\)$/i,r=o.replace(/\s*/g,"").match(e);if(r){let p=r[1],h=JSON.parse(`[ ${p} ]`);if(h.length===3)return s.ofRGB(h[0]/255,h[1]/255,h[2]/255);if(h.length===4)return s.ofRGBA(h[0]/255,h[1]/255,h[2]/255,h[3]);throw new Error(`RGB string, ${o}, has wrong number of components: ${h.length}`)}let n=document.createElement("canvas");n.width=1,n.height=1;let i=n.getContext("2d");if(!i)return s.black;i.fillStyle=o,i.fillRect(0,0,1,1);let a=i.getImageData(0,0,1,1),l=a.data[0]/255,c=a.data[1]/255,d=a.data[2]/255,u=a.data[3]/255;return s.ofRGBA(l,c,d,u)}eq(o){return o==null?!1:this.a===0&&o.a===0?!0:this.toHexString()===o.toHexString()}mix(o,e){e=Math.min(Math.max(e,0),1);let r=1-e;return new s(this.r*r+o.r*e,this.g*r+o.g*e,this.b*r+o.b*e,this.a*r+o.a*e)}withAlpha(o){return new s(this.r,this.g,this.b,o)}get rgb(){return Pe.of(this.r,this.g,this.b)}relativeLuminance(){let o=[this.r,this.g,this.b].map(e=>e<.03928?e/12.92:Math.pow((e+.055)/1.055,2.4));return .2126*o[0]+.7152*o[1]+.0722*o[2]}static contrastRatio(o,e){let r=o.relativeLuminance(),n=e.relativeLuminance();return(Math.max(r,n)+.05)/(Math.min(r,n)+.05)}static average(o){let e=0,r=0,n=0,i=0;for(let a of o)e+=a.a,r+=a.r,n+=a.g,i+=a.b;return o.length>0&&(e/=o.length,r/=o.length,n/=o.length,i/=o.length),new s(r,n,i,e)}asHSV(){let o=Math.min(this.r,this.g,this.b),e=Math.max(this.r,this.g,this.b),r=e-o,n;r===0?n=0:this.r>=this.g&&this.r>=this.b?n=(this.g-this.b)/r%6:this.g>=this.r&&this.g>=this.b?n=(this.b-this.r)/r+2:n=(this.r-this.g)/r+4,n*=60,n*=Math.PI/180,n<0&&(n+=Math.PI*2);let i=e,a=i>0?r/i:0;return Pe.of(n,a,i)}static fromHSV(o,e,r){o<0&&(o+=Math.PI*2),o%=Math.PI*2,r=Math.max(0,Math.min(1,r)),e=Math.max(0,Math.min(1,e));let n=r*e,i=o/(Math.PI/3),a=n*(1-Math.abs(i%2-1)),l;i<1?l=[n,a,0]:i<2?l=[a,n,0]:i<3?l=[0,n,a]:i<4?l=[0,a,n]:i<5?l=[a,0,n]:l=[n,0,a];let c=r-n;return s.ofRGB(l[0]+c,l[1]+c,l[2]+c)}static fromRGBVector(o,e){return s.ofRGBA(o.x,o.y,o.z,e??1)}toHexString(){if(this.hexString)return this.hexString;let o=a=>{let l=Math.round(255*a).toString(16);return l.length===1?`0${l}`:l},e=o(this.a),r=o(this.r),n=o(this.g),i=o(this.b);return e==="ff"?`#${r}${n}${i}`:(this.hexString=`#${r}${n}${i}${e}`,this.hexString)}toString(){return this.toHexString()}static{this.transparent=s.ofRGBA(0,0,0,0)}static{this.red=s.ofRGB(1,0,0)}static{this.orange=s.ofRGB(1,.65,0)}static{this.green=s.ofRGB(0,1,0)}static{this.blue=s.ofRGB(0,0,1)}static{this.purple=s.ofRGB(.5,.2,.5)}static{this.yellow=s.ofRGB(1,1,.1)}static{this.clay=s.ofRGB(.8,.4,.2)}static{this.black=s.ofRGB(0,0,0)}static{this.gray=s.ofRGB(.5,.5,.5)}static{this.white=s.ofRGB(1,1,1)}};var Rn=class extends Ie{},Ee=class s{constructor(o){this.onTransformChangeCallback=o;this.resetTransform(k.identity),this.screenRect=I.empty}static{this.ViewportTransform=class extends Rn{constructor(e){super();this.transform=e;this.#e=e.inverse()}#e;apply(e){let r=e.viewport;r.resetTransform(r.transform.rightMul(this.transform)),e.queueRerender()}unapply(e){let r=e.viewport;r.resetTransform(r.transform.rightMul(this.#e)),e.queueRerender()}description(e,r){let n=[],i=e.viewport.visibleRect.center,a=this.transform.transformVec3(w.unitX),l=this.transform.transformVec2(i),c=a.magnitude(),d=180/Math.PI*a.angle(),u=l.minus(i);c>1.2?n.push(r.zoomedIn):c<.8&&n.push(r.zoomedOut),Math.floor(Math.abs(d))>0&&n.push(r.rotatedBy(Math.round(d)));let p=1e-4;return u.x>p?n.push(r.movedLeft):u.x<-p&&n.push(r.movedRight),u.y<-p?n.push(r.movedDown):u.y>p&&n.push(r.movedUp),n.join("; ")}}}getTemporaryClone(){let o=new s(()=>{});return o.transform=this.transform,o.inverseTransform=this.inverseTransform,o.screenRect=this.screenRect,o}updateScreenSize(o){this.screenRect=this.screenRect.resizedTo(o)}get visibleRect(){return this.screenRect.transformedBoundingBox(this.inverseTransform)}screenToCanvas(o){return this.inverseTransform.transformVec2(o)}canvasToScreen(o){return this.transform.transformVec2(o)}static transformBy(o){return new s.ViewportTransform(o)}resetTransform(o=k.identity){let e=this.transform;this.transform=o,this.inverseTransform=o.inverse(),this.onTransformChangeCallback?.(e,o)}get screenToCanvasTransform(){return this.inverseTransform}get canvasToScreenTransform(){return this.transform}getScreenRectSize(){return this.screenRect.size}getResolution(){return this.getScreenRectSize()}getScaleFactor(){return this.transform.transformVec3(F.unitX).magnitude()}getScaleFactorToNearestPowerOfTen(){return this.getScaleFactorToNearestPowerOf(10)}getScaleFactorToNearestPowerOf(o){let e=this.getScaleFactor();return Math.pow(o,Math.round(Math.log(e)/Math.log(o)))}static getGridSize(o){return 50/o}snapToGrid(o){let e=this.getScaleFactorToNearestPowerOf(2),r=i=>{let a=1/s.getGridSize(e);return Math.round(i*a)/a};return w.of(r(o.x),r(o.y))}getSizeOfPixelOnCanvas(){return 1/this.getScaleFactor()}getRotationAngle(){return this.transform.transformVec3(F.unitX).angle()}static roundPoint(o,e){let r=10**Math.floor(Math.log10(e)),n=i=>Math.round(i/r)*r;return typeof o=="number"?n(o):o.map(n)}roundPoint(o){return s.roundPoint(o,1/this.getScaleFactor())}static roundScaleRatio(o,e=1){if(Math.abs(o)<=1e-12)return 0;let r=10**Math.floor(Math.log10(Math.abs(o))),n=2**e;return o=Math.round(o/r*n)/n*r,o}computeZoomToTransform(o,e=!0,r=!0){let n=k.identity;if(o.w===0||o.h===0){let d=Math.max(o.w,o.h);d===0&&(d=50,e=!1,r=!1),o=new I(o.x,o.y,d,d)}if(isNaN(o.size.magnitude()))throw new Error(`${o.toString()} rectangle has NaN size! Cannot zoom to!`);let i=()=>{let d=this.visibleRect.transformedBoundingBox(n.inverse());return d.transformedBoundingBox(k.scaling2D(4/5,d.center))},a=i(),l=a.w<o.w||a.h<o.h,c=o.maxDimension/a.maxDimension<1/3;if(l&&r||c&&e){let d=Math.max(o.w/a.w,o.h/a.h),p=k.scaling2D(d,a.topLeft).inverse();n=n.rightMul(p)}if(a=i(),!a.containsRect(o)){let d=o.center.minus(a.center),p=k.translation(d).inverse();n=n.rightMul(p)}return n.invertable()||(console.warn("Unable to zoom to ",o,"! Computed transform",n,"is singular."),n=k.identity),n}zoomTo(o,e=!0,r=!0){let n=this.computeZoomToTransform(o,e,r);return new s.ViewportTransform(n)}},U=Ee;var W=class s extends Ie{#e;constructor(o){if(super(),!(o in s.deserializationCallbacks))throw new Error(`Command ${o} must have a registered deserialization callback. To do this, call SerializableCommand.register.`);this.#e=o}static{this.deserializationCallbacks={}}serialize(){return{data:this.serializeToJSON(),commandType:this.#e}}static deserialize(o,e){let r=typeof o=="string"?JSON.parse(o):o,n=r.commandType;if(!(n in s.deserializationCallbacks))throw new Error(`Unrecognised command type ${n}!`);return s.deserializationCallbacks[n](r.data,e)}static register(o,e){s.deserializationCallbacks[o]=e}};var Ct=class extends W{constructor(o,e,r){super(o),this.component=r??null,this.componentID=e}resolveComponent(o){if(this.component)return;let e=o.lookupElement(this.componentID);if(!e)throw new Error(`Unable to resolve component with ID ${this.componentID}`);this.component=e}};var to=(r=>(r[r.BoundingBox=0]="BoundingBox",r[r.FillScreen=1]="FillScreen",r[r.Anywhere=2]="Anywhere",r))(to||{}),_=class s{constructor(o,e){this.componentKind=o;this.loadSaveData={};if(this.lastChangedTime=new Date().getTime(),e!==void 0?this.zIndex=e:this.zIndex=s.zIndexCounter++,this.id=`${new Date().getTime()}-${Math.random()}`,s.deserializationCallbacks[o]===void 0)throw new Error(`Component ${o} has not been registered using AbstractComponent.registerComponent`)}static{this.zIndexCounter=0}getId(){return this.id}static{this.deserializationCallbacks={}}static registerComponent(o,e){this.deserializationCallbacks[o]=e??null}attachLoadSaveData(o,e){this.loadSaveData[o]||(this.loadSaveData[o]=[]),this.loadSaveData[o].push(e)}getLoadSaveData(){return this.loadSaveData}getZIndex(){return this.zIndex}getBBox(){return this.contentBBox}getExactBBox(){return this.getBBox()}getSizingMode(){return 0}occludesEverythingBelowWhenRenderedInRect(o){return!1}onAddToImage(o){}onRemoveFromImage(){}intersectsRect(o){return o.containsRect(this.getExactBBox())?!0:o.getEdges().some(r=>this.intersects(r))}keyPoints(){return[this.getBBox().center]}isSelectable(){return!0}isBackground(){return!1}getProportionalRenderingTime(){return 1}transformBy(o){return new s.TransformElementCommand(o,this.getId(),this)}setZIndex(o){return new s.TransformElementCommand(k.identity,this.getId(),this,o)}setZIndexAndTransformBy(o,e,r){return new s.TransformElementCommand(o,this.getId(),this,e,r)}static{this.transformElementCommandId="transform-element"}static{this.TransformElementCommand=class extends Ct{constructor(e,r,n,i,a){super(s.transformElementCommandId,r,n);this.affineTransfm=e;this.origZIndex=a;this.targetZIndex=i??s.zIndexCounter++,this.targetZIndex>=s.zIndexCounter&&(s.zIndexCounter=this.targetZIndex+1),n&&a===void 0&&(this.origZIndex=n.getZIndex())}resolveComponent(e){this.component||(super.resolveComponent(e),this.origZIndex??=this.component.getZIndex())}updateTransform(e,r,n){if(!this.component)throw new Error("this.component is undefined or null!");let i=e.image.findParent(this.component),a=!1;i&&(i.remove(),a=!0),this.component.applyTransformation(r),this.component.zIndex=n,this.component.lastChangedTime=new Date().getTime(),n>=s.zIndexCounter&&(s.zIndexCounter=n+1),a&&q.addElement(this.component).apply(e)}apply(e){this.resolveComponent(e.image),this.updateTransform(e,this.affineTransfm,this.targetZIndex),e.queueRerender()}unapply(e){this.resolveComponent(e.image),this.updateTransform(e,this.affineTransfm.inverse(),this.origZIndex),e.queueRerender()}description(e,r){return r.transformedElements(1)}static{W.register(s.transformElementCommandId,(e,r)=>{let n=r.image.lookupElement(e.id)??void 0,i=new k(...e.transfm),a=e.targetZIndex,l=e.origZIndex??void 0;return new s.TransformElementCommand(i,e.id,n,a,l)})}serializeToJSON(){return{id:this.componentID,transfm:this.affineTransfm.toArray(),targetZIndex:this.targetZIndex,origZIndex:this.origZIndex}}}}clone(){let o=this.createClone();for(let e in this.loadSaveData)for(let r of this.loadSaveData[e])o.attachLoadSaveData(e,r);return o}serialize(){let o=this.serializeToJSON();if(o===null)throw new Error(`${this} cannot be serialized.`);return{name:this.componentKind,zIndex:this.zIndex,id:this.id,loadSaveData:this.loadSaveData,data:o}}static isNotDeserializable(o){return typeof o=="string"&&(o=JSON.parse(o)),typeof o!="object"||!this.deserializationCallbacks[o?.name]||!o.data}static deserialize(o){if(typeof o=="string"&&(o=JSON.parse(o)),s.isNotDeserializable(o))throw new Error(`Element with data ${o} cannot be deserialized.`);let e=this.deserializationCallbacks[o.name](o.data);return e.id=o.id,isFinite(o.zIndex)&&(e.zIndex=o.zIndex,s.zIndexCounter=Math.max(s.zIndexCounter,e.zIndex+1)),e}};var Fe=class{constructor(){this.listeners={}}dispatch(o,e){let r=this.listeners[o];if(r)for(let n=0;n<r.length;n++)r[n](e)}on(o,e){return this.listeners[o]||(this.listeners[o]=[]),this.listeners[o].push(e),{remove:()=>{let r=this.listeners[o];return this.off(o,e),r.length!==this.listeners[o].length}}}off(o,e){let r=this.listeners[o];r&&(this.listeners[o]=r.filter(n=>n!==e))}};function Ki(s){throw new Error(`Should be unreachable. Key: ${s}.`)}function ut(s,o=!1){if(typeof s!="number"||!o&&isNaN(s))throw new Error("Given value is not a number")}function Ea(s){if(!Array.isArray(s))throw new Error("Asserting isArray: Given entity is not an array")}function ko(s,o=!1){Ea(s),ut(s.length);for(let e of s)ut(e,o)}function zn(s){if(typeof s!="boolean")throw new Error("Given value is not a boolean")}function Gi(s){if(!s)throw new Error(`${JSON.stringify(s)} is not truthy`)}function yr(s){if(typeof s!="object")throw new Error(`AssertIsObject: Given entity is not an object (type = ${typeof s})`)}var Tt=s=>{s.sort((o,e)=>o.getContent().getZIndex()-e.getContent().getZIndex())};var xr=!1,q=class s{constructor(){this.componentCount=0;this.settingExportRect=!1;this.root=new wr,this.background=new wr,this.componentsById=Object.create(null),this.notifier=new Fe,this.importExportViewport=new U(()=>{this.onExportViewportChanged()}),this.importExportViewport.updateScreenSize(w.of(500,500)),this.shouldAutoresizeExportViewport=!1}getBackgroundComponents(){let o=[],e=this.background.getLeaves();Tt(e);for(let r of e){let n=r.getContent();n&&o.push(n)}return o}findParent(o){return this.background.getChildWithContent(o)??this.root.getChildWithContent(o)}queueRerenderOf(o){let e=this.findParent(o);e&&(e.remove(),this.addElementDirectly(o))}renderWithCache(o,e,r){this.background.render(o,r.visibleRect),xr?this.root.render(o,r.visibleRect):e.render(o,this.root,r)}render(o,e){this.background.render(o,e?.visibleRect),this.root.render(o,e?.visibleRect)}async renderAllAsync(o,e){return await this.background.renderAllAsync(o,e)?await this.root.renderAllAsync(o,e):!1}renderAll(o){this.render(o,null)}getAllElements(){let o=this.root.getLeaves();return Tt(o),o.map(e=>e.getContent())}estimateNumElements(){return this.componentCount}getElementsIntersectingRegion(o,e=!1){let r=this.root.getLeavesIntersectingRegion(o);return e&&(r=r.concat(this.background.getLeavesIntersectingRegion(o))),Tt(r),r.map(n=>n.getContent())}onDestroyElement(o){this.componentCount--,delete this.componentsById[o.getId()],this.autoresizeExportViewport()}onElementAdded(o){this.componentCount++,this.componentsById[o.getId()]=o,this.autoresizeExportViewport()}lookupElement(o){return this.componentsById[o]??null}addElementDirectly(o){o.onAddToImage(this);let r=(o.isBackground()?this.background:this.root).addLeaf(o);return this.onElementAdded(o),r}removeElementDirectly(o){let e=this.findParent(o);return e?.remove(),e?(this.onDestroyElement(o),!0):!1}static addElement(o,e=!1){return new s.AddElementCommand(o,e)}addElement(o,e){return s.addElement(o,e)}static{this.AddElementCommand=class extends W{constructor(e,r=!1){super("add-element");this.element=e;this.applyByFlattening=r;this.serializedElem=null;if(this.serializedElem=null,isNaN(e.getBBox().area))throw new Error("Elements in the image cannot have NaN bounding boxes")}apply(e){e.image.addElementDirectly(this.element),this.applyByFlattening?(this.applyByFlattening=!1,e.display.flatten()):e.queueRerender()}unapply(e){e.image.removeElementDirectly(this.element),e.queueRerender()}description(e,r){return r.addElementAction(this.element.description(r))}serializeToJSON(){return{elemData:this.serializedElem??this.element.serialize()}}static{W.register("add-element",(e,r)=>{let n=e.elemData.id,a=r.image.lookupElement(n)??_.deserialize(e.elemData),l=new s.AddElementCommand(a);return l.serializedElem=e.elemData,l})}}}getImportExportViewport(){return this.importExportViewport}getImportExportRect(){return this.getImportExportViewport().visibleRect}setImportExportRect(o){return s.SetImportExportRectCommand.of(this,o,!1)}getAutoresizeEnabled(){return this.shouldAutoresizeExportViewport}setAutoresizeEnabled(o){if(o===this.shouldAutoresizeExportViewport)return Ie.empty;let e=this.root.getBBox();return s.SetImportExportRectCommand.of(this,e,o)}setAutoresizeEnabledDirectly(o){o!==this.shouldAutoresizeExportViewport&&(this.shouldAutoresizeExportViewport=o,this.notifier.dispatch(1,{image:this}))}autoresizeExportViewport(){this.shouldAutoresizeExportViewport&&this.setExportRectDirectly(this.root.getBBox())}setExportRectDirectly(o){let e=this.getImportExportViewport(),r=e.getScreenRectSize(),n=e.canvasToScreenTransform,i=k.translation(o.topLeft.times(-1));return!r.eq(o.size)||!n.eq(i)?(this.settingExportRect=!0,e.updateScreenSize(o.size),e.resetTransform(i),this.settingExportRect=!1,this.onExportViewportChanged(),!0):!1}onExportViewportChanged(){this.settingExportRect||this.notifier.dispatch(0,{image:this})}static setDebugMode(o){xr=o}static{this.SetImportExportRectCommand=class extends W{constructor(e,r,n,i,a){super(s.SetImportExportRectCommand.commandId);this.originalSize=e;this.originalTransform=r;this.originalAutoresize=n;this.newExportRect=i;this.newAutoresize=a}static{this.commandId="set-import-export-rect"}static of(e,r,n){let i=e.getImportExportViewport(),a=i.visibleRect.size,l=i.canvasToScreenTransform,c=e.getAutoresizeEnabled();return new s.SetImportExportRectCommand(a,l,c,r,n)}apply(e){e.image.setAutoresizeEnabledDirectly(this.newAutoresize),e.image.setExportRectDirectly(this.newExportRect),e.queueRerender()}unapply(e){let r=e.image.getImportExportViewport();e.image.setAutoresizeEnabledDirectly(this.originalAutoresize),r.updateScreenSize(this.originalSize),r.resetTransform(this.originalTransform),e.queueRerender()}description(e,r){return this.newAutoresize!==this.originalAutoresize?this.newAutoresize?r.enabledAutoresizeOutputCommand:r.disabledAutoresizeOutputCommand:r.resizeOutputCommand(this.newExportRect)}serializeToJSON(){return{originalSize:this.originalSize.xy,originalTransform:this.originalTransform.toArray(),newRegion:{x:this.newExportRect.x,y:this.newExportRect.y,w:this.newExportRect.w,h:this.newExportRect.h},autoresize:this.newAutoresize,originalAutoresize:this.originalAutoresize}}static{let e=this.commandId;W.register(e,(r,n)=>{ut(r.originalSize.x),ut(r.originalSize.y),ko(r.originalTransform),ko([r.newRegion.x,r.newRegion.y,r.newRegion.w,r.newRegion.h]),zn(r.autoresize??!1),zn(r.originalAutoresize??!1);let i=w.ofXY(r.originalSize),a=new k(...r.originalTransform),l=new I(r.newRegion.x,r.newRegion.y,r.newRegion.w,r.newRegion.h),c=r.autoresize??!1,d=r.originalAutoresize??!1;return new s.SetImportExportRectCommand(i,a,d,l,c)})}}}},Ln=(s,o)=>{let e=0;if(o){for(let r=s.length-1;r>=1;r--)if(s[r].getBBox().containsRect(o)&&s[r].getContent()?.occludesEverythingBelowWhenRenderedInRect(o)){e=r;break}}return e},Ro=class s{constructor(o=null){this.parent=o;this.targetChildCount=30;this.children=[],this.bbox=I.empty,this.content=null,this.id=s.idCounter++}static{this.idCounter=0}getId(){return this.id}onContentChange(){this.id=s.idCounter++}getContent(){return this.content}getParent(){return this.parent}getChildrenIntersectingRegion(o,e){return this.children.filter(r=>{let n=r.getBBox();return!e?.(n)&&n.intersects(o)})}getChildrenOrSelfIntersectingRegion(o,e){return this.content&&this.bbox.intersects(o)&&!e?.(this.bbox)?[this]:this.getChildrenIntersectingRegion(o,e)}getLeavesIntersectingRegion(o,e){let r=[],n=[];for(n.push(this);n.length>0;){let a=n.pop().getChildrenOrSelfIntersectingRegion(o,e);for(let l of a)l.content?r.push(l):n.push(l)}return r}getChildWithContent(o){let e=this.getLeavesIntersectingRegion(o.getBBox());for(let r of e)if(r.getContent()===o)return r;return null}getLeaves(){if(this.content)return[this];let o=[];for(let e of this.children)o.push(...e.getLeaves());return o}addLeaf(o){if(this.onContentChange(),this.content===null&&this.children.length===0)return this.content=o,this.recomputeBBox(!0),this;if(this.content!==null){console.assert(this.children.length===0);let i=new s(this);i.content=this.content,this.content=null,this.children.push(i),i.recomputeBBox(!1)}let e=o.getBBox();if(e.containsRect(this.getBBox())){let i=new s(this);if(this.children.length<this.targetChildCount)this.children.push(i);else{let a=new s(this);a.children=this.children,this.children=[i,a],a.updateParents(),a.recomputeBBox(!0)}return i.addLeaf(o)}let r=this.children.filter(i=>i.getBBox().containsRect(e));if(r.length>0&&this.children.length>=this.targetChildCount){r.sort((a,l)=>a.getBBox().area-l.getBBox().area);let i=r[0].addLeaf(o);return i.rebalance(),i}let n=s.createLeafNode(this,o);return this.children.push(n),n.recomputeBBox(!0),this.children.length>=this.targetChildCount&&this.rebalance(),n}static createLeafNode(o,e){let r=new s(o);return r.content=e,r}getBBox(){return this.bbox}recomputeBBox(o){let e=this.bbox;this.content!==null?this.bbox=this.content.getBBox():this.bbox=I.union(...this.children.map(r=>r.getBBox())),o&&!e.eq(this.bbox)&&(this.bbox.containsRect(e)?this.parent?.unionBBoxWith(this.bbox):this.parent?.recomputeBBox(!0)),this.checkRep()}unionBBoxWith(o){this.bbox=this.bbox.union(o),this.parent?.unionBBoxWith(o)}updateParents(o=!1){for(let e of this.children)e.parent=this,o&&e.updateParents(o)}rebalance(){if(this.parent&&this.parent.children.length===1){console.assert(this.parent.content===null),console.assert(this.parent.children[0]===this);let o=this.parent;if(o.parent!==null){let e=o.parent;e.children=e.children.filter(r=>r!==o),o.parent=null,o.children=[],this.parent=e,e.children.push(this),this.parent.recomputeBBox(!1)}else this.content===null&&(this.parent.children=this.children,this.parent.updateParents(),this.parent=null)}if(this.children.length>this.targetChildCount*10){let o=this.getBBox().divideIntoGrid(4,4),e=[];for(;e.length<o.length;)e.push(0);for(let a of this.children)for(let l=0;l<o.length;l++)o[l].containsRect(a.getBBox())&&e[l]++;let r=0,n=e[0];for(let a=1;a<e.length;a++)e[a]>n&&(r=a,n=e[a]);let i=o[r];if(n>4){let a=[],l=[];for(let c of this.children)i.containsRect(c.getBBox())?l.push(c):a.push(c);if(l.length<this.children.length){this.children=a;let c=new s(this);this.children.push(c),c.children=l,c.updateParents(!1),c.recomputeBBox(!1),c.rebalance()}}}this.parent&&this.children.length===0&&this.content===null&&this.remove()}removeChild(o){this.checkRep();let e=this.children.length;this.children=this.children.filter(r=>r!==o),console.assert(this.children.length===e-1,`${e-1} \u2260 ${this.children.length} after removing all nodes equal to ${o}. Nodes should only be removed once.`),this.children.forEach(r=>{r.rebalance()}),this.recomputeBBox(!0),this.rebalance(),this.checkRep()}remove(){if(this.content?.onRemoveFromImage(),!this.parent){this.content=null,this.children=[];return}this.parent.removeChild(this),this.parent=null,this.content=null,this.children=[],this.checkRep()}async renderAllAsync(o,e){let r=this.getLeaves();Tt(r);let n=r.length;for(let i=0;i<n;i++){let l=r[i].getContent();if(!l)continue;if(!await e(l,i,n))return!1;l.render(o,void 0)}return!0}render(o,e){let r;e?r=this.getLeavesIntersectingRegion(e,i=>o.isTooSmallToRender(i)):r=this.getLeaves(),Tt(r);let n=Ln(r);for(let i=n;i<r.length;i++)r[i].getContent().render(o,e);xr&&e&&(n!==0&&console.log("EditorImage: skipped ",n,"nodes due to occlusion"),this.renderDebugBoundingBoxes(o,e))}renderDebugBoundingBoxes(o,e,r=0){let n=this.getBBox(),i=1/(o.getSizeOfCanvasPixelOnScreen()||1);if(n.maxDimension<3*i||!n.intersects(e))return;o.startObject(n);let a=!!this.content,l=a?L.ofRGBA(1,0,1,.4):L.ofRGBA(0,1,Math.sin(r),.6),c=a?1*i:2*i;if(o.drawRect(n.intersection(e),c,{fill:l}),o.endObject(),n.maxDimension>e.maxDimension/3){let d={fontFamily:"monospace",size:n.minDimension/20,renderingStyle:{fill:L.red}};o.drawText(`Depth: ${r}`,k.translation(n.bottomLeft),d)}for(let d of this.children)d.renderDebugBoundingBoxes(o,e,r+1)}checkRep(o=0){if(xr){if(this.parent&&!this.parent.children.includes(this))throw new Error(`Parent does not have this node as a child. (depth: ${o})`);let e=null,r=new Set;for(let i of this.children){if(e??=i.getBBox(),e=e.union(i.getBBox()),i.parent!==this)throw new Error(`Child with bbox ${i.getBBox()} and ${i.children.length} has wrong parent (was ${i.parent}).`);if(r.has(i))throw new Error(`Child ${i} is present twice or more in its parent's child list`);r.add(i)}let n=this.bbox.minDimension/100;if(e&&!this.bbox.eq(e,n))throw new Error(`Wrong bounding box ${e} \\neq ${this.bbox} (depth: ${o})`)}}},wr=class extends Ro{constructor(){super(...arguments);this.fullscreenChildren=[];this.dataComponents=[]}getChildrenIntersectingRegion(e,r){let n=super.getChildrenIntersectingRegion(e);for(let i of this.fullscreenChildren)n.push(i);return n}getChildrenOrSelfIntersectingRegion(e,r){let n=this.getContent();return n&&n.getSizingMode()===1?[this]:super.getChildrenOrSelfIntersectingRegion(e,r)}getLeaves(){let e=super.getLeaves();return this.dataComponents.concat(this.fullscreenChildren,e)}removeChild(e){let r=!1,n=i=>{let a=i===e;return r||=a,!a};this.dataComponents=this.dataComponents.filter(n),this.fullscreenChildren=this.fullscreenChildren.filter(n),r||super.removeChild(e)}getChildWithContent(e){let r=()=>{let n=this.fullscreenChildren.concat(this.dataComponents);for(let i of n)if(i.getContent()===e)return i;return null};return e.getSizingMode()===0?super.getChildWithContent(e)??r():super.getChildWithContent(e)??r()}addLeaf(e){let r=e.getSizingMode();if(r===0)return super.addLeaf(e);if(r===1){this.onContentChange();let n=Ro.createLeafNode(this,e);return this.fullscreenChildren.push(n),n}else if(r===2){this.onContentChange();let n=Ro.createLeafNode(this,e);return this.dataComponents.push(n),n}else{let n=r;throw new Error(`Invalid sizing mode, ${r}`)}}};var Y=(g=>(g[g.ToolEnabled=0]="ToolEnabled",g[g.ToolDisabled=1]="ToolDisabled",g[g.ToolUpdated=2]="ToolUpdated",g[g.UndoRedoStackUpdated=3]="UndoRedoStackUpdated",g[g.CommandDone=4]="CommandDone",g[g.CommandUndone=5]="CommandUndone",g[g.ObjectAdded=6]="ObjectAdded",g[g.ViewportChanged=7]="ViewportChanged",g[g.DisplayResized=8]="DisplayResized",g[g.SelectionUpdated=9]="SelectionUpdated",g[g.ReadOnlyModeToggled=10]="ReadOnlyModeToggled",g[g.ColorPickerToggled=11]="ColorPickerToggled",g[g.ColorPickerColorSelected=12]="ColorPickerColorSelected",g[g.ToolbarDropdownShown=13]="ToolbarDropdownShown",g))(Y||{}),In=(r=>(r[r.CommandDone=0]="CommandDone",r[r.CommandUndone=1]="CommandUndone",r[r.CommandRedone=2]="CommandRedone",r))(In||{});var Ge=(a=>(a[a.Pen=0]="Pen",a[a.Eraser=1]="Eraser",a[a.Touch=2]="Touch",a[a.PrimaryButtonMouse=3]="PrimaryButtonMouse",a[a.RightButtonMouse=4]="RightButtonMouse",a[a.Other=5]="Other",a))(Ge||{}),ke=class s{constructor(o,e,r,n,i,a,l,c){this.screenPos=o;this.canvasPos=e;this.pressure=r;this.isPrimary=n;this.down=i;this.device=a;this.id=l;this.timeStamp=c}snappedToGrid(o){let e=o.snapToGrid(this.canvasPos);return this.withCanvasPosition(e,o)}lockedToXYAxesScreen(o,e){let n=this.screenPos.minus(o),i=w.unitX.times(n.x),a=w.unitY.times(n.y),l;return n.dot(i)>n.dot(a)?l=i:l=a,l=l.plus(o),this.withScreenPosition(l,e)}withScreenPosition(o,e){let r=e.screenToCanvas(o);return this.withCanvasPosition(r,e)}withTimestamp(o){return new s(this.screenPos,this.canvasPos,this.pressure,this.isPrimary,this.down,this.device,this.id,o)}withCanvasPosition(o,e){let r=e.canvasToScreen(o);return new s(r,o,this.pressure,this.isPrimary,this.down,this.device,this.id,this.timeStamp)}static ofEvent(o,e,r,n){let i=w.of(o.clientX,o.clientY);if(n){let p=n.getBoundingClientRect();i=i.minus(w.of(p.left,p.top))}let l={mouse:3,pen:0,touch:2}[o.pointerType]??5;l===0&&o.buttons&32&&(l=1);let d=o.timeStamp,u=r.roundPoint(r.screenToCanvas(i));return l===3&&o.buttons&2&&(l=4),new s(i,u,o.pressure??null,o.isPrimary,e,l,o.pointerId,d)}static ofCanvasPoint(o,e,r,n=0,i=0,a=!0,l=null,c=null){let d=r.canvasToScreen(o);return c??=performance.now(),new s(d,o,l,a,e,i,n,c)}static ofScreenPoint(o,e,r,n=0,i=0,a=!0,l=null,c=null){let d=r.screenToCanvas(o);return c??=performance.now(),new s(o,d,l,a,e,i,n,c)}};var ka=()=>new Promise(s=>{requestAnimationFrame(()=>s())}),Ye=ka;var He=(u=>(u[u.PointerDownEvt=0]="PointerDownEvt",u[u.PointerMoveEvt=1]="PointerMoveEvt",u[u.PointerUpEvt=2]="PointerUpEvt",u[u.GestureCancelEvt=3]="GestureCancelEvt",u[u.WheelEvt=4]="WheelEvt",u[u.KeyPressEvent=5]="KeyPressEvent",u[u.KeyUpEvent=6]="KeyUpEvent",u[u.CopyEvent=7]="CopyEvent",u[u.PasteEvent=8]="PasteEvent",u[u.ContextMenu=9]="ContextMenu",u))(He||{}),ji=(s,o)=>({kind:s,key:o.key,code:o.code,ctrlKey:o.ctrlKey||o.metaKey,altKey:o.altKey,shiftKey:o.shiftKey}),zo=s=>ji(6,s),Lo=s=>ji(5,s),oo=s=>s.kind===0||s.kind===1||s.kind===2;var _i={remove(){}},Ra=()=>_i,j=class s{waitForNextUpdate(){return new Promise(o=>{let e=this.onUpdate(r=>{e.remove(),o(r)})})}static fromInitialValue(o){return new Cr(o)}static fromImmutable(o){return{get:()=>o,onUpdate:Ra,onUpdateAndNow:e=>(e(o),_i),waitForNextUpdate:()=>new Promise(()=>{})}}static fromCallback(o,e){let r=new Cr(o()),n=typeof WeakRef<"u"?new WeakRef(r):{deref:()=>r};for(let i of e){let a=i.onUpdate(()=>{let l=n.deref();l?l.set(o()):a.remove()})}return r}static map(o,e,r){let n=s.fromInitialValue(e(o.get())),i=n.get();return o.onUpdate(a=>{i=e(a),n.set(i)}),r&&n.onUpdate(a=>{a!==i&&o.set(r(a))}),n}static union(o){return s.fromCallback(()=>o.map(e=>e.get()),o)}},te=class extends j{static fromProperty(o,e){let r=j.fromInitialValue(o.get()[e]),n=typeof WeakRef<"u"?new WeakRef(r):{deref:()=>r},i=o.onUpdate(a=>{let l=n.deref();l?l.set(a[e]):i.remove()});return r.onUpdate(a=>{o.set({...o.get(),[e]:a})}),r}},Cr=class extends te{#e;#t;constructor(o){super(),this.#e=o,this.#t=[]}set(o){if(this.#e!==o){this.#e=o;for(let e of this.#t)e(o)}}get(){return this.#e}onUpdate(o){return this.#t.push(o),{remove:()=>{this.#t=this.#t.filter(e=>e!==o)}}}onUpdateAndNow(o){return o(this.get()),this.onUpdate(o)}},Tr=j;var K=class{constructor(o,e){this.notifier=o;this.description=e;this.#e=j.fromInitialValue(!0),this.#e.onUpdate(r=>{r?(this.#t?.notifyEnabled(this),this.notifier.dispatch(0,{kind:0,tool:this})):this.notifier.dispatch(1,{kind:1,tool:this})})}#e;#t=null;#o=null;#r=null;canReceiveInputInReadOnlyEditor(){return!1}setInputMapper(o){this.#o=o,o&&o.setEmitListener(e=>this.dispatchEventToCallback(e))}getInputMapper(){return this.#o}dispatchEventToCallback(o){let e;switch(o.kind){case 0:return this.onPointerDown(o);case 1:this.onPointerMove(o);break;case 2:return this.onPointerUp(o)??!1;case 3:this.onGestureCancel(o);break;case 4:return this.onWheel(o);case 5:return this.onKeyPress(o);case 6:return this.onKeyUp(o);case 7:return this.onCopy(o);case 8:return this.onPaste(o);case 9:return this.onContextMenu(o);default:return e=o,e}return!0}onEvent(o){return this.#o?this.#o.onEvent(o):this.dispatchEventToCallback(o)}onPointerDown(o){return!1}onPointerMove(o){}onPointerUp(o){}onGestureCancel(o){}onWheel(o){return!1}onCopy(o){return!1}onPaste(o){return!1}onKeyPress(o){return!1}onKeyUp(o){return!1}onContextMenu(o){return!1}eventCanBeDeliveredToNonActiveTool(o){return!0}setEnabled(o){this.#e.set(o)}isEnabled(){return this.#e.get()}enabledValue(){return this.#e}setToolGroup(o){this.isEnabled()&&o.notifyEnabled(this),this.#t=o}getToolGroup(){return this.#t?this.#t:null}onDestroy(){this.#r?.remove(),this.#r=null,this.#t=null}};var qi={updatedViewport:"Transformed Viewport",transformedElements:s=>`Transformed ${s} element${s===1?"":"s"}`,resizeOutputCommand:s=>`Resized image to ${s.w}x${s.h}`,enabledAutoresizeOutputCommand:"Enabled output autoresize",disabledAutoresizeOutputCommand:"Disabled output autoresize",addElementAction:s=>`Added ${s}`,eraseAction:(s,o)=>`Erased ${o} ${s}`,duplicateAction:(s,o)=>`Duplicated ${o} ${s}`,unionOf:(s,o)=>`Union: ${o} ${s}`,inverseOf:s=>`Inverse of ${s}`,elements:"Elements",erasedNoElements:"Erased nothing",duplicatedNoElements:"Duplicated nothing",rotatedBy:s=>`Rotated by ${Math.abs(s)} degrees ${s<0?"clockwise":"counter-clockwise"}`,movedLeft:"Moved left",movedUp:"Moved up",movedDown:"Moved down",movedRight:"Moved right",zoomedOut:"Zoomed out",zoomedIn:"Zoomed in",andNMoreCommands:s=>`And ${s} more commands.`,selectedElements:s=>`Selected ${s} element${s===1?"":"s"}`};var Zi={unlabeledImageNode:"Unlabeled image node",stroke:"Stroke",svgObject:"SVG Object",emptyBackground:"Empty background",gridBackground:"Grid background",filledBackgroundWithColor:s=>`Filled background (${s})`,text:s=>`Text object: ${s}`,imageNode:s=>`Image: ${s}`,restyledElement:s=>`Restyled ${s}`};var Yi={pathNodeCount:s=>`There are ${s} visible path objects.`,textNodeCount:s=>`There are ${s} visible text nodes.`,imageNodeCount:s=>`There are ${s} visible image nodes.`,textNode:s=>`Text: ${s}`,imageNode:s=>`Image: ${s}`,unlabeledImageNode:"Unlabeled image",rerenderAsText:"Re-render as text"};var Xi={help:"Help",helpHidden:"Help hidden",next:"Next",previous:"Previous",close:"Close",helpScreenNavigationHelp:"Click on a control for more information."};var ro={...Xi,pen:"Pen",eraser:"Eraser",select:"Select",handTool:"Pan",zoom:"Zoom",image:"Image",reformatSelection:"Format selection",inputAltText:"Alt text",decreaseImageSize:"Decrease size",resetImage:"Reset",chooseFile:"Choose file",dragAndDropHereOrBrowse:`Drag and drop here
5
5
  or
6
- {{browse}}`,submit:"Submit",addAll:"Add all",cancel:"Cancel",resetView:"Reset view",thicknessLabel:"Thickness",colorLabel:"Color",fontLabel:"Font",textSize:"Size",resizeImageToSelection:"Resize image to selection",deleteSelection:"Delete selection",duplicateSelection:"Duplicate selection",exit:"Exit",save:"Save",undo:"Undo",redo:"Redo",fullStrokeEraser:"Full stroke eraser",selectPenType:"Pen type",selectShape:"Shape",pickColorFromScreen:"Pick color from screen",clickToPickColorAnnouncement:"Click on the screen to pick a color",colorSelectionCanceledAnnouncement:"Color selection canceled",selectionToolKeyboardShortcuts:"Selection tool: Use arrow keys to move selected items, lowercase/uppercase \u2018i\u2019 and \u2018o\u2019 to resize.",documentProperties:"Page",backgroundColor:"Background color",imageWidthOption:"Width",imageHeightOption:"Height",useGridOption:"Grid",enableAutoresizeOption:"Auto-resize",toggleOverflow:"More",about:"About",inputStabilization:"Stabilization",strokeAutocorrect:"Autocorrect",touchPanning:"Scroll with touch",roundedTipPen:"Round",roundedTipPen2:"Polyline",flatTipPen:"Flat",arrowPen:"Arrow",linePen:"Line",outlinedRectanglePen:"Outlined rectangle",filledRectanglePen:"Filled rectangle",outlinedCirclePen:"Outlined circle",lockRotation:"Lock rotation",paste:"Paste",errorImageHasZeroSize:"Error: Image has zero size",describeTheImage:"Image description",fileInput__loading:"Loading...",fileInput__andNMoreFiles:s=>`(...${s} more)`,penDropdown__baseHelpText:"This tool draws shapes or freehand lines.",penDropdown__colorHelpText:"Changes the pen's color",penDropdown__thicknessHelpText:"Changes the thickness of strokes drawn by the pen.",penDropdown__penTypeHelpText:`Changes the pen style.
6
+ {{browse}}`,submit:"Submit",addAll:"Add all",cancel:"Cancel",resetView:"Reset view",thicknessLabel:"Thickness",colorLabel:"Color",fontLabel:"Font",textSize:"Size",resizeImageToSelection:"Resize image to selection",deleteSelection:"Delete selection",duplicateSelection:"Duplicate selection",exit:"Exit",save:"Save",undo:"Undo",redo:"Redo",fullStrokeEraser:"Full stroke eraser",selectPenType:"Pen type",selectShape:"Shape",pickColorFromScreen:"Pick color from screen",clickToPickColorAnnouncement:"Click on the screen to pick a color",colorSelectionCanceledAnnouncement:"Color selection canceled",selectionTool__lassoSelect:"Freeform selection",selectionTool__lassoSelect__help:"When enabled, dragging creates a freeform (lasso) selection.",selectionToolKeyboardShortcuts:"Selection tool: Use arrow keys to move selected items, lowercase/uppercase \u2018i\u2019 and \u2018o\u2019 to resize.",documentProperties:"Page",backgroundColor:"Background color",imageWidthOption:"Width",imageHeightOption:"Height",useGridOption:"Grid",enableAutoresizeOption:"Auto-resize",toggleOverflow:"More",about:"About",inputStabilization:"Stabilization",strokeAutocorrect:"Autocorrect",touchPanning:"Scroll with touch",roundedTipPen:"Round",roundedTipPen2:"Polyline",flatTipPen:"Flat",arrowPen:"Arrow",linePen:"Line",outlinedRectanglePen:"Outlined rectangle",filledRectanglePen:"Filled rectangle",outlinedCirclePen:"Outlined circle",lockRotation:"Lock rotation",paste:"Paste",errorImageHasZeroSize:"Error: Image has zero size",describeTheImage:"Image description",fileInput__loading:"Loading...",fileInput__andNMoreFiles:s=>`(...${s} more)`,penDropdown__baseHelpText:"This tool draws shapes or freehand lines.",penDropdown__colorHelpText:"Changes the pen's color",penDropdown__thicknessHelpText:"Changes the thickness of strokes drawn by the pen.",penDropdown__penTypeHelpText:`Changes the pen style.
7
7
 
8
8
  Either a \u201Cpen\u201D style or \u201Cshape\u201D can be chosen. Choosing a \u201Cpen\u201D style draws freehand lines. Choosing a \u201Cshape\u201D draws shapes.`,penDropdown__autocorrectHelpText:`Converts approximate freehand lines and rectangles to perfect ones.
9
9
 
@@ -15,10 +15,10 @@ When not in full-stroke mode, shapes can be partially erased.`,selectionDropdown
15
15
 
16
16
  If auto-resize is enabled, it will be disabled.`,selectionDropdown__deleteHelpText:"Erases selected items.",selectionDropdown__duplicateHelpText:"Makes a copy of selected items.",selectionDropdown__changeColorHelpText:"Changes the color of selected items.",pageDropdown__baseHelpText:"Controls the drawing canvas' background color, pattern, and size.",pageDropdown__backgroundColorHelpText:"Changes the background color of the drawing canvas.",pageDropdown__gridCheckboxHelpText:"Enables/disables a background grid pattern.",pageDropdown__autoresizeCheckboxHelpText:`When checked, the page grows to fit the drawing.
17
17
 
18
- When unchecked, the page is visible and its size can be set manually.`,pageDropdown__aboutButtonHelpText:"Shows version, debug, and other information.",colorPickerPipetteHelpText:"Picks a color from the screen.",colorPickerToggleHelpText:"Opens/closes the color picker.",closeSidebar:s=>`Close sidebar for ${s}`,dropdownShown:s=>`Menu for ${s} shown`,dropdownHidden:s=>`Menu for ${s} hidden`,zoomLevel:s=>`Zoom: ${s}%`,colorChangedAnnouncement:s=>`Color changed to ${s}`,imageSize:(s,o)=>`Image size: ${s} ${o}`,imageLoadError:s=>`Error loading image: ${s}`};var qi={penTool:s=>`Pen ${s}`,selectionTool:"Selection",selectAllTool:"Select all shortcut",eraserTool:"Eraser",touchPanTool:"Touch panning",twoFingerPanZoomTool:"Panning and zooming",undoRedoTool:"Undo/Redo",rightClickDragPanTool:"Right-click drag",pipetteTool:"Pick color from screen",keyboardPanZoom:"Keyboard pan/zoom shortcuts",selectionMenu__show:"Show selection menu",selectionMenu__copyToClipboard:"Copy to clipboard",selectionMenu__duplicate:"Duplicate",selectionMenu__delete:"Delete",selectionMenu__paste:"Paste",copyPasteError__heading:"Copy/paste",copyPasteError__description:"Something went wrong \u2014 this tool may not have clipboard access.",copyPasteError__errorDetails:"Show error",copyPasteError__pasteRetry:"To retry, please paste into the input box below:",copyPasteError__copyRetry:"To retry, please copy the text in the input box below:",copyPasteError__copyMe:"Copy me!",autocorrectedTo:s=>`Autocorrected to ${s}`,autocorrectionCanceled:"Autocorrect cancelled",textTool:"Text",enterTextToInsert:"Text to insert",changeTool:"Change tool",pasteHandler:"Copy paste handler",soundExplorer:"Sound-based image exploration",disableAccessibilityExploreTool:"Disable sound-based exploration",enableAccessibilityExploreTool:"Enable sound-based exploration",soundExplorerUsageAnnouncement:"Sound-based image exploration enabled: Click/drag the screen to play a sound representation of different parts of the image.",findLabel:"Find",toNextMatch:"Next",closeDialog:"Close",findDialogShown:"Find dialog shown",findDialogHidden:"Find dialog hidden",focusedFoundText:(s,o)=>`Viewing match ${s} of ${o}`,anyDevicePanning:"Any device panning",copied:s=>`Copied ${s} item(s)`,pasted:s=>`Pasted ${s} item(s)`,toolEnabledAnnouncement:s=>`${s} enabled`,toolDisabledAnnouncement:s=>`${s} disabled`};var Xe={...eo,...qi,...Wi,...Ki,...Gi,accessibilityInputInstructions:['Press "t" to read the contents of the viewport as text.',"Use the arrow keys to move the viewport, click and drag to draw strokes.",'Press "w" to zoom in and "s" to zoom out.'].join(" "),loading:s=>`Loading ${s}%...`,imageEditor:"Image Editor",doneLoading:"Done loading",undoAnnouncement:s=>`Undid ${s}`,redoAnnouncement:s=>`Redid ${s}`,softwareLibraries:"Libraries",developerInformation:"Developer information"};var Ta={...Xe,pen:"Stift",eraser:"Radierer",select:"Auswahl",handTool:"Verschieben",zoom:"Vergr\xF6\xDFerung",image:"Bild",inputAltText:"Alt-Text: ",chooseFile:"W\xE4hle Datei: ",submit:"Absenden",cancel:"Abbrechen",resetView:"Ansicht zur\xFCcksetzen",thicknessLabel:"Dicke: ",colorLabel:"Farbe: ",fontLabel:"Schriftart: ",textSize:"Gr\xF6\xDFe: ",resizeImageToSelection:"Bildgr\xF6\xDFe an Auswahl anpassen",deleteSelection:"Auswahl l\xF6schen",duplicateSelection:"Auswahl duplizieren",undo:"R\xFCckg\xE4ngig",redo:"Wiederholen",pickColorFromScreen:"Farbe von Bildschirm ausw\xE4hlen",clickToPickColorAnnouncement:"Klicke auf den Bildschirm, um eine Farbe auszuw\xE4hlen",selectionToolKeyboardShortcuts:"Auswahl-Werkzeug: Verwende die Pfeiltasten, um ausgew\xE4hlte Elemente zu verschieben und \u201Ai\u2018 und \u201Ao\u2018, um ihre Gr\xF6\xDFe zu \xE4ndern.",touchPanning:"Ansicht mit Touchscreen verschieben",anyDevicePanning:"Ansicht mit jedem Eingabeger\xE4t verschieben",selectPenType:"Objekt-Typ: ",roundedTipPen:"Freihand",flatTipPen:"Stift (druckempfindlich)",arrowPen:"Pfeil",linePen:"Linie",outlinedRectanglePen:"Umrissenes Rechteck",filledRectanglePen:"Ausgef\xFClltes Rechteck",lockRotation:"Sperre Rotation",paste:"Einf\xFCgen",dropdownShown:s=>`Dropdown-Men\xFC f\xFCr ${s} angezeigt`,dropdownHidden:s=>`Dropdown-Men\xFC f\xFCr ${s} versteckt`,zoomLevel:s=>`Verg\xF6\xDFerung: ${s}%`,colorChangedAnnouncement:s=>`Farbe zu ${s} ge\xE4ndert`,imageSize:(s,o)=>`Bild-Gr\xF6\xDFe: ${s} ${o}`,imageLoadError:s=>`Fehler beim Laden des Bildes: ${s}`,errorImageHasZeroSize:"Fehler: Bild hat Gr\xF6\xDFe Null",penTool:s=>`Stift ${s}`,selectionTool:"Auswahl",eraserTool:"Radiergummi",touchPanTool:"Ansicht mit Touchscreen verschieben",twoFingerPanZoomTool:"Ansicht verschieben und vergr\xF6\xDFern",undoRedoTool:"R\xFCckg\xE4ngig/Wiederholen",rightClickDragPanTool:"Rechtsklick-Ziehen",pipetteTool:"Farbe von Bildschirm ausw\xE4hlen",keyboardPanZoom:"Tastaturk\xFCrzel zum Verschieben/Vergr\xF6\xDFern der Ansicht",textTool:"Text",enterTextToInsert:"Einzuf\xFCgender Text",changeTool:"Wechsle Werkzeug",pasteHandler:"Copy-Paste-Handler",findLabel:"Finde",toNextMatch:"N\xE4chstes",closeDialog:"Schlie\xDFen",findDialogShown:"Finde-Dialog angezeigt",findDialogHidden:"Finde-Dialog versteckt",focusedFoundText:(s,o)=>`Sieh Treffer ${s} von ${o} an`,toolEnabledAnnouncement:s=>`${s} aktiviert`,toolDisabledAnnouncement:s=>`${s} deaktiviert`,updatedViewport:"Transformierte Ansicht",transformedElements:s=>`${s} Element${s===1?"":"e"} transformiert`,resizeOutputCommand:s=>`Bildgr\xF6\xDFe auf ${s.w}x${s.h} ge\xE4ndert`,addElementAction:s=>`${s} hinzugef\xFCgt`,eraseAction:(s,o)=>`${o} ${s} gel\xF6scht`,duplicateAction:(s,o)=>`${o} ${s} dupliziert`,inverseOf:s=>`${s} umgekehrt`,elements:"Elemente",erasedNoElements:"Nichts entfernt",duplicatedNoElements:"Nichts dupliziert",rotatedBy:s=>`${Math.abs(s)} Grad ${s<0?"im Uhrzeigersinn":"gegen den Uhrzeigersinn"} gedreht`,movedLeft:"Nacht links bewegt",movedUp:"Nacht oben bewegt",movedDown:"Nacht unten bewegt",movedRight:"Nacht rechts bewegt",zoomedOut:"Ansicht verkleinert",zoomedIn:"Ansicht vergr\xF6\xDFert",selectedElements:s=>`${s} Element${s===1?"":"e"} ausgew\xE4hlt`,stroke:"Strich",svgObject:"SVG-Objekt",text:s=>`Text-Objekt: ${s}`,pathNodeCount:s=>`Es gibt ${s} sichtbare Pfad-Objekte.`,textNodeCount:s=>`Es gibt ${s} sichtbare Text-Knotenpunkte.`,textNode:s=>`Text: ${s}`,imageNodeCount:s=>`Es gibt ${s} sichtbare Bild-Knoten.`,imageNode:s=>`Bild: ${s}`,unlabeledImageNode:"Bild ohne Label",rerenderAsText:"Als Text darstellen",accessibilityInputInstructions:"Dr\xFCcke \u201At\u2018, um den Inhalt des Ansichtsfensters als Text zu lesen. Verwende die Pfeiltasten, um die Ansicht zu verschieben, und klicke und ziehe, um Striche zu zeichnen. Dr\xFCcke \u201Aw\u2018 zum Vergr\xF6\xDFern und \u201As\u2018 zum Verkleinern der Ansicht.",loading:s=>`Laden ${s}%...`,doneLoading:"Laden fertig",imageEditor:"Bild-Editor",undoAnnouncement:s=>`${s} r\xFCckg\xE4ngig gemacht`,redoAnnouncement:s=>`${s} wiederholt`,reformatSelection:"Formatiere Auswahl",documentProperties:"Seite",backgroundColor:"Hintergrundfarbe: ",imageWidthOption:"Breite: ",imageHeightOption:"H\xF6he: ",useGridOption:"Gitter: ",toggleOverflow:"Mehr",selectAllTool:"Alle ausw\xE4hlen",soundExplorer:"Klangbasierte Bilderkundung",disableAccessibilityExploreTool:"Deaktiviere klangbasierte Erkundung",enableAccessibilityExploreTool:"Aktiviere klangbasierte Erkundung",unionOf:(s,o)=>`Vereinigung: ${o} ${s}`,emptyBackground:"Leerer Hintergrund",filledBackgroundWithColor:s=>`Gef\xFCllter Hintergrund (${s})`,restyledElement:s=>`${s} umgestaltet`},_i=Ta;var Sa={...Xe},Zi=Sa;var Pa={...Xe,pen:"Lapiz",eraser:"Borrador",select:"Selecciona",handTool:"Mover",image:"Imagen",inputAltText:"Texto alternativo",resetImage:"Reiniciar",chooseFile:"Seleccionar archivo",cancel:"Cancelar",resetView:"Reiniciar vista",thicknessLabel:"Tama\xF1o",fontLabel:"Fuente:",textSize:"Tama\xF1o",resizeImageToSelection:"Redimensionar la imagen a lo que est\xE1 seleccionado",deleteSelection:"Borra la selecci\xF3n",duplicateSelection:"Duplica la selecci\xF3n",exit:"Salir",save:"Guardar",undo:"Deshace",redo:"Rehace",selectPenType:"Punta",selectShape:"Forma",pickColorFromScreen:"Selecciona un color de la pantalla",clickToPickColorAnnouncement:"Haga un clic en la pantalla para seleccionar un color",documentProperties:"Fondo",backgroundColor:"Color de fondo",imageWidthOption:"Ancho",imageHeightOption:"Alto",enableAutoresizeOption:"Redimensionar autom\xE1tico",toggleOverflow:"M\xE1s",about:"Acerca de",touchPanning:"Mover la pantalla con un dedo",roundedTipPen:"Lapiz Redondeado",arrowPen:"Flecha",linePen:"L\xEDnea",outlinedRectanglePen:"Rect\xE1ngulo delineado",filledRectanglePen:"Rect\xE1ngulo sin borde",lockRotation:"Bloquea rotaci\xF3n",paste:"Pegar",selectionMenu__paste:"Pegar",selectionMenu__delete:"Eliminar",selectionMenu__duplicate:"Duplicar",closeSidebar:s=>`Close sidebar for ${s}`,dropdownShown:s=>`Men\xFA por ${s} es visible`,dropdownHidden:s=>`Men\xFA por ${s} fue ocultado`,zoomLevel:s=>`Zoom: ${s}%`,colorChangedAnnouncement:s=>`Color fue cambiado a ${s}`,imageSize:(s,o)=>`Tama\xF1o del imagen: ${s} ${o}`,imageLoadError:s=>`Error cargando imagen: ${s}`,penTool:s=>`Lapiz ${s}`,selectionTool:"Selecciona",eraserTool:"Borrador",touchPanTool:"Instrumento de mover la pantalla con un dedo",undoRedoTool:"Deshace/rehace",pipetteTool:"Seleccione un color de la pantalla",keyboardPanZoom:"Mover la pantalla con el teclado",textTool:"Texto",enterTextToInsert:"Entra texto",findLabel:"Buscar",toNextMatch:"Pr\xF3xima",closeDialog:"Cerrar",anyDevicePanning:"Mover la pantalla con todo dispotivo",copied:s=>`${s} cosas fueron copiados`,pasted:s=>s===1?"Pegado":`${s} cosas fueron pegados`,toolEnabledAnnouncement:s=>`${s} fue activado`,toolDisabledAnnouncement:s=>`${s} fue desactivado`,resizeOutputCommand:s=>`Tama\xF1o de imagen fue cambiado a ${s.w}x${s.h}`,eraseAction:(s,o)=>`Borrado: ${o} ${s}`,rerenderAsText:"Redibuja la pantalla al texto",loading:s=>`Cargando: ${s}%...`,imageEditor:"Editor de dibujos",doneLoading:"El cargado termin\xF3",undoAnnouncement:s=>`${s} fue deshecho`,redoAnnouncement:s=>`${s} fue rehecho`},Yi=Pa;var Ea={de:_i,en:Zi,es:Yi},ka=s=>{let o=/^(\w+)[_-](\w+)$/.exec(s);return o?o[1]:s},zo=(s,o,e)=>{let r;for(let n of s){let i=ka(n);if(r&&i!==r&&r in o)return o[r];if(n in o)return o[n];r=i}return r&&r in o?o[r]:e},Ra=s=>(s??=navigator.languages,zo(s,Ea,Xe)),yr=Ra;var Xi=s=>s.toUpperCase()===s&&s.toLowerCase()!==s&&s.length===1,Qi=s=>s.toLowerCase()===s&&s.toUpperCase()!==s&&s.length===1,Tt=class s{constructor(o){this.key=o.key,this.shiftKey=o.shiftKey,this.ctrlKey=o.ctrlKey,this.altKey=o.altKey,this.metaKey=o.metaKey,this.controlOrMeta=o.controlOrMeta}matchesEvent(o){let e=o.key?.toLowerCase(),r=Xi(o.key??""),n=Qi(o.key??""),i=(o.ctrlKey??!1)||e==="control",a=(o.altKey??!1)||e==="alt",l=(o.metaKey??!1)||e==="meta",c=(o.shiftKey??r)||e==="shift",d=o.controlOrMeta||o.ctrlKey||o.metaKey||!1;if(this.key!==o.code&&(this.key.toLowerCase()!==e||(r||n)&&this.key!==o.key&&!(this.shiftKey===!0&&this.key.toUpperCase()===o.key)))return!1;let p=this.controlOrMeta;return(i===this.ctrlKey&&l===this.metaKey&&!p||p&&d)&&a===this.altKey&&(c===this.shiftKey||this.shiftKey===void 0)}toString(){let o=[];return this.ctrlKey&&this.key!=="control"&&o.push("Ctrl"),this.controlOrMeta&&o.push("CtrlOrMeta"),this.altKey&&this.key!=="alt"&&o.push("Alt"),this.metaKey&&this.key!=="meta"&&o.push("Meta"),this.shiftKey&&this.key!=="shift"&&o.push("Shift"),o.push(this.key),o.join("+")}static fromString(o){let e=v=>{let b;Xi(v)?b=!0:(Qi(v)||v.length>1)&&(b=!1);let y=v.toLowerCase();return y==="shift"&&(b=!0),{shiftKey:b,ctrlKey:y==="control"||y==="ctrl",altKey:y==="alt",metaKey:y==="meta",controlOrMeta:y==="control or meta"||y==="ctrlormeta"}};if(o.search(/[-+]/)===-1||o.length===1){let v=e(o);return new s({key:o,...v})}let i=/^(.*[-+])?(.+)$/g.exec(o);if(!i)throw new Error(`Invalid shortcut expression, ${o}!`);let a=i[2],l=e(a),c=(i[1]??"").split(/[-+]/),d=l.shiftKey,p=l.ctrlKey,u=l.altKey,h=l.metaKey,m=l.controlOrMeta;for(let v of c)if(v!=="")switch(v.toLowerCase()){case"shift":d=!0;break;case"anyshift":d=void 0;break;case"ctrl":case"control":p=!0;break;case"meta":h=!0;break;case"ctrlormeta":case"ctrl or meta":case"controlormeta":m=!0;break;case"alt":u=!0;break;default:throw new Error(`Unknown modifier: "${v}" in shortcut ${o}.`)}return new s({key:a,shiftKey:d,ctrlKey:p,altKey:u,metaKey:h,controlOrMeta:m})}};var H=class s{constructor(o){this.shortcutOverrides=Object.create(null);for(let e in o)this.overrideShortcut(e,o[e])}static{this.shortcuts=Object.create(null)}static{this.shortcutDefaultDescriptions=Object.create(null)}static{this.shortcutLocalizedDescriptions=Object.create(null)}overrideShortcut(o,e){this.shortcutOverrides[o]=[...e]}matchesShortcut(o,e){let r=this.shortcutOverrides[o];if(!r)if(o in s.shortcuts)r=s.shortcuts[o];else throw new Error(`No shortcut with ID ${o} exists!`);for(let n of r)if(n.matchesEvent(e))return!0;return!1}static registerDefaultKeyboardShortcut(o,e,r){if(o in s.shortcuts)return!1;let n=e.map(i=>typeof i=="string"?Tt.fromString(i):i);return s.shortcuts[o]=[...n],s.shortcutDefaultDescriptions[o]=r,!0}static provideShortcutDescription(o,e,r){e in s.shortcutLocalizedDescriptions||(s.shortcutLocalizedDescriptions[e]=Object.create(null)),s.shortcutLocalizedDescriptions[e][o]=r}static getAllShortcutIds(){let o=[];for(let e in this.shortcuts)o.push(e);return o}static getShortcutDefaultKeybindings(o){if(!(o in s.shortcuts))throw new Error(`No shortcut with ID ${o} exists!`);return s.shortcuts[o]}static getShortcutDescription(o,e){return zo(e??[],this.shortcutLocalizedDescriptions,this.shortcutDefaultDescriptions)[o]??this.shortcutDefaultDescriptions[o]??null}};var to="jsdraw.tools.SelectionTool.selectAll";H.registerDefaultKeyboardShortcut(to,["CtrlOrMeta+KeyA"],"Select all");var xr="jsdraw.tools.SelectionTool.duplicateSelection";H.registerDefaultKeyboardShortcut(xr,["CtrlOrMeta+KeyD"],"Duplicate selection");var wr="jsdraw.tools.SelectionTool.sendToBack";H.registerDefaultKeyboardShortcut(wr,["End"],"Send to back");var Rn="jsdraw.tools.SelectionTool.translateLeft";H.registerDefaultKeyboardShortcut(Rn,["KeyA","KeyH","ArrowLeft"],"Move selection left");var zn="jsdraw.tools.SelectionTool.translateRight";H.registerDefaultKeyboardShortcut(zn,["KeyD","KeyL","ArrowRight"],"Move selection right");var Ln="jsdraw.tools.SelectionTool.translateUp";H.registerDefaultKeyboardShortcut(Ln,["KeyQ","KeyK","ArrowUp"],"Move selection up");var In="jsdraw.tools.SelectionTool.translateDown";H.registerDefaultKeyboardShortcut(In,["KeyE","KeyJ","ArrowDown"],"Move selection down");var Bn="jsdraw.tools.SelectionTool.rotateCCW";H.registerDefaultKeyboardShortcut(Bn,["Shift+KeyR"],"Rotate selection counter clockwise");var Dn="jsdraw.tools.SelectionTool.rotateCW";H.registerDefaultKeyboardShortcut(Dn,["KeyR"],"Rotate selection clockwise");var Mn="jsdraw.tools.SelectionTool.shrink.x";H.registerDefaultKeyboardShortcut(Mn,["KeyI"],"Decrease width");var An="jsdraw.tools.SelectionTool.stretch.x";H.registerDefaultKeyboardShortcut(An,["Shift+KeyI"],"Increase width");var Vn="jsdraw.tools.SelectionTool.shrink.y";H.registerDefaultKeyboardShortcut(Vn,["KeyO"],"Decrease height");var On="jsdraw.tools.SelectionTool.stretch.y";H.registerDefaultKeyboardShortcut(On,["Shift+KeyO"],"Increase height");var Fn="jsdraw.tools.SelectionTool.shrink.xy";H.registerDefaultKeyboardShortcut(Fn,["Comma"],"Decrease selection size");var Hn="jsdraw.tools.SelectionTool.stretch.xy";H.registerDefaultKeyboardShortcut(Hn,["Period"],"Increase selection size");var Lo="jsdraw.tools.undo",Nn="jsdaw.tools.redo";H.registerDefaultKeyboardShortcut(Lo,["CtrlOrMeta+KeyZ"],"Undo");H.registerDefaultKeyboardShortcut(Nn,["CtrlOrMeta+Shift+KeyZ","CtrlOrMeta+KeyY"],"Redo");var Io="jsdraw.tools.increaseSize";H.registerDefaultKeyboardShortcut(Io,["Equal","Shift+Equal"],"Increase pen/eraser size");var Bo="jsdraw.tools.decreaseSize";H.registerDefaultKeyboardShortcut(Bo,["Minus","Shift+Minus"],"Decrease pen/eraser size");var oo="jsdraw.tools.snapToGrid";H.registerDefaultKeyboardShortcut(oo,["Control","Meta"],"Snap to grid (press and hold)");var $n="jsdraw.tools.lockToLine";H.registerDefaultKeyboardShortcut($n,["Shift"],"Snap to XY axes (press and hold)");var Cr="js-draw.tools.FindTool.toggleVisible";H.registerDefaultKeyboardShortcut(Cr,["CtrlOrMeta+KeyF"],"Shows/hides the find tool");var Un="jsdraw.tools.PanZoom.moveLeft";H.registerDefaultKeyboardShortcut(Un,["ArrowLeft","KeyH","KeyA"],"Pan left");var Wn="jsdraw.tools.PanZoom.moveRight";H.registerDefaultKeyboardShortcut(Wn,["ArrowRight","KeyL","KeyD"],"Pan right");var Kn="jsdraw.tools.PanZoom.moveUp";H.registerDefaultKeyboardShortcut(Kn,["ArrowUp","KeyK","KeyQ"],"Pan up");var Gn="jsdraw.tools.PanZoom.moveDown";H.registerDefaultKeyboardShortcut(Gn,["ArrowDown","KeyJ","KeyE"],"Pan down");var jn="jsdraw.tools.PanZoom.rotateViewClockwise";H.registerDefaultKeyboardShortcut(jn,["Shift+KeyR"],"Rotate viewport clockwise");var qn="jsdraw.tools.PanZoom.rotateViewCounterClockwise";H.registerDefaultKeyboardShortcut(qn,["KeyR"],"Rotate viewport counter-clockwise");var _n="jsdraw.tools.PanZoom.zoomIn";H.registerDefaultKeyboardShortcut(_n,["KeyW"],"Zoom in");var Zn="jsdraw.tools.PanZoom.zoomOut";H.registerDefaultKeyboardShortcut(Zn,["KeyS"],"Zoom out");var Do=(a=>(a[a.OneFingerTouchGestures=1]="OneFingerTouchGestures",a[a.TwoFingerTouchGestures=2]="TwoFingerTouchGestures",a[a.RightClickDrags=4]="RightClickDrags",a[a.SinglePointerGestures=8]="SinglePointerGestures",a[a.Keyboard=16]="Keyboard",a[a.RotationLocked=32]="RotationLocked",a))(Do||{}),Yn=class{constructor(o,e,r){this.initialVelocity=o;this.scrollBy=e;this.onComplete=r;this.running=!1;this.start()}async start(){if(this.running)return;this.currentVelocity=this.initialVelocity;let o=performance.now();this.running=!0;let e=5e3,r=200;for(this.currentVelocity.magnitude()>e&&(this.currentVelocity=this.currentVelocity.normalized().times(e));this.running&&this.currentVelocity.magnitude()>r;){let n=performance.now(),i=(n-o)/1e3;this.currentVelocity=this.currentVelocity.times(Math.pow(1/8,i)),this.scrollBy(this.currentVelocity.times(i)),await Ye(),o=n}this.running&&this.stop()}getCurrentVelocity(){return this.running?this.currentVelocity:null}stop(){this.running&&(this.running=!1,this.onComplete())}},Ce=class extends W{constructor(e,r,n){super(e.notifier,n);this.editor=e;this.mode=r;this.transform=null;this.initialRotationSnapAngle=.22;this.afterRotationStartSnapAngle=.07;this.pinchZoomStartThreshold=1.08;this.lastPointerDownTimestamp=0;this.initialTouchAngle=0;this.initialViewportRotation=0;this.initialViewportScale=0;this.isScaling=!1;this.isRotating=!1;this.inertialScroller=null;this.velocity=null}canReceiveInputInReadOnlyEditor(){return!0}computePinchData(e,r){if(e.id<r.id){let d=e;e=r,r=d}let n=r.screenPos.minus(e.screenPos),i=n.angle(),a=n.magnitude(),l=r.canvasPos.plus(e.canvasPos).times(.5),c=r.screenPos.plus(e.screenPos).times(.5);return{canvasCenter:l,screenCenter:c,angle:i,dist:a}}allPointersAreOfType(e,r){return e.every(n=>n.device===r)}onPointerDown({allPointers:e,current:r}){let n=!1,i=this.inertialScroller?.getCurrentVelocity()??w.zero;this.inertialScroller?.stop(),this.velocity=i,this.lastPointerDownTimestamp=r.timeStamp;let a=this.allPointersAreOfType(e,2),l=this.allPointersAreOfType(e,4);if(a&&e.length===2&&this.mode&2){let{screenCenter:c,angle:d,dist:p}=this.computePinchData(e[0],e[1]);this.lastTouchDist=p,this.startTouchDist=p,this.lastScreenCenter=c,this.initialTouchAngle=d,this.initialViewportRotation=this.editor.viewport.getRotationAngle(),this.initialViewportScale=this.editor.viewport.getScaleFactor(),this.isScaling=!1,this.isRotating=Math.abs(Math.sin(this.initialViewportRotation*2))>.001,n=!0}else e.length===1&&(this.mode&1&&a||l&&this.mode&4||this.mode&8)&&(this.lastScreenCenter=e[0].screenPos,this.isScaling=!1,n=!0);return n&&(this.lastTimestamp=performance.now(),this.transform??=ke.transformBy(k.identity),this.editor.display.setDraftMode(!0)),n}updateVelocity(e){let r=e.minus(this.lastScreenCenter),n=(performance.now()-this.lastTimestamp)/1e3;if(r.magnitude()===0&&n<.1||n===0)return;n=Math.max(n,.01);let i=r.times(1/n),a=i;this.velocity&&(a=this.velocity.lerp(i,.5)),this.velocity=a}getCenterDelta(e){return this.editor.viewport.screenToCanvasTransform.transformVec3(e.minus(this.lastScreenCenter))}toSnappedRotationDelta(e){let n=e-this.initialTouchAngle+this.initialViewportRotation,i=Math.PI/2,a=Math.round(n/i)*i,l=this.isRotating?this.afterRotationStartSnapAngle:this.initialRotationSnapAngle;return Math.abs(n-a)<l&&(n=a,n!==0&&(n+=1e-4)),n-this.editor.viewport.getRotationAngle()}toSnappedScaleFactor(e){let r=this.initialViewportScale*e/this.startTouchDist,n=this.editor.viewport.getScaleFactor(),i=Math.log(r)/Math.log(10),a=Math.round(i);return Math.abs(a-i)<.04?Math.pow(10,a)/n:e/this.lastTouchDist}handleTwoFingerMove(e){let{screenCenter:r,canvasCenter:n,angle:i,dist:a}=this.computePinchData(e[0],e[1]),l=this.getCenterDelta(r),c;if(this.isRotationLocked()?c=0:c=this.toSnappedRotationDelta(i),Math.abs(c)>1e-8&&(this.isRotating=!0),this.updateVelocity(r),!this.isScaling){let u=a/this.startTouchDist,h=this.pinchZoomStartThreshold,m=1/this.pinchZoomStartThreshold;(u>h||u<m)&&(this.isScaling=!0)}let d=1;this.isScaling&&(d=this.toSnappedScaleFactor(a),this.lastTouchDist=a);let p=k.translation(l).rightMul(k.scaling2D(d,n)).rightMul(k.zRotation(c,n));return this.lastScreenCenter=r,this.transform=ke.transformBy(this.transform.transform.rightMul(p)),p}handleOneFingerMove(e){let r=this.getCenterDelta(e.screenPos),n=k.translation(r);return this.transform=ke.transformBy(this.transform.transform.rightMul(n)),this.updateVelocity(e.screenPos),this.lastScreenCenter=e.screenPos,n}onPointerMove({allPointers:e}){this.transform??=ke.transformBy(k.identity);let r=k.identity;e.length===2?r=this.handleTwoFingerMove(e):e.length===1&&(r=this.handleOneFingerMove(e[0])),ke.transformBy(r).apply(this.editor),this.lastTimestamp=performance.now()}onPointerUp(e){let r=()=>{this.transform&&(this.transform.unapply(this.editor),this.editor.dispatch(this.transform,!1)),this.editor.display.setDraftMode(!1),this.transform=null,this.velocity=w.zero};if(e.current.device===2&&e.allPointers.length===1&&this.velocity!==null&&e.current.timeStamp-this.lastPointerDownTimestamp>30&&this.velocity!==null){let a=this.velocity;this.updateVelocity(e.current.screenPos),a.magnitude()<this.velocity.magnitude()&&(this.velocity=a),this.inertialScroller?.stop(),this.inertialScroller=new Yn(this.velocity,l=>{if(!this.transform)return;let c=this.editor.viewport.screenToCanvasTransform.transformVec3(l);this.transform.unapply(this.editor),this.transform=ke.transformBy(this.transform.transform.rightMul(k.translation(c))),this.transform.apply(this.editor)},r)}else r()}onGestureCancel(){this.inertialScroller?.stop(),this.velocity=w.zero,this.transform?.unapply(this.editor),this.editor.display.setDraftMode(!1),this.transform=null}updateTransform(e,r=!1){let n=e;this.transform&&(n=this.transform.transform.rightMul(e)),this.transform?.unapply(this.editor),this.transform=ke.transformBy(n),this.transform.apply(this.editor),r&&this.editor.announceForAccessibility(this.transform.description(this.editor,this.editor.localization))}applyAndFinalizeTransform(e){this.updateTransform(e,!0),this.transform=null}onWheel({delta:e,screenPos:r}){this.inertialScroller?.stop(),this.transform=ke.transformBy(k.identity);let n=this.editor.viewport.screenToCanvas(r),a=this.editor.viewport.screenToCanvasTransform.transformVec3(F.of(-e.x,-e.y,0)),l=e.z;l=Math.atan(l/2)*2;let d=k.scaling2D(Math.max(.4,Math.min(Math.pow(1.04,-l),4)),n).rightMul(k.translation(a));return this.applyAndFinalizeTransform(d),!0}onKeyPress(e){if(this.inertialScroller?.stop(),!(this.mode&16))return!1;this.transform=ke.transformBy(k.identity);let r=w.zero,n=1,i=0,a=this.editor.shortcuts;if(a.matchesShortcut(Un,e))r=w.of(-1,0);else if(a.matchesShortcut(Wn,e))r=w.of(1,0);else if(a.matchesShortcut(Kn,e))r=w.of(0,-1);else if(a.matchesShortcut(Gn,e))r=w.of(0,1);else if(a.matchesShortcut(_n,e))n=1/2;else if(a.matchesShortcut(Zn,e))n=2;else if(a.matchesShortcut(jn,e))i=1;else if(a.matchesShortcut(qn,e))i=-1;else return!1;r=r.times(30),i*=Math.PI/8,r=r.times(-1),i=i*-1,n=1/n,i!==0&&(i+=1e-4),this.isRotationLocked()&&(i=0),r=this.editor.viewport.screenToCanvasTransform.transformVec3(r);let c=this.editor.viewport.visibleRect.center,d=k.scaling2D(n,c).rightMul(k.zRotation(i,c)).rightMul(k.translation(r));return this.applyAndFinalizeTransform(d),!0}isRotationLocked(){return!!(this.mode&32)}setModeEnabled(e,r){let n=this.mode;r?n|=e:n&=~e,this.setMode(n)}setMode(e){e!==this.mode&&(this.mode=e,this.editor.notifier.dispatch(2,{kind:2,tool:this}))}getMode(){return this.mode}};var Ji=s=>({fill:s.fill,stroke:s.stroke?{...s.stroke}:void 0}),Tr=(s,o)=>(s===o||s.fill.eq(o.fill)&&s.stroke==null==(o.stroke==null)&&(s.stroke?.color?.eq(o.stroke?.color)??!0)&&s.stroke?.width===o.stroke?.width)??!1,Sr=s=>{let o=s.stroke?{color:s.stroke.color.toHexString(),width:s.stroke.width}:void 0;return{fill:s.fill.toHexString(),stroke:o}},Pr=s=>{let o=s.stroke?{color:L.fromHex(s.stroke.color),width:s.stroke.width}:void 0;return{fill:L.fromHex(s.fill),stroke:o}};var Xn=s=>({...s,renderingStyle:Ji(s.renderingStyle)}),Er=s=>{if(typeof s=="string"&&(s=JSON.parse(s)),typeof s.fontFamily!="string")throw new Error("Serialized textStyle missing string fontFamily attribute!");return{renderingStyle:Pr(s.renderingStyle),size:s.size,fontWeight:s.fontWeight,fontVariant:s.fontVariant,fontFamily:s.fontFamily}},kr=s=>({...s,renderingStyle:Sr(s.renderingStyle)});var es=s=>{let o={};return s.color&&(o.color=s.color.toHexString()),s.textStyle&&(o.textStyle=kr(s.textStyle)),o},ts=s=>{let o=s.color?L.fromHex(s.color):void 0,e=s.textStyle?Er(s.textStyle):void 0;return{color:o,textStyle:e}},ut=(s,o,e)=>new Qn(s,o,e.getId(),e),Mo=s=>!(!("getStyle"in s&&"updateStyle"in s&&"forceStyle"in s)||!("isRestylableComponent"in s)||!s.isRestylableComponent),os="default-restyle-element",Qn=class s extends wt{constructor(e,r,n,i){super(os,n,i);this.originalStyle=e;this.newStyle=r}getComponent(e){this.resolveComponent(e.image);let r=this.component;if(!r||!r.forceStyle||!r.updateStyle)throw new Error("this.component is missing forceStyle and/or updateStyle methods!");return r}apply(e){this.getComponent(e).forceStyle(this.newStyle,e)}unapply(e){this.getComponent(e).forceStyle(this.originalStyle,e)}description(e,r){return r.restyledElement(this.getComponent(e).description(r))}serializeToJSON(){return{id:this.componentID,originalStyle:es(this.originalStyle),newStyle:es(this.newStyle)}}static{U.register(os,(e,r)=>{let n=ts(e.originalStyle),i=ts(e.newStyle),a=e.id;if(typeof e.id!="string")throw new Error(`json.id is of type ${typeof e.id}, not string.`);return new s(n,i,a)})}};var ht=s=>s.path?s.path:new G(s.startPoint,s.commands),Y=(s,o)=>({startPoint:s.startPoint,style:o,commands:s.parts,path:s}),za=(s,o)=>s.path?s:{...s,path:o},Rr=(s,o,e={fastCheck:!0,expensiveCheck:!0})=>{let r=ht(s),n=s.style.stroke?.width??0,i=n>0&&s.style.fill.a===0,a=r.bbox.grownBy(n),l=i&&n>o.maxDimension&&a.containsRect(o);if(e.fastCheck&&l&&s.style.stroke){let c=n/2;for(let d of r.startEndPoints())if(o.isWithinRadiusOf(c,d))return{rectangle:o,path:Y(G.fromRect(o),{fill:s.style.stroke.color}),fullScreen:!0}}if(e.expensiveCheck&&l&&s.style.stroke&&n>o.maxDimension*3){let c=r.signedDistance(o.center,n/2),d=n/6;if(c<-o.maxDimension/2-d)return{path:Y(G.fromRect(o),{fill:s.style.stroke.color}),rectangle:o,fullScreen:!0};if(c>o.maxDimension/2+d)return{path:Y(G.empty,{fill:L.transparent}),rectangle:B.empty,fullScreen:!1}}return null},zr=(s,o)=>{let e=ht(s),r=s.style.stroke?.width??0,n=r>0&&s.style.fill.a===0,i=e.bbox.grownBy(r),a=Rr(s,o,{fastCheck:!0,expensiveCheck:!1});if(a)return a.path;if(o.grownBy(r).transformedBoundingBox(k.scaling2D(4,o.center)).containsRect(i))return za(s,e);let c=[],d=e.startPoint;for(let h of e.parts){let m=G.computeBBoxForSegment(d,h).grownBy(r),g;h.kind===0||h.kind===1?g=h.point:g=h.endPoint,m.intersects(o)?c.push(h):n||h.kind===1?c.push({kind:1,point:g}):c.push({kind:0,point:g}),d=g}let p=new G(e.startPoint,c),u=s.style;return a=Rr(s,o,{fastCheck:!1,expensiveCheck:!0}),a?a.path:Y(p,u)};var ee=class s extends q{constructor(e,r){super("stroke",r);this.isRestylableComponent=!0;this.simplifiedPath=null;this.approximateRenderingTime=0,this.parts=[];for(let n of e){let i=ht(n),a=this.bboxForPart(i.bbox,n.style);this.contentBBox?this.contentBBox=this.contentBBox.union(a):this.contentBBox=a,this.parts.push({path:i,startPoint:i.startPoint,style:n.style,commands:i.parts}),this.approximateRenderingTime+=i.parts.length}this.contentBBox??=B.empty}getStyle(){if(this.parts.length===0)return{};let e=this.parts[0];return e.style.stroke===void 0||e.style.stroke.width===0?{color:e.style.fill}:{color:e.style.stroke.color}}updateStyle(e){return ut(this.getStyle(),e,this)}forceStyle(e,r){e.color&&(this.parts=this.parts.map(n=>{let i={...n.style,stroke:n.style.stroke?{...n.style.stroke}:void 0};return i.stroke&&i.stroke.width>0?i.stroke.color=e.color:i.fill=e.color,{path:n.path,startPoint:n.startPoint,commands:n.commands,style:i}}),r&&(r.image.queueRerenderOf(this),r.queueRerender()))}withRegionErased(e,r){let n=e.polylineApproximation(),i=c=>e.closedContainsPoint(c),a=[],l=!1;for(let c of this.parts){let d=c.path,p=b=>{if(c.style.fill.a>0){if(b.parts.length<1||b.parts.length===1&&b.parts[0].kind===0)return null;b=b.asClosed()}return isNaN(b.getExactBBox().area)?(console.warn("Prevented creating a stroke with NaN area"),l=!0,null):new s([Y(b,c.style)],this.getZIndex())},u=[];for(let b of n)u.push(...d.intersection(b));let h=!1;if(u.length===0&&c.style.stroke&&c.style.stroke.width>e.bbox.minDimension*.3&&c.style.stroke.width<e.bbox.maxDimension*30){for(let b of n)u.push(...d.intersection(b,c.style.stroke.width/2));h=!0}u.sort(So);let g=(()=>{if(u.length===0)return!1;if(h)return u[0].curveIndex===0&&u[0].parameterValue<=0;let b=hr(u[0],-1e-10);return i(d.at(b))})()?1:0,v=(b,y)=>{let f=p(b),T=g%2===1;g++,y!==void 0&&(T=y),y===void 0&&!T&&e.closedContainsPoint(b.getExactBBox().center)&&(T=!T),f&&(l||=T&&b.getExactBBox().maxDimension>e.getExactBBox().maxDimension*2,T||a.push(f))};if(c.style.fill.a===0){if(!(e.getExactBBox().maxDimension/10>d.getExactBBox().maxDimension)){let y=d.splitAt(u,{mapNewPoint:f=>r.roundPoint(f)});for(let f of y)v(f)}}else if(u.length>=2&&u.length%2===0){let b=d.splitAt(u,{mapNewPoint:y=>r.roundPoint(y)});for(let y=0;y<Math.floor(b.length/2);y++)v(b[y].union(b[b.length-y-1]).asClosed());b.length%2!==0&&v(b[Math.floor(b.length/2)].asClosed())}else v(d,!1)}return l?[this]:a}intersects(e){for(let r of this.parts){let n=r.style.stroke?.width,i=n?n/2:void 0;if(r.path.intersection(e,i).length>0)return!0}return!1}intersectsRect(e){if(!e.intersects(this.getBBox()))return!1;for(let r of this.parts){let n=e.grownBy(-(r.style.stroke?.width??0));if(n.area!==0){for(let i of r.path.startEndPoints())if(n.containsPoint(i))return!0}}return super.intersectsRect(e)}computeSimplifiedPathFor(e){let r=[],n=!1,i=!1;for(let a of this.parts){if(i||!a.style.stroke||a.style.stroke.color.a<.99){r.push(a);continue}let l=Rr(a,e);l?(r.push(l.path),l.fullScreen&&(n=!0,i=!0)):r.push(a)}return{forVisibleRect:e,parts:r,occludes:n}}occludesEverythingBelowWhenRenderedInRect(e){return this.getBBox().containsRect(e)?((!this.simplifiedPath||!this.simplifiedPath.forVisibleRect.eq(e))&&(this.simplifiedPath=this.computeSimplifiedPathFor(e)),this.simplifiedPath.occludes):!1}render(e,r){e.startObject(this.getBBox());let n=this.parts;r&&this.simplifiedPath?.forVisibleRect?.containsRect(r)?n=this.simplifiedPath.parts:this.simplifiedPath=null;for(let i of n){let a=this.bboxForPart(i.path.bbox,i.style);r&&(!a.intersects(r)||(a.size.x>r.size.x*3||a.size.y>r.size.y*3)&&!i.path.roughlyIntersects(r,i.style.stroke?.width??0))||e.drawPath(i)}e.endObject(this.getLoadSaveData())}getProportionalRenderingTime(){return this.approximateRenderingTime}bboxForPart(e,r){return r.stroke?e.grownBy(r.stroke.width/2):e}getExactBBox(){let e=null;for(let{path:r,style:n}of this.parts){let i=this.bboxForPart(r.getExactBBox(),n);e??=i,e=e.union(i)}return e??B.empty}applyTransformation(e){this.contentBBox=B.empty;let r=!0;this.parts=this.parts.map(n=>{let i=n.path.transformedBy(e),a={...n.style,stroke:n.style.stroke?{...n.style.stroke}:void 0};if(a.stroke){let c=e.getScaleFactor();a.stroke.width*=c}let l=this.bboxForPart(i.bbox,a);return r?(this.contentBBox=l,r=!1):this.contentBBox=this.contentBBox.union(l),{path:i,startPoint:i.startPoint,commands:i.parts,style:a}})}getParts(){return[...this.parts]}getPath(){let e=null;for(let r of this.parts)e?e=e.union(r.path):e??=r.path;return e??G.empty}description(e){return e.stroke}createClone(){return new s(this.parts)}serializeToJSON(){return this.parts.map(e=>({style:Sr(e.style),path:e.path.serialize()}))}static deserializeFromJSON(e){if(typeof e=="string"&&(e=JSON.parse(e)),typeof e!="object"||typeof e.length!="number")throw new Error(`${e} is missing required field, parts, or parts is of the wrong type.`);let r=e.map(n=>{let i=Pr(n.style);return Y(G.fromString(n.path),i)});return new s(r)}};q.registerComponent("stroke",ee.deserializeFromJSON);var St=class{constructor(o,e,r,n){this.startPoint=o;this.minFitAllowed=e;this.maxFitAllowed=r;this.onCurveAdded=n;this.isFirstSegment=!0;this.lastExitingVec=null;this.currentCurve=null;this.lastPoint=this.startPoint,this.buffer=[this.startPoint.pos],this.momentum=w.zero,this.currentCurve=null,this.curveStartWidth=o.width,this.bbox=new B(this.startPoint.pos.x,this.startPoint.pos.y,0,0)}getBBox(){return this.bbox}preview(){return this.currentCurve?this.currentSegmentToPath():null}approxCurrentCurveLength(){if(!this.currentCurve)return 0;let o=this.currentCurve.p0,e=this.currentCurve.p1,r=this.currentCurve.p2,n=o.distanceTo(e),i=r.distanceTo(e);return n+i}finalizeCurrentCurve(){if(!this.currentCurve)return;this.onCurveAdded(this.currentSegmentToPath());let o=this.buffer[this.buffer.length-1];this.lastExitingVec=this.currentCurve.p2.minus(this.currentCurve.p1),console.assert(this.lastExitingVec.magnitude()!==0,"lastExitingVec has zero length!"),this.buffer=[this.buffer[this.buffer.length-2],o],this.currentCurve=null,this.isFirstSegment=!1}currentSegmentToPath(){if(this.currentCurve==null)throw new Error("Invalid State: currentCurve is null!");let o=this.currentCurve.normal(0).normalized();if(!isFinite(o.magnitude()))throw new Error(`startVec(${o}) is NaN or \u221E`);let e=this.currentCurve.at(0),r=this.currentCurve.at(1),n=this.currentCurve.p1;return{startPoint:e,controlPoint:n,endPoint:r,startWidth:this.curveStartWidth,endWidth:this.curveEndWidth}}computeExitingVec(){return this.momentum.normalized().times(this.lastPoint.width/2)}addPoint(o){if(this.lastPoint){let T=o.time-this.lastPoint.time;if(o.pos.eq(this.lastPoint.pos,1e-10)||T===0)return;if(isNaN(o.pos.magnitude())){console.warn("Discarding NaN point.",o);return}let P=Math.min(this.lastPoint.width,o.width)/3;if(this.startPoint.pos.distanceTo(o.pos)<P&&this.isFirstSegment)return;let E=T/1e3,C=o.pos.minus(this.lastPoint.pos).times(1/E);this.momentum=C}let e=this.lastPoint??o;this.lastPoint=o,this.buffer.push(o.pos);let r=o.width,n=this.curveEndWidth;if(this.curveEndWidth=r,this.bbox=this.bbox.grownToPoint(o.pos,r),this.currentCurve===null){let f=e.pos,T=e.pos.plus(this.lastExitingVec??w.unitX),P=o.pos;this.currentCurve=new Ae(f,T,P),console.assert(!isNaN(f.magnitude())&&!isNaN(T.magnitude())&&!isNaN(P.magnitude()),"Expected !NaN"),this.isFirstSegment?this.curveStartWidth=(this.curveStartWidth+r)/2:this.curveStartWidth=n}let i=this.lastExitingVec;if(!i){let f=Math.ceil(this.buffer.length/2);(f===0||f>=this.buffer.length)&&(f=this.buffer.length-1),i=this.buffer[f].minus(this.buffer[0])}let a=this.computeExitingVec(),l=1.7,c=this.buffer[0],d=o.pos,p=d.distanceTo(c),u=l*p;if(u===0||a.magnitude()===0||!isFinite(a.magnitude()))return;console.assert(isFinite(i.magnitude()),"Pre-normalized enteringVec has NaN or \u221E magnitude!"),i=i.normalized(),a=a.normalized(),console.assert(isFinite(i.magnitude()),"Normalized enteringVec has NaN or \u221E magnitude!");let h=new ce(c,c.plus(i.times(u))),g=new ce(d.minus(a.times(u)),d).intersection(h),v=null;g&&(v=g.point),v||(v=c.lerp(d,.5).lerp(c.plus(i.times(p)),.1)),(c.eq(v)||d.eq(v))&&(v=c.plus(i.times(p/5))),console.assert(!c.eq(v,1e-11),"Start and control points are equal!"),console.assert(!v.eq(d,1e-11),"Control and end points are equal!");let b=this.currentCurve;this.currentCurve=new Ae(c,v,d),isNaN(this.currentCurve.normal(0).magnitude())&&(console.error("NaN normal at 0. Curve:",this.currentCurve),this.currentCurve=b);let y=f=>{let T=Math.min(Math.max(Math.min(this.curveStartWidth,this.curveEndWidth)/4,this.minFitAllowed),this.maxFitAllowed),P=T,S=0;for(let E of this.buffer){let C=f.approximateDistance(E);if(C>T&&(C=f.distance(E),S+=Math.max(0,C-T),S>P))return!1}return!0};if(this.buffer.length>3&&this.approxCurrentCurveLength()>this.curveStartWidth/2&&!y(this.currentCurve)){this.currentCurve=b,this.curveEndWidth=n,this.lastPoint=e,this.finalizeCurrentCurve();return}}},rs=St;var La=s=>(o,e)=>new Jn(s,o,e),ro=La,ns=(s,o,e)=>({points:[s,o[o.length-1]]}),is=(s,o,e)=>({points:[...e.corners,e.corners[0]]}),Jn=class{constructor(o,e,r){this.sourceFactory=o;this.startPoint=e;this.viewport=r;this.builder=o(e,r),this.points=[e]}getBBox(){return this.builder.getBBox()}build(){return this.builder.build()}preview(o){this.builder.preview(o)}addPoint(o){this.points.push(o),this.builder.addPoint(o)}async autocorrectShape(){let o=this.viewport.canvasToScreen(this.startPoint.pos),e=this.points.map(S=>this.viewport.canvasToScreen(S.pos)),r=B.bboxOf(e),n=this.viewport.canvasToScreen(this.viewport.snapToGrid(this.startPoint.pos)),i=this.points.map(S=>this.viewport.canvasToScreen(this.viewport.snapToGrid(S.pos))),a=B.bboxOf(i);if(r.maxDimension<32)return null;let l=Math.min(30,r.maxDimension/4),c=[{...ns(n,i,a),toleranceMultiplier:.5},ns(o,e,r),{...is(n,i,a),toleranceMultiplier:.6},is(o,e,r)],p=(S=>{for(let E of c){let C=E.points,V=S*S*(E.toleranceMultiplier??1),O=le=>{for(;le<0;)le+=C.length;return le%=C.length,C[le]},K=null,ie=1/0,te=0;for(let le=0;le<C.length;le++){let We=C[le],qe=We.squareDistanceTo(o);(!K||qe<ie)&&(ie=qe,K=We,te=le)}let fe=0,Se=te;for(let le of e){let We=1/0,qe=Se,st=6;for(let at=-st;at<=st;at++){let Oe=Se+at,vt=O(Oe-1),qt=O(Oe),Ke=O(Oe+1),tr=new ce(vt,qt),or=new ce(qt,Ke),hn=tr.distance(le),_e=or.distance(le),rr=Math.min(hn,_e),go=rr*rr;go<We&&(We=go,qe=Oe)}if(Se=qe,fe=Math.max(We,fe),fe>V)break}if(fe<V)return C}return null})(l);if(!p)return null;let u=this.points[this.points.length-1],h=this.startPoint.width,m=u.width,g=this.startPoint.color,v=u.color,b=this.startPoint.time,y=u.time,f=S=>{let E=p[Math.max(0,Math.floor(S))],C=p[Math.min(Math.ceil(S),p.length-1)],V=E.lerp(C,S-Math.floor(S)),O=S/p.length;return{pos:this.viewport.screenToCanvas(V),width:h*(1-O)+m*O,color:g.mix(v,O),time:b*(1-O)+y*O}},T=this.sourceFactory(f(0),this.viewport),P=p.length<10;for(let S=0;S<p.length;S++)P&&T.addPoint(f(S-.001)),T.addPoint(f(S)),P&&T.addPoint(f(S+.001));return T.build()}};var Qe=ro((s,o)=>{let e=o.getSizeOfPixelOnCanvas()*3,r=o.getSizeOfPixelOnCanvas();return new Lr(s,r,e,o)}),Lr=class{constructor(o,e,r,n){this.startPoint=o;this.minFitAllowed=e;this.viewport=n;this.isFirstSegment=!0;this.parts=[];this.widthAverageNumSamples=1;this.curveFitter=new St(o,e,r,i=>this.addCurve(i)),this.averageWidth=o.width,this.bbox=new B(this.startPoint.pos.x,this.startPoint.pos.y,0,0)}getBBox(){return this.bbox}getRenderingStyle(){return{fill:L.transparent,stroke:{color:this.startPoint.color,width:this.roundDistance(this.averageWidth)}}}previewCurrentPath(){let e=[...this.parts.slice(),...this.curveToPathCommands(this.curveFitter.preview())];return{startPoint:this.startPoint.pos,commands:e,style:this.getRenderingStyle()}}previewFullPath(){let o=this.previewCurrentPath();return o?[o]:null}previewStroke(){let o=this.previewFullPath();return o?new ee(o):null}preview(o){let e=this.previewFullPath();if(e){let r=this.viewport.visibleRect;o.startObject(r);for(let n of e)o.drawPath(n);o.endObject()}}build(){return this.curveFitter.finalizeCurrentCurve(),this.previewStroke()}getMinFit(){let o=Math.min(this.minFitAllowed,this.averageWidth/3);return o<1e-10&&(o=this.minFitAllowed),o}roundPoint(o){let e=this.getMinFit();return $.roundPoint(o,e)}roundDistance(o){let e=this.getMinFit();return $.roundPoint(o,e)}curveToPathCommands(o){if(!o){if(!this.isFirstSegment)return[];let r=$.roundPoint(this.averageWidth/10,Math.min(this.minFitAllowed,this.averageWidth/10)),n=this.roundPoint(this.startPoint.pos);return[{kind:3,controlPoint:n.plus(w.of(r,r)),endPoint:n.plus(w.of(0,r))},{kind:3,controlPoint:n.plus(w.of(-r,r)),endPoint:n.plus(w.of(-r,0))},{kind:3,controlPoint:n.plus(w.of(-r,-r)),endPoint:n.plus(w.of(0,-r))},{kind:3,controlPoint:n.plus(w.of(r,-r)),endPoint:n.plus(w.of(r,0))}]}let e=[];return this.isFirstSegment&&e.push({kind:1,point:this.roundPoint(o.startPoint)}),e.push({kind:3,controlPoint:this.roundPoint(o.controlPoint),endPoint:this.roundPoint(o.endPoint)}),e}addCurve(o){let e=this.curveToPathCommands(o);this.parts.push(...e),this.isFirstSegment&&(this.isFirstSegment=!1)}addPoint(o){this.curveFitter.addPoint(o),this.widthAverageNumSamples++,this.averageWidth=this.averageWidth*(this.widthAverageNumSamples-1)/this.widthAverageNumSamples+o.width/this.widthAverageNumSamples}};var ze=class{#e=null;constructor(){}setEmitListener(o){o&&typeof o=="object"?this.#e=e=>o.onEvent(e)??!1:this.#e=o}emit(o){return this.#e?.(o)??!1}};var Ia={kind:0,mass:.4,springConstant:100,frictionCoefficient:.28,maxPointDist:10,inertiaFraction:.75,minSimilarityToFinalize:0,velocityDecayFactor:.1},ei=class{constructor(o,e,r){this.updatePointer=e;this.options=r;this.runLoop=!0;this.lastUpdateTime=0;this.velocity=w.zero;this.strokePoint=o,this.targetPoint=o,this.targetInterval=10,this.loop()}async loop(){for(this.lastUpdateTime=performance.now();this.runLoop;)this.update(!1),await Ye()}setTarget(o){this.targetPoint=o}getNextVelocity(o){let e=this.targetPoint.minus(this.strokePoint),r=e.times(this.options.springConstant),i=this.options.mass*10,a=this.velocity.normalizedOrZero().times(-this.options.frictionCoefficient*i),l=r.plus(a).times(1/this.options.mass),c=this.options.velocityDecayFactor,d=this.velocity.times(1-c).plus(l.times(o/1e3));return e.normalizedOrZero().times(d.length()).lerp(d,this.options.inertiaFraction)}update(o){let e=performance.now(),r=e-this.lastUpdateTime,n=this.strokePoint.eq(this.targetPoint);if(r>this.targetInterval||o){if(!n){let i,a,l=1;do i=this.getNextVelocity(r/l),a=i.times(r/1e3),l++;while(a.magnitude()>this.options.maxPointDist&&l<10);for(let c=0;c<l;c++)this.velocity=this.getNextVelocity(r/l),a=this.velocity.times(r/1e3),this.strokePoint=this.strokePoint.plus(a),c<l-1&&this.updatePointer(this.strokePoint,e)}if(this.lastUpdateTime=e,o||!n)return this.updatePointer(this.strokePoint,e)}return!1}finish(){this.runLoop=!1;let o=this.targetPoint.minus(this.strokePoint);this.velocity.dot(o)>this.options.minSimilarityToFinalize&&this.updatePointer(this.targetPoint,performance.now())}cancel(){this.runLoop=!1}},Pt=class s extends ze{constructor(e,r=Ia){super();this.viewport=e;this.options=r;this.stabilizer=null;this.lastPointerEvent=null}mapPointerEvent(e){return Jt(e)&&e.kind!==2&&(this.lastPointerEvent=e),e.kind===3||e.allPointers.length>1||this.stabilizer===null?this.emit(e):(this.stabilizer.setTarget(e.current.screenPos),e.kind===1?this.stabilizer.update(!0):e.kind===2?(this.stabilizer.finish(),this.emit(e)):this.emit(e))}emitPointerMove(e,r){if(!this.lastPointerEvent)return!1;let n=this.lastPointerEvent.current.withScreenPosition(e,this.viewport).withTimestamp(r),i={kind:1,current:n,allPointers:[n]};return this.emit(i)}onEvent(e){if(Jt(e)||e.kind===3){e.kind===0&&(this.stabilizer===null?this.stabilizer=new ei(e.current.screenPos,(n,i)=>this.emitPointerMove(n,i),this.options):e.allPointers.length>1&&(this.stabilizer.cancel(),this.stabilizer=null));let r=this.mapPointerEvent(e);return(e.kind===2||e.kind===3)&&(this.stabilizer?.cancel(),this.stabilizer=null),r}return this.emit(e)}static fromEditor(e){return new s(e.viewport)}};var Ir={maxSpeed:8.5,maxRadius:11,minTimeSeconds:.5},Et=class{constructor(o,e,r){this.config=e;this.onStationary=r;this.timeout=null;this.stationaryStartPointer=o,this.lastPointer=o,this.averageVelocity=w.zero,this.setStationaryTimeout(this.config.minTimeSeconds*1e3)}onPointerMove(o){if(!this.stationaryStartPointer)return;if(o.id!==this.stationaryStartPointer.id)return!1;let e=o.screenPos.minus(this.lastPointer.screenPos),r=o.screenPos.minus(this.stationaryStartPointer.screenPos),n=(o.timeStamp-this.lastPointer.timeStamp)/1e3;n===0&&(n=1);let i=e.times(1/n);this.averageVelocity=this.averageVelocity.lerp(i,.5);let a=o.timeStamp-this.stationaryStartPointer.timeStamp,l=r.length()>this.config.maxRadius;if(this.hasMovedOutOfRadius||=l,l||this.averageVelocity.length()>this.config.maxSpeed||a<this.config.minTimeSeconds)return this.stationaryStartPointer=o,this.lastPointer=o,this.setStationaryTimeout(this.config.minTimeSeconds*1e3),!1;let c=this.config.minTimeSeconds*1e3-a;return this.lastPointer=o,c<=0}onPointerUp(o){o.id!==this.stationaryStartPointer?.id&&this.cancelStationaryTimeout()}destroy(){this.cancelStationaryTimeout(),this.stationaryStartPointer=null}getHasMovedOutOfRadius(){return this.hasMovedOutOfRadius}cancelStationaryTimeout(){this.timeout!==null&&(clearTimeout(this.timeout),this.timeout=null)}setStationaryTimeout(o){this.timeout===null&&(o<=0?this.onStationary(this.lastPointer):this.timeout=setTimeout(()=>{if(this.timeout=null,!this.stationaryStartPointer)return;let e=performance.now()-this.stationaryStartPointer.timeStamp,r=this.config.minTimeSeconds*1e3-e;r<=0?this.onStationary(this.lastPointer):this.setStationaryTimeout(r)},o))}};var $e=class extends W{constructor(e,r,n){super(e.notifier,r);this.editor=e;this.builder=null;this.lastPoint=null;this.startPoint=null;this.currentDeviceType=null;this.currentPointerId=null;this.shapeAutocompletionEnabled=!1;this.autocorrectedShape=null;this.lastAutocorrectedShape=null;this.removedAutocorrectedShapeTime=0;this.stationaryDetector=null;this.styleValue=j.fromInitialValue({factory:Qe,color:L.blue,thickness:4,...n}),this.styleValue.onUpdateAndNow(i=>{this.style=i,this.noteUpdated()})}getPressureMultiplier(){let e=this.style.thickness;return 1/this.editor.viewport.getScaleFactor()*e}toStrokePoint(e){let n=Math.max(e.pressure??1,.3);return isFinite(n)||(console.warn("Non-finite pressure!",e),n=.3),console.assert(isFinite(e.canvasPos.length()),"Non-finite canvas position!"),console.assert(isFinite(e.screenPos.length()),"Non-finite screen position!"),console.assert(isFinite(e.timeStamp),"Non-finite timeStamp on pointer!"),{pos:e.canvasPos,width:n*this.getPressureMultiplier(),color:this.style.color,time:e.timeStamp}}previewStroke(){this.editor.clearWetInk();let e=this.editor.display.getWetInkRenderer();if(this.autocorrectedShape){let r=this.editor.viewport.visibleRect;this.autocorrectedShape.render(e,r)}else this.builder?.preview(e)}addPointToStroke(e){if(!this.builder)throw new Error("No stroke is currently being generated.");this.builder.addPoint(e),this.lastPoint=e,this.previewStroke()}onPointerDown(e){if(this.builder&&!this.eventCanCancelStroke(e))return!0;let{current:r,allPointers:n}=e,i=r.device===1,a=r.device===0;return n.length===1&&!i||a?(this.startPoint=this.toStrokePoint(r),this.builder=this.style.factory(this.startPoint,this.editor.viewport),this.currentDeviceType=r.device,this.currentPointerId=r.id,this.shapeAutocompletionEnabled?this.stationaryDetector=new Et(r,Ir,l=>this.autocorrectShape(l)):this.stationaryDetector=null,this.lastAutocorrectedShape=null,this.removedAutocorrectedShapeTime=0,!0):!1}eventCanCancelStroke(e){let r=this.lastPoint?.time??0;if(e.current.timeStamp-r>1e3)return!0;let n=this.currentDeviceType===0,i=e.current.device===2;return!(n&&i)}eventCanBeDeliveredToNonActiveTool(e){return this.eventCanCancelStroke(e)}onPointerMove({current:e}){if(!this.builder||e.device!==this.currentDeviceType||e.id!==this.currentPointerId)return;this.stationaryDetector?.onPointerMove(e)||(this.addPointToStroke(this.toStrokePoint(e)),this.autocorrectedShape&&(this.removedAutocorrectedShapeTime=performance.now(),this.autocorrectedShape=null,this.editor.announceForAccessibility(this.editor.localization.autocorrectionCanceled)))}onPointerUp({current:e}){if(!this.builder)return!1;if(e.id!==this.currentPointerId)return!0;this.stationaryDetector?.onPointerUp(e);let r=this.toStrokePoint(e),n={...r,width:this.lastPoint?.width??r.width};return this.addPointToStroke(n),this.finalizeStroke(),!1}onGestureCancel(){this.builder=null,this.editor.clearWetInk(),this.stationaryDetector?.destroy(),this.stationaryDetector=null}removedAutocorrectedShapeRecently(){return this.removedAutocorrectedShapeTime>performance.now()-320}async autocorrectShape(e){if(!this.builder||!this.builder.autocorrectShape||!this.shapeAutocompletionEnabled||this.autocorrectedShape)return;let r=await this.builder.autocorrectShape();if(!this.builder||!r)return;let n=r.getBBox().area;if(n===0||!isFinite(n))return;let i=r.description(this.editor.localization);this.editor.announceForAccessibility(this.editor.localization.autocorrectedTo(i)),this.autocorrectedShape=r,this.lastAutocorrectedShape=r,this.previewStroke()}finalizeStroke(){if(this.builder){this.lastAutocorrectedShape&&this.removedAutocorrectedShapeRecently()&&(this.autocorrectedShape=this.lastAutocorrectedShape);let e=this.autocorrectedShape??this.builder.build();if(this.previewStroke(),e.getBBox().area>0){e===this.autocorrectedShape&&this.editor.announceForAccessibility(this.editor.localization.autocorrectedTo(e.description(this.editor.localization)));let n=_.addElement(e,!0);this.editor.dispatch(n)}else console.warn("Pen: Not adding empty stroke",e,"to the canvas.")}this.builder=null,this.lastPoint=null,this.autocorrectedShape=null,this.lastAutocorrectedShape=null,this.editor.clearWetInk(),this.stationaryDetector?.destroy(),this.stationaryDetector=null}noteUpdated(){this.editor.notifier.dispatch(2,{kind:2,tool:this})}setColor(e){e.toHexString()!==this.style.color.toHexString()&&this.styleValue.set({...this.style,color:e})}setThickness(e){e!==this.style.thickness&&this.styleValue.set({...this.style,thickness:e})}setStrokeFactory(e){e!==this.style.factory&&this.styleValue.set({...this.style,factory:e})}setHasStabilization(e){let r=!!this.getInputMapper();e!==r&&(r?this.setInputMapper(null):this.setInputMapper(new Pt(this.editor.viewport)),this.noteUpdated())}setStrokeAutocorrectEnabled(e){e!==this.shapeAutocompletionEnabled&&(this.shapeAutocompletionEnabled=e,this.noteUpdated())}getStrokeAutocorrectionEnabled(){return this.shapeAutocompletionEnabled}getThickness(){return this.style.thickness}getColor(){return this.style.color}getStrokeFactory(){return this.style.factory}getStyleValue(){return this.styleValue}onKeyPress(e){let r=this.editor.shortcuts,n=r.matchesShortcut(Lo,e);if(this.builder&&n)return this.finalizeStroke(),!1;let i;return r.matchesShortcut(Bo,e)?i=this.getThickness()*2/3:r.matchesShortcut(Io,e)&&(i=this.getThickness()*3/2),i!==void 0?(i=Math.min(Math.max(1,i),256),this.setThickness(i),!0):!1}};var mt=class{constructor(){}notifyEnabled(o){o!==this.activeTool&&(this.activeTool?.setEnabled(!1),this.activeTool=o)}};var Br=(s,o)=>{if(o.length===0)return null;let e=o[0].description(s);for(let r of o)if(r.description(s)!==e)return null;return e};var J=class s extends U{constructor(o){super("erase"),this.toRemove=o.map(e=>e),this.applied=!1}apply(o){for(let e of this.toRemove){let r=o.image.findParent(e);r&&(r.remove(),o.image.onDestroyElement(e))}this.applied=!0,o.queueRerender()}unapply(o){for(let e of this.toRemove)o.image.findParent(e)||_.addElement(e).apply(o);this.applied=!1,o.queueRerender()}onDrop(o){if(this.applied)for(let e of this.toRemove)o.image.onDestroyElement(e)}description(o,e){if(this.toRemove.length===0)return e.erasedNoElements;let r=Br(e,this.toRemove)??e.elements;return e.eraseAction(r,this.toRemove.length)}serializeToJSON(){return this.toRemove.map(e=>e.serialize())}static{U.register("erase",(o,e)=>{if(!Array.isArray(o))throw new Error("seralized erase data must be an array");let r=o.map(n=>{let i=typeof n=="string"?n:`${n.id}`;return e.image.lookupElement(i)??q.deserialize(n)});return new s(r)})}};var Ba=s=>{if(s.some(o=>o&&o.then))return Promise.all(s).then(()=>{})},ti=Ba;var Dr=class extends Be{constructor(e,r,n){super();this.commands=e;this.applyChunkSize=r;this.descriptionOverride=n}apply(e){if(this.applyChunkSize===void 0){let r=this.commands.map(n=>n.apply(e));return ti(r)}else return e.asyncApplyCommands(this.commands,this.applyChunkSize)}unapply(e){let r=[...this.commands];if(r.reverse(),this.applyChunkSize===void 0){let n=r.map(i=>i.unapply(e));return ti(n)}else return e.asyncUnapplyCommands(r,this.applyChunkSize,!1)}onDrop(e){this.commands.forEach(r=>r.onDrop(e))}description(e,r){if(this.descriptionOverride)return this.descriptionOverride;let n=[],i=null,a=0,l=0;for(let c of this.commands){let d=c.description(e,r);if(d!==i&&i!==null&&(n.push(r.unionOf(i,a)),i=null,a=0),a++,l++,i??=d,n.length>12)break}return a>1?n.push(r.unionOf(i,a)):a===1&&n.push(i),l<this.commands.length&&n.push(r.andNMoreCommands(this.commands.length-l)),n.join(", ")}},oi=class extends U{constructor(e,r,n){super("union");this.commands=e;this.applyChunkSize=r;this.descriptionOverride=n;this.nonserializableCommand=new Dr(e,r,n)}serializeToJSON(){return this.serializedData?this.serializedData:{applyChunkSize:this.applyChunkSize,data:this.commands.map(e=>e.serialize()),description:this.descriptionOverride}}apply(e){return this.serializedData=this.serializeToJSON(),this.nonserializableCommand.apply(e)}unapply(e){return this.nonserializableCommand.unapply(e)}onDrop(e){this.nonserializableCommand.onDrop(e)}description(e,r){return this.nonserializableCommand.description(e,r)}},ss=(s,o)=>{let e=!0;for(let i of s)if(!(i instanceof U)){e=!1;break}let r,n;if(typeof o=="number"?r=o:(r=o?.applyChunkSize,n=o?.description),e){let i=s;return new oi(i,r,n)}else return new Dr(s,r,n)};U.register("union",(s,o)=>{if(typeof s.data.length!="number")throw new Error("Unions of commands must serialize to lists of serialization data.");let e=s.applyChunkSize;if(typeof e!="number"&&e!==void 0)throw new Error("serialized applyChunkSize is neither undefined nor a number.");let r=typeof s.description=="string"?s.description:void 0,n=[];for(let i of s.data)n.push(U.deserialize(i,o));return ss(n,{applyChunkSize:e,description:r})});var se=ss;var no=(e=>(e.PartialStroke="partial-stroke",e.FullStroke="full-stroke",e))(no||{}),ri=class extends W{constructor(e,r){super(e.notifier,e.localization.changeTool);this.editor=e;this.eraser=r}onPointerDown(e){if(e.allPointers.length===1&&e.current.device===1){let n=this.editor.toolController.getPrimaryTools().filter(i=>i.isEnabled());if(n.length?this.previousEnabledTool=n[0]:this.previousEnabledTool=null,this.previousEraserEnabledState=this.eraser.isEnabled(),this.eraser.setEnabled(!0),this.eraser.onPointerDown(e))return!0;this.restoreOriginalTool()}return!1}onPointerMove(e){this.eraser.onPointerMove(e)}restoreOriginalTool(){this.eraser.setEnabled(this.previousEraserEnabledState),this.previousEnabledTool&&this.previousEnabledTool.setEnabled(!0)}onPointerUp(e){this.eraser.onPointerUp(e),this.restoreOriginalTool()}onGestureCancel(e){this.eraser.onGestureCancel(e),this.restoreOriginalTool()}},Je=class extends W{constructor(e,r,n){super(e.notifier,r);this.editor=e;this.lastPoint=null;this.isFirstEraseEvt=!0;this.toAdd=new Set;this.eraseCommands=[];this.addCommands=[];this.thickness=n?.thickness??10,this.thicknessValue=j.fromInitialValue(this.thickness),this.thicknessValue.onUpdate(i=>{this.thickness=i,this.editor.notifier.dispatch(2,{kind:2,tool:this})}),this.modeValue=j.fromInitialValue(n?.mode??"full-stroke"),this.modeValue.onUpdate(i=>{this.editor.notifier.dispatch(2,{kind:2,tool:this})})}makeEraserSwitcherTool(){return new ri(this.editor,this)}clearPreview(){this.editor.clearWetInk()}getSizeOnCanvas(){return this.thickness/this.editor.viewport.getScaleFactor()}drawPreviewAt(e){this.clearPreview();let r=this.getSizeOnCanvas(),n=this.editor.display.getWetInkRenderer(),i=this.getEraserRect(e),a=this.getEraserRect(this.lastPoint??e),l={fill:L.transparent,stroke:{width:r/10,color:L.gray}};n.drawPath(Y(G.fromConvexHullOf([...i.corners,...a.corners]),l))}getEraserRect(e){let r=this.getSizeOnCanvas(),n=w.of(r/2,r/2);return B.fromCorners(e.minus(n),e.plus(n))}eraseTo(e){if(!this.isFirstEraseEvt&&e.distanceTo(this.lastPoint)===0)return;this.isFirstEraseEvt=!1;let r=this.getEraserRect(e),n=new ce(this.lastPoint,e),i=B.union(n.bbox,r),l=this.editor.image.getElementsIntersectingRegion(i).filter(c=>c.intersects(n)||c.intersectsRect(r)).filter(c=>c.isSelectable());if(this.modeValue.get()==="full-stroke"){this.toRemove.push(...l);let c=l.map(d=>new J([d]));c.forEach(d=>d.apply(this.editor)),this.eraseCommands.push(...c)}else{let c=[],d=[];for(let m of l){if(c.push(m),!m.withRegionErased||r.grownBy(r.maxDimension/3).containsRect(m.getExactBBox()))continue;let v=G.fromConvexHullOf([...r.corners,...this.getEraserRect(this.lastPoint??e).corners].map(b=>this.editor.viewport.roundPoint(b)));d.push(...m.withRegionErased(v,this.editor.viewport))}let p=new J(c),u=d.map(m=>_.addElement(m));p.apply(this.editor),u.forEach(m=>m.apply(this.editor));let h=[];for(let m of c)this.toAdd.has(m)?this.toAdd.delete(m):h.push(m);this.toRemove.push(...h);for(let m of d)this.toAdd.add(m);this.eraseCommands.push(new J(h)),this.addCommands.push(...u)}this.drawPreviewAt(e),this.lastPoint=e}onPointerDown(e){return e.allPointers.length===1||e.current.device===1?(this.lastPoint=e.current.canvasPos,this.toRemove=[],this.toAdd.clear(),this.isFirstEraseEvt=!0,this.drawPreviewAt(e.current.canvasPos),!0):!1}onPointerMove(e){let r=e.current.canvasPos;this.eraseTo(r)}onPointerUp(e){this.eraseTo(e.current.canvasPos);let r=[];if(this.addCommands.length>0){this.addCommands.forEach(n=>n.unapply(this.editor));for(let n of this.toAdd)this.toRemove.includes(n)&&(this.toAdd.delete(n),this.toRemove=this.toRemove.filter(i=>i!==n));for(let n of this.toRemove)this.toAdd.has(n)&&(this.toAdd.delete(n),this.toRemove=this.toRemove.filter(i=>i!==n));r.push(...[...this.toAdd].map(n=>_.addElement(n))),this.addCommands=[]}if(this.eraseCommands.length>0){this.eraseCommands.forEach(i=>i.unapply(this.editor)),this.eraseCommands=[];let n=new J(this.toRemove);r.push(n)}r.length===1?this.editor.dispatch(r[0]):this.editor.dispatch(se(r)),this.clearPreview()}onGestureCancel(e){this.addCommands.forEach(r=>r.unapply(this.editor)),this.eraseCommands.forEach(r=>r.unapply(this.editor)),this.eraseCommands=[],this.addCommands=[],this.clearPreview()}onKeyPress(e){let r=this.editor.shortcuts,n;return r.matchesShortcut(Bo,e)?n=this.getThickness()*2/3:r.matchesShortcut(Io,e)&&(n=this.getThickness()*3/2),n!==void 0?(n=Math.min(Math.max(1,n),200),this.setThickness(n),!0):!1}getThickness(){return this.thickness}setThickness(e){this.thicknessValue.set(e)}getThicknessValue(){return this.thicknessValue}getModeValue(){return this.modeValue}};var as="text";var Da={fontFamily:"sans",size:12,renderingStyle:{fill:L.purple}},re=class s extends q{constructor(e,r,n=Da,i=0){super(as);this.textObjects=e;this.transform=r;this.style=n;this.transformMode=i;this.isRestylableComponent=!0;this.recomputeBBox(),!e.some(l=>typeof l=="string")&&e.length>0&&(this.style=e[0].getTextStyle())}static applyTextStyles(e,r){let n=r.fontFamily.match(/\s/),i=r.fontFamily.match(/^".*"$/),a=n&&!i?`"${r.fontFamily.replace(/["]/g,'\\"')}"`:r.fontFamily;e.font=[r.fontStyle??"",r.fontWeight??"",(r.size??12)+"px",`${a}`].join(" "),e.textAlign="left"}static{this.textMeasuringCtx=null}static estimateTextDimens(e,r){let n=e.length*r.size,i=r.size;return new B(0,-i*2/3,n,i)}static getTextMetrics(e,r){if(s.textMeasuringCtx??=document.createElement("canvas").getContext("2d")??null,!s.textMeasuringCtx)return null;let n=s.textMeasuringCtx;return s.applyTextStyles(n,r),n.measureText(e)}static getTextDimens(e,r){let n=this.getTextMetrics(e,r);if(!n)return this.estimateTextDimens(e,r);let i=-n.actualBoundingBoxAscent,a=n.actualBoundingBoxAscent+n.actualBoundingBoxDescent;return new B(0,i,n.width,a)}static getFontHeight(e){return e.size}computeUntransformedBBoxOfPart(e){return typeof e=="string"?s.getTextDimens(e,this.style):e.contentBBox}recomputeBBox(){let e=null,r=new s.TextCursor(this.transform,this.style);for(let n of this.textObjects){let i=r.update(n).transform,a=this.computeUntransformedBBoxOfPart(n).transformedBoundingBox(i);e??=a,e=e.union(a)}this.contentBBox=e??B.empty}renderInternal(e,r,n=k.identity){let i=new s.TextCursor(this.transform,this.style);for(let a of this.textObjects){let{transform:l,bbox:c}=i.update(a);r&&!r.intersects(c.transformedBoundingBox(n))||(typeof a=="string"?e.drawText(a,l,this.style):(e.pushTransform(l),a.renderInternal(e,r,n.rightMul(l)),e.popTransform()))}}render(e,r){e.startObject(this.contentBBox),this.renderInternal(e,r),e.endObject(this.getLoadSaveData())}getProportionalRenderingTime(){return this.textObjects.length}intersects(e){let r=new s.TextCursor(this.transform,this.style);for(let n of this.textObjects){let i=r.update(n).transform.inverse(),a=e.transformedBy(i);if(typeof n=="string"){if(s.getTextDimens(n,this.style).getEdges().some(c=>a.intersection(c)!==null))return!0}else if(n.intersects(a))return!0}return!1}getStyle(){return{color:this.style.renderingStyle.fill,textStyle:{...this.style,renderingStyle:{...this.style.renderingStyle}}}}updateStyle(e){return ut(this.getStyle(),e,this)}forceStyle(e,r){if(e.textStyle)this.style=Xn(e.textStyle);else if(e.color)this.style={...this.style,renderingStyle:{...this.style.renderingStyle,fill:e.color}};else return;for(let n of this.textObjects)n instanceof s&&n.forceStyle(e,r);r&&(r.image.queueRerenderOf(this),r.queueRerender())}getTextStyle(){return Xn(this.style)}getBaselinePos(){return this.transform.transformVec2(w.zero)}getTransform(){return this.transform}applyTransformation(e){this.transform=e.rightMul(this.transform),this.recomputeBBox()}createClone(){let e=this.textObjects.map(r=>typeof r=="string"?r:r.createClone());return new s(e,this.transform,this.style)}getText(){let e=[];for(let r of this.textObjects)typeof r=="string"?e.push(r):e.push(r.getText());return e.join(`
19
- `)}description(e){return e.text(this.getText())}serializeToJSON(){let e=kr(this.style);return{textObjects:this.textObjects.map(n=>typeof n=="string"?{text:n}:{json:n.serializeToJSON()}),transform:this.transform.toArray(),style:e}}static deserializeFromString(e){typeof e=="string"&&(e=JSON.parse(e));let r=Er(e.style),n=e.textObjects.map(l=>(l.text??null)!==null?l.text:s.deserializeFromString(l.json));if(e.transform=e.transform.filter(l=>typeof l=="number"),e.transform.length!==9)throw new Error(`Unable to deserialize transform, ${e.transform}.`);let i=e.transform,a=new k(...i);return new s(n,a,r)}static fromLines(e,r,n){let i=null,a=[],l=Math.round(this.getFontHeight(n)),c=w.zero;for(let d of e){i&&(c=c.plus(w.unitY.times(l)));let p=new s([d],k.translation(c),n);a.push(p),i=p}return new s(a,r,n)}static{this.TextCursor=class{constructor(e=k.identity,r){this.parentTransform=e;this.parentStyle=r;this.transform=k.identity}update(e){let r=k.identity,n=k.identity,i;typeof e=="string"?i=s.getTextDimens(e,this.parentStyle):(n=e.transform,i=e.getBBox());let a=typeof e=="string"?1:e.transformMode;a===1?r=this.transform.rightMul(r):(a===2||a===3)&&(r=this.transform.mapEntries((p,[u,h])=>{if(a===2)return u===1&&h===2?0:p;if(a===3)return u===0&&h===2?0:p;throw new Error("Unreachable")}).rightMul(r));let l=k.translation(w.of(i.width,0));this.transform=r.rightMul(n).rightMul(l);let c=this.parentTransform.rightMul(r);return{transform:c,bbox:i.transformedBoundingBox(c)}}}}};q.registerComponent(as,s=>re.deserializeFromString(s));var Le=class{constructor(o){this.viewport=o;this.selfTransform=null;this.transformStack=[];this.objectLevel=0;this.currentPaths=null}getViewport(){return this.viewport}setDraftMode(o){}flushPath(){if(!this.currentPaths)return;let o=null;for(let e of this.currentPaths){let{startPoint:r,commands:n,style:i}=e;!o||!Tr(o,i)?(o&&this.endPath(o),this.beginPath(r),o=i):this.moveTo(r);for(let a of n)a.kind===0?this.lineTo(a.point):a.kind===1?this.moveTo(a.point):a.kind===2?this.traceCubicBezierCurve(a.controlPoint1,a.controlPoint2,a.endPoint):a.kind===3&&this.traceQuadraticBezierCurve(a.controlPoint,a.endPoint)}o&&this.endPath(o),this.currentPaths=[]}drawPath(o){this.objectLevel===0||this.currentPaths===null?(this.currentPaths=[o],this.flushPath(),this.currentPaths=null):this.currentPaths.push(o)}drawRect(o,e,r){let n=G.fromRect(o,e);this.drawPath(Y(n,r))}fillRect(o,e){let r=G.fromRect(o);this.drawPath(Y(r,{fill:e}))}startObject(o,e){this.objectLevel>0&&this.flushPath(),this.currentPaths=[],this.objectLevel++}endObject(o,e){if(this.flushPath(),this.currentPaths=null,this.objectLevel--,this.objectLevel<0)throw new Error("More objects have ended than have been started (negative object nesting level)!")}getNestingLevel(){return this.objectLevel}canRenderFromWithoutDataLoss(o){return!1}renderFromOtherOfSameType(o,e){throw new Error(`Unable to render from ${e}: Not implemented`)}setTransform(o){this.selfTransform=o}pushTransform(o){this.transformStack.push(this.selfTransform),this.setTransform(this.getCanvasToScreenTransform().rightMul(o))}popTransform(){if(this.transformStack.length===0)throw new Error("Unable to pop more transforms than have been pushed!");this.setTransform(this.transformStack.pop()??null)}getCanvasToScreenTransform(){return this.selfTransform?this.selfTransform:this.viewport.canvasToScreenTransform}canvasToScreen(o){return this.getCanvasToScreenTransform().transformVec2(o)}getSizeOfCanvasPixelOnScreen(){return this.getCanvasToScreenTransform().transformVec3(w.unitX).length()}overrideVisibleRect(o){this.visibleRectOverride=o}getVisibleRect(){return this.visibleRectOverride??this.viewport.visibleRect}};var Ie=class s extends Le{constructor(e,r){super(r);this.ctx=e;this.ignoreObjectsAboveLevel=null;this.ignoringObject=!1;this.currentObjectBBox=null;this.clipLevels=[];this.setDraftMode(!1)}transformBy(e){this.ctx.transform(e.a1,e.b1,e.a2,e.b2,e.a3,e.b3)}canRenderFromWithoutDataLoss(e){return e instanceof s}renderFromOtherOfSameType(e,r){if(!(r instanceof s))throw new Error(`${r} cannot be rendered onto ${this}`);e=this.getCanvasToScreenTransform().rightMul(e),this.ctx.save(),this.transformBy(e),this.ctx.drawImage(r.ctx.canvas,0,0),this.ctx.restore()}setDraftMode(e){e?(this.minSquareCurveApproxDist=9,this.minRenderSizeBothDimens=1,this.minRenderSizeAnyDimen=.1):(this.minSquareCurveApproxDist=.5,this.minRenderSizeBothDimens=.1,this.minRenderSizeAnyDimen=1e-6)}displaySize(){return w.of(this.ctx.canvas.clientWidth,this.ctx.canvas.clientHeight)}clear(){this.ctx.save(),this.ctx.resetTransform(),this.ctx.clearRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height),this.ctx.restore()}beginPath(e){e=this.canvasToScreen(e),this.ctx.beginPath(),this.ctx.moveTo(e.x,e.y)}endPath(e){e.fill.a>0&&(this.ctx.fillStyle=e.fill.toHexString(),this.ctx.fill()),e.stroke&&(this.ctx.strokeStyle=e.stroke.color.toHexString(),this.ctx.lineWidth=this.getSizeOfCanvasPixelOnScreen()*e.stroke.width,this.ctx.lineCap="round",this.ctx.lineJoin="round",this.ctx.stroke(),this.ctx.lineWidth=1),this.ctx.closePath()}lineTo(e){e=this.canvasToScreen(e),this.ctx.lineTo(e.x,e.y)}moveTo(e){e=this.canvasToScreen(e),this.ctx.moveTo(e.x,e.y)}traceCubicBezierCurve(e,r,n){e=this.canvasToScreen(e),r=this.canvasToScreen(r),n=this.canvasToScreen(n);let i=r.minus(e),a=n.minus(r);i.magnitudeSquared()<this.minSquareCurveApproxDist&&a.magnitudeSquared()<this.minSquareCurveApproxDist?this.ctx.lineTo(n.x,n.y):this.ctx.bezierCurveTo(e.x,e.y,r.x,r.y,n.x,n.y)}traceQuadraticBezierCurve(e,r){e=this.canvasToScreen(e),r=this.canvasToScreen(r),e.minus(r).magnitudeSquared()<this.minSquareCurveApproxDist?this.ctx.lineTo(r.x,r.y):this.ctx.quadraticCurveTo(e.x,e.y,r.x,r.y)}drawPath(e){if(this.ignoringObject)return;let r=this.getVisibleRect();this.currentObjectBBox?.containsRect(r)&&(e=zr(e,r)),super.drawPath(e)}drawText(e,r,n){this.ctx.save(),r=this.getCanvasToScreenTransform().rightMul(r),this.transformBy(r),re.applyTextStyles(this.ctx,n),n.renderingStyle.fill.a!==0&&(this.ctx.fillStyle=n.renderingStyle.fill.toHexString(),this.ctx.fillText(e,0,0)),n.renderingStyle.stroke&&(this.ctx.strokeStyle=n.renderingStyle.stroke.color.toHexString(),this.ctx.lineWidth=n.renderingStyle.stroke.width,this.ctx.strokeText(e,0,0)),this.ctx.restore()}drawImage(e){if(e.image.width===0||e.image.height===0)return;this.ctx.save();let r=this.getCanvasToScreenTransform().rightMul(e.transform);this.transformBy(r),this.ctx.drawImage(e.image,0,0),this.ctx.restore()}startObject(e,r){if(this.isTooSmallToRender(e)&&(this.ignoreObjectsAboveLevel=this.getNestingLevel(),this.ignoringObject=!0),super.startObject(e),this.currentObjectBBox=e,!this.ignoringObject&&r&&!e.containsRect(this.getVisibleRect())){this.clipLevels.push(this.objectLevel),this.ctx.save(),this.ctx.beginPath();for(let i of e.corners){let a=this.canvasToScreen(i);this.ctx.lineTo(a.x,a.y)}this.ctx.clip()}}endObject(){let e=this.objectLevel;this.currentObjectBBox=null,super.endObject(),!this.ignoringObject&&this.clipLevels.length>0&&this.clipLevels[this.clipLevels.length-1]===e&&(this.ctx.restore(),this.clipLevels.pop()),this.ignoreObjectsAboveLevel!==null&&this.getNestingLevel()<=this.ignoreObjectsAboveLevel&&(this.ignoreObjectsAboveLevel=null,this.ignoringObject=!1)}drawPoints(...e){for(let n=0;n<e.length;n++){let i=this.canvasToScreen(e[n]);this.ctx.beginPath(),this.ctx.arc(i.x,i.y,10,0,Math.PI*2),this.ctx.fillStyle=L.ofRGBA(.5+Math.sin(n)/2,1,.5+Math.cos(n*.2)/4,.5).toHexString(),this.ctx.lineWidth=2,this.ctx.fill(),this.ctx.stroke(),this.ctx.closePath(),this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillStyle="black",this.ctx.fillText(`${n}`,i.x,i.y,10*2)}}isTooSmallToRender(e){let r=e.size.times(this.getSizeOfCanvasPixelOnScreen()),n=this.minRenderSizeBothDimens,i=Math.abs(r.x)<n&&Math.abs(r.y)<n,a=this.minRenderSizeAnyDimen,l=Math.abs(r.x)<a||Math.abs(r.y)<a;return i||l}static fromViewport(e,r={}){let n=document.createElement("canvas"),i=e.getScreenRectSize(),a=r.canvasSize??i;r.maxCanvasDimen&&a.maximumEntryMagnitude()>r.maxCanvasDimen&&(a=a.times(r.maxCanvasDimen/a.maximumEntryMagnitude())),n.width=a.x,n.height=a.y;let l=n.getContext("2d"),c=Math.min(a.x/i.x,a.y/i.y);return l.scale(c,c),{renderer:new s(l,e),element:n}}};var so=(r=>(r[r.SolidColor=0]="SolidColor",r[r.Grid=1]="Grid",r[r.None=2]="None",r))(so||{}),io="js-draw-image-background",Mr="js-draw-image-background-grid-",ni="js-draw-image-background-non-automatic-secondary-color",ii={1:"js-draw-image-background-grid",0:io,2:""},ae=class s extends q{constructor(e,r){super("image-background",0);this.backgroundType=e;this.mainColor=r;this.viewportSizeChangeListener=null;this.autoresizeChangedListener=null;this.fillsScreen=!1;this.gridSize=$.getGridSize(2);this.gridStrokeWidth=.7;this.secondaryColor=null;this.isRestylableComponent=!0;this.contentBBox=B.empty}static ofGrid(e,r,n,i){let a=new s(1,e);return r!==void 0&&(a.gridSize=r),n!==void 0&&(a.secondaryColor=n),i!==void 0&&(a.gridStrokeWidth=i),a}getBackgroundType(){return this.backgroundType}getMainColor(){return this.mainColor}getSecondaryColor(){return this.secondaryColor}getGridSize(){return this.gridSize}getStyle(){let e=this.mainColor;return this.backgroundType===2&&(e=void 0),{color:e}}updateStyle(e){return ut(this.getStyle(),e,this)}forceStyle(e,r){let n=e.color;n&&(this.mainColor=n,n.eq(L.transparent)&&this.backgroundType===0?this.backgroundType=2:this.backgroundType===2&&(this.backgroundType=0),r&&(r.image.queueRerenderOf(this),r.queueRerender()))}onAddToImage(e){this.viewportSizeChangeListener&&(console.warn("onAddToImage called when background is already in an image"),this.onRemoveFromImage()),this.viewportSizeChangeListener=e.notifier.on(0,()=>{this.recomputeBBox(e)}),this.autoresizeChangedListener=e.notifier.on(1,()=>{this.recomputeBBox(e)}),this.recomputeBBox(e)}onRemoveFromImage(){this.viewportSizeChangeListener?.remove(),this.autoresizeChangedListener?.remove(),this.viewportSizeChangeListener=null,this.autoresizeChangedListener=null}recomputeBBox(e){let r=e.getImportExportViewport().visibleRect,n=!1;this.contentBBox.eq(r)||(this.contentBBox=r,n||=!this.fillsScreen);let i=e.getAutoresizeEnabled();i!==this.fillsScreen&&(this.fillsScreen=i,n=!0),n&&e.queueRerenderOf(this)}generateGridPath(e){let r=this.getFullBoundingBox(e),n=(e?.intersection(r)??r).grownBy(this.gridStrokeWidth/2),i=y=>Math.floor(y/this.gridSize)*this.gridSize,a=y=>Math.ceil(y/this.gridSize)*this.gridSize,l=a(n.y),c=i(n.y+n.h),d=a(n.x),p=i(n.x+n.w),u=[],h=(c-l)/this.gridSize,m=(p-d)/this.gridSize;if(h>1e3||m>1e3)return G.empty;let b=w.of(n.x,l);for(let y=l;y<=c;y+=this.gridSize)u.push({kind:1,point:w.of(n.x,y)}),u.push({kind:0,point:w.of(n.x+n.w,y)});for(let y=d;y<=p;y+=this.gridSize)u.push({kind:1,point:w.of(y,n.y)}),u.push({kind:0,point:w.of(y,n.y+n.h)});return new G(b,u)}getFullBoundingBox(e){return(this.fillsScreen?e:this.contentBBox)??this.contentBBox}render(e,r){if(this.backgroundType===2)return;let n=!r;this.fillsScreen&&(r??=e.getVisibleRect());let i=this.backgroundType===1,a=this.getFullBoundingBox(r);if(e.startObject(a,i),this.backgroundType===0||this.backgroundType===1){let d=r?.intersection(a);d?e.fillRect(d,this.mainColor):n&&e.fillRect(a,this.mainColor)}if(this.backgroundType===1){let d=this.secondaryColor;d??=L.ofRGBA(1-this.mainColor.r,1-this.mainColor.g,1-this.mainColor.b,.2),this.mainColor.a===0&&(d=L.ofRGBA(.5,.5,.5,.2));let p={fill:L.transparent,stroke:{width:this.gridStrokeWidth,color:d}};e.drawPath(Y(this.generateGridPath(r),p))}let l=ii[this.backgroundType],c=[io];if(l!==io){c.push(l);let d=de(this.gridSize).replace(/[.]/g,"p");c.push(Mr+d)}this.secondaryColor!==null&&c.push(ni),e.endObject(this.getLoadSaveData(),c)}intersects(e){return this.contentBBox.getEdges().some(r=>r.intersects(e))}isSelectable(){return!1}isBackground(){return!0}getSizingMode(){return this.fillsScreen?1:0}serializeToJSON(){return{mainColor:this.mainColor.toHexString(),secondaryColor:this.secondaryColor?.toHexString(),backgroundType:this.backgroundType,gridSize:this.gridSize,gridStrokeWidth:this.gridStrokeWidth}}applyTransformation(e){}description(e){return this.backgroundType===0?e.filledBackgroundWithColor(this.mainColor.toString()):this.backgroundType===2?e.emptyBackground:this.backgroundType===1?e.gridBackground:this.backgroundType}createClone(){return new s(this.backgroundType,this.mainColor)}static deserializeFromJSON(e){if(typeof e=="string"&&(e=JSON.parse(e)),typeof e.mainColor!="string")throw new Error("Error deserializing \u2014 mainColor must be of type string.");let r,n=e.backgroundType;if(n===2||n===1||n===0)r=n;else return n;let i=L.fromHex(e.mainColor),a=e.secondaryColor?L.fromHex(e.secondaryColor):null,l=e.gridSize??void 0,c=e.gridStrokeWidth??void 0,d=new s(r,i);return d.secondaryColor=a,l&&(d.gridSize=l),c&&(d.gridStrokeWidth=c),d}};q.registerComponent("image-background",ae.deserializeFromJSON);var Aa=async s=>{s.complete||await new Promise((o,e)=>{s.onload=r=>o(r),s.onerror=r=>e(r),s.onabort=r=>e(r)})},ls=Aa;var be=class s extends q{constructor(o){super("image-component"),this.image={...o,label:o.label??o.image.getAttribute("alt")??o.image.getAttribute("aria-label")??void 0},(r=>r.getAttribute("src")!==void 0)(o.image)&&!o.image.complete&&(o.image.onload=()=>this.recomputeBBox()),this.recomputeBBox()}getImageRect(){return new B(0,0,this.image.image.width,this.image.image.height)}recomputeBBox(){this.contentBBox=this.getImageRect(),this.contentBBox=this.contentBBox.transformedBoundingBox(this.image.transform)}static async fromImage(o,e){await ls(o);let r,n;typeof o.width=="number"&&typeof o.height=="number"&&o.width!==0&&o.height!==0?(r=o.width,n=o.height):(r=o.clientWidth,n=o.clientHeight);let i,a=o.src??"";if(a.startsWith("data:image/"))i=new Image,i.src=a,i.width=r,i.height=n;else{let l=document.createElement("canvas");l.width=r,l.height=n,l.getContext("2d").drawImage(o,0,0,l.width,l.height),a=l.toDataURL(),i=l}return i.setAttribute("alt",o.getAttribute("alt")??""),i.setAttribute("aria-label",o.getAttribute("aria-label")??""),new s({image:i,base64Url:a,transform:e})}render(o,e){o.startObject(this.contentBBox),o.drawImage(this.image),o.endObject(this.getLoadSaveData())}getProportionalRenderingTime(){return 10}intersects(o){let r=this.getImageRect().getEdges().map(n=>n.transformedBy(this.image.transform));for(let n of r)if(n.intersects(o))return!0;return!1}applyTransformation(o){this.image.transform=o.rightMul(this.image.transform),this.recomputeBBox()}description(o){return this.image.label?o.imageNode(this.image.label):o.unlabeledImageNode}getAltText(){return this.image.label}getURL(){return this.image.base64Url}getTransformation(){return this.image.transform}createClone(){return new s({...this.image})}serializeToJSON(){return{src:this.image.base64Url,label:this.image.label,width:this.image.image.width,height:this.image.image.height,transform:this.image.transform.toArray()}}static deserializeFromJSON(o){if(typeof o.src!="string")throw new Error(`${o} has invalid format! Expected src property.`);Po(o.transform),pt(o.width),pt(o.height);let e=new Image;e.src=o.src,e.width=o.width,e.height=o.height;let r=new k(...o.transform);return new s({image:e,base64Url:o.src,label:o.label,transform:r})}};q.registerComponent("image-component",be.deserializeFromJSON);var cs="svg-global-attributes",ao=class s extends q{constructor(o){super(cs),this.contentBBox=B.empty;let e=["viewBox","width","height"];this.attrs=o.filter(([r,n])=>!e.includes(r))}render(o,e){if(o instanceof me)for(let[r,n]of this.attrs)o.setRootSVGAttribute(r,n)}intersects(o){return!1}applyTransformation(o){}isSelectable(){return!1}getSizingMode(){return 2}createClone(){return new s(this.attrs)}description(o){return o.svgObject}serializeToJSON(){return JSON.stringify(this.attrs)}static deserializeFromString(o){return new s([])}};q.registerComponent(cs,ao.deserializeFromString);var ds="unknown-svg-object",kt=class s extends q{constructor(e){super(ds);this.svgObject=e;this.contentBBox=B.of(e.getBoundingClientRect())}render(e,r){e instanceof me&&(e.startObject(this.contentBBox),e.drawSVGElem(this.svgObject),e.endObject(this.getLoadSaveData()))}intersects(e){return this.contentBBox.getEdges().some(r=>r.intersection(e)!==null)}applyTransformation(e){}isSelectable(){return!1}getSizingMode(){return 2}createClone(){return new s(this.svgObject.cloneNode(!0))}description(e){return e.svgObject}serializeToJSON(){return JSON.stringify({html:this.svgObject.outerHTML})}};q.registerComponent(ds,null);var Va=(s,o,e)=>{let r=/^([-0-9.e]+)px/i,n=r.exec(s.style?.fontSize??"");!n&&s.tagName.toLowerCase()==="tspan"&&s.parentElement&&(n=r.exec(s.parentElement.style?.fontSize??"")),!n&&o&&(n=r.exec(o.fontSize));let i=12;return n&&(e.add("fontSize"),i=parseFloat(n[1])),i},ps=Va;var Oa=new B(0,0,500,500),ai="svgAttrs",li="svgStyleAttrs",ci="svgContainerID",Ar="js-draw--autoresize";var si=["stroke","fill","stroke-width"],et=class s{constructor(o,e,r){this.source=o;this.onFinish=e;this.onAddComponent=null;this.onProgress=null;this.onDetermineExportRect=null;this.processedCount=0;this.totalToProcess=0;this.containerGroupIDs=[];this.encounteredIDs=[];this.storeUnknown=!(r.sanitize??!1),this.disableUnknownObjectWarnings=!!r.disableUnknownObjectWarnings}getStyle(o,e){let r=L.transparent,n,i=o.getAttribute("fill")??(e?.fill||o.style?.fill);if(i)try{r=L.fromString(i)}catch{console.error("Unknown fill color,",i)}let a=o.getAttribute("stroke")??e?.stroke??o.style?.stroke??"",l=o.getAttribute("stroke-width")??e?.strokeWidth??o.style?.strokeWidth??"";if(a&&l)try{let d=parseFloat(l??"1");isFinite(d)||(d=0);let p=L.fromString(a);p.a>0&&(n={width:d,color:p})}catch(d){console.error("Error parsing stroke data:",d)}return{fill:r,stroke:n}}strokeDataFromElem(o){let e=[],r=o.getAttribute("d")??"",n=this.getStyle(o),i=r.split("M"),a=!0;for(let l of i){let c=/^[0-9., \t\n]+$/.exec(l);if(l!==""&&!c){let d=a?l:`M${l}`,p=G.fromString(d),u=Y(p,n);e.push(u)}a=!1}return e}attachUnrecognisedAttrs(o,e,r,n){if(this.storeUnknown){for(let i of e.getAttributeNames())r.has(i)||i==="style"&&n||o.attachLoadSaveData(ai,[i,e.getAttribute(i)]);if(n&&e.style)for(let i=0;i<e.style.length;i++){let a=e.style[i];a===""||!a||n.has(a)||o.attachLoadSaveData(li,{key:a,value:e.style.getPropertyValue(a),priority:e.style.getPropertyPriority(a)})}}}async addPath(o){let e;try{let r=this.strokeDataFromElem(o);e=new ee(r),this.attachUnrecognisedAttrs(e,o,new Set([...si,"d"]),new Set(si))}catch(r){if(console.error("Invalid path in node",o,`
18
+ When unchecked, the page is visible and its size can be set manually.`,pageDropdown__aboutButtonHelpText:"Shows version, debug, and other information.",colorPickerPipetteHelpText:"Picks a color from the screen.",colorPickerToggleHelpText:"Opens/closes the color picker.",closeSidebar:s=>`Close sidebar for ${s}`,dropdownShown:s=>`Menu for ${s} shown`,dropdownHidden:s=>`Menu for ${s} hidden`,zoomLevel:s=>`Zoom: ${s}%`,colorChangedAnnouncement:s=>`Color changed to ${s}`,imageSize:(s,o)=>`Image size: ${s} ${o}`,imageLoadError:s=>`Error loading image: ${s}`};var Qi={penTool:s=>`Pen ${s}`,selectionTool:"Selection",selectAllTool:"Select all shortcut",eraserTool:"Eraser",touchPanTool:"Touch panning",twoFingerPanZoomTool:"Panning and zooming",undoRedoTool:"Undo/Redo",rightClickDragPanTool:"Right-click drag",pipetteTool:"Pick color from screen",keyboardPanZoom:"Keyboard pan/zoom shortcuts",selectionMenu__show:"Show selection menu",selectionMenu__copyToClipboard:"Copy to clipboard",selectionMenu__duplicate:"Duplicate",selectionMenu__delete:"Delete",selectionMenu__paste:"Paste",copyPasteError__heading:"Copy/paste",copyPasteError__description:"Something went wrong \u2014 this tool may not have clipboard access.",copyPasteError__errorDetails:"Show error",copyPasteError__pasteRetry:"To retry, please paste into the input box below:",copyPasteError__copyRetry:"To retry, please copy the text in the input box below:",copyPasteError__copyMe:"Copy me!",autocorrectedTo:s=>`Autocorrected to ${s}`,autocorrectionCanceled:"Autocorrect cancelled",textTool:"Text",enterTextToInsert:"Text to insert",changeTool:"Change tool",pasteHandler:"Copy paste handler",soundExplorer:"Sound-based image exploration",disableAccessibilityExploreTool:"Disable sound-based exploration",enableAccessibilityExploreTool:"Enable sound-based exploration",soundExplorerUsageAnnouncement:"Sound-based image exploration enabled: Click/drag the screen to play a sound representation of different parts of the image.",findLabel:"Find",toNextMatch:"Next",closeDialog:"Close",findDialogShown:"Find dialog shown",findDialogHidden:"Find dialog hidden",focusedFoundText:(s,o)=>`Viewing match ${s} of ${o}`,anyDevicePanning:"Any device panning",copied:s=>`Copied ${s} item(s)`,pasted:s=>`Pasted ${s} item(s)`,toolEnabledAnnouncement:s=>`${s} enabled`,toolDisabledAnnouncement:s=>`${s} disabled`};var Xe={...ro,...Qi,...qi,...Zi,...Yi,accessibilityInputInstructions:['Press "t" to read the contents of the viewport as text.',"Use the arrow keys to move the viewport, click and drag to draw strokes.",'Press "w" to zoom in and "s" to zoom out.'].join(" "),loading:s=>`Loading ${s}%...`,imageEditor:"Image Editor",doneLoading:"Done loading",undoAnnouncement:s=>`Undid ${s}`,redoAnnouncement:s=>`Redid ${s}`,softwareLibraries:"Libraries",developerInformation:"Developer information"};var za={...Xe,pen:"Stift",eraser:"Radierer",select:"Auswahl",handTool:"Verschieben",zoom:"Vergr\xF6\xDFerung",image:"Bild",inputAltText:"Alt-Text: ",chooseFile:"W\xE4hle Datei: ",submit:"Absenden",cancel:"Abbrechen",resetView:"Ansicht zur\xFCcksetzen",thicknessLabel:"Dicke: ",colorLabel:"Farbe: ",fontLabel:"Schriftart: ",textSize:"Gr\xF6\xDFe: ",resizeImageToSelection:"Bildgr\xF6\xDFe an Auswahl anpassen",deleteSelection:"Auswahl l\xF6schen",duplicateSelection:"Auswahl duplizieren",undo:"R\xFCckg\xE4ngig",redo:"Wiederholen",pickColorFromScreen:"Farbe von Bildschirm ausw\xE4hlen",clickToPickColorAnnouncement:"Klicke auf den Bildschirm, um eine Farbe auszuw\xE4hlen",selectionToolKeyboardShortcuts:"Auswahl-Werkzeug: Verwende die Pfeiltasten, um ausgew\xE4hlte Elemente zu verschieben und \u201Ai\u2018 und \u201Ao\u2018, um ihre Gr\xF6\xDFe zu \xE4ndern.",touchPanning:"Ansicht mit Touchscreen verschieben",anyDevicePanning:"Ansicht mit jedem Eingabeger\xE4t verschieben",selectPenType:"Objekt-Typ: ",roundedTipPen:"Freihand",flatTipPen:"Stift (druckempfindlich)",arrowPen:"Pfeil",linePen:"Linie",outlinedRectanglePen:"Umrissenes Rechteck",filledRectanglePen:"Ausgef\xFClltes Rechteck",lockRotation:"Sperre Rotation",paste:"Einf\xFCgen",dropdownShown:s=>`Dropdown-Men\xFC f\xFCr ${s} angezeigt`,dropdownHidden:s=>`Dropdown-Men\xFC f\xFCr ${s} versteckt`,zoomLevel:s=>`Verg\xF6\xDFerung: ${s}%`,colorChangedAnnouncement:s=>`Farbe zu ${s} ge\xE4ndert`,imageSize:(s,o)=>`Bild-Gr\xF6\xDFe: ${s} ${o}`,imageLoadError:s=>`Fehler beim Laden des Bildes: ${s}`,errorImageHasZeroSize:"Fehler: Bild hat Gr\xF6\xDFe Null",penTool:s=>`Stift ${s}`,selectionTool:"Auswahl",eraserTool:"Radiergummi",touchPanTool:"Ansicht mit Touchscreen verschieben",twoFingerPanZoomTool:"Ansicht verschieben und vergr\xF6\xDFern",undoRedoTool:"R\xFCckg\xE4ngig/Wiederholen",rightClickDragPanTool:"Rechtsklick-Ziehen",pipetteTool:"Farbe von Bildschirm ausw\xE4hlen",keyboardPanZoom:"Tastaturk\xFCrzel zum Verschieben/Vergr\xF6\xDFern der Ansicht",textTool:"Text",enterTextToInsert:"Einzuf\xFCgender Text",changeTool:"Wechsle Werkzeug",pasteHandler:"Copy-Paste-Handler",findLabel:"Finde",toNextMatch:"N\xE4chstes",closeDialog:"Schlie\xDFen",findDialogShown:"Finde-Dialog angezeigt",findDialogHidden:"Finde-Dialog versteckt",focusedFoundText:(s,o)=>`Sieh Treffer ${s} von ${o} an`,toolEnabledAnnouncement:s=>`${s} aktiviert`,toolDisabledAnnouncement:s=>`${s} deaktiviert`,updatedViewport:"Transformierte Ansicht",transformedElements:s=>`${s} Element${s===1?"":"e"} transformiert`,resizeOutputCommand:s=>`Bildgr\xF6\xDFe auf ${s.w}x${s.h} ge\xE4ndert`,addElementAction:s=>`${s} hinzugef\xFCgt`,eraseAction:(s,o)=>`${o} ${s} gel\xF6scht`,duplicateAction:(s,o)=>`${o} ${s} dupliziert`,inverseOf:s=>`${s} umgekehrt`,elements:"Elemente",erasedNoElements:"Nichts entfernt",duplicatedNoElements:"Nichts dupliziert",rotatedBy:s=>`${Math.abs(s)} Grad ${s<0?"im Uhrzeigersinn":"gegen den Uhrzeigersinn"} gedreht`,movedLeft:"Nacht links bewegt",movedUp:"Nacht oben bewegt",movedDown:"Nacht unten bewegt",movedRight:"Nacht rechts bewegt",zoomedOut:"Ansicht verkleinert",zoomedIn:"Ansicht vergr\xF6\xDFert",selectedElements:s=>`${s} Element${s===1?"":"e"} ausgew\xE4hlt`,stroke:"Strich",svgObject:"SVG-Objekt",text:s=>`Text-Objekt: ${s}`,pathNodeCount:s=>`Es gibt ${s} sichtbare Pfad-Objekte.`,textNodeCount:s=>`Es gibt ${s} sichtbare Text-Knotenpunkte.`,textNode:s=>`Text: ${s}`,imageNodeCount:s=>`Es gibt ${s} sichtbare Bild-Knoten.`,imageNode:s=>`Bild: ${s}`,unlabeledImageNode:"Bild ohne Label",rerenderAsText:"Als Text darstellen",accessibilityInputInstructions:"Dr\xFCcke \u201At\u2018, um den Inhalt des Ansichtsfensters als Text zu lesen. Verwende die Pfeiltasten, um die Ansicht zu verschieben, und klicke und ziehe, um Striche zu zeichnen. Dr\xFCcke \u201Aw\u2018 zum Vergr\xF6\xDFern und \u201As\u2018 zum Verkleinern der Ansicht.",loading:s=>`Laden ${s}%...`,doneLoading:"Laden fertig",imageEditor:"Bild-Editor",undoAnnouncement:s=>`${s} r\xFCckg\xE4ngig gemacht`,redoAnnouncement:s=>`${s} wiederholt`,reformatSelection:"Formatiere Auswahl",documentProperties:"Seite",backgroundColor:"Hintergrundfarbe: ",imageWidthOption:"Breite: ",imageHeightOption:"H\xF6he: ",useGridOption:"Gitter: ",toggleOverflow:"Mehr",selectAllTool:"Alle ausw\xE4hlen",soundExplorer:"Klangbasierte Bilderkundung",disableAccessibilityExploreTool:"Deaktiviere klangbasierte Erkundung",enableAccessibilityExploreTool:"Aktiviere klangbasierte Erkundung",unionOf:(s,o)=>`Vereinigung: ${o} ${s}`,emptyBackground:"Leerer Hintergrund",filledBackgroundWithColor:s=>`Gef\xFCllter Hintergrund (${s})`,restyledElement:s=>`${s} umgestaltet`},Ji=za;var La={...Xe},es=La;var Ia={...Xe,pen:"Lapiz",eraser:"Borrador",select:"Selecciona",handTool:"Mover",image:"Imagen",inputAltText:"Texto alternativo",resetImage:"Reiniciar",chooseFile:"Seleccionar archivo",cancel:"Cancelar",resetView:"Reiniciar vista",thicknessLabel:"Tama\xF1o",fontLabel:"Fuente:",textSize:"Tama\xF1o",resizeImageToSelection:"Redimensionar la imagen a lo que est\xE1 seleccionado",deleteSelection:"Borra la selecci\xF3n",duplicateSelection:"Duplica la selecci\xF3n",exit:"Salir",save:"Guardar",undo:"Deshace",redo:"Rehace",selectPenType:"Punta",selectShape:"Forma",pickColorFromScreen:"Selecciona un color de la pantalla",clickToPickColorAnnouncement:"Haga un clic en la pantalla para seleccionar un color",documentProperties:"Fondo",backgroundColor:"Color de fondo",imageWidthOption:"Ancho",imageHeightOption:"Alto",enableAutoresizeOption:"Redimensionar autom\xE1tico",toggleOverflow:"M\xE1s",about:"Acerca de",touchPanning:"Mover la pantalla con un dedo",roundedTipPen:"Lapiz Redondeado",arrowPen:"Flecha",linePen:"L\xEDnea",outlinedRectanglePen:"Rect\xE1ngulo delineado",filledRectanglePen:"Rect\xE1ngulo sin borde",lockRotation:"Bloquea rotaci\xF3n",paste:"Pegar",selectionMenu__paste:"Pegar",selectionMenu__delete:"Eliminar",selectionMenu__duplicate:"Duplicar",closeSidebar:s=>`Close sidebar for ${s}`,dropdownShown:s=>`Men\xFA por ${s} es visible`,dropdownHidden:s=>`Men\xFA por ${s} fue ocultado`,zoomLevel:s=>`Zoom: ${s}%`,colorChangedAnnouncement:s=>`Color fue cambiado a ${s}`,imageSize:(s,o)=>`Tama\xF1o del imagen: ${s} ${o}`,imageLoadError:s=>`Error cargando imagen: ${s}`,penTool:s=>`Lapiz ${s}`,selectionTool:"Selecciona",eraserTool:"Borrador",touchPanTool:"Instrumento de mover la pantalla con un dedo",undoRedoTool:"Deshace/rehace",pipetteTool:"Seleccione un color de la pantalla",keyboardPanZoom:"Mover la pantalla con el teclado",textTool:"Texto",enterTextToInsert:"Entra texto",findLabel:"Buscar",toNextMatch:"Pr\xF3xima",closeDialog:"Cerrar",anyDevicePanning:"Mover la pantalla con todo dispotivo",copied:s=>`${s} cosas fueron copiados`,pasted:s=>s===1?"Pegado":`${s} cosas fueron pegados`,toolEnabledAnnouncement:s=>`${s} fue activado`,toolDisabledAnnouncement:s=>`${s} fue desactivado`,resizeOutputCommand:s=>`Tama\xF1o de imagen fue cambiado a ${s.w}x${s.h}`,eraseAction:(s,o)=>`Borrado: ${o} ${s}`,rerenderAsText:"Redibuja la pantalla al texto",loading:s=>`Cargando: ${s}%...`,imageEditor:"Editor de dibujos",doneLoading:"El cargado termin\xF3",undoAnnouncement:s=>`${s} fue deshecho`,redoAnnouncement:s=>`${s} fue rehecho`},ts=Ia;var Ba={de:Ji,en:es,es:ts},Ma=s=>{let o=/^(\w+)[_-](\w+)$/.exec(s);return o?o[1]:s},Io=(s,o,e)=>{let r;for(let n of s){let i=Ma(n);if(r&&i!==r&&r in o)return o[r];if(n in o)return o[n];r=i}return r&&r in o?o[r]:e},Da=s=>(s??=navigator.languages,Io(s,Ba,Xe)),Sr=Da;var os=s=>s.toUpperCase()===s&&s.toLowerCase()!==s&&s.length===1,rs=s=>s.toLowerCase()===s&&s.toUpperCase()!==s&&s.length===1,St=class s{constructor(o){this.key=o.key,this.shiftKey=o.shiftKey,this.ctrlKey=o.ctrlKey,this.altKey=o.altKey,this.metaKey=o.metaKey,this.controlOrMeta=o.controlOrMeta}matchesEvent(o){let e=o.key?.toLowerCase(),r=os(o.key??""),n=rs(o.key??""),i=(o.ctrlKey??!1)||e==="control",a=(o.altKey??!1)||e==="alt",l=(o.metaKey??!1)||e==="meta",c=(o.shiftKey??r)||e==="shift",d=o.controlOrMeta||o.ctrlKey||o.metaKey||!1;if(this.key!==o.code&&(this.key.toLowerCase()!==e||(r||n)&&this.key!==o.key&&!(this.shiftKey===!0&&this.key.toUpperCase()===o.key)))return!1;let u=this.controlOrMeta;return(i===this.ctrlKey&&l===this.metaKey&&!u||u&&d)&&a===this.altKey&&(c===this.shiftKey||this.shiftKey===void 0)}toString(){let o=[];return this.ctrlKey&&this.key!=="control"&&o.push("Ctrl"),this.controlOrMeta&&o.push("CtrlOrMeta"),this.altKey&&this.key!=="alt"&&o.push("Alt"),this.metaKey&&this.key!=="meta"&&o.push("Meta"),this.shiftKey&&this.key!=="shift"&&o.push("Shift"),o.push(this.key),o.join("+")}static fromString(o){let e=v=>{let b;os(v)?b=!0:(rs(v)||v.length>1)&&(b=!1);let y=v.toLowerCase();return y==="shift"&&(b=!0),{shiftKey:b,ctrlKey:y==="control"||y==="ctrl",altKey:y==="alt",metaKey:y==="meta",controlOrMeta:y==="control or meta"||y==="ctrlormeta"}};if(o.search(/[-+]/)===-1||o.length===1){let v=e(o);return new s({key:o,...v})}let i=/^(.*[-+])?(.+)$/g.exec(o);if(!i)throw new Error(`Invalid shortcut expression, ${o}!`);let a=i[2],l=e(a),c=(i[1]??"").split(/[-+]/),d=l.shiftKey,u=l.ctrlKey,p=l.altKey,h=l.metaKey,m=l.controlOrMeta;for(let v of c)if(v!=="")switch(v.toLowerCase()){case"shift":d=!0;break;case"anyshift":d=void 0;break;case"ctrl":case"control":u=!0;break;case"meta":h=!0;break;case"ctrlormeta":case"ctrl or meta":case"controlormeta":m=!0;break;case"alt":p=!0;break;default:throw new Error(`Unknown modifier: "${v}" in shortcut ${o}.`)}return new s({key:a,shiftKey:d,ctrlKey:u,altKey:p,metaKey:h,controlOrMeta:m})}};var H=class s{constructor(o){this.shortcutOverrides=Object.create(null);for(let e in o)this.overrideShortcut(e,o[e])}static{this.shortcuts=Object.create(null)}static{this.shortcutDefaultDescriptions=Object.create(null)}static{this.shortcutLocalizedDescriptions=Object.create(null)}overrideShortcut(o,e){this.shortcutOverrides[o]=[...e]}matchesShortcut(o,e){let r=this.shortcutOverrides[o];if(!r)if(o in s.shortcuts)r=s.shortcuts[o];else throw new Error(`No shortcut with ID ${o} exists!`);for(let n of r)if(n.matchesEvent(e))return!0;return!1}static registerDefaultKeyboardShortcut(o,e,r){if(o in s.shortcuts)return!1;let n=e.map(i=>typeof i=="string"?St.fromString(i):i);return s.shortcuts[o]=[...n],s.shortcutDefaultDescriptions[o]=r,!0}static provideShortcutDescription(o,e,r){e in s.shortcutLocalizedDescriptions||(s.shortcutLocalizedDescriptions[e]=Object.create(null)),s.shortcutLocalizedDescriptions[e][o]=r}static getAllShortcutIds(){let o=[];for(let e in this.shortcuts)o.push(e);return o}static getShortcutDefaultKeybindings(o){if(!(o in s.shortcuts))throw new Error(`No shortcut with ID ${o} exists!`);return s.shortcuts[o]}static getShortcutDescription(o,e){return Io(e??[],this.shortcutLocalizedDescriptions,this.shortcutDefaultDescriptions)[o]??this.shortcutDefaultDescriptions[o]??null}};var no="jsdraw.tools.SelectionTool.selectAll";H.registerDefaultKeyboardShortcut(no,["CtrlOrMeta+KeyA"],"Select all");var Pr="jsdraw.tools.SelectionTool.duplicateSelection";H.registerDefaultKeyboardShortcut(Pr,["CtrlOrMeta+KeyD"],"Duplicate selection");var Er="jsdraw.tools.SelectionTool.sendToBack";H.registerDefaultKeyboardShortcut(Er,["End"],"Send to back");var Bn="jsdraw.tools.SelectionTool.translateLeft";H.registerDefaultKeyboardShortcut(Bn,["KeyA","KeyH","ArrowLeft"],"Move selection left");var Mn="jsdraw.tools.SelectionTool.translateRight";H.registerDefaultKeyboardShortcut(Mn,["KeyD","KeyL","ArrowRight"],"Move selection right");var Dn="jsdraw.tools.SelectionTool.translateUp";H.registerDefaultKeyboardShortcut(Dn,["KeyQ","KeyK","ArrowUp"],"Move selection up");var An="jsdraw.tools.SelectionTool.translateDown";H.registerDefaultKeyboardShortcut(An,["KeyE","KeyJ","ArrowDown"],"Move selection down");var Vn="jsdraw.tools.SelectionTool.rotateCCW";H.registerDefaultKeyboardShortcut(Vn,["Shift+KeyR"],"Rotate selection counter clockwise");var On="jsdraw.tools.SelectionTool.rotateCW";H.registerDefaultKeyboardShortcut(On,["KeyR"],"Rotate selection clockwise");var Fn="jsdraw.tools.SelectionTool.shrink.x";H.registerDefaultKeyboardShortcut(Fn,["KeyI"],"Decrease width");var Hn="jsdraw.tools.SelectionTool.stretch.x";H.registerDefaultKeyboardShortcut(Hn,["Shift+KeyI"],"Increase width");var Nn="jsdraw.tools.SelectionTool.shrink.y";H.registerDefaultKeyboardShortcut(Nn,["KeyO"],"Decrease height");var $n="jsdraw.tools.SelectionTool.stretch.y";H.registerDefaultKeyboardShortcut($n,["Shift+KeyO"],"Increase height");var Un="jsdraw.tools.SelectionTool.shrink.xy";H.registerDefaultKeyboardShortcut(Un,["Comma"],"Decrease selection size");var Wn="jsdraw.tools.SelectionTool.stretch.xy";H.registerDefaultKeyboardShortcut(Wn,["Period"],"Increase selection size");var Bo="jsdraw.tools.undo",Kn="jsdaw.tools.redo";H.registerDefaultKeyboardShortcut(Bo,["CtrlOrMeta+KeyZ"],"Undo");H.registerDefaultKeyboardShortcut(Kn,["CtrlOrMeta+Shift+KeyZ","CtrlOrMeta+KeyY"],"Redo");var Mo="jsdraw.tools.increaseSize";H.registerDefaultKeyboardShortcut(Mo,["Equal","Shift+Equal"],"Increase pen/eraser size");var Do="jsdraw.tools.decreaseSize";H.registerDefaultKeyboardShortcut(Do,["Minus","Shift+Minus"],"Decrease pen/eraser size");var io="jsdraw.tools.snapToGrid";H.registerDefaultKeyboardShortcut(io,["Control","Meta"],"Snap to grid (press and hold)");var Gn="jsdraw.tools.lockToLine";H.registerDefaultKeyboardShortcut(Gn,["Shift"],"Snap to XY axes (press and hold)");var kr="js-draw.tools.FindTool.toggleVisible";H.registerDefaultKeyboardShortcut(kr,["CtrlOrMeta+KeyF"],"Shows/hides the find tool");var jn="jsdraw.tools.PanZoom.moveLeft";H.registerDefaultKeyboardShortcut(jn,["ArrowLeft","KeyH","KeyA"],"Pan left");var _n="jsdraw.tools.PanZoom.moveRight";H.registerDefaultKeyboardShortcut(_n,["ArrowRight","KeyL","KeyD"],"Pan right");var qn="jsdraw.tools.PanZoom.moveUp";H.registerDefaultKeyboardShortcut(qn,["ArrowUp","KeyK","KeyQ"],"Pan up");var Zn="jsdraw.tools.PanZoom.moveDown";H.registerDefaultKeyboardShortcut(Zn,["ArrowDown","KeyJ","KeyE"],"Pan down");var Yn="jsdraw.tools.PanZoom.rotateViewClockwise";H.registerDefaultKeyboardShortcut(Yn,["Shift+KeyR"],"Rotate viewport clockwise");var Xn="jsdraw.tools.PanZoom.rotateViewCounterClockwise";H.registerDefaultKeyboardShortcut(Xn,["KeyR"],"Rotate viewport counter-clockwise");var Qn="jsdraw.tools.PanZoom.zoomIn";H.registerDefaultKeyboardShortcut(Qn,["KeyW"],"Zoom in");var Jn="jsdraw.tools.PanZoom.zoomOut";H.registerDefaultKeyboardShortcut(Jn,["KeyS"],"Zoom out");var Ao=(a=>(a[a.OneFingerTouchGestures=1]="OneFingerTouchGestures",a[a.TwoFingerTouchGestures=2]="TwoFingerTouchGestures",a[a.RightClickDrags=4]="RightClickDrags",a[a.SinglePointerGestures=8]="SinglePointerGestures",a[a.Keyboard=16]="Keyboard",a[a.RotationLocked=32]="RotationLocked",a))(Ao||{}),ei=class{constructor(o,e,r){this.initialVelocity=o;this.scrollBy=e;this.onComplete=r;this.running=!1;this.start()}async start(){if(this.running)return;this.currentVelocity=this.initialVelocity;let o=performance.now();this.running=!0;let e=5e3,r=200;for(this.currentVelocity.magnitude()>e&&(this.currentVelocity=this.currentVelocity.normalized().times(e));this.running&&this.currentVelocity.magnitude()>r;){let n=performance.now(),i=(n-o)/1e3;this.currentVelocity=this.currentVelocity.times(Math.pow(1/8,i)),this.scrollBy(this.currentVelocity.times(i)),await Ye(),o=n}this.running&&this.stop()}getCurrentVelocity(){return this.running?this.currentVelocity:null}stop(){this.running&&(this.running=!1,this.onComplete())}},Ce=class extends K{constructor(e,r,n){super(e.notifier,n);this.editor=e;this.mode=r;this.transform=null;this.initialRotationSnapAngle=.22;this.afterRotationStartSnapAngle=.07;this.pinchZoomStartThreshold=1.08;this.lastPointerDownTimestamp=0;this.initialTouchAngle=0;this.initialViewportRotation=0;this.initialViewportScale=0;this.isScaling=!1;this.isRotating=!1;this.inertialScroller=null;this.velocity=null}canReceiveInputInReadOnlyEditor(){return!0}computePinchData(e,r){if(e.id<r.id){let d=e;e=r,r=d}let n=r.screenPos.minus(e.screenPos),i=n.angle(),a=n.magnitude(),l=r.canvasPos.plus(e.canvasPos).times(.5),c=r.screenPos.plus(e.screenPos).times(.5);return{canvasCenter:l,screenCenter:c,angle:i,dist:a}}allPointersAreOfType(e,r){return e.every(n=>n.device===r)}onPointerDown({allPointers:e,current:r}){let n=!1,i=this.inertialScroller?.getCurrentVelocity()??w.zero;this.inertialScroller?.stop(),this.velocity=i,this.lastPointerDownTimestamp=r.timeStamp;let a=this.allPointersAreOfType(e,2),l=this.allPointersAreOfType(e,4);if(a&&e.length===2&&this.mode&2){let{screenCenter:c,angle:d,dist:u}=this.computePinchData(e[0],e[1]);this.lastTouchDist=u,this.startTouchDist=u,this.lastScreenCenter=c,this.initialTouchAngle=d,this.initialViewportRotation=this.editor.viewport.getRotationAngle(),this.initialViewportScale=this.editor.viewport.getScaleFactor(),this.isScaling=!1,this.isRotating=Math.abs(Math.sin(this.initialViewportRotation*2))>.001,n=!0}else e.length===1&&(this.mode&1&&a||l&&this.mode&4||this.mode&8)&&(this.lastScreenCenter=e[0].screenPos,this.isScaling=!1,n=!0);return n&&(this.lastTimestamp=performance.now(),this.transform??=Ee.transformBy(k.identity),this.editor.display.setDraftMode(!0)),n}updateVelocity(e){let r=e.minus(this.lastScreenCenter),n=(performance.now()-this.lastTimestamp)/1e3;if(r.magnitude()===0&&n<.1||n===0)return;n=Math.max(n,.01);let i=r.times(1/n),a=i;this.velocity&&(a=this.velocity.lerp(i,.5)),this.velocity=a}getCenterDelta(e){return this.editor.viewport.screenToCanvasTransform.transformVec3(e.minus(this.lastScreenCenter))}toSnappedRotationDelta(e){let n=e-this.initialTouchAngle+this.initialViewportRotation,i=Math.PI/2,a=Math.round(n/i)*i,l=this.isRotating?this.afterRotationStartSnapAngle:this.initialRotationSnapAngle;return Math.abs(n-a)<l&&(n=a,n!==0&&(n+=1e-4)),n-this.editor.viewport.getRotationAngle()}toSnappedScaleFactor(e){let r=this.initialViewportScale*e/this.startTouchDist,n=this.editor.viewport.getScaleFactor(),i=Math.log(r)/Math.log(10),a=Math.round(i);return Math.abs(a-i)<.04?Math.pow(10,a)/n:e/this.lastTouchDist}handleTwoFingerMove(e){let{screenCenter:r,canvasCenter:n,angle:i,dist:a}=this.computePinchData(e[0],e[1]),l=this.getCenterDelta(r),c;if(this.isRotationLocked()?c=0:c=this.toSnappedRotationDelta(i),Math.abs(c)>1e-8&&(this.isRotating=!0),this.updateVelocity(r),!this.isScaling){let p=a/this.startTouchDist,h=this.pinchZoomStartThreshold,m=1/this.pinchZoomStartThreshold;(p>h||p<m)&&(this.isScaling=!0)}let d=1;this.isScaling&&(d=this.toSnappedScaleFactor(a),this.lastTouchDist=a);let u=k.translation(l).rightMul(k.scaling2D(d,n)).rightMul(k.zRotation(c,n));return this.lastScreenCenter=r,this.transform=Ee.transformBy(this.transform.transform.rightMul(u)),u}handleOneFingerMove(e){let r=this.getCenterDelta(e.screenPos),n=k.translation(r);return this.transform=Ee.transformBy(this.transform.transform.rightMul(n)),this.updateVelocity(e.screenPos),this.lastScreenCenter=e.screenPos,n}onPointerMove({allPointers:e}){this.transform??=Ee.transformBy(k.identity);let r=k.identity;e.length===2?r=this.handleTwoFingerMove(e):e.length===1&&(r=this.handleOneFingerMove(e[0])),Ee.transformBy(r).apply(this.editor),this.lastTimestamp=performance.now()}onPointerUp(e){let r=()=>{this.transform&&(this.transform.unapply(this.editor),this.editor.dispatch(this.transform,!1)),this.editor.display.setDraftMode(!1),this.transform=null,this.velocity=w.zero};if(e.current.device===2&&e.allPointers.length===1&&this.velocity!==null&&e.current.timeStamp-this.lastPointerDownTimestamp>30&&this.velocity!==null){let a=this.velocity;this.updateVelocity(e.current.screenPos),a.magnitude()<this.velocity.magnitude()&&(this.velocity=a),this.inertialScroller?.stop(),this.inertialScroller=new ei(this.velocity,l=>{if(!this.transform)return;let c=this.editor.viewport.screenToCanvasTransform.transformVec3(l);this.transform.unapply(this.editor),this.transform=Ee.transformBy(this.transform.transform.rightMul(k.translation(c))),this.transform.apply(this.editor)},r)}else r()}onGestureCancel(){this.inertialScroller?.stop(),this.velocity=w.zero,this.transform?.unapply(this.editor),this.editor.display.setDraftMode(!1),this.transform=null}updateTransform(e,r=!1){let n=e;this.transform&&(n=this.transform.transform.rightMul(e)),this.transform?.unapply(this.editor),this.transform=Ee.transformBy(n),this.transform.apply(this.editor),r&&this.editor.announceForAccessibility(this.transform.description(this.editor,this.editor.localization))}applyAndFinalizeTransform(e){this.updateTransform(e,!0),this.transform=null}onWheel({delta:e,screenPos:r}){this.inertialScroller?.stop(),this.transform=Ee.transformBy(k.identity);let n=this.editor.viewport.screenToCanvas(r),a=this.editor.viewport.screenToCanvasTransform.transformVec3(F.of(-e.x,-e.y,0)),l=e.z;l=Math.atan(l/2)*2;let d=k.scaling2D(Math.max(.4,Math.min(Math.pow(1.04,-l),4)),n).rightMul(k.translation(a));return this.applyAndFinalizeTransform(d),!0}onKeyPress(e){if(this.inertialScroller?.stop(),!(this.mode&16))return!1;this.transform=Ee.transformBy(k.identity);let r=w.zero,n=1,i=0,a=this.editor.shortcuts;if(a.matchesShortcut(jn,e))r=w.of(-1,0);else if(a.matchesShortcut(_n,e))r=w.of(1,0);else if(a.matchesShortcut(qn,e))r=w.of(0,-1);else if(a.matchesShortcut(Zn,e))r=w.of(0,1);else if(a.matchesShortcut(Qn,e))n=1/2;else if(a.matchesShortcut(Jn,e))n=2;else if(a.matchesShortcut(Yn,e))i=1;else if(a.matchesShortcut(Xn,e))i=-1;else return!1;r=r.times(30),i*=Math.PI/8,r=r.times(-1),i=i*-1,n=1/n,i!==0&&(i+=1e-4),this.isRotationLocked()&&(i=0),r=this.editor.viewport.screenToCanvasTransform.transformVec3(r);let c=this.editor.viewport.visibleRect.center,d=k.scaling2D(n,c).rightMul(k.zRotation(i,c)).rightMul(k.translation(r));return this.applyAndFinalizeTransform(d),!0}isRotationLocked(){return!!(this.mode&32)}setModeEnabled(e,r){let n=this.mode;r?n|=e:n&=~e,this.setMode(n)}setMode(e){e!==this.mode&&(this.mode=e,this.editor.notifier.dispatch(2,{kind:2,tool:this}))}getMode(){return this.mode}};var ns=s=>({fill:s.fill,stroke:s.stroke?{...s.stroke}:void 0}),Rr=(s,o)=>(s===o||s.fill.eq(o.fill)&&s.stroke==null==(o.stroke==null)&&(s.stroke?.color?.eq(o.stroke?.color)??!0)&&s.stroke?.width===o.stroke?.width)??!1,zr=s=>{let o=s.stroke?{color:s.stroke.color.toHexString(),width:s.stroke.width}:void 0;return{fill:s.fill.toHexString(),stroke:o}},Lr=s=>{let o=s.stroke?{color:L.fromHex(s.stroke.color),width:s.stroke.width}:void 0;return{fill:L.fromHex(s.fill),stroke:o}};var ti=s=>({...s,renderingStyle:ns(s.renderingStyle)}),Ir=s=>{if(typeof s=="string"&&(s=JSON.parse(s)),typeof s.fontFamily!="string")throw new Error("Serialized textStyle missing string fontFamily attribute!");return{renderingStyle:Lr(s.renderingStyle),size:s.size,fontWeight:s.fontWeight,fontVariant:s.fontVariant,fontFamily:s.fontFamily}},Br=s=>({...s,renderingStyle:zr(s.renderingStyle)});var is=s=>{let o={};return s.color&&(o.color=s.color.toHexString()),s.textStyle&&(o.textStyle=Br(s.textStyle)),o},ss=s=>{let o=s.color?L.fromHex(s.color):void 0,e=s.textStyle?Ir(s.textStyle):void 0;return{color:o,textStyle:e}},pt=(s,o,e)=>new oi(s,o,e.getId(),e),Vo=s=>!(!("getStyle"in s&&"updateStyle"in s&&"forceStyle"in s)||!("isRestylableComponent"in s)||!s.isRestylableComponent),as="default-restyle-element",oi=class s extends Ct{constructor(e,r,n,i){super(as,n,i);this.originalStyle=e;this.newStyle=r}getComponent(e){this.resolveComponent(e.image);let r=this.component;if(!r||!r.forceStyle||!r.updateStyle)throw new Error("this.component is missing forceStyle and/or updateStyle methods!");return r}apply(e){this.getComponent(e).forceStyle(this.newStyle,e)}unapply(e){this.getComponent(e).forceStyle(this.originalStyle,e)}description(e,r){return r.restyledElement(this.getComponent(e).description(r))}serializeToJSON(){return{id:this.componentID,originalStyle:is(this.originalStyle),newStyle:is(this.newStyle)}}static{W.register(as,(e,r)=>{let n=ss(e.originalStyle),i=ss(e.newStyle),a=e.id;if(typeof e.id!="string")throw new Error(`json.id is of type ${typeof e.id}, not string.`);return new s(n,i,a)})}};var ht=s=>s.path?s.path:new $(s.startPoint,s.commands),Z=(s,o)=>({startPoint:s.startPoint,style:o,commands:s.parts,path:s}),Aa=(s,o)=>s.path?s:{...s,path:o},Mr=(s,o,e={fastCheck:!0,expensiveCheck:!0})=>{let r=ht(s),n=s.style.stroke?.width??0,i=n>0&&s.style.fill.a===0,a=r.bbox.grownBy(n),l=i&&n>o.maxDimension&&a.containsRect(o);if(e.fastCheck&&l&&s.style.stroke){let c=n/2;for(let d of r.startEndPoints())if(o.isWithinRadiusOf(c,d))return{rectangle:o,path:Z($.fromRect(o),{fill:s.style.stroke.color}),fullScreen:!0}}if(e.expensiveCheck&&l&&s.style.stroke&&n>o.maxDimension*3){let c=r.signedDistance(o.center,n/2),d=n/6;if(c<-o.maxDimension/2-d)return{path:Z($.fromRect(o),{fill:s.style.stroke.color}),rectangle:o,fullScreen:!0};if(c>o.maxDimension/2+d)return{path:Z($.empty,{fill:L.transparent}),rectangle:I.empty,fullScreen:!1}}return null},Dr=(s,o)=>{let e=ht(s),r=s.style.stroke?.width??0,n=r>0&&s.style.fill.a===0,i=e.bbox.grownBy(r),a=Mr(s,o,{fastCheck:!0,expensiveCheck:!1});if(a)return a.path;if(o.grownBy(r).transformedBoundingBox(k.scaling2D(4,o.center)).containsRect(i))return Aa(s,e);let c=[],d=e.startPoint;for(let h of e.parts){let m=$.computeBBoxForSegment(d,h).grownBy(r),g;h.kind===0||h.kind===1?g=h.point:g=h.endPoint,m.intersects(o)?c.push(h):n||h.kind===1?c.push({kind:1,point:g}):c.push({kind:0,point:g}),d=g}let u=new $(e.startPoint,c),p=s.style;return a=Mr(s,o,{fastCheck:!1,expensiveCheck:!0}),a?a.path:Z(u,p)};var ee=class s extends _{constructor(e,r){super("stroke",r);this.isRestylableComponent=!0;this.simplifiedPath=null;this.approximateRenderingTime=0,this.parts=[];for(let n of e){let i=ht(n),a=this.bboxForPart(i.bbox,n.style);this.contentBBox?this.contentBBox=this.contentBBox.union(a):this.contentBBox=a,this.parts.push({path:i,startPoint:i.startPoint,style:n.style,commands:i.parts}),this.approximateRenderingTime+=i.parts.length}this.contentBBox??=I.empty}getStyle(){if(this.parts.length===0)return{};let e=this.parts[0];return e.style.stroke===void 0||e.style.stroke.width===0?{color:e.style.fill}:{color:e.style.stroke.color}}updateStyle(e){return pt(this.getStyle(),e,this)}forceStyle(e,r){e.color&&(this.parts=this.parts.map(n=>{let i={...n.style,stroke:n.style.stroke?{...n.style.stroke}:void 0};return i.stroke&&i.stroke.width>0?i.stroke.color=e.color:i.fill=e.color,{path:n.path,startPoint:n.startPoint,commands:n.commands,style:i}}),r&&(r.image.queueRerenderOf(this),r.queueRerender()))}withRegionErased(e,r){let n=e.polylineApproximation(),i=c=>e.closedContainsPoint(c),a=[],l=!1;for(let c of this.parts){let d=c.path,u=b=>{if(c.style.fill.a>0){if(b.parts.length<1||b.parts.length===1&&b.parts[0].kind===0)return null;b=b.asClosed()}return isNaN(b.getExactBBox().area)?(console.warn("Prevented creating a stroke with NaN area"),l=!0,null):new s([Z(b,c.style)],this.getZIndex())},p=[];for(let b of n)p.push(...d.intersection(b));let h=!1;if(p.length===0&&c.style.stroke&&c.style.stroke.width>e.bbox.minDimension*.3&&c.style.stroke.width<e.bbox.maxDimension*30){for(let b of n)p.push(...d.intersection(b,c.style.stroke.width/2));h=!0}p.sort(Eo);let g=(()=>{if(p.length===0)return!1;if(h)return p[0].curveIndex===0&&p[0].parameterValue<=0;let b=vr(p[0],-1e-10);return i(d.at(b))})()?1:0,v=(b,y)=>{let f=u(b),T=g%2===1;g++,y!==void 0&&(T=y),y===void 0&&!T&&e.closedContainsPoint(b.getExactBBox().center)&&(T=!T),f&&(l||=T&&b.getExactBBox().maxDimension>e.getExactBBox().maxDimension*2,T||a.push(f))};if(c.style.fill.a===0){if(!(e.getExactBBox().maxDimension/10>d.getExactBBox().maxDimension)){let y=d.splitAt(p,{mapNewPoint:f=>r.roundPoint(f)});for(let f of y)v(f)}}else if(p.length>=2&&p.length%2===0){let b=d.splitAt(p,{mapNewPoint:y=>r.roundPoint(y)});for(let y=0;y<Math.floor(b.length/2);y++)v(b[y].union(b[b.length-y-1]).asClosed());b.length%2!==0&&v(b[Math.floor(b.length/2)].asClosed())}else v(d,!1)}return l?[this]:a}intersects(e){for(let r of this.parts){let n=r.style.stroke?.width,i=n?n/2:void 0;if(r.path.intersection(e,i).length>0)return!0}return!1}keyPoints(){return this.parts.map(e=>e.startPoint).flat()}intersectsRect(e){if(!e.intersects(this.getBBox()))return!1;for(let r of this.parts){let n=e.grownBy(-(r.style.stroke?.width??0));if(n.area!==0){for(let i of r.path.startEndPoints())if(n.containsPoint(i))return!0}}return super.intersectsRect(e)}computeSimplifiedPathFor(e){let r=[],n=!1,i=!1;for(let a of this.parts){if(i||!a.style.stroke||a.style.stroke.color.a<.99){r.push(a);continue}let l=Mr(a,e);l?(r.push(l.path),l.fullScreen&&(n=!0,i=!0)):r.push(a)}return{forVisibleRect:e,parts:r,occludes:n}}occludesEverythingBelowWhenRenderedInRect(e){return this.getBBox().containsRect(e)?((!this.simplifiedPath||!this.simplifiedPath.forVisibleRect.eq(e))&&(this.simplifiedPath=this.computeSimplifiedPathFor(e)),this.simplifiedPath.occludes):!1}render(e,r){e.startObject(this.getBBox());let n=this.parts;r&&this.simplifiedPath?.forVisibleRect?.containsRect(r)?n=this.simplifiedPath.parts:this.simplifiedPath=null;for(let i of n){let a=this.bboxForPart(i.path.bbox,i.style);r&&(!a.intersects(r)||(a.size.x>r.size.x*3||a.size.y>r.size.y*3)&&!i.path.roughlyIntersects(r,i.style.stroke?.width??0))||e.drawPath(i)}e.endObject(this.getLoadSaveData())}getProportionalRenderingTime(){return this.approximateRenderingTime}bboxForPart(e,r){return r.stroke?e.grownBy(r.stroke.width/2):e}getExactBBox(){let e=null;for(let{path:r,style:n}of this.parts){let i=this.bboxForPart(r.getExactBBox(),n);e??=i,e=e.union(i)}return e??I.empty}applyTransformation(e){this.contentBBox=I.empty;let r=!0;this.parts=this.parts.map(n=>{let i=n.path.transformedBy(e),a={...n.style,stroke:n.style.stroke?{...n.style.stroke}:void 0};if(a.stroke){let c=e.getScaleFactor();a.stroke.width*=c}let l=this.bboxForPart(i.bbox,a);return r?(this.contentBBox=l,r=!1):this.contentBBox=this.contentBBox.union(l),{path:i,startPoint:i.startPoint,commands:i.parts,style:a}})}getParts(){return[...this.parts]}getPath(){let e=null;for(let r of this.parts)e?e=e.union(r.path):e??=r.path;return e??$.empty}description(e){return e.stroke}createClone(){return new s(this.parts)}serializeToJSON(){return this.parts.map(e=>({style:zr(e.style),path:e.path.serialize()}))}static deserializeFromJSON(e){if(typeof e=="string"&&(e=JSON.parse(e)),typeof e!="object"||typeof e.length!="number")throw new Error(`${e} is missing required field, parts, or parts is of the wrong type.`);let r=e.map(n=>{let i=Lr(n.style);return Z($.fromString(n.path),i)});return new s(r)}};_.registerComponent("stroke",ee.deserializeFromJSON);var Pt=class{constructor(o,e,r,n){this.startPoint=o;this.minFitAllowed=e;this.maxFitAllowed=r;this.onCurveAdded=n;this.isFirstSegment=!0;this.lastExitingVec=null;this.currentCurve=null;this.lastPoint=this.startPoint,this.buffer=[this.startPoint.pos],this.momentum=w.zero,this.currentCurve=null,this.curveStartWidth=o.width,this.bbox=new I(this.startPoint.pos.x,this.startPoint.pos.y,0,0)}getBBox(){return this.bbox}preview(){return this.currentCurve?this.currentSegmentToPath():null}approxCurrentCurveLength(){if(!this.currentCurve)return 0;let o=this.currentCurve.p0,e=this.currentCurve.p1,r=this.currentCurve.p2,n=o.distanceTo(e),i=r.distanceTo(e);return n+i}finalizeCurrentCurve(){if(!this.currentCurve)return;this.onCurveAdded(this.currentSegmentToPath());let o=this.buffer[this.buffer.length-1];this.lastExitingVec=this.currentCurve.p2.minus(this.currentCurve.p1),console.assert(this.lastExitingVec.magnitude()!==0,"lastExitingVec has zero length!"),this.buffer=[this.buffer[this.buffer.length-2],o],this.currentCurve=null,this.isFirstSegment=!1}currentSegmentToPath(){if(this.currentCurve==null)throw new Error("Invalid State: currentCurve is null!");let o=this.currentCurve.normal(0).normalized();if(!isFinite(o.magnitude()))throw new Error(`startVec(${o}) is NaN or \u221E`);let e=this.currentCurve.at(0),r=this.currentCurve.at(1),n=this.currentCurve.p1;return{startPoint:e,controlPoint:n,endPoint:r,startWidth:this.curveStartWidth,endWidth:this.curveEndWidth}}computeExitingVec(){return this.momentum.normalized().times(this.lastPoint.width/2)}addPoint(o){if(this.lastPoint){let T=o.time-this.lastPoint.time;if(o.pos.eq(this.lastPoint.pos,1e-10)||T===0)return;if(isNaN(o.pos.magnitude())){console.warn("Discarding NaN point.",o);return}let P=Math.min(this.lastPoint.width,o.width)/3;if(this.startPoint.pos.distanceTo(o.pos)<P&&this.isFirstSegment)return;let E=T/1e3,C=o.pos.minus(this.lastPoint.pos).times(1/E);this.momentum=C}let e=this.lastPoint??o;this.lastPoint=o,this.buffer.push(o.pos);let r=o.width,n=this.curveEndWidth;if(this.curveEndWidth=r,this.bbox=this.bbox.grownToPoint(o.pos,r),this.currentCurve===null){let f=e.pos,T=e.pos.plus(this.lastExitingVec??w.unitX),P=o.pos;this.currentCurve=new De(f,T,P),console.assert(!isNaN(f.magnitude())&&!isNaN(T.magnitude())&&!isNaN(P.magnitude()),"Expected !NaN"),this.isFirstSegment?this.curveStartWidth=(this.curveStartWidth+r)/2:this.curveStartWidth=n}let i=this.lastExitingVec;if(!i){let f=Math.ceil(this.buffer.length/2);(f===0||f>=this.buffer.length)&&(f=this.buffer.length-1),i=this.buffer[f].minus(this.buffer[0])}let a=this.computeExitingVec(),l=1.7,c=this.buffer[0],d=o.pos,u=d.distanceTo(c),p=l*u;if(p===0||a.magnitude()===0||!isFinite(a.magnitude()))return;console.assert(isFinite(i.magnitude()),"Pre-normalized enteringVec has NaN or \u221E magnitude!"),i=i.normalized(),a=a.normalized(),console.assert(isFinite(i.magnitude()),"Normalized enteringVec has NaN or \u221E magnitude!");let h=new ue(c,c.plus(i.times(p))),g=new ue(d.minus(a.times(p)),d).intersection(h),v=null;g&&(v=g.point),v||(v=c.lerp(d,.5).lerp(c.plus(i.times(u)),.1)),(c.eq(v)||d.eq(v))&&(v=c.plus(i.times(u/5))),console.assert(!c.eq(v,1e-11),"Start and control points are equal!"),console.assert(!v.eq(d,1e-11),"Control and end points are equal!");let b=this.currentCurve;this.currentCurve=new De(c,v,d),isNaN(this.currentCurve.normal(0).magnitude())&&(console.error("NaN normal at 0. Curve:",this.currentCurve),this.currentCurve=b);let y=f=>{let T=Math.min(Math.max(Math.min(this.curveStartWidth,this.curveEndWidth)/4,this.minFitAllowed),this.maxFitAllowed),P=T,S=0;for(let E of this.buffer){let C=f.approximateDistance(E);if(C>T&&(C=f.distance(E),S+=Math.max(0,C-T),S>P))return!1}return!0};if(this.buffer.length>3&&this.approxCurrentCurveLength()>this.curveStartWidth/2&&!y(this.currentCurve)){this.currentCurve=b,this.curveEndWidth=n,this.lastPoint=e,this.finalizeCurrentCurve();return}}},ls=Pt;var Va=s=>(o,e)=>new ri(s,o,e),so=Va,cs=(s,o,e)=>({points:[s,o[o.length-1]]}),ds=(s,o,e)=>({points:[...e.corners,e.corners[0]]}),ri=class{constructor(o,e,r){this.sourceFactory=o;this.startPoint=e;this.viewport=r;this.builder=o(e,r),this.points=[e]}getBBox(){return this.builder.getBBox()}build(){return this.builder.build()}preview(o){this.builder.preview(o)}addPoint(o){this.points.push(o),this.builder.addPoint(o)}async autocorrectShape(){let o=this.viewport.canvasToScreen(this.startPoint.pos),e=this.points.map(S=>this.viewport.canvasToScreen(S.pos)),r=I.bboxOf(e),n=this.viewport.canvasToScreen(this.viewport.snapToGrid(this.startPoint.pos)),i=this.points.map(S=>this.viewport.canvasToScreen(this.viewport.snapToGrid(S.pos))),a=I.bboxOf(i);if(r.maxDimension<32)return null;let l=Math.min(30,r.maxDimension/4),c=[{...cs(n,i,a),toleranceMultiplier:.5},cs(o,e,r),{...ds(n,i,a),toleranceMultiplier:.6},ds(o,e,r)],u=(S=>{for(let E of c){let C=E.points,V=S*S*(E.toleranceMultiplier??1),O=de=>{for(;de<0;)de+=C.length;return de%=C.length,C[de]},G=null,se=1/0,oe=0;for(let de=0;de<C.length;de++){let We=C[de],_e=We.squareDistanceTo(o);(!G||_e<se)&&(se=_e,G=We,oe=de)}let fe=0,Se=oe;for(let de of e){let We=1/0,_e=Se,st=6;for(let at=-st;at<=st;at++){let Ve=Se+at,yt=O(Ve-1),Yt=O(Ve),Ke=O(Ve+1),sr=new ue(yt,Yt),ar=new ue(Yt,Ke),bn=sr.distance(de),qe=ar.distance(de),lr=Math.min(bn,qe),vo=lr*lr;vo<We&&(We=vo,_e=Ve)}if(Se=_e,fe=Math.max(We,fe),fe>V)break}if(fe<V)return C}return null})(l);if(!u)return null;let p=this.points[this.points.length-1],h=this.startPoint.width,m=p.width,g=this.startPoint.color,v=p.color,b=this.startPoint.time,y=p.time,f=S=>{let E=u[Math.max(0,Math.floor(S))],C=u[Math.min(Math.ceil(S),u.length-1)],V=E.lerp(C,S-Math.floor(S)),O=S/u.length;return{pos:this.viewport.screenToCanvas(V),width:h*(1-O)+m*O,color:g.mix(v,O),time:b*(1-O)+y*O}},T=this.sourceFactory(f(0),this.viewport),P=u.length<10;for(let S=0;S<u.length;S++)P&&T.addPoint(f(S-.001)),T.addPoint(f(S)),P&&T.addPoint(f(S+.001));return T.build()}};var Qe=so((s,o)=>{let e=o.getSizeOfPixelOnCanvas()*3,r=o.getSizeOfPixelOnCanvas();return new Ar(s,r,e,o)}),Ar=class{constructor(o,e,r,n){this.startPoint=o;this.minFitAllowed=e;this.viewport=n;this.isFirstSegment=!0;this.parts=[];this.widthAverageNumSamples=1;this.curveFitter=new Pt(o,e,r,i=>this.addCurve(i)),this.averageWidth=o.width,this.bbox=new I(this.startPoint.pos.x,this.startPoint.pos.y,0,0)}getBBox(){return this.bbox}getRenderingStyle(){return{fill:L.transparent,stroke:{color:this.startPoint.color,width:this.roundDistance(this.averageWidth)}}}previewCurrentPath(){let e=[...this.parts.slice(),...this.curveToPathCommands(this.curveFitter.preview())];return{startPoint:this.startPoint.pos,commands:e,style:this.getRenderingStyle()}}previewFullPath(){let o=this.previewCurrentPath();return o?[o]:null}previewStroke(){let o=this.previewFullPath();return o?new ee(o):null}preview(o){let e=this.previewFullPath();if(e){let r=this.viewport.visibleRect;o.startObject(r);for(let n of e)o.drawPath(n);o.endObject()}}build(){return this.curveFitter.finalizeCurrentCurve(),this.previewStroke()}getMinFit(){let o=Math.min(this.minFitAllowed,this.averageWidth/3);return o<1e-10&&(o=this.minFitAllowed),o}roundPoint(o){let e=this.getMinFit();return U.roundPoint(o,e)}roundDistance(o){let e=this.getMinFit();return U.roundPoint(o,e)}curveToPathCommands(o){if(!o){if(!this.isFirstSegment)return[];let r=U.roundPoint(this.averageWidth/10,Math.min(this.minFitAllowed,this.averageWidth/10)),n=this.roundPoint(this.startPoint.pos);return[{kind:3,controlPoint:n.plus(w.of(r,r)),endPoint:n.plus(w.of(0,r))},{kind:3,controlPoint:n.plus(w.of(-r,r)),endPoint:n.plus(w.of(-r,0))},{kind:3,controlPoint:n.plus(w.of(-r,-r)),endPoint:n.plus(w.of(0,-r))},{kind:3,controlPoint:n.plus(w.of(r,-r)),endPoint:n.plus(w.of(r,0))}]}let e=[];return this.isFirstSegment&&e.push({kind:1,point:this.roundPoint(o.startPoint)}),e.push({kind:3,controlPoint:this.roundPoint(o.controlPoint),endPoint:this.roundPoint(o.endPoint)}),e}addCurve(o){let e=this.curveToPathCommands(o);this.parts.push(...e),this.isFirstSegment&&(this.isFirstSegment=!1)}addPoint(o){this.curveFitter.addPoint(o),this.widthAverageNumSamples++,this.averageWidth=this.averageWidth*(this.widthAverageNumSamples-1)/this.widthAverageNumSamples+o.width/this.widthAverageNumSamples}};var Re=class{#e=null;constructor(){}setEmitListener(o){o&&typeof o=="object"?this.#e=e=>o.onEvent(e)??!1:this.#e=o}emit(o){return this.#e?.(o)??!1}};var Oa={kind:0,mass:.4,springConstant:100,frictionCoefficient:.28,maxPointDist:10,inertiaFraction:.75,minSimilarityToFinalize:0,velocityDecayFactor:.1},ni=class{constructor(o,e,r){this.updatePointer=e;this.options=r;this.runLoop=!0;this.lastUpdateTime=0;this.velocity=w.zero;this.strokePoint=o,this.targetPoint=o,this.targetInterval=10,this.loop()}async loop(){for(this.lastUpdateTime=performance.now();this.runLoop;)this.update(!1),await Ye()}setTarget(o){this.targetPoint=o}getNextVelocity(o){let e=this.targetPoint.minus(this.strokePoint),r=e.times(this.options.springConstant),i=this.options.mass*10,a=this.velocity.normalizedOrZero().times(-this.options.frictionCoefficient*i),l=r.plus(a).times(1/this.options.mass),c=this.options.velocityDecayFactor,d=this.velocity.times(1-c).plus(l.times(o/1e3));return e.normalizedOrZero().times(d.length()).lerp(d,this.options.inertiaFraction)}update(o){let e=performance.now(),r=e-this.lastUpdateTime,n=this.strokePoint.eq(this.targetPoint);if(r>this.targetInterval||o){if(!n){let i,a,l=1;do i=this.getNextVelocity(r/l),a=i.times(r/1e3),l++;while(a.magnitude()>this.options.maxPointDist&&l<10);for(let c=0;c<l;c++)this.velocity=this.getNextVelocity(r/l),a=this.velocity.times(r/1e3),this.strokePoint=this.strokePoint.plus(a),c<l-1&&this.updatePointer(this.strokePoint,e)}if(this.lastUpdateTime=e,o||!n)return this.updatePointer(this.strokePoint,e)}return!1}finish(){this.runLoop=!1;let o=this.targetPoint.minus(this.strokePoint);this.velocity.dot(o)>this.options.minSimilarityToFinalize&&this.updatePointer(this.targetPoint,performance.now())}cancel(){this.runLoop=!1}},Et=class s extends Re{constructor(e,r=Oa){super();this.viewport=e;this.options=r;this.stabilizer=null;this.lastPointerEvent=null}mapPointerEvent(e){return oo(e)&&e.kind!==2&&(this.lastPointerEvent=e),e.kind===3||e.allPointers.length>1||this.stabilizer===null?this.emit(e):(this.stabilizer.setTarget(e.current.screenPos),e.kind===1?this.stabilizer.update(!0):e.kind===2?(this.stabilizer.finish(),this.emit(e)):this.emit(e))}emitPointerMove(e,r){if(!this.lastPointerEvent)return!1;let n=this.lastPointerEvent.current.withScreenPosition(e,this.viewport).withTimestamp(r),i={kind:1,current:n,allPointers:[n]};return this.emit(i)}onEvent(e){if(oo(e)||e.kind===3){e.kind===0&&(this.stabilizer===null?this.stabilizer=new ni(e.current.screenPos,(n,i)=>this.emitPointerMove(n,i),this.options):e.allPointers.length>1&&(this.stabilizer.cancel(),this.stabilizer=null));let r=this.mapPointerEvent(e);return(e.kind===2||e.kind===3)&&(this.stabilizer?.cancel(),this.stabilizer=null),r}return this.emit(e)}static fromEditor(e){return new s(e.viewport)}};var Vr={maxSpeed:8.5,maxRadius:11,minTimeSeconds:.5},kt=class{constructor(o,e,r){this.config=e;this.onStationary=r;this.timeout=null;this.stationaryStartPointer=o,this.lastPointer=o,this.averageVelocity=w.zero,this.setStationaryTimeout(this.config.minTimeSeconds*1e3)}onPointerMove(o){if(!this.stationaryStartPointer)return;if(o.id!==this.stationaryStartPointer.id)return!1;let e=o.screenPos.minus(this.lastPointer.screenPos),r=o.screenPos.minus(this.stationaryStartPointer.screenPos),n=(o.timeStamp-this.lastPointer.timeStamp)/1e3;n===0&&(n=1);let i=e.times(1/n);this.averageVelocity=this.averageVelocity.lerp(i,.5);let a=o.timeStamp-this.stationaryStartPointer.timeStamp,l=r.length()>this.config.maxRadius;if(this.hasMovedOutOfRadius||=l,l||this.averageVelocity.length()>this.config.maxSpeed||a<this.config.minTimeSeconds)return this.stationaryStartPointer=o,this.lastPointer=o,this.setStationaryTimeout(this.config.minTimeSeconds*1e3),!1;let c=this.config.minTimeSeconds*1e3-a;return this.lastPointer=o,c<=0}onPointerUp(o){o.id!==this.stationaryStartPointer?.id&&this.cancelStationaryTimeout()}destroy(){this.cancelStationaryTimeout(),this.stationaryStartPointer=null}getHasMovedOutOfRadius(){return this.hasMovedOutOfRadius}cancelStationaryTimeout(){this.timeout!==null&&(clearTimeout(this.timeout),this.timeout=null)}setStationaryTimeout(o){this.timeout===null&&(o<=0?this.onStationary(this.lastPointer):this.timeout=setTimeout(()=>{if(this.timeout=null,!this.stationaryStartPointer)return;let e=performance.now()-this.stationaryStartPointer.timeStamp,r=this.config.minTimeSeconds*1e3-e;r<=0?this.onStationary(this.lastPointer):this.setStationaryTimeout(r)},o))}};var Ne=class extends K{constructor(e,r,n){super(e.notifier,r);this.editor=e;this.builder=null;this.lastPoint=null;this.startPoint=null;this.currentDeviceType=null;this.currentPointerId=null;this.shapeAutocompletionEnabled=!1;this.autocorrectedShape=null;this.lastAutocorrectedShape=null;this.removedAutocorrectedShapeTime=0;this.stationaryDetector=null;this.styleValue=j.fromInitialValue({factory:Qe,color:L.blue,thickness:4,...n}),this.styleValue.onUpdateAndNow(i=>{this.style=i,this.noteUpdated()})}getPressureMultiplier(){let e=this.style.thickness;return 1/this.editor.viewport.getScaleFactor()*e}toStrokePoint(e){let n=Math.max(e.pressure??1,.3);return isFinite(n)||(console.warn("Non-finite pressure!",e),n=.3),console.assert(isFinite(e.canvasPos.length()),"Non-finite canvas position!"),console.assert(isFinite(e.screenPos.length()),"Non-finite screen position!"),console.assert(isFinite(e.timeStamp),"Non-finite timeStamp on pointer!"),{pos:e.canvasPos,width:n*this.getPressureMultiplier(),color:this.style.color,time:e.timeStamp}}previewStroke(){this.editor.clearWetInk();let e=this.editor.display.getWetInkRenderer();if(this.autocorrectedShape){let r=this.editor.viewport.visibleRect;this.autocorrectedShape.render(e,r)}else this.builder?.preview(e)}addPointToStroke(e){if(!this.builder)throw new Error("No stroke is currently being generated.");this.builder.addPoint(e),this.lastPoint=e,this.previewStroke()}onPointerDown(e){if(this.builder&&!this.eventCanCancelStroke(e))return!0;let{current:r,allPointers:n}=e,i=r.device===1,a=r.device===0;return n.length===1&&!i||a?(this.startPoint=this.toStrokePoint(r),this.builder=this.style.factory(this.startPoint,this.editor.viewport),this.currentDeviceType=r.device,this.currentPointerId=r.id,this.shapeAutocompletionEnabled?this.stationaryDetector=new kt(r,Vr,l=>this.autocorrectShape(l)):this.stationaryDetector=null,this.lastAutocorrectedShape=null,this.removedAutocorrectedShapeTime=0,!0):!1}eventCanCancelStroke(e){let r=this.lastPoint?.time??0;if(e.current.timeStamp-r>1e3)return!0;let n=this.currentDeviceType===0,i=e.current.device===2;return!(n&&i)}eventCanBeDeliveredToNonActiveTool(e){return this.eventCanCancelStroke(e)}onPointerMove({current:e}){if(!this.builder||e.device!==this.currentDeviceType||e.id!==this.currentPointerId)return;this.stationaryDetector?.onPointerMove(e)||(this.addPointToStroke(this.toStrokePoint(e)),this.autocorrectedShape&&(this.removedAutocorrectedShapeTime=performance.now(),this.autocorrectedShape=null,this.editor.announceForAccessibility(this.editor.localization.autocorrectionCanceled)))}onPointerUp({current:e}){if(!this.builder)return!1;if(e.id!==this.currentPointerId)return!0;this.stationaryDetector?.onPointerUp(e);let r=this.toStrokePoint(e),n={...r,width:this.lastPoint?.width??r.width};return this.addPointToStroke(n),this.finalizeStroke(),!1}onGestureCancel(){this.builder=null,this.editor.clearWetInk(),this.stationaryDetector?.destroy(),this.stationaryDetector=null}removedAutocorrectedShapeRecently(){return this.removedAutocorrectedShapeTime>performance.now()-320}async autocorrectShape(e){if(!this.builder||!this.builder.autocorrectShape||!this.shapeAutocompletionEnabled||this.autocorrectedShape)return;let r=await this.builder.autocorrectShape();if(!this.builder||!r)return;let n=r.getBBox().area;if(n===0||!isFinite(n))return;let i=r.description(this.editor.localization);this.editor.announceForAccessibility(this.editor.localization.autocorrectedTo(i)),this.autocorrectedShape=r,this.lastAutocorrectedShape=r,this.previewStroke()}finalizeStroke(){if(this.builder){this.lastAutocorrectedShape&&this.removedAutocorrectedShapeRecently()&&(this.autocorrectedShape=this.lastAutocorrectedShape);let e=this.autocorrectedShape??this.builder.build();if(this.previewStroke(),e.getBBox().area>0){e===this.autocorrectedShape&&this.editor.announceForAccessibility(this.editor.localization.autocorrectedTo(e.description(this.editor.localization)));let n=q.addElement(e,!0);this.editor.dispatch(n)}else console.warn("Pen: Not adding empty stroke",e,"to the canvas.")}this.builder=null,this.lastPoint=null,this.autocorrectedShape=null,this.lastAutocorrectedShape=null,this.editor.clearWetInk(),this.stationaryDetector?.destroy(),this.stationaryDetector=null}noteUpdated(){this.editor.notifier.dispatch(2,{kind:2,tool:this})}setColor(e){e.toHexString()!==this.style.color.toHexString()&&this.styleValue.set({...this.style,color:e})}setThickness(e){e!==this.style.thickness&&this.styleValue.set({...this.style,thickness:e})}setStrokeFactory(e){e!==this.style.factory&&this.styleValue.set({...this.style,factory:e})}setHasStabilization(e){let r=!!this.getInputMapper();e!==r&&(r?this.setInputMapper(null):this.setInputMapper(new Et(this.editor.viewport)),this.noteUpdated())}setStrokeAutocorrectEnabled(e){e!==this.shapeAutocompletionEnabled&&(this.shapeAutocompletionEnabled=e,this.noteUpdated())}getStrokeAutocorrectionEnabled(){return this.shapeAutocompletionEnabled}getThickness(){return this.style.thickness}getColor(){return this.style.color}getStrokeFactory(){return this.style.factory}getStyleValue(){return this.styleValue}onKeyPress(e){let r=this.editor.shortcuts,n=r.matchesShortcut(Bo,e);if(this.builder&&n)return this.finalizeStroke(),!1;let i;return r.matchesShortcut(Do,e)?i=this.getThickness()*2/3:r.matchesShortcut(Mo,e)&&(i=this.getThickness()*3/2),i!==void 0?(i=Math.min(Math.max(1,i),256),this.setThickness(i),!0):!1}};var mt=class{constructor(){}notifyEnabled(o){o!==this.activeTool&&(this.activeTool?.setEnabled(!1),this.activeTool=o)}};var Or=(s,o)=>{if(o.length===0)return null;let e=o[0].description(s);for(let r of o)if(r.description(s)!==e)return null;return e};var J=class s extends W{constructor(o){super("erase"),this.toRemove=o.map(e=>e),this.applied=!1}apply(o){for(let e of this.toRemove){let r=o.image.findParent(e);r&&(r.remove(),o.image.onDestroyElement(e))}this.applied=!0,o.queueRerender()}unapply(o){for(let e of this.toRemove)o.image.findParent(e)||q.addElement(e).apply(o);this.applied=!1,o.queueRerender()}onDrop(o){if(this.applied)for(let e of this.toRemove)o.image.onDestroyElement(e)}description(o,e){if(this.toRemove.length===0)return e.erasedNoElements;let r=Or(e,this.toRemove)??e.elements;return e.eraseAction(r,this.toRemove.length)}serializeToJSON(){return this.toRemove.map(e=>e.serialize())}static{W.register("erase",(o,e)=>{if(!Array.isArray(o))throw new Error("seralized erase data must be an array");let r=o.map(n=>{let i=typeof n=="string"?n:`${n.id}`;return e.image.lookupElement(i)??_.deserialize(n)});return new s(r)})}};var Fa=s=>{if(s.some(o=>o&&o.then))return Promise.all(s).then(()=>{})},ii=Fa;var Fr=class extends Ie{constructor(e,r,n){super();this.commands=e;this.applyChunkSize=r;this.descriptionOverride=n}apply(e){if(this.applyChunkSize===void 0){let r=this.commands.map(n=>n.apply(e));return ii(r)}else return e.asyncApplyCommands(this.commands,this.applyChunkSize)}unapply(e){let r=[...this.commands];if(r.reverse(),this.applyChunkSize===void 0){let n=r.map(i=>i.unapply(e));return ii(n)}else return e.asyncUnapplyCommands(r,this.applyChunkSize,!1)}onDrop(e){this.commands.forEach(r=>r.onDrop(e))}description(e,r){if(this.descriptionOverride)return this.descriptionOverride;let n=[],i=null,a=0,l=0;for(let c of this.commands){let d=c.description(e,r);if(d!==i&&i!==null&&(n.push(r.unionOf(i,a)),i=null,a=0),a++,l++,i??=d,n.length>12)break}return a>1?n.push(r.unionOf(i,a)):a===1&&n.push(i),l<this.commands.length&&n.push(r.andNMoreCommands(this.commands.length-l)),n.join(", ")}},si=class extends W{constructor(e,r,n){super("union");this.commands=e;this.applyChunkSize=r;this.descriptionOverride=n;this.nonserializableCommand=new Fr(e,r,n)}serializeToJSON(){return this.serializedData?this.serializedData:{applyChunkSize:this.applyChunkSize,data:this.commands.map(e=>e.serialize()),description:this.descriptionOverride}}apply(e){return this.serializedData=this.serializeToJSON(),this.nonserializableCommand.apply(e)}unapply(e){return this.nonserializableCommand.unapply(e)}onDrop(e){this.nonserializableCommand.onDrop(e)}description(e,r){return this.nonserializableCommand.description(e,r)}},us=(s,o)=>{let e=!0;for(let i of s)if(!(i instanceof W)){e=!1;break}let r,n;if(typeof o=="number"?r=o:(r=o?.applyChunkSize,n=o?.description),e){let i=s;return new si(i,r,n)}else return new Fr(s,r,n)};W.register("union",(s,o)=>{if(typeof s.data.length!="number")throw new Error("Unions of commands must serialize to lists of serialization data.");let e=s.applyChunkSize;if(typeof e!="number"&&e!==void 0)throw new Error("serialized applyChunkSize is neither undefined nor a number.");let r=typeof s.description=="string"?s.description:void 0,n=[];for(let i of s.data)n.push(W.deserialize(i,o));return us(n,{applyChunkSize:e,description:r})});var le=us;var ao=(e=>(e.PartialStroke="partial-stroke",e.FullStroke="full-stroke",e))(ao||{}),ai=class extends K{constructor(e,r){super(e.notifier,e.localization.changeTool);this.editor=e;this.eraser=r}onPointerDown(e){if(e.allPointers.length===1&&e.current.device===1){let n=this.editor.toolController.getPrimaryTools().filter(i=>i.isEnabled());if(n.length?this.previousEnabledTool=n[0]:this.previousEnabledTool=null,this.previousEraserEnabledState=this.eraser.isEnabled(),this.eraser.setEnabled(!0),this.eraser.onPointerDown(e))return!0;this.restoreOriginalTool()}return!1}onPointerMove(e){this.eraser.onPointerMove(e)}restoreOriginalTool(){this.eraser.setEnabled(this.previousEraserEnabledState),this.previousEnabledTool&&this.previousEnabledTool.setEnabled(!0)}onPointerUp(e){this.eraser.onPointerUp(e),this.restoreOriginalTool()}onGestureCancel(e){this.eraser.onGestureCancel(e),this.restoreOriginalTool()}},Je=class extends K{constructor(e,r,n){super(e.notifier,r);this.editor=e;this.lastPoint=null;this.isFirstEraseEvt=!0;this.toAdd=new Set;this.eraseCommands=[];this.addCommands=[];this.thickness=n?.thickness??10,this.thicknessValue=j.fromInitialValue(this.thickness),this.thicknessValue.onUpdate(i=>{this.thickness=i,this.editor.notifier.dispatch(2,{kind:2,tool:this})}),this.modeValue=j.fromInitialValue(n?.mode??"full-stroke"),this.modeValue.onUpdate(i=>{this.editor.notifier.dispatch(2,{kind:2,tool:this})})}makeEraserSwitcherTool(){return new ai(this.editor,this)}clearPreview(){this.editor.clearWetInk()}getSizeOnCanvas(){return this.thickness/this.editor.viewport.getScaleFactor()}drawPreviewAt(e){this.clearPreview();let r=this.getSizeOnCanvas(),n=this.editor.display.getWetInkRenderer(),i=this.getEraserRect(e),a=this.getEraserRect(this.lastPoint??e),l={fill:L.transparent,stroke:{width:r/10,color:L.gray}};n.drawPath(Z($.fromConvexHullOf([...i.corners,...a.corners]),l))}getEraserRect(e){let r=this.getSizeOnCanvas(),n=w.of(r/2,r/2);return I.fromCorners(e.minus(n),e.plus(n))}eraseTo(e){if(!this.isFirstEraseEvt&&e.distanceTo(this.lastPoint)===0)return;this.isFirstEraseEvt=!1;let r=this.getEraserRect(e),n=new ue(this.lastPoint,e),i=I.union(n.bbox,r),l=this.editor.image.getElementsIntersectingRegion(i).filter(c=>c.intersects(n)||c.intersectsRect(r)).filter(c=>c.isSelectable());if(this.modeValue.get()==="full-stroke"){this.toRemove.push(...l);let c=l.map(d=>new J([d]));c.forEach(d=>d.apply(this.editor)),this.eraseCommands.push(...c)}else{let c=[],d=[];for(let m of l){if(c.push(m),!m.withRegionErased||r.grownBy(r.maxDimension/3).containsRect(m.getExactBBox()))continue;let v=$.fromConvexHullOf([...r.corners,...this.getEraserRect(this.lastPoint??e).corners].map(b=>this.editor.viewport.roundPoint(b)));d.push(...m.withRegionErased(v,this.editor.viewport))}let u=new J(c),p=d.map(m=>q.addElement(m));u.apply(this.editor),p.forEach(m=>m.apply(this.editor));let h=[];for(let m of c)this.toAdd.has(m)?this.toAdd.delete(m):h.push(m);this.toRemove.push(...h);for(let m of d)this.toAdd.add(m);this.eraseCommands.push(new J(h)),this.addCommands.push(...p)}this.drawPreviewAt(e),this.lastPoint=e}onPointerDown(e){return e.allPointers.length===1||e.current.device===1?(this.lastPoint=e.current.canvasPos,this.toRemove=[],this.toAdd.clear(),this.isFirstEraseEvt=!0,this.drawPreviewAt(e.current.canvasPos),!0):!1}onPointerMove(e){let r=e.current.canvasPos;this.eraseTo(r)}onPointerUp(e){this.eraseTo(e.current.canvasPos);let r=[];if(this.addCommands.length>0){this.addCommands.forEach(n=>n.unapply(this.editor));for(let n of this.toAdd)this.toRemove.includes(n)&&(this.toAdd.delete(n),this.toRemove=this.toRemove.filter(i=>i!==n));for(let n of this.toRemove)this.toAdd.has(n)&&(this.toAdd.delete(n),this.toRemove=this.toRemove.filter(i=>i!==n));r.push(...[...this.toAdd].map(n=>q.addElement(n))),this.addCommands=[]}if(this.eraseCommands.length>0){this.eraseCommands.forEach(i=>i.unapply(this.editor)),this.eraseCommands=[];let n=new J(this.toRemove);r.push(n)}r.length===1?this.editor.dispatch(r[0]):this.editor.dispatch(le(r)),this.clearPreview()}onGestureCancel(e){this.addCommands.forEach(r=>r.unapply(this.editor)),this.eraseCommands.forEach(r=>r.unapply(this.editor)),this.eraseCommands=[],this.addCommands=[],this.clearPreview()}onKeyPress(e){let r=this.editor.shortcuts,n;return r.matchesShortcut(Do,e)?n=this.getThickness()*2/3:r.matchesShortcut(Mo,e)&&(n=this.getThickness()*3/2),n!==void 0?(n=Math.min(Math.max(1,n),200),this.setThickness(n),!0):!1}getThickness(){return this.thickness}setThickness(e){this.thicknessValue.set(e)}getThicknessValue(){return this.thicknessValue}getModeValue(){return this.modeValue}};var ps="text";var Ha={fontFamily:"sans",size:12,renderingStyle:{fill:L.purple}},ne=class s extends _{constructor(e,r,n=Ha,i=0){super(ps);this.textObjects=e;this.transform=r;this.style=n;this.transformMode=i;this.isRestylableComponent=!0;this.recomputeBBox(),!e.some(l=>typeof l=="string")&&e.length>0&&(this.style=e[0].getTextStyle())}static applyTextStyles(e,r){let n=r.fontFamily.match(/\s/),i=r.fontFamily.match(/^".*"$/),a=n&&!i?`"${r.fontFamily.replace(/["]/g,'\\"')}"`:r.fontFamily;e.font=[r.fontStyle??"",r.fontWeight??"",(r.size??12)+"px",`${a}`].join(" "),e.textAlign="left"}static{this.textMeasuringCtx=null}static estimateTextDimens(e,r){let n=e.length*r.size,i=r.size;return new I(0,-i*2/3,n,i)}static getTextMetrics(e,r){if(s.textMeasuringCtx??=document.createElement("canvas").getContext("2d")??null,!s.textMeasuringCtx)return null;let n=s.textMeasuringCtx;return s.applyTextStyles(n,r),n.measureText(e)}static getTextDimens(e,r){let n=this.getTextMetrics(e,r);if(!n)return this.estimateTextDimens(e,r);let i=-n.actualBoundingBoxAscent,a=n.actualBoundingBoxAscent+n.actualBoundingBoxDescent;return new I(0,i,n.width,a)}static getFontHeight(e){return e.size}computeUntransformedBBoxOfPart(e){return typeof e=="string"?s.getTextDimens(e,this.style):e.contentBBox}recomputeBBox(){let e=null,r=new s.TextCursor(this.transform,this.style);for(let n of this.textObjects){let i=r.update(n).transform,a=this.computeUntransformedBBoxOfPart(n).transformedBoundingBox(i);e??=a,e=e.union(a)}this.contentBBox=e??I.empty}renderInternal(e,r,n=k.identity){let i=new s.TextCursor(this.transform,this.style);for(let a of this.textObjects){let{transform:l,bbox:c}=i.update(a);r&&!r.intersects(c.transformedBoundingBox(n))||(typeof a=="string"?e.drawText(a,l,this.style):(e.pushTransform(l),a.renderInternal(e,r,n.rightMul(l)),e.popTransform()))}}render(e,r){e.startObject(this.contentBBox),this.renderInternal(e,r),e.endObject(this.getLoadSaveData())}getProportionalRenderingTime(){return this.textObjects.length}intersects(e){let r=new s.TextCursor(this.transform,this.style);for(let n of this.textObjects){let i=r.update(n).transform.inverse(),a=e.transformedBy(i);if(typeof n=="string"){if(s.getTextDimens(n,this.style).getEdges().some(c=>a.intersection(c)!==null))return!0}else if(n.intersects(a))return!0}return!1}getStyle(){return{color:this.style.renderingStyle.fill,textStyle:{...this.style,renderingStyle:{...this.style.renderingStyle}}}}updateStyle(e){return pt(this.getStyle(),e,this)}forceStyle(e,r){if(e.textStyle)this.style=ti(e.textStyle);else if(e.color)this.style={...this.style,renderingStyle:{...this.style.renderingStyle,fill:e.color}};else return;for(let n of this.textObjects)n instanceof s&&n.forceStyle(e,r);r&&(r.image.queueRerenderOf(this),r.queueRerender())}getTextStyle(){return ti(this.style)}getBaselinePos(){return this.transform.transformVec2(w.zero)}getTransform(){return this.transform}applyTransformation(e){this.transform=e.rightMul(this.transform),this.recomputeBBox()}createClone(){let e=this.textObjects.map(r=>typeof r=="string"?r:r.createClone());return new s(e,this.transform,this.style)}getText(){let e=[];for(let r of this.textObjects)typeof r=="string"?e.push(r):e.push(r.getText());return e.join(`
19
+ `)}description(e){return e.text(this.getText())}serializeToJSON(){let e=Br(this.style);return{textObjects:this.textObjects.map(n=>typeof n=="string"?{text:n}:{json:n.serializeToJSON()}),transform:this.transform.toArray(),style:e}}static deserializeFromString(e){typeof e=="string"&&(e=JSON.parse(e));let r=Ir(e.style),n=e.textObjects.map(l=>(l.text??null)!==null?l.text:s.deserializeFromString(l.json));if(e.transform=e.transform.filter(l=>typeof l=="number"),e.transform.length!==9)throw new Error(`Unable to deserialize transform, ${e.transform}.`);let i=e.transform,a=new k(...i);return new s(n,a,r)}static fromLines(e,r,n){let i=null,a=[],l=Math.round(this.getFontHeight(n)),c=w.zero;for(let d of e){i&&(c=c.plus(w.unitY.times(l)));let u=new s([d],k.translation(c),n);a.push(u),i=u}return new s(a,r,n)}static{this.TextCursor=class{constructor(e=k.identity,r){this.parentTransform=e;this.parentStyle=r;this.transform=k.identity}update(e){let r=k.identity,n=k.identity,i;typeof e=="string"?i=s.getTextDimens(e,this.parentStyle):(n=e.transform,i=e.getBBox());let a=typeof e=="string"?1:e.transformMode;a===1?r=this.transform.rightMul(r):(a===2||a===3)&&(r=this.transform.mapEntries((u,[p,h])=>{if(a===2)return p===1&&h===2?0:u;if(a===3)return p===0&&h===2?0:u;throw new Error("Unreachable")}).rightMul(r));let l=k.translation(w.of(i.width,0));this.transform=r.rightMul(n).rightMul(l);let c=this.parentTransform.rightMul(r);return{transform:c,bbox:i.transformedBoundingBox(c)}}}}};_.registerComponent(ps,s=>ne.deserializeFromString(s));var ze=class{constructor(o){this.viewport=o;this.selfTransform=null;this.transformStack=[];this.objectLevel=0;this.currentPaths=null}getViewport(){return this.viewport}setDraftMode(o){}flushPath(){if(!this.currentPaths)return;let o=null;for(let e of this.currentPaths){let{startPoint:r,commands:n,style:i}=e;!o||!Rr(o,i)?(o&&this.endPath(o),this.beginPath(r),o=i):this.moveTo(r);for(let a of n)a.kind===0?this.lineTo(a.point):a.kind===1?this.moveTo(a.point):a.kind===2?this.traceCubicBezierCurve(a.controlPoint1,a.controlPoint2,a.endPoint):a.kind===3&&this.traceQuadraticBezierCurve(a.controlPoint,a.endPoint)}o&&this.endPath(o),this.currentPaths=[]}drawPath(o){this.objectLevel===0||this.currentPaths===null?(this.currentPaths=[o],this.flushPath(),this.currentPaths=null):this.currentPaths.push(o)}drawRect(o,e,r){let n=$.fromRect(o,e);this.drawPath(Z(n,r))}fillRect(o,e){let r=$.fromRect(o);this.drawPath(Z(r,{fill:e}))}startObject(o,e){this.objectLevel>0&&this.flushPath(),this.currentPaths=[],this.objectLevel++}endObject(o,e){if(this.flushPath(),this.currentPaths=null,this.objectLevel--,this.objectLevel<0)throw new Error("More objects have ended than have been started (negative object nesting level)!")}getNestingLevel(){return this.objectLevel}canRenderFromWithoutDataLoss(o){return!1}renderFromOtherOfSameType(o,e){throw new Error(`Unable to render from ${e}: Not implemented`)}setTransform(o){this.selfTransform=o}pushTransform(o){this.transformStack.push(this.selfTransform),this.setTransform(this.getCanvasToScreenTransform().rightMul(o))}popTransform(){if(this.transformStack.length===0)throw new Error("Unable to pop more transforms than have been pushed!");this.setTransform(this.transformStack.pop()??null)}getCanvasToScreenTransform(){return this.selfTransform?this.selfTransform:this.viewport.canvasToScreenTransform}canvasToScreen(o){return this.getCanvasToScreenTransform().transformVec2(o)}getSizeOfCanvasPixelOnScreen(){return this.getCanvasToScreenTransform().transformVec3(w.unitX).length()}overrideVisibleRect(o){this.visibleRectOverride=o}getVisibleRect(){return this.visibleRectOverride??this.viewport.visibleRect}};var Le=class s extends ze{constructor(e,r){super(r);this.ctx=e;this.ignoreObjectsAboveLevel=null;this.ignoringObject=!1;this.currentObjectBBox=null;this.clipLevels=[];this.setDraftMode(!1)}transformBy(e){this.ctx.transform(e.a1,e.b1,e.a2,e.b2,e.a3,e.b3)}canRenderFromWithoutDataLoss(e){return e instanceof s}renderFromOtherOfSameType(e,r){if(!(r instanceof s))throw new Error(`${r} cannot be rendered onto ${this}`);e=this.getCanvasToScreenTransform().rightMul(e),this.ctx.save(),this.transformBy(e),this.ctx.drawImage(r.ctx.canvas,0,0),this.ctx.restore()}setDraftMode(e){e?(this.minSquareCurveApproxDist=9,this.minRenderSizeBothDimens=1,this.minRenderSizeAnyDimen=.1):(this.minSquareCurveApproxDist=.5,this.minRenderSizeBothDimens=.1,this.minRenderSizeAnyDimen=1e-6)}displaySize(){return w.of(this.ctx.canvas.clientWidth,this.ctx.canvas.clientHeight)}clear(){this.ctx.save(),this.ctx.resetTransform(),this.ctx.clearRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height),this.ctx.restore()}beginPath(e){e=this.canvasToScreen(e),this.ctx.beginPath(),this.ctx.moveTo(e.x,e.y)}endPath(e){e.fill.a>0&&(this.ctx.fillStyle=e.fill.toHexString(),this.ctx.fill()),e.stroke&&(this.ctx.strokeStyle=e.stroke.color.toHexString(),this.ctx.lineWidth=this.getSizeOfCanvasPixelOnScreen()*e.stroke.width,this.ctx.lineCap="round",this.ctx.lineJoin="round",this.ctx.stroke(),this.ctx.lineWidth=1),this.ctx.closePath()}lineTo(e){e=this.canvasToScreen(e),this.ctx.lineTo(e.x,e.y)}moveTo(e){e=this.canvasToScreen(e),this.ctx.moveTo(e.x,e.y)}traceCubicBezierCurve(e,r,n){e=this.canvasToScreen(e),r=this.canvasToScreen(r),n=this.canvasToScreen(n);let i=r.minus(e),a=n.minus(r);i.magnitudeSquared()<this.minSquareCurveApproxDist&&a.magnitudeSquared()<this.minSquareCurveApproxDist?this.ctx.lineTo(n.x,n.y):this.ctx.bezierCurveTo(e.x,e.y,r.x,r.y,n.x,n.y)}traceQuadraticBezierCurve(e,r){e=this.canvasToScreen(e),r=this.canvasToScreen(r),e.minus(r).magnitudeSquared()<this.minSquareCurveApproxDist?this.ctx.lineTo(r.x,r.y):this.ctx.quadraticCurveTo(e.x,e.y,r.x,r.y)}drawPath(e){if(this.ignoringObject)return;let r=this.getVisibleRect();this.currentObjectBBox?.containsRect(r)&&(e=Dr(e,r)),super.drawPath(e)}drawText(e,r,n){this.ctx.save(),r=this.getCanvasToScreenTransform().rightMul(r),this.transformBy(r),ne.applyTextStyles(this.ctx,n),n.renderingStyle.fill.a!==0&&(this.ctx.fillStyle=n.renderingStyle.fill.toHexString(),this.ctx.fillText(e,0,0)),n.renderingStyle.stroke&&(this.ctx.strokeStyle=n.renderingStyle.stroke.color.toHexString(),this.ctx.lineWidth=n.renderingStyle.stroke.width,this.ctx.strokeText(e,0,0)),this.ctx.restore()}drawImage(e){if(e.image.width===0||e.image.height===0)return;this.ctx.save();let r=this.getCanvasToScreenTransform().rightMul(e.transform);this.transformBy(r),this.ctx.drawImage(e.image,0,0),this.ctx.restore()}startObject(e,r){if(this.isTooSmallToRender(e)&&(this.ignoreObjectsAboveLevel=this.getNestingLevel(),this.ignoringObject=!0),super.startObject(e),this.currentObjectBBox=e,!this.ignoringObject&&r&&!e.containsRect(this.getVisibleRect())){this.clipLevels.push(this.objectLevel),this.ctx.save(),this.ctx.beginPath();for(let i of e.corners){let a=this.canvasToScreen(i);this.ctx.lineTo(a.x,a.y)}this.ctx.clip()}}endObject(){let e=this.objectLevel;this.currentObjectBBox=null,super.endObject(),!this.ignoringObject&&this.clipLevels.length>0&&this.clipLevels[this.clipLevels.length-1]===e&&(this.ctx.restore(),this.clipLevels.pop()),this.ignoreObjectsAboveLevel!==null&&this.getNestingLevel()<=this.ignoreObjectsAboveLevel&&(this.ignoreObjectsAboveLevel=null,this.ignoringObject=!1)}drawPoints(...e){for(let n=0;n<e.length;n++){let i=this.canvasToScreen(e[n]);this.ctx.beginPath(),this.ctx.arc(i.x,i.y,10,0,Math.PI*2),this.ctx.fillStyle=L.ofRGBA(.5+Math.sin(n)/2,1,.5+Math.cos(n*.2)/4,.5).toHexString(),this.ctx.lineWidth=2,this.ctx.fill(),this.ctx.stroke(),this.ctx.closePath(),this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillStyle="black",this.ctx.fillText(`${n}`,i.x,i.y,10*2)}}isTooSmallToRender(e){let r=e.size.times(this.getSizeOfCanvasPixelOnScreen()),n=this.minRenderSizeBothDimens,i=Math.abs(r.x)<n&&Math.abs(r.y)<n,a=this.minRenderSizeAnyDimen,l=Math.abs(r.x)<a||Math.abs(r.y)<a;return i||l}static fromViewport(e,r={}){let n=document.createElement("canvas"),i=e.getScreenRectSize(),a=r.canvasSize??i;r.maxCanvasDimen&&a.maximumEntryMagnitude()>r.maxCanvasDimen&&(a=a.times(r.maxCanvasDimen/a.maximumEntryMagnitude())),n.width=a.x,n.height=a.y;let l=n.getContext("2d"),c=Math.min(a.x/i.x,a.y/i.y);return l.scale(c,c),{renderer:new s(l,e),element:n}}};var co=(r=>(r[r.SolidColor=0]="SolidColor",r[r.Grid=1]="Grid",r[r.None=2]="None",r))(co||{}),lo="js-draw-image-background",Hr="js-draw-image-background-grid-",li="js-draw-image-background-non-automatic-secondary-color",ci={1:"js-draw-image-background-grid",0:lo,2:""},ce=class s extends _{constructor(e,r){super("image-background",0);this.backgroundType=e;this.mainColor=r;this.viewportSizeChangeListener=null;this.autoresizeChangedListener=null;this.fillsScreen=!1;this.gridSize=U.getGridSize(2);this.gridStrokeWidth=.7;this.secondaryColor=null;this.isRestylableComponent=!0;this.contentBBox=I.empty}static ofGrid(e,r,n,i){let a=new s(1,e);return r!==void 0&&(a.gridSize=r),n!==void 0&&(a.secondaryColor=n),i!==void 0&&(a.gridStrokeWidth=i),a}getBackgroundType(){return this.backgroundType}getMainColor(){return this.mainColor}getSecondaryColor(){return this.secondaryColor}getGridSize(){return this.gridSize}getStyle(){let e=this.mainColor;return this.backgroundType===2&&(e=void 0),{color:e}}updateStyle(e){return pt(this.getStyle(),e,this)}forceStyle(e,r){let n=e.color;n&&(this.mainColor=n,n.eq(L.transparent)&&this.backgroundType===0?this.backgroundType=2:this.backgroundType===2&&(this.backgroundType=0),r&&(r.image.queueRerenderOf(this),r.queueRerender()))}onAddToImage(e){this.viewportSizeChangeListener&&(console.warn("onAddToImage called when background is already in an image"),this.onRemoveFromImage()),this.viewportSizeChangeListener=e.notifier.on(0,()=>{this.recomputeBBox(e)}),this.autoresizeChangedListener=e.notifier.on(1,()=>{this.recomputeBBox(e)}),this.recomputeBBox(e)}onRemoveFromImage(){this.viewportSizeChangeListener?.remove(),this.autoresizeChangedListener?.remove(),this.viewportSizeChangeListener=null,this.autoresizeChangedListener=null}recomputeBBox(e){let r=e.getImportExportViewport().visibleRect,n=!1;this.contentBBox.eq(r)||(this.contentBBox=r,n||=!this.fillsScreen);let i=e.getAutoresizeEnabled();i!==this.fillsScreen&&(this.fillsScreen=i,n=!0),n&&e.queueRerenderOf(this)}generateGridPath(e){let r=this.getFullBoundingBox(e),n=(e?.intersection(r)??r).grownBy(this.gridStrokeWidth/2),i=y=>Math.floor(y/this.gridSize)*this.gridSize,a=y=>Math.ceil(y/this.gridSize)*this.gridSize,l=a(n.y),c=i(n.y+n.h),d=a(n.x),u=i(n.x+n.w),p=[],h=(c-l)/this.gridSize,m=(u-d)/this.gridSize;if(h>1e3||m>1e3)return $.empty;let b=w.of(n.x,l);for(let y=l;y<=c;y+=this.gridSize)p.push({kind:1,point:w.of(n.x,y)}),p.push({kind:0,point:w.of(n.x+n.w,y)});for(let y=d;y<=u;y+=this.gridSize)p.push({kind:1,point:w.of(y,n.y)}),p.push({kind:0,point:w.of(y,n.y+n.h)});return new $(b,p)}getFullBoundingBox(e){return(this.fillsScreen?e:this.contentBBox)??this.contentBBox}render(e,r){if(this.backgroundType===2)return;let n=!r;this.fillsScreen&&(r??=e.getVisibleRect());let i=this.backgroundType===1,a=this.getFullBoundingBox(r);if(e.startObject(a,i),this.backgroundType===0||this.backgroundType===1){let d=r?.intersection(a);d?e.fillRect(d,this.mainColor):n&&e.fillRect(a,this.mainColor)}if(this.backgroundType===1){let d=this.secondaryColor;d??=L.ofRGBA(1-this.mainColor.r,1-this.mainColor.g,1-this.mainColor.b,.2),this.mainColor.a===0&&(d=L.ofRGBA(.5,.5,.5,.2));let u={fill:L.transparent,stroke:{width:this.gridStrokeWidth,color:d}};e.drawPath(Z(this.generateGridPath(r),u))}let l=ci[this.backgroundType],c=[lo];if(l!==lo){c.push(l);let d=pe(this.gridSize).replace(/[.]/g,"p");c.push(Hr+d)}this.secondaryColor!==null&&c.push(li),e.endObject(this.getLoadSaveData(),c)}intersects(e){return this.contentBBox.getEdges().some(r=>r.intersects(e))}isSelectable(){return!1}isBackground(){return!0}getSizingMode(){return this.fillsScreen?1:0}serializeToJSON(){return{mainColor:this.mainColor.toHexString(),secondaryColor:this.secondaryColor?.toHexString(),backgroundType:this.backgroundType,gridSize:this.gridSize,gridStrokeWidth:this.gridStrokeWidth}}applyTransformation(e){}description(e){return this.backgroundType===0?e.filledBackgroundWithColor(this.mainColor.toString()):this.backgroundType===2?e.emptyBackground:this.backgroundType===1?e.gridBackground:this.backgroundType}createClone(){return new s(this.backgroundType,this.mainColor)}static deserializeFromJSON(e){if(typeof e=="string"&&(e=JSON.parse(e)),typeof e.mainColor!="string")throw new Error("Error deserializing \u2014 mainColor must be of type string.");let r,n=e.backgroundType;if(n===2||n===1||n===0)r=n;else return n;let i=L.fromHex(e.mainColor),a=e.secondaryColor?L.fromHex(e.secondaryColor):null,l=e.gridSize??void 0,c=e.gridStrokeWidth??void 0,d=new s(r,i);return d.secondaryColor=a,l&&(d.gridSize=l),c&&(d.gridStrokeWidth=c),d}};_.registerComponent("image-background",ce.deserializeFromJSON);var $a=async s=>{s.complete||await new Promise((o,e)=>{s.onload=r=>o(r),s.onerror=r=>e(r),s.onabort=r=>e(r)})},hs=$a;var be=class s extends _{constructor(o){super("image-component"),this.image={...o,label:o.label??o.image.getAttribute("alt")??o.image.getAttribute("aria-label")??void 0},(r=>r.getAttribute("src")!==void 0)(o.image)&&!o.image.complete&&(o.image.onload=()=>this.recomputeBBox()),this.recomputeBBox()}getImageRect(){return new I(0,0,this.image.image.width,this.image.image.height)}recomputeBBox(){this.contentBBox=this.getImageRect(),this.contentBBox=this.contentBBox.transformedBoundingBox(this.image.transform)}static async fromImage(o,e){await hs(o);let r,n;typeof o.width=="number"&&typeof o.height=="number"&&o.width!==0&&o.height!==0?(r=o.width,n=o.height):(r=o.clientWidth,n=o.clientHeight);let i,a=o.src??"";if(a.startsWith("data:image/"))i=new Image,i.src=a,i.width=r,i.height=n;else{let l=document.createElement("canvas");l.width=r,l.height=n,l.getContext("2d").drawImage(o,0,0,l.width,l.height),a=l.toDataURL(),i=l}return i.setAttribute("alt",o.getAttribute("alt")??""),i.setAttribute("aria-label",o.getAttribute("aria-label")??""),new s({image:i,base64Url:a,transform:e})}render(o,e){o.startObject(this.contentBBox),o.drawImage(this.image),o.endObject(this.getLoadSaveData())}getProportionalRenderingTime(){return 10}intersects(o){let r=this.getImageRect().getEdges().map(n=>n.transformedBy(this.image.transform));for(let n of r)if(n.intersects(o))return!0;return!1}applyTransformation(o){this.image.transform=o.rightMul(this.image.transform),this.recomputeBBox()}description(o){return this.image.label?o.imageNode(this.image.label):o.unlabeledImageNode}getAltText(){return this.image.label}getURL(){return this.image.base64Url}getTransformation(){return this.image.transform}createClone(){return new s({...this.image})}serializeToJSON(){return{src:this.image.base64Url,label:this.image.label,width:this.image.image.width,height:this.image.image.height,transform:this.image.transform.toArray()}}static deserializeFromJSON(o){if(typeof o.src!="string")throw new Error(`${o} has invalid format! Expected src property.`);ko(o.transform),ut(o.width),ut(o.height);let e=new Image;e.src=o.src,e.width=o.width,e.height=o.height;let r=new k(...o.transform);return new s({image:e,base64Url:o.src,label:o.label,transform:r})}};_.registerComponent("image-component",be.deserializeFromJSON);var ms="svg-global-attributes",uo=class s extends _{constructor(o){super(ms),this.contentBBox=I.empty;let e=["viewBox","width","height"];this.attrs=o.filter(([r,n])=>!e.includes(r))}render(o,e){if(o instanceof me)for(let[r,n]of this.attrs)o.setRootSVGAttribute(r,n)}intersects(o){return!1}applyTransformation(o){}isSelectable(){return!1}getSizingMode(){return 2}createClone(){return new s(this.attrs)}description(o){return o.svgObject}serializeToJSON(){return JSON.stringify(this.attrs)}static deserializeFromString(o){return new s([])}};_.registerComponent(ms,uo.deserializeFromString);var fs="unknown-svg-object",Rt=class s extends _{constructor(e){super(fs);this.svgObject=e;this.contentBBox=I.of(e.getBoundingClientRect())}render(e,r){e instanceof me&&(e.startObject(this.contentBBox),e.drawSVGElem(this.svgObject),e.endObject(this.getLoadSaveData()))}intersects(e){return this.contentBBox.getEdges().some(r=>r.intersection(e)!==null)}applyTransformation(e){}isSelectable(){return!1}getSizingMode(){return 2}createClone(){return new s(this.svgObject.cloneNode(!0))}description(e){return e.svgObject}serializeToJSON(){return JSON.stringify({html:this.svgObject.outerHTML})}};_.registerComponent(fs,null);var Ua=(s,o,e)=>{let r=/^([-0-9.e]+)px/i,n=r.exec(s.style?.fontSize??"");!n&&s.tagName.toLowerCase()==="tspan"&&s.parentElement&&(n=r.exec(s.parentElement.style?.fontSize??"")),!n&&o&&(n=r.exec(o.fontSize));let i=12;return n&&(e.add("fontSize"),i=parseFloat(n[1])),i},gs=Ua;var Wa=new I(0,0,500,500),ui="svgAttrs",pi="svgStyleAttrs",hi="svgContainerID",Nr="js-draw--autoresize";var di=["stroke","fill","stroke-width"],et=class s{constructor(o,e,r){this.source=o;this.onFinish=e;this.onAddComponent=null;this.onProgress=null;this.onDetermineExportRect=null;this.processedCount=0;this.totalToProcess=0;this.containerGroupIDs=[];this.encounteredIDs=[];this.storeUnknown=!(r.sanitize??!1),this.disableUnknownObjectWarnings=!!r.disableUnknownObjectWarnings}getStyle(o,e){let r=L.transparent,n,i=o.getAttribute("fill")??(e?.fill||o.style?.fill);if(i)try{r=L.fromString(i)}catch{console.error("Unknown fill color,",i)}let a=o.getAttribute("stroke")??e?.stroke??o.style?.stroke??"",l=o.getAttribute("stroke-width")??e?.strokeWidth??o.style?.strokeWidth??"";if(a&&l)try{let d=parseFloat(l??"1");isFinite(d)||(d=0);let u=L.fromString(a);u.a>0&&(n={width:d,color:u})}catch(d){console.error("Error parsing stroke data:",d)}return{fill:r,stroke:n}}strokeDataFromElem(o){let e=[],r=o.getAttribute("d")??"",n=this.getStyle(o),i=r.split("M"),a=!0;for(let l of i){let c=/^[0-9., \t\n]+$/.exec(l);if(l!==""&&!c){let d=a?l:`M${l}`,u=$.fromString(d),p=Z(u,n);e.push(p)}a=!1}return e}attachUnrecognisedAttrs(o,e,r,n){if(this.storeUnknown){for(let i of e.getAttributeNames())r.has(i)||i==="style"&&n||o.attachLoadSaveData(ui,[i,e.getAttribute(i)]);if(n&&e.style)for(let i=0;i<e.style.length;i++){let a=e.style[i];a===""||!a||n.has(a)||o.attachLoadSaveData(pi,{key:a,value:e.style.getPropertyValue(a),priority:e.style.getPropertyPriority(a)})}}}async addPath(o){let e;try{let r=this.strokeDataFromElem(o);e=new ee(r),this.attachUnrecognisedAttrs(e,o,new Set([...di,"d"]),new Set(di))}catch(r){if(console.error("Invalid path in node",o,`
20
20
  Error:`,r,`
21
- Adding as an unknown object.`),this.storeUnknown)e=new kt(o);else return}await this.addComponent(e)}async addBackground(o){if(o.classList.contains(ii[1])){let e,r,n;if(o.tagName.toLowerCase()==="g"){if(o.children.length!==2){await this.addUnknownNode(o);return}let p=o.children[0],u=o.children[1];r=p.getAttribute("fill"),e=u.getAttribute("stroke"),n=u.getAttribute("stroke-width")}else r=o.getAttribute("fill"),e=o.getAttribute("stroke"),n=o.getAttribute("stroke-width");if(r??=L.transparent.toHexString(),!e){await this.addUnknownNode(o);return}let i;for(let p of o.classList)if(p.startsWith(Mr)){let u=p.substring(Mr.length);i=parseFloat(u.replace(/p/g,"."))}let a;n&&(a=parseFloat(n));let l=L.fromString(r),c=L.fromString(e);o.classList.contains(ni)||(c=void 0);let d=ae.ofGrid(l,i,c,a);await this.addComponent(d)}else if(o.tagName.toLowerCase()==="path"){let e=L.fromString(o.getAttribute("fill")??o.style.fill??"black"),r=new ae(0,e);await this.addComponent(r)}else await this.addUnknownNode(o)}getComputedStyle(o){try{return window.getComputedStyle(o)}catch(e){console.warn("Error computing style",e);return}}getTransform(o,e,r){let n="data-highp-transform",i=o.getAttribute(n),a;if(i)try{a=k.fromCSSMatrix(i),e?.push(n)}catch(l){console.warn(`Unable to parse raw transform data, ${i}. Falling back to CSS data. Error:`,l)}if(!a){r??=this.getComputedStyle(o);let l=r?.transform;(!l||l==="none")&&(l=o.style?.transform||"none");try{a=k.fromCSSMatrix(o.style.transform)}catch(p){console.warn("matrix parse error",p),a=k.fromCSSMatrix(l)}let c=o.getAttribute("x"),d=o.getAttribute("y");if(c||d){let p=parseFloat(c??"0"),u=parseFloat(d??"0");!isNaN(p)&&!isNaN(u)&&(e?.push("x","y"),a=a.rightMul(k.translation(w.of(p,u))))}}return a}makeText(o){let e=[];for(let h of o.childNodes)if(h.nodeType===Node.TEXT_NODE)e.push(h.nodeValue??"");else if(h.nodeType===Node.ELEMENT_NODE){let m=h;if(m.tagName.toLowerCase()==="tspan")e.push(this.makeText(m));else throw new Error(`Unrecognized text child element: ${m}`)}else throw new Error(`Unrecognized text child node: ${h}.`);e.length===0&&e.push("");let r=this.getComputedStyle(o),n=new Set(["fontFamily","transform",...si]),i={size:ps(o,r,n),fontFamily:r?.fontFamily||o.style?.fontFamily||"sans-serif",fontWeight:r?.fontWeight||o.style?.fontWeight||void 0,fontStyle:r?.fontStyle||o.style?.fontStyle||void 0,renderingStyle:this.getStyle(o,r)},a=[],l=this.getTransform(o,a,r),c=0,d=o.getAttribute("dx");d&&(c=2,l=l.rightMul(k.translation(w.of(parseFloat(d),0))),a.push("dx"));let p=o.getAttribute("dy");p&&(c===2?c=1:c=3,l=l.rightMul(k.translation(w.of(0,parseFloat(p)))),a.push("dy"));let u=new re(e,l,i,c);return this.attachUnrecognisedAttrs(u,o,new Set(a),new Set(n)),u}async addText(o){try{let e=this.makeText(o);await this.addComponent(e)}catch(e){console.error("Invalid text object in node",o,". Continuing.... Error:",e),this.addUnknownNode(o)}}async addImage(o){let e=new Image;e.src=o.getAttribute("xlink:href")??o.href.baseVal,e.setAttribute("alt",o.getAttribute("aria-label")??"");try{let r=[],n=this.getTransform(o,r),i=await be.fromImage(e,n);this.attachUnrecognisedAttrs(i,o,new Set(r),new Set(["transform"])),await this.addComponent(i)}catch(r){console.error("Error loading image:",r,". Element: ",o,". Continuing..."),await this.addUnknownNode(o)}}async addUnknownNode(o){if(this.storeUnknown){let e=new kt(o);await this.addComponent(e)}}async startGroup(o){o=o.cloneNode(!1);let e=o.id||`id-${this.encounteredIDs.length}`,r=0,n="";for(;this.encounteredIDs.includes(e+n);)r++,n="--"+r;e+=n,o.replaceChildren(),o.id=e;let i=new kt(o);this.addComponent(i),this.containerGroupIDs.push(o.id),this.encounteredIDs.push(o.id)}async endGroup(){this.containerGroupIDs.pop()}async addComponent(o){this.containerGroupIDs.length>0&&o.attachLoadSaveData(ci,[...this.containerGroupIDs]),await this.onAddComponent?.(o)}updateViewBox(o){let e=o.getAttribute("viewBox");if(this.rootViewBox||!e)return;let r=e.split(/[ \t\n,]+/),n=parseFloat(r[0]),i=parseFloat(r[1]),a=parseFloat(r[2]),l=parseFloat(r[3]);if(isNaN(n)||isNaN(i)||isNaN(a)||isNaN(l)){console.warn(`node ${o} has an unparsable viewbox. Viewbox: ${e}. Match: ${r}.`);return}let c=o.classList.contains(Ar);this.rootViewBox=new B(n,i,a,l),this.onDetermineExportRect?.(this.rootViewBox,{autoresize:c})}async updateSVGAttrs(o){this.storeUnknown&&await this.onAddComponent?.(new ao(this.getSourceAttrs(o)))}async visit(o){this.totalToProcess+=o.childElementCount;let e=!0;switch(o.tagName.toLowerCase()){case"g":o.classList.contains(io)?(await this.addBackground(o),e=!1):await this.startGroup(o);break;case"path":o.classList.contains(io)?await this.addBackground(o):await this.addPath(o);break;case"text":await this.addText(o),e=!1;break;case"image":await this.addImage(o),e=!1;break;case"svg":this.updateViewBox(o),this.updateSVGAttrs(o);break;case"style":o.getAttribute("id")!==Ao&&await this.addUnknownNode(o);break;default:this.disableUnknownObjectWarnings||(console.warn("Unknown SVG element,",o,o.tagName),o instanceof SVGElement||console.warn("Element",o,"is not an SVGElement!",this.storeUnknown?"Continuing anyway.":"Skipping.")),await this.addUnknownNode(o);return}if(e){for(let r of o.children)await this.visit(r);o.tagName.toLowerCase()==="g"&&await this.endGroup()}this.processedCount++,await this.onProgress?.(this.processedCount,this.totalToProcess)}getSourceAttrs(o){return o.getAttributeNames().map(e=>[e,o.getAttribute(e)])}async start(o,e,r=null){this.onAddComponent=o,this.onProgress=e,this.onDetermineExportRect=r,this.totalToProcess=this.source.childElementCount,this.processedCount=0,this.rootViewBox=null,await this.visit(this.source),this.rootViewBox||this.onDetermineExportRect?.(Oa),this.onFinish?.(),this.onFinish=null}static fromString(o,e=!1){let r=typeof e!="boolean"&&e?.loadMethod==="domparser",{svgElem:n,cleanUp:i}=(()=>{if(!r)try{let m=document.createElement("iframe");if(m.src="about:blank",m.setAttribute("sandbox","allow-same-origin"),m.setAttribute("csp","default-src 'about:blank'"),m.style.display="none",document.body.appendChild(m),!m.hasAttribute("sandbox"))throw m.remove(),new Error("SVG loading iframe is not sandboxed.");let g=m.contentWindow?.document??m.contentDocument;if(g==null)throw new Error("Unable to open a sandboxed iframe!");g.open(),g.write(`
21
+ Adding as an unknown object.`),this.storeUnknown)e=new Rt(o);else return}await this.addComponent(e)}async addBackground(o){if(o.classList.contains(ci[1])){let e,r,n;if(o.tagName.toLowerCase()==="g"){if(o.children.length!==2){await this.addUnknownNode(o);return}let u=o.children[0],p=o.children[1];r=u.getAttribute("fill"),e=p.getAttribute("stroke"),n=p.getAttribute("stroke-width")}else r=o.getAttribute("fill"),e=o.getAttribute("stroke"),n=o.getAttribute("stroke-width");if(r??=L.transparent.toHexString(),!e){await this.addUnknownNode(o);return}let i;for(let u of o.classList)if(u.startsWith(Hr)){let p=u.substring(Hr.length);i=parseFloat(p.replace(/p/g,"."))}let a;n&&(a=parseFloat(n));let l=L.fromString(r),c=L.fromString(e);o.classList.contains(li)||(c=void 0);let d=ce.ofGrid(l,i,c,a);await this.addComponent(d)}else if(o.tagName.toLowerCase()==="path"){let e=L.fromString(o.getAttribute("fill")??o.style.fill??"black"),r=new ce(0,e);await this.addComponent(r)}else await this.addUnknownNode(o)}getComputedStyle(o){try{return window.getComputedStyle(o)}catch(e){console.warn("Error computing style",e);return}}getTransform(o,e,r){let n="data-highp-transform",i=o.getAttribute(n),a;if(i)try{a=k.fromCSSMatrix(i),e?.push(n)}catch(l){console.warn(`Unable to parse raw transform data, ${i}. Falling back to CSS data. Error:`,l)}if(!a){r??=this.getComputedStyle(o);let l=r?.transform;(!l||l==="none")&&(l=o.style?.transform||"none");try{a=k.fromCSSMatrix(o.style.transform)}catch(u){console.warn("matrix parse error",u),a=k.fromCSSMatrix(l)}let c=o.getAttribute("x"),d=o.getAttribute("y");if(c||d){let u=parseFloat(c??"0"),p=parseFloat(d??"0");!isNaN(u)&&!isNaN(p)&&(e?.push("x","y"),a=a.rightMul(k.translation(w.of(u,p))))}}return a}makeText(o){let e=[];for(let h of o.childNodes)if(h.nodeType===Node.TEXT_NODE)e.push(h.nodeValue??"");else if(h.nodeType===Node.ELEMENT_NODE){let m=h;if(m.tagName.toLowerCase()==="tspan")e.push(this.makeText(m));else throw new Error(`Unrecognized text child element: ${m}`)}else throw new Error(`Unrecognized text child node: ${h}.`);e.length===0&&e.push("");let r=this.getComputedStyle(o),n=new Set(["fontFamily","transform",...di]),i={size:gs(o,r,n),fontFamily:r?.fontFamily||o.style?.fontFamily||"sans-serif",fontWeight:r?.fontWeight||o.style?.fontWeight||void 0,fontStyle:r?.fontStyle||o.style?.fontStyle||void 0,renderingStyle:this.getStyle(o,r)},a=[],l=this.getTransform(o,a,r),c=0,d=o.getAttribute("dx");d&&(c=2,l=l.rightMul(k.translation(w.of(parseFloat(d),0))),a.push("dx"));let u=o.getAttribute("dy");u&&(c===2?c=1:c=3,l=l.rightMul(k.translation(w.of(0,parseFloat(u)))),a.push("dy"));let p=new ne(e,l,i,c);return this.attachUnrecognisedAttrs(p,o,new Set(a),new Set(n)),p}async addText(o){try{let e=this.makeText(o);await this.addComponent(e)}catch(e){console.error("Invalid text object in node",o,". Continuing.... Error:",e),this.addUnknownNode(o)}}async addImage(o){let e=new Image;e.src=o.getAttribute("xlink:href")??o.href.baseVal,e.setAttribute("alt",o.getAttribute("aria-label")??"");try{let r=[],n=this.getTransform(o,r),i=await be.fromImage(e,n);this.attachUnrecognisedAttrs(i,o,new Set(r),new Set(["transform"])),await this.addComponent(i)}catch(r){console.error("Error loading image:",r,". Element: ",o,". Continuing..."),await this.addUnknownNode(o)}}async addUnknownNode(o){if(this.storeUnknown){let e=new Rt(o);await this.addComponent(e)}}async startGroup(o){o=o.cloneNode(!1);let e=o.id||`id-${this.encounteredIDs.length}`,r=0,n="";for(;this.encounteredIDs.includes(e+n);)r++,n="--"+r;e+=n,o.replaceChildren(),o.id=e;let i=new Rt(o);this.addComponent(i),this.containerGroupIDs.push(o.id),this.encounteredIDs.push(o.id)}async endGroup(){this.containerGroupIDs.pop()}async addComponent(o){this.containerGroupIDs.length>0&&o.attachLoadSaveData(hi,[...this.containerGroupIDs]),await this.onAddComponent?.(o)}updateViewBox(o){let e=o.getAttribute("viewBox");if(this.rootViewBox||!e)return;let r=e.split(/[ \t\n,]+/),n=parseFloat(r[0]),i=parseFloat(r[1]),a=parseFloat(r[2]),l=parseFloat(r[3]);if(isNaN(n)||isNaN(i)||isNaN(a)||isNaN(l)){console.warn(`node ${o} has an unparsable viewbox. Viewbox: ${e}. Match: ${r}.`);return}let c=o.classList.contains(Nr);this.rootViewBox=new I(n,i,a,l),this.onDetermineExportRect?.(this.rootViewBox,{autoresize:c})}async updateSVGAttrs(o){this.storeUnknown&&await this.onAddComponent?.(new uo(this.getSourceAttrs(o)))}async visit(o){this.totalToProcess+=o.childElementCount;let e=!0;switch(o.tagName.toLowerCase()){case"g":o.classList.contains(lo)?(await this.addBackground(o),e=!1):await this.startGroup(o);break;case"path":o.classList.contains(lo)?await this.addBackground(o):await this.addPath(o);break;case"text":await this.addText(o),e=!1;break;case"image":await this.addImage(o),e=!1;break;case"svg":this.updateViewBox(o),this.updateSVGAttrs(o);break;case"style":o.getAttribute("id")!==Oo&&await this.addUnknownNode(o);break;default:this.disableUnknownObjectWarnings||(console.warn("Unknown SVG element,",o,o.tagName),o instanceof SVGElement||console.warn("Element",o,"is not an SVGElement!",this.storeUnknown?"Continuing anyway.":"Skipping.")),await this.addUnknownNode(o);return}if(e){for(let r of o.children)await this.visit(r);o.tagName.toLowerCase()==="g"&&await this.endGroup()}this.processedCount++,await this.onProgress?.(this.processedCount,this.totalToProcess)}getSourceAttrs(o){return o.getAttributeNames().map(e=>[e,o.getAttribute(e)])}async start(o,e,r=null){this.onAddComponent=o,this.onProgress=e,this.onDetermineExportRect=r,this.totalToProcess=this.source.childElementCount,this.processedCount=0,this.rootViewBox=null,await this.visit(this.source),this.rootViewBox||this.onDetermineExportRect?.(Wa),this.onFinish?.(),this.onFinish=null}static fromString(o,e=!1){let r=typeof e!="boolean"&&e?.loadMethod==="domparser",{svgElem:n,cleanUp:i}=(()=>{if(!r)try{let m=document.createElement("iframe");if(m.src="about:blank",m.setAttribute("sandbox","allow-same-origin"),m.setAttribute("csp","default-src 'about:blank'"),m.style.display="none",document.body.appendChild(m),!m.hasAttribute("sandbox"))throw m.remove(),new Error("SVG loading iframe is not sandboxed.");let g=m.contentWindow?.document??m.contentDocument;if(g==null)throw new Error("Unable to open a sandboxed iframe!");g.open(),g.write(`
22
22
  <!DOCTYPE html>
23
23
  <html>
24
24
  <head>
@@ -35,7 +35,7 @@ Adding as an unknown object.`),this.storeUnknown)e=new kt(o);else return}await t
35
35
  <\/script>
36
36
  </body>
37
37
  </html>
38
- `),g.close();let v=g.createElementNS("http://www.w3.org/2000/svg","svg");return v.innerHTML=o,g.body.appendChild(v),{svgElem:v,cleanUp:()=>{v.remove(),m.remove(),m.src=""}}}catch(m){console.warn("Failed loading SVG via a sandboxed iframe. Some styles may not be loaded correctly. Error: ",m)}let d=new DOMParser().parseFromString(`<svg xmlns="http://www.w3.org/2000/svg">${o}</svg>`,"text/html"),p=d.querySelector("svg"),u=d.querySelector("parsererror");if(u)throw new Error("Parse error: "+u.textContent);return{svgElem:p,cleanUp:()=>{}}})(),a,l;return typeof e=="boolean"?(a=e,l=!1):(a=e.sanitize??!1,l=e.disableUnknownObjectWarnings??!1),new s(n,i,{sanitize:a,disableUnknownObjectWarnings:l})}};var Fa=(s,o)=>{let e=s.length<o.length?s:o,r=e===s?o:s;for(let n=0;n<e.length;n++)if(e[n]!==r[n])return!1;return!0},us=Fa;var Ao="js-draw-style-sheet",lo="http://www.w3.org/2000/svg",di={fontWeight:"400",fontStyle:"normal"},me=class s extends Le{constructor(e,r,n=!1){super(r);this.elem=e;this.sanitize=n;this.lastPathStyle=null;this.lastPathString=[];this.lastContainerIDList=[];this.objectElems=null;this.overwrittenAttrs={};this.textContainer=null;this.textContainerTransform=null;this.textParentStyle=di;this.clear(),this.addStyleSheet()}addStyleSheet(){if(!this.elem.querySelector(`#${Ao}`)){let e=document.createElementNS("http://www.w3.org/2000/svg","style");e.appendChild(document.createTextNode(`
38
+ `),g.close();let v=g.createElementNS("http://www.w3.org/2000/svg","svg");return v.innerHTML=o,g.body.appendChild(v),{svgElem:v,cleanUp:()=>{v.remove(),m.remove(),m.src=""}}}catch(m){console.warn("Failed loading SVG via a sandboxed iframe. Some styles may not be loaded correctly. Error: ",m)}let d=new DOMParser().parseFromString(`<svg xmlns="http://www.w3.org/2000/svg">${o}</svg>`,"text/html"),u=d.querySelector("svg"),p=d.querySelector("parsererror");if(p)throw new Error("Parse error: "+p.textContent);return{svgElem:u,cleanUp:()=>{}}})(),a,l;return typeof e=="boolean"?(a=e,l=!1):(a=e.sanitize??!1,l=e.disableUnknownObjectWarnings??!1),new s(n,i,{sanitize:a,disableUnknownObjectWarnings:l})}};var Ka=(s,o)=>{let e=s.length<o.length?s:o,r=e===s?o:s;for(let n=0;n<e.length;n++)if(e[n]!==r[n])return!1;return!0},bs=Ka;var Oo="js-draw-style-sheet",po="http://www.w3.org/2000/svg",mi={fontWeight:"400",fontStyle:"normal"},me=class s extends ze{constructor(e,r,n=!1){super(r);this.elem=e;this.sanitize=n;this.lastPathStyle=null;this.lastPathString=[];this.lastContainerIDList=[];this.objectElems=null;this.overwrittenAttrs={};this.textContainer=null;this.textContainerTransform=null;this.textParentStyle=mi;this.clear(),this.addStyleSheet()}addStyleSheet(){if(!this.elem.querySelector(`#${Oo}`)){let e=document.createElementNS("http://www.w3.org/2000/svg","style");e.appendChild(document.createTextNode(`
39
39
  path {
40
40
  stroke-linecap: round;
41
41
  stroke-linejoin: round;
@@ -44,9 +44,9 @@ Adding as an unknown object.`),this.storeUnknown)e=new kt(o);else return}await t
44
44
  text {
45
45
  white-space: pre;
46
46
  }
47
- `.replace(/\s+/g,""))),e.setAttribute("id",Ao),this.elem.appendChild(e)}}setRootSVGAttribute(e,r){this.sanitize||(e in this.overwrittenAttrs||(this.overwrittenAttrs[e]=this.elem.getAttribute(e)),r!==null?this.elem.setAttribute(e,r):this.elem.removeAttribute(e))}displaySize(){return w.of(this.elem.clientWidth,this.elem.clientHeight)}clear(){if(this.lastPathString=[],this.lastContainerIDList=[],!this.sanitize){for(let e in this.overwrittenAttrs){let r=this.overwrittenAttrs[e];r?this.elem.setAttribute(e,r):this.elem.removeAttribute(e)}this.overwrittenAttrs={}}}addPathToSVG(){if(!this.lastPathStyle||this.lastPathString.length===0)return null;let e=document.createElementNS(lo,"path");e.setAttribute("d",this.lastPathString.join(" "));let r=this.lastPathStyle;return r.fill.a>0?e.setAttribute("fill",r.fill.toHexString()):e.setAttribute("fill","none"),r.stroke&&(e.setAttribute("stroke",r.stroke.color.toHexString()),e.setAttribute("stroke-width",de(r.stroke.width*this.getSizeOfCanvasPixelOnScreen()))),this.elem.appendChild(e),this.objectElems?.push(e),e}drawPath(e){let r=e.style,n=ht(e).transformedBy(this.getCanvasToScreenTransform());(this.lastPathString.length===0||!this.lastPathStyle||!Tr(this.lastPathStyle,r))&&(this.addPathToSVG(),this.lastPathStyle=r,this.lastPathString=[]),this.lastPathString.push(n.toString())}transformFrom(e,r,n=!1){let i=n?e:this.getCanvasToScreenTransform().rightMul(e);if(i.eq(k.identity))r.style.transform="";else{let a=i.toCSSMatrix();r.style.transform=a,r.setAttribute("data-highp-transform",a)}}drawText(e,r,n){let i=(a,l)=>{l.fontFamily!==this.textParentStyle?.fontFamily&&(a.style.fontFamily=l.fontFamily),l.fontVariant!==this.textParentStyle?.fontVariant&&(a.style.fontVariant=l.fontVariant??""),l.fontWeight!==this.textParentStyle?.fontWeight&&(a.style.fontWeight=l.fontWeight??""),l.fontStyle!==this.textParentStyle?.fontStyle&&(a.style.fontStyle=l.fontStyle??""),l.size!==this.textParentStyle?.size&&(a.style.fontSize=l.size+"px");let c=l.renderingStyle.fill.toHexString();if(a.style.fill=c,l.renderingStyle.stroke){let d=l.renderingStyle.stroke;a.style.stroke=d.color.toHexString(),a.style.strokeWidth=d.width+"px"}};if(r=this.getCanvasToScreenTransform().rightMul(r),this.textContainer){let a=document.createElementNS(lo,"tspan");a.appendChild(document.createTextNode(e)),this.textContainer.appendChild(a),r=this.textContainerTransform.inverse().rightMul(r);let l=r.transformVec2(w.zero);a.setAttribute("x",`${de(l.x)}`),a.setAttribute("y",`${de(l.y)}`),i(a,n)}else{let a=document.createElementNS(lo,"text");a.appendChild(document.createTextNode(e)),this.transformFrom(r,a,!0),i(a,n),this.elem.appendChild(a),this.objectElems?.push(a),this.objectLevel>0&&(this.textContainer=a,this.textContainerTransform=r,this.textParentStyle={...di,...n})}}drawImage(e){let r=e.label??e.image.getAttribute("aria-label")??"";r===""&&(r=e.image.getAttribute("alt")??"");let n=document.createElementNS(lo,"image");n.setAttribute("href",e.base64Url),n.setAttribute("width",e.image.getAttribute("width")??""),n.setAttribute("height",e.image.getAttribute("height")??""),n.setAttribute("aria-label",r),this.transformFrom(e.transform,n),this.elem.appendChild(n),this.objectElems?.push(n)}startObject(e){super.startObject(e),this.lastPathString=[],this.lastPathStyle=null,this.textContainer=null,this.textParentStyle=di,this.objectElems=[]}endObject(e,r){if(super.endObject(e),this.addPathToSVG(),!!this.objectElems){if(e&&!this.sanitize){for(let a of this.objectElems){let l=e[ai],c=e[li];if(l)for(let[d,p]of l)a.setAttribute(d,p);if(c)for(let d of c)a.style.setProperty(d.key,d.value,d.priority)}let n=e[ci],i=[];if(n&&n[0]&&n[0].length&&(i=n[0]),i.length>0&&us(this.lastContainerIDList,i)&&this.lastContainerIDList.length>=i.length-1){let a=i[i.length-1],l=this.elem.querySelectorAll(`g#${a}`);if(l.length>=1){let c=l[0];if(c.children.length===0||this.lastContainerIDList.length>=i.length)for(let d of this.objectElems)d.remove(),c.appendChild(d);else i=[]}}else i=[];this.lastContainerIDList=i}if(r&&this.objectElems)if(this.objectElems.length===1)this.objectElems[0].classList.add(...r);else{let n=document.createElementNS(lo,"g");n.classList.add(...r);for(let i of this.objectElems)i.remove(),n.appendChild(i);this.elem.appendChild(n)}}}unimplementedMessage(){throw new Error("Not implemenented!")}beginPath(e){this.unimplementedMessage()}endPath(e){this.unimplementedMessage()}lineTo(e){this.unimplementedMessage()}moveTo(e){this.unimplementedMessage()}traceCubicBezierCurve(e,r,n){this.unimplementedMessage()}traceQuadraticBezierCurve(e,r){this.unimplementedMessage()}drawPoints(...e){e.map(r=>{let n=document.createElementNS(lo,"circle");n.setAttribute("cx",`${r.x}`),n.setAttribute("cy",`${r.y}`),n.setAttribute("r","15"),this.elem.appendChild(n)})}drawSVGElem(e){if(this.sanitize||e.tagName.toLowerCase()==="style"&&e.getAttribute("id")===Ao)return;let r=e.cloneNode(!0);this.elem.appendChild(r),this.objectElems?.push(r)}isTooSmallToRender(e){return!1}static fromViewport(e,r=!0){let n,i;typeof r=="boolean"?(n=r,i=!1):(n=r.sanitize??!0,i=r.useViewBoxForPositioning??!1);let a="http://www.w3.org/2000/svg",l=document.createElementNS(a,"svg"),c=e.getScreenRectSize(),d=e.visibleRect,p;if(i){let h=e.visibleRect;p=[h.x,h.y,h.w,h.h],e=e.getTemporaryClone(),e.resetTransform(k.identity)}else p=[0,0,c.x,c.y];l.setAttribute("viewBox",p.map(h=>de(h)).join(" ")),l.setAttribute("width",de(c.x)),l.setAttribute("height",de(c.y)),l.setAttribute("version","1.1"),l.setAttribute("baseProfile","full"),l.setAttribute("xmlns",a);let u=new s(l,e,n);return d.eq(e.visibleRect)||u.overrideVisibleRect(d),{element:l,renderer:u}}};var co=30,po=class{constructor(o,e,r,n,i,a){this.presentation=o;this.parent=e;this.viewport=r;this.onDragStart=n;this.onDragUpdate=i;this.onDragEnd=a;this.dragLastPos=null;this.element=document.createElement("div"),this.element.classList.add(`${Te}handle`,`${Te}${o.action}`);let l=document.createElement("div");l.classList.add(`${Te}content`),this.element.appendChild(l),this.parentSide=o.side;let c=o.icon;switch(c&&(l.appendChild(c),c.classList.add("icon")),o.action==="rotate"?this.shape=0:this.shape=1,this.shape){case 0:this.element.classList.add(`${Te}circle`);break;case 1:this.element.classList.add(`${Te}square`);break;default:Hi(this.shape)}this.updatePosition()}addTo(o){o.appendChild(this.element)}remove(){this.element.remove()}getBBoxParentCoords(){let o=this.parent.getScreenRegion(),e=w.of(co,co),r=o.size.scale(this.parentSide).minus(e.times(1/2));return new B(r.x,r.y,e.x,e.y)}getBBoxCanvasCoords(){let o=this.parent.region,e=w.of(co,co).times(1/this.viewport.getScaleFactor()),r=o.size.scale(this.parentSide).minus(e.times(.5));return new B(r.x,r.y,e.x,e.y).translatedBy(o.topLeft)}updatePosition(){let o=this.getBBoxParentCoords();this.element.style.marginLeft=`${o.topLeft.x}px`,this.element.style.marginTop=`${o.topLeft.y}px`,this.element.style.width=`${o.w}px`,this.element.style.height=`${o.h}px`}containsPoint(o){let e=this.getBBoxCanvasCoords(),r=o.minus(e.center),n=e.size.x/2,i;return this.shape===0?i=r.magnitude()<=n:i=Math.abs(r.x)<=n&&Math.abs(r.y)<=n,i}handleDragStart(o){return this.onDragStart(o.canvasPos),this.dragLastPos=o.canvasPos,!0}handleDragUpdate(o){this.dragLastPos&&this.onDragUpdate(o.canvasPos)}handleDragEnd(){if(this.dragLastPos)return this.onDragEnd()}setSnapToGrid(o){this.snapToGrid=o}isSnappingToGrid(){return this.snapToGrid}};var Rt=class s extends U{constructor(e){super("duplicate");this.toDuplicate=e;this.duplicates=e.map(r=>r.clone()),this.reverse=new J(this.duplicates)}apply(e){this.reverse.unapply(e)}unapply(e){this.reverse.apply(e)}onDrop(e){this.reverse.onDrop(e)}description(e,r){return this.duplicates.length===0?r.duplicatedNoElements:r.duplicateAction(Br(r,this.duplicates)??r.elements,this.duplicates.length)}serializeToJSON(){return this.toDuplicate.map(e=>e.getId())}static{U.register("duplicate",(e,r)=>{let n=e.map(i=>r.image.lookupElement(i));return new s(n)})}};var Vr=class{constructor(o,e){this.editor=o;this.selection=e}onDragStart(o){this.selection.setTransform(k.identity),this.dragStartPoint=o}onDragUpdate(o){let e=this.editor.viewport.roundPoint(o.minus(this.dragStartPoint));this.selection.setTransform(k.translation(e))}onDragEnd(){return this.selection.finalizeTransform()}},Or=class{constructor(o,e){this.editor=o;this.selection=e;this.mode=0}onDragStart(o,e){this.selection.setTransform(k.identity),this.mode=e,this.dragStartPoint=o,this.computeOriginAndScaleRate()}computeOriginAndScaleRate(){let o=this.selection.preTransformRegion,e=o.corners,r=0;for(let a=0;a<e.length;a++){let l=e[a],c=this.dragStartPoint.minus(l).magnitudeSquared();c>r&&(r=c,this.transformOrigin=l)}let n=1,i=1;this.transformOrigin.x>o.center.x&&(n=-1),this.transformOrigin.y>o.center.y&&(i=-1),this.scaleRate=w.of(n,i)}onDragUpdate(o){let e=o.minus(this.dragStartPoint),r=this.selection.preTransformRegion.width,n=this.selection.preTransformRegion.height,i=w.of(1,1);if(this.mode===1){let a=r+e.x*this.scaleRate.x;i=w.of(a/r,i.y)}if(this.mode===2){let a=n+e.y*this.scaleRate.y;i=w.of(i.x,a/n)}if(this.mode===0){let a=Math.abs(e.x)>Math.abs(e.y)?e.x:e.y,l=r+a;i=w.of(l/r,l/r)}if(i=i.map(a=>$.roundScaleRatio(a,2)),i.x!==0&&i.y!==0){let a=this.editor.viewport.roundPoint(this.transformOrigin);this.selection.setTransform(k.scaling2D(i,a))}}onDragEnd(){return this.selection.finalizeTransform()}},Fr=class{constructor(o,e){this.editor=o;this.selection=e;this.startAngle=0;this.targetRotation=0;this.maximumDistFromStart=0}getAngle(o){let e=this.selection.preTransformRegion.center;return o.minus(e).angle()}roundAngle(o){let e=8/Math.PI;return Math.round(o*e)/e}onDragStart(o){this.startPoint=o,this.selection.setTransform(k.identity),this.startAngle=this.getAngle(o),this.targetRotation=0,this.maximumDistFromStart=0,this.startTime=performance.now()}setRotationTo(o){let e=this.editor.viewport.roundPoint(this.selection.preTransformRegion.center),n=k.zRotation(o).mapEntries(a=>$.roundScaleRatio(a)),i=k.translation(e).rightMul(n).rightMul(k.translation(e.times(-1)));this.selection.setTransform(i)}onDragUpdate(o){this.targetRotation=this.roundAngle(this.getAngle(o)-this.startAngle),this.setRotationTo(this.targetRotation);let e=o.minus(this.startPoint).magnitude();e>this.maximumDistFromStart&&(this.maximumDistFromStart=e)}onDragEnd(){return(performance.now()-this.startTime)/1e3<.4&&this.maximumDistFromStart<10&&this.targetRotation===0&&this.setRotationTo(-Math.PI/2),this.selection.finalizeTransform()}};var pi=40,Vo=class{constructor(o,e,r,n,i){this.parent=o;this.viewport=e;this.icon=r;this.localization=i;this.lastDragPointer=null;this.element=document.createElement("div"),this.element.classList.add(`${Te}handle`,`${Te}selection-menu`),this.element.style.setProperty("--vertical-offset",`${pi}px`),this.onClick=()=>{this.button?.focus({preventScroll:!0});let a=this.getBBoxCanvasCoords().center;n(a)},this.initUI(),this.updatePosition()}initUI(){let o=document.createElement("button");this.icon.classList.add("icon"),o.replaceChildren(this.icon),o.ariaLabel=this.localization.selectionMenu__show,o.title=o.ariaLabel,this.button=o,o.onkeydown=e=>{e.key==="Enter"&&(e.preventDefault(),this.onClick())},this.element.appendChild(o),requestAnimationFrame(()=>{this.updatePosition()})}addTo(o){o.appendChild(this.element)}remove(){this.element.remove()}getElementScreenSize(){return w.of(this.element.clientWidth,this.element.clientHeight)}getBBoxParentCoords(){let o=w.of(0,-pi),e=this.getElementScreenSize();return new B(o.x,o.y,e.x,e.y)}getBBoxCanvasCoords(){let o=this.parent.region,e=this.viewport.getSizeOfPixelOnCanvas(),r=this.getElementScreenSize().times(e),n=pi/this.viewport.getScaleFactor(),i=w.of(o.x,o.y-n),a=w.of(48,48).times(e);return new B(i.x,i.y,r.x,r.y).grownToSize(a)}updatePosition(){let o=this.getBBoxParentCoords();this.element.style.marginLeft=`${o.topLeft.x}px`,this.element.style.marginTop=`${o.topLeft.y}px`}containsPoint(o){return this.getBBoxCanvasCoords().containsPoint(o)}handleDragStart(o){return this.lastDragPointer=o,!0}handleDragUpdate(o){this.lastDragPointer=o}handleDragEnd(){this.lastDragPointer&&this.containsPoint(this.lastDragPointer.canvasPos)&&this.onClick(),this.lastDragPointer=null}};var ui=100,hs=500,Oo=class s{constructor(o,e,r){this.editor=e;this.selectionTightBoundingBox=null;this.transform=k.identity;this.selectedElems=[];this.hasParent=!0;this.removedFromImage={};this.activeHandle=null;this.backgroundDragging=!1;this.selectionDuplicatedAnimationTimeout=null;this.originalRegion=new B(o.x,o.y,0,0),this.transformers={drag:new Vr(e,this),resize:new Or(e,this),rotate:new Fr(e,this)},this.outerContainer=document.createElement("div"),this.outerContainer.classList.add(`${Te}selection-outer-container`),this.innerContainer=document.createElement("div"),this.innerContainer.classList.add(`${Te}selection-inner-container`),this.backgroundElem=document.createElement("div"),this.backgroundElem.classList.add(`${Te}selection-background`),this.innerContainer.appendChild(this.backgroundElem),this.outerContainer.appendChild(this.innerContainer);let n=(p,u)=>{let h={0:"resize-xy",1:"resize-x",2:"resize-y"};return new po({action:h[p],side:u},this,this.editor.viewport,m=>this.transformers.resize.onDragStart(m,p),m=>this.transformers.resize.onDragUpdate(m),()=>this.transformers.resize.onDragEnd())},i=[n(1,w.of(0,.5)),n(1,w.of(1,.5))],a=n(2,w.of(.5,1)),l=n(0,w.of(1,1)),c=new po({action:"rotate",side:w.of(.5,0),icon:this.editor.icons.makeRotateIcon()},this,this.editor.viewport,p=>this.transformers.rotate.onDragStart(p),p=>this.transformers.rotate.onDragUpdate(p),()=>this.transformers.rotate.onDragEnd()),d=new Vo(this,this.editor.viewport,this.editor.icons.makeOverflowIcon(),r,this.editor.localization);this.childwidgets=[d,l,...i,a,c];for(let p of this.childwidgets)p.addTo(this.backgroundElem);this.updateUI()}getBackgroundElem(){return this.backgroundElem}getTransform(){return this.transform}get preTransformRegion(){return this.originalRegion}get region(){let o=k.zRotation(this.regionRotation,this.originalRegion.center),e=this.transform.rightMul(o.inverse());return this.originalRegion.transformedBoundingBox(e)}computeTightBoundingBox(){return this.selectedElems.reduce((e,r)=>(e??r.getBBox()).union(r.getBBox()),null)??B.empty}get regionRotation(){return this.transform.transformVec3(w.unitX).angle()}get preTransformedScreenRegion(){let o=e=>this.editor.viewport.canvasToScreen(e);return B.fromCorners(o(this.preTransformRegion.topLeft),o(this.preTransformRegion.bottomRight))}get preTransformedScreenRegionRotation(){return this.editor.viewport.getRotationAngle()}getScreenRegion(){let o=this.editor.viewport.canvasToScreenTransform,e=this.editor.viewport.getScaleFactor(),r=o.transformVec2(this.region.center);return new B(r.x,r.y,e*this.region.width,e*this.region.height).translatedBy(this.region.size.times(-e/2))}get screenRegionRotation(){return this.regionRotation+this.editor.viewport.getRotationAngle()}setTransform(o,e=!0){this.transform=o,e&&this.hasParent&&this.previewTransformCmds()}getDeltaZIndexToMoveSelectionToTop(){if(this.selectedElems.length===0)return 0;let o=this.selectedElems[0].getZIndex(),e=this.editor.image.getElementsIntersectingRegion(this.region);return(e[e.length-1]?.getZIndex()??o)+1-o}finalizeTransform(){let o=this.transform,e=this.selectedElems;this.originalRegion=this.originalRegion.transformedBoundingBox(this.transform),this.transform=k.identity,this.scrollTo();let r;if(this.selectedElems.length>0){let n=this.getDeltaZIndexToMoveSelectionToTop();r=this.editor.dispatch(new s.ApplyTransformationCommand(this,e,o,n))}return r}sendToBack(){let e=this.editor.image.getElementsIntersectingRegion(this.editor.viewport.visibleRect)[0]?.getZIndex()??0,r=this.selectedElems[this.selectedElems.length-1]?.getZIndex()??0,i=e-1-r;if(i!==0){let a=this.selectedElems.map(l=>l.setZIndex(l.getZIndex()+i));return se(a,ui)}return null}static{U.register("selection-tool-transform",(o,e)=>{let r=new k(...o.transform),n=o.elems??[],i=parseInt(o.deltaZIndex??0);return new this.ApplyTransformationCommand(null,n,r,i)})}static{this.ApplyTransformationCommand=class extends U{constructor(e,r,n,i){super("selection-tool-transform");this.selection=e;this.fullTransform=n;this.deltaZIndex=i;(l=>typeof l[0]=="string")(r)?this.selectedElemIds=r:(this.selectedElemIds=r.map(l=>l.getId()),this.transformCommands=r.map(l=>l.setZIndexAndTransformBy(this.fullTransform,l.getZIndex()+i)))}resolveToElems(e,r){this.transformCommands||(this.transformCommands=this.selectedElemIds.map(n=>{let i=e.image.lookupElement(n);if(!i)return console.warn(`Unable to find element with ID, ${n}.`),null;let a=i.getZIndex(),l=i.getZIndex()+this.deltaZIndex;return r&&(l=i.getZIndex(),a=i.getZIndex()-this.deltaZIndex),i.setZIndexAndTransformBy(this.fullTransform,l,a)}).filter(n=>n!==null))}async apply(e){this.resolveToElems(e,!1),this.selection?.setTransform(this.fullTransform,!1),this.selection?.updateUI(),await e.asyncApplyCommands(this.transformCommands,ui),this.selection?.setTransform(k.identity,!1),this.selection?.recomputeRegion(),this.selection?.updateUI()}async unapply(e){this.resolveToElems(e,!0),this.selection?.setTransform(this.fullTransform.inverse(),!1),this.selection?.updateUI(),await e.asyncUnapplyCommands(this.transformCommands,ui,!0),this.selection?.setTransform(k.identity,!1),this.selection?.recomputeRegion(),this.selection?.updateUI()}serializeToJSON(){return{elems:this.selectedElemIds,transform:this.fullTransform.toArray(),deltaZIndex:this.deltaZIndex}}description(e,r){return r.transformedElements(this.selectedElemIds.length)}}}previewTransformCmds(){if(this.selectedElems.length===0)return;if(this.selectedElems.length>hs){this.updateUI();return}let o=this.editor.display.getWetInkRenderer();o.clear(),o.pushTransform(this.transform);let r=this.editor.viewport.visibleRect.union(this.region).transformedBoundingBox(this.transform.inverse());for(let n of this.selectedElems)n.render(o,r);o.popTransform(),this.updateUI()}resolveToObjects(){let o=!1;if(this.transform=k.identity,this.region.w===0||this.region.h===0){let e=this.editor.viewport.visibleRect.maxDimension/200;this.originalRegion=B.bboxOf(this.region.corners,e),o=!0}return this.selectedElems=this.editor.image.getElementsIntersectingRegion(this.region).filter(e=>e.intersectsRect(this.region)&&e.isSelectable()),o&&this.selectedElems.length>0&&(this.selectedElems=[this.selectedElems[this.selectedElems.length-1]]),this.recomputeRegion()?(this.updateUI(),!0):!1}recomputeRegion(){let o=this.computeTightBoundingBox();return this.selectionTightBoundingBox=o,o?(this.originalRegion=o,this.padRegion(),!0):(this.cancelSelection(),!1)}padRegion(){let o=this.selectionTightBoundingBox??this.originalRegion,e=this.getMinCanvasSize();if(o.w<e||o.h<e){let r=e/2;this.originalRegion=B.bboxOf(o.corners,r),this.updateUI()}}getMinCanvasSize(){return co/this.editor.viewport.getScaleFactor()*2}getSelectedItemCount(){return this.selectedElems.length}updateUI(){if(!this.hasParent)return;let o=this.getScreenRegion();this.backgroundElem.style.marginLeft=`${o.topLeft.x}px`,this.backgroundElem.style.marginTop=`${o.topLeft.y}px`,this.backgroundElem.style.width=`${o.width}px`,this.backgroundElem.style.height=`${o.height}px`;let e=this.screenRegionRotation*180/Math.PI;this.backgroundElem.style.transform=`rotate(${e}deg)`,this.backgroundElem.style.transformOrigin="center";let r=`${Te}rotated-near-perpendicular`;Math.abs(Math.sin(this.screenRegionRotation))>.5?this.innerContainer.classList.add(r):this.innerContainer.classList.remove(r),o.width===0&&o.height===0?this.innerContainer.classList.add("-empty"):this.innerContainer.classList.remove("-empty");for(let n of this.childwidgets)n.updatePosition(this.getScreenRegion())}addRemoveSelectionFromImage(o){if(!(!o&&this.selectedElems.length>hs)){for(let e of this.selectedElems){let r=this.editor.image.findParent(e);!o&&r?(this.removedFromImage[e.getId()]=!0,r.remove()):!r&&this.removedFromImage[e.getId()]&&(_.addElement(e).apply(this.editor),this.removedFromImage[e.getId()]=!1,delete this.removedFromImage[e.getId()])}this.editor.queueRerender().then(()=>{o?this.editor.display.getWetInkRenderer().clear():this.previewTransformCmds()})}}removeDeletedElemsFromSelection(){this.selectedElems=this.selectedElems.filter(o=>{let e=!!this.editor.image.findParent(o),r=this.removedFromImage[o.getId()];return e||r})}onDragStart(o){document.getSelection()?.removeAllRanges(),this.activeHandle=null;let e=!1;this.backgroundDragging=!1,this.region.containsPoint(o.canvasPos)&&(this.backgroundDragging=!0,e=!0);for(let r of this.childwidgets)r.containsPoint(o.canvasPos)&&(this.activeHandle=r,this.backgroundDragging=!1,e=!0);return e&&(this.removeDeletedElemsFromSelection(),this.addRemoveSelectionFromImage(!1)),this.activeHandle&&this.activeHandle.handleDragStart(o),this.backgroundDragging&&this.transformers.drag.onDragStart(o.canvasPos),e}onDragUpdate(o){this.backgroundDragging&&this.transformers.drag.onDragUpdate(o.canvasPos),this.activeHandle&&this.activeHandle.handleDragUpdate(o)}onDragEnd(){this.backgroundDragging?this.transformers.drag.onDragEnd():this.activeHandle&&this.activeHandle.handleDragEnd(),this.addRemoveSelectionFromImage(!0),this.backgroundDragging=!1,this.activeHandle=null,this.updateUI()}onDragCancel(){this.backgroundDragging=!1,this.activeHandle=null,this.setTransform(k.identity),this.addRemoveSelectionFromImage(!0),this.updateUI()}scrollTo(){if(this.selectedElems.length===0)return!1;let o=this.editor.viewport.getScreenRectSize(),e=new B(0,0,o.x,o.y),r=this.getScreenRegion();if(!e.containsPoint(r.center)){let n=r.center,i=e.getClosestPointOnBoundaryTo(n),a=this.editor.viewport.screenToCanvas(i),l=this.region.center,c=a.minus(l);return this.editor.dispatchNoAnnounce($.transformBy(k.translation(c.times(.5))),!1),this.editor.queueRerender().then(()=>{this.previewTransformCmds()}),!0}return!1}deleteSelectedObjects(){return(this.backgroundDragging||this.activeHandle)&&this.onDragEnd(),new J(this.selectedElems)}runSelectionDuplicatedAnimation(){this.selectionDuplicatedAnimationTimeout&&clearTimeout(this.selectionDuplicatedAnimationTimeout);let o=400;this.backgroundElem.style.animation=`${o}ms ease selection-duplicated-animation`,this.selectionDuplicatedAnimationTimeout=setTimeout(()=>{this.backgroundElem.style.animation="",this.selectionDuplicatedAnimationTimeout=null},o)}async duplicateSelectedObjects(){let o=this.backgroundDragging||this.activeHandle,e=null;o||this.runSelectionDuplicatedAnimation();let r;if(o){let i=this.getDeltaZIndexToMoveSelectionToTop();e=new s.ApplyTransformationCommand(null,this.selectedElems,this.transform,i),await e.apply(this.editor),this.addRemoveSelectionFromImage(!0),r=se(this.selectedElems.map(a=>_.addElement(a.clone()))),await e?.unapply(this.editor),this.addRemoveSelectionFromImage(!1),this.previewTransformCmds(),this.updateUI()}else r=new Rt(this.selectedElems);return r}setHandlesVisible(o){o?this.innerContainer.classList.remove("-hide-handles"):this.innerContainer.classList.add("-hide-handles")}addTo(o){this.outerContainer.parentElement&&this.outerContainer.remove(),o.appendChild(this.outerContainer),this.hasParent=!0}setToPoint(o){this.originalRegion=this.originalRegion.grownToPoint(o),this.selectionTightBoundingBox=null,this.updateUI()}cancelSelection(){this.outerContainer.parentElement&&this.outerContainer.remove(),this.originalRegion=B.empty,this.selectionTightBoundingBox=null,this.hasParent=!1}setSelectedObjects(o,e){this.addRemoveSelectionFromImage(!0),this.originalRegion=e,this.selectionTightBoundingBox=e,this.selectedElems=o.filter(r=>r.isSelectable()),this.selectedElems.sort((r,n)=>r.getZIndex()-n.getZIndex()),this.padRegion(),this.updateUI()}getSelectedObjects(){return[...this.selectedElems]}};var Fo=class{constructor(o,e){this.viewport=o;this.scrollByCanvasDelta=e;this.started=!1;this.updateLoopId=0;this.updateLoopRunning=!1;this.targetPoint=null;this.scrollRate=1e3}getScrollForPoint(o){let e=this.viewport.getScreenRectSize(),r=new B(0,0,e.x,e.y),n=44,i=r.grownBy(-n);if(i.containsPoint(o))return w.zero;let a=i.getClosestPointOnBoundaryTo(o),l=a.distanceTo(o),c=a.minus(o),p=Math.min(l/n,1.25);return c.normalizedOrZero().times(p)}start(){this.started=!0}onPointerMove(o){this.started&&(this.getScrollForPoint(o)===w.zero?this.stopUpdateLoop():(this.targetPoint=o,this.startUpdateLoop()))}stop(){this.targetPoint=null,this.started=!1,this.stopUpdateLoop()}startUpdateLoop(){this.updateLoopRunning||(async()=>{this.updateLoopId++;let o=this.updateLoopId,e=performance.now();for(;this.updateLoopId===o&&this.targetPoint;){this.updateLoopRunning=!0;let r=performance.now(),n=r-e,a=this.getScrollForPoint(this.targetPoint).times(this.scrollRate*n/1e3);this.scrollByCanvasDelta(this.viewport.screenToCanvasTransform.transformVec3(a)),e=r,await Ye()}this.updateLoopRunning=!1})()}stopUpdateLoop(){this.updateLoopId++}};var Na=s=>new Promise(o=>{setTimeout(()=>o(),s)}),Hr=Na;var $a=0,Ua=async(s,o,e)=>{let r=document.createElement("div"),{remove:n}=s.createHTMLOverlay(r),i=document.createElement("dialog");i.classList.add("editor-popup-menu");let a=240;i.style.setProperty("--hide-menu-animation-timeout",`${a}ms`);let l=()=>{let u=s.getOutputBBoxInDOM(),h=s.viewport.canvasToScreen(o).plus(u.topLeft);i.style.setProperty("--anchor-x",`${h.x}px`),i.style.setProperty("--anchor-y",`${h.y}px`)};l();let c=s.notifier.on(7,l);r.appendChild(i);let d=!1,p=async()=>{d||(d=!0,c.remove(),i.classList.add("-hide"),await Hr(a),i.close())};return new Promise(u=>{let h=!1,m=null,g=()=>{h||(u(m),h=!0)};i.onclose=()=>{n(),g()};let v=f=>{m=f,p(),g()};s.handlePointerEventsExceptClicksFrom(i,(f,T)=>T.target===i&&f==="pointerdown"?(p(),!0):!!d,(f,T)=>T.target===i);let b=document.createElement("div");b.classList.add("content"),b.role="menu";let y=[];b.addEventListener("keydown",f=>{let T=y.findIndex(S=>S===document.activeElement);if(T===-1)return;let P=T;f.key==="ArrowDown"?P++:f.key==="ArrowUp"?P--:f.key==="End"?P=y.length-1:f.key==="Home"&&(P=0),P<0&&(P+=y.length),P%=y.length,P!==T&&(f.preventDefault(),y[P].focus())});for(let f of e){let T=document.createElement("button");T.id=`menu-overlay-option-${$a++}`,T.role="menuitem",T.classList.add("option","editor-popup-menu-option"),T.replaceChildren(f.icon(),document.createTextNode(f.text)),T.onclick=P=>{P.defaultPrevented||v(f.key)},b.appendChild(T),y.length===0&&(T.autofocus=!0),y.push(T)}i.appendChild(b),i.showModal(),b.scrollIntoView({block:"nearest"})})},ms=Ua;var Wa=async(s,o={})=>{try{let e=new FileReader;return await new Promise((r,n)=>{e.onload=()=>r(e.result),e.onerror=n,e.onabort=n,e.onprogress=i=>{o.onprogress?.(i)},e.readAsDataURL(s)})}catch(e){(o.onWarning??console.warn)("Unable to convert file to base64 with a FileReader: ",e);let r=await s.arrayBuffer(),n=new Uint8Array(r),i=30,a=[];for(let l=0;l<n.length;l+=i){let c=String.fromCharCode(...n.slice(l,l+i));a.push(btoa(c))}return`data:${s.type??"image/*"};base64,${a.join("")}`}},Nr=Wa;var fs=s=>s.endsWith("+xml")||s.startsWith("text/"),Ve=class{constructor(o,e){this.editor=o;this.callbacks=e}#e=!1;paste(o){let e=r=>{if(this.callbacks?.onPasteError)return this.callbacks.onPasteError(r),Promise.resolve(!1);throw r};try{return this.pasteInternal(o).catch(e)}catch(r){return e(r)}}async pasteInternal(o){let e=this.editor,r=o?.dataTransfer??o?.clipboardData??null,n=!!r,i=(u,h)=>h&&e.toolController.dispatchInputEvent({kind:8,mime:u,data:h}),a=["image/svg+xml","text/html","image/png","image/jpeg","text/plain"],l=[],c=new Map,d=e.getCurrentSettings();if(n){l=[...r.files];for(let u of a){let h=r.getData(u);h&&c.set(u,h)}}else if(d.clipboardApi){let u=await d.clipboardApi.read();for(let[h,m]of u.entries())if(typeof m=="string")c.set(h,m);else{let g=m;g.type!==h&&(g=new Blob([g],{type:h})),l.push(g)}}else{let u=await navigator.clipboard.read();for(let h of u)for(let m of h.types)a.includes(m)&&l.push(await h.getType(m))}let p=async u=>{let h=fs(u);if(h){let m=c.get(u);if(i(u,m))return o?.preventDefault(),!0}for(let m of l)if(m?.type?.toLowerCase()===u)if(h){let v=await m.text();if(i(u,v))return o?.preventDefault(),!0}else{e.showLoadingWarning(0);let v=b=>{e.showLoadingWarning(b.loaded/b.total)};try{let b=await Nr(m,{onprogress:v});if(i(u,b))return o?.preventDefault(),e.hideLoadingWarning(),!0}catch(b){console.error("Error reading image:",b)}e.hideLoadingWarning()}return!1};for(let u of a)if(await p(u))return!0;return!1}copy(o){let e=r=>{if(this.callbacks?.onCopyError)return this.callbacks.onCopyError(r),Promise.resolve();throw r};try{return this.copyInternal(o).catch(e)}catch(r){return e(r)}}copyInternal(o){let e=new Map;this.editor.toolController.dispatchInputEvent({kind:7,setData:(p,u)=>{e.set(p,u)}})&&o?.preventDefault();let n=[...e.keys()].some(p=>!fs(p)),i=p=>{if(!o)throw new Error(`Unable to copy -- no event provided${p?`. Original error: ${p}`:""}`);for(let[u,h]of e.entries())typeof h=="string"&&("clipboardData"in o?o.clipboardData?.setData(u,h):o.dataTransfer?.setData(u,h))},a=()=>{let h=(m=>{let g=Object.create(null);for(let[v,b]of Object.entries(m))"supports"in ClipboardItem&&typeof ClipboardItem.supports=="function"&&!ClipboardItem.supports(v)||(g[v]=b);return g})((m=>{let g=Object.create(null);for(let[v,b]of m.entries()){if(typeof b=="string"){let y=new Blob([new TextEncoder().encode(b)],{type:v});g[v]=y}else g[v]=b;v==="image/svg+xml"&&(g["text/html"]??=g[v])}return g})(e));return navigator.clipboard.write([new ClipboardItem(h)])},l=typeof ClipboardItem<"u"&&typeof navigator?.clipboard?.write<"u",c=!this.#e&&l&&(n||!o),d=this.editor.getCurrentSettings();if(c&&d.clipboardApi)return d.clipboardApi.write(e)??Promise.resolve();if(c){let p=null,u=h=>{console.warn("Unable to copy to the clipboard API. Future calls to .copy will use ClipboardEvents if possible.",h),this.#e=!0,i(h)};try{p=a()}catch(h){u(h)}if(p)return p.catch(u)}else i();return Promise.resolve()}};var Ka=(s,o)=>{let e=document.createElement("div"),{remove:r}=s.createHTMLOverlay(e);e.classList.add("dialog-container","message-dialog-container",...o.classNames??[]);let n=document.createElement("dialog"),i=document.createElement("div");i.classList.add("message-dialog-content",...o.contentClassNames??[]);let a=document.createElement("h1");a.textContent=o.title,a.setAttribute("autofocus","true");let l=document.createElement("button");l.innerText=s.localization.closeDialog,l.classList.add("close");let c=document.createElement("div");c.classList.add("scroll"),c.onwheel=h=>h.stopPropagation(),i.replaceChildren(a,c,l),n.replaceChildren(i),e.replaceChildren(n);let d=300;n.style.setProperty("--close-delay",`${d}ms`);let p=async()=>{n.classList.add("-closing"),await Hr(d),n.close()};return(()=>{n.addEventListener("pointerdown",h=>{h.target===n&&p()}),n.onclose=()=>{r()},l.onclick=()=>p()})(),n.showModal(),{close:()=>p(),appendChild:h=>{c.appendChild(h)}}},$r=Ka;var Ga=s=>{let o=e=>{let r=$r(s,{title:s.localization.copyPasteError__heading,classNames:["clipboard-error-dialog"]});r.appendChild(document.createTextNode(s.localization.copyPasteError__description));let n=document.createElement("details"),i=document.createElement("summary");return i.textContent=s.localization.copyPasteError__errorDetails,n.appendChild(i),n.appendChild(document.createTextNode(`Error: ${e}`)),r.appendChild(n),r};return{onCopyError(e){let r=o(e),n=document.createElement("label");n.textContent=s.localization.copyPasteError__copyRetry;let i=document.createElement("textarea");n.appendChild(i);let a=new Ve(s),l=c=>(c.preventDefault(),a.copy(c).then(()=>{r.close()}));i.oncopy=l,i.ondragstart=l,i.value=s.localization.copyPasteError__copyMe,r.appendChild(n),i.select(),document.execCommand("copy")},onPasteError(e){let r=o(e),n=document.createElement("label");n.textContent=s.localization.copyPasteError__pasteRetry;let i=document.createElement("textarea");n.appendChild(i);let a=new Ve(s),l=c=>(c.preventDefault(),a.paste(c).then(d=>{d&&r.close()}));i.onpaste=l,i.ondrop=l,r.appendChild(n),i.focus(),document.execCommand("paste")}}},hi=Ga;var ja=async(s,o,e,r,n)=>{let i=o.localization,a=s?.getSelectedItemCount()&&r,l=[{text:i.selectionMenu__paste,icon:()=>o.icons.makePasteIcon(),key:()=>{new Ve(o,hi(o)).paste()}}];(await ms(o,e,a?[{text:i.selectionMenu__duplicate,icon:()=>o.icons.makeDuplicateSelectionIcon(),key:async()=>{await o.dispatch(await s.duplicateSelectedObjects())}},{text:i.selectionMenu__delete,icon:()=>o.icons.makeDeleteSelectionIcon(),key:async()=>{await o.dispatch(s.deleteSelectedObjects()),n()}},{text:i.selectionMenu__copyToClipboard,icon:()=>o.icons.makeCopyIcon(),key:()=>{new Ve(o,hi(o)).copy()}},...l]:l))?.()},gs=ja;var Te="selection-tool-",ve=class extends W{constructor(e,r){super(e.notifier,r);this.editor=e;this.rebuildSelectionScheduled=!1;this.startPoint=null;this.expandingSelectionBox=!1;this.shiftKeyPressed=!1;this.snapToGrid=!1;this.lastPointer=null;this.showContextMenu=async(e,r=!0)=>{await gs(this.selectionBox,this.editor,e,r,()=>this.clearSelection())};this.selectionBoxHandlingEvt=!1;this.lastSelectedObjects=[];this.hasUnfinalizedTransformFromKeyPress=!1;this.autoscroller=new Fo(e.viewport,n=>{if(e.dispatch($.transformBy(k.translation(n)),!1),this.lastPointer){let i=this.lastPointer.withScreenPosition(this.lastPointer.screenPos,e.viewport);this.onMainPointerUpdated(i)}}),this.handleOverlay=document.createElement("div"),e.createHTMLOverlay(this.handleOverlay),this.handleOverlay.style.display="none",this.handleOverlay.classList.add("handleOverlay"),e.notifier.on(7,n=>{this.editor.clearWetInk(),this.expandingSelectionBox||this.selectionBox?.padRegion(),this.selectionBox?.updateUI()}),this.editor.handleKeyEventsFrom(this.handleOverlay),this.editor.handlePointerEventsFrom(this.handleOverlay)}makeSelectionBox(e){this.prevSelectionBox=this.selectionBox,this.selectionBox=new Oo(e,this.editor,this.showContextMenu),this.expandingSelectionBox||this.prevSelectionBox?.cancelSelection(),this.selectionBox.addTo(this.handleOverlay)}snapSelectionToGrid(){if(!this.selectionBox)throw new Error("No selection to snap!");let e=this.selectionBox.computeTightBoundingBox().topLeft,n=this.editor.viewport.snapToGrid(e).minus(e),i=this.selectionBox.getTransform();this.selectionBox.setTransform(i.rightMul(k.translation(n))),this.selectionBox.finalizeTransform()}onContextMenu(e){let r=this.selectionBox?.getScreenRegion()?.containsPoint(e.screenPos);return this.showContextMenu(e.canvasPos,r),!0}onPointerDown({allPointers:e,current:r}){let n=this.snapToGrid;if(n&&(r=r.snappedToGrid(this.editor.viewport)),e.length===1){this.startPoint=r.canvasPos;let i=!1;return this.selectionBox&&(n&&this.snapSelectionToGrid(),this.selectionBox.onDragStart(r)&&(i=!0,this.selectionBoxHandlingEvt=!0,this.expandingSelectionBox=!1)),i?this.autoscroller.start():(this.expandingSelectionBox=this.shiftKeyPressed,this.rebuildSelectionScheduled=!0),!0}return!1}onPointerMove(e){this.onMainPointerUpdated(e.current)}onMainPointerUpdated(e){if(this.lastPointer=e,this.rebuildSelectionScheduled&&(this.rebuildSelectionScheduled=!1,this.makeSelectionBox(this.startPoint??e.canvasPos),this.selectionBox?.setHandlesVisible(!1)),!!this.selectionBox){if(this.autoscroller.onPointerMove(e.screenPos),!this.expandingSelectionBox&&this.shiftKeyPressed&&this.startPoint){let r=this.editor.viewport.canvasToScreen(this.startPoint);e=e.lockedToXYAxesScreen(r,this.editor.viewport)}this.snapToGrid&&(e=e.snappedToGrid(this.editor.viewport)),this.selectionBoxHandlingEvt?this.selectionBox.onDragUpdate(e):this.selectionBox.setToPoint(e.canvasPos)}}onPointerUp(e){this.onMainPointerUpdated(e.current),this.autoscroller.stop(),this.selectionBox&&(this.selectionBox.setHandlesVisible(!0),this.expandingSelectionBox&&this.prevSelectionBox?(this.expandingSelectionBox=!1,this.selectionBox.resolveToObjects(),this.setSelection([...this.selectionBox.getSelectedObjects(),...this.prevSelectionBox.getSelectedObjects()])):(this.selectionBoxHandlingEvt?this.selectionBox.onDragEnd():(this.selectionBox.resolveToObjects(),this.onSelectionUpdated()),this.selectionBoxHandlingEvt=!1,this.lastPointer=null))}onGestureCancel(){this.autoscroller.stop(),this.selectionBoxHandlingEvt?this.selectionBox?.onDragCancel():this.rebuildSelectionScheduled||(this.selectionBox?.cancelSelection(),this.selectionBox=this.prevSelectionBox,this.selectionBox?.addTo(this.handleOverlay),this.selectionBox?.recomputeRegion(),this.prevSelectionBox=null),this.rebuildSelectionScheduled=!1,this.expandingSelectionBox=!1,this.lastPointer=null,this.selectionBoxHandlingEvt=!1}onSelectionUpdated(){let e=this.selectionBox?.getSelectedItemCount()??0,r=this.selectionBox?.getSelectedObjects()??[];(this.lastSelectedObjects.length!==e||r.some((i,a)=>this.lastSelectedObjects[a]!==i))&&(this.lastSelectedObjects=r,this.editor.notifier.dispatch(2,{kind:2,tool:this}),this.editor.notifier.dispatch(9,{kind:9,selectedComponents:r,tool:this}),e>0&&(this.editor.announceForAccessibility(this.editor.localization.selectedElements(e)),this.zoomToSelection())),e===0&&this.selectionBox&&(this.selectionBox.cancelSelection(),this.prevSelectionBox=this.selectionBox,this.selectionBox=null)}zoomToSelection(){if(this.selectionBox){let e=this.selectionBox.region;this.editor.dispatchNoAnnounce(this.editor.viewport.zoomTo(e,!1),!1)}}onKeyPress(e){let r=this.editor.shortcuts;if(r.matchesShortcut(oo,e))return this.snapToGrid=!0,!0;if(this.selectionBox&&(r.matchesShortcut(xr,e)||r.matchesShortcut(wr,e)))return!0;if(r.matchesShortcut(to,e))return this.setSelection(this.editor.image.getAllElements()),!0;if(e.ctrlKey)return!1;if((e.shiftKey||e.key==="Shift")&&(this.shiftKeyPressed=!0,e.key==="Shift"))return!0;let n=0,i=0,a=0,l=0,c=0;r.matchesShortcut(Rn,e)?i-=1:r.matchesShortcut(zn,e)?i+=1:r.matchesShortcut(Ln,e)?a-=1:r.matchesShortcut(In,e)?a+=1:r.matchesShortcut(Dn,e)?n+=1:r.matchesShortcut(Bn,e)?n-=1:r.matchesShortcut(Mn,e)?l-=1:r.matchesShortcut(An,e)?l+=1:r.matchesShortcut(Vn,e)?c-=1:r.matchesShortcut(On,e)?c+=1:r.matchesShortcut(Fn,e)?(l-=1,c-=1):r.matchesShortcut(Hn,e)&&(l+=1,c+=1);let d=i!==0||a!==0||n!==0||l!==0||c!==0;if(!this.selectionBox)d=!1;else if(d){let p=10*this.editor.viewport.getSizeOfPixelOnCanvas(),u=Math.PI/8,h=5/4,m=this.selectionBox.region,g=w.of(h**l,h**c),b=k.zRotation(n*u).mapEntries(P=>$.roundScaleRatio(P)),y=this.editor.viewport.roundPoint(m.center),f=k.scaling2D(g,this.editor.viewport.roundPoint(m.topLeft)).rightMul(k.translation(y).rightMul(b).rightMul(k.translation(y.times(-1)))).rightMul(k.translation(this.editor.viewport.roundPoint(w.of(i,a).times(p)))),T=this.selectionBox.getTransform();this.selectionBox.setTransform(T.rightMul(f)),this.selectionBox.scrollTo(),this.hasUnfinalizedTransformFromKeyPress=!0}return this.selectionBox&&!d&&(e.key==="Delete"||e.key==="Backspace")&&(this.editor.dispatch(this.selectionBox.deleteSelectedObjects()),this.clearSelection(),d=!0),d}onKeyUp(e){let r=this.editor.shortcuts;if(r.matchesShortcut(oo,e))return this.snapToGrid=!1,!0;if(r.matchesShortcut(to,e))return!0;if(this.selectionBox&&r.matchesShortcut(xr,e))return this.selectionBox.duplicateSelectedObjects().then(n=>{this.editor.dispatch(n)}),!0;if(this.selectionBox&&r.matchesShortcut(wr,e)){let n=this.selectionBox.sendToBack();return n&&this.editor.dispatch(n),!0}return e.shiftKey===!1&&(this.shiftKeyPressed=!1),e.key==="Shift"?(this.shiftKeyPressed=!1,!0):this.hasUnfinalizedTransformFromKeyPress?this.selectionBox?(this.selectionBox.finalizeTransform(),this.hasUnfinalizedTransformFromKeyPress=!1,!0):!1:!0}onCopy(e){if(!this.selectionBox)return!1;let r=this.selectionBox.getSelectedObjects(),n=this.selectionBox.region;if(r.length===0)return!1;let i=new $(()=>{}),l=this.selectionBox.getScreenRegion().size.times(this.editor.display.getDevicePixelRatio()).maximumEntryMagnitude()/(n.size.maximumEntryMagnitude()||1);l=Math.pow(2,Math.ceil(Math.log2(l))),i.updateScreenSize(n.size.times(l)),i.resetTransform(k.scaling2D(l).rightMul(k.translation(n.topLeft.times(-1))));let{element:c,renderer:d}=me.fromViewport(i,{sanitize:!0,useViewBoxForPositioning:!0}),{element:p,renderer:u}=Ie.fromViewport(i,{maxCanvasDimen:4096}),h=[];for(let m of r)m.render(d),m.render(u),m instanceof re&&h.push(m.getText());return e.setData("image/svg+xml",c.outerHTML),e.setData("text/html",c.outerHTML),e.setData("image/png",new Promise((m,g)=>{p.toBlob(v=>{v?m(v):g(new Error("Failed to convert canvas to blob."))},"image/png")})),h.length>0&&e.setData("text/plain",h.join(`
48
- `)),!0}setEnabled(e){let r=this.isEnabled();super.setEnabled(e),r!==e&&(this.selectionBox?.cancelSelection(),this.onSelectionUpdated(),this.handleOverlay.replaceChildren(),this.selectionBox=null,this.shiftKeyPressed=!1,this.snapToGrid=!1,this.handleOverlay.style.display=e?"block":"none",e?(this.handleOverlay.tabIndex=0,this.handleOverlay.setAttribute("aria-label",this.editor.localization.selectionToolKeyboardShortcuts)):this.handleOverlay.tabIndex=-1)}getSelection(){return this.selectionBox}getSelectedObjects(){return this.selectionBox?.getSelectedObjects()??[]}setSelection(e){e=e.filter(n=>n.isSelectable()),e.sort((n,i)=>n.getZIndex()-i.getZIndex()),e=e.filter((n,i)=>i>0?n!==e[i-1]:!0);let r=null;for(let n of e)r?r=r.union(n.getBBox()):r=n.getBBox();r&&(this.clearSelection(),this.selectionBox||this.makeSelectionBox(r.topLeft),this.selectionBox.setSelectedObjects(e,r),this.onSelectionUpdated())}clearSelection(){this.handleOverlay.replaceChildren(),this.prevSelectionBox=this.selectionBox,this.selectionBox=null,this.onSelectionUpdated()}};var zt=class extends W{constructor(e){super(e.notifier,e.localization.undoRedoTool);this.editor=e}onKeyPress(e){return this.editor.shortcuts.matchesShortcut(Lo,e)?(this.editor.history.undo(),!0):this.editor.shortcuts.matchesShortcut(Nn,e)?(this.editor.history.redo(),!0):!1}};var bs="textEditorOverlay",Ue=class extends W{constructor(e,r,n){super(e.notifier,r);this.editor=e;this.localizationTable=n;this.textInputElem=null;this.textMeasuringCtx=null;this.removeExistingCommand=null;let i=e.getCurrentSettings().text?.fonts??[];this.textStyleValue=j.fromInitialValue({size:32,fontFamily:i.length>0?i[0]:"sans-serif",renderingStyle:{fill:L.purple}}),this.textStyleValue.onUpdateAndNow(()=>{this.textStyle=this.textStyleValue.get(),this.updateTextInput(),this.editor.notifier.dispatch(2,{kind:2,tool:this})}),this.contentTransform=j.fromInitialValue(k.identity),this.textEditOverlay=document.createElement("div"),this.textEditOverlay.classList.add(bs),this.editor.addStyleSheet(`
49
- .${bs} textarea {
47
+ `.replace(/\s+/g,""))),e.setAttribute("id",Oo),this.elem.appendChild(e)}}setRootSVGAttribute(e,r){this.sanitize||(e in this.overwrittenAttrs||(this.overwrittenAttrs[e]=this.elem.getAttribute(e)),r!==null?this.elem.setAttribute(e,r):this.elem.removeAttribute(e))}displaySize(){return w.of(this.elem.clientWidth,this.elem.clientHeight)}clear(){if(this.lastPathString=[],this.lastContainerIDList=[],!this.sanitize){for(let e in this.overwrittenAttrs){let r=this.overwrittenAttrs[e];r?this.elem.setAttribute(e,r):this.elem.removeAttribute(e)}this.overwrittenAttrs={}}}addPathToSVG(){if(!this.lastPathStyle||this.lastPathString.length===0)return null;let e=document.createElementNS(po,"path");e.setAttribute("d",this.lastPathString.join(" "));let r=this.lastPathStyle;return r.fill.a>0?e.setAttribute("fill",r.fill.toHexString()):e.setAttribute("fill","none"),r.stroke&&(e.setAttribute("stroke",r.stroke.color.toHexString()),e.setAttribute("stroke-width",pe(r.stroke.width*this.getSizeOfCanvasPixelOnScreen()))),this.elem.appendChild(e),this.objectElems?.push(e),e}drawPath(e){let r=e.style,n=ht(e).transformedBy(this.getCanvasToScreenTransform());(this.lastPathString.length===0||!this.lastPathStyle||!Rr(this.lastPathStyle,r))&&(this.addPathToSVG(),this.lastPathStyle=r,this.lastPathString=[]),this.lastPathString.push(n.toString())}transformFrom(e,r,n=!1){let i=n?e:this.getCanvasToScreenTransform().rightMul(e);if(i.eq(k.identity))r.style.transform="";else{let a=i.toCSSMatrix();r.style.transform=a,r.setAttribute("data-highp-transform",a)}}drawText(e,r,n){let i=(a,l)=>{l.fontFamily!==this.textParentStyle?.fontFamily&&(a.style.fontFamily=l.fontFamily),l.fontVariant!==this.textParentStyle?.fontVariant&&(a.style.fontVariant=l.fontVariant??""),l.fontWeight!==this.textParentStyle?.fontWeight&&(a.style.fontWeight=l.fontWeight??""),l.fontStyle!==this.textParentStyle?.fontStyle&&(a.style.fontStyle=l.fontStyle??""),l.size!==this.textParentStyle?.size&&(a.style.fontSize=l.size+"px");let c=l.renderingStyle.fill.toHexString();if(a.style.fill=c,l.renderingStyle.stroke){let d=l.renderingStyle.stroke;a.style.stroke=d.color.toHexString(),a.style.strokeWidth=d.width+"px"}};if(r=this.getCanvasToScreenTransform().rightMul(r),this.textContainer){let a=document.createElementNS(po,"tspan");a.appendChild(document.createTextNode(e)),this.textContainer.appendChild(a),r=this.textContainerTransform.inverse().rightMul(r);let l=r.transformVec2(w.zero);a.setAttribute("x",`${pe(l.x)}`),a.setAttribute("y",`${pe(l.y)}`),i(a,n)}else{let a=document.createElementNS(po,"text");a.appendChild(document.createTextNode(e)),this.transformFrom(r,a,!0),i(a,n),this.elem.appendChild(a),this.objectElems?.push(a),this.objectLevel>0&&(this.textContainer=a,this.textContainerTransform=r,this.textParentStyle={...mi,...n})}}drawImage(e){let r=e.label??e.image.getAttribute("aria-label")??"";r===""&&(r=e.image.getAttribute("alt")??"");let n=document.createElementNS(po,"image");n.setAttribute("href",e.base64Url),n.setAttribute("width",e.image.getAttribute("width")??""),n.setAttribute("height",e.image.getAttribute("height")??""),n.setAttribute("aria-label",r),this.transformFrom(e.transform,n),this.elem.appendChild(n),this.objectElems?.push(n)}startObject(e){super.startObject(e),this.lastPathString=[],this.lastPathStyle=null,this.textContainer=null,this.textParentStyle=mi,this.objectElems=[]}endObject(e,r){if(super.endObject(e),this.addPathToSVG(),!!this.objectElems){if(e&&!this.sanitize){for(let a of this.objectElems){let l=e[ui],c=e[pi];if(l)for(let[d,u]of l)a.setAttribute(d,u);if(c)for(let d of c)a.style.setProperty(d.key,d.value,d.priority)}let n=e[hi],i=[];if(n&&n[0]&&n[0].length&&(i=n[0]),i.length>0&&bs(this.lastContainerIDList,i)&&this.lastContainerIDList.length>=i.length-1){let a=i[i.length-1],l=this.elem.querySelectorAll(`g#${a}`);if(l.length>=1){let c=l[0];if(c.children.length===0||this.lastContainerIDList.length>=i.length)for(let d of this.objectElems)d.remove(),c.appendChild(d);else i=[]}}else i=[];this.lastContainerIDList=i}if(r&&this.objectElems)if(this.objectElems.length===1)this.objectElems[0].classList.add(...r);else{let n=document.createElementNS(po,"g");n.classList.add(...r);for(let i of this.objectElems)i.remove(),n.appendChild(i);this.elem.appendChild(n)}}}unimplementedMessage(){throw new Error("Not implemenented!")}beginPath(e){this.unimplementedMessage()}endPath(e){this.unimplementedMessage()}lineTo(e){this.unimplementedMessage()}moveTo(e){this.unimplementedMessage()}traceCubicBezierCurve(e,r,n){this.unimplementedMessage()}traceQuadraticBezierCurve(e,r){this.unimplementedMessage()}drawPoints(...e){e.map(r=>{let n=document.createElementNS(po,"circle");n.setAttribute("cx",`${r.x}`),n.setAttribute("cy",`${r.y}`),n.setAttribute("r","15"),this.elem.appendChild(n)})}drawSVGElem(e){if(this.sanitize||e.tagName.toLowerCase()==="style"&&e.getAttribute("id")===Oo)return;let r=e.cloneNode(!0);this.elem.appendChild(r),this.objectElems?.push(r)}isTooSmallToRender(e){return!1}static fromViewport(e,r=!0){let n,i;typeof r=="boolean"?(n=r,i=!1):(n=r.sanitize??!0,i=r.useViewBoxForPositioning??!1);let a="http://www.w3.org/2000/svg",l=document.createElementNS(a,"svg"),c=e.getScreenRectSize(),d=e.visibleRect,u;if(i){let h=e.visibleRect;u=[h.x,h.y,h.w,h.h],e=e.getTemporaryClone(),e.resetTransform(k.identity)}else u=[0,0,c.x,c.y];l.setAttribute("viewBox",u.map(h=>pe(h)).join(" ")),l.setAttribute("width",pe(c.x)),l.setAttribute("height",pe(c.y)),l.setAttribute("version","1.1"),l.setAttribute("baseProfile","full"),l.setAttribute("xmlns",a);let p=new s(l,e,n);return d.eq(e.visibleRect)||p.overrideVisibleRect(d),{element:l,renderer:p}}};var ho=30,mo=class{constructor(o,e,r,n,i,a){this.presentation=o;this.parent=e;this.viewport=r;this.onDragStart=n;this.onDragUpdate=i;this.onDragEnd=a;this.dragLastPos=null;this.element=document.createElement("div"),this.element.classList.add(`${Te}handle`,`${Te}${o.action}`);let l=document.createElement("div");l.classList.add(`${Te}content`),this.element.appendChild(l),this.parentSide=o.side;let c=o.icon;switch(c&&(l.appendChild(c),c.classList.add("icon")),o.action==="rotate"?this.shape=0:this.shape=1,this.shape){case 0:this.element.classList.add(`${Te}circle`);break;case 1:this.element.classList.add(`${Te}square`);break;default:Ki(this.shape)}this.updatePosition()}addTo(o){o.appendChild(this.element)}remove(){this.element.remove()}getBBoxParentCoords(){let o=this.parent.getScreenRegion(),e=w.of(ho,ho),r=o.size.scale(this.parentSide).minus(e.times(1/2));return new I(r.x,r.y,e.x,e.y)}getBBoxCanvasCoords(){let o=this.parent.region,e=w.of(ho,ho).times(1/this.viewport.getScaleFactor()),r=o.size.scale(this.parentSide).minus(e.times(.5));return new I(r.x,r.y,e.x,e.y).translatedBy(o.topLeft)}updatePosition(){let o=this.getBBoxParentCoords();this.element.style.marginLeft=`${o.topLeft.x}px`,this.element.style.marginTop=`${o.topLeft.y}px`,this.element.style.width=`${o.w}px`,this.element.style.height=`${o.h}px`}containsPoint(o){let e=this.getBBoxCanvasCoords(),r=o.minus(e.center),n=e.size.x/2,i;return this.shape===0?i=r.magnitude()<=n:i=Math.abs(r.x)<=n&&Math.abs(r.y)<=n,i}handleDragStart(o){return this.onDragStart(o.canvasPos),this.dragLastPos=o.canvasPos,!0}handleDragUpdate(o){this.dragLastPos&&this.onDragUpdate(o.canvasPos)}handleDragEnd(){if(this.dragLastPos)return this.onDragEnd()}setSnapToGrid(o){this.snapToGrid=o}isSnappingToGrid(){return this.snapToGrid}};var zt=class s extends W{constructor(e){super("duplicate");this.toDuplicate=e;this.duplicates=e.map(r=>r.clone()),this.reverse=new J(this.duplicates)}apply(e){this.reverse.unapply(e)}unapply(e){this.reverse.apply(e)}onDrop(e){this.reverse.onDrop(e)}description(e,r){return this.duplicates.length===0?r.duplicatedNoElements:r.duplicateAction(Or(r,this.duplicates)??r.elements,this.duplicates.length)}serializeToJSON(){return this.toDuplicate.map(e=>e.getId())}static{W.register("duplicate",(e,r)=>{let n=e.map(i=>r.image.lookupElement(i));return new s(n)})}};var Lt=(e=>(e.Lasso="lasso",e.Rectangle="rect",e))(Lt||{});var $r=class{constructor(o,e){this.editor=o;this.selection=e}onDragStart(o){this.selection.setTransform(k.identity),this.dragStartPoint=o}onDragUpdate(o){let e=this.editor.viewport.roundPoint(o.minus(this.dragStartPoint));this.selection.setTransform(k.translation(e))}onDragEnd(){return this.selection.finalizeTransform()}},Ur=class{constructor(o,e){this.editor=o;this.selection=e;this.mode=0}onDragStart(o,e){this.selection.setTransform(k.identity),this.mode=e,this.dragStartPoint=o,this.computeOriginAndScaleRate()}computeOriginAndScaleRate(){let o=this.selection.preTransformRegion,e=o.corners,r=0;for(let a=0;a<e.length;a++){let l=e[a],c=this.dragStartPoint.minus(l).magnitudeSquared();c>r&&(r=c,this.transformOrigin=l)}let n=1,i=1;this.transformOrigin.x>o.center.x&&(n=-1),this.transformOrigin.y>o.center.y&&(i=-1),this.scaleRate=w.of(n,i)}onDragUpdate(o){let e=o.minus(this.dragStartPoint),r=this.selection.preTransformRegion.width,n=this.selection.preTransformRegion.height,i=w.of(1,1);if(this.mode===1){let a=r+e.x*this.scaleRate.x;i=w.of(a/r,i.y)}if(this.mode===2){let a=n+e.y*this.scaleRate.y;i=w.of(i.x,a/n)}if(this.mode===0){let a=Math.abs(e.x)>Math.abs(e.y)?e.x:e.y,l=r+a;i=w.of(l/r,l/r)}if(i=i.map(a=>U.roundScaleRatio(a,2)),i.x!==0&&i.y!==0){let a=this.editor.viewport.roundPoint(this.transformOrigin);this.selection.setTransform(k.scaling2D(i,a))}}onDragEnd(){return this.selection.finalizeTransform()}},Wr=class{constructor(o,e){this.editor=o;this.selection=e;this.startAngle=0;this.targetRotation=0;this.maximumDistFromStart=0}getAngle(o){let e=this.selection.preTransformRegion.center;return o.minus(e).angle()}roundAngle(o){let e=8/Math.PI;return Math.round(o*e)/e}onDragStart(o){this.startPoint=o,this.selection.setTransform(k.identity),this.startAngle=this.getAngle(o),this.targetRotation=0,this.maximumDistFromStart=0,this.startTime=performance.now()}setRotationTo(o){let e=this.editor.viewport.roundPoint(this.selection.preTransformRegion.center),n=k.zRotation(o).mapEntries(a=>U.roundScaleRatio(a)),i=k.translation(e).rightMul(n).rightMul(k.translation(e.times(-1)));this.selection.setTransform(i)}onDragUpdate(o){this.targetRotation=this.roundAngle(this.getAngle(o)-this.startAngle),this.setRotationTo(this.targetRotation);let e=o.minus(this.startPoint).magnitude();e>this.maximumDistFromStart&&(this.maximumDistFromStart=e)}onDragEnd(){return(performance.now()-this.startTime)/1e3<.4&&this.maximumDistFromStart<10&&this.targetRotation===0&&this.setRotationTo(-Math.PI/2),this.selection.finalizeTransform()}};var fi=40,Fo=class{constructor(o,e,r,n,i){this.parent=o;this.viewport=e;this.icon=r;this.localization=i;this.lastDragPointer=null;this.element=document.createElement("div"),this.element.classList.add(`${Te}handle`,`${Te}selection-menu`),this.element.style.setProperty("--vertical-offset",`${fi}px`),this.onClick=()=>{this.button?.focus({preventScroll:!0});let a=this.getBBoxCanvasCoords().center;n(a)},this.initUI(),this.updatePosition()}initUI(){let o=document.createElement("button");this.icon.classList.add("icon"),o.replaceChildren(this.icon),o.ariaLabel=this.localization.selectionMenu__show,o.title=o.ariaLabel,this.button=o,o.onkeydown=e=>{e.key==="Enter"&&(e.preventDefault(),this.onClick())},this.element.appendChild(o),requestAnimationFrame(()=>{this.updatePosition()})}addTo(o){o.appendChild(this.element)}remove(){this.element.remove()}getElementScreenSize(){return w.of(this.element.clientWidth,this.element.clientHeight)}getBBoxParentCoords(){let o=w.of(0,-fi),e=this.getElementScreenSize();return new I(o.x,o.y,e.x,e.y)}getBBoxCanvasCoords(){let o=this.parent.region,e=this.viewport.getSizeOfPixelOnCanvas(),r=this.getElementScreenSize().times(e),n=fi/this.viewport.getScaleFactor(),i=w.of(o.x,o.y-n),a=w.of(48,48).times(e);return new I(i.x,i.y,r.x,r.y).grownToSize(a)}updatePosition(){let o=this.getBBoxParentCoords();this.element.style.marginLeft=`${o.topLeft.x}px`,this.element.style.marginTop=`${o.topLeft.y}px`}containsPoint(o){return this.getBBoxCanvasCoords().containsPoint(o)}handleDragStart(o){return this.lastDragPointer=o,!0}handleDragUpdate(o){this.lastDragPointer=o}handleDragEnd(){this.lastDragPointer&&this.containsPoint(this.lastDragPointer.canvasPos)&&this.onClick(),this.lastDragPointer=null}};var gi=100,vs=500,Ho=class s{constructor(o,e,r){this.editor=e;this.selectionTightBoundingBox=null;this.transform=k.identity;this.selectedElems=[];this.hasParent=!0;this.removedFromImage={};this.activeHandle=null;this.backgroundDragging=!1;this.selectionDuplicatedAnimationTimeout=null;o=[...o],this.selectedElems=o,this.originalRegion=I.empty,this.transformers={drag:new $r(e,this),resize:new Ur(e,this),rotate:new Wr(e,this)},this.outerContainer=document.createElement("div"),this.outerContainer.classList.add(`${Te}selection-outer-container`),this.innerContainer=document.createElement("div"),this.innerContainer.classList.add(`${Te}selection-inner-container`),this.backgroundElem=document.createElement("div"),this.backgroundElem.classList.add(`${Te}selection-background`),this.innerContainer.appendChild(this.backgroundElem),this.outerContainer.appendChild(this.innerContainer);let n=(u,p)=>{let h={0:"resize-xy",1:"resize-x",2:"resize-y"};return new mo({action:h[u],side:p},this,this.editor.viewport,m=>this.transformers.resize.onDragStart(m,u),m=>this.transformers.resize.onDragUpdate(m),()=>this.transformers.resize.onDragEnd())},i=[n(1,w.of(0,.5)),n(1,w.of(1,.5))],a=n(2,w.of(.5,1)),l=n(0,w.of(1,1)),c=new mo({action:"rotate",side:w.of(.5,0),icon:this.editor.icons.makeRotateIcon()},this,this.editor.viewport,u=>this.transformers.rotate.onDragStart(u),u=>this.transformers.rotate.onDragUpdate(u),()=>this.transformers.rotate.onDragEnd()),d=new Fo(this,this.editor.viewport,this.editor.icons.makeOverflowIcon(),r,this.editor.localization);this.childwidgets=[d,l,...i,a,c];for(let u of this.childwidgets)u.addTo(this.backgroundElem);this.recomputeRegion(),this.updateUI()}getBackgroundElem(){return this.backgroundElem}getTransform(){return this.transform}get preTransformRegion(){return this.originalRegion}get region(){let o=k.zRotation(this.regionRotation,this.originalRegion.center),e=this.transform.rightMul(o.inverse());return this.originalRegion.transformedBoundingBox(e)}computeTightBoundingBox(){return this.selectedElems.reduce((e,r)=>(e??r.getBBox()).union(r.getBBox()),null)??I.empty}get regionRotation(){return this.transform.transformVec3(w.unitX).angle()}get preTransformedScreenRegion(){let o=e=>this.editor.viewport.canvasToScreen(e);return I.fromCorners(o(this.preTransformRegion.topLeft),o(this.preTransformRegion.bottomRight))}get preTransformedScreenRegionRotation(){return this.editor.viewport.getRotationAngle()}getScreenRegion(){let o=this.editor.viewport.canvasToScreenTransform,e=this.editor.viewport.getScaleFactor(),r=o.transformVec2(this.region.center);return new I(r.x,r.y,e*this.region.width,e*this.region.height).translatedBy(this.region.size.times(-e/2))}get screenRegionRotation(){return this.regionRotation+this.editor.viewport.getRotationAngle()}setTransform(o,e=!0){this.transform=o,e&&this.hasParent&&this.previewTransformCmds()}getDeltaZIndexToMoveSelectionToTop(){if(this.selectedElems.length===0)return 0;let o=this.selectedElems[0].getZIndex(),e=this.editor.image.getElementsIntersectingRegion(this.region);return(e[e.length-1]?.getZIndex()??o)+1-o}finalizeTransform(){let o=this.transform,e=this.selectedElems;this.originalRegion=this.originalRegion.transformedBoundingBox(this.transform),this.transform=k.identity,this.scrollTo();let r;if(this.selectedElems.length>0){let n=this.getDeltaZIndexToMoveSelectionToTop();r=this.editor.dispatch(new s.ApplyTransformationCommand(this,e,o,n))}return r}sendToBack(){let e=this.editor.image.getElementsIntersectingRegion(this.editor.viewport.visibleRect)[0]?.getZIndex()??0,r=this.selectedElems[this.selectedElems.length-1]?.getZIndex()??0,i=e-1-r;if(i!==0){let a=this.selectedElems.map(l=>l.setZIndex(l.getZIndex()+i));return le(a,gi)}return null}static{W.register("selection-tool-transform",(o,e)=>{let r=new k(...o.transform),n=o.elems??[],i=parseInt(o.deltaZIndex??0);return new this.ApplyTransformationCommand(null,n,r,i)})}static{this.ApplyTransformationCommand=class extends W{constructor(e,r,n,i){super("selection-tool-transform");this.selection=e;this.fullTransform=n;this.deltaZIndex=i;(l=>typeof l[0]=="string")(r)?this.selectedElemIds=r:(this.selectedElemIds=r.map(l=>l.getId()),this.transformCommands=r.map(l=>l.setZIndexAndTransformBy(this.fullTransform,l.getZIndex()+i)))}resolveToElems(e,r){this.transformCommands||(this.transformCommands=this.selectedElemIds.map(n=>{let i=e.image.lookupElement(n);if(!i)return console.warn(`Unable to find element with ID, ${n}.`),null;let a=i.getZIndex(),l=i.getZIndex()+this.deltaZIndex;return r&&(l=i.getZIndex(),a=i.getZIndex()-this.deltaZIndex),i.setZIndexAndTransformBy(this.fullTransform,l,a)}).filter(n=>n!==null))}async apply(e){this.resolveToElems(e,!1),this.selection?.setTransform(this.fullTransform,!1),this.selection?.updateUI(),await e.asyncApplyCommands(this.transformCommands,gi),this.selection?.setTransform(k.identity,!1),this.selection?.recomputeRegion(),this.selection?.updateUI()}async unapply(e){this.resolveToElems(e,!0),this.selection?.setTransform(this.fullTransform.inverse(),!1),this.selection?.updateUI(),await e.asyncUnapplyCommands(this.transformCommands,gi,!0),this.selection?.setTransform(k.identity,!1),this.selection?.recomputeRegion(),this.selection?.updateUI()}serializeToJSON(){return{elems:this.selectedElemIds,transform:this.fullTransform.toArray(),deltaZIndex:this.deltaZIndex}}description(e,r){return r.transformedElements(this.selectedElemIds.length)}}}previewTransformCmds(){if(this.selectedElems.length===0)return;if(this.selectedElems.length>vs){this.updateUI();return}let o=this.editor.display.getWetInkRenderer();o.clear(),o.pushTransform(this.transform);let r=this.editor.viewport.visibleRect.union(this.region).transformedBoundingBox(this.transform.inverse());for(let n of this.selectedElems)n.render(o,r);o.popTransform(),this.updateUI()}recomputeRegion(){let o=this.computeTightBoundingBox();return this.selectionTightBoundingBox=o,o?(this.originalRegion=o,this.padRegion(),!0):(this.cancelSelection(),!1)}padRegion(){let o=this.selectionTightBoundingBox??this.originalRegion,e=this.getMinCanvasSize();if(o.w<e||o.h<e){let r=e/2;this.originalRegion=I.bboxOf(o.corners,r),this.updateUI()}}getMinCanvasSize(){return ho/this.editor.viewport.getScaleFactor()*2}getSelectedItemCount(){return this.selectedElems.length}updateUI(){if(!this.hasParent)return;let o=this.getScreenRegion();this.backgroundElem.style.marginLeft=`${o.topLeft.x}px`,this.backgroundElem.style.marginTop=`${o.topLeft.y}px`,this.backgroundElem.style.width=`${o.width}px`,this.backgroundElem.style.height=`${o.height}px`;let e=this.screenRegionRotation*180/Math.PI;this.backgroundElem.style.transform=`rotate(${e}deg)`,this.backgroundElem.style.transformOrigin="center";let r=`${Te}rotated-near-perpendicular`;Math.abs(Math.sin(this.screenRegionRotation))>.5?this.innerContainer.classList.add(r):this.innerContainer.classList.remove(r),o.width===0&&o.height===0?this.innerContainer.classList.add("-empty"):this.innerContainer.classList.remove("-empty");for(let n of this.childwidgets)n.updatePosition(this.getScreenRegion())}addRemoveSelectionFromImage(o){if(!(!o&&this.selectedElems.length>vs)){for(let e of this.selectedElems){let r=this.editor.image.findParent(e);!o&&r?(this.removedFromImage[e.getId()]=!0,r.remove()):!r&&this.removedFromImage[e.getId()]&&(q.addElement(e).apply(this.editor),this.removedFromImage[e.getId()]=!1,delete this.removedFromImage[e.getId()])}this.editor.queueRerender().then(()=>{o?this.editor.display.getWetInkRenderer().clear():this.previewTransformCmds()})}}removeDeletedElemsFromSelection(){this.selectedElems=this.selectedElems.filter(o=>{let e=!!this.editor.image.findParent(o),r=this.removedFromImage[o.getId()];return e||r})}onDragStart(o){if(this.selectedElems.length===0)return!1;document.getSelection()?.removeAllRanges(),this.activeHandle=null;let e=!1;this.backgroundDragging=!1,this.region.containsPoint(o.canvasPos)&&(this.backgroundDragging=!0,e=!0);for(let r of this.childwidgets)r.containsPoint(o.canvasPos)&&(this.activeHandle=r,this.backgroundDragging=!1,e=!0);return e&&(this.removeDeletedElemsFromSelection(),this.addRemoveSelectionFromImage(!1)),this.activeHandle&&this.activeHandle.handleDragStart(o),this.backgroundDragging&&this.transformers.drag.onDragStart(o.canvasPos),e}onDragUpdate(o){this.backgroundDragging&&this.transformers.drag.onDragUpdate(o.canvasPos),this.activeHandle&&this.activeHandle.handleDragUpdate(o)}onDragEnd(){this.backgroundDragging?this.transformers.drag.onDragEnd():this.activeHandle&&this.activeHandle.handleDragEnd(),this.addRemoveSelectionFromImage(!0),this.backgroundDragging=!1,this.activeHandle=null,this.updateUI()}onDragCancel(){this.backgroundDragging=!1,this.activeHandle=null,this.setTransform(k.identity),this.addRemoveSelectionFromImage(!0),this.updateUI()}scrollTo(){if(this.selectedElems.length===0)return!1;let o=this.editor.viewport.getScreenRectSize(),e=new I(0,0,o.x,o.y),r=this.getScreenRegion();if(!e.containsPoint(r.center)){let n=r.center,i=e.getClosestPointOnBoundaryTo(n),a=this.editor.viewport.screenToCanvas(i),l=this.region.center,c=a.minus(l);return this.editor.dispatchNoAnnounce(U.transformBy(k.translation(c.times(.5))),!1),this.editor.queueRerender().then(()=>{this.previewTransformCmds()}),!0}return!1}deleteSelectedObjects(){return(this.backgroundDragging||this.activeHandle)&&this.onDragEnd(),new J(this.selectedElems)}runSelectionDuplicatedAnimation(){this.selectionDuplicatedAnimationTimeout&&clearTimeout(this.selectionDuplicatedAnimationTimeout);let o=400;this.backgroundElem.style.animation=`${o}ms ease selection-duplicated-animation`,this.selectionDuplicatedAnimationTimeout=setTimeout(()=>{this.backgroundElem.style.animation="",this.selectionDuplicatedAnimationTimeout=null},o)}async duplicateSelectedObjects(){let o=this.backgroundDragging||this.activeHandle,e=null;o||this.runSelectionDuplicatedAnimation();let r;if(o){let i=this.getDeltaZIndexToMoveSelectionToTop();e=new s.ApplyTransformationCommand(null,this.selectedElems,this.transform,i),await e.apply(this.editor),this.addRemoveSelectionFromImage(!0),r=le(this.selectedElems.map(a=>q.addElement(a.clone()))),await e?.unapply(this.editor),this.addRemoveSelectionFromImage(!1),this.previewTransformCmds(),this.updateUI()}else r=new zt(this.selectedElems);return r}snapSelectedObjectsToGrid(){let o=this.editor.viewport,e=this.computeTightBoundingBox().topLeft,n=o.snapToGrid(e).minus(e),i=this.getTransform();this.setTransform(i.rightMul(k.translation(n))),this.finalizeTransform()}setHandlesVisible(o){o?this.innerContainer.classList.remove("-hide-handles"):this.innerContainer.classList.add("-hide-handles")}addTo(o){this.outerContainer.parentElement&&this.outerContainer.remove(),o.appendChild(this.outerContainer),this.hasParent=!0}setToPoint(o){this.originalRegion=this.originalRegion.grownToPoint(o),this.selectionTightBoundingBox=null,this.updateUI()}cancelSelection(){this.outerContainer.parentElement&&this.outerContainer.remove(),this.originalRegion=I.empty,this.selectionTightBoundingBox=null,this.hasParent=!1}getSelectedObjects(){return[...this.selectedElems]}};var No=class{constructor(o,e){this.viewport=o;this.scrollByCanvasDelta=e;this.started=!1;this.updateLoopId=0;this.updateLoopRunning=!1;this.targetPoint=null;this.scrollRate=1e3}getScrollForPoint(o){let e=this.viewport.getScreenRectSize(),r=new I(0,0,e.x,e.y),n=44,i=r.grownBy(-n);if(i.containsPoint(o))return w.zero;let a=i.getClosestPointOnBoundaryTo(o),l=a.distanceTo(o),c=a.minus(o),u=Math.min(l/n,1.25);return c.normalizedOrZero().times(u)}start(){this.started=!0}onPointerMove(o){this.started&&(this.getScrollForPoint(o)===w.zero?this.stopUpdateLoop():(this.targetPoint=o,this.startUpdateLoop()))}stop(){this.targetPoint=null,this.started=!1,this.stopUpdateLoop()}startUpdateLoop(){this.updateLoopRunning||(async()=>{this.updateLoopId++;let o=this.updateLoopId,e=performance.now();for(;this.updateLoopId===o&&this.targetPoint;){this.updateLoopRunning=!0;let r=performance.now(),n=r-e,a=this.getScrollForPoint(this.targetPoint).times(this.scrollRate*n/1e3);this.scrollByCanvasDelta(this.viewport.screenToCanvasTransform.transformVec3(a)),e=r,await Ye()}this.updateLoopRunning=!1})()}stopUpdateLoop(){this.updateLoopId++}};var ja=s=>new Promise(o=>{setTimeout(()=>o(),s)}),Kr=ja;var _a=0,qa=async(s,o,e)=>{let r=document.createElement("div"),{remove:n}=s.createHTMLOverlay(r),i=document.createElement("dialog");i.classList.add("editor-popup-menu");let a=240;i.style.setProperty("--hide-menu-animation-timeout",`${a}ms`);let l=()=>{let p=s.getOutputBBoxInDOM(),h=s.viewport.canvasToScreen(o).plus(p.topLeft);i.style.setProperty("--anchor-x",`${h.x}px`),i.style.setProperty("--anchor-y",`${h.y}px`)};l();let c=s.notifier.on(7,l);r.appendChild(i);let d=!1,u=async()=>{d||(d=!0,c.remove(),i.classList.add("-hide"),await Kr(a),i.close())};return new Promise(p=>{let h=!1,m=null,g=()=>{h||(p(m),h=!0)};i.onclose=()=>{n(),g()};let v=f=>{m=f,u(),g()};s.handlePointerEventsExceptClicksFrom(i,(f,T)=>T.target===i&&f==="pointerdown"?(u(),!0):!!d,(f,T)=>T.target===i);let b=document.createElement("div");b.classList.add("content"),b.role="menu";let y=[];b.addEventListener("keydown",f=>{let T=y.findIndex(S=>S===document.activeElement);if(T===-1)return;let P=T;f.key==="ArrowDown"?P++:f.key==="ArrowUp"?P--:f.key==="End"?P=y.length-1:f.key==="Home"&&(P=0),P<0&&(P+=y.length),P%=y.length,P!==T&&(f.preventDefault(),y[P].focus())});for(let f of e){let T=document.createElement("button");T.id=`menu-overlay-option-${_a++}`,T.role="menuitem",T.classList.add("option","editor-popup-menu-option"),T.replaceChildren(f.icon(),document.createTextNode(f.text)),T.onclick=P=>{P.defaultPrevented||v(f.key)},b.appendChild(T),y.length===0&&(T.autofocus=!0),y.push(T)}i.appendChild(b),i.showModal(),b.scrollIntoView({block:"nearest"})})},ys=qa;var Za=async(s,o={})=>{try{let e=new FileReader;return await new Promise((r,n)=>{e.onload=()=>r(e.result),e.onerror=n,e.onabort=n,e.onprogress=i=>{o.onprogress?.(i)},e.readAsDataURL(s)})}catch(e){(o.onWarning??console.warn)("Unable to convert file to base64 with a FileReader: ",e);let r=await s.arrayBuffer(),n=new Uint8Array(r),i=30,a=[];for(let l=0;l<n.length;l+=i){let c=String.fromCharCode(...n.slice(l,l+i));a.push(btoa(c))}return`data:${s.type??"image/*"};base64,${a.join("")}`}},Gr=Za;var xs=s=>s.endsWith("+xml")||s.startsWith("text/"),Ae=class{constructor(o,e){this.editor=o;this.callbacks=e}#e=!1;paste(o){let e=r=>{if(this.callbacks?.onPasteError)return this.callbacks.onPasteError(r),Promise.resolve(!1);throw r};try{return this.pasteInternal(o).catch(e)}catch(r){return e(r)}}async pasteInternal(o){let e=this.editor,r=o?.dataTransfer??o?.clipboardData??null,n=!!r,i=(p,h)=>h&&e.toolController.dispatchInputEvent({kind:8,mime:p,data:h}),a=["image/svg+xml","text/html","image/png","image/jpeg","text/plain"],l=[],c=new Map,d=e.getCurrentSettings();if(n){l=[...r.files];for(let p of a){let h=r.getData(p);h&&c.set(p,h)}}else if(d.clipboardApi){let p=await d.clipboardApi.read();for(let[h,m]of p.entries())if(typeof m=="string")c.set(h,m);else{let g=m;g.type!==h&&(g=new Blob([g],{type:h})),l.push(g)}}else{let p=await navigator.clipboard.read();for(let h of p)for(let m of h.types)a.includes(m)&&l.push(await h.getType(m))}let u=async p=>{let h=xs(p);if(h){let m=c.get(p);if(i(p,m))return o?.preventDefault(),!0}for(let m of l)if(m?.type?.toLowerCase()===p)if(h){let v=await m.text();if(i(p,v))return o?.preventDefault(),!0}else{e.showLoadingWarning(0);let v=b=>{e.showLoadingWarning(b.loaded/b.total)};try{let b=await Gr(m,{onprogress:v});if(i(p,b))return o?.preventDefault(),e.hideLoadingWarning(),!0}catch(b){console.error("Error reading image:",b)}e.hideLoadingWarning()}return!1};for(let p of a)if(await u(p))return!0;return!1}copy(o){let e=r=>{if(this.callbacks?.onCopyError)return this.callbacks.onCopyError(r),Promise.resolve();throw r};try{return this.copyInternal(o).catch(e)}catch(r){return e(r)}}copyInternal(o){let e=new Map;this.editor.toolController.dispatchInputEvent({kind:7,setData:(u,p)=>{e.set(u,p)}})&&o?.preventDefault();let n=[...e.keys()].some(u=>!xs(u)),i=u=>{if(!o)throw new Error(`Unable to copy -- no event provided${u?`. Original error: ${u}`:""}`);for(let[p,h]of e.entries())typeof h=="string"&&("clipboardData"in o?o.clipboardData?.setData(p,h):o.dataTransfer?.setData(p,h))},a=()=>{let h=(m=>{let g=Object.create(null);for(let[v,b]of Object.entries(m))"supports"in ClipboardItem&&typeof ClipboardItem.supports=="function"&&!ClipboardItem.supports(v)||(g[v]=b);return g})((m=>{let g=Object.create(null);for(let[v,b]of m.entries()){if(typeof b=="string"){let y=new Blob([new TextEncoder().encode(b)],{type:v});g[v]=y}else g[v]=b;v==="image/svg+xml"&&(g["text/html"]??=g[v])}return g})(e));return navigator.clipboard.write([new ClipboardItem(h)])},l=typeof ClipboardItem<"u"&&typeof navigator?.clipboard?.write<"u",c=!this.#e&&l&&(n||!o),d=this.editor.getCurrentSettings();if(c&&d.clipboardApi)return d.clipboardApi.write(e)??Promise.resolve();if(c){let u=null,p=h=>{console.warn("Unable to copy to the clipboard API. Future calls to .copy will use ClipboardEvents if possible.",h),this.#e=!0,i(h)};try{u=a()}catch(h){p(h)}if(u)return u.catch(p)}else i();return Promise.resolve()}};var Ya=(s,o)=>{let e=document.createElement("div"),{remove:r}=s.createHTMLOverlay(e);e.classList.add("dialog-container","message-dialog-container",...o.classNames??[]);let n=document.createElement("dialog"),i=document.createElement("div");i.classList.add("message-dialog-content",...o.contentClassNames??[]);let a=document.createElement("h1");a.textContent=o.title,a.setAttribute("autofocus","true");let l=document.createElement("button");l.innerText=s.localization.closeDialog,l.classList.add("close");let c=document.createElement("div");c.classList.add("scroll"),c.onwheel=h=>h.stopPropagation(),i.replaceChildren(a,c,l),n.replaceChildren(i),e.replaceChildren(n);let d=300;n.style.setProperty("--close-delay",`${d}ms`);let u=async()=>{n.classList.add("-closing"),await Kr(d),n.close()};return(()=>{n.addEventListener("pointerdown",h=>{h.target===n&&u()}),n.onclose=()=>{r()},l.onclick=()=>u()})(),n.showModal(),{close:()=>u(),appendChild:h=>{c.appendChild(h)}}},jr=Ya;var Xa=s=>{let o=e=>{let r=jr(s,{title:s.localization.copyPasteError__heading,classNames:["clipboard-error-dialog"]});r.appendChild(document.createTextNode(s.localization.copyPasteError__description));let n=document.createElement("details"),i=document.createElement("summary");return i.textContent=s.localization.copyPasteError__errorDetails,n.appendChild(i),n.appendChild(document.createTextNode(`Error: ${e}`)),r.appendChild(n),r};return{onCopyError(e){let r=o(e),n=document.createElement("label");n.textContent=s.localization.copyPasteError__copyRetry;let i=document.createElement("textarea");n.appendChild(i);let a=new Ae(s),l=c=>(c.preventDefault(),a.copy(c).then(()=>{r.close()}));i.oncopy=l,i.ondragstart=l,i.value=s.localization.copyPasteError__copyMe,r.appendChild(n),i.select(),document.execCommand("copy")},onPasteError(e){let r=o(e),n=document.createElement("label");n.textContent=s.localization.copyPasteError__pasteRetry;let i=document.createElement("textarea");n.appendChild(i);let a=new Ae(s),l=c=>(c.preventDefault(),a.paste(c).then(d=>{d&&r.close()}));i.onpaste=l,i.ondrop=l,r.appendChild(n),i.focus(),document.execCommand("paste")}}},bi=Xa;var Qa=async(s,o,e,r,n)=>{let i=o.localization,a=s?.getSelectedItemCount()&&r,l=[{text:i.selectionMenu__paste,icon:()=>o.icons.makePasteIcon(),key:()=>{new Ae(o,bi(o)).paste()}}];(await ys(o,e,a?[{text:i.selectionMenu__duplicate,icon:()=>o.icons.makeDuplicateSelectionIcon(),key:async()=>{await o.dispatch(await s.duplicateSelectedObjects())}},{text:i.selectionMenu__delete,icon:()=>o.icons.makeDeleteSelectionIcon(),key:async()=>{await o.dispatch(s.deleteSelectedObjects()),n()}},{text:i.selectionMenu__copyToClipboard,icon:()=>o.icons.makeCopyIcon(),key:()=>{new Ae(o,bi(o)).copy()}},...l]:l))?.()},ws=Qa;var It=class{render(o,e){o.drawPath(Z(this.previewPath(),{fill:e}))}resolve(o,e){let r=this.previewPath(),n=c=>c.filter(d=>d.isSelectable()),i,a=e.getSizeOfPixelOnCanvas()*3;if(r.bbox.maxDimension<=a){let c=e.visibleRect.maxDimension/200,d=r.bbox.grownBy(c);i=o.getElementsIntersectingRegion(d).filter(u=>d.containsRect(u.getBBox())||u.intersectsRect(d)),i=n(i),i.length>1&&(i=[i[0]])}else i=n(this.resolveInternal(o));return i}};var $o=class extends It{constructor(e,r){super();this.viewport=r;this.boundaryPoints=[];this.boundaryPoints.push(e),this.lastPoint=e}onPointerMove(e){let r=this.boundaryPoints[this.boundaryPoints.length-1],n=this.viewport.getSizeOfPixelOnCanvas()*8;r.distanceTo(e)>=n&&this.boundaryPoints.push(e),this.lastPoint=e}previewPath(){let e=this.boundaryPoints.map(r=>({kind:0,point:r}));return e.push({kind:0,point:this.lastPoint}),new $(this.boundaryPoints[0],e).asClosed()}resolveInternal(e){let r=this.previewPath(),n=r.polylineApproximation(),i=e.getElementsIntersectingRegion(r.bbox),a=l=>{if(r.closedContainsRect(l.getExactBBox()))return!0;let c=!1;for(let d of l.keyPoints())if(r.closedContainsPoint(d)){c=!0;break}if(!c)return!1;for(let d of n)if(l.intersects(d))return!1;return!0};return i.filter(a)}};var Uo=class extends It{constructor(o){super(),this.rect=I.fromCorners(o,o)}onPointerMove(o){this.rect=this.rect.grownToPoint(o)}previewPath(){return $.fromRect(this.rect)}resolveInternal(o){return o.getElementsIntersectingRegion(this.rect).filter(e=>e.intersectsRect(this.rect))}};var Te="selection-tool-";var ve=class extends K{constructor(e,r){super(e.notifier,r);this.editor=e;this.removeSelectionScheduled=!1;this.startPoint=null;this.expandingSelectionBox=!1;this.shiftKeyPressed=!1;this.snapToGrid=!1;this.lastPointer=null;this.showContextMenu=async(e,r=!0)=>{await ws(this.selectionBox,this.editor,e,r,()=>this.clearSelection())};this.selectionBoxHandlingEvt=!1;this.lastSelectedObjects=[];this.hasUnfinalizedTransformFromKeyPress=!1;this.modeValue=te.fromInitialValue("rect"),this.modeValue.onUpdate(()=>{this.editor.notifier.dispatch(2,{kind:2,tool:this})}),this.autoscroller=new No(e.viewport,n=>{if(e.dispatch(U.transformBy(k.translation(n)),!1),this.lastPointer){let i=this.lastPointer.withScreenPosition(this.lastPointer.screenPos,e.viewport);this.onMainPointerUpdated(i)}}),this.handleOverlay=document.createElement("div"),e.createHTMLOverlay(this.handleOverlay),this.handleOverlay.style.display="none",this.handleOverlay.classList.add("handleOverlay"),e.notifier.on(7,n=>{this.editor.clearWetInk(),this.expandingSelectionBox||this.selectionBox?.padRegion(),this.selectionBox?.updateUI()}),this.editor.handleKeyEventsFrom(this.handleOverlay),this.editor.handlePointerEventsFrom(this.handleOverlay)}getSelectionColor(){let e=getComputedStyle(this.handleOverlay).getPropertyValue("--selection-background-color");return L.fromString(e).withAlpha(.5)}makeSelectionBox(e){this.prevSelectionBox=this.selectionBox,this.selectionBox=new Ho(e,this.editor,this.showContextMenu),this.expandingSelectionBox||this.prevSelectionBox?.cancelSelection(),this.selectionBox.addTo(this.handleOverlay)}onContextMenu(e){let r=this.selectionBox?.getScreenRegion()?.containsPoint(e.screenPos);return this.showContextMenu(e.canvasPos,r),!0}onPointerDown({allPointers:e,current:r}){let n=this.snapToGrid;if(n&&(r=r.snappedToGrid(this.editor.viewport)),e.length===1){this.startPoint=r.canvasPos;let i=!1;return this.selectionBox&&(n&&this.selectionBox.snapSelectedObjectsToGrid(),this.selectionBox.onDragStart(r)&&(i=!0,this.selectionBoxHandlingEvt=!0,this.expandingSelectionBox=!1)),i?this.autoscroller.start():(this.expandingSelectionBox=this.shiftKeyPressed,this.removeSelectionScheduled=!this.expandingSelectionBox,this.modeValue.get()==="lasso"?this.selectionBuilder=new $o(r.canvasPos,this.editor.viewport):this.selectionBuilder=new Uo(r.canvasPos)),!0}return!1}onPointerMove(e){this.onMainPointerUpdated(e.current)}onMainPointerUpdated(e){if(this.lastPointer=e,this.removeSelectionScheduled&&(this.removeSelectionScheduled=!1,this.handleOverlay.replaceChildren(),this.prevSelectionBox=this.selectionBox,this.selectionBox=null),this.autoscroller.onPointerMove(e.screenPos),!this.expandingSelectionBox&&this.shiftKeyPressed&&this.startPoint){let r=this.editor.viewport.canvasToScreen(this.startPoint);e=e.lockedToXYAxesScreen(r,this.editor.viewport)}this.snapToGrid&&(e=e.snappedToGrid(this.editor.viewport)),this.selectionBoxHandlingEvt?this.selectionBox?.onDragUpdate(e):(this.selectionBuilder?.onPointerMove(e.canvasPos),this.editor.clearWetInk(),this.selectionBuilder?.render(this.editor.display.getWetInkRenderer(),this.getSelectionColor()))}onPointerUp(e){if(this.onMainPointerUpdated(e.current),this.autoscroller.stop(),this.selectionBoxHandlingEvt)this.selectionBox?.onDragEnd();else if(this.selectionBuilder){let r=this.selectionBuilder.resolve(this.editor.image,this.editor.viewport);this.selectionBuilder=null,this.editor.clearWetInk(),this.expandingSelectionBox&&this.selectionBox?this.setSelection([...this.selectionBox.getSelectedObjects(),...r]):this.setSelection(r)}this.expandingSelectionBox=!1,this.removeSelectionScheduled=!1,this.selectionBoxHandlingEvt=!1,this.lastPointer=null}onGestureCancel(){this.selectionBuilder&&(this.selectionBuilder=null,this.editor.clearWetInk()),this.autoscroller.stop(),this.selectionBoxHandlingEvt?this.selectionBox?.onDragCancel():this.removeSelectionScheduled||(this.selectionBox?.cancelSelection(),this.selectionBox=this.prevSelectionBox,this.selectionBox?.addTo(this.handleOverlay),this.selectionBox?.recomputeRegion(),this.prevSelectionBox=null),this.removeSelectionScheduled=!1,this.expandingSelectionBox=!1,this.lastPointer=null,this.selectionBoxHandlingEvt=!1}onSelectionUpdated(){let e=this.selectionBox?.getSelectedItemCount()??0,r=this.selectionBox?.getSelectedObjects()??[];(this.lastSelectedObjects.length!==e||r.some((i,a)=>this.lastSelectedObjects[a]!==i))&&(this.lastSelectedObjects=r,this.editor.notifier.dispatch(2,{kind:2,tool:this}),this.editor.notifier.dispatch(9,{kind:9,selectedComponents:r,tool:this}),e>0&&(this.editor.announceForAccessibility(this.editor.localization.selectedElements(e)),this.zoomToSelection())),e===0&&this.selectionBox&&(this.selectionBox.cancelSelection(),this.prevSelectionBox=this.selectionBox,this.selectionBox=null)}zoomToSelection(){if(this.selectionBox){let e=this.selectionBox.region;this.editor.dispatchNoAnnounce(this.editor.viewport.zoomTo(e,!1),!1)}}onKeyPress(e){let r=this.editor.shortcuts;if(r.matchesShortcut(io,e))return this.snapToGrid=!0,!0;if(this.selectionBox&&(r.matchesShortcut(Pr,e)||r.matchesShortcut(Er,e)))return!0;if(r.matchesShortcut(no,e))return this.setSelection(this.editor.image.getAllElements()),!0;if(e.ctrlKey)return!1;if((e.shiftKey||e.key==="Shift")&&(this.shiftKeyPressed=!0,e.key==="Shift"))return!0;let n=0,i=0,a=0,l=0,c=0;r.matchesShortcut(Bn,e)?i-=1:r.matchesShortcut(Mn,e)?i+=1:r.matchesShortcut(Dn,e)?a-=1:r.matchesShortcut(An,e)?a+=1:r.matchesShortcut(On,e)?n+=1:r.matchesShortcut(Vn,e)?n-=1:r.matchesShortcut(Fn,e)?l-=1:r.matchesShortcut(Hn,e)?l+=1:r.matchesShortcut(Nn,e)?c-=1:r.matchesShortcut($n,e)?c+=1:r.matchesShortcut(Un,e)?(l-=1,c-=1):r.matchesShortcut(Wn,e)&&(l+=1,c+=1);let d=i!==0||a!==0||n!==0||l!==0||c!==0;if(!this.selectionBox)d=!1;else if(d){let u=10*this.editor.viewport.getSizeOfPixelOnCanvas(),p=Math.PI/8,h=5/4,m=this.selectionBox.region,g=w.of(h**l,h**c),b=k.zRotation(n*p).mapEntries(P=>U.roundScaleRatio(P)),y=this.editor.viewport.roundPoint(m.center),f=k.scaling2D(g,this.editor.viewport.roundPoint(m.topLeft)).rightMul(k.translation(y).rightMul(b).rightMul(k.translation(y.times(-1)))).rightMul(k.translation(this.editor.viewport.roundPoint(w.of(i,a).times(u)))),T=this.selectionBox.getTransform();this.selectionBox.setTransform(T.rightMul(f)),this.selectionBox.scrollTo(),this.hasUnfinalizedTransformFromKeyPress=!0}return this.selectionBox&&!d&&(e.key==="Delete"||e.key==="Backspace")&&(this.editor.dispatch(this.selectionBox.deleteSelectedObjects()),this.clearSelection(),d=!0),d}onKeyUp(e){let r=this.editor.shortcuts;if(r.matchesShortcut(io,e))return this.snapToGrid=!1,!0;if(r.matchesShortcut(no,e))return!0;if(this.selectionBox&&r.matchesShortcut(Pr,e))return this.selectionBox.duplicateSelectedObjects().then(n=>{this.editor.dispatch(n)}),!0;if(this.selectionBox&&r.matchesShortcut(Er,e)){let n=this.selectionBox.sendToBack();return n&&this.editor.dispatch(n),!0}return e.shiftKey===!1&&(this.shiftKeyPressed=!1),e.key==="Shift"?(this.shiftKeyPressed=!1,!0):this.hasUnfinalizedTransformFromKeyPress?this.selectionBox?(this.selectionBox.finalizeTransform(),this.hasUnfinalizedTransformFromKeyPress=!1,!0):!1:!0}onCopy(e){if(!this.selectionBox)return!1;let r=this.selectionBox.getSelectedObjects(),n=this.selectionBox.region;if(r.length===0)return!1;let i=new U(()=>{}),l=this.selectionBox.getScreenRegion().size.times(this.editor.display.getDevicePixelRatio()).maximumEntryMagnitude()/(n.size.maximumEntryMagnitude()||1);l=Math.pow(2,Math.ceil(Math.log2(l))),i.updateScreenSize(n.size.times(l)),i.resetTransform(k.scaling2D(l).rightMul(k.translation(n.topLeft.times(-1))));let{element:c,renderer:d}=me.fromViewport(i,{sanitize:!0,useViewBoxForPositioning:!0}),{element:u,renderer:p}=Le.fromViewport(i,{maxCanvasDimen:4096}),h=[];for(let m of r)m.render(d),m.render(p),m instanceof ne&&h.push(m.getText());return e.setData("image/svg+xml",c.outerHTML),e.setData("text/html",c.outerHTML),e.setData("image/png",new Promise((m,g)=>{u.toBlob(v=>{v?m(v):g(new Error("Failed to convert canvas to blob."))},"image/png")})),h.length>0&&e.setData("text/plain",h.join(`
48
+ `)),!0}setEnabled(e){let r=this.isEnabled();super.setEnabled(e),r!==e&&(this.selectionBox?.cancelSelection(),this.onSelectionUpdated(),this.handleOverlay.replaceChildren(),this.selectionBox=null,this.shiftKeyPressed=!1,this.snapToGrid=!1,this.handleOverlay.style.display=e?"block":"none",e?(this.handleOverlay.tabIndex=0,this.handleOverlay.setAttribute("aria-label",this.editor.localization.selectionToolKeyboardShortcuts)):this.handleOverlay.tabIndex=-1)}getSelection(){return this.selectionBox}isSelecting(){return!!this.selectionBuilder}getSelectedObjects(){return this.selectionBox?.getSelectedObjects()??[]}setSelection(e){e=e.filter(n=>n.isSelectable()),e.sort((n,i)=>n.getZIndex()-i.getZIndex()),e=e.filter((n,i)=>i>0?n!==e[i-1]:!0);let r=null;for(let n of e)r?r=r.union(n.getBBox()):r=n.getBBox();this.clearSelectionNoUpdateEvent(),r&&this.makeSelectionBox(e),this.onSelectionUpdated()}clearSelectionNoUpdateEvent(){this.handleOverlay.replaceChildren(),this.prevSelectionBox=this.selectionBox,this.selectionBox=null}clearSelection(){this.clearSelectionNoUpdateEvent(),this.onSelectionUpdated()}};var Bt=class extends K{constructor(e){super(e.notifier,e.localization.undoRedoTool);this.editor=e}onKeyPress(e){return this.editor.shortcuts.matchesShortcut(Bo,e)?(this.editor.history.undo(),!0):this.editor.shortcuts.matchesShortcut(Kn,e)?(this.editor.history.redo(),!0):!1}};var Cs="textEditorOverlay",$e=class extends K{constructor(e,r,n){super(e.notifier,r);this.editor=e;this.localizationTable=n;this.textInputElem=null;this.textMeasuringCtx=null;this.removeExistingCommand=null;let i=e.getCurrentSettings().text?.fonts??[];this.textStyleValue=j.fromInitialValue({size:32,fontFamily:i.length>0?i[0]:"sans-serif",renderingStyle:{fill:L.purple}}),this.textStyleValue.onUpdateAndNow(()=>{this.textStyle=this.textStyleValue.get(),this.updateTextInput(),this.editor.notifier.dispatch(2,{kind:2,tool:this})}),this.contentTransform=j.fromInitialValue(k.identity),this.textEditOverlay=document.createElement("div"),this.textEditOverlay.classList.add(Cs),this.editor.addStyleSheet(`
49
+ .${Cs} textarea {
50
50
  background-color: rgba(0, 0, 0, 0);
51
51
 
52
52
  white-space: pre;
@@ -60,18 +60,18 @@ Adding as an unknown object.`),this.storeUnknown)e=new kt(o);else return}await t
60
60
  min-width: 100px;
61
61
  min-height: 1.1em;
62
62
  }
63
- `),this.anchorControl=this.editor.anchorElementToCanvas(this.textEditOverlay,this.contentTransform)}initTextMeasuringCanvas(){this.textMeasuringCtx??=document.createElement("canvas").getContext("2d")}getTextAscent(e,r){if(this.initTextMeasuringCanvas(),this.textMeasuringCtx){this.textMeasuringCtx.textBaseline="alphabetic",re.applyTextStyles(this.textMeasuringCtx,r);let n=this.textMeasuringCtx.measureText(e);return n.fontBoundingBoxAscent??n.actualBoundingBoxAscent}return r.size*2/3}flushInput(e=!0){if(!this.textInputElem)return;let r=this.textEditOverlay.parentElement,n=w.of(r?.scrollLeft??0,r?.scrollTop??0),i=this.textInputElem.value.trimEnd();if(this.textInputElem.value="",e){let a=this.textInputElem;this.textInputElem=null,a.remove()}if(i!==""){let a=n.times(-1),l=this.editor.viewport.screenToCanvasTransform.transformVec3(a),c=k.translation(l),d=re.fromLines(i.split(`
64
- `),c.rightMul(this.contentTransform.get()),this.textStyle),p=_.addElement(d);this.removeExistingCommand?(this.removeExistingCommand.unapply(this.editor),this.editor.dispatch(se([this.removeExistingCommand,p])),this.removeExistingCommand=null):this.editor.dispatch(p)}}updateTextInput(){if(!this.textInputElem)return;this.textInputElem.placeholder=this.localizationTable.enterTextToInsert,this.textInputElem.style.fontFamily=this.textStyle.fontFamily,this.textInputElem.style.fontStyle=this.textStyle.fontStyle??"",this.textInputElem.style.fontVariant=this.textStyle.fontVariant??"",this.textInputElem.style.fontWeight=this.textStyle.fontWeight??"",this.textInputElem.style.fontSize=`${this.textStyle.size}px`,this.textInputElem.style.color=this.textStyle.renderingStyle.fill.toHexString(),this.textInputElem.style.margin="0",this.textInputElem.style.width=`${this.textInputElem.scrollWidth}px`,this.textInputElem.style.height=`${this.textInputElem.scrollHeight}px`;let n=this.getTextAscent("Testing!",this.textStyle);this.textInputElem.style.transform=`translate(0, ${-n}px)`,this.textInputElem.style.transformOrigin="top left";let i=Math.floor(this.textStyle.size);this.textInputElem.style.lineHeight=`${i}px`}startTextInput(e,r){this.flushInput(),this.textInputElem=document.createElement("textarea"),this.textInputElem.value=r,this.textInputElem.style.display="inline-block";let n=this.editor.viewport.roundPoint(e),i=-this.editor.viewport.getRotationAngle(),a=w.of(1,1).times(this.editor.viewport.getSizeOfPixelOnCanvas());this.contentTransform.set(k.translation(n).rightMul(k.zRotation(i)).rightMul(k.scaling2D(a))),this.updateTextInput(),setTimeout(()=>this.updateTextInput(),0),this.textInputElem.oninput=()=>{this.textInputElem&&(this.textInputElem.style.width=`${this.textInputElem.scrollWidth}px`,this.textInputElem.style.height=`${this.textInputElem.scrollHeight}px`)},this.textInputElem.onblur=()=>{let l=this.textInputElem;this.flushInput(!1),this.textInputElem=null,l&&l.classList.add("-hiding"),setTimeout(()=>{l?.remove()},0)},this.textInputElem.onkeyup=l=>{l.isComposing||(l.key==="Enter"&&!l.shiftKey?(this.flushInput(),this.editor.focus()):l.key==="Escape"&&(this.textInputElem?.remove(),this.textInputElem=null,this.editor.focus(),this.removeExistingCommand?.unapply(this.editor),this.removeExistingCommand=null))},this.textEditOverlay.replaceChildren(this.textInputElem),setTimeout(()=>this.textInputElem?.focus(),0)}setEnabled(e){super.setEnabled(e),this.isEnabled()||this.flushInput(),this.textEditOverlay.style.display=e?"block":"none"}onPointerDown({current:e,allPointers:r}){if(e.device===1)return!1;if(r.length===1){let n=e.canvasPos,i=w.of(4,4).times(this.editor.viewport.getSizeOfPixelOnCanvas()),a=B.fromCorners(n.minus(i),n.plus(i)),c=this.editor.image.getElementsIntersectingRegion(a).filter(p=>p instanceof re),d=this.editor.viewport.visibleRect;if(c=c.filter(p=>!p.getBBox().containsRect(d)),this.flushInput(),c.length>0){let p=c[c.length-1];this.setTextStyle(p.getTextStyle()),this.removeExistingCommand=new J([p]),this.removeExistingCommand.apply(this.editor),this.startTextInput(p.getBaselinePos(),p.getText()),this.contentTransform.set(p.getTransform()),this.updateTextInput()}else this.removeExistingCommand=null,this.startTextInput(e.canvasPos,"");return!0}return!1}onGestureCancel(){this.flushInput(),this.editor.focus()}setFontFamily(e){e!==this.textStyle.fontFamily&&this.textStyleValue.set({...this.textStyle,fontFamily:e})}setColor(e){e.eq(this.textStyle.renderingStyle.fill)||this.textStyleValue.set({...this.textStyle,renderingStyle:{...this.textStyle.renderingStyle,fill:e}})}setFontSize(e){e!==this.textStyle.size&&this.textStyleValue.set({...this.textStyle,size:e})}getTextStyle(){return this.textStyle}getStyleValue(){return this.textStyleValue}setTextStyle(e){this.textStyleValue.set(e)}onDestroy(){super.onDestroy(),this.anchorControl.remove()}};var Lt=class extends W{constructor(e,r){super(e.notifier,r);this.editor=e;this.colorPreviewListener=null;this.colorSelectListener=null;this.enabledValue().onUpdateAndNow(()=>{this.updateSelectingStatus()})}canReceiveInputInReadOnlyEditor(){return!0}updateSelectingStatus(){let e="pipette--color-selection-in-progress";this.isEnabled()&&this.colorSelectListener&&this.colorPreviewListener?this.editor.getRootElement().classList.add(e):this.editor.getRootElement().classList.remove(e)}setColorListener(e,r){this.colorPreviewListener=e,this.colorSelectListener=r,this.updateSelectingStatus()}clearColorListener(){this.colorPreviewListener=null,this.colorSelectListener=null,this.updateSelectingStatus()}onPointerDown({current:e,allPointers:r}){return this.colorPreviewListener&&r.length===1?(this.colorPreviewListener(this.editor.display.getColorAt(e.screenPos)),!0):!1}onPointerMove({current:e}){this.colorPreviewListener?.(this.editor.display.getColorAt(e.screenPos))}onPointerUp({current:e}){this.colorSelectListener?.(this.editor.display.getColorAt(e.screenPos))}onGestureCancel(){this.colorSelectListener?.(null)}};var It=class extends W{constructor(e){super(e.notifier,e.localization.changeTool);this.editor=e}canReceiveInputInReadOnlyEditor(){return!0}onKeyPress({key:e}){let n=this.editor.toolController.getPrimaryTools(),i=/^[0-9]$/.exec(e),a;if(i){let l=parseInt(i[0],10)-1;a=n[l]}return a?(a.setEnabled(!0),!0):!1}};var Bt=class extends W{constructor(e){super(e.notifier,e.localization.pasteHandler);this.editor=e}onPaste(e,r){let n=e.mime.toLowerCase(),i=(()=>{if(n==="image/svg+xml")return e.data;if(n==="text/plain"){let c=e.data.trim();if(c.startsWith("<svg")&&c.endsWith("</svg>"))return c}if(n!=="text/html"||!e.data.match(/^[^]{0,200}<svg.*/i))return!1;let l=e.data.toLowerCase().lastIndexOf("</svg>");return l===-1&&(l=e.data.length),e.data.substring(e.data.search(/<svg/i),l)})();return i?(this.doSVGPaste(i).then(r),!0):n==="text/plain"?(this.doTextPaste(e.data).then(r),!0):n==="image/png"||n==="image/jpeg"?(this.doImagePaste(e.data).then(r),!0):!1}async addComponentsFromPaste(e){await this.editor.addAndCenterComponents(e,!0,this.editor.localization.pasted(e.length))}async doSVGPaste(e){this.editor.showLoadingWarning(0);try{let r=et.fromString(e,!0),n=[];await r.start(i=>{n.push(i)},(i,a)=>null),await this.addComponentsFromPaste(n)}finally{this.editor.hideLoadingWarning()}}async doTextPaste(e){let r=this.editor.toolController.getMatchingTools(Ue);r.sort((l,c)=>!l.isEnabled()&&c.isEnabled()?-1:!c.isEnabled()&&l.isEnabled()?1:0);let n={size:12,fontFamily:"sans",renderingStyle:{fill:L.red}},i=r[0]?.getTextStyle()??n;if(e.trim()==="")return;let a=e.split(`
65
- `);await this.addComponentsFromPaste([re.fromLines(a,k.identity,i)])}async doImagePaste(e){let r=new Image;r.src=e;let n=await be.fromImage(r,k.identity);await this.addComponentsFromPaste([n])}};var tt=class extends W{constructor(e){super(e.notifier,e.localization.changeTool);this.listeners=new Set([])}registerListener(e){this.listeners.add(e)}removeListener(e){this.listeners.delete(e)}onKeyPress(e){let r=Array.from(this.listeners.values());for(let n of r)if(n(e))return!0;return!1}};var Dt=ro((s,o)=>{let e=o.getSizeOfPixelOnCanvas()*3,r=o.getSizeOfPixelOnCanvas();return new Ur(s,r,e,o)}),Ur=class{constructor(o,e,r,n){this.startPoint=o;this.minFitAllowed=e;this.viewport=n;this.isFirstSegment=!0;this.pathStartConnector=null;this.mostRecentConnector=null;this.nextCurveStartConnector=null;this.lastUpperBezier=null;this.lastLowerBezier=null;this.parts=[];this.upperSegments=[],this.lowerSegments=[],this.curveFitter=new St(o,e,r,i=>this.addCurve(i)),this.curveStartWidth=o.width,this.bbox=new B(this.startPoint.pos.x,this.startPoint.pos.y,0,0)}getBBox(){return this.bbox}getRenderingStyle(){return{fill:this.startPoint.color??null}}previewCurrentPath(o=!0){let e=this.upperSegments.slice(),r=this.lowerSegments.slice(),n,i,a=this.curveFitter.preview();if(a&&o){let{upperCurveCommand:d,lowerToUpperConnector:p,upperToLowerConnector:u,lowerCurveCommand:h}=this.segmentToPath(a);e.push(d),r.push(h),n=p,i=this.pathStartConnector??[u]}else{if(this.mostRecentConnector===null||this.pathStartConnector===null)return null;n=this.mostRecentConnector,i=this.pathStartConnector}let l,c=r[r.length-1];return c.kind===0||c.kind===1?l=c.point:l=c.endPoint,{startPoint:l,commands:[n,...e.reverse(),...i,...r],style:this.getRenderingStyle()}}previewFullPath(){let o=this.previewCurrentPath();return o?[...this.parts,o]:null}preview(o){let e=this.previewFullPath();if(e){let r=this.viewport.visibleRect;o.startObject(r);for(let n of e)o.drawPath(n);o.endObject()}}build(){return this.curveFitter.finalizeCurrentCurve(),this.isFirstSegment&&this.addCurve(null),new ee(this.previewFullPath())}roundPoint(o){let e=Math.min(this.minFitAllowed,this.curveStartWidth/3);return e<1e-10&&(e=this.minFitAllowed),$.roundPoint(o,e)}shouldStartNewSegment(o,e){if(!this.lastLowerBezier||!this.lastUpperBezier)return!1;let r=(c,d)=>{let p=c.intersectsBezier(d);return p.length?p[0].point:null},n=c=>c.p2.minus(c.p1).normalized(),i=c=>c.p1.minus(c.p0).normalized();if(i(e).dot(n(this.lastUpperBezier))<.35||i(o).dot(n(this.lastLowerBezier))<.35||i(e).dot(n(e))<0||i(o).dot(n(o))<0)return!0;let a=r(o,this.lastUpperBezier),l=r(e,this.lastLowerBezier);return!!(a||l)}addCurve(o){if(!o){if(!this.isFirstSegment)return;let p=$.roundPoint(this.startPoint.width/2.2,Math.min(this.minFitAllowed,this.startPoint.width/4)),u=this.roundPoint(this.startPoint.pos),h=this.startPoint.pos.plus(w.of(p,0));this.lowerSegments.push({kind:3,controlPoint:u.plus(w.of(p,p)),endPoint:u.plus(w.of(0,p))},{kind:3,controlPoint:u.plus(w.of(-p,p)),endPoint:u.plus(w.of(-p,0))},{kind:3,controlPoint:u.plus(w.of(-p,-p)),endPoint:u.plus(w.of(0,-p))},{kind:3,controlPoint:u.plus(w.of(p,-p)),endPoint:u.plus(w.of(p,0))});let m={kind:0,point:h};this.pathStartConnector=[m],this.mostRecentConnector=m;return}let{upperCurveCommand:e,lowerToUpperConnector:r,upperToLowerConnector:n,lowerCurveCommand:i,lowerCurve:a,upperCurve:l,nextCurveStartConnector:c}=this.segmentToPath(o),d=this.shouldStartNewSegment(a,l);if(d){let p=this.previewCurrentPath(!1);p?(this.parts.push(p),this.upperSegments=[],this.lowerSegments=[]):d=!1}(this.isFirstSegment||d)&&(this.pathStartConnector=this.nextCurveStartConnector??[n],this.isFirstSegment=!1),this.mostRecentConnector=r,this.nextCurveStartConnector=c,this.lowerSegments.push(i),this.upperSegments.push(e),this.lastLowerBezier=a,this.lastUpperBezier=l,this.curveStartWidth=o.startWidth}segmentToPath(o){let e=new Ae(o.startPoint,o.controlPoint,o.endPoint),r=e.normal(0),n=e.normal(1);r=r.times(o.startWidth/2),n=n.times(o.endWidth/2),isFinite(r.magnitude())||(console.error("Warning: startVec is NaN or \u221E",r,n,o),r=n);let i=o.startPoint,a=o.endPoint,l=o.controlPoint,d=e.nearestPointTo(l).parameterValue,p=e.normal(d).times(o.startWidth/2*d+o.endWidth/2*(1-d)),u=this.roundPoint(i.plus(r)),h=this.roundPoint(l.plus(p)),m=this.roundPoint(a.plus(n)),g=this.roundPoint(l.minus(p)),v=this.roundPoint(a.minus(n)),b=this.roundPoint(i.minus(r)),y={kind:3,controlPoint:h,endPoint:m},f={kind:0,point:u},T={kind:0,point:v},P=[{kind:0,point:v},{kind:0,point:m}],S={kind:3,controlPoint:g,endPoint:b},E=new Ae(v,g,b),C=new Ae(u,h,m);return{upperCurveCommand:S,upperToLowerConnector:f,lowerToUpperConnector:T,lowerCurveCommand:y,upperCurve:E,lowerCurve:C,nextCurveStartConnector:P}}addPoint(o){this.curveFitter.addPoint(o)}};var vs="find-tool",Ho=class extends W{constructor(e){super(e.notifier,e.localization.findLabel);this.editor=e;this.currentMatchIdx=0;this.overlay=document.createElement("div"),this.fillOverlay(),e.createHTMLOverlay(this.overlay),this.overlay.style.display="none",this.overlay.classList.add(`${vs}-overlay`)}canReceiveInputInReadOnlyEditor(){return!0}getMatches(e){let r=e.toLocaleLowerCase();return this.editor.image.getAllElements().filter(i=>{let a="";if(i instanceof re)a=i.getText();else if(i instanceof be)a=i.getAltText()??"";else return!1;let l=a.toLocaleLowerCase().indexOf(r)!==-1,c=a.indexOf(e)!==-1;return l||c}).map(i=>i.getBBox())}focusCurrentMatch(){let e=this.getMatches(this.searchInput.value),r=this.currentMatchIdx%e.length;r<0&&(r=e.length+r),r<e.length&&(this.editor.dispatch(this.editor.viewport.zoomTo(e[r],!0,!0),!1),this.editor.announceForAccessibility(this.editor.localization.focusedFoundText(r+1,e.length)))}toNextMatch(){this.currentMatchIdx++,this.focusCurrentMatch()}toPrevMatch(){this.currentMatchIdx--,this.focusCurrentMatch()}fillOverlay(){let e=document.createElement("label");this.searchInput=document.createElement("input");let r=document.createElement("button"),n=document.createElement("button");this.searchInput.setAttribute("id",`${vs}-searchInput-${Math.random()}`),e.htmlFor=this.searchInput.getAttribute("id"),e.innerText=this.editor.localization.findLabel,r.innerText=this.editor.localization.toNextMatch,n.innerText=this.editor.localization.closeDialog,this.searchInput.onkeydown=i=>{i.key==="Enter"?i.shiftKey?this.toPrevMatch():this.toNextMatch():i.key==="Escape"?this.setVisible(!1):this.editor.shortcuts.matchesShortcut(Cr,i)&&(i.preventDefault(),this.toggleVisible())},r.onclick=()=>{this.toNextMatch()},n.onclick=()=>{this.setVisible(!1)},this.overlay.replaceChildren(e,this.searchInput,r,n)}isVisible(){return this.overlay.style.display!=="none"}setVisible(e){e!==this.isVisible()&&(this.overlay.style.display=e?"block":"none",e?(this.searchInput.focus(),this.editor.announceForAccessibility(this.editor.localization.findDialogShown)):(this.editor.focus(),this.editor.announceForAccessibility(this.editor.localization.findDialogHidden)))}toggleVisible(){this.setVisible(!this.isVisible())}onKeyPress(e){return this.editor.shortcuts.matchesShortcut(Cr,e)?(this.toggleVisible(),!0):!1}setEnabled(e){super.setEnabled(e),this.isEnabled()&&this.setVisible(!1)}};var Mt=class extends W{constructor(e){super(e.notifier,e.localization.selectAllTool);this.editor=e}canReceiveInputInReadOnlyEditor(){return!0}onKeyPress(e){if(this.editor.shortcuts.matchesShortcut(to,e)){let r=this.editor.toolController.getMatchingTools(ve);if(r.length>0){let n=r[0];return n.setEnabled(!0),n.setSelection(this.editor.image.getAllElements()),!0}}return!1}};var mi=class{constructor(){this.closed=!1;if(!window.AudioContext){console.warn("Accessibility sound UI: Unable to open AudioContext."),this.closed=!0;return}this.ctx=new AudioContext,this.colorOscHue=this.ctx.createOscillator(),this.colorOscValue=this.ctx.createOscillator(),this.colorOscSaturation=this.ctx.createOscillator(),this.colorOscHue.type="triangle",this.colorOscSaturation.type="sine",this.colorOscValue.type="sawtooth",this.valueGain=this.ctx.createGain(),this.colorOscValue.connect(this.valueGain),this.valueGain.gain.setValueAtTime(.18,this.ctx.currentTime),this.colorGain=this.ctx.createGain(),this.colorOscHue.connect(this.colorGain),this.valueGain.connect(this.colorGain),this.colorOscSaturation.connect(this.colorGain),this.colorGain.connect(this.ctx.destination),this.boundaryGain=this.ctx.createGain(),this.boundaryOsc=this.ctx.createOscillator(),this.boundaryOsc.type="sawtooth",this.boundaryGain.gain.setValueAtTime(0,this.ctx.currentTime),this.boundaryOsc.connect(this.boundaryGain),this.boundaryGain.connect(this.ctx.destination),this.colorOscHue.start(),this.colorOscSaturation.start(),this.colorOscValue.start(),this.boundaryOsc.start(),this.pause()}pause(){this.closed||(this.colorGain.gain.setValueAtTime(0,this.ctx.currentTime),this.ctx.suspend())}play(){this.closed||this.ctx.resume()}setColor(o){let e=o.asHSV(),r=-Math.cos(e.x/2)*220+440,n=e.y*440+220,i=(e.z+.1)*440,a=.25*Math.min(1,o.a)/(1+Math.exp(-(e.z-.5)*3));this.colorOscHue.frequency.setValueAtTime(r,this.ctx.currentTime),this.colorOscSaturation.frequency.setValueAtTime(n,this.ctx.currentTime),this.colorOscValue.frequency.setValueAtTime(i,this.ctx.currentTime),this.valueGain.gain.setValueAtTime((1-e.z)*.4,this.ctx.currentTime),this.colorGain.gain.setValueAtTime(a,this.ctx.currentTime)}announceBoundaryCross(o){this.boundaryGain.gain.cancelScheduledValues(this.ctx.currentTime),this.boundaryGain.gain.setValueAtTime(0,this.ctx.currentTime),this.boundaryGain.gain.linearRampToValueAtTime(.018,this.ctx.currentTime+.1),this.boundaryOsc.frequency.setValueAtTime(440+Math.atan(o/2)*100,this.ctx.currentTime),this.boundaryGain.gain.linearRampToValueAtTime(0,this.ctx.currentTime+.25)}close(){this.ctx.close(),this.closed=!0}},At=class extends W{constructor(e,r){super(e.notifier,r);this.editor=e;this.soundFeedback=null;this.toggleButtonContainer=document.createElement("div"),this.toggleButtonContainer.classList.add("js-draw-sound-ui-toggle"),this.toggleButton=document.createElement("button"),this.toggleButton.onclick=()=>{this.setEnabled(!this.isEnabled())},this.toggleButtonContainer.appendChild(this.toggleButton),this.updateToggleButtonText(),e.createHTMLOverlay(this.toggleButtonContainer)}canReceiveInputInReadOnlyEditor(){return!0}updateToggleButtonText(){let e="sound-ui-tool-enabled";this.isEnabled()?(this.toggleButton.innerText=this.editor.localization.disableAccessibilityExploreTool,this.toggleButtonContainer.classList.add(e)):(this.toggleButton.innerText=this.editor.localization.enableAccessibilityExploreTool,this.toggleButtonContainer.classList.remove(e))}setEnabled(e){super.setEnabled(e),this.isEnabled()?this.editor.announceForAccessibility(this.editor.localization.soundExplorerUsageAnnouncement):(this.soundFeedback?.close(),this.soundFeedback=null),this.updateToggleButtonText()}onKeyPress(e){return e.code==="Escape"?(this.setEnabled(!1),!0):!1}onPointerDown({current:e,allPointers:r}){return this.soundFeedback||(this.soundFeedback=new mi),r.length>=2?!1:(this.soundFeedback?.play(),this.soundFeedback?.setColor(this.editor.display.getColorAt(e.screenPos)??L.black),this.lastPointerPos=e.canvasPos,!0)}onPointerMove({current:e}){this.soundFeedback?.setColor(this.editor.display.getColorAt(e.screenPos)??L.black);let r=new ce(this.lastPointerPos,e.canvasPos),n=this.editor.image.getElementsIntersectingRegion(r.bbox).filter(i=>i.intersects(r));this.lastPointerPos=e.canvasPos,n.length>0&&this.soundFeedback?.announceBoundaryCross(n.length)}onPointerUp(e){this.soundFeedback?.pause()}onGestureCancel(){this.soundFeedback?.pause()}};var No=class extends ze{#e=null;#t=null;onEvent(o){return this.#e===null?this.emit(o):this.#e.onEvent(o)}addToTail(o){this.#t?(this.#t.setEmitListener(o),this.#t=o):(this.#e=o,this.#t=this.#e),this.#t.setEmitListener(e=>this.emit(e))}};var $o=class extends W{constructor(e){super(e.notifier,"scrollbar");this.editor=e;this.fadeOutTimeout=null;this.scrollbarOverlay=document.createElement("div"),this.scrollbarOverlay.classList.add("ScrollbarTool-overlay"),this.verticalScrollbar=document.createElement("div"),this.verticalScrollbar.classList.add("vertical-scrollbar"),this.horizontalScrollbar=document.createElement("div"),this.horizontalScrollbar.classList.add("horizontal-scrollbar"),this.scrollbarOverlay.replaceChildren(this.verticalScrollbar,this.horizontalScrollbar);let r=null,n=null;this.enabledValue().onUpdateAndNow(i=>{r?.remove(),n?.remove(),n=null,r=null,i&&(n=e.notifier.on(7,a=>{this.updateScrollbars()}),this.updateScrollbars(),r=e.createHTMLOverlay(this.scrollbarOverlay))})}updateScrollbars(){let e=this.editor.viewport,r=e.getScreenRectSize(),n=new B(0,0,r.x,r.y),i=this.editor.getImportExportRect().transformedBoundingBox(e.canvasToScreenTransform).union(n),a=n.width/i.width*r.x,l=n.height/i.height*r.y,c=(n.x-i.x)/i.width*r.x,d=(n.y-i.y)/i.height*r.y;this.horizontalScrollbar.style.width=`${a}px`,this.verticalScrollbar.style.height=`${l}px`,this.horizontalScrollbar.style.marginLeft=`${c}px`,this.verticalScrollbar.style.marginTop=`${d}px`;let p=(h,m,g)=>{let v="represents-no-scroll";Math.abs(m-g)<1e-8?h.classList.add(v):h.classList.remove(v)};p(this.horizontalScrollbar,a,r.x),p(this.verticalScrollbar,l,r.y),this.fadeOutTimeout!==null&&clearTimeout(this.fadeOutTimeout);let u=3e3;this.fadeOutTimeout=setTimeout(()=>{this.scrollbarOverlay.classList.remove("just-updated")},u),this.scrollbarOverlay.classList.add("just-updated")}};var Vt=class{constructor(o,e){this.activeTool=null;this.isEditorReadOnly=o.isReadOnlyReactiveValue(),this.inputPipeline=new No,this.inputPipeline.setEmitListener(u=>this.onEventInternal(u));let r=new mt;this.primaryToolGroup=r;let n=new Ce(o,6,e.touchPanTool),i=new Ce(o,16,e.keyboardPanZoom),a=new $e(o,e.penTool(1),{color:L.purple,thickness:8}),l=new $e(o,e.penTool(2),{color:L.clay,thickness:4});l.setInputMapper(new Pt(o.viewport));let c=new Je(o,e.eraserTool),d=[a,l,new $e(o,e.penTool(3),{color:L.ofRGBA(1,1,0,.5),thickness:40,factory:Dt}),c,new ve(o,e.selectionTool),new Ue(o,e.textTool,e),new Ce(o,8,e.anyDevicePanning)],p=new At(o,e.soundExplorer);p.setEnabled(!1),this.tools=[new $o(o),new Lt(o,e.pipetteTool),p,n,...d,i,new zt(o),new tt(o),new It(o),c.makeEraserSwitcherTool(),new Ho(o),new Bt(o),new Mt(o)],d.forEach(u=>u.setToolGroup(r)),n.setEnabled(!0),a.setEnabled(!0),o.notifier.on(0,u=>{u.kind===0&&o.announceForAccessibility(e.toolEnabledAnnouncement(u.tool.description))}),o.notifier.on(1,u=>{u.kind===1&&o.announceForAccessibility(e.toolDisabledAnnouncement(u.tool.description))}),this.activeTool=null}setTools(o,e){this.tools=o,this.primaryToolGroup=e??new mt}addPrimaryTool(o){o.setToolGroup(this.primaryToolGroup),o.isEnabled()&&this.primaryToolGroup.notifyEnabled(o),this.tools.includes(o)||this.addTool(o)}getPrimaryTools(){return this.tools.filter(o=>o.getToolGroup()===this.primaryToolGroup)}addTool(o,e){this.tools.includes(o)||(e?.addToFront?this.tools.splice(0,0,o):this.tools.push(o))}removeAndDestroyTools(o){let e=[];for(let r of this.tools)o.includes(r)?(this.activeTool===r&&(this.activeTool=null),r.onDestroy()):e.push(r);this.tools=e}insertTools(o,e,r){this.tools=this.tools.filter(i=>!e.includes(i));let n=[];for(let i of this.tools)r==="after"&&n.push(i),i===o&&n.push(...e),r==="before"&&n.push(i);this.tools=n}insertToolsAfter(o,e){this.insertTools(o,e,"after")}insertToolsBefore(o,e){this.insertTools(o,e,"before")}onEventInternal(o){let e=this.isEditorReadOnly.get(),r=i=>i.isEnabled()&&(!e||i.canReceiveInputInReadOnlyEditor()),n=!1;if(o.kind===0){let i=!1;this.activeTool&&!this.activeTool.eventCanBeDeliveredToNonActiveTool(o)&&(i=!0);for(let a of this.tools)if(!(i&&a!==this.activeTool)&&r(a)&&a.onEvent(o)){this.activeTool!==a&&this.activeTool?.onEvent({kind:3}),this.activeTool=a,n=!0;break}}else if(o.kind===2)this.activeTool?.onEvent(o)&&o.allPointers.length>1||(this.activeTool=null),n=!0;else if(o.kind===1)this.activeTool!==null&&(this.activeTool.onEvent(o),n=!0);else if(o.kind===3)this.activeTool!==null&&(this.activeTool.onEvent(o),this.activeTool=null);else for(let i of this.tools)if(r(i)&&(n=i.onEvent(o),n))break;return n}onEvent(o){return this.dispatchInputEvent(o)}dispatchInputEvent(o){return this.inputPipeline.onEvent(o)}addInputMapper(o){this.inputPipeline.addToTail(o)}getMatchingTools(o){return this.tools.filter(e=>e instanceof o)}onEditorDestroyed(){for(let o of this.tools)o.onDestroy()}};var fi=class{constructor(o,e,r){this.editor=o;this.announceRedoCallback=e;this.announceUndoCallback=r;this.maxUndoRedoStackSize=700;this.#e=[],this.#t=[]}#e;#t;fireUpdateEvent(o,e){this.editor.notifier.dispatch(3,{kind:3,undoStackSize:this.#e.length,redoStackSize:this.#t.length,command:e,stackUpdateType:o})}push(o,e=!0){e&&o.apply(this.editor),this.#e.push(o);for(let r of this.#t)r.onDrop(this.editor);if(this.#t=[],this.#e.length>this.maxUndoRedoStackSize){let r=Math.ceil(this.maxUndoRedoStackSize/100);this.#e.splice(0,r).forEach(i=>i.onDrop(this.editor))}this.fireUpdateEvent(0,o),this.editor.notifier.dispatch(4,{kind:4,command:o})}undo(){let o=this.#e.pop();if(o){this.#t.push(o);let e=o.unapply(this.editor);return this.announceUndoCallback(o),this.fireUpdateEvent(1,o),this.editor.notifier.dispatch(5,{kind:5,command:o}),e}}redo(){let o=this.#t.pop();if(o){this.#e.push(o);let e=o.apply(this.editor);return this.announceRedoCallback(o),this.fireUpdateEvent(2,o),this.editor.notifier.dispatch(4,{kind:4,command:o}),e}}get undoStackSize(){return this.#e.length}get redoStackSize(){return this.#t.length}},Wr=fi;var ot=class s extends Le{constructor(e){super(e);this.clearedCount=0;this.renderedPathCount=0;this.lastFillStyle=null;this.lastPoint=null;this.objectNestingLevel=0;this.lastText=null;this.lastImage=null;this.pointBuffer=[]}displaySize(){let e=this.getViewport().getScreenRectSize();return e.x===0||e.y===0?w.of(640,480):e}clear(){if(this.clearedCount++,this.renderedPathCount=0,this.pointBuffer=[],this.lastText=null,this.lastImage=null,this.objectNestingLevel>0)throw new Error(`Within an object while clearing! Nesting level: ${this.objectNestingLevel}`)}beginPath(e){this.lastPoint=e,this.pointBuffer.push(e)}endPath(e){this.renderedPathCount++,this.lastFillStyle=e}lineTo(e){e=this.canvasToScreen(e),this.lastPoint=e,this.pointBuffer.push(e)}moveTo(e){e=this.canvasToScreen(e),this.lastPoint=e,this.pointBuffer.push(e)}traceCubicBezierCurve(e,r,n){e=this.canvasToScreen(e),r=this.canvasToScreen(r),n=this.canvasToScreen(n),this.lastPoint=n,this.pointBuffer.push(e,r,n)}traceQuadraticBezierCurve(e,r){e=this.canvasToScreen(e),r=this.canvasToScreen(r),this.lastPoint=r,this.pointBuffer.push(e,r)}drawPoints(...e){}drawText(e,r,n){this.lastText=e}drawImage(e){this.lastImage=e}startObject(e,r){super.startObject(e),this.objectNestingLevel+=1}endObject(){super.endObject(),this.objectNestingLevel-=1}isTooSmallToRender(e){return!1}canRenderFromWithoutDataLoss(e){return e instanceof s}renderFromOtherOfSameType(e,r){if(!(r instanceof s))throw new Error(`${r} cannot be rendered onto ${this}`);this.renderedPathCount+=r.renderedPathCount,this.lastFillStyle=r.lastFillStyle,this.lastPoint=r.lastPoint,this.pointBuffer.push(...r.pointBuffer.map(n=>e.transformVec2(n)))}toString(){return"[DummyRenderer]"}};var rt=3,Uo=class s{constructor(o,e){this.region=o;this.cacheState=e;this.instantiatedChildren=[];this.parent=null;this.cachedRenderer=null;this.renderedIds=[];this.renderedMaxZIndex=null}generateParent(){if(this.parent)return this.parent;let o=B.fromCorners(this.region.topLeft.minus(this.region.size),this.region.bottomRight.plus(this.region.size)),e=new s(o,this.cacheState);e.generateChildren();let r=this.region.maxDimension/100,n=(e.instantiatedChildren.length-1)/2;if(!e.instantiatedChildren[n].region.eq(this.region,r))throw console.error(e.instantiatedChildren[n].region,"\u2260",this.region),new Error("Logic error: [this] is not contained within its parent's center child");return e.instantiatedChildren[n]=this,this.parent=e,e}generateChildren(){if(this.instantiatedChildren.length===0){if(this.region.size.x/rt===0||this.region.size.y/rt===0){console.warn("Cache element has zero size! Not generating children.");return}let o=this.region.divideIntoGrid(rt,rt);console.assert(o.length===rt*rt,"Warning: divideIntoGrid created the wrong number of subrectangles!");for(let e of o){let r=new s(e,this.cacheState);r.parent=this,this.instantiatedChildren.push(r)}}this.checkRep()}getChildren(){return this.checkRep(),this.generateChildren(),this.instantiatedChildren}smallestChildContaining(o){let e=o.maxDimension>this.region.maxDimension/rt;if(!this.region.containsRect(o)||e)return null;for(let r of this.getChildren())if(r.region.containsRect(o))return r.smallestChildContaining(o)??r;return null}renderingWouldBeHighEnoughResolution(o){let e=this.region.w/this.cacheState.props.blockResolution.x;return!(o.getScaleFactor()*e>this.cacheState.props.maxScale)}allChildrenCanRender(o,e){if(this.instantiatedChildren.length===0)return!1;for(let r of this.instantiatedChildren)if(r.region.intersects(o.visibleRect)&&!r.renderingIsUpToDate(this.idsOfIntersecting(e)))return!1;return!0}computeSortedByLeafIds(o){let e=o.slice();return e.sort((r,n)=>r.getId()-n.getId()),e}idsOfIntersecting(o){let e=[];for(let r of o)r.getBBox().intersects(this.region)&&e.push(r.getId());return e}allRenderedIdsIn(o){if(this.renderedIds.length>o.length)return!1;for(let e=0;e<this.renderedIds.length;e++)if(o[e]!==this.renderedIds[e])return!1;return!0}renderingIsUpToDate(o){return this.cachedRenderer===null||o.length!==this.renderedIds.length?!1:this.allRenderedIdsIn(o)}renderItems(o,e,r){if(!r.visibleRect.intersects(this.region)||e.length===0)return;if(e=(a=>{let l=[];for(let c of a){let d=c.getBBox();d.intersects(this.region)&&(d.maxDimension>=this.region.maxDimension?l.push(...c.getChildrenOrSelfIntersectingRegion(this.region)):l.push(c))}return l})(e),!this.cacheState.props.isOfCorrectType(o)){for(let a of e)a.render(o,r.visibleRect);return}if(this.cacheState.debugMode&&o.drawRect(this.region,r.getSizeOfPixelOnCanvas(),{fill:L.yellow}),this.renderingWouldBeHighEnoughResolution(r)){let a=u=>u.w/this.region.w<1/this.cacheState.props.blockResolution.x,l=[];for(let u of e)l.push(...u.getLeavesIntersectingRegion(this.region,a));Ct(l);let c=this.computeSortedByLeafIds(l);if(c.length===0)return;let d=c.map(u=>u.getId()),p;if(this.renderingIsUpToDate(d))p=this.cachedRenderer.startRender();else{if(this.allChildrenCanRender(r,c)){for(let h of this.getChildren())h.renderItems(o,e,r);return}let u=0;for(let h of c)a(h.getBBox())||(u+=h.getContent().getProportionalRenderingTime());if(u>this.cacheState.props.minProportionalRenderTimePerCache){let h=!0;if(!this.cachedRenderer)this.cachedRenderer=this.cacheState.recordManager.allocCanvas(this.region,()=>this.onRegionDealloc());else if(c.length>this.renderedIds.length&&this.allRenderedIdsIn(d)&&this.renderedMaxZIndex!==null){let m=[],g=null;for(let v=0;v<c.length;v++){let b=c[v],f=b.getContent().getZIndex();(v>=this.renderedIds.length||b.getId()!==this.renderedIds[v])&&(m.push(b),(g===null||f<g)&&(g=f))}if(g!==null&&g>this.renderedMaxZIndex){h=!1,p=this.cachedRenderer.startRender();for(let v=0;v<l.length;v++){let b=l[v],y=b.getContent().getZIndex();y>this.renderedMaxZIndex&&(b.render(p,this.region),this.renderedMaxZIndex=y)}this.cacheState.debugMode&&o.drawRect(this.region,2*r.getSizeOfPixelOnCanvas(),{fill:L.clay})}}else this.cacheState.debugMode&&console.log("Decided on a full re-render. Reason: At least one of the following is false:",`
63
+ `),this.anchorControl=this.editor.anchorElementToCanvas(this.textEditOverlay,this.contentTransform)}initTextMeasuringCanvas(){this.textMeasuringCtx??=document.createElement("canvas").getContext("2d")}getTextAscent(e,r){if(this.initTextMeasuringCanvas(),this.textMeasuringCtx){this.textMeasuringCtx.textBaseline="alphabetic",ne.applyTextStyles(this.textMeasuringCtx,r);let n=this.textMeasuringCtx.measureText(e);return n.fontBoundingBoxAscent??n.actualBoundingBoxAscent}return r.size*2/3}flushInput(e=!0){if(!this.textInputElem)return;let r=this.textEditOverlay.parentElement,n=w.of(r?.scrollLeft??0,r?.scrollTop??0),i=this.textInputElem.value.trimEnd();if(this.textInputElem.value="",e){let a=this.textInputElem;this.textInputElem=null,a.remove()}if(i!==""){let a=n.times(-1),l=this.editor.viewport.screenToCanvasTransform.transformVec3(a),c=k.translation(l),d=ne.fromLines(i.split(`
64
+ `),c.rightMul(this.contentTransform.get()),this.textStyle),u=q.addElement(d);this.removeExistingCommand?(this.removeExistingCommand.unapply(this.editor),this.editor.dispatch(le([this.removeExistingCommand,u])),this.removeExistingCommand=null):this.editor.dispatch(u)}}updateTextInput(){if(!this.textInputElem)return;this.textInputElem.placeholder=this.localizationTable.enterTextToInsert,this.textInputElem.style.fontFamily=this.textStyle.fontFamily,this.textInputElem.style.fontStyle=this.textStyle.fontStyle??"",this.textInputElem.style.fontVariant=this.textStyle.fontVariant??"",this.textInputElem.style.fontWeight=this.textStyle.fontWeight??"",this.textInputElem.style.fontSize=`${this.textStyle.size}px`,this.textInputElem.style.color=this.textStyle.renderingStyle.fill.toHexString(),this.textInputElem.style.margin="0",this.textInputElem.style.width=`${this.textInputElem.scrollWidth}px`,this.textInputElem.style.height=`${this.textInputElem.scrollHeight}px`;let n=this.getTextAscent("Testing!",this.textStyle);this.textInputElem.style.transform=`translate(0, ${-n}px)`,this.textInputElem.style.transformOrigin="top left";let i=Math.floor(this.textStyle.size);this.textInputElem.style.lineHeight=`${i}px`}startTextInput(e,r){this.flushInput(),this.textInputElem=document.createElement("textarea"),this.textInputElem.value=r,this.textInputElem.style.display="inline-block";let n=this.editor.viewport.roundPoint(e),i=-this.editor.viewport.getRotationAngle(),a=w.of(1,1).times(this.editor.viewport.getSizeOfPixelOnCanvas());this.contentTransform.set(k.translation(n).rightMul(k.zRotation(i)).rightMul(k.scaling2D(a))),this.updateTextInput(),setTimeout(()=>this.updateTextInput(),0),this.textInputElem.oninput=()=>{this.textInputElem&&(this.textInputElem.style.width=`${this.textInputElem.scrollWidth}px`,this.textInputElem.style.height=`${this.textInputElem.scrollHeight}px`)},this.textInputElem.onblur=()=>{let l=this.textInputElem;this.flushInput(!1),this.textInputElem=null,l&&l.classList.add("-hiding"),setTimeout(()=>{l?.remove()},0)},this.textInputElem.onkeyup=l=>{l.isComposing||(l.key==="Enter"&&!l.shiftKey?(this.flushInput(),this.editor.focus()):l.key==="Escape"&&(this.textInputElem?.remove(),this.textInputElem=null,this.editor.focus(),this.removeExistingCommand?.unapply(this.editor),this.removeExistingCommand=null))},this.textEditOverlay.replaceChildren(this.textInputElem),setTimeout(()=>this.textInputElem?.focus(),0)}setEnabled(e){super.setEnabled(e),this.isEnabled()||this.flushInput(),this.textEditOverlay.style.display=e?"block":"none"}onPointerDown({current:e,allPointers:r}){if(e.device===1)return!1;if(r.length===1){let n=e.canvasPos,i=w.of(4,4).times(this.editor.viewport.getSizeOfPixelOnCanvas()),a=I.fromCorners(n.minus(i),n.plus(i)),c=this.editor.image.getElementsIntersectingRegion(a).filter(u=>u instanceof ne),d=this.editor.viewport.visibleRect;if(c=c.filter(u=>!u.getBBox().containsRect(d)),this.flushInput(),c.length>0){let u=c[c.length-1];this.setTextStyle(u.getTextStyle()),this.removeExistingCommand=new J([u]),this.removeExistingCommand.apply(this.editor),this.startTextInput(u.getBaselinePos(),u.getText()),this.contentTransform.set(u.getTransform()),this.updateTextInput()}else this.removeExistingCommand=null,this.startTextInput(e.canvasPos,"");return!0}return!1}onGestureCancel(){this.flushInput(),this.editor.focus()}setFontFamily(e){e!==this.textStyle.fontFamily&&this.textStyleValue.set({...this.textStyle,fontFamily:e})}setColor(e){e.eq(this.textStyle.renderingStyle.fill)||this.textStyleValue.set({...this.textStyle,renderingStyle:{...this.textStyle.renderingStyle,fill:e}})}setFontSize(e){e!==this.textStyle.size&&this.textStyleValue.set({...this.textStyle,size:e})}getTextStyle(){return this.textStyle}getStyleValue(){return this.textStyleValue}setTextStyle(e){this.textStyleValue.set(e)}onDestroy(){super.onDestroy(),this.anchorControl.remove()}};var Mt=class extends K{constructor(e,r){super(e.notifier,r);this.editor=e;this.colorPreviewListener=null;this.colorSelectListener=null;this.enabledValue().onUpdateAndNow(()=>{this.updateSelectingStatus()})}canReceiveInputInReadOnlyEditor(){return!0}updateSelectingStatus(){let e="pipette--color-selection-in-progress";this.isEnabled()&&this.colorSelectListener&&this.colorPreviewListener?this.editor.getRootElement().classList.add(e):this.editor.getRootElement().classList.remove(e)}setColorListener(e,r){this.colorPreviewListener=e,this.colorSelectListener=r,this.updateSelectingStatus()}clearColorListener(){this.colorPreviewListener=null,this.colorSelectListener=null,this.updateSelectingStatus()}onPointerDown({current:e,allPointers:r}){return this.colorPreviewListener&&r.length===1?(this.colorPreviewListener(this.editor.display.getColorAt(e.screenPos)),!0):!1}onPointerMove({current:e}){this.colorPreviewListener?.(this.editor.display.getColorAt(e.screenPos))}onPointerUp({current:e}){this.colorSelectListener?.(this.editor.display.getColorAt(e.screenPos))}onGestureCancel(){this.colorSelectListener?.(null)}};var Dt=class extends K{constructor(e){super(e.notifier,e.localization.changeTool);this.editor=e}canReceiveInputInReadOnlyEditor(){return!0}onKeyPress({key:e}){let n=this.editor.toolController.getPrimaryTools(),i=/^[0-9]$/.exec(e),a;if(i){let l=parseInt(i[0],10)-1;a=n[l]}return a?(a.setEnabled(!0),!0):!1}};var At=class extends K{constructor(e){super(e.notifier,e.localization.pasteHandler);this.editor=e}onPaste(e,r){let n=e.mime.toLowerCase(),i=(()=>{if(n==="image/svg+xml")return e.data;if(n==="text/plain"){let c=e.data.trim();if(c.startsWith("<svg")&&c.endsWith("</svg>"))return c}if(n!=="text/html"||!e.data.match(/^[^]{0,200}<svg.*/i))return!1;let l=e.data.toLowerCase().lastIndexOf("</svg>");return l===-1&&(l=e.data.length),e.data.substring(e.data.search(/<svg/i),l)})();return i?(this.doSVGPaste(i).then(r),!0):n==="text/plain"?(this.doTextPaste(e.data).then(r),!0):n==="image/png"||n==="image/jpeg"?(this.doImagePaste(e.data).then(r),!0):!1}async addComponentsFromPaste(e){await this.editor.addAndCenterComponents(e,!0,this.editor.localization.pasted(e.length))}async doSVGPaste(e){this.editor.showLoadingWarning(0);try{let r=et.fromString(e,!0),n=[];await r.start(i=>{n.push(i)},(i,a)=>null),await this.addComponentsFromPaste(n)}finally{this.editor.hideLoadingWarning()}}async doTextPaste(e){let r=this.editor.toolController.getMatchingTools($e);r.sort((l,c)=>!l.isEnabled()&&c.isEnabled()?-1:!c.isEnabled()&&l.isEnabled()?1:0);let n={size:12,fontFamily:"sans",renderingStyle:{fill:L.red}},i=r[0]?.getTextStyle()??n;if(e.trim()==="")return;let a=e.split(`
65
+ `);await this.addComponentsFromPaste([ne.fromLines(a,k.identity,i)])}async doImagePaste(e){let r=new Image;r.src=e;let n=await be.fromImage(r,k.identity);await this.addComponentsFromPaste([n])}};var tt=class extends K{constructor(e){super(e.notifier,e.localization.changeTool);this.listeners=new Set([])}registerListener(e){this.listeners.add(e)}removeListener(e){this.listeners.delete(e)}onKeyPress(e){let r=Array.from(this.listeners.values());for(let n of r)if(n(e))return!0;return!1}};var Vt=so((s,o)=>{let e=o.getSizeOfPixelOnCanvas()*3,r=o.getSizeOfPixelOnCanvas();return new _r(s,r,e,o)}),_r=class{constructor(o,e,r,n){this.startPoint=o;this.minFitAllowed=e;this.viewport=n;this.isFirstSegment=!0;this.pathStartConnector=null;this.mostRecentConnector=null;this.nextCurveStartConnector=null;this.lastUpperBezier=null;this.lastLowerBezier=null;this.parts=[];this.upperSegments=[],this.lowerSegments=[],this.curveFitter=new Pt(o,e,r,i=>this.addCurve(i)),this.curveStartWidth=o.width,this.bbox=new I(this.startPoint.pos.x,this.startPoint.pos.y,0,0)}getBBox(){return this.bbox}getRenderingStyle(){return{fill:this.startPoint.color??null}}previewCurrentPath(o=!0){let e=this.upperSegments.slice(),r=this.lowerSegments.slice(),n,i,a=this.curveFitter.preview();if(a&&o){let{upperCurveCommand:d,lowerToUpperConnector:u,upperToLowerConnector:p,lowerCurveCommand:h}=this.segmentToPath(a);e.push(d),r.push(h),n=u,i=this.pathStartConnector??[p]}else{if(this.mostRecentConnector===null||this.pathStartConnector===null)return null;n=this.mostRecentConnector,i=this.pathStartConnector}let l,c=r[r.length-1];return c.kind===0||c.kind===1?l=c.point:l=c.endPoint,{startPoint:l,commands:[n,...e.reverse(),...i,...r],style:this.getRenderingStyle()}}previewFullPath(){let o=this.previewCurrentPath();return o?[...this.parts,o]:null}preview(o){let e=this.previewFullPath();if(e){let r=this.viewport.visibleRect;o.startObject(r);for(let n of e)o.drawPath(n);o.endObject()}}build(){return this.curveFitter.finalizeCurrentCurve(),this.isFirstSegment&&this.addCurve(null),new ee(this.previewFullPath())}roundPoint(o){let e=Math.min(this.minFitAllowed,this.curveStartWidth/3);return e<1e-10&&(e=this.minFitAllowed),U.roundPoint(o,e)}shouldStartNewSegment(o,e){if(!this.lastLowerBezier||!this.lastUpperBezier)return!1;let r=(c,d)=>{let u=c.intersectsBezier(d);return u.length?u[0].point:null},n=c=>c.p2.minus(c.p1).normalized(),i=c=>c.p1.minus(c.p0).normalized();if(i(e).dot(n(this.lastUpperBezier))<.35||i(o).dot(n(this.lastLowerBezier))<.35||i(e).dot(n(e))<0||i(o).dot(n(o))<0)return!0;let a=r(o,this.lastUpperBezier),l=r(e,this.lastLowerBezier);return!!(a||l)}addCurve(o){if(!o){if(!this.isFirstSegment)return;let u=U.roundPoint(this.startPoint.width/2.2,Math.min(this.minFitAllowed,this.startPoint.width/4)),p=this.roundPoint(this.startPoint.pos),h=this.startPoint.pos.plus(w.of(u,0));this.lowerSegments.push({kind:3,controlPoint:p.plus(w.of(u,u)),endPoint:p.plus(w.of(0,u))},{kind:3,controlPoint:p.plus(w.of(-u,u)),endPoint:p.plus(w.of(-u,0))},{kind:3,controlPoint:p.plus(w.of(-u,-u)),endPoint:p.plus(w.of(0,-u))},{kind:3,controlPoint:p.plus(w.of(u,-u)),endPoint:p.plus(w.of(u,0))});let m={kind:0,point:h};this.pathStartConnector=[m],this.mostRecentConnector=m;return}let{upperCurveCommand:e,lowerToUpperConnector:r,upperToLowerConnector:n,lowerCurveCommand:i,lowerCurve:a,upperCurve:l,nextCurveStartConnector:c}=this.segmentToPath(o),d=this.shouldStartNewSegment(a,l);if(d){let u=this.previewCurrentPath(!1);u?(this.parts.push(u),this.upperSegments=[],this.lowerSegments=[]):d=!1}(this.isFirstSegment||d)&&(this.pathStartConnector=this.nextCurveStartConnector??[n],this.isFirstSegment=!1),this.mostRecentConnector=r,this.nextCurveStartConnector=c,this.lowerSegments.push(i),this.upperSegments.push(e),this.lastLowerBezier=a,this.lastUpperBezier=l,this.curveStartWidth=o.startWidth}segmentToPath(o){let e=new De(o.startPoint,o.controlPoint,o.endPoint),r=e.normal(0),n=e.normal(1);r=r.times(o.startWidth/2),n=n.times(o.endWidth/2),isFinite(r.magnitude())||(console.error("Warning: startVec is NaN or \u221E",r,n,o),r=n);let i=o.startPoint,a=o.endPoint,l=o.controlPoint,d=e.nearestPointTo(l).parameterValue,u=e.normal(d).times(o.startWidth/2*d+o.endWidth/2*(1-d)),p=this.roundPoint(i.plus(r)),h=this.roundPoint(l.plus(u)),m=this.roundPoint(a.plus(n)),g=this.roundPoint(l.minus(u)),v=this.roundPoint(a.minus(n)),b=this.roundPoint(i.minus(r)),y={kind:3,controlPoint:h,endPoint:m},f={kind:0,point:p},T={kind:0,point:v},P=[{kind:0,point:v},{kind:0,point:m}],S={kind:3,controlPoint:g,endPoint:b},E=new De(v,g,b),C=new De(p,h,m);return{upperCurveCommand:S,upperToLowerConnector:f,lowerToUpperConnector:T,lowerCurveCommand:y,upperCurve:E,lowerCurve:C,nextCurveStartConnector:P}}addPoint(o){this.curveFitter.addPoint(o)}};var Ts="find-tool",Wo=class extends K{constructor(e){super(e.notifier,e.localization.findLabel);this.editor=e;this.currentMatchIdx=0;this.overlay=document.createElement("div"),this.fillOverlay(),e.createHTMLOverlay(this.overlay),this.overlay.style.display="none",this.overlay.classList.add(`${Ts}-overlay`)}canReceiveInputInReadOnlyEditor(){return!0}getMatches(e){let r=e.toLocaleLowerCase();return this.editor.image.getAllElements().filter(i=>{let a="";if(i instanceof ne)a=i.getText();else if(i instanceof be)a=i.getAltText()??"";else return!1;let l=a.toLocaleLowerCase().indexOf(r)!==-1,c=a.indexOf(e)!==-1;return l||c}).map(i=>i.getBBox())}focusCurrentMatch(){let e=this.getMatches(this.searchInput.value),r=this.currentMatchIdx%e.length;r<0&&(r=e.length+r),r<e.length&&(this.editor.dispatch(this.editor.viewport.zoomTo(e[r],!0,!0),!1),this.editor.announceForAccessibility(this.editor.localization.focusedFoundText(r+1,e.length)))}toNextMatch(){this.currentMatchIdx++,this.focusCurrentMatch()}toPrevMatch(){this.currentMatchIdx--,this.focusCurrentMatch()}fillOverlay(){let e=document.createElement("label");this.searchInput=document.createElement("input");let r=document.createElement("button"),n=document.createElement("button");this.searchInput.setAttribute("id",`${Ts}-searchInput-${Math.random()}`),e.htmlFor=this.searchInput.getAttribute("id"),e.innerText=this.editor.localization.findLabel,r.innerText=this.editor.localization.toNextMatch,n.innerText=this.editor.localization.closeDialog,this.searchInput.onkeydown=i=>{i.key==="Enter"?i.shiftKey?this.toPrevMatch():this.toNextMatch():i.key==="Escape"?this.setVisible(!1):this.editor.shortcuts.matchesShortcut(kr,i)&&(i.preventDefault(),this.toggleVisible())},r.onclick=()=>{this.toNextMatch()},n.onclick=()=>{this.setVisible(!1)},this.overlay.replaceChildren(e,this.searchInput,r,n)}isVisible(){return this.overlay.style.display!=="none"}setVisible(e){e!==this.isVisible()&&(this.overlay.style.display=e?"block":"none",e?(this.searchInput.focus(),this.editor.announceForAccessibility(this.editor.localization.findDialogShown)):(this.editor.focus(),this.editor.announceForAccessibility(this.editor.localization.findDialogHidden)))}toggleVisible(){this.setVisible(!this.isVisible())}onKeyPress(e){return this.editor.shortcuts.matchesShortcut(kr,e)?(this.toggleVisible(),!0):!1}setEnabled(e){super.setEnabled(e),this.isEnabled()&&this.setVisible(!1)}};var Ot=class extends K{constructor(e){super(e.notifier,e.localization.selectAllTool);this.editor=e}canReceiveInputInReadOnlyEditor(){return!0}onKeyPress(e){if(this.editor.shortcuts.matchesShortcut(no,e)){let r=this.editor.toolController.getMatchingTools(ve);if(r.length>0){let n=r[0];return n.setEnabled(!0),n.setSelection(this.editor.image.getAllElements()),!0}}return!1}};var vi=class{constructor(){this.closed=!1;if(!window.AudioContext){console.warn("Accessibility sound UI: Unable to open AudioContext."),this.closed=!0;return}this.ctx=new AudioContext,this.colorOscHue=this.ctx.createOscillator(),this.colorOscValue=this.ctx.createOscillator(),this.colorOscSaturation=this.ctx.createOscillator(),this.colorOscHue.type="triangle",this.colorOscSaturation.type="sine",this.colorOscValue.type="sawtooth",this.valueGain=this.ctx.createGain(),this.colorOscValue.connect(this.valueGain),this.valueGain.gain.setValueAtTime(.18,this.ctx.currentTime),this.colorGain=this.ctx.createGain(),this.colorOscHue.connect(this.colorGain),this.valueGain.connect(this.colorGain),this.colorOscSaturation.connect(this.colorGain),this.colorGain.connect(this.ctx.destination),this.boundaryGain=this.ctx.createGain(),this.boundaryOsc=this.ctx.createOscillator(),this.boundaryOsc.type="sawtooth",this.boundaryGain.gain.setValueAtTime(0,this.ctx.currentTime),this.boundaryOsc.connect(this.boundaryGain),this.boundaryGain.connect(this.ctx.destination),this.colorOscHue.start(),this.colorOscSaturation.start(),this.colorOscValue.start(),this.boundaryOsc.start(),this.pause()}pause(){this.closed||(this.colorGain.gain.setValueAtTime(0,this.ctx.currentTime),this.ctx.suspend())}play(){this.closed||this.ctx.resume()}setColor(o){let e=o.asHSV(),r=-Math.cos(e.x/2)*220+440,n=e.y*440+220,i=(e.z+.1)*440,a=.25*Math.min(1,o.a)/(1+Math.exp(-(e.z-.5)*3));this.colorOscHue.frequency.setValueAtTime(r,this.ctx.currentTime),this.colorOscSaturation.frequency.setValueAtTime(n,this.ctx.currentTime),this.colorOscValue.frequency.setValueAtTime(i,this.ctx.currentTime),this.valueGain.gain.setValueAtTime((1-e.z)*.4,this.ctx.currentTime),this.colorGain.gain.setValueAtTime(a,this.ctx.currentTime)}announceBoundaryCross(o){this.boundaryGain.gain.cancelScheduledValues(this.ctx.currentTime),this.boundaryGain.gain.setValueAtTime(0,this.ctx.currentTime),this.boundaryGain.gain.linearRampToValueAtTime(.018,this.ctx.currentTime+.1),this.boundaryOsc.frequency.setValueAtTime(440+Math.atan(o/2)*100,this.ctx.currentTime),this.boundaryGain.gain.linearRampToValueAtTime(0,this.ctx.currentTime+.25)}close(){this.ctx.close(),this.closed=!0}},Ft=class extends K{constructor(e,r){super(e.notifier,r);this.editor=e;this.soundFeedback=null;this.toggleButtonContainer=document.createElement("div"),this.toggleButtonContainer.classList.add("js-draw-sound-ui-toggle"),this.toggleButton=document.createElement("button"),this.toggleButton.onclick=()=>{this.setEnabled(!this.isEnabled())},this.toggleButtonContainer.appendChild(this.toggleButton),this.updateToggleButtonText(),e.createHTMLOverlay(this.toggleButtonContainer)}canReceiveInputInReadOnlyEditor(){return!0}updateToggleButtonText(){let e="sound-ui-tool-enabled";this.isEnabled()?(this.toggleButton.innerText=this.editor.localization.disableAccessibilityExploreTool,this.toggleButtonContainer.classList.add(e)):(this.toggleButton.innerText=this.editor.localization.enableAccessibilityExploreTool,this.toggleButtonContainer.classList.remove(e))}setEnabled(e){super.setEnabled(e),this.isEnabled()?this.editor.announceForAccessibility(this.editor.localization.soundExplorerUsageAnnouncement):(this.soundFeedback?.close(),this.soundFeedback=null),this.updateToggleButtonText()}onKeyPress(e){return e.code==="Escape"?(this.setEnabled(!1),!0):!1}onPointerDown({current:e,allPointers:r}){return this.soundFeedback||(this.soundFeedback=new vi),r.length>=2?!1:(this.soundFeedback?.play(),this.soundFeedback?.setColor(this.editor.display.getColorAt(e.screenPos)??L.black),this.lastPointerPos=e.canvasPos,!0)}onPointerMove({current:e}){this.soundFeedback?.setColor(this.editor.display.getColorAt(e.screenPos)??L.black);let r=new ue(this.lastPointerPos,e.canvasPos),n=this.editor.image.getElementsIntersectingRegion(r.bbox).filter(i=>i.intersects(r));this.lastPointerPos=e.canvasPos,n.length>0&&this.soundFeedback?.announceBoundaryCross(n.length)}onPointerUp(e){this.soundFeedback?.pause()}onGestureCancel(){this.soundFeedback?.pause()}};var Ko=class extends Re{#e=null;#t=null;onEvent(o){return this.#e===null?this.emit(o):this.#e.onEvent(o)}addToTail(o){this.#t?(this.#t.setEmitListener(o),this.#t=o):(this.#e=o,this.#t=this.#e),this.#t.setEmitListener(e=>this.emit(e))}};var Go=class extends K{constructor(e){super(e.notifier,"scrollbar");this.editor=e;this.fadeOutTimeout=null;this.scrollbarOverlay=document.createElement("div"),this.scrollbarOverlay.classList.add("ScrollbarTool-overlay"),this.verticalScrollbar=document.createElement("div"),this.verticalScrollbar.classList.add("vertical-scrollbar"),this.horizontalScrollbar=document.createElement("div"),this.horizontalScrollbar.classList.add("horizontal-scrollbar"),this.scrollbarOverlay.replaceChildren(this.verticalScrollbar,this.horizontalScrollbar);let r=null,n=null;this.enabledValue().onUpdateAndNow(i=>{r?.remove(),n?.remove(),n=null,r=null,i&&(n=e.notifier.on(7,a=>{this.updateScrollbars()}),this.updateScrollbars(),r=e.createHTMLOverlay(this.scrollbarOverlay))})}updateScrollbars(){let e=this.editor.viewport,r=e.getScreenRectSize(),n=new I(0,0,r.x,r.y),i=this.editor.getImportExportRect().transformedBoundingBox(e.canvasToScreenTransform).union(n),a=n.width/i.width*r.x,l=n.height/i.height*r.y,c=(n.x-i.x)/i.width*r.x,d=(n.y-i.y)/i.height*r.y;this.horizontalScrollbar.style.width=`${a}px`,this.verticalScrollbar.style.height=`${l}px`,this.horizontalScrollbar.style.marginLeft=`${c}px`,this.verticalScrollbar.style.marginTop=`${d}px`;let u=(h,m,g)=>{let v="represents-no-scroll";Math.abs(m-g)<1e-8?h.classList.add(v):h.classList.remove(v)};u(this.horizontalScrollbar,a,r.x),u(this.verticalScrollbar,l,r.y),this.fadeOutTimeout!==null&&clearTimeout(this.fadeOutTimeout);let p=3e3;this.fadeOutTimeout=setTimeout(()=>{this.scrollbarOverlay.classList.remove("just-updated")},p),this.scrollbarOverlay.classList.add("just-updated")}};var Ht=class{constructor(o,e){this.activeTool=null;this.isEditorReadOnly=o.isReadOnlyReactiveValue(),this.inputPipeline=new Ko,this.inputPipeline.setEmitListener(p=>this.onEventInternal(p));let r=new mt;this.primaryToolGroup=r;let n=new Ce(o,6,e.touchPanTool),i=new Ce(o,16,e.keyboardPanZoom),a=new Ne(o,e.penTool(1),{color:L.purple,thickness:8}),l=new Ne(o,e.penTool(2),{color:L.clay,thickness:4});l.setInputMapper(new Et(o.viewport));let c=new Je(o,e.eraserTool),d=[a,l,new Ne(o,e.penTool(3),{color:L.ofRGBA(1,1,0,.5),thickness:40,factory:Vt}),c,new ve(o,e.selectionTool),new $e(o,e.textTool,e),new Ce(o,8,e.anyDevicePanning)],u=new Ft(o,e.soundExplorer);u.setEnabled(!1),this.tools=[new Go(o),new Mt(o,e.pipetteTool),u,n,...d,i,new Bt(o),new tt(o),new Dt(o),c.makeEraserSwitcherTool(),new Wo(o),new At(o),new Ot(o)],d.forEach(p=>p.setToolGroup(r)),n.setEnabled(!0),a.setEnabled(!0),o.notifier.on(0,p=>{p.kind===0&&o.announceForAccessibility(e.toolEnabledAnnouncement(p.tool.description))}),o.notifier.on(1,p=>{p.kind===1&&o.announceForAccessibility(e.toolDisabledAnnouncement(p.tool.description))}),this.activeTool=null}setTools(o,e){this.tools=o,this.primaryToolGroup=e??new mt}addPrimaryTool(o){o.setToolGroup(this.primaryToolGroup),o.isEnabled()&&this.primaryToolGroup.notifyEnabled(o),this.tools.includes(o)||this.addTool(o)}getPrimaryTools(){return this.tools.filter(o=>o.getToolGroup()===this.primaryToolGroup)}addTool(o,e){this.tools.includes(o)||(e?.addToFront?this.tools.splice(0,0,o):this.tools.push(o))}removeAndDestroyTools(o){let e=[];for(let r of this.tools)o.includes(r)?(this.activeTool===r&&(this.activeTool=null),r.onDestroy()):e.push(r);this.tools=e}insertTools(o,e,r){this.tools=this.tools.filter(i=>!e.includes(i));let n=[];for(let i of this.tools)r==="after"&&n.push(i),i===o&&n.push(...e),r==="before"&&n.push(i);this.tools=n}insertToolsAfter(o,e){this.insertTools(o,e,"after")}insertToolsBefore(o,e){this.insertTools(o,e,"before")}onEventInternal(o){let e=this.isEditorReadOnly.get(),r=i=>i.isEnabled()&&(!e||i.canReceiveInputInReadOnlyEditor()),n=!1;if(o.kind===0){let i=!1;this.activeTool&&!this.activeTool.eventCanBeDeliveredToNonActiveTool(o)&&(i=!0);for(let a of this.tools)if(!(i&&a!==this.activeTool)&&r(a)&&a.onEvent(o)){this.activeTool!==a&&this.activeTool?.onEvent({kind:3}),this.activeTool=a,n=!0;break}}else if(o.kind===2)this.activeTool?.onEvent(o)&&o.allPointers.length>1||(this.activeTool=null),n=!0;else if(o.kind===1)this.activeTool!==null&&(this.activeTool.onEvent(o),n=!0);else if(o.kind===3)this.activeTool!==null&&(this.activeTool.onEvent(o),this.activeTool=null);else for(let i of this.tools)if(r(i)&&(n=i.onEvent(o),n))break;return n}onEvent(o){return this.dispatchInputEvent(o)}dispatchInputEvent(o){return this.inputPipeline.onEvent(o)}addInputMapper(o){this.inputPipeline.addToTail(o)}getMatchingTools(o){return this.tools.filter(e=>e instanceof o)}onEditorDestroyed(){for(let o of this.tools)o.onDestroy()}};var yi=class{constructor(o,e,r){this.editor=o;this.announceRedoCallback=e;this.announceUndoCallback=r;this.maxUndoRedoStackSize=700;this.#e=[],this.#t=[]}#e;#t;fireUpdateEvent(o,e){this.editor.notifier.dispatch(3,{kind:3,undoStackSize:this.#e.length,redoStackSize:this.#t.length,command:e,stackUpdateType:o})}push(o,e=!0){e&&o.apply(this.editor),this.#e.push(o);for(let r of this.#t)r.onDrop(this.editor);if(this.#t=[],this.#e.length>this.maxUndoRedoStackSize){let r=Math.ceil(this.maxUndoRedoStackSize/100);this.#e.splice(0,r).forEach(i=>i.onDrop(this.editor))}this.fireUpdateEvent(0,o),this.editor.notifier.dispatch(4,{kind:4,command:o})}undo(){let o=this.#e.pop();if(o){this.#t.push(o);let e=o.unapply(this.editor);return this.announceUndoCallback(o),this.fireUpdateEvent(1,o),this.editor.notifier.dispatch(5,{kind:5,command:o}),e}}redo(){let o=this.#t.pop();if(o){this.#e.push(o);let e=o.apply(this.editor);return this.announceRedoCallback(o),this.fireUpdateEvent(2,o),this.editor.notifier.dispatch(4,{kind:4,command:o}),e}}get undoStackSize(){return this.#e.length}get redoStackSize(){return this.#t.length}},qr=yi;var ot=class s extends ze{constructor(e){super(e);this.clearedCount=0;this.renderedPathCount=0;this.lastFillStyle=null;this.lastPoint=null;this.objectNestingLevel=0;this.lastText=null;this.lastImage=null;this.pointBuffer=[]}displaySize(){let e=this.getViewport().getScreenRectSize();return e.x===0||e.y===0?w.of(640,480):e}clear(){if(this.clearedCount++,this.renderedPathCount=0,this.pointBuffer=[],this.lastText=null,this.lastImage=null,this.objectNestingLevel>0)throw new Error(`Within an object while clearing! Nesting level: ${this.objectNestingLevel}`)}beginPath(e){this.lastPoint=e,this.pointBuffer.push(e)}endPath(e){this.renderedPathCount++,this.lastFillStyle=e}lineTo(e){e=this.canvasToScreen(e),this.lastPoint=e,this.pointBuffer.push(e)}moveTo(e){e=this.canvasToScreen(e),this.lastPoint=e,this.pointBuffer.push(e)}traceCubicBezierCurve(e,r,n){e=this.canvasToScreen(e),r=this.canvasToScreen(r),n=this.canvasToScreen(n),this.lastPoint=n,this.pointBuffer.push(e,r,n)}traceQuadraticBezierCurve(e,r){e=this.canvasToScreen(e),r=this.canvasToScreen(r),this.lastPoint=r,this.pointBuffer.push(e,r)}drawPoints(...e){}drawText(e,r,n){this.lastText=e}drawImage(e){this.lastImage=e}startObject(e,r){super.startObject(e),this.objectNestingLevel+=1}endObject(){super.endObject(),this.objectNestingLevel-=1}isTooSmallToRender(e){return!1}canRenderFromWithoutDataLoss(e){return e instanceof s}renderFromOtherOfSameType(e,r){if(!(r instanceof s))throw new Error(`${r} cannot be rendered onto ${this}`);this.renderedPathCount+=r.renderedPathCount,this.lastFillStyle=r.lastFillStyle,this.lastPoint=r.lastPoint,this.pointBuffer.push(...r.pointBuffer.map(n=>e.transformVec2(n)))}toString(){return"[DummyRenderer]"}};var rt=3,jo=class s{constructor(o,e){this.region=o;this.cacheState=e;this.instantiatedChildren=[];this.parent=null;this.cachedRenderer=null;this.renderedIds=[];this.renderedMaxZIndex=null}generateParent(){if(this.parent)return this.parent;let o=I.fromCorners(this.region.topLeft.minus(this.region.size),this.region.bottomRight.plus(this.region.size)),e=new s(o,this.cacheState);e.generateChildren();let r=this.region.maxDimension/100,n=(e.instantiatedChildren.length-1)/2;if(!e.instantiatedChildren[n].region.eq(this.region,r))throw console.error(e.instantiatedChildren[n].region,"\u2260",this.region),new Error("Logic error: [this] is not contained within its parent's center child");return e.instantiatedChildren[n]=this,this.parent=e,e}generateChildren(){if(this.instantiatedChildren.length===0){if(this.region.size.x/rt===0||this.region.size.y/rt===0){console.warn("Cache element has zero size! Not generating children.");return}let o=this.region.divideIntoGrid(rt,rt);console.assert(o.length===rt*rt,"Warning: divideIntoGrid created the wrong number of subrectangles!");for(let e of o){let r=new s(e,this.cacheState);r.parent=this,this.instantiatedChildren.push(r)}}this.checkRep()}getChildren(){return this.checkRep(),this.generateChildren(),this.instantiatedChildren}smallestChildContaining(o){let e=o.maxDimension>this.region.maxDimension/rt;if(!this.region.containsRect(o)||e)return null;for(let r of this.getChildren())if(r.region.containsRect(o))return r.smallestChildContaining(o)??r;return null}renderingWouldBeHighEnoughResolution(o){let e=this.region.w/this.cacheState.props.blockResolution.x;return!(o.getScaleFactor()*e>this.cacheState.props.maxScale)}allChildrenCanRender(o,e){if(this.instantiatedChildren.length===0)return!1;for(let r of this.instantiatedChildren)if(r.region.intersects(o.visibleRect)&&!r.renderingIsUpToDate(this.idsOfIntersecting(e)))return!1;return!0}computeSortedByLeafIds(o){let e=o.slice();return e.sort((r,n)=>r.getId()-n.getId()),e}idsOfIntersecting(o){let e=[];for(let r of o)r.getBBox().intersects(this.region)&&e.push(r.getId());return e}allRenderedIdsIn(o){if(this.renderedIds.length>o.length)return!1;for(let e=0;e<this.renderedIds.length;e++)if(o[e]!==this.renderedIds[e])return!1;return!0}renderingIsUpToDate(o){return this.cachedRenderer===null||o.length!==this.renderedIds.length?!1:this.allRenderedIdsIn(o)}renderItems(o,e,r){if(!r.visibleRect.intersects(this.region)||e.length===0)return;if(e=(a=>{let l=[];for(let c of a){let d=c.getBBox();d.intersects(this.region)&&(d.maxDimension>=this.region.maxDimension?l.push(...c.getChildrenOrSelfIntersectingRegion(this.region)):l.push(c))}return l})(e),!this.cacheState.props.isOfCorrectType(o)){for(let a of e)a.render(o,r.visibleRect);return}if(this.cacheState.debugMode&&o.drawRect(this.region,r.getSizeOfPixelOnCanvas(),{fill:L.yellow}),this.renderingWouldBeHighEnoughResolution(r)){let a=p=>p.w/this.region.w<1/this.cacheState.props.blockResolution.x,l=[];for(let p of e)l.push(...p.getLeavesIntersectingRegion(this.region,a));Tt(l);let c=this.computeSortedByLeafIds(l);if(c.length===0)return;let d=c.map(p=>p.getId()),u;if(this.renderingIsUpToDate(d))u=this.cachedRenderer.startRender();else{if(this.allChildrenCanRender(r,c)){for(let h of this.getChildren())h.renderItems(o,e,r);return}let p=0;for(let h of c)a(h.getBBox())||(p+=h.getContent().getProportionalRenderingTime());if(p>this.cacheState.props.minProportionalRenderTimePerCache){let h=!0;if(!this.cachedRenderer)this.cachedRenderer=this.cacheState.recordManager.allocCanvas(this.region,()=>this.onRegionDealloc());else if(c.length>this.renderedIds.length&&this.allRenderedIdsIn(d)&&this.renderedMaxZIndex!==null){let m=[],g=null;for(let v=0;v<c.length;v++){let b=c[v],f=b.getContent().getZIndex();(v>=this.renderedIds.length||b.getId()!==this.renderedIds[v])&&(m.push(b),(g===null||f<g)&&(g=f))}if(g!==null&&g>this.renderedMaxZIndex){h=!1,u=this.cachedRenderer.startRender();for(let v=0;v<l.length;v++){let b=l[v],y=b.getContent().getZIndex();y>this.renderedMaxZIndex&&(b.render(u,this.region),this.renderedMaxZIndex=y)}this.cacheState.debugMode&&o.drawRect(this.region,2*r.getSizeOfPixelOnCanvas(),{fill:L.clay})}}else this.cacheState.debugMode&&console.log("Decided on a full re-render. Reason: At least one of the following is false:",`
66
66
  leafIds.length > this.renderedIds.length: `,d.length>this.renderedIds.length,`
67
67
  this.allRenderedIdsIn(leafIds): `,this.allRenderedIdsIn(d),`
68
68
  this.renderedMaxZIndex !== null: `,this.renderedMaxZIndex!==null,`
69
69
 
70
- this.rerenderedIds: `,this.renderedIds,", leafIds: ",d);if(h){p=this.cachedRenderer.startRender(),p.clear(),this.renderedMaxZIndex=null;let m=En(l,this.region);for(let g=m;g<l.length;g++){let v=l[g],b=v.getContent();this.renderedMaxZIndex??=b.getZIndex(),this.renderedMaxZIndex=Math.max(this.renderedMaxZIndex,b.getZIndex()),v.render(p,this.region)}this.cacheState.debugMode&&o.drawRect(this.region,3*r.getSizeOfPixelOnCanvas(),{fill:L.red})}this.renderedIds=d}else{this.cachedRenderer?.dealloc();let h=r.getSizeOfPixelOnCanvas(),m=new B(this.region.x,this.region.y,this.region.w+h,this.region.h+h);o.startObject(m,!0);for(let v of l)v.render(o,this.region.intersection(r.visibleRect));o.endObject(),this.cacheState.debugMode&&o.drawRect(this.region,2*r.getSizeOfPixelOnCanvas(),{fill:L.green})}}if(p){let u=this.cachedRenderer.getTransform(this.region).inverse();o.renderFromOtherOfSameType(u,p)}this.instantiatedChildren.every(u=>u.isEmpty())&&(this.instantiatedChildren=[])}else for(let a of this.getChildren())a.renderItems(o,e.filter(l=>l.getBBox().intersects(a.region)),r);this.checkRep()}isEmpty(){return this.cachedRenderer!==null?!1:this.instantiatedChildren.every(o=>o.isEmpty())}onRegionDealloc(){this.cachedRenderer=null,this.isEmpty()&&(this.instantiatedChildren=[])}checkRep(){if(this.instantiatedChildren.length!==rt*rt&&this.instantiatedChildren.length!==0)throw new Error(`Repcheck: Wrong number of children. Got ${this.instantiatedChildren.length}`);if(this.renderedIds[1]!==void 0&&this.renderedIds[0]>=this.renderedIds[1])throw console.error(this.renderedIds),new Error("Repcheck: First two ids are not in ascending order!");for(let o of this.instantiatedChildren)if(o.parent!==this)throw new Error("Children should be linked to their parents!");if(this.cachedRenderer&&!this.cachedRenderer.isAllocd())throw new Error("this' cachedRenderer != null, but is dealloc'd")}};var Wo=class{constructor(o,e){this.onBeforeDeallocCallback=o;this.cacheState=e;this.allocd=!1;this.allocCount=0;this.renderer=e.props.createRenderer(),this.lastUsedCycle=-1,this.allocd=!0}startRender(){if(this.lastUsedCycle=this.cacheState.currentRenderingCycle,!this.allocd)throw new Error("Only alloc'd canvases can be rendered to");return this.renderer}dealloc(){this.onBeforeDeallocCallback?.(),this.allocd=!1,this.onBeforeDeallocCallback=null,this.lastUsedCycle=0}isAllocd(){return this.allocd}realloc(o){this.allocd&&this.dealloc(),this.allocd=!0,this.onBeforeDeallocCallback=o,this.lastUsedCycle=this.cacheState.currentRenderingCycle,this.allocCount++}getLastUsedCycle(){return this.lastUsedCycle}getTransform(o){return k.scaling2D(this.cacheState.props.blockResolution.x/o.size.x).rightMul(k.translation(o.topLeft.times(-1)))}setRenderingRegion(o){let e=this.getTransform(o);this.renderer.setTransform(e),this.renderer.overrideVisibleRect(o.grownBy(1/e.getScaleFactor()))}};var Kr=class{constructor(o){this.cacheRecords=[];this.maxCanvases=Math.ceil(o.cacheSize/4/o.blockResolution.x/o.blockResolution.y)}setSharedState(o){this.cacheState=o}allocCanvas(o,e){if(this.cacheRecords.length<this.maxCanvases){let r=new Wo(e,this.cacheState);return r.setRenderingRegion(o),this.cacheRecords.push(r),this.cacheState.debugMode&&console.log("[Cache] Cache spaces used: ",this.cacheRecords.length," of ",this.maxCanvases),r}else{let r=this.getLeastRecentlyUsedRecord();return this.cacheState.debugMode&&console.log("[Cache] Re-alloc. Times allocated: ",r.allocCount,`
70
+ this.rerenderedIds: `,this.renderedIds,", leafIds: ",d);if(h){u=this.cachedRenderer.startRender(),u.clear(),this.renderedMaxZIndex=null;let m=Ln(l,this.region);for(let g=m;g<l.length;g++){let v=l[g],b=v.getContent();this.renderedMaxZIndex??=b.getZIndex(),this.renderedMaxZIndex=Math.max(this.renderedMaxZIndex,b.getZIndex()),v.render(u,this.region)}this.cacheState.debugMode&&o.drawRect(this.region,3*r.getSizeOfPixelOnCanvas(),{fill:L.red})}this.renderedIds=d}else{this.cachedRenderer?.dealloc();let h=r.getSizeOfPixelOnCanvas(),m=new I(this.region.x,this.region.y,this.region.w+h,this.region.h+h);o.startObject(m,!0);for(let v of l)v.render(o,this.region.intersection(r.visibleRect));o.endObject(),this.cacheState.debugMode&&o.drawRect(this.region,2*r.getSizeOfPixelOnCanvas(),{fill:L.green})}}if(u){let p=this.cachedRenderer.getTransform(this.region).inverse();o.renderFromOtherOfSameType(p,u)}this.instantiatedChildren.every(p=>p.isEmpty())&&(this.instantiatedChildren=[])}else for(let a of this.getChildren())a.renderItems(o,e.filter(l=>l.getBBox().intersects(a.region)),r);this.checkRep()}isEmpty(){return this.cachedRenderer!==null?!1:this.instantiatedChildren.every(o=>o.isEmpty())}onRegionDealloc(){this.cachedRenderer=null,this.isEmpty()&&(this.instantiatedChildren=[])}checkRep(){if(this.instantiatedChildren.length!==rt*rt&&this.instantiatedChildren.length!==0)throw new Error(`Repcheck: Wrong number of children. Got ${this.instantiatedChildren.length}`);if(this.renderedIds[1]!==void 0&&this.renderedIds[0]>=this.renderedIds[1])throw console.error(this.renderedIds),new Error("Repcheck: First two ids are not in ascending order!");for(let o of this.instantiatedChildren)if(o.parent!==this)throw new Error("Children should be linked to their parents!");if(this.cachedRenderer&&!this.cachedRenderer.isAllocd())throw new Error("this' cachedRenderer != null, but is dealloc'd")}};var _o=class{constructor(o,e){this.onBeforeDeallocCallback=o;this.cacheState=e;this.allocd=!1;this.allocCount=0;this.renderer=e.props.createRenderer(),this.lastUsedCycle=-1,this.allocd=!0}startRender(){if(this.lastUsedCycle=this.cacheState.currentRenderingCycle,!this.allocd)throw new Error("Only alloc'd canvases can be rendered to");return this.renderer}dealloc(){this.onBeforeDeallocCallback?.(),this.allocd=!1,this.onBeforeDeallocCallback=null,this.lastUsedCycle=0}isAllocd(){return this.allocd}realloc(o){this.allocd&&this.dealloc(),this.allocd=!0,this.onBeforeDeallocCallback=o,this.lastUsedCycle=this.cacheState.currentRenderingCycle,this.allocCount++}getLastUsedCycle(){return this.lastUsedCycle}getTransform(o){return k.scaling2D(this.cacheState.props.blockResolution.x/o.size.x).rightMul(k.translation(o.topLeft.times(-1)))}setRenderingRegion(o){let e=this.getTransform(o);this.renderer.setTransform(e),this.renderer.overrideVisibleRect(o.grownBy(1/e.getScaleFactor()))}};var Zr=class{constructor(o){this.cacheRecords=[];this.maxCanvases=Math.ceil(o.cacheSize/4/o.blockResolution.x/o.blockResolution.y)}setSharedState(o){this.cacheState=o}allocCanvas(o,e){if(this.cacheRecords.length<this.maxCanvases){let r=new _o(e,this.cacheState);return r.setRenderingRegion(o),this.cacheRecords.push(r),this.cacheState.debugMode&&console.log("[Cache] Cache spaces used: ",this.cacheRecords.length," of ",this.maxCanvases),r}else{let r=this.getLeastRecentlyUsedRecord();return this.cacheState.debugMode&&console.log("[Cache] Re-alloc. Times allocated: ",r.allocCount,`
71
71
  Last used cycle: `,r.getLastUsedCycle(),`
72
72
  Current cycle: `,this.cacheState.currentRenderingCycle),r.realloc(e),r.setRenderingRegion(o),this.cacheState.debugMode&&(console.log("[Cache] Now re-alloc'd. Last used cycle: ",r.getLastUsedCycle()),console.assert(r.cacheState===this.cacheState,"[Cache] Unequal cache states! cacheState should be a shared object!")),r}}getLeastRecentlyUsedRecord(){return this.cacheRecords.sort((o,e)=>o.getLastUsedCycle()-e.getLastUsedCycle()),this.cacheRecords[0]}getDebugInfo(){let o=0,e=0;for(let n of this.cacheRecords)e+=n.allocCount,n.isAllocd()&&o++;return e/=Math.max(this.cacheRecords.length,1),[`${this.cacheRecords.length} cache records (max ${this.maxCanvases})`,`${o} assigned to screen regions`,`Average number of times reassigned: ${Math.round(e*100)/100}`].join(`
73
- `)}};var Ko=class{constructor(o){this.recordManager=new Kr(o),this.sharedState={props:o,currentRenderingCycle:0,recordManager:this.recordManager,debugMode:!1},this.recordManager.setSharedState(this.sharedState)}render(o,e,r){let n=r.visibleRect;if(this.sharedState.currentRenderingCycle++,!this.sharedState.props.isOfCorrectType(o)){e.render(o,n);return}if(!this.rootNode){let l=this.sharedState.props.blockResolution,c=n.topLeft;this.rootNode=new Uo(new B(c.x,c.y,l.x,l.y),this.sharedState)}for(;!this.rootNode.region.containsRect(n);)this.rootNode=this.rootNode.generateParent();this.rootNode=this.rootNode.smallestChildContaining(n)??this.rootNode;let i=e.getLeavesIntersectingRegion(r.visibleRect,l=>o.isTooSmallToRender(l)),a=0;for(let l of i)a+=l.getContent().getProportionalRenderingTime();a>this.sharedState.props.minProportionalRenderTimeToUseCache?this.rootNode.renderItems(o,[e],r):e.render(o,n)}getDebugInfo(){return this.recordManager.getDebugInfo()}setIsDebugMode(o){this.sharedState.debugMode=o}};var Go=class extends Le{constructor(e,r){super(e);this.localizationTable=r;this.descriptionBuilder=[];this.pathCount=0;this.textNodeCount=0;this.imageNodeCount=0}displaySize(){return w.of(500,500)}clear(){this.descriptionBuilder=[],this.pathCount=0,this.textNodeCount=0,this.imageNodeCount=0}getDescription(){return[this.localizationTable.pathNodeCount(this.pathCount),...this.textNodeCount>0?[this.localizationTable.textNodeCount(this.textNodeCount)]:[],...this.imageNodeCount>0?[this.localizationTable.imageNodeCount(this.imageNodeCount)]:[],...this.descriptionBuilder].join(`
74
- `)}beginPath(e){}endPath(e){this.pathCount++}lineTo(e){}moveTo(e){}traceCubicBezierCurve(e,r,n){}traceQuadraticBezierCurve(e,r){}drawText(e,r,n){this.descriptionBuilder.push(this.localizationTable.textNode(e)),this.textNodeCount++}drawImage(e){let r=e.label?this.localizationTable.imageNode(e.label):this.localizationTable.unlabeledImageNode;this.descriptionBuilder.push(r),this.imageNodeCount++}isTooSmallToRender(e){return e.maxDimension<15/this.getSizeOfCanvasPixelOnScreen()}drawPoints(...e){}};var Gr=(e=>(e[e.DummyRenderer=0]="DummyRenderer",e[e.CanvasRenderer=1]="CanvasRenderer",e))(Gr||{}),Ot=class{constructor(o,e,r){this.editor=o;this.parent=r;this.textRerenderOutput=null;this.devicePixelRatio=window.devicePixelRatio??1;this.getColorAt=o=>null;if(e===1)this.initializeCanvasRendering();else if(e===0)this.dryInkRenderer=new ot(o.viewport),this.wetInkRenderer=new ot(o.viewport);else throw new Error(`Unknown rendering mode, ${e}!`);this.textRenderer=new Go(o.viewport,o.localization),this.initializeTextRendering();let n=w.of(600,600);this.cache=new Ko({createRenderer:()=>{if(e===0)return new ot(o.viewport);if(e!==1)throw new Error("Unspported rendering mode");let i=document.createElement("canvas");i.width=n.x+1,i.height=n.y+1;let a=i.getContext("2d");return new Ie(a,o.viewport)},isOfCorrectType:i=>this.dryInkRenderer.canRenderFromWithoutDataLoss(i),blockResolution:n,cacheSize:600*600*4*90,maxScale:Math.max(1,1.3/window.devicePixelRatio),minProportionalRenderTimePerCache:20*4,minProportionalRenderTimeToUseCache:105*4}),this.editor.notifier.on(8,i=>{if(i.kind!==8)throw new Error("Mismatched event.kinds!");this.resizeSurfacesCallback?.()})}get width(){return this.dryInkRenderer.displaySize().x}get height(){return this.dryInkRenderer.displaySize().y}getCache(){return this.cache}initializeCanvasRendering(){let o=document.createElement("canvas"),e=document.createElement("canvas"),r=o.getContext("2d"),n=e.getContext("2d");this.dryInkRenderer=new Ie(r,this.editor.viewport),this.wetInkRenderer=new Ie(n,this.editor.viewport),o.className="dryInkCanvas",e.className="wetInkCanvas",this.parent&&(this.parent.appendChild(o),this.parent.appendChild(e)),this.resizeSurfacesCallback=()=>{let i=c=>Math.ceil(c.clientWidth*this.devicePixelRatio)||c.width,a=c=>Math.ceil(c.clientHeight*this.devicePixelRatio)||c.height,l=c=>a(c)!==c.height||i(c)!==c.width;(l(o)||l(e))&&(o.width=i(o),o.height=a(o),e.width=i(e),e.height=a(e),n.resetTransform(),r.resetTransform(),r.scale(this.devicePixelRatio,this.devicePixelRatio),n.scale(this.devicePixelRatio,this.devicePixelRatio),this.editor.notifier.dispatch(8,{kind:8,newSize:w.of(this.width,this.height)}))},this.resizeSurfacesCallback(),this.flattenCallback=()=>{r.save(),r.resetTransform(),r.drawImage(e,0,0),r.restore()},this.getColorAt=i=>{let a=i.times(this.devicePixelRatio),c=r.getImageData(a.x,a.y,1,1)?.data;return c?L.ofRGBA(c[0]/255,c[1]/255,c[2]/255,c[3]/255):null}}initializeTextRendering(){let o=document.createElement("div");o.classList.add("textRendererOutputContainer");let e=document.createElement("button");e.classList.add("rerenderButton"),e.innerText=this.editor.localization.rerenderAsText,this.textRerenderOutput=document.createElement("div"),this.textRerenderOutput.setAttribute("aria-live","polite"),e.onclick=()=>{this.rerenderAsText()},o.replaceChildren(e,this.textRerenderOutput),this.editor.createHTMLOverlay(o)}setDevicePixelRatio(o){if(isFinite(o)&&o>=.001&&o<=10&&o!==this.devicePixelRatio)return this.devicePixelRatio=o,this.resizeSurfacesCallback?.(),this.editor.queueRerender()}getDevicePixelRatio(){return this.devicePixelRatio}rerenderAsText(){this.textRenderer.clear(),this.editor.image.render(this.textRenderer,this.editor.viewport),this.textRerenderOutput&&(this.textRerenderOutput.innerText=this.textRenderer.getDescription())}startRerender(){return this.resizeSurfacesCallback?.(),this.dryInkRenderer.clear(),this.dryInkRenderer}setDraftMode(o){this.dryInkRenderer.setDraftMode(o)}getDryInkRenderer(){return this.dryInkRenderer}getWetInkRenderer(){return this.wetInkRenderer}flatten(){this.flattenCallback?.()}};var ft=ro((s,o)=>{let e=o.getSizeOfPixelOnCanvas()*.75;return new jr(s,e,o)}),jr=class{constructor(o,e,r){this.minFitAllowed=e;this.viewport=r;this.parts=[];this.widthAverageNumSamples=1;this.lastLineSegment=null;this.averageWidth=o.width,this.startPoint={...o,pos:this.roundPoint(o.pos)},this.lastPoint=this.startPoint.pos,this.bbox=new B(this.startPoint.pos.x,this.startPoint.pos.y,0,0),this.parts=[{kind:1,point:this.startPoint.pos}]}getBBox(){return this.bbox.grownBy(this.averageWidth)}getRenderingStyle(){return{fill:L.transparent,stroke:{color:this.startPoint.color,width:this.roundDistance(this.averageWidth)}}}previewCurrentPath(){let o=this.startPoint.pos,e=[...this.parts];return e.length<=1&&e.push({kind:0,point:o.plus(w.of(this.averageWidth/4,0))}),{startPoint:o,commands:e,style:this.getRenderingStyle()}}previewFullPath(){return[this.previewCurrentPath()]}preview(o){let e=this.previewFullPath();if(e){let r=this.viewport.visibleRect;o.startObject(r);for(let n of e)o.drawPath(n);o.endObject()}}build(){return new ee(this.previewFullPath())}getMinFit(){let o=Math.min(this.minFitAllowed,this.averageWidth/4);return o<1e-10&&(o=this.minFitAllowed),o}roundPoint(o){let e=this.getMinFit();return $.roundPoint(o,e)}roundDistance(o){let e=this.getMinFit();return $.roundPoint(o,e)}addPoint(o){this.widthAverageNumSamples++,this.averageWidth=this.averageWidth*(this.widthAverageNumSamples-1)/this.widthAverageNumSamples+o.width/this.widthAverageNumSamples;let e=this.roundPoint(o.pos);e.eq(this.lastPoint)||(this.lastLineSegment&&this.lastLineSegment.direction.dot(e.minus(this.lastPoint).normalized())>.997&&(this.parts.pop(),this.lastPoint=this.lastLineSegment.p1),this.parts.push({kind:0,point:this.roundPoint(o.pos)}),this.bbox=this.bbox.grownToPoint(e),this.lastLineSegment=new ce(this.lastPoint,e),this.lastPoint=e)}};var qa=(s,o,e="html")=>{let r;if(e==="html")r=document.createElement(s);else if(e==="svg")r=document.createElementNS("http://www.w3.org/2000/svg",s);else throw new Error(`Unknown element type ${e}`);for(let[n,i]of Object.entries(o))if(n!=="children"){if(typeof i!="string"&&typeof i!="number")throw new Error(`Unsupported value type ${typeof i}`);r.setAttribute(n,i.toString())}if(o.children)for(let n of o.children)r.appendChild(n);return r},je=(s,o)=>qa(s,o,"svg"),qr=(s,o)=>o.map(e=>je(s,e)),_r=(...s)=>qr("path",s);var ne="http://www.w3.org/2000/svg",_a=0,Zr=()=>{let s=`checkerboard-${_a++}`,o=je("pattern",{id:s,viewBox:"0,0,10,10",width:"20%",height:"20%",patternUnits:"userSpaceOnUse",children:qr("rect",[{x:0,y:0,width:10,height:10,fill:"white"},{x:0,y:0,width:5,height:5,fill:"gray"},{x:5,y:5,width:5,height:5,fill:"gray"}])}),e=`url(#${s})`;return{patternDefElement:o,get patternDef(){return o.innerHTML},patternRef:e}},ys=s=>{let o=document.createElementNS(ne,"svg");o.innerHTML=`
73
+ `)}};var qo=class{constructor(o){this.recordManager=new Zr(o),this.sharedState={props:o,currentRenderingCycle:0,recordManager:this.recordManager,debugMode:!1},this.recordManager.setSharedState(this.sharedState)}render(o,e,r){let n=r.visibleRect;if(this.sharedState.currentRenderingCycle++,!this.sharedState.props.isOfCorrectType(o)){e.render(o,n);return}if(!this.rootNode){let l=this.sharedState.props.blockResolution,c=n.topLeft;this.rootNode=new jo(new I(c.x,c.y,l.x,l.y),this.sharedState)}for(;!this.rootNode.region.containsRect(n);)this.rootNode=this.rootNode.generateParent();this.rootNode=this.rootNode.smallestChildContaining(n)??this.rootNode;let i=e.getLeavesIntersectingRegion(r.visibleRect,l=>o.isTooSmallToRender(l)),a=0;for(let l of i)a+=l.getContent().getProportionalRenderingTime();a>this.sharedState.props.minProportionalRenderTimeToUseCache?this.rootNode.renderItems(o,[e],r):e.render(o,n)}getDebugInfo(){return this.recordManager.getDebugInfo()}setIsDebugMode(o){this.sharedState.debugMode=o}};var Zo=class extends ze{constructor(e,r){super(e);this.localizationTable=r;this.descriptionBuilder=[];this.pathCount=0;this.textNodeCount=0;this.imageNodeCount=0}displaySize(){return w.of(500,500)}clear(){this.descriptionBuilder=[],this.pathCount=0,this.textNodeCount=0,this.imageNodeCount=0}getDescription(){return[this.localizationTable.pathNodeCount(this.pathCount),...this.textNodeCount>0?[this.localizationTable.textNodeCount(this.textNodeCount)]:[],...this.imageNodeCount>0?[this.localizationTable.imageNodeCount(this.imageNodeCount)]:[],...this.descriptionBuilder].join(`
74
+ `)}beginPath(e){}endPath(e){this.pathCount++}lineTo(e){}moveTo(e){}traceCubicBezierCurve(e,r,n){}traceQuadraticBezierCurve(e,r){}drawText(e,r,n){this.descriptionBuilder.push(this.localizationTable.textNode(e)),this.textNodeCount++}drawImage(e){let r=e.label?this.localizationTable.imageNode(e.label):this.localizationTable.unlabeledImageNode;this.descriptionBuilder.push(r),this.imageNodeCount++}isTooSmallToRender(e){return e.maxDimension<15/this.getSizeOfCanvasPixelOnScreen()}drawPoints(...e){}};var Yr=(e=>(e[e.DummyRenderer=0]="DummyRenderer",e[e.CanvasRenderer=1]="CanvasRenderer",e))(Yr||{}),Nt=class{constructor(o,e,r){this.editor=o;this.parent=r;this.textRerenderOutput=null;this.devicePixelRatio=window.devicePixelRatio??1;this.getColorAt=o=>null;if(e===1)this.initializeCanvasRendering();else if(e===0)this.dryInkRenderer=new ot(o.viewport),this.wetInkRenderer=new ot(o.viewport);else throw new Error(`Unknown rendering mode, ${e}!`);this.textRenderer=new Zo(o.viewport,o.localization),this.initializeTextRendering();let n=w.of(600,600);this.cache=new qo({createRenderer:()=>{if(e===0)return new ot(o.viewport);if(e!==1)throw new Error("Unspported rendering mode");let i=document.createElement("canvas");i.width=n.x+1,i.height=n.y+1;let a=i.getContext("2d");return new Le(a,o.viewport)},isOfCorrectType:i=>this.dryInkRenderer.canRenderFromWithoutDataLoss(i),blockResolution:n,cacheSize:600*600*4*90,maxScale:Math.max(1,1.3/window.devicePixelRatio),minProportionalRenderTimePerCache:20*4,minProportionalRenderTimeToUseCache:105*4}),this.editor.notifier.on(8,i=>{if(i.kind!==8)throw new Error("Mismatched event.kinds!");this.resizeSurfacesCallback?.()})}get width(){return this.dryInkRenderer.displaySize().x}get height(){return this.dryInkRenderer.displaySize().y}getCache(){return this.cache}initializeCanvasRendering(){let o=document.createElement("canvas"),e=document.createElement("canvas"),r=o.getContext("2d"),n=e.getContext("2d");this.dryInkRenderer=new Le(r,this.editor.viewport),this.wetInkRenderer=new Le(n,this.editor.viewport),o.className="dryInkCanvas",e.className="wetInkCanvas",this.parent&&(this.parent.appendChild(o),this.parent.appendChild(e)),this.resizeSurfacesCallback=()=>{let i=c=>Math.ceil(c.clientWidth*this.devicePixelRatio)||c.width,a=c=>Math.ceil(c.clientHeight*this.devicePixelRatio)||c.height,l=c=>a(c)!==c.height||i(c)!==c.width;(l(o)||l(e))&&(o.width=i(o),o.height=a(o),e.width=i(e),e.height=a(e),n.resetTransform(),r.resetTransform(),r.scale(this.devicePixelRatio,this.devicePixelRatio),n.scale(this.devicePixelRatio,this.devicePixelRatio),this.editor.notifier.dispatch(8,{kind:8,newSize:w.of(this.width,this.height)}))},this.resizeSurfacesCallback(),this.flattenCallback=()=>{r.save(),r.resetTransform(),r.drawImage(e,0,0),r.restore()},this.getColorAt=i=>{let a=i.times(this.devicePixelRatio),c=r.getImageData(a.x,a.y,1,1)?.data;return c?L.ofRGBA(c[0]/255,c[1]/255,c[2]/255,c[3]/255):null}}initializeTextRendering(){let o=document.createElement("div");o.classList.add("textRendererOutputContainer");let e=document.createElement("button");e.classList.add("rerenderButton"),e.innerText=this.editor.localization.rerenderAsText,this.textRerenderOutput=document.createElement("div"),this.textRerenderOutput.setAttribute("aria-live","polite"),e.onclick=()=>{this.rerenderAsText()},o.replaceChildren(e,this.textRerenderOutput),this.editor.createHTMLOverlay(o)}setDevicePixelRatio(o){if(isFinite(o)&&o>=.001&&o<=10&&o!==this.devicePixelRatio)return this.devicePixelRatio=o,this.resizeSurfacesCallback?.(),this.editor.queueRerender()}getDevicePixelRatio(){return this.devicePixelRatio}rerenderAsText(){this.textRenderer.clear(),this.editor.image.render(this.textRenderer,this.editor.viewport),this.textRerenderOutput&&(this.textRerenderOutput.innerText=this.textRenderer.getDescription())}startRerender(){return this.resizeSurfacesCallback?.(),this.dryInkRenderer.clear(),this.dryInkRenderer}setDraftMode(o){this.dryInkRenderer.setDraftMode(o)}getDryInkRenderer(){return this.dryInkRenderer}getWetInkRenderer(){return this.wetInkRenderer}flatten(){this.flattenCallback?.()}};var ft=so((s,o)=>{let e=o.getSizeOfPixelOnCanvas()*.75;return new Xr(s,e,o)}),Xr=class{constructor(o,e,r){this.minFitAllowed=e;this.viewport=r;this.parts=[];this.widthAverageNumSamples=1;this.lastLineSegment=null;this.averageWidth=o.width,this.startPoint={...o,pos:this.roundPoint(o.pos)},this.lastPoint=this.startPoint.pos,this.bbox=new I(this.startPoint.pos.x,this.startPoint.pos.y,0,0),this.parts=[{kind:1,point:this.startPoint.pos}]}getBBox(){return this.bbox.grownBy(this.averageWidth)}getRenderingStyle(){return{fill:L.transparent,stroke:{color:this.startPoint.color,width:this.roundDistance(this.averageWidth)}}}previewCurrentPath(){let o=this.startPoint.pos,e=[...this.parts];return e.length<=1&&e.push({kind:0,point:o.plus(w.of(this.averageWidth/4,0))}),{startPoint:o,commands:e,style:this.getRenderingStyle()}}previewFullPath(){return[this.previewCurrentPath()]}preview(o){let e=this.previewFullPath();if(e){let r=this.viewport.visibleRect;o.startObject(r);for(let n of e)o.drawPath(n);o.endObject()}}build(){return new ee(this.previewFullPath())}getMinFit(){let o=Math.min(this.minFitAllowed,this.averageWidth/4);return o<1e-10&&(o=this.minFitAllowed),o}roundPoint(o){let e=this.getMinFit();return U.roundPoint(o,e)}roundDistance(o){let e=this.getMinFit();return U.roundPoint(o,e)}addPoint(o){this.widthAverageNumSamples++,this.averageWidth=this.averageWidth*(this.widthAverageNumSamples-1)/this.widthAverageNumSamples+o.width/this.widthAverageNumSamples;let e=this.roundPoint(o.pos);e.eq(this.lastPoint)||(this.lastLineSegment&&this.lastLineSegment.direction.dot(e.minus(this.lastPoint).normalized())>.997&&(this.parts.pop(),this.lastPoint=this.lastLineSegment.p1),this.parts.push({kind:0,point:this.roundPoint(o.pos)}),this.bbox=this.bbox.grownToPoint(e),this.lastLineSegment=new ue(this.lastPoint,e),this.lastPoint=e)}};var Ja=(s,o,e="html")=>{let r;if(e==="html")r=document.createElement(s);else if(e==="svg")r=document.createElementNS("http://www.w3.org/2000/svg",s);else throw new Error(`Unknown element type ${e}`);for(let[n,i]of Object.entries(o))if(n!=="children"){if(typeof i!="string"&&typeof i!="number")throw new Error(`Unsupported value type ${typeof i}`);r.setAttribute(n,i.toString())}if(o.children)for(let n of o.children)r.appendChild(n);return r},je=(s,o)=>Ja(s,o,"svg"),Qr=(s,o)=>o.map(e=>je(s,e)),Jr=(...s)=>Qr("path",s);var ie="http://www.w3.org/2000/svg",el=0,en=()=>{let s=`checkerboard-${el++}`,o=je("pattern",{id:s,viewBox:"0,0,10,10",width:"20%",height:"20%",patternUnits:"userSpaceOnUse",children:Qr("rect",[{x:0,y:0,width:10,height:10,fill:"white"},{x:0,y:0,width:5,height:5,fill:"gray"},{x:5,y:5,width:5,height:5,fill:"gray"}])}),e=`url(#${s})`;return{patternDefElement:o,get patternDef(){return o.innerHTML},patternRef:e}},Ss=s=>{let o=document.createElementNS(ie,"svg");o.innerHTML=`
75
75
  <style>
76
76
  .toolbar-svg-undo-redo-icon {
77
77
  stroke: var(--icon-color);
@@ -83,7 +83,7 @@ Current cycle: `,this.cacheState.currentRenderingCycle),r.realloc(e),r.setRender
83
83
  transform-origin: center;
84
84
  }
85
85
  </style>
86
- `;let e=document.createElementNS(ne,"path");return e.setAttribute("d","M20,20 A15,15 0 0 1 70,80 L80,90 L60,70 L65,90 L87,90 L65,80"),e.classList.add("toolbar-svg-undo-redo-icon"),s&&(e.style.transform="scale(-1, 1)"),o.appendChild(e),o.setAttribute("viewBox","0 0 100 100"),o},Ft=class{makeUndoIcon(){return ys(!0)}makeRedoIcon(){return ys(!1)}makeDropdownIcon(){let o=this.makeIconFromPath("M5,10 L50,90 L95,10 Z");return o.setAttribute("viewBox","-10 -10 110 110"),o}makeEraserIcon(o,e){o??=10;let r=o/4,n="#ff70af";return je("svg",{viewBox:"0 0 120 120",children:[je("defs",{children:[je("linearGradient",{id:"dash-pattern",children:qr("stop",[{offset:"80%","stop-color":n},{offset:"85%","stop-color":"white"},{offset:"90%","stop-color":n}])})]}),je("path",{fill:e==="partial-stroke"?"url(#dash-pattern)":n,stroke:"black",transform:"rotate(41.35)",d:`
86
+ `;let e=document.createElementNS(ie,"path");return e.setAttribute("d","M20,20 A15,15 0 0 1 70,80 L80,90 L60,70 L65,90 L87,90 L65,80"),e.classList.add("toolbar-svg-undo-redo-icon"),s&&(e.style.transform="scale(-1, 1)"),o.appendChild(e),o.setAttribute("viewBox","0 0 100 100"),o},$t=class{makeUndoIcon(){return Ss(!0)}makeRedoIcon(){return Ss(!1)}makeDropdownIcon(){let o=this.makeIconFromPath("M5,10 L50,90 L95,10 Z");return o.setAttribute("viewBox","-10 -10 110 110"),o}makeEraserIcon(o,e){o??=10;let r=o/4,n="#ff70af";return je("svg",{viewBox:"0 0 120 120",children:[je("defs",{children:[je("linearGradient",{id:"dash-pattern",children:Qr("stop",[{offset:"80%","stop-color":n},{offset:"85%","stop-color":"white"},{offset:"90%","stop-color":n}])})]}),je("path",{fill:e==="partial-stroke"?"url(#dash-pattern)":n,stroke:"black",transform:"rotate(41.35)",d:`
87
87
  M 52.5 27
88
88
  C 50 28.9 48.9 31.7 48.9 34.8
89
89
  L 48.9 39.8
@@ -98,12 +98,17 @@ Current cycle: `,this.cacheState.currentRenderingCycle),r.realloc(e),r.setRender
98
98
  L 58.9 24.8
99
99
  C 56.5 24.8 54.3 25.7 52.5 27
100
100
  z
101
- `}),je("rect",{stroke:"#cc8077",fill:"var(--icon-color)",width:65,height:75,x:48.9,y:-38.7,transform:"rotate(41.35)"})]})}makeSelectionIcon(){let o=document.createElementNS(ne,"svg");return o.innerHTML=`
102
- <g>
103
- <rect x="10" y="10" width="70" height="70" fill="pink" stroke="black"/>
104
- <rect x="75" y="75" width="10" height="10" fill="white" stroke="black"/>
105
- </g>
106
- `,o.setAttribute("viewBox","0 0 100 100"),o}makeRotateIcon(){let o=document.createElementNS(ne,"svg");return o.innerHTML=`
101
+ `}),je("rect",{stroke:"#cc8077",fill:"var(--icon-color)",width:65,height:75,x:48.9,y:-38.7,transform:"rotate(41.35)"})]})}makeSelectionIcon(o="rect"){let e=document.createElementNS(ie,"svg");return o==="rect"?e.innerHTML=`
102
+ <g>
103
+ <rect x="10" y="10" width="70" height="70" fill="pink" stroke="black" stroke-dasharray="32 9"/>
104
+ <rect x="75" y="75" width="10" height="10" fill="white" stroke="black"/>
105
+ </g>
106
+ `:e.innerHTML=`
107
+ <g>
108
+ <rect x="10" y="10" width="76" height="76" rx="50" stroke-dasharray="32 9" fill="pink" stroke="black"/>
109
+ <rect x="71" y="71" width="10" height="10" fill="white" stroke="black"/>
110
+ </g>
111
+ `,e.setAttribute("viewBox","0 0 100 100"),e}makeRotateIcon(){let o=document.createElementNS(ie,"svg");return o.innerHTML=`
107
112
  <defs>
108
113
  <marker
109
114
  id="arrow-marker"
@@ -235,7 +240,7 @@ Current cycle: `,this.cacheState.currentRenderingCycle),r.realloc(e),r.setRender
235
240
  L 17.5 55
236
241
  L 5 42.5
237
242
  z
238
- `,"none","var(--icon-color)","3")}makeZoomIcon(){let o=document.createElementNS(ne,"svg");o.setAttribute("viewBox","0 0 100 100");let e=(r,n,i)=>{let a=document.createElementNS(ne,"text");a.appendChild(document.createTextNode(r)),a.setAttribute("x",n.toString()),a.setAttribute("y",i.toString()),a.style.textAlign="center",a.style.textAnchor="middle",a.style.fontSize="55px",a.style.fill="var(--icon-color)",a.style.fontFamily="monospace",o.appendChild(a)};return e("+",40,45),e("-",70,75),o}makeRotationLockIcon(){let o=this.makeIconFromPath(`
243
+ `,"none","var(--icon-color)","3")}makeZoomIcon(){let o=document.createElementNS(ie,"svg");o.setAttribute("viewBox","0 0 100 100");let e=(r,n,i)=>{let a=document.createElementNS(ie,"text");a.appendChild(document.createTextNode(r)),a.setAttribute("x",n.toString()),a.setAttribute("y",i.toString()),a.style.textAlign="center",a.style.textAnchor="middle",a.style.fontSize="55px",a.style.fill="var(--icon-color)",a.style.fontFamily="monospace",o.appendChild(a)};return e("+",40,45),e("-",70,75),o}makeRotationLockIcon(){let o=this.makeIconFromPath(`
239
244
  M 40.1 25.1
240
245
  C 32.5 25 27.9 34.1 27.9 34.1
241
246
  L 25.7 30
@@ -282,7 +287,7 @@ Current cycle: `,this.cacheState.currentRenderingCycle),r.realloc(e),r.setRender
282
287
  L 53,33 64,34 Z
283
288
 
284
289
  M 8,66 V 86 H 88 V 66 H 78 V 76 H 18 V 66 Z
285
- `)}makeTextIcon(o){let e=document.createElementNS(ne,"svg");e.setAttribute("viewBox","0 0 100 100");let r=document.createElementNS(ne,"text");return r.appendChild(document.createTextNode("T")),r.style.fontFamily=o.fontFamily,r.style.fontWeight=o.fontWeight??"",r.style.fontVariant=o.fontVariant??"",r.style.fill=o.renderingStyle.fill.toHexString(),r.style.textAnchor="middle",r.setAttribute("x","50"),r.setAttribute("y","75"),r.style.fontSize="65px",r.style.filter="drop-shadow(0px 0px 10px var(--shadow-color))",e.appendChild(r),e}makePenIcon(o){let e=Math.round(Math.sqrt(o.thickness)*4),r=o.color,n=this.isRoundedTipPen(o),i=e/2,a=`
290
+ `)}makeTextIcon(o){let e=document.createElementNS(ie,"svg");e.setAttribute("viewBox","0 0 100 100");let r=document.createElementNS(ie,"text");return r.appendChild(document.createTextNode("T")),r.style.fontFamily=o.fontFamily,r.style.fontWeight=o.fontWeight??"",r.style.fontVariant=o.fontVariant??"",r.style.fill=o.renderingStyle.fill.toHexString(),r.style.textAnchor="middle",r.setAttribute("x","50"),r.setAttribute("y","75"),r.style.fontSize="65px",r.style.filter="drop-shadow(0px 0px 10px var(--shadow-color))",e.appendChild(r),e}makePenIcon(o){let e=Math.round(Math.sqrt(o.thickness)*4),r=o.color,n=this.isRoundedTipPen(o),i=e/2,a=`
286
291
  M ${15-i},${80-i}
287
292
  ${15-i},${80+i}
288
293
  30,83
@@ -297,7 +302,7 @@ Current cycle: `,this.cacheState.currentRenderingCycle),r.realloc(e),r.setRender
297
302
  M 72.45,35.67
298
303
  A 10,15 41.8 0 1 55,40.2 10,15 41.8 0 1 57.55,22.3 10,15 41.8 0 1 75,17.8 10,15 41.8 0 1 72.5,35.67
299
304
  Z
300
- `,p="M 85,-25 25,35 h 10 v 10 h 10 v 10 h 10 v 10 h 10 l -5,10 60,-60 z",u="M 25,35 H 35 L 90,-15 85,-25 Z",h="M 60,75 65,65 H 55 l 55,-55 10,5 z";n&&(p="M 85,-25 25,35 c 15,0 40,30 35,40 l 60,-60 z",u="m 25,35 c 3.92361,0.384473 7.644275,0.980572 10,3 l 55,-53 -5,-10 z",h="M 60,75 C 61,66 59,65 56,59 l 54,-54 10,10 z");let m=`M 25,35 ${10-i/4},${70-i/2} 20,75 25,85 60,75 70,55 45,25 Z`,v=L.fromHex("#f4d7d7").mix(r,i/40-.1).toHexString(),b=Zr(),y=r.toHexString(),f=_r({fill:b.patternRef,d:a},{fill:b.patternRef,d:c},{fill:y,d:a},{fill:y,d:c}),T=_r({fill:b.patternRef,d:m},{fill:v,stroke:y,d:m}),P=_r({fill:"var(--icon-color)",stroke:"var(--icon-color)",d:p},{fill:"rgba(150, 150, 150, 0.3)",d:u},{fill:"rgba(100, 100, 100, 0.2)",d:h},{fill:b.patternRef,d},{fill:y,d}),S=document.createElementNS(ne,"svg");S.setAttribute("viewBox","0 0 100 100");let E=je("g",{children:[f,T,P].flat()}),C=je("defs",{children:[b.patternDefElement]});return S.replaceChildren(C,E),S}makeIconFromFactory(o){let e=Math.sqrt(o.thickness)*3,r=performance.now(),n={pos:w.of(10,10),width:e,color:o.color,time:r-100},i={pos:w.of(90,90),width:e,color:o.color,time:r},a=new $(()=>{}),l=o.factory(n,a);l.addPoint(i);let c=document.createElementNS(ne,"svg");c.setAttribute("viewBox","0 0 100 100"),a.updateScreenSize(w.of(100,100));let d;if(o.color.a<1){let h=Zr(),m=document.createElementNS(ne,"defs");m.appendChild(h.patternDefElement),c.appendChild(m);let g=document.createElementNS(ne,"g");c.appendChild(g),d=new class extends me{constructor(){super(c,a)}addPathToSVG(){let v=super.addPathToSVG();if(v){let b=v.cloneNode(!0);b.style.zIndex="-1",b.hasAttribute("stroke")?b.setAttribute("stroke",h.patternRef):b.hasAttribute("fill")&&b.setAttribute("fill",h.patternRef),g.appendChild(b)}return v}}}else d=new me(c,a);l.preview(d);let u=l.getBBox();return c.setAttribute("viewBox",`${u.x} ${u.y} ${u.w} ${u.h}`),c}makePipetteIcon(o){let e=document.createElementNS(ne,"svg"),r=document.createElementNS(ne,"g");r.style.rotate="45deg",r.style.transformOrigin="center";let n=document.createElementNS(ne,"g");if(n.innerHTML=`
305
+ `,u="M 85,-25 25,35 h 10 v 10 h 10 v 10 h 10 v 10 h 10 l -5,10 60,-60 z",p="M 25,35 H 35 L 90,-15 85,-25 Z",h="M 60,75 65,65 H 55 l 55,-55 10,5 z";n&&(u="M 85,-25 25,35 c 15,0 40,30 35,40 l 60,-60 z",p="m 25,35 c 3.92361,0.384473 7.644275,0.980572 10,3 l 55,-53 -5,-10 z",h="M 60,75 C 61,66 59,65 56,59 l 54,-54 10,10 z");let m=`M 25,35 ${10-i/4},${70-i/2} 20,75 25,85 60,75 70,55 45,25 Z`,v=L.fromHex("#f4d7d7").mix(r,i/40-.1).toHexString(),b=en(),y=r.toHexString(),f=Jr({fill:b.patternRef,d:a},{fill:b.patternRef,d:c},{fill:y,d:a},{fill:y,d:c}),T=Jr({fill:b.patternRef,d:m},{fill:v,stroke:y,d:m}),P=Jr({fill:"var(--icon-color)",stroke:"var(--icon-color)",d:u},{fill:"rgba(150, 150, 150, 0.3)",d:p},{fill:"rgba(100, 100, 100, 0.2)",d:h},{fill:b.patternRef,d},{fill:y,d}),S=document.createElementNS(ie,"svg");S.setAttribute("viewBox","0 0 100 100");let E=je("g",{children:[f,T,P].flat()}),C=je("defs",{children:[b.patternDefElement]});return S.replaceChildren(C,E),S}makeIconFromFactory(o){let e=Math.sqrt(o.thickness)*3,r=performance.now(),n={pos:w.of(10,10),width:e,color:o.color,time:r-100},i={pos:w.of(90,90),width:e,color:o.color,time:r},a=new U(()=>{}),l=o.factory(n,a);l.addPoint(i);let c=document.createElementNS(ie,"svg");c.setAttribute("viewBox","0 0 100 100"),a.updateScreenSize(w.of(100,100));let d;if(o.color.a<1){let h=en(),m=document.createElementNS(ie,"defs");m.appendChild(h.patternDefElement),c.appendChild(m);let g=document.createElementNS(ie,"g");c.appendChild(g),d=new class extends me{constructor(){super(c,a)}addPathToSVG(){let v=super.addPathToSVG();if(v){let b=v.cloneNode(!0);b.style.zIndex="-1",b.hasAttribute("stroke")?b.setAttribute("stroke",h.patternRef):b.hasAttribute("fill")&&b.setAttribute("fill",h.patternRef),g.appendChild(b)}return v}}}else d=new me(c,a);l.preview(d);let p=l.getBBox();return c.setAttribute("viewBox",`${p.x} ${p.y} ${p.w} ${p.h}`),c}makePipetteIcon(o){let e=document.createElementNS(ie,"svg"),r=document.createElementNS(ie,"g");r.style.rotate="45deg",r.style.transformOrigin="center";let n=document.createElementNS(ie,"g");if(n.innerHTML=`
301
306
  <path
302
307
  style="fill: var(--icon-color); stroke-linecap:round; stroke-linejoin:round;"
303
308
  d="
@@ -323,7 +328,7 @@ Current cycle: `,this.cacheState.currentRenderingCycle),r.realloc(e),r.setRender
323
328
  style="fill: var(--icon-color);"
324
329
  d="m 45,-25 c -5.54,0 -11,4.26 -11,9 V 0 h 22 v -16 c 0,-4.74 -5.46,-9 -11,-9 z"
325
330
  />
326
- `,o){let i=Zr(),a=document.createElementNS(ne,"defs");a.appendChild(i.patternDefElement),e.appendChild(a);let l=document.createElementNS(ne,"path"),c=document.createElementNS(ne,"path"),d=`
331
+ `,o){let i=en(),a=document.createElementNS(ie,"defs");a.appendChild(i.patternDefElement),e.appendChild(a);let l=document.createElementNS(ie,"path"),c=document.createElementNS(ie,"path"),d=`
327
332
  M 35,36 H 55 V 78.678012 83 L 45,87 35,83 Z
328
333
  `;c.setAttribute("d",d),l.setAttribute("d",d),c.style.fill=o.toHexString(),l.style.fill=i.patternRef,r.appendChild(l),r.appendChild(c)}return r.appendChild(n),e.appendChild(r),e.setAttribute("viewBox","5 -40 140 140"),e}makeShapeAutocorrectIcon(){return this.makeIconFromPath(`
329
334
  m 79.129476,33.847107 9.967823,-0.03218 v 55 h -55 l 0.03218,-9.96782
@@ -434,11 +439,11 @@ Current cycle: `,this.cacheState.currentRenderingCycle),r.realloc(e),r.setRender
434
439
  cy="21.32"
435
440
  r="1.9"
436
441
  />
437
- `,o.setAttribute("viewBox","0 0 26.46 26.46"),o.setAttribute("width","100"),o.setAttribute("height","100"),o}makeIconFromPath(o,e="var(--icon-color)",r="none",n="0px"){let i=document.createElementNS(ne,"svg"),a=document.createElementNS(ne,"path");return a.setAttribute("d",o),a.style.fill=e,a.style.stroke=r,a.style.strokeWidth=n,i.appendChild(a),i.setAttribute("viewBox","0 0 100 100"),i}makeCheckerboardPattern(){return Zr()}isRoundedTipPen(o){return o.factory===Qe||o.factory===ft}isPolylinePen(o){return o.factory===ft}licenseInfo(){return null}};var Za=s=>{let o=0,e=s.map(r=>r.id);e.sort();for(let r of e)o===r&&(o=r+1);return o},Yr=Za;var Ya=(s,o,e,r,n=0)=>{let i=Yr(r??[]),a=Re.ofCanvasPoint(e,o!==2,s.viewport,i,n);return s.toolController.dispatchInputEvent({kind:o,allPointers:r??[a],current:a}),a},Xr=Ya;var M="toolbar-";var gi=class{constructor(o,e,r){this.parent=o;this.notifier=e;this.onDestroy=r;this.dropdownToggleListener=null;this.hideDropdownTimeout=null;this.visible=j.fromInitialValue(!1),this.dropdownContainer=document.createElement("div"),this.dropdownContainer.classList.add(`${M}dropdown`),this.dropdownContainer.classList.add("hidden"),o.target.insertAdjacentElement("afterend",this.dropdownContainer),this.dropdownToggleListener=this.notifier.on(0,n=>{n.dropdown!==this&&n.fromToplevelDropdown&&this.setVisible(!1)})}onActivated(){}repositionDropdown(){let o=this.dropdownContainer.getBoundingClientRect(),e=document.scrollingElement?.clientWidth??document.body.clientHeight,r=document.scrollingElement?.clientHeight??document.body.clientHeight,n,i;o.left>e/2&&(n=`calc(${this.parent.target.clientWidth+"px"} - 100%)`),o.bottom>r&&o.top-o.height>0&&(i=`calc(-${this.parent.target.clientHeight}px - 100%)`),n||i?this.dropdownContainer.style.translate=`${n??"0"} ${i??"0"}`:this.dropdownContainer.style.translate=""}setVisible(o){if(this.visible.get()===o)return;this.hideDropdownTimeout&&(clearTimeout(this.hideDropdownTimeout),this.hideDropdownTimeout=null,this.dropdownContainer.classList.remove("hiding"),this.repositionDropdown());let r=150;if(this.visible.set(o),o)this.dropdownContainer.classList.remove("hidden"),this.notifier.dispatch(0,{dropdown:this,fromToplevelDropdown:this.parent.isToplevel()}),this.repositionDropdown();else{this.notifier.dispatch(1,{dropdown:this,fromToplevelDropdown:this.parent.isToplevel()}),this.dropdownContainer.classList.add("hiding");let i=r*.95;this.hideDropdownTimeout=setTimeout(()=>{this.dropdownContainer.classList.add("hidden"),this.dropdownContainer.classList.remove("hiding"),this.repositionDropdown()},i)}let n=`var(--dropdown-${o?"show":"hide"}-animation)`;this.dropdownContainer.style.animation=`${r}ms ease ${n}`}requestShow(){this.setVisible(!0)}requestHide(){this.setVisible(!1)}appendChild(o){this.dropdownContainer.appendChild(o)}clearChildren(){this.dropdownContainer.replaceChildren()}destroy(){this.setVisible(!1),this.dropdownContainer.remove(),this.dropdownToggleListener?.remove(),this.clearChildren(),this.onDestroy()}},jo=class{constructor(o,e){this.localization=e;this.dropdowns=new Set;this.listeners=[];this.connectedNotifiers=[];this.notifier=new He,this.notifier.on(0,({dropdown:r,fromToplevelDropdown:n})=>{r&&(o(this.localization.dropdownShown(r.parent.getTitle())),this.connectedNotifiers.forEach(i=>{i.dispatch(13,{kind:13,fromToplevelDropdown:n,layoutManager:this})}))}),this.notifier.on(1,({dropdown:r})=>{r&&o(this.localization.dropdownHidden(r.parent.getTitle()))})}connectToEditorNotifier(o){this.connectedNotifiers.push(o),this.refreshListeners()}createToolMenu(o){let e=new gi(o,this.notifier,()=>{this.dropdowns.delete(e),this.refreshListeners()});return this.dropdowns.add(e),this.refreshListeners(),e}refreshListeners(){let o=()=>{this.listeners.forEach(e=>e.remove()),this.listeners=[]};this.dropdowns.size===0?o():this.listeners.length!==this.connectedNotifiers.length&&(o(),this.listeners=this.connectedNotifiers.map(e=>e.on(13,r=>{r.kind!==13||r.layoutManager===this||this.notifier.dispatch(0,{fromToplevelDropdown:r.fromToplevelDropdown})})))}};var Xa=(s,o)=>{let e=new Map,r=null,n=!1,i=()=>{if(e.size===0)n?(n=!1,o.onEnd()):r!==null&&(clearTimeout(r),r=null);else{let l=Date.now(),c=0;for(let u of e.values()){let h=l-u.timeEnter;c=Math.max(h,c)}let d=o.longPressTimeout??700;r!==null&&(clearTimeout(r),r=null);let p=d-c;p<=0?(o.onStart(),n=!0):r=setTimeout(()=>{r=null,i()},p)}},a=l=>{let c={timeEnter:Date.now()};l.type==="pointerenter"?e.set(l.pointerId,c):(l.type==="pointerleave"||l.type==="pointercancel")&&e.clear(),i()};return s.addEventListener("pointerenter",a),s.addEventListener("pointerleave",a),s.addEventListener("pointercancel",a),{removeListeners:()=>{s.removeEventListener("pointerenter",a),s.removeEventListener("pointerleave",a),s.removeEventListener("pointercancel",a)}}},xs=Xa;var Qa=(s,o)=>{let e="has-long-press-or-hover",r="no-long-press-or-hover";s.classList.add("no-long-press-or-hover");let{removeListeners:n}=xs(s,{onStart(){s.classList.remove(r),s.classList.add(e)},onEnd(){s.classList.add(r),s.classList.remove(e)},longPressTimeout:o?.timeout});return{removeEventListeners:()=>{s.classList.remove(r),n()}}},uo=Qa;var Ja=(s,o)=>{let e=[...o.draggableChildElements,s],r=0,n=0,i=0,a=0,l=!1,c=null,d=b=>{if(!b)return!1;if(e.includes(b))return!0;let y=["INPUT","SELECT","IMG"],f=!1,T=b.parentElement;for(;T&&!y.includes(T.tagName);){if(e.includes(T)){f=!0;break}T=T.parentElement}return!y.includes(b.tagName)&&f},p=[],u=(b,y,f)=>{s.addEventListener(b,y,f),p.push(()=>{s.removeEventListener(b,y)})},h=5,m=()=>Math.hypot(r-i,n-a)<h,g=!1;u("pointerdown",b=>{b.defaultPrevented||!d(b.target)||b.isPrimary&&(g=!1,r=b.clientX,n=b.clientY,i=b.clientX,a=b.clientY,c=null,l=!0)},{passive:!0});let v=b=>{l&&(c!==null&&(s.releasePointerCapture(c),c=null),o.onDragEnd({roughlyClick:m(),endTimestamp:performance.now(),displacement:w.of(r-i,n-a)}),l=!1,g=!1)};return u("pointermove",b=>{if(!b.isPrimary||!l)return;if(b.pointerType==="mouse"&&b.buttons===0){v(b);return}c===null&&!m()&&(s.setPointerCapture(b.pointerId),c=b.pointerId);let y=b.clientX,f=b.clientY,T=y-r,P=f-n;(!(Math.abs(y-i)<=h&&Math.abs(f-a)<=h)||g)&&(o.onDrag(T,P,w.of(y-i,f-a)),r=y,n=f,g=!0)}),u("pointerleave",b=>{c===null&&l&&b.isPrimary&&(s.setPointerCapture(b.pointerId),c=b.pointerId)}),u("pointerup",v),u("pointercancel",v),{removeListeners:()=>{for(let b of p)b()}}},Qr=Ja;var el=s=>{let o=(r,n)=>{let i=getComputedStyle(r);for(let a=0;a<i.length;a++){let l=i.item(a),c=i.getPropertyValue(l);n.style?.setProperty(l,c)}for(let a=0;a<r.children.length;a++){let l=r.children.item(a),c=n.children.item(a);l&&c?o(l,c):console.warn("CloneElement: Missing child")}},e=s.cloneNode(!0);return o(s,e),e},ws=el;var tl=(s,o,e,r)=>{let n=document.createElement("div");n.classList.add("help-page-container");let i=document.createElement("div");i.classList.add("label","-space-above"),i.setAttribute("aria-live","polite");let a=0,l=s[0]??null,c=[];n.addEventListener("click",v=>{v.target===n&&e()});let d=()=>{if(!l)return B.empty;let v=l.targetElements.map(b=>B.of(b.getBoundingClientRect()));return B.union(...v)},p=()=>{let v=d();for(let b=0;b<c.length;b++)for(let{container:y,bbox:f}of c[b])if(b===a)y.classList.add("-active"),y.classList.remove("-clickable","-background"),y.onclick=()=>{};else{f.containsRect(v)?(y.classList.add("-background"),y.classList.remove("-active","-clickable")):(y.classList.add("-clickable"),y.classList.remove("-active","-background"));let T=b;y.onclick=()=>{o(T)}}},u=()=>{let v=B.of(i.getBoundingClientRect()),b=d();if(v.intersects(b)){let y=B.of(n.getBoundingClientRect()),f=b.topLeft.y,T=y.bottomLeft.y-b.bottomLeft.y;f>T&&f>v.height/3&&(i.classList.remove("-small-space-above","-large-space-above"),i.classList.add("-large-space-below")),f<T&&T>v.height&&(i.classList.add("-large-space-above"),i.classList.remove("-large-space-below"))}},h=()=>{n.replaceChildren(),i.classList.remove("-large-space-above"),i.classList.add("-small-space-above","-large-space-below"),n.appendChild(i);let v=new B(0,0,window.innerWidth,window.innerHeight);c=[];for(let b=0;b<s.length;b++){let y=s[b],f=[];for(let T of y.targetElements){let P=B.of(T.getBoundingClientRect());if(!v.intersects(P)){let C=v.bottomLeft.lerp(v.bottomRight,.5),V=P.bottomLeft.lerp(P.bottomRight,.5),O=C.minus(V);P=P.translatedBy(O)}let S=ws(T);for(let C of S.querySelectorAll("input"))C.disabled=!0;S.style.margin="0";let E=document.createElement("div");E.classList.add("cloned-element-container"),E.style.position="absolute",E.style.left=`${P.topLeft.x}px`,E.style.top=`${P.topLeft.y}px`,E.replaceChildren(S),uo(E,{timeout:0}),f.push({container:E,bbox:P}),n.appendChild(E)}c.push(f)}p()},m=()=>{h(),u()},g=()=>{let v=document.createElement("div");v.innerText=l?.helpText??"",v.classList.add("current-item-help");let b=document.createElement("div");b.innerText=r.localization.helpScreenNavigationHelp,b.classList.add("navigation-help"),i.replaceChildren(v,...a===0?[b]:[]),p()};return g(),{addToParent:v=>{h(),v.appendChild(n),u()},refresh:m,setPageIndex:v=>{a=v,l=s[v],g()}}},qo=class{constructor(o,e){this.createOverlay=o;this.context=e}#e=[];showHelpOverlay(){let o=document.createElement("dialog");o.setAttribute("autofocus","true"),o.classList.add("toolbar-help-overlay");let e=!1,r=()=>{if(e)return;let f=250;o.classList.add("-hiding"),setTimeout(()=>o.close(),f)},n=0,i=()=>{performance.now()-n<100||r()},a=()=>{let f=document.createElement("button");f.classList.add("close-button"),f.appendChild(this.context.icons.makeCloseIcon());let T=this.context.localization.close;return f.setAttribute("aria-label",T),f.setAttribute("title",T),f.onclick=()=>{r()},f},l=()=>{let f=pe.fromInitialValue(0),T=document.createElement("div");T.classList.add("navigation-content");let P=tl(this.#e,C=>f.set(C),i,this.context);P.addToParent(T);let S=C=>{C>=this.#e.length||C<0?(console.warn("Help screen: Navigated to out-of-bounds page",C),T.style.display="none"):(T.style.display="",P.setPageIndex(C))};f.onUpdateAndNow(S);let E={content:T,currentPage:f,toNext:()=>{E.hasNext()&&f.set(f.get()+1)},toPrevious:()=>{E.hasPrevious()&&f.set(f.get()-1)},hasNext:()=>f.get()+1<this.#e.length,hasPrevious:()=>f.get()>0,refreshCurrent:()=>{P.refresh()}};return E},c=f=>{let T=document.createElement("div");T.classList.add("navigation-buttons");let P=document.createElement("button"),S=document.createElement("button");P.innerText=this.context.localization.next,S.innerText=this.context.localization.previous,P.classList.add("next"),S.classList.add("previous");let E=()=>{T.classList.remove("-has-next","-has-previous"),f.hasNext()?(T.classList.add("-has-next"),P.disabled=!1):(T.classList.remove("-has-next"),P.disabled=!0),f.hasPrevious()?(T.classList.add("-has-previous"),S.disabled=!1):(T.classList.remove("-has-previous"),S.disabled=!0)};return f.currentPage.onUpdateAndNow(E),P.onclick=()=>{f.toNext()},S.onclick=()=>{f.toPrevious()},T.replaceChildren(S,P),T},d=l(),p=c(d);o.replaceChildren(a(),p,d.content),this.createOverlay(o),o.showModal();let u=30,h=f=>{f>0&&!d.hasPrevious()&&(f=0),f<0&&!d.hasNext()&&(f=0),(f>u||f<-u)&&(f=u*Math.sign(f)),o.style.transform=`translate(${f}px, 0px)`,f>=u?p.classList.add("-highlight-previous"):p.classList.remove("-highlight-previous"),f<=-u?p.classList.add("-highlight-next"):p.classList.remove("-highlight-next")},m=Qr(o,{draggableChildElements:[d.content],onDrag:(f,T,P)=>{o.classList.add("-dragging"),h(P.x)},onDragEnd:f=>{if(o.classList.remove("-dragging"),h(0),!f.roughlyClick){let T=f.displacement.x;T>u?d.toPrevious():T<-u&&d.toNext(),n=f.endTimestamp}}}),g;window.ResizeObserver&&(g=new ResizeObserver(()=>{d.refreshCurrent()}),g.observe(o));let v=()=>{requestAnimationFrame(()=>d.refreshCurrent())},b=window.matchMedia?.("(prefers-color-scheme: dark)");b?.addEventListener("change",v);let y=[d.content,p,o];o.onclick=f=>{y.includes(f.target)&&i()},o.onkeyup=f=>{f.code==="Escape"?(r(),f.preventDefault()):f.code==="ArrowRight"?(d.toNext(),f.preventDefault()):f.code==="ArrowLeft"&&(d.toPrevious(),f.preventDefault())},o.addEventListener("close",()=>{this.context.announceForAccessibility(this.context.localization.helpHidden),b?.removeEventListener("change",v),m.removeListeners(),g?.disconnect(),o.remove()})}registerTextHelpForElement(o,e){this.registerTextHelpForElements([o],e)}registerTextHelpForElements(o,e){this.#e.push({targetElements:[...o],helpText:e})}hasHelpText(){return this.#e.length>0}createToggleButton(){let o=document.createElement("div");o.classList.add("toolbar-help-overlay-button");let e=document.createElement("button");e.classList.add("button");let r=this.context.icons.makeHelpIcon();return r.classList.add("icon"),e.appendChild(r),e.setAttribute("aria-label",this.context.localization.help),e.onclick=()=>{this.showHelpOverlay()},o.appendChild(e),o}};var Ht=(n=>(n.Save="save",n.Exit="exit",n.Undo="undo",n.Redo="redo",n))(Ht||{}),ue=class s{constructor(o,e,r){this.editor=o;this.id=e;this.dropdown=null;this.disabled=!1;this.#t=!1;this.#o=[];this.subWidgets={};this.toplevel=!0;this.#r=null;this.localizationTable=r??o.localization;let n=new jo(i=>this.editor.announceForAccessibility(i),this.localizationTable);n.connectToEditorNotifier(o.notifier),this.layoutManager=n,this.icon=null,this.container=document.createElement("div"),this.container.classList.add(`${M}toolContainer`,`${M}toolButtonContainer`,`${M}internalWidgetId--${e.replace(/[^a-zA-Z0-9_]/g,"-")}`),this.dropdownContent=document.createElement("div"),this.#e=!1,this.button=document.createElement("div"),this.button.classList.add(`${M}button`),this.label=document.createElement("label"),this.button.setAttribute("role","button"),this.button.tabIndex=0,this.button.oncontextmenu=i=>{i.preventDefault()},uo(this.button)}#e;#t;#o;#r;#n(){this.#r?.();let o=this.editor.toolController.getMatchingTools(tt),e=null;if(o.length>0&&this.onKeyPress!==s.prototype.onKeyPress){let n=a=>this.onKeyPress(a),i=o[0];i.registerListener(n),e=()=>{i.removeListener(n)}}let r=this.editor.isReadOnlyReactiveValue().onUpdateAndNow(n=>{n&&this.shouldAutoDisableInReadOnlyEditor()&&!this.disabled?(this.setDisabled(!0),this.#t=!0,this.#e&&this.dropdown?.requestHide()):!n&&this.#t&&(this.#t=!1,this.setDisabled(!1))});this.#r=()=>{r.remove(),e?.(),this.#r=null}}shouldAutoDisableInReadOnlyEditor(){return!0}getId(){return this.id}setTags(o){let e=r=>`toolwidget-tag--${r}`;for(let r of this.#o)this.container.classList.remove(e(r));this.#o=[...o];for(let r of this.#o)this.container.classList.add(e(r))}getTags(){return[...this.#o]}getUniqueIdIn(o){let e=this.getId(),r=0;for(;e in o&&o[e]!==this;)e=this.getId()+"-"+r.toString(),r++;return e}fillDropdown(o,e){if(Object.keys(this.subWidgets).length===0)return!1;for(let r in this.subWidgets){let n=this.subWidgets[r],i=n.addTo(o);n.setIsToplevel(!1);let a=n.getHelpText();a&&e?.registerTextHelpForElement(i,a)}return!0}getHelpText(){}setupActionBtnClickListener(o){return this.setUpButtonEventListeners(o)}setUpButtonEventListeners(o){let e={Enter:!0," ":!0};o.onkeydown=r=>{let n=!1;if(r.key in e&&(this.disabled||(this.handleClick(),n=!0)),!n){let i=Ro(r);n=this.editor.toolController.dispatchInputEvent(i)}n&&r.preventDefault()},o.onkeyup=r=>{if(r.key in e)return;let n=ko(r);this.editor.toolController.dispatchInputEvent(n)&&r.preventDefault()},o.onclick=()=>{this.disabled||this.handleClick()},o.ondblclick=r=>{r.preventDefault()}}onKeyPress(o){return!1}get hasDropdown(){return this.#e}addSubWidget(o){let e=o.getUniqueIdIn(this.subWidgets);this.subWidgets[e]=o}setLayoutManager(o){o!==this.layoutManager&&(this.layoutManager=o,this.container.parentElement&&this.addTo(this.container.parentElement))}addTo(o){this.icon=null,this.updateIcon(),this.label.innerText=this.getTitle();let e="long-label";this.label.innerText.length>7?this.label.classList.add(e):this.label.classList.remove(e),this.setUpButtonEventListeners(this.button),this.container.replaceChildren(),this.button.replaceChildren(this.icon,this.label),this.container.appendChild(this.button);let r=new qo(i=>this.editor.createHTMLOverlay(i),this.editor),n=this.getHelpText();return n&&r.registerTextHelpForElement(this.dropdownContent,[this.getTitle(),n].join(`
442
+ `,o.setAttribute("viewBox","0 0 26.46 26.46"),o.setAttribute("width","100"),o.setAttribute("height","100"),o}makeIconFromPath(o,e="var(--icon-color)",r="none",n="0px"){let i=document.createElementNS(ie,"svg"),a=document.createElementNS(ie,"path");return a.setAttribute("d",o),a.style.fill=e,a.style.stroke=r,a.style.strokeWidth=n,i.appendChild(a),i.setAttribute("viewBox","0 0 100 100"),i}makeCheckerboardPattern(){return en()}isRoundedTipPen(o){return o.factory===Qe||o.factory===ft}isPolylinePen(o){return o.factory===ft}licenseInfo(){return null}};var tl=s=>{let o=0,e=s.map(r=>r.id);e.sort();for(let r of e)o===r&&(o=r+1);return o},tn=tl;var ol=(s,o,e,r,n=0)=>{let i=tn(r??[]),a=ke.ofCanvasPoint(e,o!==2,s.viewport,i,n);return s.toolController.dispatchInputEvent({kind:o,allPointers:r??[a],current:a}),a},on=ol;var D="toolbar-";var xi=class{constructor(o,e,r){this.parent=o;this.notifier=e;this.onDestroy=r;this.dropdownToggleListener=null;this.hideDropdownTimeout=null;this.visible=j.fromInitialValue(!1),this.dropdownContainer=document.createElement("div"),this.dropdownContainer.classList.add(`${D}dropdown`),this.dropdownContainer.classList.add("hidden"),o.target.insertAdjacentElement("afterend",this.dropdownContainer),this.dropdownToggleListener=this.notifier.on(0,n=>{n.dropdown!==this&&n.fromToplevelDropdown&&this.setVisible(!1)})}onActivated(){}repositionDropdown(){let o=this.dropdownContainer.getBoundingClientRect(),e=document.scrollingElement?.clientWidth??document.body.clientHeight,r=document.scrollingElement?.clientHeight??document.body.clientHeight,n,i;o.left>e/2&&(n=`calc(${this.parent.target.clientWidth+"px"} - 100%)`),o.bottom>r&&o.top-o.height>0&&(i=`calc(-${this.parent.target.clientHeight}px - 100%)`),n||i?this.dropdownContainer.style.translate=`${n??"0"} ${i??"0"}`:this.dropdownContainer.style.translate=""}setVisible(o){if(this.visible.get()===o)return;this.hideDropdownTimeout&&(clearTimeout(this.hideDropdownTimeout),this.hideDropdownTimeout=null,this.dropdownContainer.classList.remove("hiding"),this.repositionDropdown());let r=150;if(this.visible.set(o),o)this.dropdownContainer.classList.remove("hidden"),this.notifier.dispatch(0,{dropdown:this,fromToplevelDropdown:this.parent.isToplevel()}),this.repositionDropdown();else{this.notifier.dispatch(1,{dropdown:this,fromToplevelDropdown:this.parent.isToplevel()}),this.dropdownContainer.classList.add("hiding");let i=r*.95;this.hideDropdownTimeout=setTimeout(()=>{this.dropdownContainer.classList.add("hidden"),this.dropdownContainer.classList.remove("hiding"),this.repositionDropdown()},i)}let n=`var(--dropdown-${o?"show":"hide"}-animation)`;this.dropdownContainer.style.animation=`${r}ms ease ${n}`}requestShow(){this.setVisible(!0)}requestHide(){this.setVisible(!1)}appendChild(o){this.dropdownContainer.appendChild(o)}clearChildren(){this.dropdownContainer.replaceChildren()}destroy(){this.setVisible(!1),this.dropdownContainer.remove(),this.dropdownToggleListener?.remove(),this.clearChildren(),this.onDestroy()}},Yo=class{constructor(o,e){this.localization=e;this.dropdowns=new Set;this.listeners=[];this.connectedNotifiers=[];this.notifier=new Fe,this.notifier.on(0,({dropdown:r,fromToplevelDropdown:n})=>{r&&(o(this.localization.dropdownShown(r.parent.getTitle())),this.connectedNotifiers.forEach(i=>{i.dispatch(13,{kind:13,fromToplevelDropdown:n,layoutManager:this})}))}),this.notifier.on(1,({dropdown:r})=>{r&&o(this.localization.dropdownHidden(r.parent.getTitle()))})}connectToEditorNotifier(o){this.connectedNotifiers.push(o),this.refreshListeners()}createToolMenu(o){let e=new xi(o,this.notifier,()=>{this.dropdowns.delete(e),this.refreshListeners()});return this.dropdowns.add(e),this.refreshListeners(),e}refreshListeners(){let o=()=>{this.listeners.forEach(e=>e.remove()),this.listeners=[]};this.dropdowns.size===0?o():this.listeners.length!==this.connectedNotifiers.length&&(o(),this.listeners=this.connectedNotifiers.map(e=>e.on(13,r=>{r.kind!==13||r.layoutManager===this||this.notifier.dispatch(0,{fromToplevelDropdown:r.fromToplevelDropdown})})))}};var rl=(s,o)=>{let e=new Map,r=null,n=!1,i=()=>{if(e.size===0)n?(n=!1,o.onEnd()):r!==null&&(clearTimeout(r),r=null);else{let l=Date.now(),c=0;for(let p of e.values()){let h=l-p.timeEnter;c=Math.max(h,c)}let d=o.longPressTimeout??700;r!==null&&(clearTimeout(r),r=null);let u=d-c;u<=0?(o.onStart(),n=!0):r=setTimeout(()=>{r=null,i()},u)}},a=l=>{let c={timeEnter:Date.now()};l.type==="pointerenter"?e.set(l.pointerId,c):(l.type==="pointerleave"||l.type==="pointercancel")&&e.clear(),i()};return s.addEventListener("pointerenter",a),s.addEventListener("pointerleave",a),s.addEventListener("pointercancel",a),{removeListeners:()=>{s.removeEventListener("pointerenter",a),s.removeEventListener("pointerleave",a),s.removeEventListener("pointercancel",a)}}},Ps=rl;var nl=(s,o)=>{let e="has-long-press-or-hover",r="no-long-press-or-hover";s.classList.add("no-long-press-or-hover");let{removeListeners:n}=Ps(s,{onStart(){s.classList.remove(r),s.classList.add(e)},onEnd(){s.classList.add(r),s.classList.remove(e)},longPressTimeout:o?.timeout});return{removeEventListeners:()=>{s.classList.remove(r),n()}}},gt=nl;var il=(s,o)=>{let e=[...o.draggableChildElements,s],r=0,n=0,i=0,a=0,l=!1,c=null,d=b=>{if(!b)return!1;if(e.includes(b))return!0;let y=["INPUT","SELECT","IMG"],f=!1,T=b.parentElement;for(;T&&!y.includes(T.tagName);){if(e.includes(T)){f=!0;break}T=T.parentElement}return!y.includes(b.tagName)&&f},u=[],p=(b,y,f)=>{s.addEventListener(b,y,f),u.push(()=>{s.removeEventListener(b,y)})},h=5,m=()=>Math.hypot(r-i,n-a)<h,g=!1;p("pointerdown",b=>{b.defaultPrevented||!d(b.target)||b.isPrimary&&(g=!1,r=b.clientX,n=b.clientY,i=b.clientX,a=b.clientY,c=null,l=!0)},{passive:!0});let v=b=>{l&&(c!==null&&(s.releasePointerCapture(c),c=null),o.onDragEnd({roughlyClick:m(),endTimestamp:performance.now(),displacement:w.of(r-i,n-a)}),l=!1,g=!1)};return p("pointermove",b=>{if(!b.isPrimary||!l)return;if(b.pointerType==="mouse"&&b.buttons===0){v(b);return}c===null&&!m()&&(s.setPointerCapture(b.pointerId),c=b.pointerId);let y=b.clientX,f=b.clientY,T=y-r,P=f-n;(!(Math.abs(y-i)<=h&&Math.abs(f-a)<=h)||g)&&(o.onDrag(T,P,w.of(y-i,f-a)),r=y,n=f,g=!0)}),p("pointerleave",b=>{c===null&&l&&b.isPrimary&&(s.setPointerCapture(b.pointerId),c=b.pointerId)}),p("pointerup",v),p("pointercancel",v),{removeListeners:()=>{for(let b of u)b()}}},rn=il;var sl=s=>{let o=(r,n)=>{let i=getComputedStyle(r);for(let a=0;a<i.length;a++){let l=i.item(a),c=i.getPropertyValue(l);n.style?.setProperty(l,c)}for(let a=0;a<r.children.length;a++){let l=r.children.item(a),c=n.children.item(a);l&&c?o(l,c):console.warn("CloneElement: Missing child")}},e=s.cloneNode(!0);return o(s,e),e},Es=sl;var al=(s,o,e,r)=>{let n=document.createElement("div");n.classList.add("help-page-container");let i=document.createElement("div");i.classList.add("label","-space-above"),i.setAttribute("aria-live","polite");let a=0,l=s[0]??null,c=[];n.addEventListener("click",v=>{v.target===n&&e()});let d=()=>{if(!l)return I.empty;let v=l.targetElements.map(b=>I.of(b.getBoundingClientRect()));return I.union(...v)},u=()=>{let v=d();for(let b=0;b<c.length;b++)for(let{container:y,bbox:f}of c[b])if(b===a)y.classList.add("-active"),y.classList.remove("-clickable","-background"),y.onclick=()=>{};else{f.containsRect(v)?(y.classList.add("-background"),y.classList.remove("-active","-clickable")):(y.classList.add("-clickable"),y.classList.remove("-active","-background"));let T=b;y.onclick=()=>{o(T)}}},p=()=>{let v=I.of(i.getBoundingClientRect()),b=d();if(v.intersects(b)){let y=I.of(n.getBoundingClientRect()),f=b.topLeft.y,T=y.bottomLeft.y-b.bottomLeft.y;f>T&&f>v.height/3&&(i.classList.remove("-small-space-above","-large-space-above"),i.classList.add("-large-space-below")),f<T&&T>v.height&&(i.classList.add("-large-space-above"),i.classList.remove("-large-space-below"))}},h=()=>{n.replaceChildren(),i.classList.remove("-large-space-above"),i.classList.add("-small-space-above","-large-space-below"),n.appendChild(i);let v=new I(0,0,window.innerWidth,window.innerHeight);c=[];for(let b=0;b<s.length;b++){let y=s[b],f=[];for(let T of y.targetElements){let P=I.of(T.getBoundingClientRect());if(!v.intersects(P)){let C=v.bottomLeft.lerp(v.bottomRight,.5),V=P.bottomLeft.lerp(P.bottomRight,.5),O=C.minus(V);P=P.translatedBy(O)}let S=Es(T);for(let C of S.querySelectorAll("input"))C.disabled=!0;S.style.margin="0";let E=document.createElement("div");E.classList.add("cloned-element-container"),E.style.position="absolute",E.style.left=`${P.topLeft.x}px`,E.style.top=`${P.topLeft.y}px`,E.replaceChildren(S),gt(E,{timeout:0}),f.push({container:E,bbox:P}),n.appendChild(E)}c.push(f)}u()},m=()=>{h(),p()},g=()=>{let v=document.createElement("div");v.innerText=l?.helpText??"",v.classList.add("current-item-help");let b=document.createElement("div");b.innerText=r.localization.helpScreenNavigationHelp,b.classList.add("navigation-help"),i.replaceChildren(v,...a===0?[b]:[]),u()};return g(),{addToParent:v=>{h(),v.appendChild(n),p()},refresh:m,setPageIndex:v=>{a=v,l=s[v],g()}}},Xo=class{constructor(o,e){this.createOverlay=o;this.context=e}#e=[];showHelpOverlay(){let o=document.createElement("dialog");o.setAttribute("autofocus","true"),o.classList.add("toolbar-help-overlay");let e=!1,r=()=>{if(e)return;let f=250;o.classList.add("-hiding"),setTimeout(()=>o.close(),f)},n=0,i=()=>{performance.now()-n<100||r()},a=()=>{let f=document.createElement("button");f.classList.add("close-button"),f.appendChild(this.context.icons.makeCloseIcon());let T=this.context.localization.close;return f.setAttribute("aria-label",T),f.setAttribute("title",T),f.onclick=()=>{r()},f},l=()=>{let f=te.fromInitialValue(0),T=document.createElement("div");T.classList.add("navigation-content");let P=al(this.#e,C=>f.set(C),i,this.context);P.addToParent(T);let S=C=>{C>=this.#e.length||C<0?(console.warn("Help screen: Navigated to out-of-bounds page",C),T.style.display="none"):(T.style.display="",P.setPageIndex(C))};f.onUpdateAndNow(S);let E={content:T,currentPage:f,toNext:()=>{E.hasNext()&&f.set(f.get()+1)},toPrevious:()=>{E.hasPrevious()&&f.set(f.get()-1)},hasNext:()=>f.get()+1<this.#e.length,hasPrevious:()=>f.get()>0,refreshCurrent:()=>{P.refresh()}};return E},c=f=>{let T=document.createElement("div");T.classList.add("navigation-buttons");let P=document.createElement("button"),S=document.createElement("button");P.innerText=this.context.localization.next,S.innerText=this.context.localization.previous,P.classList.add("next"),S.classList.add("previous");let E=()=>{T.classList.remove("-has-next","-has-previous"),f.hasNext()?(T.classList.add("-has-next"),P.disabled=!1):(T.classList.remove("-has-next"),P.disabled=!0),f.hasPrevious()?(T.classList.add("-has-previous"),S.disabled=!1):(T.classList.remove("-has-previous"),S.disabled=!0)};return f.currentPage.onUpdateAndNow(E),P.onclick=()=>{f.toNext()},S.onclick=()=>{f.toPrevious()},T.replaceChildren(S,P),T},d=l(),u=c(d);o.replaceChildren(a(),u,d.content),this.createOverlay(o),o.showModal();let p=30,h=f=>{f>0&&!d.hasPrevious()&&(f=0),f<0&&!d.hasNext()&&(f=0),(f>p||f<-p)&&(f=p*Math.sign(f)),o.style.transform=`translate(${f}px, 0px)`,f>=p?u.classList.add("-highlight-previous"):u.classList.remove("-highlight-previous"),f<=-p?u.classList.add("-highlight-next"):u.classList.remove("-highlight-next")},m=rn(o,{draggableChildElements:[d.content],onDrag:(f,T,P)=>{o.classList.add("-dragging"),h(P.x)},onDragEnd:f=>{if(o.classList.remove("-dragging"),h(0),!f.roughlyClick){let T=f.displacement.x;T>p?d.toPrevious():T<-p&&d.toNext(),n=f.endTimestamp}}}),g;window.ResizeObserver&&(g=new ResizeObserver(()=>{d.refreshCurrent()}),g.observe(o));let v=()=>{requestAnimationFrame(()=>d.refreshCurrent())},b=window.matchMedia?.("(prefers-color-scheme: dark)");b?.addEventListener("change",v);let y=[d.content,u,o];o.onclick=f=>{y.includes(f.target)&&i()},o.onkeyup=f=>{f.code==="Escape"?(r(),f.preventDefault()):f.code==="ArrowRight"?(d.toNext(),f.preventDefault()):f.code==="ArrowLeft"&&(d.toPrevious(),f.preventDefault())},o.addEventListener("close",()=>{this.context.announceForAccessibility(this.context.localization.helpHidden),b?.removeEventListener("change",v),m.removeListeners(),g?.disconnect(),o.remove()})}registerTextHelpForElement(o,e){this.registerTextHelpForElements([o],e)}registerTextHelpForElements(o,e){this.#e.push({targetElements:[...o],helpText:e})}hasHelpText(){return this.#e.length>0}createToggleButton(){let o=document.createElement("div");o.classList.add("toolbar-help-overlay-button");let e=document.createElement("button");e.classList.add("button");let r=this.context.icons.makeHelpIcon();return r.classList.add("icon"),e.appendChild(r),e.setAttribute("aria-label",this.context.localization.help),e.onclick=()=>{this.showHelpOverlay()},o.appendChild(e),o}};var Ut=(n=>(n.Save="save",n.Exit="exit",n.Undo="undo",n.Redo="redo",n))(Ut||{}),ae=class s{constructor(o,e,r){this.editor=o;this.id=e;this.dropdown=null;this.disabled=!1;this.#t=!1;this.#o=[];this.subWidgets={};this.toplevel=!0;this.#r=null;this.localizationTable=r??o.localization;let n=new Yo(i=>this.editor.announceForAccessibility(i),this.localizationTable);n.connectToEditorNotifier(o.notifier),this.layoutManager=n,this.icon=null,this.container=document.createElement("div"),this.container.classList.add(`${D}toolContainer`,`${D}toolButtonContainer`,`${D}internalWidgetId--${e.replace(/[^a-zA-Z0-9_]/g,"-")}`),this.dropdownContent=document.createElement("div"),this.#e=!1,this.button=document.createElement("div"),this.button.classList.add(`${D}button`),this.label=document.createElement("label"),this.button.setAttribute("role","button"),this.button.tabIndex=0,this.button.oncontextmenu=i=>{i.preventDefault()},gt(this.button)}#e;#t;#o;#r;#n(){this.#r?.();let o=this.editor.toolController.getMatchingTools(tt),e=null;if(o.length>0&&this.onKeyPress!==s.prototype.onKeyPress){let n=a=>this.onKeyPress(a),i=o[0];i.registerListener(n),e=()=>{i.removeListener(n)}}let r=this.editor.isReadOnlyReactiveValue().onUpdateAndNow(n=>{n&&this.shouldAutoDisableInReadOnlyEditor()&&!this.disabled?(this.setDisabled(!0),this.#t=!0,this.#e&&this.dropdown?.requestHide()):!n&&this.#t&&(this.#t=!1,this.setDisabled(!1))});this.#r=()=>{r.remove(),e?.(),this.#r=null}}shouldAutoDisableInReadOnlyEditor(){return!0}getId(){return this.id}setTags(o){let e=r=>`toolwidget-tag--${r}`;for(let r of this.#o)this.container.classList.remove(e(r));this.#o=[...o];for(let r of this.#o)this.container.classList.add(e(r))}getTags(){return[...this.#o]}getUniqueIdIn(o){let e=this.getId(),r=0;for(;e in o&&o[e]!==this;)e=this.getId()+"-"+r.toString(),r++;return e}fillDropdown(o,e){if(Object.keys(this.subWidgets).length===0)return!1;for(let r in this.subWidgets){let n=this.subWidgets[r],i=n.addTo(o);n.setIsToplevel(!1);let a=n.getHelpText();a&&e?.registerTextHelpForElement(i,a)}return!0}getHelpText(){}setupActionBtnClickListener(o){return this.setUpButtonEventListeners(o)}setUpButtonEventListeners(o){let e={Enter:!0," ":!0};o.onkeydown=r=>{let n=!1;if(r.key in e&&(this.disabled||(this.handleClick(),n=!0)),!n){let i=Lo(r);n=this.editor.toolController.dispatchInputEvent(i)}n&&r.preventDefault()},o.onkeyup=r=>{if(r.key in e)return;let n=zo(r);this.editor.toolController.dispatchInputEvent(n)&&r.preventDefault()},o.onclick=()=>{this.disabled||this.handleClick()},o.ondblclick=r=>{r.preventDefault()}}onKeyPress(o){return!1}get hasDropdown(){return this.#e}addSubWidget(o){let e=o.getUniqueIdIn(this.subWidgets);this.subWidgets[e]=o}setLayoutManager(o){o!==this.layoutManager&&(this.layoutManager=o,this.container.parentElement&&this.addTo(this.container.parentElement))}addTo(o){this.icon=null,this.updateIcon(),this.label.innerText=this.getTitle();let e="long-label";this.label.innerText.length>7?this.label.classList.add(e):this.label.classList.remove(e),this.setUpButtonEventListeners(this.button),this.container.replaceChildren(),this.button.replaceChildren(this.icon,this.label),this.container.appendChild(this.button);let r=new Xo(i=>this.editor.createHTMLOverlay(i),this.editor),n=this.getHelpText();return n&&r.registerTextHelpForElement(this.dropdownContent,[this.getTitle(),n].join(`
438
443
 
439
- `)),this.dropdownContent.replaceChildren(),this.#e=this.fillDropdown(this.dropdownContent,r),this.#e&&(this.button.classList.add("has-dropdown"),this.dropdown?.destroy(),this.dropdownIcon=this.createDropdownIcon(),this.button.appendChild(this.dropdownIcon),this.dropdown=this.layoutManager.createToolMenu({target:this.button,getTitle:()=>this.getTitle(),isToplevel:()=>this.toplevel}),this.dropdown.visible.onUpdate(i=>{i?this.container.classList.add("dropdownVisible"):this.container.classList.remove("dropdownVisible"),i||this.focus()}),r.hasHelpText()&&this.dropdown.appendChild(r.createToggleButton()),this.dropdown.appendChild(this.dropdownContent)),this.setDropdownVisible(!1),this.container.parentElement&&this.container.remove(),this.#n(),o.appendChild(this.container),this.container}remove(){this.container.remove(),this.#r?.()}focus(){this.button.focus()}addCSSClassToContainer(o){this.container.classList.add(o)}removeCSSClassFromContainer(o){this.container.classList.remove(o)}updateIcon(){let o=this.createIcon();o?this.container.classList.remove("no-icon"):(o=document.createElement("div"),this.container.classList.add("no-icon")),this.icon?.replaceWith(o),this.icon=o,this.icon.classList.add(`${M}icon`)}setDisabled(o){this.disabled=o,this.#t=!1,this.disabled?(this.button.classList.add("disabled"),this.button.setAttribute("aria-disabled","true")):(this.button.classList.remove("disabled"),this.button.removeAttribute("aria-disabled"))}setSelected(o){this.isSelected()!==o&&(this.button.setAttribute("role","switch"),o?(this.container.classList.add("selected"),this.button.setAttribute("aria-checked","true")):(this.container.classList.remove("selected"),this.button.setAttribute("aria-checked","false")))}setDropdownVisible(o){o?this.dropdown?.requestShow():this.dropdown?.requestHide()}activateDropdown(){this.dropdown?.onActivated()}mustBeInToplevelMenu(){return!1}canBeInOverflowMenu(){return!this.mustBeInToplevelMenu()}getButtonWidth(){return this.button.clientWidth}isHidden(){return this.container.style.display==="none"}setHidden(o){this.container.style.display=o?"none":""}setIsToplevel(o){this.toplevel=o}isDropdownVisible(){return this.dropdown?.visible?.get()??!1}isSelected(){return this.container.classList.contains("selected")}createDropdownIcon(){let o=this.editor.icons.makeDropdownIcon();return o.classList.add(`${M}showHideDropdownIcon`),o}serializeState(){let o={};for(let e in this.subWidgets)o[e]=this.subWidgets[e].serializeState();return{subwidgetState:o}}deserializeFrom(o){if(o.subwidgetState){mr(o.subwidgetState);for(let e in o.subwidgetState)if(e in this.subWidgets){let r=o.subwidgetState[e];r&&this.subWidgets[e].deserializeFrom(r)}}}};var _o=class{constructor(o,e,r,n,i){this.setSidebarContent=o;this.sidebarTitle=e;this.sidebarVisibility=r;this.announceForAccessibility=n;this.localization=i;this.visibleWidgetContent=j.fromInitialValue(null)}createToolMenu(o){let e=document.createElement("div"),r=null,n=j.fromCallback(()=>this.visibleWidgetContent.get()===r&&this.sidebarVisibility.get(),[this.visibleWidgetContent,this.sidebarVisibility]);return r={visible:n,requestShow:()=>{this.setSidebarContent(e),this.sidebarTitle.set(o.getTitle()),this.visibleWidgetContent.set(r),this.sidebarVisibility.set(!0),this.announceForAccessibility(this.localization.dropdownShown(o.getTitle()))},onActivated:()=>{},requestHide:()=>{n.get()&&this.sidebarVisibility.set(!1)},appendChild:i=>{e.appendChild(i)},clearChildren:()=>{e.replaceChildren()},destroy:()=>{r?.requestHide(),e.parentElement&&e.remove(),this.visibleWidgetContent.get()===r&&this.visibleWidgetContent.set(null)}},r}};var gt=(()=>{return((s,o,e,r)=>{let n=o.createElement("canvas").getContext("2d"),i={r:0,g:0,b:0,h:0,s:0,v:0,a:1},a,l,c,d,p,u,h,m,g,v,b,y,f,T,P,S,E={},C={el:"[data-coloris]",parent:"body",theme:"default",themeMode:"light",rtl:!1,wrap:!0,margin:2,format:"hex",formatToggle:!1,swatches:[],swatchesOnly:!1,alpha:!0,forceAlpha:!1,focusInput:!0,selectInput:!1,inline:!1,defaultColor:"#000000",clearButton:!1,clearLabel:"Clear",closeButton:!1,closeLabel:"Close",onChange:()=>r,a11y:{open:"Open color picker",close:"Close color picker",clear:"Clear the selected color",marker:"Saturation: {s}. Brightness: {v}.",hueSlider:"Hue slider",alphaSlider:"Opacity slider",input:"Color value field",format:"Color format",swatch:"Color swatch",instruction:"Saturation and brightness selector. Use up, down, left and right arrow keys to select."}},V={},O="",K={},ie=!1;function te(x){if(typeof x=="object")for(let R in x)switch(R){case"el":qe(x.el),x.wrap!==!1&&at(x.el);break;case"parent":a=o.querySelector(x.parent),a&&(a.appendChild(l),C.parent=x.parent,a===o.body&&(a=r));break;case"themeMode":C.themeMode=x.themeMode,x.themeMode==="auto"&&s.matchMedia&&s.matchMedia("(prefers-color-scheme: dark)").matches&&(C.themeMode="dark");case"theme":x.theme&&(C.theme=x.theme),l.className=`clr-picker clr-${C.theme} clr-${C.themeMode}`,C.inline&&st();break;case"rtl":C.rtl=!!x.rtl,o.querySelectorAll(".clr-field").forEach(A=>A.classList.toggle("clr-rtl",C.rtl));break;case"margin":x.margin*=1,C.margin=isNaN(x.margin)?C.margin:x.margin;break;case"wrap":x.el&&x.wrap&&at(x.el);break;case"formatToggle":C.formatToggle=!!x.formatToggle,ge("clr-format").style.display=C.formatToggle?"block":"none",C.formatToggle&&(C.format="auto");break;case"swatches":if(Array.isArray(x.swatches)){let A=[];x.swatches.forEach((N,Q)=>{A.push(`<button type="button" id="clr-swatch-${Q}" aria-labelledby="clr-swatch-label clr-swatch-${Q}" style="color: ${N};">${N}</button>`)}),ge("clr-swatches").innerHTML=A.length?`<div>${A.join("")}</div>`:"",C.swatches=x.swatches.slice()}break;case"swatchesOnly":C.swatchesOnly=!!x.swatchesOnly,l.setAttribute("data-minimal",C.swatchesOnly);break;case"alpha":C.alpha=!!x.alpha,l.setAttribute("data-alpha",C.alpha);break;case"inline":if(C.inline=!!x.inline,l.setAttribute("data-inline",C.inline),C.inline){let A=x.defaultColor||C.defaultColor;T=qt(A),st(),vt(A)}break;case"clearButton":typeof x.clearButton=="object"&&(x.clearButton.label&&(C.clearLabel=x.clearButton.label,h.innerHTML=C.clearLabel),x.clearButton=x.clearButton.show),C.clearButton=!!x.clearButton,h.style.display=C.clearButton?"block":"none";break;case"clearLabel":C.clearLabel=x.clearLabel,h.innerHTML=C.clearLabel;break;case"closeButton":C.closeButton=!!x.closeButton,C.closeButton?l.insertBefore(m,p):p.appendChild(m);break;case"closeLabel":C.closeLabel=x.closeLabel,m.innerHTML=C.closeLabel;break;case"a11y":let z=x.a11y,D=!1;if(typeof z=="object")for(let A in z)z[A]&&C.a11y[A]&&(C.a11y[A]=z[A],D=!0);if(D){let A=ge("clr-open-label"),N=ge("clr-swatch-label");A.innerHTML=C.a11y.open,N.innerHTML=C.a11y.swatch,m.setAttribute("aria-label",C.a11y.close),h.setAttribute("aria-label",C.a11y.clear),g.setAttribute("aria-label",C.a11y.hueSlider),b.setAttribute("aria-label",C.a11y.alphaSlider),u.setAttribute("aria-label",C.a11y.input),c.setAttribute("aria-label",C.a11y.instruction)}break;default:C[R]=x[R]}}function fe(x,R){typeof x=="string"&&typeof R=="object"&&(V[x]=R,ie=!0)}function Se(x){delete V[x],Object.keys(V).length===0&&(ie=!1,x===O&&We())}function le(x){if(ie){let R=["el","wrap","rtl","inline","defaultColor","a11y"];for(let z in V){let D=V[z];if(x.matches(z)){O=z,K={},R.forEach(A=>delete D[A]);for(let A in D)K[A]=Array.isArray(C[A])?C[A].slice():C[A];te(D);break}}}}function We(){Object.keys(K).length>0&&(te(K),O="",K={})}function qe(x){X(o,"click",x,R=>{C.inline||(le(R.target),f=R.target,P=f.value,T=qt(P),l.classList.add("clr-open"),st(),vt(P),(C.focusInput||C.selectInput)&&(u.focus({preventScroll:!0}),u.setSelectionRange(f.selectionStart,f.selectionEnd)),C.selectInput&&u.select(),(S||C.swatchesOnly)&&Ri().shift().focus(),f.dispatchEvent(new Event("open",{bubbles:!0})))}),X(o,"input",x,R=>{let z=R.target.parentNode;z.classList.contains("clr-field")&&(z.style.color=R.target.value)})}function st(){if(!l||!f&&!C.inline)return;let x=a,R=s.scrollY,z=l.offsetWidth,D=l.offsetHeight,A={left:!1,top:!1},N,Q,Fe,oe={x:0,y:0};if(x&&(N=s.getComputedStyle(x),Q=parseFloat(N.marginTop),Fe=parseFloat(N.borderTopWidth),oe=x.getBoundingClientRect(),oe.y+=Fe+R),!C.inline){let we=f.getBoundingClientRect(),lt=we.x,yt=R+we.y+we.height+C.margin;x?(lt-=oe.x,yt-=oe.y,lt+z>x.clientWidth&&(lt+=we.width-z,A.left=!0),yt+D>x.clientHeight-Q&&D+C.margin<=we.top-(oe.y-R)&&(yt-=we.height+D+C.margin*2,A.top=!0),yt+=x.scrollTop):(lt+z>o.documentElement.clientWidth&&(lt+=we.width-z,A.left=!0),yt+D-R>o.documentElement.clientHeight&&D+C.margin<=we.top&&(yt=R+we.y-D-C.margin,A.top=!0)),l.classList.toggle("clr-left",A.left),l.classList.toggle("clr-top",A.top),l.style.left=`${lt}px`,l.style.top=`${yt}px`,oe.x+=l.offsetLeft,oe.y+=l.offsetTop}E={width:c.offsetWidth,height:c.offsetHeight,x:c.offsetLeft+oe.x,y:c.offsetTop+oe.y}}function at(x){o.querySelectorAll(x).forEach(R=>{let z=R.parentNode;if(!z.classList.contains("clr-field")){let D=o.createElement("div"),A="clr-field";(C.rtl||R.classList.contains("clr-rtl"))&&(A+=" clr-rtl"),D.innerHTML='<button type="button" aria-labelledby="clr-open-label"></button>',z.insertBefore(D,R),D.setAttribute("class",A),D.style.color=R.value,D.appendChild(R)}})}function Oe(x){if(f&&!C.inline){let R=f;x&&(f=r,P!==R.value&&(R.value=P,R.dispatchEvent(new Event("input",{bubbles:!0})))),setTimeout(()=>{P!==R.value&&R.dispatchEvent(new Event("change",{bubbles:!0}))}),l.classList.remove("clr-open"),ie&&We(),R.dispatchEvent(new Event("close",{bubbles:!0})),C.focusInput&&R.focus({preventScroll:!0}),f=r}}function vt(x){let R=Ys(x),z=Zs(R);or(z.s,z.v),nr(R,z),g.value=z.h,l.style.color=`hsl(${z.h}, 100%, 50%)`,v.style.left=`${z.h/360*100}%`,d.style.left=`${E.width*z.s/100}px`,d.style.top=`${E.height-E.height*z.v/100}px`,b.value=z.a*100,y.style.left=`${z.a*100}%`}function qt(x){let R=x.substring(0,3).toLowerCase();return R==="rgb"||R==="hsl"?R:"hex"}function Ke(x){x=x!==r?x:u.value,f&&(f.value=x,f.dispatchEvent(new Event("input",{bubbles:!0}))),C.onChange&&C.onChange.call(s,x,f),o.dispatchEvent(new CustomEvent("coloris:pick",{detail:{color:x,currentEl:f}}))}function tr(x,R){let z={h:g.value*1,s:x/E.width*100,v:100-R/E.height*100,a:b.value/100},D=qs(z);or(z.s,z.v),nr(D,z),Ke()}function or(x,R){let z=C.a11y.marker;x=x.toFixed(1)*1,R=R.toFixed(1)*1,z=z.replace("{s}",x),z=z.replace("{v}",R),d.setAttribute("aria-label",z)}function hn(x){return{pageX:x.changedTouches?x.changedTouches[0].pageX:x.pageX,pageY:x.changedTouches?x.changedTouches[0].pageY:x.pageY}}function _e(x){let R=hn(x),z=R.pageX-E.x,D=R.pageY-E.y;a&&(D+=a.scrollTop),go(z,D),x.preventDefault(),x.stopPropagation()}function rr(x,R){let z=d.style.left.replace("px","")*1+x,D=d.style.top.replace("px","")*1+R;go(z,D)}function go(x,R){x=x<0?0:x>E.width?E.width:x,R=R<0?0:R>E.height?E.height:R,d.style.left=`${x}px`,d.style.top=`${R}px`,tr(x,R),d.focus()}function nr(x,R){x===void 0&&(x={}),R===void 0&&(R={});let z=C.format;for(let N in x)i[N]=x[N];for(let N in R)i[N]=R[N];let D=Xs(i),A=D.substring(0,7);switch(d.style.color=A,y.parentNode.style.color=A,y.style.color=D,p.style.color=D,c.style.display="none",c.offsetHeight,c.style.display="",y.nextElementSibling.style.display="none",y.nextElementSibling.offsetHeight,y.nextElementSibling.style.display="",z==="mixed"?z=i.a===1?"hex":"rgb":z==="auto"&&(z=T),z){case"hex":u.value=D;break;case"rgb":u.value=Qs(i);break;case"hsl":u.value=Js(_s(i));break}o.querySelector(`.clr-format [value="${z}"]`).checked=!0}function Gs(){let x=g.value*1,R=d.style.left.replace("px","")*1,z=d.style.top.replace("px","")*1;l.style.color=`hsl(${x}, 100%, 50%)`,v.style.left=`${x/360*100}%`,tr(R,z)}function js(){let x=b.value/100;y.style.left=`${x*100}%`,nr({a:x}),Ke()}function qs(x){let R=x.s/100,z=x.v/100,D=R*z,A=x.h/60,N=D*(1-e.abs(A%2-1)),Q=z-D;D=D+Q,N=N+Q;let Fe=e.floor(A)%6,oe=[D,N,Q,Q,N,D][Fe],we=[N,D,D,N,Q,Q][Fe],lt=[Q,Q,N,D,D,N][Fe];return{r:e.round(oe*255),g:e.round(we*255),b:e.round(lt*255),a:x.a}}function _s(x){let R=x.v/100,z=R*(1-x.s/100/2),D;return z>0&&z<1&&(D=e.round((R-z)/e.min(z,1-z)*100)),{h:x.h,s:D||0,l:e.round(z*100),a:x.a}}function Zs(x){let R=x.r/255,z=x.g/255,D=x.b/255,A=e.max(R,z,D),N=e.min(R,z,D),Q=A-N,Fe=A,oe=0,we=0;return Q&&(A===R&&(oe=(z-D)/Q),A===z&&(oe=2+(D-R)/Q),A===D&&(oe=4+(R-z)/Q),A&&(we=Q/A)),oe=e.floor(oe*60),{h:oe<0?oe+360:oe,s:e.round(we*100),v:e.round(Fe*100),a:x.a}}function Ys(x){let R=/^((rgba)|rgb)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,z,D;return n.fillStyle="#000",n.fillStyle=x,z=R.exec(n.fillStyle),z?(D={r:z[3]*1,g:z[4]*1,b:z[5]*1,a:z[6]*1},D.a=+D.a.toFixed(2)):(z=n.fillStyle.replace("#","").match(/.{2}/g).map(A=>parseInt(A,16)),D={r:z[0],g:z[1],b:z[2],a:1}),D}function Xs(x){let R=x.r.toString(16),z=x.g.toString(16),D=x.b.toString(16),A="";if(x.r<16&&(R="0"+R),x.g<16&&(z="0"+z),x.b<16&&(D="0"+D),C.alpha&&(x.a<1||C.forceAlpha)){let N=x.a*255|0;A=N.toString(16),N<16&&(A="0"+A)}return"#"+R+z+D+A}function Qs(x){return!C.alpha||x.a===1&&!C.forceAlpha?`rgb(${x.r}, ${x.g}, ${x.b})`:`rgba(${x.r}, ${x.g}, ${x.b}, ${x.a})`}function Js(x){return!C.alpha||x.a===1&&!C.forceAlpha?`hsl(${x.h}, ${x.s}%, ${x.l}%)`:`hsla(${x.h}, ${x.s}%, ${x.l}%, ${x.a})`}function ea(){o.getElementById("clr-picker")||(a=r,l=o.createElement("div"),l.setAttribute("id","clr-picker"),l.className="clr-picker",l.innerHTML=`<input id="clr-color-value" name="clr-color-value" class="clr-color" type="text" value="" spellcheck="false" aria-label="${C.a11y.input}"><div id="clr-color-area" class="clr-gradient" role="application" aria-label="${C.a11y.instruction}"><div id="clr-color-marker" class="clr-marker" tabindex="0"></div></div><div class="clr-hue"><input id="clr-hue-slider" name="clr-hue-slider" type="range" min="0" max="360" step="1" aria-label="${C.a11y.hueSlider}"><div id="clr-hue-marker"></div></div><div class="clr-alpha"><input id="clr-alpha-slider" name="clr-alpha-slider" type="range" min="0" max="100" step="1" aria-label="${C.a11y.alphaSlider}"><div id="clr-alpha-marker"></div><span></span></div><div id="clr-format" class="clr-format"><fieldset class="clr-segmented"><legend>${C.a11y.format}</legend><input id="clr-f1" type="radio" name="clr-format" value="hex"><label for="clr-f1">Hex</label><input id="clr-f2" type="radio" name="clr-format" value="rgb"><label for="clr-f2">RGB</label><input id="clr-f3" type="radio" name="clr-format" value="hsl"><label for="clr-f3">HSL</label><span></span></fieldset></div><div id="clr-swatches" class="clr-swatches"></div><button type="button" id="clr-clear" class="clr-clear" aria-label="${C.a11y.clear}">${C.clearLabel}</button><div id="clr-color-preview" class="clr-preview"><button type="button" id="clr-close" class="clr-close" aria-label="${C.a11y.close}">${C.closeLabel}</button></div><span id="clr-open-label" hidden>${C.a11y.open}</span><span id="clr-swatch-label" hidden>${C.a11y.swatch}</span>`,o.body.appendChild(l),c=ge("clr-color-area"),d=ge("clr-color-marker"),h=ge("clr-clear"),m=ge("clr-close"),p=ge("clr-color-preview"),u=ge("clr-color-value"),g=ge("clr-hue-slider"),v=ge("clr-hue-marker"),b=ge("clr-alpha-slider"),y=ge("clr-alpha-marker"),qe(C.el),at(C.el),X(l,"mousedown",x=>{l.classList.remove("clr-keyboard-nav"),x.stopPropagation()}),X(c,"mousedown",x=>{X(o,"mousemove",_e)}),X(c,"touchstart",x=>{o.addEventListener("touchmove",_e,{passive:!1})}),X(d,"mousedown",x=>{X(o,"mousemove",_e)}),X(d,"touchstart",x=>{o.addEventListener("touchmove",_e,{passive:!1})}),X(u,"change",x=>{let R=u.value;if(f||C.inline){let z=R===""?R:vt(R);Ke(z)}}),X(h,"click",x=>{Ke(""),Oe()}),X(m,"click",x=>{Ke(),Oe()}),X(ge("clr-format"),"click",".clr-format input",x=>{T=x.target.value,nr(),Ke()}),X(l,"click",".clr-swatches button",x=>{vt(x.target.textContent),Ke(),C.swatchesOnly&&Oe()}),X(o,"mouseup",x=>{o.removeEventListener("mousemove",_e)}),X(o,"touchend",x=>{o.removeEventListener("touchmove",_e)}),X(o,"mousedown",x=>{S=!1,l.classList.remove("clr-keyboard-nav"),Oe()}),X(o,"keydown",x=>{let R=x.key,z=x.target,D=x.shiftKey;if(R==="Escape"?Oe(!0):["Tab","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(R)&&(S=!0,l.classList.add("clr-keyboard-nav")),R==="Tab"&&z.matches(".clr-picker *")){let N=Ri(),Q=N.shift(),Fe=N.pop();D&&z===Q?(Fe.focus(),x.preventDefault()):!D&&z===Fe&&(Q.focus(),x.preventDefault())}}),X(o,"click",".clr-field button",x=>{ie&&We(),x.target.nextElementSibling.dispatchEvent(new Event("click",{bubbles:!0}))}),X(d,"keydown",x=>{let R={ArrowUp:[0,-1],ArrowDown:[0,1],ArrowLeft:[-1,0],ArrowRight:[1,0]};Object.keys(R).includes(x.key)&&(rr(...R[x.key]),x.preventDefault())}),X(c,"click",_e),X(g,"input",Gs),X(b,"input",js))}function Ri(){return Array.from(l.querySelectorAll("input, button")).filter(z=>!!z.offsetWidth)}function ge(x){return o.getElementById(x)}function X(x,R,z,D){let A=Element.prototype.matches||Element.prototype.msMatchesSelector;typeof z=="string"?x.addEventListener(R,N=>{A.call(N.target,z)&&D.call(N.target,N)}):(D=z,x.addEventListener(R,D))}function ir(x,R){R=R!==r?R:[],o.readyState!=="loading"?x(...R):o.addEventListener("DOMContentLoaded",()=>{x(...R)})}NodeList!==r&&NodeList.prototype&&!NodeList.prototype.forEach&&(NodeList.prototype.forEach=Array.prototype.forEach);function ta(x,R){f=R,P=f.value,le(R),T=qt(x),st(),vt(x),Ke(),P!==x&&f.dispatchEvent(new Event("change",{bubbles:!0}))}let mn=(()=>{let x={init:ea,set:te,wrap:at,close:Oe,setInstance:fe,setColor:ta,removeInstance:Se,updatePosition:st,ready:ir};function R(z){ir(()=>{z&&(typeof z=="string"?qe(z):te(z))})}for(let z in x)R[z]=function(){for(var D=arguments.length,A=new Array(D),N=0;N<D;N++)A[N]=arguments[N];ir(x[z],A)};return ir(()=>{s.addEventListener("resize",z=>{R.updatePosition()}),s.addEventListener("scroll",z=>{R.updatePosition()})}),R})();return mn.coloris=mn,mn})(window,document,Math)})(),Cs=gt.coloris,Ts=gt.init,Ox=gt.set,Fx=gt.wrap,bi=gt.close,Hx=gt.setInstance,Nx=gt.removeInstance,$x=gt.updatePosition;var ol=s=>(o,e)=>new vi(s,o,e),nt=ol,vi=class{constructor(o,e,r){this.sourceFactory=o;this.startPoint=e;this.viewport=r;this.builder=o(e,r),this.points=[e]}getBBox(){return this.builder.getBBox()}build(){return this.builder.build()}preview(o){this.builder.preview(o)}addPoint(o){this.points.push(o),this.builder.addPoint(o)}async autocorrectShape(){let o=i=>({...i,pos:this.viewport.snapToGrid(i.pos)}),e=o(this.startPoint),r=this.sourceFactory(e,this.viewport),n=this.points.map(i=>o(i));for(let i of n)r.addPoint(i);return r.build()}};var en=nt((s,o)=>new Jr(s,o)),Jr=class{constructor(o,e){this.startPoint=o;this.viewport=e;this.endPoint=o}getLineWidth(){return Math.max(this.endPoint.width,this.startPoint.width)}getBBox(){return this.buildPreview().getBBox()}buildPreview(){let o=this.startPoint.pos,e=this.endPoint.pos,r=e.minus(o).normalized(),n=e.distanceTo(o),i=Math.min(this.getLineWidth(),n/2),a=this.startPoint.width/2,l=this.endPoint.width/2,c=e.minus(r.times(i)),d=r.orthog(),p=d.times(a),u=d.times(l),h=new G(c.minus(u),[{kind:0,point:o.minus(p)},{kind:0,point:o.plus(p)},{kind:0,point:c.plus(u)},{kind:0,point:c.plus(d.times(i).plus(u))},{kind:0,point:e.plus(r.times(l))},{kind:0,point:c.plus(d.times(-i).minus(u))},{kind:0,point:c.minus(u)}]).mapPoints(g=>this.viewport.roundPoint(g));return new ee([{startPoint:h.startPoint,commands:h.parts,style:{fill:this.startPoint.color}}])}build(){return this.buildPreview()}preview(o){this.buildPreview().render(o)}addPoint(o){this.endPoint=o}};var on=nt((s,o)=>new tn(s,o)),tn=class{constructor(o,e){this.startPoint=o;this.viewport=e;this.endPoint=o}getBBox(){return this.buildPreview().getBBox()}buildPreview(){let o=this.startPoint.pos,e=this.endPoint.pos,r=e.minus(o).normalized(),n=this.startPoint.width/2,i=this.endPoint.width/2,a=r.orthog(),l=a.times(n),c=a.times(i),d=o.minus(l),p=new G(d,[{kind:0,point:o.plus(l)},{kind:0,point:e.plus(c)},{kind:0,point:e.minus(c)},{kind:0,point:o.minus(l)}]).mapPoints(h=>this.viewport.roundPoint(h));return new ee([Y(p,{fill:this.startPoint.color})])}build(){return this.buildPreview()}preview(o){this.buildPreview().render(o)}addPoint(o){this.endPoint=o}};var rn=nt((s,o)=>new Zo(s,!0,o)),nn=nt((s,o)=>new Zo(s,!1,o)),Zo=class{constructor(o,e,r){this.startPoint=o;this.filled=e;this.viewport=r;this.endPoint=o}getBBox(){return this.buildPreview().getBBox()}buildPreview(){let o=this.viewport.getRotationAngle(),e=k.zRotation(-o),r=e.inverse().transformVec2(this.startPoint.pos),n=e.inverse().transformVec2(this.endPoint.pos),i=B.fromCorners(r,n),a=G.fromRect(i,this.filled?null:this.endPoint.width).transformedBy(e).mapPoints(c=>this.viewport.roundPoint(c));return new ee([Y(a,{fill:this.endPoint.color})])}build(){return this.buildPreview()}preview(o){this.buildPreview().render(o)}addPoint(o){this.endPoint=o}};var sn=nt((s,o)=>new yi(s,o)),yi=class{constructor(o,e){this.startPoint=o;this.viewport=e;this.endPoint=o}getBBox(){return this.buildPreview().getBBox()}buildPreview(){let o=[],r=Math.PI*2/6,n=$.roundPoint(this.endPoint.width,5/this.viewport.getScaleFactor()),i=this.startPoint.pos.lerp(this.endPoint.pos,.5),l=this.endPoint.pos.minus(i).length()-n/2,c=i.plus(w.of(l,0));for(let u=r;u<=Math.PI*2;u+=r){let h=w.of(l*Math.cos(u),-l*Math.sin(u)).plus(i),g=w.of(Math.cos(u-r/2),-Math.sin(u-r/2)).times(l*1.141).plus(i);o.push({kind:3,controlPoint:g,endPoint:h})}o.push({kind:0,point:c});let d=new G(c,o).mapPoints(u=>this.viewport.roundPoint(u));return new ee([Y(d,{fill:L.transparent,stroke:{width:n,color:this.endPoint.color}})])}build(){return this.buildPreview()}preview(o){this.buildPreview().render(o)}addPoint(o){this.endPoint=o}};var Ss=(s,o)=>{let e=document.createElement("span"),r=document.createElement("span"),n=document.createElement("input");n.type="button",n.classList.add("coloris_input"),e.classList.add("color-input-container"),r.classList.add("color-input-wrapper"),r.appendChild(n),e.appendChild(r);let i=rl(s,e,h=>{n.value=h.toHexString(),c();let m=n.parentElement;m&&m.classList.contains("clr-field")&&(m.style.color=n.value)}),a,l=()=>{a=L.fromHex(n.value)},c=()=>{l(),a&&(s.announceForAccessibility(s.localization.colorChangedAnnouncement(a.toHexString())),o(a),s.notifier.dispatch(12,{kind:12,color:a}))};n.oninput=l;let d=!1;n.addEventListener("open",()=>{d=!0,s.notifier.dispatch(11,{kind:11,open:!0}),i.cancel(),e.classList.add("picker-open"),document.querySelector("#clr-picker #clr-hue-slider")?.focus()});let p=()=>{d=!1,s.notifier.dispatch(11,{kind:11,open:!1}),c(),n.focus(),e.classList.remove("picker-open")};return n.addEventListener("close",()=>{p()}),{input:n,container:e,setValue:h=>{typeof h=="object"&&(h=h.toHexString()),n.value=h,n.dispatchEvent(new Event("input",{bubbles:!0}))},closePicker:()=>{d&&c()},registerWithHelpTextDisplay:h=>{h.registerTextHelpForElement(r,s.localization.colorPickerToggleHelpText),i.registerWithHelpTextDisplay(h)}}},rl=(s,o,e)=>{let r=document.createElement("button");r.classList.add("pipetteButton"),r.title=s.localization.pickColorFromScreen,r.setAttribute("alt",r.title);let n=document.createElement("span");n.classList.add("pickColorInstructions"),n.innerText=s.localization.clickToPickColorAnnouncement;let i=p=>{r.replaceChildren(s.icons.makePipetteIcon(p),n)};i();let a=s.toolController.getMatchingTools(Lt)[0],l=()=>{a?.clearColorListener(),i(),r.classList.remove("active")},c=p=>{l(),p&&e(p)},d=p=>{p?i(p):i()};return r.onclick=()=>{if(r.classList.contains("active")){l(),s.announceForAccessibility(s.localization.colorSelectionCanceledAnnouncement);return}a?.setColorListener(d,c),a&&(r.classList.add("active"),s.announceForAccessibility(s.localization.clickToPickColorAnnouncement))},o.appendChild(r),{cancel:()=>{l()},registerWithHelpTextDisplay:p=>{p.registerTextHelpForElement(r,s.localization.colorPickerPipetteHelpText)}}},bt=Ss;var nl=()=>{let s=[...document.querySelectorAll("*:focus")];return s.length&&s.some(o=>o.classList.contains(`${M}button`))},ye=class extends ue{constructor(e,r,n,i){super(e,n,i);this.targetTool=r;this.targetTool.enabledValue().onUpdateAndNow(a=>{a?(this.setSelected(!0),nl()&&this.focus()):(this.setSelected(!1),this.setDropdownVisible(!1))})}shouldAutoDisableInReadOnlyEditor(){return!this.targetTool.canReceiveInputInReadOnlyEditor()}handleClick(){this.hasDropdown?this.targetTool.isEnabled()?this.setDropdownVisible(!this.isDropdownVisible()):(this.targetTool.setEnabled(!0),this.activateDropdown()):this.targetTool.setEnabled(!this.targetTool.isEnabled())}onKeyPress(e){return this.isSelected()&&e.code==="Space"&&this.hasDropdown?(this.handleClick(),!0):!1}addTo(e){let r=super.addTo(e);return this.setSelected(this.targetTool.isEnabled()),r}};var xi="jsdraw.toolbar.SelectionTool.resizeImageToSelection";H.registerDefaultKeyboardShortcut(xi,["ctrlOrMeta+r"],"Resize image to selection");var Yo=[1,2,3,4,5,6,7,8,9].map(s=>`jsdraw.toolbar.PenTool.select-pen-${s}`);for(let s=0;s<Yo.length;s++){let o=Yo[s];H.registerDefaultKeyboardShortcut(o,[`CtrlOrMeta+Digit${s+1}`],"Select pen style "+(s+1))}var wi="jsdraw.toolbar.SaveActionWidget.save";H.registerDefaultKeyboardShortcut(wi,["ctrlOrMeta+KeyS"],"Save");var Ci="jsdraw.toolbar.ExitActionWidget.exit";H.registerDefaultKeyboardShortcut(Ci,["Alt+KeyQ"],"Exit");var il=0,sl=(s,o)=>{let e=document.createElement("div"),r=document.createElement("label"),n=document.createElement("input");e.classList.add(`${M}thicknessSliderContainer`),n.id=`${M}thicknessInput${il++}`,r.innerText=s.localization.thicknessLabel,r.setAttribute("for",n.id);let i=c=>Math.log10(c),a=c=>10**c;n.type="range",n.oninput=()=>{o(a(parseFloat(n.value)))},e.appendChild(r),e.appendChild(n);let l=(c,d)=>{let p=(m,g)=>(g?Math.ceil:Math.floor)(m*100)/100,u=p(i(c),!1),h=p(i(d),!0);n.min=`${u}`,n.max=`${h}`,n.step=`${de((h-u)/20)}`};return l(2,262),{container:e,addTo:c=>{c.appendChild(e)},setBounds:l,setValue:c=>{n.value=i(c).toString()}}},an=sl;var al=s=>{let o=(e,r,n,i)=>{let a=r!==i&&e!==0,l=n+e<=0,d=n+r+e>i;return a&&!l&&!d};s.onwheel=e=>{let r=o(e.deltaX,s.clientWidth,s.scrollLeft,s.scrollWidth),n=o(e.deltaY,s.clientHeight,s.scrollTop,s.scrollHeight);(r||n)&&e.stopPropagation()}},ho=al;var Ti=0,ll=(s,o,e)=>{let r=document.createElement("div");r.classList.add(`${M}grid-selector`);let n=pe.fromInitialValue(o),i=document.createElement("div");i.setAttribute("role","menu"),i.id=`${M}-grid-select-id-${Ti++}`,ho(i);let a=document.createElement("label");a.textContent=s,a.htmlFor=i.id,r.appendChild(a);let l=`${M}-grid-selector-${Ti++}`,c=u=>{let h=document.createElement("div");h.classList.add("choice-button");let m=document.createElement("input");m.type="radio",m.id=`${M}-grid-select-button-${Ti++}`,uo(h);let g=document.createElement("label"),v=()=>{g.setAttribute("title",u.title);let P=document.createElement("span");P.classList.add("button-label-text");let S=u.makeIcon();S.classList.add("icon"),P.innerText=u.title,g.htmlFor=m.id,g.replaceChildren(S,P)};v();let b=()=>{m.name=l};b();let y=()=>{m.checked?h.classList.add("checked"):h.classList.remove("checked")};m.oninput=()=>{m.checked&&n.set(u.id),y()},m.onfocus=()=>{h.querySelector(":focus-visible")&&h.classList.add("focus-visible")},m.onblur=()=>{h.classList.remove("focus-visible")},h.oncontextmenu=P=>{P.preventDefault()},h.replaceChildren(m,g),i.appendChild(h);let f=P=>{m.checked=P,y()};return f(!1),{choiceRecord:u,setChecked:f,updateIcon:()=>{v()},updateButtonRadiogroupName:b}},d=[];for(let u of e)d.push(c(u));r.appendChild(i),n.onUpdateAndNow(u=>{for(let h=0;h<d.length;h++)d[h].setChecked(d[h].choiceRecord.id===u)});let p={value:n,_radiogroupName:l,linkWith:u=>{p._radiogroupName=u._radiogroupName,l=u._radiogroupName;for(let h of d)h.updateButtonRadiogroupName()},updateIcons:()=>{d.forEach(u=>u.updateIcon())},getRootElement(){return r},addTo:u=>{u.appendChild(r)}};return p},Si=ll;var Nt=class s extends ye{constructor(e,r,n){super(e,r,"pen",n);this.tool=r;this.updateInputs=()=>{};this.shapelikeIDs=["pressure-sensitive-pen","freehand-pen"];let i=e.getCurrentSettings().pens?.additionalPenTypes??[],a=e.getCurrentSettings().pens?.filterPenTypes??(()=>!0);this.penTypes=[{name:this.localizationTable.flatTipPen,id:"pressure-sensitive-pen",factory:Dt},{name:this.localizationTable.roundedTipPen,id:"freehand-pen",factory:Qe},{name:this.localizationTable.roundedTipPen2,id:"polyline-pen",factory:ft},...i.filter(l=>!l.isShapeBuilder),{name:this.localizationTable.arrowPen,id:"arrow",isShapeBuilder:!0,factory:en},{name:this.localizationTable.linePen,id:"line",isShapeBuilder:!0,factory:on},{name:this.localizationTable.filledRectanglePen,id:"filled-rectangle",isShapeBuilder:!0,factory:rn},{name:this.localizationTable.outlinedRectanglePen,id:"outlined-rectangle",isShapeBuilder:!0,factory:nn},{name:this.localizationTable.outlinedCirclePen,id:"outlined-circle",isShapeBuilder:!0,factory:sn},...i.filter(l=>l.isShapeBuilder)].filter(a),this.editor.notifier.on(2,l=>{if(l.kind!==2)throw new Error("Invalid event type!");l.tool===this.tool&&(this.updateIcon(),this.updateInputs())})}static{this.idCounter=0}getTitle(){return this.targetTool.description}getCurrentPenTypeIdx(){let e=this.tool.getStrokeFactory();for(let r=0;r<this.penTypes.length;r++)if(this.penTypes[r].factory===e)return r;return-1}getCurrentPenType(){for(let e of this.penTypes)if(e.factory===this.tool.getStrokeFactory())return e;return null}createIconForRecord(e){let r={...this.tool.getStyleValue().get()};e?.factory&&(r.factory=e.factory);let n=e?.factory;return!n||n===Qe||n===Dt||n===ft?this.editor.icons.makePenIcon(r):this.editor.icons.makeIconFromFactory(r)}createIcon(){return this.createIconForRecord(this.getCurrentPenType())}createPenTypeSelector(e){let r=this.penTypes.map((d,p)=>({id:p,makeIcon:()=>this.createIconForRecord(d),title:d.name,isShapeBuilder:d.isShapeBuilder??!1})),n=r.filter(d=>!d.isShapeBuilder),i=Si(this.localizationTable.selectPenType,this.getCurrentPenTypeIdx(),n),a=r.filter(d=>d.isShapeBuilder),l=Si(this.localizationTable.selectShape,this.getCurrentPenTypeIdx(),a),c=d=>{this.tool.setStrokeFactory(this.penTypes[d].factory)};return i.value.onUpdate(c),l.value.onUpdate(c),e?.registerTextHelpForElements([i.getRootElement(),l.getRootElement()],this.localizationTable.penDropdown__penTypeHelpText),{setValue:d=>{i.value.set(d),l.value.set(d)},updateIcons:()=>{i.updateIcons(),l.updateIcons()},addTo:d=>{n.length&&i.addTo(d),a.length&&l.addTo(d)}}}createStrokeCorrectionOptions(e){let r=document.createElement("div");r.classList.add("action-button-row",`${M}-pen-tool-toggle-buttons`);let n=(l,c)=>{let d=document.createElement("button");d.classList.add(`${M}-toggle-button`);let p=c.cloneNode(!0);p.classList.add("icon");let u=document.createElement("span");u.innerText=l,d.replaceChildren(p,u),d.setAttribute("role","switch"),r.appendChild(d);let h=!1,m=v=>{},g={setChecked(v){h=v,d.setAttribute("aria-checked",`${h}`),m(h)},setOnInputListener(v){m=v},addHelpText(v){e?.registerTextHelpForElement(d,v)}};return d.onclick=()=>{g.setChecked(!h)},g},i=n(this.localizationTable.inputStabilization,this.editor.icons.makeStrokeSmoothingIcon());i.setOnInputListener(l=>{this.tool.setHasStabilization(l)});let a=n(this.localizationTable.strokeAutocorrect,this.editor.icons.makeShapeAutocorrectIcon());return a.setOnInputListener(l=>{this.tool.setStrokeAutocorrectEnabled(l)}),a.addHelpText(this.localizationTable.penDropdown__autocorrectHelpText),i.addHelpText(this.localizationTable.penDropdown__stabilizationHelpText),{update:()=>{i.setChecked(!!this.tool.getInputMapper()),a.setChecked(this.tool.getStrokeAutocorrectionEnabled())},addTo:l=>{l.appendChild(r)}}}getHelpText(){return this.localizationTable.penDropdown__baseHelpText}fillDropdown(e,r){let n=document.createElement("div");n.classList.add(`${M}spacedList`,`${M}nonbutton-controls-main-list`);let{container:i,setValue:a}=an(this.editor,g=>{this.tool.setThickness(g)}),l=document.createElement("div"),c=document.createElement("label"),d=bt(this.editor,g=>{this.tool.setColor(g)}),{input:p,container:u}=d;p.id=`${M}colorInput${s.idCounter++}`,c.innerText=this.localizationTable.colorLabel,c.setAttribute("for",p.id),l.appendChild(c),l.appendChild(u);let h=this.createStrokeCorrectionOptions(r),m=this.createPenTypeSelector(r);return r?.registerTextHelpForElement(l,this.localizationTable.penDropdown__colorHelpText),r&&d.registerWithHelpTextDisplay(r),r?.registerTextHelpForElement(i,this.localizationTable.penDropdown__thicknessHelpText),this.updateInputs=()=>{d.setValue(this.tool.getColor()),a(this.tool.getThickness()),m.updateIcons(),m.setValue(this.getCurrentPenTypeIdx()),h.update()},this.updateInputs(),n.replaceChildren(l,i),m.addTo(n),e.replaceChildren(n),h.addTo(e),!0}onKeyPress(e){if(!this.isSelected())return!1;for(let r=0;r<Yo.length;r++){let n=Yo[r];if(this.editor.shortcuts.matchesShortcut(n,e)){let i=r;if(i<this.penTypes.length)return this.tool.setStrokeFactory(this.penTypes[i].factory),!0}}return!!super.onKeyPress(e)}serializeState(){return{...super.serializeState(),color:this.tool.getColor().toHexString(),thickness:this.tool.getThickness(),strokeFactoryId:this.getCurrentPenType()?.id,inputStabilization:!!this.tool.getInputMapper(),strokeAutocorrect:this.tool.getStrokeAutocorrectionEnabled()}}deserializeFrom(e){super.deserializeFrom(e);let r=(n,i)=>{let a=typeof e[n];if(a!==i)throw new Error(`Deserializing property ${n}: Invalid type. Expected ${i}, was ${a}.`)};if(e.color&&(r("color","string"),this.tool.setColor(L.fromHex(e.color))),e.thickness&&(r("thickness","number"),this.tool.setThickness(e.thickness)),e.strokeFactoryId){r("strokeFactoryId","string");let n=e.strokeFactoryId;for(let i of this.penTypes)if(n===i.id){this.tool.setStrokeFactory(i.factory);break}}e.inputStabilization!==void 0&&this.tool.setHasStabilization(!!e.inputStabilization),e.strokeAutocorrect!==void 0&&this.tool.setStrokeAutocorrectEnabled(!!e.strokeAutocorrect)}};var $t=class s extends ye{constructor(e,r,n){super(e,r,"eraser-tool-widget",n);this.tool=r;this.updateInputs=()=>{};this.editor.notifier.on(2,i=>{i.kind===2&&i.tool===this.tool&&(this.updateInputs(),this.updateIcon())})}getHelpText(){return this.localizationTable.eraserDropdown__baseHelpText}getTitle(){return this.localizationTable.eraser}makeIconForType(e){return this.editor.icons.makeEraserIcon(this.tool.getThickness(),e)}createIcon(){return this.makeIconForType(this.tool.getModeValue().get())}static{this.idCounter=0}makeEraserTypeSelector(e){let r=document.createElement("div"),n=document.createElement("label"),i=document.createElement("input");i.id=`${M}eraserToolWidget-${s.idCounter++}`,n.htmlFor=i.id,n.innerText=this.localizationTable.fullStrokeEraser,i.type="checkbox",i.oninput=()=>{this.tool.getModeValue().set(i.checked?"full-stroke":"partial-stroke")};let a=()=>{i.checked=this.tool.getModeValue().get()==="full-stroke"};return r.replaceChildren(n,i),e?.registerTextHelpForElement(r,this.localizationTable.eraserDropdown__fullStrokeEraserHelpText),{addTo:l=>{l.appendChild(r)},updateValue:a}}fillDropdown(e,r){let n=document.createElement("div");n.classList.add(`${M}spacedList`,`${M}nonbutton-controls-main-list`);let i=an(this.editor,l=>{this.tool.setThickness(l)});i.setBounds(10,55),r?.registerTextHelpForElement(i.container,this.localizationTable.eraserDropdown__thicknessHelpText);let a=this.makeEraserTypeSelector(r);return this.updateInputs=()=>{i.setValue(this.tool.getThickness()),a.updateValue()},this.updateInputs(),n.replaceChildren(i.container),a.addTo(n),e.replaceChildren(n),!0}serializeState(){return{...super.serializeState(),thickness:this.tool.getThickness(),mode:this.tool.getModeValue().get()}}deserializeFrom(e){if(super.deserializeFrom(e),e.thickness){let r=parseFloat(e.thickness);if(typeof r!="number"||!isFinite(r))throw new Error(`Deserializing property ${r} is not a number or is not finite.`);this.tool.setThickness(r)}if(e.mode){let r=e.mode;Object.values(no).includes(r)&&this.tool.getModeValue().set(r)}}};var xe=class extends ue{constructor(e,r,n,i,a,l,c=!1,d=!0){super(e,r,l);this.makeIcon=n;this.title=i;this.clickAction=a;this.mustBeToplevel=c;this.#e=d}#e;#t=void 0;setHelpText(e){this.#t=e}getHelpText(){return this.#t}shouldAutoDisableInReadOnlyEditor(){return this.#e}handleClick(){this.clickAction()}getTitle(){return this.title}createIcon(){return this.makeIcon()}fillDropdown(e){return!1}mustBeInToplevelMenu(){return this.mustBeToplevel}};var cl=(s="")=>{let o=document.createElement("div");return o.classList.add("tool-dropdown-separator"),o.innerText=s,{addTo:e=>{e.appendChild(o)}}},ln=cl;var dl=(s,o,e)=>{let r=document.createElement("div");r.classList.add("selection-format-menu",`${M}spacedList`,`${M}indentedList`);let n=document.createElement("div"),i=document.createElement("label"),a=bt(s,p=>{let u=o.getSelection();if(u){let h=[];for(let g of u.getSelectedObjects())Mo(g)&&h.push(g.updateStyle({color:p}));let m=se(h);s.dispatch(m)}}),{input:l,container:c}=a;i.innerText=e.colorLabel;let d=()=>{let p=o.getSelection();if(p&&p.getSelectedItemCount()>0){l.disabled=!1,r.classList.remove("disabled");let u=[];for(let h of p.getSelectedObjects())if(Mo(h)){let m=h.getStyle().color;m&&u.push(m)}a.setValue(L.average(u))}else l.disabled=!0,r.classList.add("disabled"),a.setValue(L.transparent)};return n.replaceChildren(i,c),r.replaceChildren(n),{addTo:p=>{p.appendChild(r)},update:d,registerHelpText:p=>{p.registerTextHelpForElement(n,e.selectionDropdown__changeColorHelpText),a.registerWithHelpTextDisplay(p)}}},Ut=class extends ye{constructor(e,r,n){super(e,r,"selection-tool-widget",n);this.tool=r;this.updateFormatMenu=()=>{};let i=new xe(e,"resize-btn",()=>e.icons.makeResizeImageToSelectionIcon(),this.localizationTable.resizeImageToSelection,()=>{this.resizeImageToSelection()},n);i.setHelpText(this.localizationTable.selectionDropdown__resizeToHelpText);let a=new xe(e,"delete-btn",()=>e.icons.makeDeleteSelectionIcon(),this.localizationTable.deleteSelection,()=>{let d=this.tool.getSelection();this.editor.dispatch(d.deleteSelectedObjects()),this.tool.clearSelection()},n);a.setHelpText(this.localizationTable.selectionDropdown__deleteHelpText);let l=new xe(e,"duplicate-btn",()=>e.icons.makeDuplicateSelectionIcon(),this.localizationTable.duplicateSelection,async()=>{let d=this.tool.getSelection();this.editor.dispatch(await d.duplicateSelectedObjects()),this.setDropdownVisible(!1)},n);l.setHelpText(this.localizationTable.selectionDropdown__duplicateHelpText),this.addSubWidget(i),this.addSubWidget(a),this.addSubWidget(l);let c=d=>{i.setDisabled(d),a.setDisabled(d),l.setDisabled(d)};c(!0),this.editor.notifier.on(2,d=>{if(d.kind!==2)throw new Error("Invalid event type!");if(d.tool===this.tool){let p=this.tool.getSelection(),u=p&&p.getSelectedItemCount()>0;c(!u),this.updateFormatMenu()}})}resizeImageToSelection(){let e=this.tool.getSelection();e&&this.editor.dispatch(this.editor.setImportExportRect(e.region))}onKeyPress(e){return this.editor.shortcuts.matchesShortcut(xi,e)?(this.resizeImageToSelection(),!0):!!super.onKeyPress(e)}getTitle(){return this.localizationTable.select}createIcon(){return this.editor.icons.makeSelectionIcon()}getHelpText(){return this.localizationTable.selectionDropdown__baseHelpText}fillDropdown(e,r){super.fillDropdown(e,r);let n=document.createElement("div");n.classList.add(`${M}nonbutton-controls-main-list`),e.appendChild(n),ln(this.localizationTable.reformatSelection).addTo(n);let i=dl(this.editor,this.tool,this.localizationTable);return i.addTo(n),this.updateFormatMenu=()=>i.update(),r&&i.registerHelpText(r),i.update(),!0}};var Wt=class s extends ye{constructor(e,r,n){super(e,r,"text-tool-widget",n);this.tool=r;this.updateDropdownInputs=null;e.notifier.on(2,i=>{i.kind===2&&i.tool===r&&(this.updateIcon(),this.updateDropdownInputs?.())})}getTitle(){return this.targetTool.description}createIcon(){let e=this.tool.getTextStyle();return this.editor.icons.makeTextIcon(e)}static{this.idCounter=0}fillDropdown(e){let r=document.createElement("div");r.classList.add(`${M}spacedList`,`${M}nonbutton-controls-main-list`);let n=document.createElement("div"),i=document.createElement("div"),a=document.createElement("div"),l=document.createElement("select"),c=document.createElement("label"),d=document.createElement("input"),p=document.createElement("label"),{input:u,container:h,setValue:m}=bt(this.editor,f=>{this.tool.setColor(f)}),g=document.createElement("label"),v=new Set,b=f=>{let T=document.createElement("option");T.value=f,T.textContent=f,l.appendChild(T),v.add(f)};d.setAttribute("type","number"),d.min="1",d.max="128",c.innerText=this.localizationTable.fontLabel,g.innerText=this.localizationTable.colorLabel,p.innerText=this.localizationTable.textSize,u.id=`${M}-text-color-input-${s.idCounter++}`,g.setAttribute("for",u.id),d.id=`${M}-text-size-input-${s.idCounter++}`,p.setAttribute("for",d.id);let y=this.editor.getCurrentSettings().text?.fonts??[];for(let f of y)b(f);return l.classList.add("font-selector"),l.id=`${M}-text-font-input-${s.idCounter++}`,c.setAttribute("for",l.id),l.onchange=()=>{this.tool.setFontFamily(l.value)},d.onchange=()=>{let f=parseInt(d.value);!isNaN(f)&&f>0&&this.tool.setFontSize(f)},i.appendChild(g),i.appendChild(h),n.appendChild(c),n.appendChild(l),a.appendChild(p),a.appendChild(d),this.updateDropdownInputs=()=>{let f=this.tool.getTextStyle();m(f.renderingStyle.fill),v.has(f.fontFamily)||b(f.fontFamily),l.value=f.fontFamily,d.value=`${f.size}`},this.updateDropdownInputs(),r.replaceChildren(i,a,n),e.appendChild(r),!0}serializeState(){let e=this.tool.getTextStyle();return{...super.serializeState(),fontFamily:e.fontFamily,textSize:e.size,color:e.renderingStyle.fill.toHexString()}}deserializeFrom(e){e.fontFamily&&typeof e.fontFamily=="string"&&this.tool.setFontFamily(e.fontFamily),e.color&&typeof e.color=="string"&&this.tool.setColor(L.fromHex(e.color)),e.textSize&&typeof e.textSize=="number"&&this.tool.setFontSize(e.textSize),super.deserializeFrom(e)}};var pl=(s,o,e)=>{let r=document.createElement("div"),n=document.createElement("button"),i=document.createElement("button"),a=document.createElement("button"),l=document.createElement("span");n.innerText="+",i.innerText="-",a.innerText=s.resetView,r.replaceChildren(l,n,i,a),r.classList.add(`${M}zoomLevelEditor`),l.classList.add("zoomDisplay");let c,d=()=>{let u=o.viewport.getScaleFactor()*100;u>.1?u=Math.round(u*10)/10:u=Math.round(u*1e3)/1e3,u!==c&&(l.textContent=s.zoomLevel(u),c=u)};d(),o.notifier.on(7,u=>{u.kind===7&&(d(),a.disabled=u.newTransform.eq(k.identity))});let p=u=>{let h=o.viewport.visibleRect.center,m=k.scaling2D(u,h);o.dispatch($.transformBy(m),!1)};return n.onclick=()=>{p(5/4)},i.onclick=()=>{p(4/5)},a.onclick=()=>{o.dispatch($.transformBy(o.viewport.canvasToScreenTransform.inverse()),!1)},e?.registerTextHelpForElement(n,s.handDropdown__zoomInHelpText),e?.registerTextHelpForElement(i,s.handDropdown__zoomOutHelpText),e?.registerTextHelpForElement(a,s.handDropdown__resetViewHelpText),e?.registerTextHelpForElement(l,s.handDropdown__zoomDisplayHelpText),r},cn=class extends ue{constructor(e,r,n,i,a,l,c){super(e,`pan-mode-${n}`,c);this.tool=r;this.flag=n;this.makeIcon=i;this.title=a;this.helpText=l;e.notifier.on(2,d=>{if(d.kind===2&&d.tool===r){let p=!!(r.getMode()&8);this.setSelected(!!(r.getMode()&n)||p),this.setDisabled(p&&n!==8)}}),this.setSelected(!1)}shouldAutoDisableInReadOnlyEditor(){return!1}setModeFlag(e){this.tool.setModeEnabled(this.flag,e)}handleClick(){this.setModeFlag(!this.isSelected())}getTitle(){return this.title}createIcon(){return this.makeIcon()}fillDropdown(e){return!1}getHelpText(){return this.helpText}},Kt=class s extends ye{constructor(o,e,r){let n=o.toolController.getPrimaryTools().includes(e),i=(n?e:s.getPrimaryHandTool(o.toolController))??e;super(o,i,"hand-tool-widget",r),this.overridePanZoomTool=(n?s.getOverrideHandTool(o.toolController):e)??e,this.allowTogglingBaseTool=i!==null,this.allowTogglingBaseTool||this.container.classList.add("dropdownShowable");let a=new cn(o,this.overridePanZoomTool,1,()=>this.editor.icons.makeTouchPanningIcon(),r.touchPanning,r.handDropdown__touchPanningHelpText,r),l=new cn(o,this.overridePanZoomTool,32,()=>this.editor.icons.makeRotationLockIcon(),r.lockRotation,r.handDropdown__lockRotationHelpText,r);this.addSubWidget(a),this.addSubWidget(l)}static getPrimaryHandTool(o){return o.getPrimaryTools().filter(n=>n instanceof Ce)[0]}static getOverrideHandTool(o){return o.getMatchingTools(Ce)[0]}shouldAutoDisableInReadOnlyEditor(){return!1}getTitle(){return this.localizationTable.handTool}createIcon(){return this.editor.icons.makeHandToolIcon()}handleClick(){this.allowTogglingBaseTool?super.handleClick():this.setDropdownVisible(!this.isDropdownVisible())}getHelpText(){return this.localizationTable.handDropdown__baseHelpText}fillDropdown(o,e){super.fillDropdown(o,e);let r=document.createElement("div");r.classList.add(`${M}nonbutton-controls-main-list`),ln().addTo(r);let n=pl(this.localizationTable,this.editor,e);return r.appendChild(n),o.appendChild(r),!0}setSelected(o){this.allowTogglingBaseTool&&super.setSelected(o)}serializeState(){let o=this.overridePanZoomTool.getMode();return{...super.serializeState(),touchPanning:o&1,rotationLocked:o&32}}deserializeFrom(o){o.touchPanning!==void 0&&this.overridePanZoomTool.setModeEnabled(1,!!o.touchPanning),o.rotationLocked!==void 0&&this.overridePanZoomTool.setModeEnabled(32,!!o.rotationLocked),super.deserializeFrom(o)}};var ul=0,hl=(s,o,{accepts:e="*",allowMultiSelect:r=!1,customPickerAction:n}={})=>{let i=document.createElement("div"),a=document.createElement("label"),l=document.createElement("input"),c=document.createElement("div");c.classList.add("toolbar--file-input-description");let d=document.createElement("span");i.classList.add("toolbar--file-input-container"),a.appendChild(document.createTextNode(s)),l.accept=e,l.type=n?"button":"file",l.classList.add("file-input"),l.multiple=r;let p=`js-draw-file-input-${ul++}`;l.setAttribute("id",p),a.htmlFor=p;let u=o.icons.makeUploadFileIcon();u.classList.add("icon"),c.replaceChildren(u,d),a.appendChild(c),i.replaceChildren(a,l);let h=vr.fromInitialValue([]),m=!1,g=null,v=()=>{let y=h.get();if(m){if(d.textContent=o.localization.fileInput__loading,g){let f=document.createElement("b");f.textContent=o.localization.cancel,f.classList.add("cancel-button"),d.appendChild(f)}u.style.display="none"}else if(y.length>0){let f=y.map(P=>P.name),T=5;if(f.length<=T)d.textContent=f.join(`
444
+ `)),this.dropdownContent.replaceChildren(),this.#e=this.fillDropdown(this.dropdownContent,r),this.#e&&(this.button.classList.add("has-dropdown"),this.dropdown?.destroy(),this.dropdownIcon=this.createDropdownIcon(),this.button.appendChild(this.dropdownIcon),this.dropdown=this.layoutManager.createToolMenu({target:this.button,getTitle:()=>this.getTitle(),isToplevel:()=>this.toplevel}),this.dropdown.visible.onUpdate(i=>{i?this.container.classList.add("dropdownVisible"):this.container.classList.remove("dropdownVisible"),i||this.focus()}),r.hasHelpText()&&this.dropdown.appendChild(r.createToggleButton()),this.dropdown.appendChild(this.dropdownContent)),this.setDropdownVisible(!1),this.container.parentElement&&this.container.remove(),this.#n(),o.appendChild(this.container),this.container}remove(){this.container.remove(),this.#r?.()}focus(){this.button.focus()}addCSSClassToContainer(o){this.container.classList.add(o)}removeCSSClassFromContainer(o){this.container.classList.remove(o)}updateIcon(){let o=this.createIcon();o?this.container.classList.remove("no-icon"):(o=document.createElement("div"),this.container.classList.add("no-icon")),this.icon?.replaceWith(o),this.icon=o,this.icon.classList.add(`${D}icon`)}setDisabled(o){this.disabled=o,this.#t=!1,this.disabled?(this.button.classList.add("disabled"),this.button.setAttribute("aria-disabled","true")):(this.button.classList.remove("disabled"),this.button.removeAttribute("aria-disabled"))}setSelected(o){this.isSelected()!==o&&(this.button.setAttribute("role","switch"),o?(this.container.classList.add("selected"),this.button.setAttribute("aria-checked","true")):(this.container.classList.remove("selected"),this.button.setAttribute("aria-checked","false")))}setDropdownVisible(o){o?this.dropdown?.requestShow():this.dropdown?.requestHide()}activateDropdown(){this.dropdown?.onActivated()}mustBeInToplevelMenu(){return!1}canBeInOverflowMenu(){return!this.mustBeInToplevelMenu()}getButtonWidth(){return this.button.clientWidth}isHidden(){return this.container.style.display==="none"}setHidden(o){this.container.style.display=o?"none":""}setIsToplevel(o){this.toplevel=o}isDropdownVisible(){return this.dropdown?.visible?.get()??!1}isSelected(){return this.container.classList.contains("selected")}createDropdownIcon(){let o=this.editor.icons.makeDropdownIcon();return o.classList.add(`${D}showHideDropdownIcon`),o}serializeState(){let o={};for(let e in this.subWidgets)o[e]=this.subWidgets[e].serializeState();return{subwidgetState:o}}deserializeFrom(o){if(o.subwidgetState){yr(o.subwidgetState);for(let e in o.subwidgetState)if(e in this.subWidgets){let r=o.subwidgetState[e];r&&this.subWidgets[e].deserializeFrom(r)}}}};var Qo=class{constructor(o,e,r,n,i){this.setSidebarContent=o;this.sidebarTitle=e;this.sidebarVisibility=r;this.announceForAccessibility=n;this.localization=i;this.visibleWidgetContent=j.fromInitialValue(null)}createToolMenu(o){let e=document.createElement("div"),r=null,n=j.fromCallback(()=>this.visibleWidgetContent.get()===r&&this.sidebarVisibility.get(),[this.visibleWidgetContent,this.sidebarVisibility]);return r={visible:n,requestShow:()=>{this.setSidebarContent(e),this.sidebarTitle.set(o.getTitle()),this.visibleWidgetContent.set(r),this.sidebarVisibility.set(!0),this.announceForAccessibility(this.localization.dropdownShown(o.getTitle()))},onActivated:()=>{},requestHide:()=>{n.get()&&this.sidebarVisibility.set(!1)},appendChild:i=>{e.appendChild(i)},clearChildren:()=>{e.replaceChildren()},destroy:()=>{r?.requestHide(),e.parentElement&&e.remove(),this.visibleWidgetContent.get()===r&&this.visibleWidgetContent.set(null)}},r}};var bt=(()=>{return((s,o,e,r)=>{let n=o.createElement("canvas").getContext("2d"),i={r:0,g:0,b:0,h:0,s:0,v:0,a:1},a,l,c,d,u,p,h,m,g,v,b,y,f,T,P,S,E={},C={el:"[data-coloris]",parent:"body",theme:"default",themeMode:"light",rtl:!1,wrap:!0,margin:2,format:"hex",formatToggle:!1,swatches:[],swatchesOnly:!1,alpha:!0,forceAlpha:!1,focusInput:!0,selectInput:!1,inline:!1,defaultColor:"#000000",clearButton:!1,clearLabel:"Clear",closeButton:!1,closeLabel:"Close",onChange:()=>r,a11y:{open:"Open color picker",close:"Close color picker",clear:"Clear the selected color",marker:"Saturation: {s}. Brightness: {v}.",hueSlider:"Hue slider",alphaSlider:"Opacity slider",input:"Color value field",format:"Color format",swatch:"Color swatch",instruction:"Saturation and brightness selector. Use up, down, left and right arrow keys to select."}},V={},O="",G={},se=!1;function oe(x){if(typeof x=="object")for(let R in x)switch(R){case"el":_e(x.el),x.wrap!==!1&&at(x.el);break;case"parent":a=o.querySelector(x.parent),a&&(a.appendChild(l),C.parent=x.parent,a===o.body&&(a=r));break;case"themeMode":C.themeMode=x.themeMode,x.themeMode==="auto"&&s.matchMedia&&s.matchMedia("(prefers-color-scheme: dark)").matches&&(C.themeMode="dark");case"theme":x.theme&&(C.theme=x.theme),l.className=`clr-picker clr-${C.theme} clr-${C.themeMode}`,C.inline&&st();break;case"rtl":C.rtl=!!x.rtl,o.querySelectorAll(".clr-field").forEach(A=>A.classList.toggle("clr-rtl",C.rtl));break;case"margin":x.margin*=1,C.margin=isNaN(x.margin)?C.margin:x.margin;break;case"wrap":x.el&&x.wrap&&at(x.el);break;case"formatToggle":C.formatToggle=!!x.formatToggle,ge("clr-format").style.display=C.formatToggle?"block":"none",C.formatToggle&&(C.format="auto");break;case"swatches":if(Array.isArray(x.swatches)){let A=[];x.swatches.forEach((N,Q)=>{A.push(`<button type="button" id="clr-swatch-${Q}" aria-labelledby="clr-swatch-label clr-swatch-${Q}" style="color: ${N};">${N}</button>`)}),ge("clr-swatches").innerHTML=A.length?`<div>${A.join("")}</div>`:"",C.swatches=x.swatches.slice()}break;case"swatchesOnly":C.swatchesOnly=!!x.swatchesOnly,l.setAttribute("data-minimal",C.swatchesOnly);break;case"alpha":C.alpha=!!x.alpha,l.setAttribute("data-alpha",C.alpha);break;case"inline":if(C.inline=!!x.inline,l.setAttribute("data-inline",C.inline),C.inline){let A=x.defaultColor||C.defaultColor;T=Yt(A),st(),yt(A)}break;case"clearButton":typeof x.clearButton=="object"&&(x.clearButton.label&&(C.clearLabel=x.clearButton.label,h.innerHTML=C.clearLabel),x.clearButton=x.clearButton.show),C.clearButton=!!x.clearButton,h.style.display=C.clearButton?"block":"none";break;case"clearLabel":C.clearLabel=x.clearLabel,h.innerHTML=C.clearLabel;break;case"closeButton":C.closeButton=!!x.closeButton,C.closeButton?l.insertBefore(m,u):u.appendChild(m);break;case"closeLabel":C.closeLabel=x.closeLabel,m.innerHTML=C.closeLabel;break;case"a11y":let z=x.a11y,M=!1;if(typeof z=="object")for(let A in z)z[A]&&C.a11y[A]&&(C.a11y[A]=z[A],M=!0);if(M){let A=ge("clr-open-label"),N=ge("clr-swatch-label");A.innerHTML=C.a11y.open,N.innerHTML=C.a11y.swatch,m.setAttribute("aria-label",C.a11y.close),h.setAttribute("aria-label",C.a11y.clear),g.setAttribute("aria-label",C.a11y.hueSlider),b.setAttribute("aria-label",C.a11y.alphaSlider),p.setAttribute("aria-label",C.a11y.input),c.setAttribute("aria-label",C.a11y.instruction)}break;default:C[R]=x[R]}}function fe(x,R){typeof x=="string"&&typeof R=="object"&&(V[x]=R,se=!0)}function Se(x){delete V[x],Object.keys(V).length===0&&(se=!1,x===O&&We())}function de(x){if(se){let R=["el","wrap","rtl","inline","defaultColor","a11y"];for(let z in V){let M=V[z];if(x.matches(z)){O=z,G={},R.forEach(A=>delete M[A]);for(let A in M)G[A]=Array.isArray(C[A])?C[A].slice():C[A];oe(M);break}}}}function We(){Object.keys(G).length>0&&(oe(G),O="",G={})}function _e(x){X(o,"click",x,R=>{C.inline||(de(R.target),f=R.target,P=f.value,T=Yt(P),l.classList.add("clr-open"),st(),yt(P),(C.focusInput||C.selectInput)&&(p.focus({preventScroll:!0}),p.setSelectionRange(f.selectionStart,f.selectionEnd)),C.selectInput&&p.select(),(S||C.swatchesOnly)&&Mi().shift().focus(),f.dispatchEvent(new Event("open",{bubbles:!0})))}),X(o,"input",x,R=>{let z=R.target.parentNode;z.classList.contains("clr-field")&&(z.style.color=R.target.value)})}function st(){if(!l||!f&&!C.inline)return;let x=a,R=s.scrollY,z=l.offsetWidth,M=l.offsetHeight,A={left:!1,top:!1},N,Q,Oe,re={x:0,y:0};if(x&&(N=s.getComputedStyle(x),Q=parseFloat(N.marginTop),Oe=parseFloat(N.borderTopWidth),re=x.getBoundingClientRect(),re.y+=Oe+R),!C.inline){let xe=f.getBoundingClientRect(),lt=xe.x,xt=R+xe.y+xe.height+C.margin;x?(lt-=re.x,xt-=re.y,lt+z>x.clientWidth&&(lt+=xe.width-z,A.left=!0),xt+M>x.clientHeight-Q&&M+C.margin<=xe.top-(re.y-R)&&(xt-=xe.height+M+C.margin*2,A.top=!0),xt+=x.scrollTop):(lt+z>o.documentElement.clientWidth&&(lt+=xe.width-z,A.left=!0),xt+M-R>o.documentElement.clientHeight&&M+C.margin<=xe.top&&(xt=R+xe.y-M-C.margin,A.top=!0)),l.classList.toggle("clr-left",A.left),l.classList.toggle("clr-top",A.top),l.style.left=`${lt}px`,l.style.top=`${xt}px`,re.x+=l.offsetLeft,re.y+=l.offsetTop}E={width:c.offsetWidth,height:c.offsetHeight,x:c.offsetLeft+re.x,y:c.offsetTop+re.y}}function at(x){o.querySelectorAll(x).forEach(R=>{let z=R.parentNode;if(!z.classList.contains("clr-field")){let M=o.createElement("div"),A="clr-field";(C.rtl||R.classList.contains("clr-rtl"))&&(A+=" clr-rtl"),M.innerHTML='<button type="button" aria-labelledby="clr-open-label"></button>',z.insertBefore(M,R),M.setAttribute("class",A),M.style.color=R.value,M.appendChild(R)}})}function Ve(x){if(f&&!C.inline){let R=f;x&&(f=r,P!==R.value&&(R.value=P,R.dispatchEvent(new Event("input",{bubbles:!0})))),setTimeout(()=>{P!==R.value&&R.dispatchEvent(new Event("change",{bubbles:!0}))}),l.classList.remove("clr-open"),se&&We(),R.dispatchEvent(new Event("close",{bubbles:!0})),C.focusInput&&R.focus({preventScroll:!0}),f=r}}function yt(x){let R=oa(x),z=ta(R);ar(z.s,z.v),cr(R,z),g.value=z.h,l.style.color=`hsl(${z.h}, 100%, 50%)`,v.style.left=`${z.h/360*100}%`,d.style.left=`${E.width*z.s/100}px`,d.style.top=`${E.height-E.height*z.v/100}px`,b.value=z.a*100,y.style.left=`${z.a*100}%`}function Yt(x){let R=x.substring(0,3).toLowerCase();return R==="rgb"||R==="hsl"?R:"hex"}function Ke(x){x=x!==r?x:p.value,f&&(f.value=x,f.dispatchEvent(new Event("input",{bubbles:!0}))),C.onChange&&C.onChange.call(s,x,f),o.dispatchEvent(new CustomEvent("coloris:pick",{detail:{color:x,currentEl:f}}))}function sr(x,R){let z={h:g.value*1,s:x/E.width*100,v:100-R/E.height*100,a:b.value/100},M=Js(z);ar(z.s,z.v),cr(M,z),Ke()}function ar(x,R){let z=C.a11y.marker;x=x.toFixed(1)*1,R=R.toFixed(1)*1,z=z.replace("{s}",x),z=z.replace("{v}",R),d.setAttribute("aria-label",z)}function bn(x){return{pageX:x.changedTouches?x.changedTouches[0].pageX:x.pageX,pageY:x.changedTouches?x.changedTouches[0].pageY:x.pageY}}function qe(x){let R=bn(x),z=R.pageX-E.x,M=R.pageY-E.y;a&&(M+=a.scrollTop),vo(z,M),x.preventDefault(),x.stopPropagation()}function lr(x,R){let z=d.style.left.replace("px","")*1+x,M=d.style.top.replace("px","")*1+R;vo(z,M)}function vo(x,R){x=x<0?0:x>E.width?E.width:x,R=R<0?0:R>E.height?E.height:R,d.style.left=`${x}px`,d.style.top=`${R}px`,sr(x,R),d.focus()}function cr(x,R){x===void 0&&(x={}),R===void 0&&(R={});let z=C.format;for(let N in x)i[N]=x[N];for(let N in R)i[N]=R[N];let M=ra(i),A=M.substring(0,7);switch(d.style.color=A,y.parentNode.style.color=A,y.style.color=M,u.style.color=M,c.style.display="none",c.offsetHeight,c.style.display="",y.nextElementSibling.style.display="none",y.nextElementSibling.offsetHeight,y.nextElementSibling.style.display="",z==="mixed"?z=i.a===1?"hex":"rgb":z==="auto"&&(z=T),z){case"hex":p.value=M;break;case"rgb":p.value=na(i);break;case"hsl":p.value=ia(ea(i));break}o.querySelector(`.clr-format [value="${z}"]`).checked=!0}function Xs(){let x=g.value*1,R=d.style.left.replace("px","")*1,z=d.style.top.replace("px","")*1;l.style.color=`hsl(${x}, 100%, 50%)`,v.style.left=`${x/360*100}%`,sr(R,z)}function Qs(){let x=b.value/100;y.style.left=`${x*100}%`,cr({a:x}),Ke()}function Js(x){let R=x.s/100,z=x.v/100,M=R*z,A=x.h/60,N=M*(1-e.abs(A%2-1)),Q=z-M;M=M+Q,N=N+Q;let Oe=e.floor(A)%6,re=[M,N,Q,Q,N,M][Oe],xe=[N,M,M,N,Q,Q][Oe],lt=[Q,Q,N,M,M,N][Oe];return{r:e.round(re*255),g:e.round(xe*255),b:e.round(lt*255),a:x.a}}function ea(x){let R=x.v/100,z=R*(1-x.s/100/2),M;return z>0&&z<1&&(M=e.round((R-z)/e.min(z,1-z)*100)),{h:x.h,s:M||0,l:e.round(z*100),a:x.a}}function ta(x){let R=x.r/255,z=x.g/255,M=x.b/255,A=e.max(R,z,M),N=e.min(R,z,M),Q=A-N,Oe=A,re=0,xe=0;return Q&&(A===R&&(re=(z-M)/Q),A===z&&(re=2+(M-R)/Q),A===M&&(re=4+(R-z)/Q),A&&(xe=Q/A)),re=e.floor(re*60),{h:re<0?re+360:re,s:e.round(xe*100),v:e.round(Oe*100),a:x.a}}function oa(x){let R=/^((rgba)|rgb)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,z,M;return n.fillStyle="#000",n.fillStyle=x,z=R.exec(n.fillStyle),z?(M={r:z[3]*1,g:z[4]*1,b:z[5]*1,a:z[6]*1},M.a=+M.a.toFixed(2)):(z=n.fillStyle.replace("#","").match(/.{2}/g).map(A=>parseInt(A,16)),M={r:z[0],g:z[1],b:z[2],a:1}),M}function ra(x){let R=x.r.toString(16),z=x.g.toString(16),M=x.b.toString(16),A="";if(x.r<16&&(R="0"+R),x.g<16&&(z="0"+z),x.b<16&&(M="0"+M),C.alpha&&(x.a<1||C.forceAlpha)){let N=x.a*255|0;A=N.toString(16),N<16&&(A="0"+A)}return"#"+R+z+M+A}function na(x){return!C.alpha||x.a===1&&!C.forceAlpha?`rgb(${x.r}, ${x.g}, ${x.b})`:`rgba(${x.r}, ${x.g}, ${x.b}, ${x.a})`}function ia(x){return!C.alpha||x.a===1&&!C.forceAlpha?`hsl(${x.h}, ${x.s}%, ${x.l}%)`:`hsla(${x.h}, ${x.s}%, ${x.l}%, ${x.a})`}function sa(){o.getElementById("clr-picker")||(a=r,l=o.createElement("div"),l.setAttribute("id","clr-picker"),l.className="clr-picker",l.innerHTML=`<input id="clr-color-value" name="clr-color-value" class="clr-color" type="text" value="" spellcheck="false" aria-label="${C.a11y.input}"><div id="clr-color-area" class="clr-gradient" role="application" aria-label="${C.a11y.instruction}"><div id="clr-color-marker" class="clr-marker" tabindex="0"></div></div><div class="clr-hue"><input id="clr-hue-slider" name="clr-hue-slider" type="range" min="0" max="360" step="1" aria-label="${C.a11y.hueSlider}"><div id="clr-hue-marker"></div></div><div class="clr-alpha"><input id="clr-alpha-slider" name="clr-alpha-slider" type="range" min="0" max="100" step="1" aria-label="${C.a11y.alphaSlider}"><div id="clr-alpha-marker"></div><span></span></div><div id="clr-format" class="clr-format"><fieldset class="clr-segmented"><legend>${C.a11y.format}</legend><input id="clr-f1" type="radio" name="clr-format" value="hex"><label for="clr-f1">Hex</label><input id="clr-f2" type="radio" name="clr-format" value="rgb"><label for="clr-f2">RGB</label><input id="clr-f3" type="radio" name="clr-format" value="hsl"><label for="clr-f3">HSL</label><span></span></fieldset></div><div id="clr-swatches" class="clr-swatches"></div><button type="button" id="clr-clear" class="clr-clear" aria-label="${C.a11y.clear}">${C.clearLabel}</button><div id="clr-color-preview" class="clr-preview"><button type="button" id="clr-close" class="clr-close" aria-label="${C.a11y.close}">${C.closeLabel}</button></div><span id="clr-open-label" hidden>${C.a11y.open}</span><span id="clr-swatch-label" hidden>${C.a11y.swatch}</span>`,o.body.appendChild(l),c=ge("clr-color-area"),d=ge("clr-color-marker"),h=ge("clr-clear"),m=ge("clr-close"),u=ge("clr-color-preview"),p=ge("clr-color-value"),g=ge("clr-hue-slider"),v=ge("clr-hue-marker"),b=ge("clr-alpha-slider"),y=ge("clr-alpha-marker"),_e(C.el),at(C.el),X(l,"mousedown",x=>{l.classList.remove("clr-keyboard-nav"),x.stopPropagation()}),X(c,"mousedown",x=>{X(o,"mousemove",qe)}),X(c,"touchstart",x=>{o.addEventListener("touchmove",qe,{passive:!1})}),X(d,"mousedown",x=>{X(o,"mousemove",qe)}),X(d,"touchstart",x=>{o.addEventListener("touchmove",qe,{passive:!1})}),X(p,"change",x=>{let R=p.value;if(f||C.inline){let z=R===""?R:yt(R);Ke(z)}}),X(h,"click",x=>{Ke(""),Ve()}),X(m,"click",x=>{Ke(),Ve()}),X(ge("clr-format"),"click",".clr-format input",x=>{T=x.target.value,cr(),Ke()}),X(l,"click",".clr-swatches button",x=>{yt(x.target.textContent),Ke(),C.swatchesOnly&&Ve()}),X(o,"mouseup",x=>{o.removeEventListener("mousemove",qe)}),X(o,"touchend",x=>{o.removeEventListener("touchmove",qe)}),X(o,"mousedown",x=>{S=!1,l.classList.remove("clr-keyboard-nav"),Ve()}),X(o,"keydown",x=>{let R=x.key,z=x.target,M=x.shiftKey;if(R==="Escape"?Ve(!0):["Tab","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(R)&&(S=!0,l.classList.add("clr-keyboard-nav")),R==="Tab"&&z.matches(".clr-picker *")){let N=Mi(),Q=N.shift(),Oe=N.pop();M&&z===Q?(Oe.focus(),x.preventDefault()):!M&&z===Oe&&(Q.focus(),x.preventDefault())}}),X(o,"click",".clr-field button",x=>{se&&We(),x.target.nextElementSibling.dispatchEvent(new Event("click",{bubbles:!0}))}),X(d,"keydown",x=>{let R={ArrowUp:[0,-1],ArrowDown:[0,1],ArrowLeft:[-1,0],ArrowRight:[1,0]};Object.keys(R).includes(x.key)&&(lr(...R[x.key]),x.preventDefault())}),X(c,"click",qe),X(g,"input",Xs),X(b,"input",Qs))}function Mi(){return Array.from(l.querySelectorAll("input, button")).filter(z=>!!z.offsetWidth)}function ge(x){return o.getElementById(x)}function X(x,R,z,M){let A=Element.prototype.matches||Element.prototype.msMatchesSelector;typeof z=="string"?x.addEventListener(R,N=>{A.call(N.target,z)&&M.call(N.target,N)}):(M=z,x.addEventListener(R,M))}function dr(x,R){R=R!==r?R:[],o.readyState!=="loading"?x(...R):o.addEventListener("DOMContentLoaded",()=>{x(...R)})}NodeList!==r&&NodeList.prototype&&!NodeList.prototype.forEach&&(NodeList.prototype.forEach=Array.prototype.forEach);function aa(x,R){f=R,P=f.value,de(R),T=Yt(x),st(),yt(x),Ke(),P!==x&&f.dispatchEvent(new Event("change",{bubbles:!0}))}let vn=(()=>{let x={init:sa,set:oe,wrap:at,close:Ve,setInstance:fe,setColor:aa,removeInstance:Se,updatePosition:st,ready:dr};function R(z){dr(()=>{z&&(typeof z=="string"?_e(z):oe(z))})}for(let z in x)R[z]=function(){for(var M=arguments.length,A=new Array(M),N=0;N<M;N++)A[N]=arguments[N];dr(x[z],A)};return dr(()=>{s.addEventListener("resize",z=>{R.updatePosition()}),s.addEventListener("scroll",z=>{R.updatePosition()})}),R})();return vn.coloris=vn,vn})(window,document,Math)})(),ks=bt.coloris,Rs=bt.init,sw=bt.set,aw=bt.wrap,wi=bt.close,lw=bt.setInstance,cw=bt.removeInstance,dw=bt.updatePosition;var ll=s=>(o,e)=>new Ci(s,o,e),nt=ll,Ci=class{constructor(o,e,r){this.sourceFactory=o;this.startPoint=e;this.viewport=r;this.builder=o(e,r),this.points=[e]}getBBox(){return this.builder.getBBox()}build(){return this.builder.build()}preview(o){this.builder.preview(o)}addPoint(o){this.points.push(o),this.builder.addPoint(o)}async autocorrectShape(){let o=i=>({...i,pos:this.viewport.snapToGrid(i.pos)}),e=o(this.startPoint),r=this.sourceFactory(e,this.viewport),n=this.points.map(i=>o(i));for(let i of n)r.addPoint(i);return r.build()}};var sn=nt((s,o)=>new nn(s,o)),nn=class{constructor(o,e){this.startPoint=o;this.viewport=e;this.endPoint=o}getLineWidth(){return Math.max(this.endPoint.width,this.startPoint.width)}getBBox(){return this.buildPreview().getBBox()}buildPreview(){let o=this.startPoint.pos,e=this.endPoint.pos,r=e.minus(o).normalized(),n=e.distanceTo(o),i=Math.min(this.getLineWidth(),n/2),a=this.startPoint.width/2,l=this.endPoint.width/2,c=e.minus(r.times(i)),d=r.orthog(),u=d.times(a),p=d.times(l),h=new $(c.minus(p),[{kind:0,point:o.minus(u)},{kind:0,point:o.plus(u)},{kind:0,point:c.plus(p)},{kind:0,point:c.plus(d.times(i).plus(p))},{kind:0,point:e.plus(r.times(l))},{kind:0,point:c.plus(d.times(-i).minus(p))},{kind:0,point:c.minus(p)}]).mapPoints(g=>this.viewport.roundPoint(g));return new ee([{startPoint:h.startPoint,commands:h.parts,style:{fill:this.startPoint.color}}])}build(){return this.buildPreview()}preview(o){this.buildPreview().render(o)}addPoint(o){this.endPoint=o}};var ln=nt((s,o)=>new an(s,o)),an=class{constructor(o,e){this.startPoint=o;this.viewport=e;this.endPoint=o}getBBox(){return this.buildPreview().getBBox()}buildPreview(){let o=this.startPoint.pos,e=this.endPoint.pos,r=e.minus(o).normalized(),n=this.startPoint.width/2,i=this.endPoint.width/2,a=r.orthog(),l=a.times(n),c=a.times(i),d=o.minus(l),u=new $(d,[{kind:0,point:o.plus(l)},{kind:0,point:e.plus(c)},{kind:0,point:e.minus(c)},{kind:0,point:o.minus(l)}]).mapPoints(h=>this.viewport.roundPoint(h));return new ee([Z(u,{fill:this.startPoint.color})])}build(){return this.buildPreview()}preview(o){this.buildPreview().render(o)}addPoint(o){this.endPoint=o}};var cn=nt((s,o)=>new Jo(s,!0,o)),dn=nt((s,o)=>new Jo(s,!1,o)),Jo=class{constructor(o,e,r){this.startPoint=o;this.filled=e;this.viewport=r;this.endPoint=o}getBBox(){return this.buildPreview().getBBox()}buildPreview(){let o=this.viewport.getRotationAngle(),e=k.zRotation(-o),r=e.inverse().transformVec2(this.startPoint.pos),n=e.inverse().transformVec2(this.endPoint.pos),i=I.fromCorners(r,n),a=$.fromRect(i,this.filled?null:this.endPoint.width).transformedBy(e).mapPoints(c=>this.viewport.roundPoint(c));return new ee([Z(a,{fill:this.endPoint.color})])}build(){return this.buildPreview()}preview(o){this.buildPreview().render(o)}addPoint(o){this.endPoint=o}};var un=nt((s,o)=>new Ti(s,o)),Ti=class{constructor(o,e){this.startPoint=o;this.viewport=e;this.endPoint=o}getBBox(){return this.buildPreview().getBBox()}buildPreview(){let o=[],r=Math.PI*2/6,n=U.roundPoint(this.endPoint.width,5/this.viewport.getScaleFactor()),i=this.startPoint.pos.lerp(this.endPoint.pos,.5),l=this.endPoint.pos.minus(i).length()-n/2,c=i.plus(w.of(l,0));for(let p=r;p<=Math.PI*2;p+=r){let h=w.of(l*Math.cos(p),-l*Math.sin(p)).plus(i),g=w.of(Math.cos(p-r/2),-Math.sin(p-r/2)).times(l*1.141).plus(i);o.push({kind:3,controlPoint:g,endPoint:h})}o.push({kind:0,point:c});let d=new $(c,o).mapPoints(p=>this.viewport.roundPoint(p));return new ee([Z(d,{fill:L.transparent,stroke:{width:n,color:this.endPoint.color}})])}build(){return this.buildPreview()}preview(o){this.buildPreview().render(o)}addPoint(o){this.endPoint=o}};var zs=(s,o)=>{let e=document.createElement("span"),r=document.createElement("span"),n=document.createElement("input");n.type="button",n.classList.add("coloris_input"),e.classList.add("color-input-container"),r.classList.add("color-input-wrapper"),r.appendChild(n),e.appendChild(r);let i=cl(s,e,h=>{n.value=h.toHexString(),c();let m=n.parentElement;m&&m.classList.contains("clr-field")&&(m.style.color=n.value)}),a,l=()=>{a=L.fromHex(n.value)},c=()=>{l(),a&&(s.announceForAccessibility(s.localization.colorChangedAnnouncement(a.toHexString())),o(a),s.notifier.dispatch(12,{kind:12,color:a}))};n.oninput=l;let d=!1;n.addEventListener("open",()=>{d=!0,s.notifier.dispatch(11,{kind:11,open:!0}),i.cancel(),e.classList.add("picker-open"),document.querySelector("#clr-picker #clr-hue-slider")?.focus()});let u=()=>{d=!1,s.notifier.dispatch(11,{kind:11,open:!1}),c(),n.focus(),e.classList.remove("picker-open")};return n.addEventListener("close",()=>{u()}),{input:n,container:e,setValue:h=>{typeof h=="object"&&(h=h.toHexString()),n.value=h,n.dispatchEvent(new Event("input",{bubbles:!0}))},closePicker:()=>{d&&c()},registerWithHelpTextDisplay:h=>{h.registerTextHelpForElement(r,s.localization.colorPickerToggleHelpText),i.registerWithHelpTextDisplay(h)}}},cl=(s,o,e)=>{let r=document.createElement("button");r.classList.add("pipetteButton"),r.title=s.localization.pickColorFromScreen,r.setAttribute("alt",r.title);let n=document.createElement("span");n.classList.add("pickColorInstructions"),n.innerText=s.localization.clickToPickColorAnnouncement;let i=u=>{r.replaceChildren(s.icons.makePipetteIcon(u),n)};i();let a=s.toolController.getMatchingTools(Mt)[0],l=()=>{a?.clearColorListener(),i(),r.classList.remove("active")},c=u=>{l(),u&&e(u)},d=u=>{u?i(u):i()};return r.onclick=()=>{if(r.classList.contains("active")){l(),s.announceForAccessibility(s.localization.colorSelectionCanceledAnnouncement);return}a?.setColorListener(d,c),a&&(r.classList.add("active"),s.announceForAccessibility(s.localization.clickToPickColorAnnouncement))},o.appendChild(r),{cancel:()=>{l()},registerWithHelpTextDisplay:u=>{u.registerTextHelpForElement(r,s.localization.colorPickerPipetteHelpText)}}},vt=zs;var dl=()=>{let s=[...document.querySelectorAll("*:focus")];return s.length&&s.some(o=>o.classList.contains(`${D}button`))},ye=class extends ae{constructor(e,r,n,i){super(e,n,i);this.targetTool=r;this.targetTool.enabledValue().onUpdateAndNow(a=>{a?(this.setSelected(!0),dl()&&this.focus()):(this.setSelected(!1),this.setDropdownVisible(!1))})}shouldAutoDisableInReadOnlyEditor(){return!this.targetTool.canReceiveInputInReadOnlyEditor()}handleClick(){this.hasDropdown?this.targetTool.isEnabled()?this.setDropdownVisible(!this.isDropdownVisible()):(this.targetTool.setEnabled(!0),this.activateDropdown()):this.targetTool.setEnabled(!this.targetTool.isEnabled())}onKeyPress(e){return this.isSelected()&&e.code==="Space"&&this.hasDropdown?(this.handleClick(),!0):!1}addTo(e){let r=super.addTo(e);return this.setSelected(this.targetTool.isEnabled()),r}};var Si="jsdraw.toolbar.SelectionTool.resizeImageToSelection";H.registerDefaultKeyboardShortcut(Si,["ctrlOrMeta+r"],"Resize image to selection");var er=[1,2,3,4,5,6,7,8,9].map(s=>`jsdraw.toolbar.PenTool.select-pen-${s}`);for(let s=0;s<er.length;s++){let o=er[s];H.registerDefaultKeyboardShortcut(o,[`CtrlOrMeta+Digit${s+1}`],"Select pen style "+(s+1))}var Pi="jsdraw.toolbar.SaveActionWidget.save";H.registerDefaultKeyboardShortcut(Pi,["ctrlOrMeta+KeyS"],"Save");var Ei="jsdraw.toolbar.ExitActionWidget.exit";H.registerDefaultKeyboardShortcut(Ei,["Alt+KeyQ"],"Exit");var ul=0,pl=(s,o)=>{let e=document.createElement("div"),r=document.createElement("label"),n=document.createElement("input");e.classList.add(`${D}thicknessSliderContainer`),n.id=`${D}thicknessInput${ul++}`,r.innerText=s.localization.thicknessLabel,r.setAttribute("for",n.id);let i=c=>Math.log10(c),a=c=>10**c;n.type="range",n.oninput=()=>{o(a(parseFloat(n.value)))},e.appendChild(r),e.appendChild(n);let l=(c,d)=>{let u=(m,g)=>(g?Math.ceil:Math.floor)(m*100)/100,p=u(i(c),!1),h=u(i(d),!0);n.min=`${p}`,n.max=`${h}`,n.step=`${pe((h-p)/20)}`};return l(2,262),{container:e,addTo:c=>{c.appendChild(e)},setBounds:l,setValue:c=>{n.value=i(c).toString()}}},pn=pl;var hl=s=>{let o=(e,r,n,i)=>{let a=r!==i&&e!==0,l=n+e<=0,d=n+r+e>i;return a&&!l&&!d};s.onwheel=e=>{let r=o(e.deltaX,s.clientWidth,s.scrollLeft,s.scrollWidth),n=o(e.deltaY,s.clientHeight,s.scrollTop,s.scrollHeight);(r||n)&&e.stopPropagation()}},fo=hl;var ki=0,ml=(s,o,e)=>{let r=document.createElement("div");r.classList.add(`${D}grid-selector`);let n=te.fromInitialValue(o),i=document.createElement("div");i.setAttribute("role","menu"),i.id=`${D}-grid-select-id-${ki++}`,fo(i);let a=document.createElement("label");a.textContent=s,a.htmlFor=i.id,r.appendChild(a);let l=`${D}-grid-selector-${ki++}`,c=p=>{let h=document.createElement("div");h.classList.add("choice-button");let m=document.createElement("input");m.type="radio",m.id=`${D}-grid-select-button-${ki++}`,gt(h);let g=document.createElement("label"),v=()=>{g.setAttribute("title",p.title);let P=document.createElement("span");P.classList.add("button-label-text");let S=p.makeIcon();S.classList.add("icon"),P.innerText=p.title,g.htmlFor=m.id,g.replaceChildren(S,P)};v();let b=()=>{m.name=l};b();let y=()=>{m.checked?h.classList.add("checked"):h.classList.remove("checked")};m.oninput=()=>{m.checked&&n.set(p.id),y()},m.onfocus=()=>{h.querySelector(":focus-visible")&&h.classList.add("focus-visible")},m.onblur=()=>{h.classList.remove("focus-visible")},h.oncontextmenu=P=>{P.preventDefault()},h.replaceChildren(m,g),i.appendChild(h);let f=P=>{m.checked=P,y()};return f(!1),{choiceRecord:p,setChecked:f,updateIcon:()=>{v()},updateButtonRadiogroupName:b}},d=[];for(let p of e)d.push(c(p));r.appendChild(i),n.onUpdateAndNow(p=>{for(let h=0;h<d.length;h++)d[h].setChecked(d[h].choiceRecord.id===p)});let u={value:n,_radiogroupName:l,linkWith:p=>{u._radiogroupName=p._radiogroupName,l=p._radiogroupName;for(let h of d)h.updateButtonRadiogroupName()},updateIcons:()=>{d.forEach(p=>p.updateIcon())},getRootElement(){return r},addTo:p=>{p.appendChild(r)}};return u},Ri=ml;var Wt=class s extends ye{constructor(e,r,n){super(e,r,"pen",n);this.tool=r;this.updateInputs=()=>{};this.shapelikeIDs=["pressure-sensitive-pen","freehand-pen"];let i=e.getCurrentSettings().pens?.additionalPenTypes??[],a=e.getCurrentSettings().pens?.filterPenTypes??(()=>!0);this.penTypes=[{name:this.localizationTable.flatTipPen,id:"pressure-sensitive-pen",factory:Vt},{name:this.localizationTable.roundedTipPen,id:"freehand-pen",factory:Qe},{name:this.localizationTable.roundedTipPen2,id:"polyline-pen",factory:ft},...i.filter(l=>!l.isShapeBuilder),{name:this.localizationTable.arrowPen,id:"arrow",isShapeBuilder:!0,factory:sn},{name:this.localizationTable.linePen,id:"line",isShapeBuilder:!0,factory:ln},{name:this.localizationTable.filledRectanglePen,id:"filled-rectangle",isShapeBuilder:!0,factory:cn},{name:this.localizationTable.outlinedRectanglePen,id:"outlined-rectangle",isShapeBuilder:!0,factory:dn},{name:this.localizationTable.outlinedCirclePen,id:"outlined-circle",isShapeBuilder:!0,factory:un},...i.filter(l=>l.isShapeBuilder)].filter(a),this.editor.notifier.on(2,l=>{if(l.kind!==2)throw new Error("Invalid event type!");l.tool===this.tool&&(this.updateIcon(),this.updateInputs())})}static{this.idCounter=0}getTitle(){return this.targetTool.description}getCurrentPenTypeIdx(){let e=this.tool.getStrokeFactory();for(let r=0;r<this.penTypes.length;r++)if(this.penTypes[r].factory===e)return r;return-1}getCurrentPenType(){for(let e of this.penTypes)if(e.factory===this.tool.getStrokeFactory())return e;return null}createIconForRecord(e){let r={...this.tool.getStyleValue().get()};e?.factory&&(r.factory=e.factory);let n=e?.factory;return!n||n===Qe||n===Vt||n===ft?this.editor.icons.makePenIcon(r):this.editor.icons.makeIconFromFactory(r)}createIcon(){return this.createIconForRecord(this.getCurrentPenType())}createPenTypeSelector(e){let r=this.penTypes.map((d,u)=>({id:u,makeIcon:()=>this.createIconForRecord(d),title:d.name,isShapeBuilder:d.isShapeBuilder??!1})),n=r.filter(d=>!d.isShapeBuilder),i=Ri(this.localizationTable.selectPenType,this.getCurrentPenTypeIdx(),n),a=r.filter(d=>d.isShapeBuilder),l=Ri(this.localizationTable.selectShape,this.getCurrentPenTypeIdx(),a),c=d=>{this.tool.setStrokeFactory(this.penTypes[d].factory)};return i.value.onUpdate(c),l.value.onUpdate(c),e?.registerTextHelpForElements([i.getRootElement(),l.getRootElement()],this.localizationTable.penDropdown__penTypeHelpText),{setValue:d=>{i.value.set(d),l.value.set(d)},updateIcons:()=>{i.updateIcons(),l.updateIcons()},addTo:d=>{n.length&&i.addTo(d),a.length&&l.addTo(d)}}}createStrokeCorrectionOptions(e){let r=document.createElement("div");r.classList.add("action-button-row",`${D}-pen-tool-toggle-buttons`);let n=(l,c)=>{let d=document.createElement("button");d.classList.add(`${D}-toggle-button`);let u=c.cloneNode(!0);u.classList.add("icon");let p=document.createElement("span");p.innerText=l,d.replaceChildren(u,p),d.setAttribute("role","switch"),r.appendChild(d);let h=!1,m=v=>{},g={setChecked(v){h=v,d.setAttribute("aria-checked",`${h}`),m(h)},setOnInputListener(v){m=v},addHelpText(v){e?.registerTextHelpForElement(d,v)}};return d.onclick=()=>{g.setChecked(!h)},g},i=n(this.localizationTable.inputStabilization,this.editor.icons.makeStrokeSmoothingIcon());i.setOnInputListener(l=>{this.tool.setHasStabilization(l)});let a=n(this.localizationTable.strokeAutocorrect,this.editor.icons.makeShapeAutocorrectIcon());return a.setOnInputListener(l=>{this.tool.setStrokeAutocorrectEnabled(l)}),a.addHelpText(this.localizationTable.penDropdown__autocorrectHelpText),i.addHelpText(this.localizationTable.penDropdown__stabilizationHelpText),{update:()=>{i.setChecked(!!this.tool.getInputMapper()),a.setChecked(this.tool.getStrokeAutocorrectionEnabled())},addTo:l=>{l.appendChild(r)}}}getHelpText(){return this.localizationTable.penDropdown__baseHelpText}fillDropdown(e,r){let n=document.createElement("div");n.classList.add(`${D}spacedList`,`${D}nonbutton-controls-main-list`);let{container:i,setValue:a}=pn(this.editor,g=>{this.tool.setThickness(g)}),l=document.createElement("div"),c=document.createElement("label"),d=vt(this.editor,g=>{this.tool.setColor(g)}),{input:u,container:p}=d;u.id=`${D}colorInput${s.idCounter++}`,c.innerText=this.localizationTable.colorLabel,c.setAttribute("for",u.id),l.appendChild(c),l.appendChild(p);let h=this.createStrokeCorrectionOptions(r),m=this.createPenTypeSelector(r);return r?.registerTextHelpForElement(l,this.localizationTable.penDropdown__colorHelpText),r&&d.registerWithHelpTextDisplay(r),r?.registerTextHelpForElement(i,this.localizationTable.penDropdown__thicknessHelpText),this.updateInputs=()=>{d.setValue(this.tool.getColor()),a(this.tool.getThickness()),m.updateIcons(),m.setValue(this.getCurrentPenTypeIdx()),h.update()},this.updateInputs(),n.replaceChildren(l,i),m.addTo(n),e.replaceChildren(n),h.addTo(e),!0}onKeyPress(e){if(!this.isSelected())return!1;for(let r=0;r<er.length;r++){let n=er[r];if(this.editor.shortcuts.matchesShortcut(n,e)){let i=r;if(i<this.penTypes.length)return this.tool.setStrokeFactory(this.penTypes[i].factory),!0}}return!!super.onKeyPress(e)}serializeState(){return{...super.serializeState(),color:this.tool.getColor().toHexString(),thickness:this.tool.getThickness(),strokeFactoryId:this.getCurrentPenType()?.id,inputStabilization:!!this.tool.getInputMapper(),strokeAutocorrect:this.tool.getStrokeAutocorrectionEnabled()}}deserializeFrom(e){super.deserializeFrom(e);let r=(n,i)=>{let a=typeof e[n];if(a!==i)throw new Error(`Deserializing property ${n}: Invalid type. Expected ${i}, was ${a}.`)};if(e.color&&(r("color","string"),this.tool.setColor(L.fromHex(e.color))),e.thickness&&(r("thickness","number"),this.tool.setThickness(e.thickness)),e.strokeFactoryId){r("strokeFactoryId","string");let n=e.strokeFactoryId;for(let i of this.penTypes)if(n===i.id){this.tool.setStrokeFactory(i.factory);break}}e.inputStabilization!==void 0&&this.tool.setHasStabilization(!!e.inputStabilization),e.strokeAutocorrect!==void 0&&this.tool.setStrokeAutocorrectEnabled(!!e.strokeAutocorrect)}};var Kt=class s extends ye{constructor(e,r,n){super(e,r,"eraser-tool-widget",n);this.tool=r;this.updateInputs=()=>{};this.editor.notifier.on(2,i=>{i.kind===2&&i.tool===this.tool&&(this.updateInputs(),this.updateIcon())})}getHelpText(){return this.localizationTable.eraserDropdown__baseHelpText}getTitle(){return this.localizationTable.eraser}makeIconForType(e){return this.editor.icons.makeEraserIcon(this.tool.getThickness(),e)}createIcon(){return this.makeIconForType(this.tool.getModeValue().get())}static{this.idCounter=0}makeEraserTypeSelector(e){let r=document.createElement("div"),n=document.createElement("label"),i=document.createElement("input");i.id=`${D}eraserToolWidget-${s.idCounter++}`,n.htmlFor=i.id,n.innerText=this.localizationTable.fullStrokeEraser,i.type="checkbox",i.oninput=()=>{this.tool.getModeValue().set(i.checked?"full-stroke":"partial-stroke")};let a=()=>{i.checked=this.tool.getModeValue().get()==="full-stroke"};return r.replaceChildren(n,i),e?.registerTextHelpForElement(r,this.localizationTable.eraserDropdown__fullStrokeEraserHelpText),{addTo:l=>{l.appendChild(r)},updateValue:a}}fillDropdown(e,r){let n=document.createElement("div");n.classList.add(`${D}spacedList`,`${D}nonbutton-controls-main-list`);let i=pn(this.editor,l=>{this.tool.setThickness(l)});i.setBounds(10,55),r?.registerTextHelpForElement(i.container,this.localizationTable.eraserDropdown__thicknessHelpText);let a=this.makeEraserTypeSelector(r);return this.updateInputs=()=>{i.setValue(this.tool.getThickness()),a.updateValue()},this.updateInputs(),n.replaceChildren(i.container),a.addTo(n),e.replaceChildren(n),!0}serializeState(){return{...super.serializeState(),thickness:this.tool.getThickness(),mode:this.tool.getModeValue().get()}}deserializeFrom(e){if(super.deserializeFrom(e),e.thickness){let r=parseFloat(e.thickness);if(typeof r!="number"||!isFinite(r))throw new Error(`Deserializing property ${r} is not a number or is not finite.`);this.tool.setThickness(r)}if(e.mode){let r=e.mode;Object.values(ao).includes(r)&&this.tool.getModeValue().set(r)}}};var fl=(s="")=>{let o=document.createElement("div");return o.classList.add("tool-dropdown-separator"),o.innerText=s,{addTo:e=>{e.appendChild(o)}}},tr=fl;var gl=(s,o)=>{let e=document.createElement("div");e.classList.add("toolbar-button-grid"),e.style.setProperty("--column-count",`${o}`);let r=n=>{let i=document.createElement("button");i.classList.add("button");let a=n.icon();a.classList.add("icon");let l=document.createElement("label");return l.textContent=n.label,l.classList.add("button-label-text"),i.onclick=n.onClick,n.enabled&&n.enabled.onUpdateAndNow(c=>{i.disabled=!c}),i.replaceChildren(a,l),e.appendChild(i),gt(i),n.onCreated?.(i),i};return s.map(r),{container:e}},Ls=gl;var bl=(s,o,e)=>{let r=document.createElement("div");r.classList.add("selection-format-menu",`${D}spacedList`,`${D}indentedList`);let n=document.createElement("div"),i=document.createElement("label"),a=vt(s,u=>{let p=o.getSelection();if(p){let h=[];for(let g of p.getSelectedObjects())Vo(g)&&h.push(g.updateStyle({color:u}));let m=le(h);s.dispatch(m)}}),{input:l,container:c}=a;i.innerText=e.colorLabel;let d=()=>{let u=o.getSelection();if(u&&u.getSelectedItemCount()>0){l.disabled=!1,r.classList.remove("disabled");let p=[];for(let h of u.getSelectedObjects())if(Vo(h)){let m=h.getStyle().color;m&&p.push(m)}a.setValue(L.average(p))}else l.disabled=!0,r.classList.add("disabled"),a.setValue(L.transparent)};return n.replaceChildren(i,c),r.replaceChildren(n),{addTo:u=>{u.appendChild(r)},update:d,registerHelpText:u=>{u.registerTextHelpForElement(n,e.selectionDropdown__changeColorHelpText),a.registerWithHelpTextDisplay(u)}}},zi=class extends ae{constructor(e,r,n){super(e,"selection-mode-toggle",n);this.tool=r;e.notifier.on(2,i=>{i.kind===2&&i.tool===r&&this.setSelected(r.modeValue.get()==="lasso")}),this.setSelected(!1)}shouldAutoDisableInReadOnlyEditor(){return!1}setModeFlag(e){this.tool.modeValue.set(e?"lasso":"rect")}handleClick(){this.setModeFlag(!this.isSelected())}getTitle(){return this.localizationTable.selectionTool__lassoSelect}createIcon(){return this.editor.icons.makeSelectionIcon("lasso")}fillDropdown(e){return!1}getHelpText(){return this.localizationTable.selectionTool__lassoSelect__help}},Gt=class extends ye{constructor(e,r,n){super(e,r,"selection-tool-widget",n);this.tool=r;this.updateFormatMenu=()=>{};this.addSubWidget(new zi(e,r,this.localizationTable));let i=()=>{let a=this.tool.getSelection();return!!a&&a.getSelectedItemCount()>0};this.hasSelectionValue=te.fromInitialValue(i()),this.editor.notifier.on(2,a=>{if(a.kind!==2)throw new Error("Invalid event type!");a.tool===this.tool&&(this.hasSelectionValue.set(i()),this.updateFormatMenu())}),r.modeValue.onUpdate(()=>{this.updateIcon()})}resizeImageToSelection(){let e=this.tool.getSelection();e&&this.editor.dispatch(this.editor.setImportExportRect(e.region))}onKeyPress(e){return this.editor.shortcuts.matchesShortcut(Si,e)?(this.resizeImageToSelection(),!0):!!super.onKeyPress(e)}getTitle(){return this.localizationTable.select}createIcon(){return this.editor.icons.makeSelectionIcon(this.tool.modeValue.get())}getHelpText(){return this.localizationTable.selectionDropdown__baseHelpText}createSelectionActions(e){let r=this.editor.icons;return{container:Ls([{icon:()=>r.makeDeleteSelectionIcon(),label:this.localizationTable.deleteSelection,onCreated:i=>{e?.registerTextHelpForElement(i,this.localizationTable.selectionDropdown__deleteHelpText)},onClick:()=>{let i=this.tool.getSelection();this.editor.dispatch(i.deleteSelectedObjects()),this.tool.clearSelection()},enabled:this.hasSelectionValue},{icon:()=>r.makeDuplicateSelectionIcon(),label:this.localizationTable.duplicateSelection,onCreated:i=>{e?.registerTextHelpForElement(i,this.localizationTable.selectionDropdown__duplicateHelpText)},onClick:async()=>{let a=await this.tool.getSelection()?.duplicateSelectedObjects();a&&this.editor.dispatch(a)},enabled:this.hasSelectionValue},{icon:()=>r.makeResizeImageToSelectionIcon(),label:this.localizationTable.resizeImageToSelection,onCreated:i=>{e?.registerTextHelpForElement(i,this.localizationTable.selectionDropdown__resizeToHelpText)},onClick:()=>{this.resizeImageToSelection()},enabled:this.hasSelectionValue}],3).container}}fillDropdown(e,r){super.fillDropdown(e,r);let n=document.createElement("div");n.classList.add(`${D}nonbutton-controls-main-list`),e.appendChild(n),tr().addTo(n);let i=this.createSelectionActions(r);n.appendChild(i.container),tr(this.localizationTable.reformatSelection).addTo(n);let a=bl(this.editor,this.tool,this.localizationTable);return a.addTo(n),this.updateFormatMenu=()=>a.update(),r&&a.registerHelpText(r),a.update(),!0}serializeState(){return{...super.serializeState(),selectionMode:this.tool.modeValue.get()}}deserializeFrom(e){super.deserializeFrom(e),Object.values(Lt).includes(e.selectionMode)&&this.tool.modeValue.set(e.selectionMode)}};var jt=class s extends ye{constructor(e,r,n){super(e,r,"text-tool-widget",n);this.tool=r;this.updateDropdownInputs=null;e.notifier.on(2,i=>{i.kind===2&&i.tool===r&&(this.updateIcon(),this.updateDropdownInputs?.())})}getTitle(){return this.targetTool.description}createIcon(){let e=this.tool.getTextStyle();return this.editor.icons.makeTextIcon(e)}static{this.idCounter=0}fillDropdown(e){let r=document.createElement("div");r.classList.add(`${D}spacedList`,`${D}nonbutton-controls-main-list`);let n=document.createElement("div"),i=document.createElement("div"),a=document.createElement("div"),l=document.createElement("select"),c=document.createElement("label"),d=document.createElement("input"),u=document.createElement("label"),{input:p,container:h,setValue:m}=vt(this.editor,f=>{this.tool.setColor(f)}),g=document.createElement("label"),v=new Set,b=f=>{let T=document.createElement("option");T.value=f,T.textContent=f,l.appendChild(T),v.add(f)};d.setAttribute("type","number"),d.min="1",d.max="128",c.innerText=this.localizationTable.fontLabel,g.innerText=this.localizationTable.colorLabel,u.innerText=this.localizationTable.textSize,p.id=`${D}-text-color-input-${s.idCounter++}`,g.setAttribute("for",p.id),d.id=`${D}-text-size-input-${s.idCounter++}`,u.setAttribute("for",d.id);let y=this.editor.getCurrentSettings().text?.fonts??[];for(let f of y)b(f);return l.classList.add("font-selector"),l.id=`${D}-text-font-input-${s.idCounter++}`,c.setAttribute("for",l.id),l.onchange=()=>{this.tool.setFontFamily(l.value)},d.onchange=()=>{let f=parseInt(d.value);!isNaN(f)&&f>0&&this.tool.setFontSize(f)},i.appendChild(g),i.appendChild(h),n.appendChild(c),n.appendChild(l),a.appendChild(u),a.appendChild(d),this.updateDropdownInputs=()=>{let f=this.tool.getTextStyle();m(f.renderingStyle.fill),v.has(f.fontFamily)||b(f.fontFamily),l.value=f.fontFamily,d.value=`${f.size}`},this.updateDropdownInputs(),r.replaceChildren(i,a,n),e.appendChild(r),!0}serializeState(){let e=this.tool.getTextStyle();return{...super.serializeState(),fontFamily:e.fontFamily,textSize:e.size,color:e.renderingStyle.fill.toHexString()}}deserializeFrom(e){e.fontFamily&&typeof e.fontFamily=="string"&&this.tool.setFontFamily(e.fontFamily),e.color&&typeof e.color=="string"&&this.tool.setColor(L.fromHex(e.color)),e.textSize&&typeof e.textSize=="number"&&this.tool.setFontSize(e.textSize),super.deserializeFrom(e)}};var vl=(s,o,e)=>{let r=document.createElement("div"),n=document.createElement("button"),i=document.createElement("button"),a=document.createElement("button"),l=document.createElement("span");n.innerText="+",i.innerText="-",a.innerText=s.resetView,r.replaceChildren(l,n,i,a),r.classList.add(`${D}zoomLevelEditor`),l.classList.add("zoomDisplay");let c,d=()=>{let p=o.viewport.getScaleFactor()*100;p>.1?p=Math.round(p*10)/10:p=Math.round(p*1e3)/1e3,p!==c&&(l.textContent=s.zoomLevel(p),c=p)};d(),o.notifier.on(7,p=>{p.kind===7&&(d(),a.disabled=p.newTransform.eq(k.identity))});let u=p=>{let h=o.viewport.visibleRect.center,m=k.scaling2D(p,h);o.dispatch(U.transformBy(m),!1)};return n.onclick=()=>{u(5/4)},i.onclick=()=>{u(4/5)},a.onclick=()=>{o.dispatch(U.transformBy(o.viewport.canvasToScreenTransform.inverse()),!1)},e?.registerTextHelpForElement(n,s.handDropdown__zoomInHelpText),e?.registerTextHelpForElement(i,s.handDropdown__zoomOutHelpText),e?.registerTextHelpForElement(a,s.handDropdown__resetViewHelpText),e?.registerTextHelpForElement(l,s.handDropdown__zoomDisplayHelpText),r},hn=class extends ae{constructor(e,r,n,i,a,l,c){super(e,`pan-mode-${n}`,c);this.tool=r;this.flag=n;this.makeIcon=i;this.title=a;this.helpText=l;e.notifier.on(2,d=>{if(d.kind===2&&d.tool===r){let u=!!(r.getMode()&8);this.setSelected(!!(r.getMode()&n)||u),this.setDisabled(u&&n!==8)}}),this.setSelected(!1)}shouldAutoDisableInReadOnlyEditor(){return!1}setModeFlag(e){this.tool.setModeEnabled(this.flag,e)}handleClick(){this.setModeFlag(!this.isSelected())}getTitle(){return this.title}createIcon(){return this.makeIcon()}fillDropdown(e){return!1}getHelpText(){return this.helpText}},_t=class s extends ye{constructor(o,e,r){let n=o.toolController.getPrimaryTools().includes(e),i=(n?e:s.getPrimaryHandTool(o.toolController))??e;super(o,i,"hand-tool-widget",r),this.overridePanZoomTool=(n?s.getOverrideHandTool(o.toolController):e)??e,this.allowTogglingBaseTool=i!==null,this.allowTogglingBaseTool||this.container.classList.add("dropdownShowable");let a=new hn(o,this.overridePanZoomTool,1,()=>this.editor.icons.makeTouchPanningIcon(),r.touchPanning,r.handDropdown__touchPanningHelpText,r),l=new hn(o,this.overridePanZoomTool,32,()=>this.editor.icons.makeRotationLockIcon(),r.lockRotation,r.handDropdown__lockRotationHelpText,r);this.addSubWidget(a),this.addSubWidget(l)}static getPrimaryHandTool(o){return o.getPrimaryTools().filter(n=>n instanceof Ce)[0]}static getOverrideHandTool(o){return o.getMatchingTools(Ce)[0]}shouldAutoDisableInReadOnlyEditor(){return!1}getTitle(){return this.localizationTable.handTool}createIcon(){return this.editor.icons.makeHandToolIcon()}handleClick(){this.allowTogglingBaseTool?super.handleClick():this.setDropdownVisible(!this.isDropdownVisible())}getHelpText(){return this.localizationTable.handDropdown__baseHelpText}fillDropdown(o,e){super.fillDropdown(o,e);let r=document.createElement("div");r.classList.add(`${D}nonbutton-controls-main-list`),tr().addTo(r);let n=vl(this.localizationTable,this.editor,e);return r.appendChild(n),o.appendChild(r),!0}setSelected(o){this.allowTogglingBaseTool&&super.setSelected(o)}serializeState(){let o=this.overridePanZoomTool.getMode();return{...super.serializeState(),touchPanning:o&1,rotationLocked:o&32}}deserializeFrom(o){o.touchPanning!==void 0&&this.overridePanZoomTool.setModeEnabled(1,!!o.touchPanning),o.rotationLocked!==void 0&&this.overridePanZoomTool.setModeEnabled(32,!!o.rotationLocked),super.deserializeFrom(o)}};var Ue=class extends ae{constructor(e,r,n,i,a,l,c=!1,d=!0){super(e,r,l);this.makeIcon=n;this.title=i;this.clickAction=a;this.mustBeToplevel=c;this.#e=d}#e;#t=void 0;setHelpText(e){this.#t=e}getHelpText(){return this.#t}shouldAutoDisableInReadOnlyEditor(){return this.#e}handleClick(){this.clickAction()}getTitle(){return this.title}createIcon(){return this.makeIcon()}fillDropdown(e){return!1}mustBeInToplevelMenu(){return this.mustBeToplevel}};var yl=0,xl=(s,o,{accepts:e="*",allowMultiSelect:r=!1,customPickerAction:n}={})=>{let i=document.createElement("div"),a=document.createElement("label"),l=document.createElement("input"),c=document.createElement("div");c.classList.add("toolbar--file-input-description");let d=document.createElement("span");i.classList.add("toolbar--file-input-container"),a.appendChild(document.createTextNode(s)),l.accept=e,l.type=n?"button":"file",l.classList.add("file-input"),l.multiple=r;let u=`js-draw-file-input-${yl++}`;l.setAttribute("id",u),a.htmlFor=u;let p=o.icons.makeUploadFileIcon();p.classList.add("icon"),c.replaceChildren(p,d),a.appendChild(c),i.replaceChildren(a,l);let h=Tr.fromInitialValue([]),m=!1,g=null,v=()=>{let y=h.get();if(m){if(d.textContent=o.localization.fileInput__loading,g){let f=document.createElement("b");f.textContent=o.localization.cancel,f.classList.add("cancel-button"),d.appendChild(f)}p.style.display="none"}else if(y.length>0){let f=y.map(P=>P.name),T=5;if(f.length<=T)d.textContent=f.join(`
440
445
  `);else{let P=f.slice(0,T-1);d.textContent=[...P,o.localization.fileInput__andNMoreFiles(f.length-P.length)].join(`
441
- `)}u.style.display="none"}else{u.style.display="";let T=o.localization.dragAndDropHereOrBrowse.split(/[{]{2}(.*)[}]{2}/g);d.replaceChildren();for(let P=0;P<T.length;P++)if(P%2===1){let S=document.createElement("b");S.textContent=T[P],d.appendChild(S)}else d.appendChild(document.createTextNode(T[P]))}};if((()=>{a.addEventListener("dragover",y=>{y.preventDefault(),a.classList.add("drag-target")}),a.addEventListener("dragenter",y=>{y.preventDefault(),a.classList.add("drag-target")}),a.addEventListener("dragleave",y=>{y.preventDefault();let f=y.relatedTarget;(!f||!a.contains(f))&&a.classList.remove("drag-target")}),a.addEventListener("drop",y=>{y.preventDefault(),a.classList.remove("drag-target");let f=[];y.dataTransfer&&f.push(...y.dataTransfer.files),h.set(f)}),l.addEventListener("change",()=>{let y=l.files??[];h.set([...y])})})(),n){let y=async()=>{if(m){g?.();return}i.classList.add("-loading"),m=!0,v();try{let f=await n({setOnCancelCallback:T=>{if(!m)throw new Error("Task already completed. Can't register cancel handler.");g=()=>{g=null,v(),T()},v()}});f&&h.set(f)}finally{i.classList.remove("-loading"),m=!1,v()}};l.onclick=y}return h.onUpdate(y=>{y.length===0&&l.files&&l.files.length>0&&(l.value=""),g?.()}),h.onUpdateAndNow(v),{container:i,input:l,selectedFiles:h,addTo:y=>{y.appendChild(i)}}},Ps=hl;var ml=s=>{let o=s/1024,e=o/1024,r=e/1024,n="B",i=s;return r>=1?(i=r,n="GiB"):e>=1?(i=e,n="MiB"):o>=1&&(i=o,n="KiB"),{size:i,units:n}},Es=ml;var Xo=class s{constructor(o,e,r){this.imageBase64Url=o;this.preview=e;this.onUrlUpdate=r;this.originalSrc=o,e.src=o}updateImageData(o){this.preview.src=o,this.imageBase64Url=o,this.onUrlUpdate()}decreaseSize(o=3/4){let e=document.createElement("canvas");e.width=this.preview.naturalWidth*o,e.height=this.preview.naturalHeight*o,e.getContext("2d")?.drawImage(this.preview,0,0,e.width,e.height);let n=this.originalSrc?.startsWith("data:image/jpeg;")?"image/jpeg":"image/png";this.updateImageData(e.toDataURL(n))}reset(){this.updateImageData(this.originalSrc)}isChanged(){return this.imageBase64Url!==this.originalSrc}isLarge(){return this.getBase64Url().length>125829.12}getBase64Url(){return this.imageBase64Url}getAltText(){return this.altText}setAltText(o){this.altText=o,this.preview.alt=o}static fromSrcAndPreview(o,e,r){return new s(o,e,r)}static fromRenderable(o,e){let r=new Image;r.src=o.base64Url;let n=new s(o.base64Url,r,e),i=o.label??o.image.getAttribute("alt");return i&&n.setAltText(i),{wrapper:n,preview:r}}};var fl=s=>{let o=document.createElement("div");o.classList.add("toolbar-snapped-scroll-list");let e=document.createElement("div");e.classList.add("scroller");let r=pe.fromInitialValue(0),n=null,i=()=>{let u=document.createElement("div");u.classList.add("page-markers"),u.setAttribute("tabindex","-1");let h=[];return j.union([r,s]).onUpdateAndNow(([g,v])=>{let b=!1;for(;v.length<h.length;)h.pop(),b=!0;let y;for(let f=0;f<v.length;f++){let T;if(f>=h.length){T=document.createElement("div");let S=document.createElement("div");S.classList.add("content"),T.replaceChildren(S),h.push(T),b=!0}else T=h[f];T.classList.add("marker"),f===g?(T.classList.add("-active"),y=T):T.classList.remove("-active");let P=f;T.onclick=()=>{c.get()[P]?.element?.scrollIntoView({block:"nearest",behavior:"smooth"})}}b&&u.replaceChildren(...h),y&&u.scrollHeight>o.clientHeight&&y.scrollIntoView({block:"nearest"}),h.length===1?u.classList.add("-one-element"):u.classList.remove("-one-element")}),u},a=()=>{n=new IntersectionObserver(u=>{for(let h of u)if(h.isIntersecting&&h.intersectionRatio>.7){let m=h.target.getAttribute("data-item-index");if(m===null)throw new Error("Could not find attribute data-item-index");let g=Number(m);r.set(g);break}},{root:e,threshold:.9})},l=()=>{n&&(n.disconnect(),r.set(0),n=null)},c=j.map(s,u=>u.map((h,m)=>{let g=document.createElement("div");return h.element.parentElement&&h.element.remove(),g.appendChild(h.element),g.classList.add("item"),g.setAttribute("data-item-index",`${m}`),{element:g,data:h.data}})),d=[];c.onUpdateAndNow(u=>{r.set(-1);for(let h of d)n?.unobserve(h.element);e.replaceChildren(),u.length>1?a():l(),u.length===0?o.classList.add("-empty"):o.classList.remove("-empty");for(let h of u)e.appendChild(h.element);if(r.set(0),n)for(let h of u)n.observe(h.element)});let p=j.map(r,u=>{let h=s.get();return 0<=u&&u<h.length?h[u].data:null});return ho(e),o.replaceChildren(i(),e),{container:o,visibleItem:p}},ks=fl;var gl=async s=>{let o=[],e=new Image,r=await Nr(s);return r&&o.push({image:e,base64Url:r,transform:k.identity}),o},Rs=gl;var Gt=class s extends ue{constructor(o,e){e??=o.localization,super(o,"insert-image-widget",e),this.container.classList.add("dropdownShowable"),o.notifier.on(9,r=>{r.kind===9&&this.isDropdownVisible()&&this.updateInputs()}),this.images=pe.fromInitialValue([]),this.images.onUpdateAndNow(()=>{this.onImageDataUpdate()})}getTitle(){return this.localizationTable.image}createIcon(){return this.editor.icons.makeInsertImageIcon()}setDropdownVisible(o){super.setDropdownVisible(o),this.isDropdownVisible()?this.updateInputs():this.selectedFiles?.set([])}handleClick(){this.setDropdownVisible(!this.isDropdownVisible())}static{this.nextInputId=0}fillDropdown(o){let e=document.createElement("div");e.classList.add("insert-image-widget-dropdown-content",`${M}spacedList`,`${M}nonbutton-controls-main-list`);let{container:r,selectedFiles:n}=Ps(this.localizationTable.chooseFile,this.editor,{accepts:"image/*",allowMultiSelect:!0,customPickerAction:this.editor.getCurrentSettings().image?.showImagePicker}),i=document.createElement("div");this.imagesPreview=ks(this.images),this.statusView=document.createElement("div");let a=document.createElement("div");a.classList.add("action-button-row"),this.statusView.classList.add("insert-image-image-status-view"),this.submitButton=document.createElement("button"),this.selectedFiles=n,this.imageAltTextInput=document.createElement("input");let l=document.createElement("label"),c=`insert-image-alt-text-input-${s.nextInputId++}`;return this.imageAltTextInput.setAttribute("id",c),l.htmlFor=c,l.innerText=this.localizationTable.inputAltText,this.imageAltTextInput.type="text",this.imageAltTextInput.placeholder=this.localizationTable.describeTheImage,this.statusView.setAttribute("aria-live","polite"),this.submitButton.innerText=this.localizationTable.submit,this.imagesPreview.visibleItem.onUpdateAndNow(()=>this.onImageDataUpdate()),this.imageAltTextInput.oninput=()=>{let d=this.imagesPreview.visibleItem.get();d&&(d.setAltText(this.imageAltTextInput.value),this.submitButton.style.display="")},this.selectedFiles.onUpdateAndNow(async d=>{if(d.length===0){this.images.set([]);return}let p=(await Promise.all(d.map(async u=>{let h;try{h=await Rs(u)}catch(m){console.error("Image load error",m);let g=this.localizationTable.imageLoadError(m);return this.statusView.innerText=g,[]}return h.map(m=>{let{wrapper:g,preview:v}=Xo.fromRenderable(m,()=>this.onImageDataUpdate());return{data:g,element:v}})}))).flat();this.images.set(p)}),i.replaceChildren(l,this.imageAltTextInput),a.replaceChildren(this.submitButton),e.replaceChildren(r,i,this.imagesPreview.container,this.statusView,a),o.replaceChildren(e),!0}onImageDataUpdate(){if(!this.imagesPreview)return;let o=this.imagesPreview.visibleItem.get(),e=o?.getBase64Url();this.imageAltTextInput.value=o?.getAltText()??"",e?(this.submitButton.disabled=!1,this.submitButton.style.display="",this.updateImageSizeDisplay()):(this.submitButton.disabled=!0,this.submitButton.style.display="none",this.statusView.innerText="",this.submitButton.disabled=!0),this.images.get().length<=1?this.submitButton.innerText=this.localizationTable.submit:this.submitButton.innerText=this.localizationTable.addAll}hideDialog(){this.setDropdownVisible(!1)}updateImageSizeDisplay(){let o=this.imagesPreview.visibleItem.get(),e=o?.getBase64Url()??"",{size:r,units:n}=Es(e.length),i=document.createElement("span");i.innerText=this.localizationTable.imageSize(Math.round(r),n);let a=document.createElement("button");a.innerText=this.localizationTable.decreaseImageSize,a.onclick=()=>{o?.decreaseSize()};let l=document.createElement("button");l.innerText=this.localizationTable.resetImage,l.onclick=()=>{o?.reset()},this.statusView.replaceChildren(i),o?.isLarge()?this.statusView.appendChild(a):o?.isChanged()?this.statusView.appendChild(l):this.images.get().some(d=>d.data?.isChanged()||d.data?.isLarge())&&(a.disabled=!0,this.statusView.appendChild(a))}updateInputs(){(()=>{this.selectedFiles?.set([]),this.imageAltTextInput.value="",this.submitButton.disabled=!0,this.statusView.innerText="",this.submitButton.style.display=""})();let e=this.editor.toolController.getMatchingTools(ve),r=e.map(i=>i.getSelectedObjects()).flat(),n=null;if(r.length===1&&r[0]instanceof be){n=r[0];let i=new Image,a=Xo.fromSrcAndPreview(n.getURL(),i,()=>this.onImageDataUpdate());a.setAltText(n.getAltText()??""),this.images.set([{data:a,element:i}])}else r.length>0&&e.forEach(i=>i.clearSelection());this.submitButton.style.display="none",this.submitButton.onclick=async()=>{let i=[],a=k.identity,l=null;for(let{data:c}of this.images.get()){if(!c)continue;let d=new Image;d.src=c.getBase64Url();let p=c.getAltText();p&&d.setAttribute("alt",p);let u;try{u=await be.fromImage(d,a)}catch(g){console.error("Error loading image",g),this.statusView.innerText=this.localizationTable.imageLoadError(g);return}let h=u.getBBox();if(h.area===0){this.statusView.innerText=this.localizationTable.errorImageHasZeroSize;return}i.push(u),l??=h,l.union(h);let m=w.of(0,h.height);a=a.rightMul(k.translation(m))}if(i.length){if(!l)throw new Error("Logic error: Full bounding box must be calculated when components are to be added.");if(this.hideDialog(),n){let c=new J([n]),d=n.getTransformation(),p=n.getBBox().width||1,u=l.transformedBoundingBox(d).width||1,h=k.scaling2D(p/u),m=[];for(let g of i)m.push(_.addElement(g),g.transformBy(d.rightMul(h)),g.setZIndex(n.getZIndex()));this.editor.dispatch(se([...m,c])),e[0]?.setSelection(i)}else await this.editor.addAndCenterComponents(i)}}}};var jt=class s extends ue{constructor(e,r){super(e,"document-properties-widget",r);this.updateDropdownContent=()=>{};this.dropdownUpdateQueued=!1;this.container.classList.add("dropdownShowable"),this.editor.notifier.on(3,()=>{this.queueDropdownUpdate()}),this.editor.image.notifier.on(0,()=>{this.queueDropdownUpdate()})}getTitle(){return this.localizationTable.documentProperties}createIcon(){return this.editor.icons.makeConfigureDocumentIcon()}handleClick(){this.setDropdownVisible(!this.isDropdownVisible()),this.queueDropdownUpdate()}queueDropdownUpdate(){this.dropdownUpdateQueued||(requestAnimationFrame(()=>this.updateDropdown()),this.dropdownUpdateQueued=!0)}updateDropdown(){this.dropdownUpdateQueued=!1,this.isDropdownVisible()&&this.updateDropdownContent()}setBackgroundColor(e){this.editor.dispatch(this.editor.setBackgroundColor(e))}getBackgroundColor(){return this.editor.estimateBackgroundColor()}removeBackgroundComponents(){let e=[];for(let r of this.editor.image.getBackgroundComponents())r instanceof ae&&e.push(r);return new J(e)}setBackgroundType(e){let r=this.editor.estimateBackgroundColor(),n=new ae(e,r),i=this.editor.image.addElement(n);return se([this.removeBackgroundComponents(),i])}getBackgroundType(){let e=this.editor.image.getBackgroundComponents();for(let r=e.length-1;r>=0;r--){let n=e[r];if(n instanceof ae)return n.getBackgroundType()}return 2}updateImportExportRectSize(e){let r=c=>(c!==void 0&&(!isFinite(c)||c<=0)&&(c=100),c),n=r(e.width),i=r(e.height),a=this.editor.getImportExportRect(),l=new B(a.x,a.y,n??a.w,i??a.h);this.editor.dispatch(this.editor.image.setImportExportRect(l)),this.editor.queueRerender()}getHelpText(){return this.localizationTable.pageDropdown__baseHelpText}static{this.idCounter=0}fillDropdown(e,r){let n=document.createElement("div");n.classList.add(`${M}spacedList`,`${M}nonbutton-controls-main-list`,`${M}document-properties-widget`);let i=()=>{let f=document.createElement("div"),T=document.createElement("label");T.innerText=this.localizationTable.backgroundColor;let{input:P,container:S,setValue:E,registerWithHelpTextDisplay:C}=bt(this.editor,O=>{O.eq(this.getBackgroundColor())||this.setBackgroundColor(O)});return P.id=`${M}docPropertiesColorInput-${s.idCounter++}`,T.htmlFor=P.id,f.replaceChildren(T,S),{setBgColorInputValue:E,backgroundColorRow:f,registerWithHelp:O=>{O&&(O?.registerTextHelpForElement(f,this.localizationTable.pageDropdown__backgroundColorHelpText),C(O))}}},{backgroundColorRow:a,setBgColorInputValue:l,registerWithHelp:c}=i(),d=(f,T)=>{let P=document.createElement("div"),S=document.createElement("label"),E=document.createElement("input");return E.id=`${M}docPropertiesCheckbox-${s.idCounter++}`,S.htmlFor=E.id,E.type="checkbox",S.innerText=f,E.oninput=()=>{T(E.checked)},P.replaceChildren(S,E),{container:P,checkbox:E}},{container:p,checkbox:u}=d(this.localizationTable.useGridOption,f=>{if(this.getBackgroundType()===1===f)return;let S=0;f&&(S=1),this.editor.dispatch(this.setBackgroundType(S))}),h=(f,T)=>{let P=document.createElement("div"),S=document.createElement("label"),E=document.createElement("input");return S.innerText=f,E.type="number",E.min="0",E.id=`${M}docPropertiesDimensionRow-${s.idCounter++}`,S.htmlFor=E.id,E.style.flexGrow="2",E.style.width="25px",E.oninput=()=>{T(parseFloat(E.value))},P.classList.add("js-draw-size-input-row"),P.replaceChildren(S,E),{setValue:C=>{if(document.activeElement===E&&E.value.match(/^0*$/)){let V=E.value;E.type="text",E.value=C.toString();let O=Math.max(1,E.value.length-V.length);E.setSelectionRange(0,O),E.type="number"}else E.value=C.toString()},setIsAutomaticSize:C=>{E.disabled=C;let V="size-input-row--automatic-size";C?P.classList.add(V):P.classList.remove(V)},element:P}},m=h(this.localizationTable.imageWidthOption,f=>{this.updateImportExportRectSize({width:f})}),g=h(this.localizationTable.imageHeightOption,f=>{this.updateImportExportRectSize({height:f})}),{container:v,checkbox:b}=d(this.localizationTable.enableAutoresizeOption,f=>{let T=this.editor.image;this.editor.dispatch(T.setAutoresizeEnabled(f))}),y=document.createElement("button");return y.classList.add("about-button"),y.innerText=this.localizationTable.about,y.onclick=()=>{this.editor.showAboutDialog()},c(r),r?.registerTextHelpForElement(p,this.localizationTable.pageDropdown__gridCheckboxHelpText),r?.registerTextHelpForElement(v,this.localizationTable.pageDropdown__autoresizeCheckboxHelpText),r?.registerTextHelpForElement(y,this.localizationTable.pageDropdown__aboutButtonHelpText),this.updateDropdownContent=()=>{l(this.getBackgroundColor());let f=this.editor.image.getAutoresizeEnabled(),T=this.editor.getImportExportRect();m.setValue(T.width),g.setValue(T.height),b.checked=f,m.setIsAutomaticSize(f),g.setIsAutomaticSize(f),u.checked=this.getBackgroundType()===1},this.updateDropdownContent(),n.replaceChildren(a,p,m.element,g.element,v,y),e.replaceChildren(n),!0}};var Pi=class extends xe{constructor(o,e,r,n={}){super(o,"save-button",()=>n.icon??o.icons.makeSaveIcon(),n.label??e.save,r),this.setTags(["save"])}shouldAutoDisableInReadOnlyEditor(){return!1}onKeyPress(o){return this.editor.shortcuts.matchesShortcut(wi,o)?(this.clickAction(),!0):super.onKeyPress(o)}mustBeInToplevelMenu(){return!0}},zs=Pi;var Ei=class extends xe{constructor(o,e,r,n={}){super(o,"exit-button",()=>n.icon??o.icons.makeCloseIcon(),n.label??e.exit,r),this.setTags(["exit"])}shouldAutoDisableInReadOnlyEditor(){return!1}onKeyPress(o){return this.editor.shortcuts.matchesShortcut(Ci,o)?(this.clickAction(),!0):super.onKeyPress(o)}mustBeInToplevelMenu(){return!0}},Ls=Ei;var it=class s{constructor(o,e=eo){this.editor=o;this.localizationTable=e;this.#e=[];this.#t={};this.#o=[];this.#r=null;this.closeColorPickerOverlay=null;s.colorisStarted||(Ts(),s.colorisStarted=!0),this.setupColorPickers()}#e;#t;#o;static{this.colorisStarted=!1}#r;setupCloseColorPickerOverlay(){this.closeColorPickerOverlay||(this.closeColorPickerOverlay=document.createElement("div"),this.closeColorPickerOverlay.className=`${M}closeColorPickerOverlay`,this.editor.createHTMLOverlay(this.closeColorPickerOverlay),this.#e.push(this.editor.handlePointerEventsExceptClicksFrom(this.closeColorPickerOverlay,o=>(o==="pointerdown"&&bi(),o==="pointerup"&&this.editor.focus(),!0))))}setupColorPickers(){if(this.#r){this.#r();return}this.setupCloseColorPickerOverlay();let o=12,e=[L.red.toHexString(),L.purple.toHexString(),L.blue.toHexString(),L.clay.toHexString(),L.black.toHexString(),L.white.toHexString()],r=e.length,n=!1,i=()=>{try{Cs({el:".coloris_input",format:"hex",selectInput:!1,focusInput:!1,themeMode:"auto",swatches:e})}catch(l){console.warn("Failed to initialize Coloris. Error: ",l),n||(n=!0,document.addEventListener("load",()=>{i()},{once:!0}))}};i(),this.#r=i;let a=l=>{let c=!1;for(let d of e)d===l&&(c=!0);c||(e.push(l),e.length>o&&e.splice(r,1),i())};this.#e.push(this.editor.notifier.on(11,l=>{l.kind===11&&this.closeColorPickerOverlay&&(this.closeColorPickerOverlay.style.display=l.open?"block":"none")})),this.#e.push(this.editor.notifier.on(12,l=>{l.kind===12&&a(l.color.toHexString())}))}closeColorPickers(){bi?.()}getWidgetUniqueId(o){return o.getUniqueIdIn(this.#t)}getWidgetFromId(o){return this.#t[o]}getAllWidgets(){return this.#o}addWidget(o){let e=o.getUniqueIdIn(this.#t);this.#t[e]=o,this.#o.push(o),this.addWidgetInternal(o),this.setupColorPickers()}removeWidget(o){let e=o.getUniqueIdIn(this.#t);this.removeWidgetInternal(o),delete this.#t[e],this.#o=this.#o.filter(r=>r!==o)}static{this.rootToolbarId="root-toolbar--"}serializeState(){let o={};for(let e in this.#t)o[e]=this.#t[e].serializeState();return o[s.rootToolbarId]=this.serializeInternal(),JSON.stringify(o)}deserializeState(o){let e=JSON.parse(o);mr(e),Ni(e);let r=s.rootToolbarId;r in e&&typeof e[r]<"u"&&this.deserializeInternal(e[r]);for(let n in e)if(n!==r){if(!(n in this.#t)){console.warn(`Unable to deserialize widget ${n} \xAD\u2014 no such widget.`);continue}typeof e[n]=="object"&&e[n]&&this.#t[n].deserializeFrom(e[n])}}serializeInternal(){}deserializeInternal(o){}makeActionButton(o,e,r=!0){typeof r=="boolean"&&(r={mustBeToplevel:r});let n=r.mustBeToplevel??!0,i=r.autoDisableInReadOnlyEditors??!0,a=typeof o=="string"?o:o.label,l="action-button",c=()=>typeof o=="string"?null:o.icon;return new xe(this.editor,l,c,a,e,this.editor.localization,n,i)}addActionButton(o,e,r=!0){let n=this.makeActionButton(o,e,r);return this.addWidget(n),n}addTaggedActionButton(o,e,r,n=!0){let i=this.makeActionButton(e,r,n);return i.setTags(o),this.addWidget(i),i}addSaveButton(o,e={}){let r=new zs(this.editor,this.localizationTable,o,e);return this.addWidget(r),r}addExitButton(o,e={}){let r=new Ls(this.editor,this.localizationTable,o,e);return this.addWidget(r),r}addUndoRedoButtons(o=!0){let e=()=>this.addTaggedActionButton(["undo"],{label:this.localizationTable.undo,icon:this.editor.icons.makeUndoIcon()},()=>{this.editor.history.undo()}),r=()=>this.addTaggedActionButton(["redo"],{label:this.localizationTable.redo,icon:this.editor.icons.makeRedoIcon()},()=>{this.editor.history.redo()}),n,i;o?(n=e(),i=r()):(i=r(),n=e()),n.setDisabled(!0),i.setDisabled(!0),this.editor.notifier.on(3,a=>{if(a.kind!==3)throw new Error("Wrong event type!");n.setDisabled(a.undoStackSize===0),i.setDisabled(a.redoStackSize===0)})}addWidgetsForPrimaryTools(o){for(let e of this.editor.toolController.getPrimaryTools())if(!(o&&!o?.(e)))if(e instanceof $e){let r=new Nt(this.editor,e,this.localizationTable);this.addWidget(r)}else e instanceof Je?this.addWidget(new $t(this.editor,e,this.localizationTable)):e instanceof ve?this.addWidget(new Ut(this.editor,e,this.localizationTable)):e instanceof Ue?this.addWidget(new Wt(this.editor,e,this.localizationTable)):e instanceof Ce&&this.addWidget(new Kt(this.editor,e,this.localizationTable))}addDefaultToolWidgets(){this.addWidgetsForPrimaryTools(),this.addDefaultEditorControlWidgets()}addDefaultEditorControlWidgets(){this.addWidget(new jt(this.editor,this.localizationTable)),this.addWidget(new Gt(this.editor,this.localizationTable))}addDefaultActionButtons(){this.addUndoRedoButtons()}remove(){this.closeColorPickerOverlay?.remove();for(let o of this.#e)o.remove();this.#e=[],this.onRemove();for(let o of this.#o)o.remove()}manageListener(o){this.#e.push(o)}};var Is=s=>new mo(s,s.getRootElement(),s.localization),mo=class extends it{constructor(e,r,n){super(e,n);this.clearDragListeners=null;this.toolbarContainer=document.createElement("div"),this.toolbarContainer.classList.add(`${M}root`),this.toolbarContainer.classList.add(`${M}element`),this.toolbarContainer.classList.add(`${M}edge-toolbar`),this.toolbarContainer.setAttribute("role","toolbar"),this.toolbarActionRow=document.createElement("div"),this.toolbarActionRow.classList.add("toolbar-element","toolbar-action-row"),this.toolbarToolRow=document.createElement("div"),this.toolbarToolRow.classList.add("toolbar-element","toolbar-tool-row"),ho(this.toolbarToolRow),"ResizeObserver"in window?(this.toolRowResizeObserver=new ResizeObserver(a=>{this.onToolbarRowResize()}),this.toolRowResizeObserver.observe(this.toolbarToolRow)):console.warn("ResizeObserver not supported. Toolbar will not resize."),this.toolbarContainer.replaceChildren(this.toolbarActionRow,this.toolbarToolRow),r.appendChild(this.toolbarContainer),this.sidebarVisible=j.fromInitialValue(!1),this.sidebarY=j.fromInitialValue(0),this.menuContainer=document.createElement("div"),this.menuContainer.classList.add(`${M}edgemenu-container`),this.sidebarContainer=document.createElement("div"),this.sidebarContainer.classList.add(`${M}edgemenu`,`${M}element`),this.sidebarContainer.classList.add(`${M}tool-properties`),this.sidebarContent=document.createElement("div"),this.sidebarY.onUpdateAndNow(a=>{let l="dropdown-below-edge";a>0?(this.sidebarContainer.style.transform=`translate(0, ${a}px)`,this.sidebarContainer.style.paddingBottom="",this.menuContainer.classList.add(l)):(this.sidebarContainer.style.transform="",this.sidebarContainer.style.paddingBottom=`${-a}px`,this.menuContainer.classList.remove(l))}),this.closeButton=document.createElement("button"),this.closeButton.classList.add("drag-elem"),this.editor.handleKeyEventsFrom(this.closeButton,a=>a.code!=="Space"&&a.code!=="Enter"&&a.code!=="Tab"),this.sidebarContainer.addEventListener("keyup",a=>{!a.defaultPrevented&&a.code==="Escape"&&(this.sidebarVisible.set(!1),a.preventDefault())}),this.initDragListeners();let i=(...a)=>{this.sidebarContent.replaceChildren(...a),this.setupColorPickers()};this.sidebarTitle=pe.fromInitialValue(""),this.layoutManager=new _o(i,this.sidebarTitle,this.sidebarVisible,e.announceForAccessibility.bind(e),n),this.sidebarTitle.onUpdateAndNow(a=>{this.closeButton.setAttribute("aria-label",n.closeSidebar(a))}),this.listenForVisibilityChanges(),this.sidebarContainer.replaceChildren(this.closeButton,this.sidebarContent),this.menuContainer.replaceChildren(this.sidebarContainer),r.appendChild(this.menuContainer)}listenForVisibilityChanges(){let e=null,r=170;this.sidebarVisible.get()||(this.menuContainer.style.display="none",this.menuContainer.style.opacity="0");let n=window.matchMedia?.("(prefers-reduced-motion: reduce)")??"";this.sidebarVisible.onUpdate(i=>{let a=`${r}ms ease`,l=n.matches?"-reduce-motion":"";i?(this.sidebarY.set(this.snappedSidebarY()),e&&(clearTimeout(e),e=null),this.menuContainer.style.display="",this.sidebarContainer.style.animation=`${a} ${M}-edgemenu-transition-in${l}`,this.menuContainer.style.animation=`${a} ${M}-edgemenu-container-transition-in${l}`,this.menuContainer.style.opacity="1",this.closeButton.focus({preventScroll:!0})):(this.closeColorPickers(),e===null&&(this.sidebarContainer.style.animation=`${a} ${M}-edgemenu-transition-out${l}`,this.menuContainer.style.animation=`${a} ${M}-edgemenu-container-transition-out${l}`,this.menuContainer.style.opacity="0",this.editor.announceForAccessibility(this.localizationTable.dropdownHidden(this.sidebarTitle.get())),e=setTimeout(()=>{this.menuContainer.style.display="none",this.menuContainer.style.overflowY="",e=null},r)))})}onToolbarRowResize(){let e=()=>{let a=this.toolbarToolRow.clientWidth,l=0,c=0,d=0;for(let u of this.toolbarToolRow.children){let h=u.clientHeight;if(l+=h,d++,l>a){c=a-l+h/2,c<0&&(c+=h);break}}let p=Math.round(c/d*10)/10;this.toolbarToolRow.style.setProperty("--extra-left-right-padding",`${p}px`)},r=this.toolbarActionRow.getBoundingClientRect(),n=this.toolbarToolRow.getBoundingClientRect();r.y+r.height<=n.y?this.toolbarContainer.classList.remove("one-row"):this.toolbarContainer.classList.add("one-row"),this.toolbarToolRow.clientWidth<this.toolbarToolRow.scrollWidth?(this.toolbarToolRow.classList.add("has-scroll"),e()):this.toolbarToolRow.classList.remove("has-scroll","extra-padding")}addSpacer(e){}addUndoRedoButtons(){super.addUndoRedoButtons(!1)}addDefaults(){this.addDefaultActionButtons(),this.addDefaultToolWidgets()}updateWidgetCSSClasses(e){let r=e.getTags();e.removeCSSClassFromContainer("label-inline"),e.removeCSSClassFromContainer("label-left"),e.removeCSSClassFromContainer("label-right"),r.includes("save")&&(e.addCSSClassToContainer("label-inline"),e.addCSSClassToContainer("label-left")),r.includes("exit")&&(e.addCSSClassToContainer("label-inline"),e.addCSSClassToContainer("label-right"))}addWidgetInternal(e){this.updateWidgetCSSClasses(e),e.setLayoutManager(this.layoutManager),e.mustBeInToplevelMenu()?e.addTo(this.toolbarActionRow):e.addTo(this.toolbarToolRow)}removeWidgetInternal(e){e.remove()}onRemove(){this.toolbarContainer.remove(),this.menuContainer.remove(),this.toolRowResizeObserver.disconnect(),this.clearDragListeners?.()}initDragListeners(){let e=[this.closeButton,this.sidebarContainer,this.sidebarContent];this.manageListener(this.editor.handlePointerEventsExceptClicksFrom(this.menuContainer,(a,l)=>l.target===this.menuContainer?(a==="pointerdown"&&(this.sidebarVisible.set(!1),setTimeout(()=>this.editor.focus(),0)),!0):!this.sidebarVisible.get(),(a,l)=>l.target===this.menuContainer));let r=!0,n=0,i=Qr(this.sidebarContainer,{draggableChildElements:e,onDrag:(a,l)=>this.handleDrag(a,l),onDragEnd:a=>{n=a.endTimestamp,r=a.roughlyClick,this.finalizeDrag()}});this.clearDragListeners=()=>i.removeListeners(),this.closeButton.onclick=()=>{let a=performance.now()-n<100;(a&&r||!a)&&this.sidebarVisible.set(!1)}}handleDrag(e,r){this.sidebarContainer.style.transition="none",this.sidebarY.set(this.sidebarY.get()+r)}snappedSidebarY(e){let r=e??this.sidebarY.get(),n=[-100,0];this.sidebarContainer.clientHeight>window.innerHeight&&n.push(100);let i=n[0];for(let a of n)Math.abs(a-r)<Math.abs(i-r)&&(i=a);return i}finalizeDrag(){this.sidebarContainer.style.transition="",this.sidebarY.get()>this.sidebarContainer.clientHeight/2?this.sidebarVisible.set(!1):this.sidebarY.set(this.snappedSidebarY())}serializeInternal(){return{menuSizeY:this.snappedSidebarY()}}deserializeInternal(e){typeof e=="object"&&typeof e.menuSizeY=="number"&&this.sidebarY.set(this.snappedSidebarY(e.menuSizeY))}};var Qo=class s extends ze{constructor(e,r){super();this.shortcuts=e;this.viewport=r;this.snapToGridEnabled=!1;this.angleLockEnabled=!1;this.startPointCanvas=null}xyAxesSnap(e){if(!this.startPointCanvas)return e;let r=this.viewport.canvasToScreen(this.startPointCanvas);return e.lockedToXYAxesScreen(r,this.viewport)}mapPointerEvent(e){let r=n=>e.allPointers.length>1?n:this.snapToGridEnabled?n.snappedToGrid(this.viewport):this.angleLockEnabled&&this.startPointCanvas?this.xyAxesSnap(n):n;return{kind:e.kind,current:r(e.current),allPointers:e.allPointers.map(r)}}onEvent(e){let r=this.shortcuts;(e.kind===0||e.kind===1||e.kind===2)&&(e.kind===0&&(this.startPointCanvas=e.current.canvasPos),e=this.mapPointerEvent(e));let n=this.emit(e);if(e.kind===6||!n&&e.kind===5){let i=e.kind===5;r.matchesShortcut(oo,e)&&(this.snapToGridEnabled=i,n=!0),r.matchesShortcut($n,e)&&(this.angleLockEnabled=i,n=!0)}return n}static fromEditor(e){return new s(e.shortcuts,e.viewport)}};var Bs={Control:"ControlLeft","=":"Equal","-":"Minus",";":"Semicolon"," ":"Space"},bl=s=>{let o=s.toUpperCase();return"A"<=o&&o<="Z"?`Key${o}`:"0"<=s&&s<="9"?`Digit${s}`:s in Bs?Bs[s]:s},Ds=bl;var vl=(s,o)=>{let e=$r(s,{title:s.localization.about,contentClassNames:["about-dialog-content"]});for(let r of o){let n=document.createElement(r.minimized?"details":"div");n.classList.add("about-entry");let i=document.createElement(r.minimized?"summary":"h2");if(typeof r.heading=="string")i.innerText=r.heading;else{let a=document.createElement("a");a.href=r.heading.href.replace(/^javascript:/i,""),a.text=r.heading.text,i.appendChild(a)}if(n.appendChild(i),r.text){let a=document.createElement("div");a.innerText=r.text,n.appendChild(a)}e.appendChild(n)}return{close:()=>e.close()}},Ms=vl;var fo={number:"1.26.0"};var yl=(s,o,e)=>{let r=o.w,n=o.h;if(e?.minDimension&&r<e.minDimension){let i=e.minDimension;n*=i/(r||1),r=i}if(e?.minDimension&&n<e.minDimension){let i=e.minDimension;r*=i/(n||1),n=i}s.setAttribute("width",de(r)),s.setAttribute("height",de(n))},As=yl;var Vs=(s,o,e)=>{let r=s.getImportExportViewport().getTemporaryClone();if(e?.minDimension){let a=r.visibleRect,l=a;l.w<=0&&(l=new B(l.x,l.y,e.minDimension,l.h)),l.h<=0&&(l=new B(l.x,l.y,l.w,e.minDimension)),l.eq(a)||r.updateScreenSize(l.size)}let{element:n,renderer:i}=me.fromViewport(r,{sanitize:e.sanitize??!1,useViewBoxForPositioning:!0});return o(i,()=>{s.getAutoresizeEnabled()?n.classList.add(Ar):n.classList.remove(Ar);let a=r.visibleRect;return As(n,a,e),n}),n},Os=(s,o)=>Vs(s,(e,r)=>{s.renderAll(e),r()},o),Fs=(s,o,e)=>new Promise(r=>{Vs(s,async(n,i)=>{await s.renderAllAsync(n,o);let a=i();r(a)},e)});var xl=(s,o)=>{let e=[],r=(c,d)=>c.key===d.key&&c.code===d.code,n=c=>e.some(d=>r(d,c)),i=c=>({code:c.code,key:c.key,ctrlKey:c.ctrlKey,altKey:c.altKey,shiftKey:c.shiftKey,metaKey:c.metaKey}),a=c=>{if(c.type==="keydown"){if(n(c)||e.push(i(c)),!o.filter(c))return;o.handleKeyDown(c)}else{if(console.assert(c.type==="keyup"),e=e.filter(d=>!r(d,c)),!o.filter(c))return;o.handleKeyUp(c)}};s.addEventListener("keydown",c=>{a(c)}),s.addEventListener("keyup",c=>{a(c)}),s.addEventListener("focusout",c=>{let d=!1;if(c.relatedTarget){let p=c.relatedTarget;d=s.contains(p)||o.getHandlesKeyEventsFrom(p)}if(!d){for(let p of e)o.handleKeyUp(new KeyboardEvent("keyup",{...p}));e=[]}});let l=c=>{let d=!1,p=!1,u=!1,h=!1;for(let v of e){let b=v.code;d||=!!b.match(/^Shift(Left|Right)$/),p||=!!b.match(/^Control(Left|Right)$/),u||=!!b.match(/^Alt(Left|Right)$/),h||=!!b.match(/^Meta(Left|Right)$/)}let m=v=>v?"keydown":"keyup",g={shiftKey:c.shiftKey,altKey:c.altKey,metaKey:c.metaKey,ctrlKey:c.ctrlKey};c.shiftKey!==d&&a(new KeyboardEvent(m(c.shiftKey),{...g,key:"Shift",code:"ShiftLeft"})),c.altKey!==u&&a(new KeyboardEvent(m(c.altKey),{...g,key:"Alt",code:"AltLeft"})),c.ctrlKey!==p&&a(new KeyboardEvent(m(c.ctrlKey),{...g,key:"Control",code:"ControlLeft"})),c.metaKey!==h&&a(new KeyboardEvent(m(c.metaKey),{...g,key:"Meta",code:"MetaLeft"}))};s.addEventListener("mousedown",c=>{l(c)}),s.addEventListener("mousemove",c=>{l(c)})},Hs=xl;var wl=s=>(e=>e.replace(/([^\n])[\n]([^\n])/g,"$1 $2"))(`
446
+ `)}p.style.display="none"}else{p.style.display="";let T=o.localization.dragAndDropHereOrBrowse.split(/[{]{2}(.*)[}]{2}/g);d.replaceChildren();for(let P=0;P<T.length;P++)if(P%2===1){let S=document.createElement("b");S.textContent=T[P],d.appendChild(S)}else d.appendChild(document.createTextNode(T[P]))}};if((()=>{a.addEventListener("dragover",y=>{y.preventDefault(),a.classList.add("drag-target")}),a.addEventListener("dragenter",y=>{y.preventDefault(),a.classList.add("drag-target")}),a.addEventListener("dragleave",y=>{y.preventDefault();let f=y.relatedTarget;(!f||!a.contains(f))&&a.classList.remove("drag-target")}),a.addEventListener("drop",y=>{y.preventDefault(),a.classList.remove("drag-target");let f=[];y.dataTransfer&&f.push(...y.dataTransfer.files),h.set(f)}),l.addEventListener("change",()=>{let y=l.files??[];h.set([...y])})})(),n){let y=async()=>{if(m){g?.();return}i.classList.add("-loading"),m=!0,v();try{let f=await n({setOnCancelCallback:T=>{if(!m)throw new Error("Task already completed. Can't register cancel handler.");g=()=>{g=null,v(),T()},v()}});f&&h.set(f)}finally{i.classList.remove("-loading"),m=!1,v()}};l.onclick=y}return h.onUpdate(y=>{y.length===0&&l.files&&l.files.length>0&&(l.value=""),g?.()}),h.onUpdateAndNow(v),{container:i,input:l,selectedFiles:h,addTo:y=>{y.appendChild(i)}}},Is=xl;var wl=s=>{let o=s/1024,e=o/1024,r=e/1024,n="B",i=s;return r>=1?(i=r,n="GiB"):e>=1?(i=e,n="MiB"):o>=1&&(i=o,n="KiB"),{size:i,units:n}},Bs=wl;var or=class s{constructor(o,e,r){this.imageBase64Url=o;this.preview=e;this.onUrlUpdate=r;this.originalSrc=o,e.src=o}updateImageData(o){this.preview.src=o,this.imageBase64Url=o,this.onUrlUpdate()}decreaseSize(o=3/4){let e=document.createElement("canvas");e.width=this.preview.naturalWidth*o,e.height=this.preview.naturalHeight*o,e.getContext("2d")?.drawImage(this.preview,0,0,e.width,e.height);let n=this.originalSrc?.startsWith("data:image/jpeg;")?"image/jpeg":"image/png";this.updateImageData(e.toDataURL(n))}reset(){this.updateImageData(this.originalSrc)}isChanged(){return this.imageBase64Url!==this.originalSrc}isLarge(){return this.getBase64Url().length>125829.12}getBase64Url(){return this.imageBase64Url}getAltText(){return this.altText}setAltText(o){this.altText=o,this.preview.alt=o}static fromSrcAndPreview(o,e,r){return new s(o,e,r)}static fromRenderable(o,e){let r=new Image;r.src=o.base64Url;let n=new s(o.base64Url,r,e),i=o.label??o.image.getAttribute("alt");return i&&n.setAltText(i),{wrapper:n,preview:r}}};var Cl=s=>{let o=document.createElement("div");o.classList.add("toolbar-snapped-scroll-list");let e=document.createElement("div");e.classList.add("scroller");let r=te.fromInitialValue(0),n=null,i=()=>{let p=document.createElement("div");p.classList.add("page-markers"),p.setAttribute("tabindex","-1");let h=[];return j.union([r,s]).onUpdateAndNow(([g,v])=>{let b=!1;for(;v.length<h.length;)h.pop(),b=!0;let y;for(let f=0;f<v.length;f++){let T;if(f>=h.length){T=document.createElement("div");let S=document.createElement("div");S.classList.add("content"),T.replaceChildren(S),h.push(T),b=!0}else T=h[f];T.classList.add("marker"),f===g?(T.classList.add("-active"),y=T):T.classList.remove("-active");let P=f;T.onclick=()=>{c.get()[P]?.element?.scrollIntoView({block:"nearest",behavior:"smooth"})}}b&&p.replaceChildren(...h),y&&p.scrollHeight>o.clientHeight&&y.scrollIntoView({block:"nearest"}),h.length===1?p.classList.add("-one-element"):p.classList.remove("-one-element")}),p},a=()=>{n=new IntersectionObserver(p=>{for(let h of p)if(h.isIntersecting&&h.intersectionRatio>.7){let m=h.target.getAttribute("data-item-index");if(m===null)throw new Error("Could not find attribute data-item-index");let g=Number(m);r.set(g);break}},{root:e,threshold:.9})},l=()=>{n&&(n.disconnect(),r.set(0),n=null)},c=j.map(s,p=>p.map((h,m)=>{let g=document.createElement("div");return h.element.parentElement&&h.element.remove(),g.appendChild(h.element),g.classList.add("item"),g.setAttribute("data-item-index",`${m}`),{element:g,data:h.data}})),d=[];c.onUpdateAndNow(p=>{r.set(-1);for(let h of d)n?.unobserve(h.element);e.replaceChildren(),p.length>1?a():l(),p.length===0?o.classList.add("-empty"):o.classList.remove("-empty");for(let h of p)e.appendChild(h.element);if(r.set(0),n)for(let h of p)n.observe(h.element)});let u=j.map(r,p=>{let h=s.get();return 0<=p&&p<h.length?h[p].data:null});return fo(e),o.replaceChildren(i(),e),{container:o,visibleItem:u}},Ms=Cl;var Tl=async s=>{let o=[],e=new Image,r=await Gr(s);return r&&o.push({image:e,base64Url:r,transform:k.identity}),o},Ds=Tl;var qt=class s extends ae{constructor(o,e){e??=o.localization,super(o,"insert-image-widget",e),this.container.classList.add("dropdownShowable"),o.notifier.on(9,r=>{r.kind===9&&this.isDropdownVisible()&&this.updateInputs()}),this.images=te.fromInitialValue([]),this.images.onUpdateAndNow(()=>{this.onImageDataUpdate()})}getTitle(){return this.localizationTable.image}createIcon(){return this.editor.icons.makeInsertImageIcon()}setDropdownVisible(o){super.setDropdownVisible(o),this.isDropdownVisible()?this.updateInputs():this.selectedFiles?.set([])}handleClick(){this.setDropdownVisible(!this.isDropdownVisible())}static{this.nextInputId=0}fillDropdown(o){let e=document.createElement("div");e.classList.add("insert-image-widget-dropdown-content",`${D}spacedList`,`${D}nonbutton-controls-main-list`);let{container:r,selectedFiles:n}=Is(this.localizationTable.chooseFile,this.editor,{accepts:"image/*",allowMultiSelect:!0,customPickerAction:this.editor.getCurrentSettings().image?.showImagePicker}),i=document.createElement("div");this.imagesPreview=Ms(this.images),this.statusView=document.createElement("div");let a=document.createElement("div");a.classList.add("action-button-row"),this.statusView.classList.add("insert-image-image-status-view"),this.submitButton=document.createElement("button"),this.selectedFiles=n,this.imageAltTextInput=document.createElement("input");let l=document.createElement("label"),c=`insert-image-alt-text-input-${s.nextInputId++}`;return this.imageAltTextInput.setAttribute("id",c),l.htmlFor=c,l.innerText=this.localizationTable.inputAltText,this.imageAltTextInput.type="text",this.imageAltTextInput.placeholder=this.localizationTable.describeTheImage,this.statusView.setAttribute("aria-live","polite"),this.submitButton.innerText=this.localizationTable.submit,this.imagesPreview.visibleItem.onUpdateAndNow(()=>this.onImageDataUpdate()),this.imageAltTextInput.oninput=()=>{let d=this.imagesPreview.visibleItem.get();d&&(d.setAltText(this.imageAltTextInput.value),this.submitButton.style.display="")},this.selectedFiles.onUpdateAndNow(async d=>{if(d.length===0){this.images.set([]);return}let u=(await Promise.all(d.map(async p=>{let h;try{h=await Ds(p)}catch(m){console.error("Image load error",m);let g=this.localizationTable.imageLoadError(m);return this.statusView.innerText=g,[]}return h.map(m=>{let{wrapper:g,preview:v}=or.fromRenderable(m,()=>this.onImageDataUpdate());return{data:g,element:v}})}))).flat();this.images.set(u)}),i.replaceChildren(l,this.imageAltTextInput),a.replaceChildren(this.submitButton),e.replaceChildren(r,i,this.imagesPreview.container,this.statusView,a),o.replaceChildren(e),!0}onImageDataUpdate(){if(!this.imagesPreview)return;let o=this.imagesPreview.visibleItem.get(),e=o?.getBase64Url();this.imageAltTextInput.value=o?.getAltText()??"",e?(this.submitButton.disabled=!1,this.submitButton.style.display="",this.updateImageSizeDisplay()):(this.submitButton.disabled=!0,this.submitButton.style.display="none",this.statusView.innerText="",this.submitButton.disabled=!0),this.images.get().length<=1?this.submitButton.innerText=this.localizationTable.submit:this.submitButton.innerText=this.localizationTable.addAll}hideDialog(){this.setDropdownVisible(!1)}updateImageSizeDisplay(){let o=this.imagesPreview.visibleItem.get(),e=o?.getBase64Url()??"",{size:r,units:n}=Bs(e.length),i=document.createElement("span");i.innerText=this.localizationTable.imageSize(Math.round(r),n);let a=document.createElement("button");a.innerText=this.localizationTable.decreaseImageSize,a.onclick=()=>{o?.decreaseSize()};let l=document.createElement("button");l.innerText=this.localizationTable.resetImage,l.onclick=()=>{o?.reset()},this.statusView.replaceChildren(i),o?.isLarge()?this.statusView.appendChild(a):o?.isChanged()?this.statusView.appendChild(l):this.images.get().some(d=>d.data?.isChanged()||d.data?.isLarge())&&(a.disabled=!0,this.statusView.appendChild(a))}updateInputs(){(()=>{this.selectedFiles?.set([]),this.imageAltTextInput.value="",this.submitButton.disabled=!0,this.statusView.innerText="",this.submitButton.style.display=""})();let e=this.editor.toolController.getMatchingTools(ve),r=e.map(i=>i.getSelectedObjects()).flat(),n=null;if(r.length===1&&r[0]instanceof be){n=r[0];let i=new Image,a=or.fromSrcAndPreview(n.getURL(),i,()=>this.onImageDataUpdate());a.setAltText(n.getAltText()??""),this.images.set([{data:a,element:i}])}else r.length>0&&e.forEach(i=>i.clearSelection());this.submitButton.style.display="none",this.submitButton.onclick=async()=>{let i=[],a=k.identity,l=null;for(let{data:c}of this.images.get()){if(!c)continue;let d=new Image;d.src=c.getBase64Url();let u=c.getAltText();u&&d.setAttribute("alt",u);let p;try{p=await be.fromImage(d,a)}catch(g){console.error("Error loading image",g),this.statusView.innerText=this.localizationTable.imageLoadError(g);return}let h=p.getBBox();if(h.area===0){this.statusView.innerText=this.localizationTable.errorImageHasZeroSize;return}i.push(p),l??=h,l.union(h);let m=w.of(0,h.height);a=a.rightMul(k.translation(m))}if(i.length){if(!l)throw new Error("Logic error: Full bounding box must be calculated when components are to be added.");if(this.hideDialog(),n){let c=new J([n]),d=n.getTransformation(),u=n.getBBox().width||1,p=l.transformedBoundingBox(d).width||1,h=k.scaling2D(u/p),m=[];for(let g of i)m.push(q.addElement(g),g.transformBy(d.rightMul(h)),g.setZIndex(n.getZIndex()));this.editor.dispatch(le([...m,c])),e[0]?.setSelection(i)}else await this.editor.addAndCenterComponents(i)}}}};var Zt=class s extends ae{constructor(e,r){super(e,"document-properties-widget",r);this.updateDropdownContent=()=>{};this.dropdownUpdateQueued=!1;this.container.classList.add("dropdownShowable"),this.editor.notifier.on(3,()=>{this.queueDropdownUpdate()}),this.editor.image.notifier.on(0,()=>{this.queueDropdownUpdate()})}getTitle(){return this.localizationTable.documentProperties}createIcon(){return this.editor.icons.makeConfigureDocumentIcon()}handleClick(){this.setDropdownVisible(!this.isDropdownVisible()),this.queueDropdownUpdate()}queueDropdownUpdate(){this.dropdownUpdateQueued||(requestAnimationFrame(()=>this.updateDropdown()),this.dropdownUpdateQueued=!0)}updateDropdown(){this.dropdownUpdateQueued=!1,this.isDropdownVisible()&&this.updateDropdownContent()}setBackgroundColor(e){this.editor.dispatch(this.editor.setBackgroundColor(e))}getBackgroundColor(){return this.editor.estimateBackgroundColor()}removeBackgroundComponents(){let e=[];for(let r of this.editor.image.getBackgroundComponents())r instanceof ce&&e.push(r);return new J(e)}setBackgroundType(e){let r=this.editor.estimateBackgroundColor(),n=new ce(e,r),i=this.editor.image.addElement(n);return le([this.removeBackgroundComponents(),i])}getBackgroundType(){let e=this.editor.image.getBackgroundComponents();for(let r=e.length-1;r>=0;r--){let n=e[r];if(n instanceof ce)return n.getBackgroundType()}return 2}updateImportExportRectSize(e){let r=c=>(c!==void 0&&(!isFinite(c)||c<=0)&&(c=100),c),n=r(e.width),i=r(e.height),a=this.editor.getImportExportRect(),l=new I(a.x,a.y,n??a.w,i??a.h);this.editor.dispatch(this.editor.image.setImportExportRect(l)),this.editor.queueRerender()}getHelpText(){return this.localizationTable.pageDropdown__baseHelpText}static{this.idCounter=0}fillDropdown(e,r){let n=document.createElement("div");n.classList.add(`${D}spacedList`,`${D}nonbutton-controls-main-list`,`${D}document-properties-widget`);let i=()=>{let f=document.createElement("div"),T=document.createElement("label");T.innerText=this.localizationTable.backgroundColor;let{input:P,container:S,setValue:E,registerWithHelpTextDisplay:C}=vt(this.editor,O=>{O.eq(this.getBackgroundColor())||this.setBackgroundColor(O)});return P.id=`${D}docPropertiesColorInput-${s.idCounter++}`,T.htmlFor=P.id,f.replaceChildren(T,S),{setBgColorInputValue:E,backgroundColorRow:f,registerWithHelp:O=>{O&&(O?.registerTextHelpForElement(f,this.localizationTable.pageDropdown__backgroundColorHelpText),C(O))}}},{backgroundColorRow:a,setBgColorInputValue:l,registerWithHelp:c}=i(),d=(f,T)=>{let P=document.createElement("div"),S=document.createElement("label"),E=document.createElement("input");return E.id=`${D}docPropertiesCheckbox-${s.idCounter++}`,S.htmlFor=E.id,E.type="checkbox",S.innerText=f,E.oninput=()=>{T(E.checked)},P.replaceChildren(S,E),{container:P,checkbox:E}},{container:u,checkbox:p}=d(this.localizationTable.useGridOption,f=>{if(this.getBackgroundType()===1===f)return;let S=0;f&&(S=1),this.editor.dispatch(this.setBackgroundType(S))}),h=(f,T)=>{let P=document.createElement("div"),S=document.createElement("label"),E=document.createElement("input");return S.innerText=f,E.type="number",E.min="0",E.id=`${D}docPropertiesDimensionRow-${s.idCounter++}`,S.htmlFor=E.id,E.style.flexGrow="2",E.style.width="25px",E.oninput=()=>{T(parseFloat(E.value))},P.classList.add("js-draw-size-input-row"),P.replaceChildren(S,E),{setValue:C=>{if(document.activeElement===E&&E.value.match(/^0*$/)){let V=E.value;E.type="text",E.value=C.toString();let O=Math.max(1,E.value.length-V.length);E.setSelectionRange(0,O),E.type="number"}else E.value=C.toString()},setIsAutomaticSize:C=>{E.disabled=C;let V="size-input-row--automatic-size";C?P.classList.add(V):P.classList.remove(V)},element:P}},m=h(this.localizationTable.imageWidthOption,f=>{this.updateImportExportRectSize({width:f})}),g=h(this.localizationTable.imageHeightOption,f=>{this.updateImportExportRectSize({height:f})}),{container:v,checkbox:b}=d(this.localizationTable.enableAutoresizeOption,f=>{let T=this.editor.image;this.editor.dispatch(T.setAutoresizeEnabled(f))}),y=document.createElement("button");return y.classList.add("about-button"),y.innerText=this.localizationTable.about,y.onclick=()=>{this.editor.showAboutDialog()},c(r),r?.registerTextHelpForElement(u,this.localizationTable.pageDropdown__gridCheckboxHelpText),r?.registerTextHelpForElement(v,this.localizationTable.pageDropdown__autoresizeCheckboxHelpText),r?.registerTextHelpForElement(y,this.localizationTable.pageDropdown__aboutButtonHelpText),this.updateDropdownContent=()=>{l(this.getBackgroundColor());let f=this.editor.image.getAutoresizeEnabled(),T=this.editor.getImportExportRect();m.setValue(T.width),g.setValue(T.height),b.checked=f,m.setIsAutomaticSize(f),g.setIsAutomaticSize(f),p.checked=this.getBackgroundType()===1},this.updateDropdownContent(),n.replaceChildren(a,u,m.element,g.element,v,y),e.replaceChildren(n),!0}};var Li=class extends Ue{constructor(o,e,r,n={}){super(o,"save-button",()=>n.icon??o.icons.makeSaveIcon(),n.label??e.save,r),this.setTags(["save"])}shouldAutoDisableInReadOnlyEditor(){return!1}onKeyPress(o){return this.editor.shortcuts.matchesShortcut(Pi,o)?(this.clickAction(),!0):super.onKeyPress(o)}mustBeInToplevelMenu(){return!0}},As=Li;var Ii=class extends Ue{constructor(o,e,r,n={}){super(o,"exit-button",()=>n.icon??o.icons.makeCloseIcon(),n.label??e.exit,r),this.setTags(["exit"])}shouldAutoDisableInReadOnlyEditor(){return!1}onKeyPress(o){return this.editor.shortcuts.matchesShortcut(Ei,o)?(this.clickAction(),!0):super.onKeyPress(o)}mustBeInToplevelMenu(){return!0}},Vs=Ii;var it=class s{constructor(o,e=ro){this.editor=o;this.localizationTable=e;this.#e=[];this.#t={};this.#o=[];this.#r=null;this.closeColorPickerOverlay=null;s.colorisStarted||(Rs(),s.colorisStarted=!0),this.setupColorPickers()}#e;#t;#o;static{this.colorisStarted=!1}#r;setupCloseColorPickerOverlay(){this.closeColorPickerOverlay||(this.closeColorPickerOverlay=document.createElement("div"),this.closeColorPickerOverlay.className=`${D}closeColorPickerOverlay`,this.editor.createHTMLOverlay(this.closeColorPickerOverlay),this.#e.push(this.editor.handlePointerEventsExceptClicksFrom(this.closeColorPickerOverlay,o=>(o==="pointerdown"&&wi(),o==="pointerup"&&this.editor.focus(),!0))))}setupColorPickers(){if(this.#r){this.#r();return}this.setupCloseColorPickerOverlay();let o=12,e=[L.red.toHexString(),L.purple.toHexString(),L.blue.toHexString(),L.clay.toHexString(),L.black.toHexString(),L.white.toHexString()],r=e.length,n=!1,i=()=>{try{ks({el:".coloris_input",format:"hex",selectInput:!1,focusInput:!1,themeMode:"auto",swatches:e})}catch(l){console.warn("Failed to initialize Coloris. Error: ",l),n||(n=!0,document.addEventListener("load",()=>{i()},{once:!0}))}};i(),this.#r=i;let a=l=>{let c=!1;for(let d of e)d===l&&(c=!0);c||(e.push(l),e.length>o&&e.splice(r,1),i())};this.#e.push(this.editor.notifier.on(11,l=>{l.kind===11&&this.closeColorPickerOverlay&&(this.closeColorPickerOverlay.style.display=l.open?"block":"none")})),this.#e.push(this.editor.notifier.on(12,l=>{l.kind===12&&a(l.color.toHexString())}))}closeColorPickers(){wi?.()}getWidgetUniqueId(o){return o.getUniqueIdIn(this.#t)}getWidgetFromId(o){return this.#t[o]}getAllWidgets(){return this.#o}addWidget(o){let e=o.getUniqueIdIn(this.#t);this.#t[e]=o,this.#o.push(o),this.addWidgetInternal(o),this.setupColorPickers()}removeWidget(o){let e=o.getUniqueIdIn(this.#t);this.removeWidgetInternal(o),delete this.#t[e],this.#o=this.#o.filter(r=>r!==o)}static{this.rootToolbarId="root-toolbar--"}serializeState(){let o={};for(let e in this.#t)o[e]=this.#t[e].serializeState();return o[s.rootToolbarId]=this.serializeInternal(),JSON.stringify(o)}deserializeState(o){let e=JSON.parse(o);yr(e),Gi(e);let r=s.rootToolbarId;r in e&&typeof e[r]<"u"&&this.deserializeInternal(e[r]);for(let n in e)if(n!==r){if(!(n in this.#t)){console.warn(`Unable to deserialize widget ${n} \xAD\u2014 no such widget.`);continue}typeof e[n]=="object"&&e[n]&&this.#t[n].deserializeFrom(e[n])}}serializeInternal(){}deserializeInternal(o){}makeActionButton(o,e,r=!0){typeof r=="boolean"&&(r={mustBeToplevel:r});let n=r.mustBeToplevel??!0,i=r.autoDisableInReadOnlyEditors??!0,a=typeof o=="string"?o:o.label,l="action-button",c=()=>typeof o=="string"?null:o.icon;return new Ue(this.editor,l,c,a,e,this.editor.localization,n,i)}addActionButton(o,e,r=!0){let n=this.makeActionButton(o,e,r);return this.addWidget(n),n}addTaggedActionButton(o,e,r,n=!0){let i=this.makeActionButton(e,r,n);return i.setTags(o),this.addWidget(i),i}addSaveButton(o,e={}){let r=new As(this.editor,this.localizationTable,o,e);return this.addWidget(r),r}addExitButton(o,e={}){let r=new Vs(this.editor,this.localizationTable,o,e);return this.addWidget(r),r}addUndoRedoButtons(o=!0){let e=()=>this.addTaggedActionButton(["undo"],{label:this.localizationTable.undo,icon:this.editor.icons.makeUndoIcon()},()=>{this.editor.history.undo()}),r=()=>this.addTaggedActionButton(["redo"],{label:this.localizationTable.redo,icon:this.editor.icons.makeRedoIcon()},()=>{this.editor.history.redo()}),n,i;o?(n=e(),i=r()):(i=r(),n=e()),n.setDisabled(!0),i.setDisabled(!0),this.editor.notifier.on(3,a=>{if(a.kind!==3)throw new Error("Wrong event type!");n.setDisabled(a.undoStackSize===0),i.setDisabled(a.redoStackSize===0)})}addWidgetsForPrimaryTools(o){for(let e of this.editor.toolController.getPrimaryTools())if(!(o&&!o?.(e)))if(e instanceof Ne){let r=new Wt(this.editor,e,this.localizationTable);this.addWidget(r)}else e instanceof Je?this.addWidget(new Kt(this.editor,e,this.localizationTable)):e instanceof ve?this.addWidget(new Gt(this.editor,e,this.localizationTable)):e instanceof $e?this.addWidget(new jt(this.editor,e,this.localizationTable)):e instanceof Ce&&this.addWidget(new _t(this.editor,e,this.localizationTable))}addDefaultToolWidgets(){this.addWidgetsForPrimaryTools(),this.addDefaultEditorControlWidgets()}addDefaultEditorControlWidgets(){this.addWidget(new Zt(this.editor,this.localizationTable)),this.addWidget(new qt(this.editor,this.localizationTable))}addDefaultActionButtons(){this.addUndoRedoButtons()}remove(){this.closeColorPickerOverlay?.remove();for(let o of this.#e)o.remove();this.#e=[],this.onRemove();for(let o of this.#o)o.remove()}manageListener(o){this.#e.push(o)}};var Os=s=>new go(s,s.getRootElement(),s.localization),go=class extends it{constructor(e,r,n){super(e,n);this.clearDragListeners=null;this.toolbarContainer=document.createElement("div"),this.toolbarContainer.classList.add(`${D}root`),this.toolbarContainer.classList.add(`${D}element`),this.toolbarContainer.classList.add(`${D}edge-toolbar`),this.toolbarContainer.setAttribute("role","toolbar"),this.toolbarActionRow=document.createElement("div"),this.toolbarActionRow.classList.add("toolbar-element","toolbar-action-row"),this.toolbarToolRow=document.createElement("div"),this.toolbarToolRow.classList.add("toolbar-element","toolbar-tool-row"),fo(this.toolbarToolRow),"ResizeObserver"in window?(this.toolRowResizeObserver=new ResizeObserver(a=>{this.onToolbarRowResize()}),this.toolRowResizeObserver.observe(this.toolbarToolRow)):console.warn("ResizeObserver not supported. Toolbar will not resize."),this.toolbarContainer.replaceChildren(this.toolbarActionRow,this.toolbarToolRow),r.appendChild(this.toolbarContainer),this.sidebarVisible=j.fromInitialValue(!1),this.sidebarY=j.fromInitialValue(0),this.menuContainer=document.createElement("div"),this.menuContainer.classList.add(`${D}edgemenu-container`),this.sidebarContainer=document.createElement("div"),this.sidebarContainer.classList.add(`${D}edgemenu`,`${D}element`),this.sidebarContainer.classList.add(`${D}tool-properties`),this.sidebarContent=document.createElement("div"),this.sidebarY.onUpdateAndNow(a=>{let l="dropdown-below-edge";a>0?(this.sidebarContainer.style.transform=`translate(0, ${a}px)`,this.sidebarContainer.style.paddingBottom="",this.menuContainer.classList.add(l)):(this.sidebarContainer.style.transform="",this.sidebarContainer.style.paddingBottom=`${-a}px`,this.menuContainer.classList.remove(l))}),this.closeButton=document.createElement("button"),this.closeButton.classList.add("drag-elem"),this.editor.handleKeyEventsFrom(this.closeButton,a=>a.code!=="Space"&&a.code!=="Enter"&&a.code!=="Tab"),this.sidebarContainer.addEventListener("keyup",a=>{!a.defaultPrevented&&a.code==="Escape"&&(this.sidebarVisible.set(!1),a.preventDefault())}),this.initDragListeners();let i=(...a)=>{this.sidebarContent.replaceChildren(...a),this.setupColorPickers()};this.sidebarTitle=te.fromInitialValue(""),this.layoutManager=new Qo(i,this.sidebarTitle,this.sidebarVisible,e.announceForAccessibility.bind(e),n),this.sidebarTitle.onUpdateAndNow(a=>{this.closeButton.setAttribute("aria-label",n.closeSidebar(a))}),this.listenForVisibilityChanges(),this.sidebarContainer.replaceChildren(this.closeButton,this.sidebarContent),this.menuContainer.replaceChildren(this.sidebarContainer),r.appendChild(this.menuContainer)}listenForVisibilityChanges(){let e=null,r=170;this.sidebarVisible.get()||(this.menuContainer.style.display="none",this.menuContainer.style.opacity="0");let n=window.matchMedia?.("(prefers-reduced-motion: reduce)")??"";this.sidebarVisible.onUpdate(i=>{let a=`${r}ms ease`,l=n.matches?"-reduce-motion":"";i?(this.sidebarY.set(this.snappedSidebarY()),e&&(clearTimeout(e),e=null),this.menuContainer.style.display="",this.sidebarContainer.style.animation=`${a} ${D}-edgemenu-transition-in${l}`,this.menuContainer.style.animation=`${a} ${D}-edgemenu-container-transition-in${l}`,this.menuContainer.style.opacity="1",this.closeButton.focus({preventScroll:!0})):(this.closeColorPickers(),e===null&&(this.sidebarContainer.style.animation=`${a} ${D}-edgemenu-transition-out${l}`,this.menuContainer.style.animation=`${a} ${D}-edgemenu-container-transition-out${l}`,this.menuContainer.style.opacity="0",this.editor.announceForAccessibility(this.localizationTable.dropdownHidden(this.sidebarTitle.get())),e=setTimeout(()=>{this.menuContainer.style.display="none",this.menuContainer.style.overflowY="",e=null},r)))})}onToolbarRowResize(){let e=()=>{let a=this.toolbarToolRow.clientWidth,l=0,c=0,d=0;for(let p of this.toolbarToolRow.children){let h=p.clientHeight;if(l+=h,d++,l>a){c=a-l+h/2,c<0&&(c+=h);break}}let u=Math.round(c/d*10)/10;this.toolbarToolRow.style.setProperty("--extra-left-right-padding",`${u}px`)},r=this.toolbarActionRow.getBoundingClientRect(),n=this.toolbarToolRow.getBoundingClientRect();r.y+r.height<=n.y?this.toolbarContainer.classList.remove("one-row"):this.toolbarContainer.classList.add("one-row"),this.toolbarToolRow.clientWidth<this.toolbarToolRow.scrollWidth?(this.toolbarToolRow.classList.add("has-scroll"),e()):this.toolbarToolRow.classList.remove("has-scroll","extra-padding")}addSpacer(e){}addUndoRedoButtons(){super.addUndoRedoButtons(!1)}addDefaults(){this.addDefaultActionButtons(),this.addDefaultToolWidgets()}updateWidgetCSSClasses(e){let r=e.getTags();e.removeCSSClassFromContainer("label-inline"),e.removeCSSClassFromContainer("label-left"),e.removeCSSClassFromContainer("label-right"),r.includes("save")&&(e.addCSSClassToContainer("label-inline"),e.addCSSClassToContainer("label-left")),r.includes("exit")&&(e.addCSSClassToContainer("label-inline"),e.addCSSClassToContainer("label-right"))}addWidgetInternal(e){this.updateWidgetCSSClasses(e),e.setLayoutManager(this.layoutManager),e.mustBeInToplevelMenu()?e.addTo(this.toolbarActionRow):e.addTo(this.toolbarToolRow)}removeWidgetInternal(e){e.remove()}onRemove(){this.toolbarContainer.remove(),this.menuContainer.remove(),this.toolRowResizeObserver.disconnect(),this.clearDragListeners?.()}initDragListeners(){let e=[this.closeButton,this.sidebarContainer,this.sidebarContent];this.manageListener(this.editor.handlePointerEventsExceptClicksFrom(this.menuContainer,(a,l)=>l.target===this.menuContainer?(a==="pointerdown"&&(this.sidebarVisible.set(!1),setTimeout(()=>this.editor.focus(),0)),!0):!this.sidebarVisible.get(),(a,l)=>l.target===this.menuContainer));let r=!0,n=0,i=rn(this.sidebarContainer,{draggableChildElements:e,onDrag:(a,l)=>this.handleDrag(a,l),onDragEnd:a=>{n=a.endTimestamp,r=a.roughlyClick,this.finalizeDrag()}});this.clearDragListeners=()=>i.removeListeners(),this.closeButton.onclick=()=>{let a=performance.now()-n<100;(a&&r||!a)&&this.sidebarVisible.set(!1)}}handleDrag(e,r){this.sidebarContainer.style.transition="none",this.sidebarY.set(this.sidebarY.get()+r)}snappedSidebarY(e){let r=e??this.sidebarY.get(),n=[-100,0];this.sidebarContainer.clientHeight>window.innerHeight&&n.push(100);let i=n[0];for(let a of n)Math.abs(a-r)<Math.abs(i-r)&&(i=a);return i}finalizeDrag(){this.sidebarContainer.style.transition="",this.sidebarY.get()>this.sidebarContainer.clientHeight/2?this.sidebarVisible.set(!1):this.sidebarY.set(this.snappedSidebarY())}serializeInternal(){return{menuSizeY:this.snappedSidebarY()}}deserializeInternal(e){typeof e=="object"&&typeof e.menuSizeY=="number"&&this.sidebarY.set(this.snappedSidebarY(e.menuSizeY))}};var rr=class s extends Re{constructor(e,r){super();this.shortcuts=e;this.viewport=r;this.snapToGridEnabled=!1;this.angleLockEnabled=!1;this.startPointCanvas=null}xyAxesSnap(e){if(!this.startPointCanvas)return e;let r=this.viewport.canvasToScreen(this.startPointCanvas);return e.lockedToXYAxesScreen(r,this.viewport)}mapPointerEvent(e){let r=n=>e.allPointers.length>1?n:this.snapToGridEnabled?n.snappedToGrid(this.viewport):this.angleLockEnabled&&this.startPointCanvas?this.xyAxesSnap(n):n;return{kind:e.kind,current:r(e.current),allPointers:e.allPointers.map(r)}}onEvent(e){let r=this.shortcuts;(e.kind===0||e.kind===1||e.kind===2)&&(e.kind===0&&(this.startPointCanvas=e.current.canvasPos),e=this.mapPointerEvent(e));let n=this.emit(e);if(e.kind===6||!n&&e.kind===5){let i=e.kind===5;r.matchesShortcut(io,e)&&(this.snapToGridEnabled=i,n=!0),r.matchesShortcut(Gn,e)&&(this.angleLockEnabled=i,n=!0)}return n}static fromEditor(e){return new s(e.shortcuts,e.viewport)}};var Fs={Control:"ControlLeft","=":"Equal","-":"Minus",";":"Semicolon"," ":"Space"},Sl=s=>{let o=s.toUpperCase();return"A"<=o&&o<="Z"?`Key${o}`:"0"<=s&&s<="9"?`Digit${s}`:s in Fs?Fs[s]:s},Hs=Sl;var Pl=(s,o)=>{let e=jr(s,{title:s.localization.about,contentClassNames:["about-dialog-content"]});for(let r of o){let n=document.createElement(r.minimized?"details":"div");n.classList.add("about-entry");let i=document.createElement(r.minimized?"summary":"h2");if(typeof r.heading=="string")i.innerText=r.heading;else{let a=document.createElement("a");a.href=r.heading.href.replace(/^javascript:/i,""),a.text=r.heading.text,i.appendChild(a)}if(n.appendChild(i),r.text){let a=document.createElement("div");a.innerText=r.text,n.appendChild(a)}e.appendChild(n)}return{close:()=>e.close()}},Ns=Pl;var bo={number:"1.27.1"};var El=(s,o,e)=>{let r=o.w,n=o.h;if(e?.minDimension&&r<e.minDimension){let i=e.minDimension;n*=i/(r||1),r=i}if(e?.minDimension&&n<e.minDimension){let i=e.minDimension;r*=i/(n||1),n=i}s.setAttribute("width",pe(r)),s.setAttribute("height",pe(n))},$s=El;var Us=(s,o,e)=>{let r=s.getImportExportViewport().getTemporaryClone();if(e?.minDimension){let a=r.visibleRect,l=a;l.w<=0&&(l=new I(l.x,l.y,e.minDimension,l.h)),l.h<=0&&(l=new I(l.x,l.y,l.w,e.minDimension)),l.eq(a)||r.updateScreenSize(l.size)}let{element:n,renderer:i}=me.fromViewport(r,{sanitize:e.sanitize??!1,useViewBoxForPositioning:!0});return o(i,()=>{s.getAutoresizeEnabled()?n.classList.add(Nr):n.classList.remove(Nr);let a=r.visibleRect;return $s(n,a,e),n}),n},Ws=(s,o)=>Us(s,(e,r)=>{s.renderAll(e),r()},o),Ks=(s,o,e)=>new Promise(r=>{Us(s,async(n,i)=>{await s.renderAllAsync(n,o);let a=i();r(a)},e)});var kl=(s,o)=>{let e=[],r=(c,d)=>c.key===d.key&&c.code===d.code,n=c=>e.some(d=>r(d,c)),i=c=>({code:c.code,key:c.key,ctrlKey:c.ctrlKey,altKey:c.altKey,shiftKey:c.shiftKey,metaKey:c.metaKey}),a=c=>{if(c.type==="keydown"){if(n(c)||e.push(i(c)),!o.filter(c))return;o.handleKeyDown(c)}else{if(console.assert(c.type==="keyup"),e=e.filter(d=>!r(d,c)),!o.filter(c))return;o.handleKeyUp(c)}};s.addEventListener("keydown",c=>{a(c)}),s.addEventListener("keyup",c=>{a(c)}),s.addEventListener("focusout",c=>{let d=!1;if(c.relatedTarget){let u=c.relatedTarget;d=s.contains(u)||o.getHandlesKeyEventsFrom(u)}if(!d){for(let u of e)o.handleKeyUp(new KeyboardEvent("keyup",{...u}));e=[]}});let l=c=>{let d=!1,u=!1,p=!1,h=!1;for(let v of e){let b=v.code;d||=!!b.match(/^Shift(Left|Right)$/),u||=!!b.match(/^Control(Left|Right)$/),p||=!!b.match(/^Alt(Left|Right)$/),h||=!!b.match(/^Meta(Left|Right)$/)}let m=v=>v?"keydown":"keyup",g={shiftKey:c.shiftKey,altKey:c.altKey,metaKey:c.metaKey,ctrlKey:c.ctrlKey};c.shiftKey!==d&&a(new KeyboardEvent(m(c.shiftKey),{...g,key:"Shift",code:"ShiftLeft"})),c.altKey!==p&&a(new KeyboardEvent(m(c.altKey),{...g,key:"Alt",code:"AltLeft"})),c.ctrlKey!==u&&a(new KeyboardEvent(m(c.ctrlKey),{...g,key:"Control",code:"ControlLeft"})),c.metaKey!==h&&a(new KeyboardEvent(m(c.metaKey),{...g,key:"Meta",code:"MetaLeft"}))};s.addEventListener("mousedown",c=>{l(c)}),s.addEventListener("mousemove",c=>{l(c)})},Gs=kl;var Rl=s=>(e=>e.replace(/([^\n])[\n]([^\n])/g,"$1 $2"))(`
442
447
  MIT License
443
448
 
444
449
  Copyright (c) ${s}
@@ -459,12 +464,12 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
459
464
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
460
465
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
461
466
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
462
- SOFTWARE.`),dn=wl;var Jo=class extends ze{constructor(){super();this.canShowContextMenu=!1;this.stationaryDetector=null;this.clickTolerance=12}canMakeLongPressMenuEvent(e){let r=[2];return e.allPointers.length===1&&r.includes(e.current.device)}onEvent(e){let r=()=>Jt(e)&&this.canShowContextMenu&&this.emit({kind:9,screenPos:e.current.screenPos,canvasPos:e.current.canvasPos})?(this.emit({kind:3}),!0):!1;if(e.kind===0)e.allPointers.length===1?(this.canShowContextMenu=!0,this.contextMenuTriggerPointer=e.current,this.contextMenuStartPoint=e.current.screenPos,this.canMakeLongPressMenuEvent(e)&&(this.stationaryDetector=new Et(e.current,Ir,r))):this.canShowContextMenu=!1;else if(e.kind===1){if(this.canShowContextMenu){this.stationaryDetector?.onPointerMove(e.current);let n=e.current.screenPos.minus(this.contextMenuStartPoint),i=this.clickTolerance;n.length()>i&&(this.canShowContextMenu=!1)}}else if(e.kind===2&&(this.stationaryDetector?.destroy(),this.contextMenuTriggerPointer?.id===e.current.id&&this.contextMenuTriggerPointer.device===4&&r()))return!0;return this.emit(e)}};var ki=class{constructor(o,e={}){this.eventListenerTargets=[];this.previousAccessibilityAnnouncement="";this.pointers={};this.announceUndoCallback=o=>{this.announceForAccessibility(this.localization.undoAnnouncement(o.description(this,this.localization)))};this.announceRedoCallback=o=>{this.announceForAccessibility(this.localization.redoAnnouncement(o.description(this,this.localization)))};this.nextRerenderListeners=[];this.rerenderQueued=!1;this.closeAboutDialog=null;if(this.localization={...yr(),...e.localization},this.settings={wheelEventsEnabled:e.wheelEventsEnabled??!0,renderingMode:e.renderingMode??1,localization:this.localization,minZoom:e.minZoom??2e-10,maxZoom:e.maxZoom??1e12,keyboardShortcutOverrides:e.keyboardShortcutOverrides??{},iconProvider:e.iconProvider??new Ft,notices:e.notices??[],appInfo:e.appInfo?{...e.appInfo}:null,pens:{additionalPenTypes:e.pens?.additionalPenTypes??[],filterPenTypes:e.pens?.filterPenTypes??(()=>!0)},text:{fonts:e.text?.fonts??["sans-serif","serif","monospace"]},image:{showImagePicker:e.image?.showImagePicker??void 0},clipboardApi:e.clipboardApi??null},this.settings.minZoom>this.settings.maxZoom)throw new Error("Minimum zoom must be lesser than maximum zoom!");this.readOnly=pe.fromInitialValue(!1),this.icons=this.settings.iconProvider,this.shortcuts=new H(this.settings.keyboardShortcutOverrides),this.container=document.createElement("div"),this.renderingRegion=document.createElement("div"),this.container.appendChild(this.renderingRegion),this.container.classList.add("imageEditorContainer","js-draw"),this.loadingWarning=document.createElement("div"),this.loadingWarning.classList.add("loadingMessage"),this.loadingWarning.ariaLive="polite",this.container.appendChild(this.loadingWarning),this.accessibilityControlArea=document.createElement("textarea"),this.accessibilityControlArea.setAttribute("placeholder",this.localization.accessibilityInputInstructions),this.accessibilityControlArea.style.opacity="0",this.accessibilityControlArea.style.width="0",this.accessibilityControlArea.style.height="0",this.accessibilityControlArea.style.position="absolute",this.accessibilityAnnounceArea=document.createElement("div"),this.accessibilityAnnounceArea.setAttribute("aria-live","assertive"),this.accessibilityAnnounceArea.className="accessibilityAnnouncement",this.container.appendChild(this.accessibilityAnnounceArea),this.renderingRegion.style.touchAction="none",this.renderingRegion.className="imageEditorRenderArea",this.renderingRegion.appendChild(this.accessibilityControlArea),this.renderingRegion.setAttribute("tabIndex","0"),this.renderingRegion.setAttribute("alt",""),this.notifier=new He,this.viewport=new $((r,n)=>{this.notifier.dispatch(7,{kind:7,newTransform:n,oldTransform:r})}),this.display=new Ot(this,this.settings.renderingMode,this.renderingRegion),this.image=new _,this.history=new Wr(this,this.announceRedoCallback,this.announceUndoCallback),this.toolController=new Vt(this,this.localization),this.toolController.addInputMapper(Qo.fromEditor(this)),this.toolController.addInputMapper(new Jo),o.appendChild(this.container),this.viewport.updateScreenSize(w.of(this.display.width,this.display.height)),this.registerListeners(),this.queueRerender(),this.hideLoadingWarning(),this.notifier.on(7,r=>{if(r.kind!==7)return;let n=a=>a.transformVec3(w.unitX).length(),i=n(r.newTransform);if(i>this.settings.maxZoom||i<this.settings.minZoom){let a=n(r.oldTransform),l=k.identity;a<=this.settings.maxZoom&&a>=this.settings.minZoom?l=r.oldTransform:l=k.scaling2D((this.settings.minZoom+this.settings.maxZoom)/2),this.viewport.resetTransform(l)}else isFinite(i)||(console.warn(`Non-finite zoom (${i}) detected. Resetting the viewport. This was likely caused by division by zero.`),isFinite(n(r.oldTransform))?this.viewport.resetTransform(r.oldTransform):this.viewport.resetTransform())})}getCurrentSettings(){return{...this.settings}}getRootElement(){return this.container}getOutputBBoxInDOM(){return B.of(this.renderingRegion.getBoundingClientRect())}showLoadingWarning(o){let e=Math.round(o*100);this.loadingWarning.innerText=this.localization.loading(e),this.loadingWarning.style.display="block"}hideLoadingWarning(){this.loadingWarning.style.display="none",this.announceForAccessibility(this.localization.doneLoading)}announceForAccessibility(o){o===this.previousAccessibilityAnnouncement&&(o=o+". "),this.accessibilityAnnounceArea.innerText=o,this.previousAccessibilityAnnouncement=o}addToolbar(o=!0){let e=new mo(this,this.container,this.localization);return o&&e.addDefaults(),e}registerListeners(){this.handlePointerEventsFrom(this.renderingRegion),this.handleKeyEventsFrom(this.renderingRegion),this.handlePointerEventsFrom(this.accessibilityAnnounceArea);let o=[this.renderingRegion,this.accessibilityAnnounceArea,this.accessibilityControlArea,this.loadingWarning];for(let n of o)n.addEventListener("drag",i=>(i.preventDefault(),!1)),n.addEventListener("dragstart",i=>(i.preventDefault(),!1));this.container.addEventListener("wheel",n=>{this.handleHTMLWheelEvent(n)});let e=()=>{this.viewport.updateScreenSize(w.of(this.display.width,this.display.height)),this.rerender(),this.updateEditorSizeVariables()};if("ResizeObserver"in window){let n=new ResizeObserver(e);n.observe(this.renderingRegion),n.observe(this.container)}else addEventListener("resize",e);this.accessibilityControlArea.addEventListener("input",()=>{this.accessibilityControlArea.value=""});let r=new Ve(this);document.addEventListener("copy",async n=>{this.isEventSink(document.querySelector(":focus"))&&r.copy(n)}),document.addEventListener("paste",n=>{this.handlePaste(n)})}updateEditorSizeVariables(){this.container.style.setProperty("--editor-current-width-px",`${this.container.clientWidth}px`),this.container.style.setProperty("--editor-current-height-px",`${this.container.clientHeight}px`),this.container.style.setProperty("--editor-current-display-width-px",`${this.renderingRegion.clientWidth}px`),this.container.style.setProperty("--editor-current-display-height-px",`${this.renderingRegion.clientHeight}px`)}handleHTMLWheelEvent(o){let e=F.of(o.deltaX,o.deltaY,o.deltaZ);if(!o.ctrlKey&&!o.metaKey)if(this.settings.wheelEventsEnabled){if(this.settings.wheelEventsEnabled==="only-if-focused"&&!this.container.querySelector(":focus"))return}else return;o.deltaMode===WheelEvent.DOM_DELTA_LINE?e=e.times(15):o.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(e=e.times(100)),(o.ctrlKey||o.metaKey)&&(e=F.of(0,0,o.deltaY));let r=this.getOutputBBoxInDOM(),n=w.of(o.clientX,o.clientY).minus(r.topLeft);return this.toolController.dispatchInputEvent({kind:4,delta:e,screenPos:n})?(o.preventDefault(),!0):!1}getPointerList(){let o=performance.now(),e=[];for(let r in this.pointers)this.pointers[r]&&o-this.pointers[r].timeStamp<2e3&&e.push(this.pointers[r]);return e}setPointerCapture(o,e){try{o.setPointerCapture(e)}catch(r){console.warn("Failed to setPointerCapture",r)}}releasePointerCapture(o,e){try{o.releasePointerCapture(e)}catch(r){console.warn("Failed to releasePointerCapture",r)}}handleHTMLPointerEvent(o,e){let r=this.renderingRegion,n=e.target??this.renderingRegion;if(o==="pointerdown"){let i=Re.ofEvent(e,!0,this.viewport,r);this.pointers[i.id]=i,this.setPointerCapture(n,i.id);let a={kind:0,current:i,allPointers:this.getPointerList()};return this.toolController.dispatchInputEvent(a),!0}else if(o==="pointermove"){let i=Re.ofEvent(e,this.pointers[e.pointerId]?.down??!1,this.viewport,r);if(i.down){let a=this.pointers[i.id];if(a&&i.screenPos.distanceTo(a.screenPos)<2)return!1;this.pointers[i.id]=i,this.toolController.dispatchInputEvent({kind:1,current:i,allPointers:this.getPointerList()})&&e.preventDefault()}return!0}else if(o==="pointercancel"||o==="pointerup"){let i=Re.ofEvent(e,!1,this.viewport,r);return this.pointers[i.id]?(this.pointers[i.id]=i,this.releasePointerCapture(n,i.id),this.toolController.dispatchInputEvent({kind:2,current:i,allPointers:this.getPointerList()})&&e.preventDefault(),delete this.pointers[i.id],!0):!1}return o}isEventSink(o){let e=o;for(;e!==null;){for(let r of this.eventListenerTargets)if(r===e)return!0;e=e.parentElement}return!1}async handleDrop(o){o.preventDefault(),await this.handlePaste(o)}async handlePaste(o){let e=document.querySelector(":focus")??o.target;if(this.isEventSink(e))return await new Ve(this).paste(o)}handlePointerEventsFrom(o,e,r){let a={touchstart:c=>{r&&!r("touchstart",c)||c.preventDefault()},contextmenu:c=>{r&&!r("contextmenu",c)||c.preventDefault()}},l=["pointerdown","pointermove","pointerup","pointercancel"];for(let c of l)a[c]=d=>{let p=d;if(!(e&&!e(c,p)))return this.handleHTMLPointerEvent(c,p)};for(let c in a)o.addEventListener(c,a[c]);return{remove:()=>{for(let c in a)o.removeEventListener(c,a[c])}}}handlePointerEventsExceptClicksFrom(o,e,r){let n=Object.create(null);return this.handlePointerEventsFrom(o,(i,a)=>{if(e&&!e(i,a))return!1;let l=w.of(a.pageX??a.clientX,a.pageY??a.clientY),c=a.pointerId??0,d=!0;if(i==="pointerdown")n[c]={eventBuffer:[[i,a]],startPoint:l,hasMovedSignificantly:!1},this.setPointerCapture(o,a.pointerId),d=!1;else if(i==="pointermove"&&n[c]){let p=n[c].startPoint,u=n[c].eventBuffer;if(p&&l.distanceTo(p)<10&&!n[c].hasMovedSignificantly)u.push([i,a]),d=!1;else{for(let[g,v]of u)this.handleHTMLPointerEvent(g,v);n[c].eventBuffer=[],n[c].hasMovedSignificantly=!0,d=!0}}else i==="pointermove"?d=!0:(i==="pointerup"||i==="pointercancel")&&n[c]&&n[c].eventBuffer.length>0&&(this.releasePointerCapture(o,a.pointerId),d=!1,delete n[c]);return d},r)}handleHTMLKeyDownEvent(o){console.assert(o.type==="keydown",`handling a keydown event with type ${o.type}`);let e=Ro(o);return this.toolController.dispatchInputEvent(e)?(o.preventDefault(),!0):e.key==="t"||e.key==="T"?(o.preventDefault(),this.display.rerenderAsText(),!0):e.key==="Escape"?(this.renderingRegion.blur(),!0):!1}handleHTMLKeyUpEvent(o){console.assert(o.type==="keyup",`Handling a keyup event with type ${o.type}`);let e=ko(o);return this.toolController.dispatchInputEvent(e)?(o.preventDefault(),!0):!1}handleKeyEventsFrom(o,e=()=>!0){Hs(o,{filter:e,handleKeyDown:r=>{this.handleHTMLKeyDownEvent(r)},handleKeyUp:r=>{this.handleHTMLKeyUpEvent(r)},getHandlesKeyEventsFrom:r=>this.eventListenerTargets.includes(r)}),o.ondragover=r=>{r.preventDefault()},o.ondrop=r=>{this.handleDrop(r)},this.eventListenerTargets.push(o)}setReadOnly(o){o!==this.readOnly.get()&&(this.readOnly.set(o),this.notifier.dispatch(10,{kind:10,editorIsReadOnly:o}))}isReadOnlyReactiveValue(){return this.readOnly}isReadOnly(){return this.readOnly}dispatch(o,e=!0){let r=this.dispatchNoAnnounce(o,e),n=o.description(this,this.localization);return this.announceForAccessibility(n),r}dispatchNoAnnounce(o,e=!1){let r=o.apply(this);return e&&this.history.push(o,!1),r}async asyncApplyOrUnapplyCommands(o,e,r){console.assert(r>0),this.display.setDraftMode(!0);for(let n=0;n<o.length;n+=r){this.showLoadingWarning(n/o.length);for(let i=n;i<o.length&&i<n+r;i++){let a=o[i];e?a.apply(this):a.unapply(this)}n+r<o.length&&await new Promise(i=>{this.rerender(),requestAnimationFrame(i)})}this.display.setDraftMode(!1),this.hideLoadingWarning()}asyncApplyCommands(o,e){return this.asyncApplyOrUnapplyCommands(o,!0,e)}asyncUnapplyCommands(o,e,r=!1){return r&&(o=[...o],o.reverse()),this.asyncApplyOrUnapplyCommands(o,!1,e)}queueRerender(){return this.rerenderQueued||(this.rerenderQueued=!0,requestAnimationFrame(()=>{this.rerenderQueued&&(this.rerender(),this.rerenderQueued=!1)})),new Promise(o=>{this.nextRerenderListeners.push(()=>o())})}isRerenderQueued(){return this.rerenderQueued}rerender(o=!0){if(this.display.startRerender(),this.display.width===0||this.display.height===0)return;let e=this.display.getDryInkRenderer();if(this.image.renderWithCache(e,this.display.getCache(),this.viewport),o&&!this.image.getAutoresizeEnabled()){let r={fill:L.fromHex("#44444455")},n=5*this.viewport.getSizeOfPixelOnCanvas();e.drawRect(this.getImportExportRect(),n,r)}this.rerenderQueued=!1,this.nextRerenderListeners.forEach(r=>r()),this.nextRerenderListeners=[]}drawWetInk(...o){for(let e of o)this.display.getWetInkRenderer().drawPath(e)}clearWetInk(){this.display.getWetInkRenderer().clear()}focus(){this.renderingRegion.focus()}createHTMLOverlay(o){return o.classList.add("overlay","js-draw-editor-overlay"),this.container.appendChild(o),{remove:()=>o.remove()}}anchorElementToCanvas(o,e){e instanceof k&&(e=vr.fromImmutable(e));let r=document.createElement("div");r.classList.add("anchored-element-overlay");let n=document.createElement("div");n.classList.add("content-wrapper"),o.classList.add("content");let i=()=>{let p=e.get().transformVec3(w.unitX).angle()+this.viewport.getRotationAngle(),u=this.viewport.canvasToScreenTransform.rightMul(e.get());r.style.setProperty("--full-transform",u.toCSSMatrix());let h=u.transformVec2(w.zero);r.style.setProperty("--position-x",`${h.x}px`),r.style.setProperty("--position-y",`${h.y}px`),r.style.setProperty("--rotation",`${p*180/Math.PI}deg`),r.style.setProperty("--scale",`${u.getScaleFactor()}`)};i();let a=e.onUpdate(i),l=this.notifier.on(7,i);return n.appendChild(o),r.appendChild(n),r.classList.add("overlay","js-draw-editor-overlay"),this.renderingRegion.insertAdjacentElement("afterend",r),{remove:()=>{r.remove(),a.remove(),l.remove()}}}addStyleSheet(o){let e=document.createElement("style");return e.innerText=o,this.container.appendChild(e),e}sendKeyboardEvent(o,e,r=!1,n=!1,i=void 0){i??=e.toUpperCase()===e&&e.toLowerCase()!==e,this.toolController.dispatchInputEvent({kind:o,key:e,code:Ds(e),ctrlKey:r,altKey:n,shiftKey:i})}sendPenEvent(o,e,r){Xr(this,o,e,r)}async addAndCenterComponents(o,e=!0,r){let n=null;for(let h of o)n?n=n.union(h.getBBox()):n=h.getBBox();if(!n)return;let i=this.viewport.visibleRect,a=i.width/n.width,l=i.height/n.height,c=a;(n.width*c>i.width||n.height*c>i.height)&&(c=l),c*=2/3,c=$.roundScaleRatio(c);let d=k.translation(i.center.minus(n.center)).rightMul(k.scaling2D(c,n.center)),p=[];for(let h of o)p.push(_.addElement(h)),p.push(h.transformBy(d));if(await this.dispatch(se(p,{applyChunkSize:100,description:r}),!0),e)for(let h of this.toolController.getMatchingTools(ve))h.setEnabled(!0),h.setSelection(o)}toDataURL(o="image/png",e){let{element:r,renderer:n}=Ie.fromViewport(this.image.getImportExportViewport(),{canvasSize:e});return this.image.renderAll(n),r.toDataURL(o)}toSVG(o){return Os(this.image,o??{})}async toSVGAsync(o={}){let e=o.pauseAfterCount??100;return await Fs(this.image,async(r,n,i)=>o.onProgress&&await o.onProgress(n,i)===!1?!1:(n%e===0&&await Ye(),!0),{minDimension:o.minDimension})}async loadFrom(o){this.showLoadingWarning(0),this.display.setDraftMode(!0);let e=this.image.getBackgroundComponents(),r=new J(e);await o.start(async n=>{await this.dispatchNoAnnounce(_.addElement(n))},(n,i)=>n%500===0?(this.showLoadingWarning(n/i),this.rerender(),Ye()):null,(n,i)=>{this.dispatchNoAnnounce(this.setImportExportRect(n),!1),this.dispatchNoAnnounce(this.viewport.zoomTo(n),!1),i&&this.dispatchNoAnnounce(this.image.setAutoresizeEnabled(i.autoresize),!1)}),this.image.getBackgroundComponents().length!==e.length&&await this.dispatchNoAnnounce(r),this.hideLoadingWarning(),this.display.setDraftMode(!1),this.queueRerender()}getTopmostBackgroundComponent(){let o=null;for(let e of this.image.getBackgroundComponents())e instanceof ae&&(o=e);return o}setBackgroundStyle(o){let e=this.getTopmostBackgroundComponent(),r=[];e&&r.push(new J([e]));let n=e?.getBackgroundType?.()??2,i=e?.getStyle?.().color??L.transparent,a=this.image.getAutoresizeEnabled(),l=o.color&&n===2?0:n,c=o.type??l,d=o.color??i,p=o.autoresize??a;if(c!==2){let u=new ae(c,d);r.push(_.addElement(u))}return p!==a&&(r.push(this.image.setAutoresizeEnabled(p)),!p&&this.image.getImportExportRect().maxDimension===0&&r.push(this.image.setImportExportRect(this.image.getImportExportRect().resizedTo(w.of(500,500))))),se(r)}setBackgroundColor(o){let e=this.getTopmostBackgroundComponent();if(e)return e.updateStyle({color:o});{let r=o.eq(L.transparent)?2:0;return e=new ae(r,o),this.image.addElement(e)}}estimateBackgroundColor(){let o=[];for(let e of this.image.getBackgroundComponents())e instanceof ae&&o.push(e.getStyle().color??L.transparent);return L.average(o)}getImportExportRect(){return this.image.getImportExportViewport().visibleRect}setImportExportRect(o){return this.image.setImportExportRect(o)}async loadFromSVG(o,e=!1){let r=et.fromString(o,e);await this.loadFrom(r)}showAboutDialog(){let o=this.icons.licenseInfo(),e=[];if(this.settings.appInfo){let n=[];this.settings.appInfo.version&&n.push(`v${this.settings.appInfo.version}`,""),this.settings.appInfo.description?n.push(this.settings.appInfo.description+`
463
- `):n.push(`js-draw v${fo.number}`),e.push({heading:`${this.settings.appInfo.name}`,text:n.join(`
464
- `)})}else e.push({heading:"js-draw",text:`v${fo.number}`});let r=this.viewport.getScreenRectSize();e.push({heading:this.localization.developerInformation,text:["Image debug information (from when this dialog was opened):",` ${this.viewport.getScaleFactor()}x zoom, ${180/Math.PI*this.viewport.getRotationAngle()}\xB0 rotation`,` ${this.image.estimateNumElements()} components`,` auto-resize: ${this.image.getAutoresizeEnabled()?"enabled":"disabled"}`,` image size: ${this.getImportExportRect().w}x${this.getImportExportRect().h}`,` screen size: ${r.x}x${r.y}`,` device pixel ratio: ${this.display.getDevicePixelRatio()}`," cache:",` ${this.display.getCache().getDebugInfo().replace(/([\n])/g,`
467
+ SOFTWARE.`),mn=Rl;var nr=class extends Re{constructor(){super();this.canShowContextMenu=!1;this.stationaryDetector=null;this.clickTolerance=12}canMakeLongPressMenuEvent(e){let r=[2];return e.allPointers.length===1&&r.includes(e.current.device)}onEvent(e){let r=()=>oo(e)&&this.canShowContextMenu&&this.emit({kind:9,screenPos:e.current.screenPos,canvasPos:e.current.canvasPos})?(this.emit({kind:3}),!0):!1;if(e.kind===0)e.allPointers.length===1?(this.canShowContextMenu=!0,this.contextMenuTriggerPointer=e.current,this.contextMenuStartPoint=e.current.screenPos,this.canMakeLongPressMenuEvent(e)&&(this.stationaryDetector=new kt(e.current,Vr,r))):this.canShowContextMenu=!1;else if(e.kind===1){if(this.canShowContextMenu){this.stationaryDetector?.onPointerMove(e.current);let n=e.current.screenPos.minus(this.contextMenuStartPoint),i=this.clickTolerance;n.length()>i&&(this.canShowContextMenu=!1)}}else if(e.kind===2&&(this.stationaryDetector?.destroy(),this.contextMenuTriggerPointer?.id===e.current.id&&this.contextMenuTriggerPointer.device===4&&r()))return!0;return this.emit(e)}};var Bi=class{constructor(o,e={}){this.eventListenerTargets=[];this.previousAccessibilityAnnouncement="";this.pointers={};this.announceUndoCallback=o=>{this.announceForAccessibility(this.localization.undoAnnouncement(o.description(this,this.localization)))};this.announceRedoCallback=o=>{this.announceForAccessibility(this.localization.redoAnnouncement(o.description(this,this.localization)))};this.nextRerenderListeners=[];this.rerenderQueued=!1;this.closeAboutDialog=null;if(this.localization={...Sr(),...e.localization},this.settings={wheelEventsEnabled:e.wheelEventsEnabled??!0,renderingMode:e.renderingMode??1,localization:this.localization,minZoom:e.minZoom??2e-10,maxZoom:e.maxZoom??1e12,keyboardShortcutOverrides:e.keyboardShortcutOverrides??{},iconProvider:e.iconProvider??new $t,notices:e.notices??[],appInfo:e.appInfo?{...e.appInfo}:null,pens:{additionalPenTypes:e.pens?.additionalPenTypes??[],filterPenTypes:e.pens?.filterPenTypes??(()=>!0)},text:{fonts:e.text?.fonts??["sans-serif","serif","monospace"]},image:{showImagePicker:e.image?.showImagePicker??void 0},clipboardApi:e.clipboardApi??null},this.settings.minZoom>this.settings.maxZoom)throw new Error("Minimum zoom must be lesser than maximum zoom!");this.readOnly=te.fromInitialValue(!1),this.icons=this.settings.iconProvider,this.shortcuts=new H(this.settings.keyboardShortcutOverrides),this.container=document.createElement("div"),this.renderingRegion=document.createElement("div"),this.container.appendChild(this.renderingRegion),this.container.classList.add("imageEditorContainer","js-draw"),this.loadingWarning=document.createElement("div"),this.loadingWarning.classList.add("loadingMessage"),this.loadingWarning.ariaLive="polite",this.container.appendChild(this.loadingWarning),this.accessibilityControlArea=document.createElement("textarea"),this.accessibilityControlArea.setAttribute("placeholder",this.localization.accessibilityInputInstructions),this.accessibilityControlArea.style.opacity="0",this.accessibilityControlArea.style.width="0",this.accessibilityControlArea.style.height="0",this.accessibilityControlArea.style.position="absolute",this.accessibilityAnnounceArea=document.createElement("div"),this.accessibilityAnnounceArea.setAttribute("aria-live","assertive"),this.accessibilityAnnounceArea.className="accessibilityAnnouncement",this.container.appendChild(this.accessibilityAnnounceArea),this.renderingRegion.style.touchAction="none",this.renderingRegion.className="imageEditorRenderArea",this.renderingRegion.appendChild(this.accessibilityControlArea),this.renderingRegion.setAttribute("tabIndex","0"),this.renderingRegion.setAttribute("alt",""),this.notifier=new Fe,this.viewport=new U((r,n)=>{this.notifier.dispatch(7,{kind:7,newTransform:n,oldTransform:r})}),this.display=new Nt(this,this.settings.renderingMode,this.renderingRegion),this.image=new q,this.history=new qr(this,this.announceRedoCallback,this.announceUndoCallback),this.toolController=new Ht(this,this.localization),this.toolController.addInputMapper(rr.fromEditor(this)),this.toolController.addInputMapper(new nr),o.appendChild(this.container),this.viewport.updateScreenSize(w.of(this.display.width,this.display.height)),this.registerListeners(),this.queueRerender(),this.hideLoadingWarning(),this.notifier.on(7,r=>{if(r.kind!==7)return;let n=a=>a.transformVec3(w.unitX).length(),i=n(r.newTransform);if(i>this.settings.maxZoom||i<this.settings.minZoom){let a=n(r.oldTransform),l=k.identity;a<=this.settings.maxZoom&&a>=this.settings.minZoom?l=r.oldTransform:l=k.scaling2D((this.settings.minZoom+this.settings.maxZoom)/2),this.viewport.resetTransform(l)}else isFinite(i)||(console.warn(`Non-finite zoom (${i}) detected. Resetting the viewport. This was likely caused by division by zero.`),isFinite(n(r.oldTransform))?this.viewport.resetTransform(r.oldTransform):this.viewport.resetTransform())})}getCurrentSettings(){return{...this.settings}}getRootElement(){return this.container}getOutputBBoxInDOM(){return I.of(this.renderingRegion.getBoundingClientRect())}showLoadingWarning(o){let e=Math.round(o*100);this.loadingWarning.innerText=this.localization.loading(e),this.loadingWarning.style.display="block"}hideLoadingWarning(){this.loadingWarning.style.display="none",this.announceForAccessibility(this.localization.doneLoading)}announceForAccessibility(o){o===this.previousAccessibilityAnnouncement&&(o=o+". "),this.accessibilityAnnounceArea.innerText=o,this.previousAccessibilityAnnouncement=o}addToolbar(o=!0){let e=new go(this,this.container,this.localization);return o&&e.addDefaults(),e}registerListeners(){this.handlePointerEventsFrom(this.renderingRegion),this.handleKeyEventsFrom(this.renderingRegion),this.handlePointerEventsFrom(this.accessibilityAnnounceArea);let o=[this.renderingRegion,this.accessibilityAnnounceArea,this.accessibilityControlArea,this.loadingWarning];for(let n of o)n.addEventListener("drag",i=>(i.preventDefault(),!1)),n.addEventListener("dragstart",i=>(i.preventDefault(),!1));this.container.addEventListener("wheel",n=>{this.handleHTMLWheelEvent(n)});let e=()=>{this.viewport.updateScreenSize(w.of(this.display.width,this.display.height)),this.rerender(),this.updateEditorSizeVariables()};if("ResizeObserver"in window){let n=new ResizeObserver(e);n.observe(this.renderingRegion),n.observe(this.container)}else addEventListener("resize",e);this.accessibilityControlArea.addEventListener("input",()=>{this.accessibilityControlArea.value=""});let r=new Ae(this);document.addEventListener("copy",async n=>{this.isEventSink(document.querySelector(":focus"))&&r.copy(n)}),document.addEventListener("paste",n=>{this.handlePaste(n)})}updateEditorSizeVariables(){this.container.style.setProperty("--editor-current-width-px",`${this.container.clientWidth}px`),this.container.style.setProperty("--editor-current-height-px",`${this.container.clientHeight}px`),this.container.style.setProperty("--editor-current-display-width-px",`${this.renderingRegion.clientWidth}px`),this.container.style.setProperty("--editor-current-display-height-px",`${this.renderingRegion.clientHeight}px`)}handleHTMLWheelEvent(o){let e=F.of(o.deltaX,o.deltaY,o.deltaZ);if(!o.ctrlKey&&!o.metaKey)if(this.settings.wheelEventsEnabled){if(this.settings.wheelEventsEnabled==="only-if-focused"&&!this.container.querySelector(":focus"))return}else return;o.deltaMode===WheelEvent.DOM_DELTA_LINE?e=e.times(15):o.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(e=e.times(100)),(o.ctrlKey||o.metaKey)&&(e=F.of(0,0,o.deltaY));let r=this.getOutputBBoxInDOM(),n=w.of(o.clientX,o.clientY).minus(r.topLeft);return this.toolController.dispatchInputEvent({kind:4,delta:e,screenPos:n})?(o.preventDefault(),!0):!1}getPointerList(){let o=performance.now(),e=[];for(let r in this.pointers)this.pointers[r]&&o-this.pointers[r].timeStamp<2e3&&e.push(this.pointers[r]);return e}setPointerCapture(o,e){try{o.setPointerCapture(e)}catch(r){console.warn("Failed to setPointerCapture",r)}}releasePointerCapture(o,e){try{o.releasePointerCapture(e)}catch(r){console.warn("Failed to releasePointerCapture",r)}}handleHTMLPointerEvent(o,e){let r=this.renderingRegion,n=e.target??this.renderingRegion;if(o==="pointerdown"){let i=ke.ofEvent(e,!0,this.viewport,r);this.pointers[i.id]=i,this.setPointerCapture(n,i.id);let a={kind:0,current:i,allPointers:this.getPointerList()};return this.toolController.dispatchInputEvent(a),!0}else if(o==="pointermove"){let i=ke.ofEvent(e,this.pointers[e.pointerId]?.down??!1,this.viewport,r);if(i.down){let a=this.pointers[i.id];if(a&&i.screenPos.distanceTo(a.screenPos)<2)return!1;this.pointers[i.id]=i,this.toolController.dispatchInputEvent({kind:1,current:i,allPointers:this.getPointerList()})&&e.preventDefault()}return!0}else if(o==="pointercancel"||o==="pointerup"){let i=ke.ofEvent(e,!1,this.viewport,r);return this.pointers[i.id]?(this.pointers[i.id]=i,this.releasePointerCapture(n,i.id),this.toolController.dispatchInputEvent({kind:2,current:i,allPointers:this.getPointerList()})&&e.preventDefault(),delete this.pointers[i.id],!0):!1}return o}isEventSink(o){let e=o;for(;e!==null;){for(let r of this.eventListenerTargets)if(r===e)return!0;e=e.parentElement}return!1}async handleDrop(o){o.preventDefault(),await this.handlePaste(o)}async handlePaste(o){let e=document.querySelector(":focus")??o.target;if(this.isEventSink(e))return await new Ae(this).paste(o)}handlePointerEventsFrom(o,e,r){let a={touchstart:c=>{r&&!r("touchstart",c)||c.preventDefault()},contextmenu:c=>{r&&!r("contextmenu",c)||c.preventDefault()}},l=["pointerdown","pointermove","pointerup","pointercancel"];for(let c of l)a[c]=d=>{let u=d;if(!(e&&!e(c,u)))return this.handleHTMLPointerEvent(c,u)};for(let c in a)o.addEventListener(c,a[c]);return{remove:()=>{for(let c in a)o.removeEventListener(c,a[c])}}}handlePointerEventsExceptClicksFrom(o,e,r){let n=Object.create(null);return this.handlePointerEventsFrom(o,(i,a)=>{if(e&&!e(i,a))return!1;let l=w.of(a.pageX??a.clientX,a.pageY??a.clientY),c=a.pointerId??0,d=!0;if(i==="pointerdown")n[c]={eventBuffer:[[i,a]],startPoint:l,hasMovedSignificantly:!1},this.setPointerCapture(o,a.pointerId),d=!1;else if(i==="pointermove"&&n[c]){let u=n[c].startPoint,p=n[c].eventBuffer;if(u&&l.distanceTo(u)<10&&!n[c].hasMovedSignificantly)p.push([i,a]),d=!1;else{for(let[g,v]of p)this.handleHTMLPointerEvent(g,v);n[c].eventBuffer=[],n[c].hasMovedSignificantly=!0,d=!0}}else i==="pointermove"?d=!0:(i==="pointerup"||i==="pointercancel")&&n[c]&&n[c].eventBuffer.length>0&&(this.releasePointerCapture(o,a.pointerId),d=!1,delete n[c]);return d},r)}handleHTMLKeyDownEvent(o){console.assert(o.type==="keydown",`handling a keydown event with type ${o.type}`);let e=Lo(o);return this.toolController.dispatchInputEvent(e)?(o.preventDefault(),!0):e.key==="t"||e.key==="T"?(o.preventDefault(),this.display.rerenderAsText(),!0):e.key==="Escape"?(this.renderingRegion.blur(),!0):!1}handleHTMLKeyUpEvent(o){console.assert(o.type==="keyup",`Handling a keyup event with type ${o.type}`);let e=zo(o);return this.toolController.dispatchInputEvent(e)?(o.preventDefault(),!0):!1}handleKeyEventsFrom(o,e=()=>!0){Gs(o,{filter:e,handleKeyDown:r=>{this.handleHTMLKeyDownEvent(r)},handleKeyUp:r=>{this.handleHTMLKeyUpEvent(r)},getHandlesKeyEventsFrom:r=>this.eventListenerTargets.includes(r)}),o.ondragover=r=>{r.preventDefault()},o.ondrop=r=>{this.handleDrop(r)},this.eventListenerTargets.push(o)}setReadOnly(o){o!==this.readOnly.get()&&(this.readOnly.set(o),this.notifier.dispatch(10,{kind:10,editorIsReadOnly:o}))}isReadOnlyReactiveValue(){return this.readOnly}isReadOnly(){return this.readOnly}dispatch(o,e=!0){let r=this.dispatchNoAnnounce(o,e),n=o.description(this,this.localization);return this.announceForAccessibility(n),r}dispatchNoAnnounce(o,e=!1){let r=o.apply(this);return e&&this.history.push(o,!1),r}async asyncApplyOrUnapplyCommands(o,e,r){console.assert(r>0),this.display.setDraftMode(!0);for(let n=0;n<o.length;n+=r){this.showLoadingWarning(n/o.length);for(let i=n;i<o.length&&i<n+r;i++){let a=o[i];e?a.apply(this):a.unapply(this)}n+r<o.length&&await new Promise(i=>{this.rerender(),requestAnimationFrame(i)})}this.display.setDraftMode(!1),this.hideLoadingWarning()}asyncApplyCommands(o,e){return this.asyncApplyOrUnapplyCommands(o,!0,e)}asyncUnapplyCommands(o,e,r=!1){return r&&(o=[...o],o.reverse()),this.asyncApplyOrUnapplyCommands(o,!1,e)}queueRerender(){return this.rerenderQueued||(this.rerenderQueued=!0,requestAnimationFrame(()=>{this.rerenderQueued&&(this.rerender(),this.rerenderQueued=!1)})),new Promise(o=>{this.nextRerenderListeners.push(()=>o())})}isRerenderQueued(){return this.rerenderQueued}rerender(o=!0){if(this.display.startRerender(),this.display.width===0||this.display.height===0)return;let e=this.display.getDryInkRenderer();if(this.image.renderWithCache(e,this.display.getCache(),this.viewport),o&&!this.image.getAutoresizeEnabled()){let r={fill:L.fromHex("#44444455")},n=5*this.viewport.getSizeOfPixelOnCanvas();e.drawRect(this.getImportExportRect(),n,r)}this.rerenderQueued=!1,this.nextRerenderListeners.forEach(r=>r()),this.nextRerenderListeners=[]}drawWetInk(...o){for(let e of o)this.display.getWetInkRenderer().drawPath(e)}clearWetInk(){this.display.getWetInkRenderer().clear()}focus(){this.renderingRegion.focus()}createHTMLOverlay(o){return o.classList.add("overlay","js-draw-editor-overlay"),this.container.appendChild(o),{remove:()=>o.remove()}}anchorElementToCanvas(o,e){e instanceof k&&(e=Tr.fromImmutable(e));let r=document.createElement("div");r.classList.add("anchored-element-overlay");let n=document.createElement("div");n.classList.add("content-wrapper"),o.classList.add("content");let i=()=>{let u=e.get().transformVec3(w.unitX).angle()+this.viewport.getRotationAngle(),p=this.viewport.canvasToScreenTransform.rightMul(e.get());r.style.setProperty("--full-transform",p.toCSSMatrix());let h=p.transformVec2(w.zero);r.style.setProperty("--position-x",`${h.x}px`),r.style.setProperty("--position-y",`${h.y}px`),r.style.setProperty("--rotation",`${u*180/Math.PI}deg`),r.style.setProperty("--scale",`${p.getScaleFactor()}`)};i();let a=e.onUpdate(i),l=this.notifier.on(7,i);return n.appendChild(o),r.appendChild(n),r.classList.add("overlay","js-draw-editor-overlay"),this.renderingRegion.insertAdjacentElement("afterend",r),{remove:()=>{r.remove(),a.remove(),l.remove()}}}addStyleSheet(o){let e=document.createElement("style");return e.innerText=o,this.container.appendChild(e),e}sendKeyboardEvent(o,e,r=!1,n=!1,i=void 0){i??=e.toUpperCase()===e&&e.toLowerCase()!==e,this.toolController.dispatchInputEvent({kind:o,key:e,code:Hs(e),ctrlKey:r,altKey:n,shiftKey:i})}sendPenEvent(o,e,r){on(this,o,e,r)}async addAndCenterComponents(o,e=!0,r){let n=null;for(let h of o)n?n=n.union(h.getBBox()):n=h.getBBox();if(!n)return;let i=this.viewport.visibleRect,a=i.width/n.width,l=i.height/n.height,c=a;(n.width*c>i.width||n.height*c>i.height)&&(c=l),c*=2/3,c=U.roundScaleRatio(c);let d=k.translation(i.center.minus(n.center)).rightMul(k.scaling2D(c,n.center)),u=[];for(let h of o)u.push(q.addElement(h)),u.push(h.transformBy(d));if(await this.dispatch(le(u,{applyChunkSize:100,description:r}),!0),e)for(let h of this.toolController.getMatchingTools(ve))h.setEnabled(!0),h.setSelection(o)}toDataURL(o="image/png",e){let{element:r,renderer:n}=Le.fromViewport(this.image.getImportExportViewport(),{canvasSize:e});return this.image.renderAll(n),r.toDataURL(o)}toSVG(o){return Ws(this.image,o??{})}async toSVGAsync(o={}){let e=o.pauseAfterCount??100;return await Ks(this.image,async(r,n,i)=>o.onProgress&&await o.onProgress(n,i)===!1?!1:(n%e===0&&await Ye(),!0),{minDimension:o.minDimension})}async loadFrom(o){this.showLoadingWarning(0),this.display.setDraftMode(!0);let e=this.image.getBackgroundComponents(),r=new J(e);await o.start(async n=>{await this.dispatchNoAnnounce(q.addElement(n))},(n,i)=>n%500===0?(this.showLoadingWarning(n/i),this.rerender(),Ye()):null,(n,i)=>{this.dispatchNoAnnounce(this.setImportExportRect(n),!1),this.dispatchNoAnnounce(this.viewport.zoomTo(n),!1),i&&this.dispatchNoAnnounce(this.image.setAutoresizeEnabled(i.autoresize),!1)}),this.image.getBackgroundComponents().length!==e.length&&await this.dispatchNoAnnounce(r),this.hideLoadingWarning(),this.display.setDraftMode(!1),this.queueRerender()}getTopmostBackgroundComponent(){let o=null;for(let e of this.image.getBackgroundComponents())e instanceof ce&&(o=e);return o}setBackgroundStyle(o){let e=this.getTopmostBackgroundComponent(),r=[];e&&r.push(new J([e]));let n=e?.getBackgroundType?.()??2,i=e?.getStyle?.().color??L.transparent,a=this.image.getAutoresizeEnabled(),l=o.color&&n===2?0:n,c=o.type??l,d=o.color??i,u=o.autoresize??a;if(c!==2){let p=new ce(c,d);r.push(q.addElement(p))}return u!==a&&(r.push(this.image.setAutoresizeEnabled(u)),!u&&this.image.getImportExportRect().maxDimension===0&&r.push(this.image.setImportExportRect(this.image.getImportExportRect().resizedTo(w.of(500,500))))),le(r)}setBackgroundColor(o){let e=this.getTopmostBackgroundComponent();if(e)return e.updateStyle({color:o});{let r=o.eq(L.transparent)?2:0;return e=new ce(r,o),this.image.addElement(e)}}estimateBackgroundColor(){let o=[];for(let e of this.image.getBackgroundComponents())e instanceof ce&&o.push(e.getStyle().color??L.transparent);return L.average(o)}getImportExportRect(){return this.image.getImportExportViewport().visibleRect}setImportExportRect(o){return this.image.setImportExportRect(o)}async loadFromSVG(o,e=!1){let r=et.fromString(o,e);await this.loadFrom(r)}showAboutDialog(){let o=this.icons.licenseInfo(),e=[];if(this.settings.appInfo){let n=[];this.settings.appInfo.version&&n.push(`v${this.settings.appInfo.version}`,""),this.settings.appInfo.description?n.push(this.settings.appInfo.description+`
468
+ `):n.push(`js-draw v${bo.number}`),e.push({heading:`${this.settings.appInfo.name}`,text:n.join(`
469
+ `)})}else e.push({heading:"js-draw",text:`v${bo.number}`});let r=this.viewport.getScreenRectSize();e.push({heading:this.localization.developerInformation,text:["Image debug information (from when this dialog was opened):",` ${this.viewport.getScaleFactor()}x zoom, ${180/Math.PI*this.viewport.getRotationAngle()}\xB0 rotation`,` ${this.image.estimateNumElements()} components`,` auto-resize: ${this.image.getAutoresizeEnabled()?"enabled":"disabled"}`,` image size: ${this.getImportExportRect().w}x${this.getImportExportRect().h}`,` screen size: ${r.x}x${r.y}`,` device pixel ratio: ${this.display.getDevicePixelRatio()}`," cache:",` ${this.display.getCache().getDebugInfo().replace(/([\n])/g,`
465
470
  `)}`].join(`
466
- `),minimized:!0}),e.push({heading:this.localization.softwareLibraries,text:[`This image editor is powered by js-draw v${fo.number}.`,"","At runtime, js-draw uses"," - The Coloris color picker: https://github.com/mdbassit/Coloris"," - The bezier.js B\xE9zier curve library: https://github.com/Pomax/bezierjs","","Both are licensed under the MIT license:","","","== Coloris ==",dn("2021 Mohammed Bassit"),"","","== Bezier.js ==",dn('2023 Mike "Pomax" Kamermans'),"","","== js-draw ==",dn("2023-2025 Henry Heino"),""].join(`
467
- `),minimized:!0}),o&&e.push({heading:"Icon Pack",text:o,minimized:!0}),e.push(...this.settings.notices),this.closeAboutDialog?.(),this.closeAboutDialog=Ms(this,e).close}remove(){this.container.remove(),this.toolController.onEditorDestroyed()}},pn=ki;var Ns=s=>s instanceof U?new class extends U{constructor(){super(...arguments);this._command=s}serializeToJSON(){return s.serialize()}apply(e){s.unapply(e)}unapply(e){s.apply(e)}onDrop(e){s.onDrop(e)}description(e,r){return r.inverseOf(s.description(e,r))}}("inverse"):new class extends Be{apply(e){s.unapply(e)}unapply(e){s.apply(e)}onDrop(e){s.onDrop(e)}description(e,r){return r.inverseOf(s.description(e,r))}};U.register("inverse",(s,o)=>Ns(U.deserialize(s,o)));var $s=Ns;var er=class extends ue{constructor(e,r){super(e,"overflow-widget",r);this.overflowChildren=[];this.container.classList.add("toolbar-overflow-widget"),this.container.classList.add("dropdownShowable"),this.overflowContainer??=document.createElement("div")}shouldAutoDisableInReadOnlyEditor(){return!1}getTitle(){return this.localizationTable.toggleOverflow}createIcon(){return this.editor.icons.makeOverflowIcon()}handleClick(){this.setDropdownVisible(!this.isDropdownVisible())}fillDropdown(e){return this.overflowContainer??=document.createElement("div"),this.overflowContainer.parentElement&&this.overflowContainer.remove(),this.overflowContainer.classList.add("toolbar-overflow-widget-overflow-list"),e.appendChild(this.overflowContainer),!0}clearChildren(){this.overflowContainer.replaceChildren(),this.container.classList.remove("horizontal");let e=this.overflowChildren;return this.overflowChildren=[],e}getChildWidgets(){return[...this.overflowChildren]}hasAsChild(e){for(let r of this.overflowChildren)if(e===r)return!0;return!1}addToOverflow(e){this.overflowChildren.push(e),e.addTo(this.overflowContainer),e.setIsToplevel(!1),this.overflowChildren.length>2&&this.container.classList.add("horizontal")}canBeInOverflowMenu(){return!1}};var Us=s=>new un(s,s.getRootElement()),un=class extends it{constructor(e,r,n=eo){super(e,n);this.widgetOrderCounter=0;this.overflowWidget=null;this.reLayoutQueued=!1;this.container=document.createElement("div"),this.container.classList.add(`${M}root`),this.container.classList.add(`${M}element`),this.container.classList.add(`${M}dropdown-toolbar`),this.container.setAttribute("role","toolbar"),r.appendChild(this.container),"ResizeObserver"in window?(this.resizeObserver=new ResizeObserver(i=>{this.reLayout()}),this.resizeObserver.observe(this.container)):console.warn("ResizeObserver not supported. Toolbar will not resize.")}queueReLayout(){this.reLayoutQueued||(this.reLayoutQueued=!0,requestAnimationFrame(()=>this.reLayout()))}reLayout(){if(this.reLayoutQueued=!1,!this.overflowWidget)return;let e=d=>{let p=0;for(let u of d)u.isHidden()||(p+=u.getButtonWidth());return p},r=d=>{let p=this.overflowWidget?.getChildWidgets()??[];return p.length===0?!1:p[0].getButtonWidth()<=d},n=this.getAllWidgets(),i=e(this.overflowWidget.getChildWidgets()),a=e(n)-i,l=this.container.clientWidth*.87;window.innerHeight>l*1.75&&(l*=1.75);let c=!1;if(r(l-a)){let d=this.overflowWidget.clearChildren();for(let p of d)p.addTo(this.container),p.setIsToplevel(!0),p.isHidden()||(a+=p.getButtonWidth());i=0,c=!0}if(a>=l){for(let d=n.length-1;d>=0&&a>=l;d--){let p=n[d];this.overflowWidget.hasAsChild(p)||p.canBeInOverflowMenu()&&(a-=p.getButtonWidth(),this.overflowWidget.addToOverflow(p))}c=!0}this.overflowWidget.setHidden(this.overflowWidget.getChildWidgets().length===0),c&&this.setupColorPickers()}addWidgetInternal(e){let r=e.addTo(this.container);r.style.order=`${this.widgetOrderCounter++}`,this.queueReLayout()}removeWidgetInternal(e){e.remove(),this.queueReLayout()}addSpacer(e={}){let r=document.createElement("div");r.classList.add(`${M}spacer`),e.grow&&(r.style.flexGrow=`${e.grow}`),e.minSize&&(r.style.minWidth=e.minSize),e.maxSize&&(r.style.maxWidth=e.maxSize),r.style.order=`${this.widgetOrderCounter++}`,this.container.appendChild(r)}addOverflowWidget(){this.overflowWidget=new er(this.editor,this.localizationTable),this.addWidget(this.overflowWidget)}addDefaults(){this.addDefaultToolWidgets(),this.addOverflowWidget(),this.addDefaultActionButtons()}onRemove(){this.container.remove(),this.resizeObserver.disconnect()}};var Cl=(s,o,e,r)=>{let n=s.viewport.screenToCanvas(e),i=Yr(r??[]),a=Re.ofCanvasPoint(n,o!==2,s.viewport,i,2);return s.toolController.dispatchInputEvent({kind:o,allPointers:[...r??[],a],current:a}),a},Ws=Cl;var Tl=(s,o)=>{let e=s.getRootElement(),r=[["--background-color-1","--foreground-color-1",!0,!0],["--background-color-2","--foreground-color-2",!0,!0],["--background-color-3","--foreground-color-3",!0,!0],["--background-color-2","--primary-action-foreground-color",!1,!0],["--selection-background-color","--selection-foreground-color",!1,!0]];if(!o?.dontClearOverrides)for(let[l,c]of r)e.style.setProperty(l,null),e.style.setProperty(c,null);let n=getComputedStyle(e),i=Object.create(null),a=(l,c,d,p,u)=>{let h=i[l]?i[l]:L.fromString(n.getPropertyValue(l)),m=i[c]?i[c]:L.fromString(n.getPropertyValue(c));if(h.relativeLuminance()<m.relativeLuminance()){let y=h;h=m,m=y;let f=c;c=l,l=f;let T=p;p=u,u=T}let g=!1,v=L.contrastRatio(h,m),b=0;for(;v<d&&b<8;){let y=F.of(.1,.1,.1);p&&(m.eq(L.white)&&!u&&(m=L.black),h=L.fromRGBVector(h.rgb.plus(y))),u&&(m.eq(L.black)&&!p&&(m=L.white),m=L.fromRGBVector(m.rgb.minus(y))),v=L.contrastRatio(h,m),g=!0,b++}g&&(e.style.setProperty(l,h.toHexString()),e.style.setProperty(c,m.toHexString()),i[l]=h,i[c]=m)};a("--selection-background-color","--background-color-2",1.29,!0,!1);for(let[l,c,d,p]of r)a(l,c,4.5,d,p)},Ks=Tl;var Sl=pn;return aa(Pl);})();
471
+ `),minimized:!0}),e.push({heading:this.localization.softwareLibraries,text:[`This image editor is powered by js-draw v${bo.number}.`,"","At runtime, js-draw uses"," - The Coloris color picker: https://github.com/mdbassit/Coloris"," - The bezier.js B\xE9zier curve library: https://github.com/Pomax/bezierjs","","Both are licensed under the MIT license:","","","== Coloris ==",mn("2021 Mohammed Bassit"),"","","== Bezier.js ==",mn('2023 Mike "Pomax" Kamermans'),"","","== js-draw ==",mn("2023-2025 Henry Heino"),""].join(`
472
+ `),minimized:!0}),o&&e.push({heading:"Icon Pack",text:o,minimized:!0}),e.push(...this.settings.notices),this.closeAboutDialog?.(),this.closeAboutDialog=Ns(this,e).close}remove(){this.container.remove(),this.toolController.onEditorDestroyed()}},fn=Bi;var js=s=>s instanceof W?new class extends W{constructor(){super(...arguments);this._command=s}serializeToJSON(){return s.serialize()}apply(e){s.unapply(e)}unapply(e){s.apply(e)}onDrop(e){s.onDrop(e)}description(e,r){return r.inverseOf(s.description(e,r))}}("inverse"):new class extends Ie{apply(e){s.unapply(e)}unapply(e){s.apply(e)}onDrop(e){s.onDrop(e)}description(e,r){return r.inverseOf(s.description(e,r))}};W.register("inverse",(s,o)=>js(W.deserialize(s,o)));var _s=js;var ir=class extends ae{constructor(e,r){super(e,"overflow-widget",r);this.overflowChildren=[];this.container.classList.add("toolbar-overflow-widget"),this.container.classList.add("dropdownShowable"),this.overflowContainer??=document.createElement("div")}shouldAutoDisableInReadOnlyEditor(){return!1}getTitle(){return this.localizationTable.toggleOverflow}createIcon(){return this.editor.icons.makeOverflowIcon()}handleClick(){this.setDropdownVisible(!this.isDropdownVisible())}fillDropdown(e){return this.overflowContainer??=document.createElement("div"),this.overflowContainer.parentElement&&this.overflowContainer.remove(),this.overflowContainer.classList.add("toolbar-overflow-widget-overflow-list"),e.appendChild(this.overflowContainer),!0}clearChildren(){this.overflowContainer.replaceChildren(),this.container.classList.remove("horizontal");let e=this.overflowChildren;return this.overflowChildren=[],e}getChildWidgets(){return[...this.overflowChildren]}hasAsChild(e){for(let r of this.overflowChildren)if(e===r)return!0;return!1}addToOverflow(e){this.overflowChildren.push(e),e.addTo(this.overflowContainer),e.setIsToplevel(!1),this.overflowChildren.length>2&&this.container.classList.add("horizontal")}canBeInOverflowMenu(){return!1}};var qs=s=>new gn(s,s.getRootElement()),gn=class extends it{constructor(e,r,n=ro){super(e,n);this.widgetOrderCounter=0;this.overflowWidget=null;this.reLayoutQueued=!1;this.container=document.createElement("div"),this.container.classList.add(`${D}root`),this.container.classList.add(`${D}element`),this.container.classList.add(`${D}dropdown-toolbar`),this.container.setAttribute("role","toolbar"),r.appendChild(this.container),"ResizeObserver"in window?(this.resizeObserver=new ResizeObserver(i=>{this.reLayout()}),this.resizeObserver.observe(this.container)):console.warn("ResizeObserver not supported. Toolbar will not resize.")}queueReLayout(){this.reLayoutQueued||(this.reLayoutQueued=!0,requestAnimationFrame(()=>this.reLayout()))}reLayout(){if(this.reLayoutQueued=!1,!this.overflowWidget)return;let e=d=>{let u=0;for(let p of d)p.isHidden()||(u+=p.getButtonWidth());return u},r=d=>{let u=this.overflowWidget?.getChildWidgets()??[];return u.length===0?!1:u[0].getButtonWidth()<=d},n=this.getAllWidgets(),i=e(this.overflowWidget.getChildWidgets()),a=e(n)-i,l=this.container.clientWidth*.87;window.innerHeight>l*1.75&&(l*=1.75);let c=!1;if(r(l-a)){let d=this.overflowWidget.clearChildren();for(let u of d)u.addTo(this.container),u.setIsToplevel(!0),u.isHidden()||(a+=u.getButtonWidth());i=0,c=!0}if(a>=l){for(let d=n.length-1;d>=0&&a>=l;d--){let u=n[d];this.overflowWidget.hasAsChild(u)||u.canBeInOverflowMenu()&&(a-=u.getButtonWidth(),this.overflowWidget.addToOverflow(u))}c=!0}this.overflowWidget.setHidden(this.overflowWidget.getChildWidgets().length===0),c&&this.setupColorPickers()}addWidgetInternal(e){let r=e.addTo(this.container);r.style.order=`${this.widgetOrderCounter++}`,this.queueReLayout()}removeWidgetInternal(e){e.remove(),this.queueReLayout()}addSpacer(e={}){let r=document.createElement("div");r.classList.add(`${D}spacer`),e.grow&&(r.style.flexGrow=`${e.grow}`),e.minSize&&(r.style.minWidth=e.minSize),e.maxSize&&(r.style.maxWidth=e.maxSize),r.style.order=`${this.widgetOrderCounter++}`,this.container.appendChild(r)}addOverflowWidget(){this.overflowWidget=new ir(this.editor,this.localizationTable),this.addWidget(this.overflowWidget)}addDefaults(){this.addDefaultToolWidgets(),this.addOverflowWidget(),this.addDefaultActionButtons()}onRemove(){this.container.remove(),this.resizeObserver.disconnect()}};var zl=(s,o,e,r)=>{let n=s.viewport.screenToCanvas(e),i=tn(r??[]),a=ke.ofCanvasPoint(n,o!==2,s.viewport,i,2);return s.toolController.dispatchInputEvent({kind:o,allPointers:[...r??[],a],current:a}),a},Zs=zl;var Ll=(s,o)=>{let e=s.getRootElement(),r=[["--background-color-1","--foreground-color-1",!0,!0],["--background-color-2","--foreground-color-2",!0,!0],["--background-color-3","--foreground-color-3",!0,!0],["--background-color-2","--primary-action-foreground-color",!1,!0],["--selection-background-color","--selection-foreground-color",!1,!0]];if(!o?.dontClearOverrides)for(let[l,c]of r)e.style.setProperty(l,null),e.style.setProperty(c,null);let n=getComputedStyle(e),i=Object.create(null),a=(l,c,d,u,p)=>{let h=i[l]?i[l]:L.fromString(n.getPropertyValue(l)),m=i[c]?i[c]:L.fromString(n.getPropertyValue(c));if(h.relativeLuminance()<m.relativeLuminance()){let y=h;h=m,m=y;let f=c;c=l,l=f;let T=u;u=p,p=T}let g=!1,v=L.contrastRatio(h,m),b=0;for(;v<d&&b<8;){let y=F.of(.1,.1,.1);u&&(m.eq(L.white)&&!p&&(m=L.black),h=L.fromRGBVector(h.rgb.plus(y))),p&&(m.eq(L.black)&&!u&&(m=L.white),m=L.fromRGBVector(m.rgb.minus(y))),v=L.contrastRatio(h,m),g=!0,b++}g&&(e.style.setProperty(l,h.toHexString()),e.style.setProperty(c,m.toHexString()),i[l]=h,i[c]=m)};a("--selection-background-color","--background-color-2",1.29,!0,!1);for(let[l,c,d,u]of r)a(l,c,4.5,d,u)},Ys=Ll;var Il=fn;return ha(Bl);})();
468
473
  /*! Bundled license information:
469
474
 
470
475
  @melloware/coloris/dist/esm/coloris.js: