polotno 4.2.1 → 4.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,9 @@
1
1
  import * as React from "react";
2
2
  import type { StoreType } from "../ui-types.js";
3
- declare let uploadFunc: (file: File) => Promise<string>;
4
- export declare function setUploadFunc(func: typeof uploadFunc): void;
3
+ export { setUploadFunc } from "../utils/file.js";
5
4
  export declare const UploadPanel: ({ store }: {
6
5
  store: StoreType;
7
6
  }) => React.JSX.Element;
8
7
  export type UploadPanelProps = {
9
8
  store: StoreType;
10
9
  };
11
- export {};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import*as i from"react";import{PolotnoIcon as o}from"../icons/registry.js";import{getVideoPreview as r}from"../utils/video.js";import{localFileToURL as s}from"../utils/file.js";import{ImagesGrid as n}from"./images-grid.js";import{t as l}from"../utils/l10n.js";import{selectImage as a}from"./select-image.js";import{selectVideo as d}from"./select-video.js";import{selectSvg as c}from"./select-svg.js";import{selectGif as p}from"./select-gif.js";import{Button as m}from"../primitives/button.js";let f=async e=>s(e);export function setUploadFunc(e){f=e}let u=[];function g(e){const{type:t}=e;return t.indexOf("svg")>=0?"svg":t.indexOf("gif")>=0?"gif":t.indexOf("image")>=0?"image":t.indexOf("video")>=0?"video":t.indexOf("audio")>=0?"audio":"image"}function v(){const e=new Blob(['\n <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">\n <circle cx="50" cy="50" r="45" fill="#f0f0f0" stroke="#ccc" stroke-width="2"/>\n <path d="M40,35 L40,65 L55,50 L70,50 M70,35 Q80,50 70,65" fill="none" stroke="#666" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n '],{type:"image/svg+xml"});return URL.createObjectURL(e)}export const UploadPanel=({store:s})=>{const[h,x]=i.useState(u),[y,j]=i.useState(!1),w=i.useRef(null);return i.useEffect(()=>{u=h},[h]),t("div",{className:"pn:flex pn:h-full pn:flex-col",children:[e("div",{style:{height:"45px",paddingTop:"5px"},children:l("sidePanel.uploadTip")}),e("div",{style:{marginBottom:"20px"},children:t("label",{htmlFor:"input-file",children:[t(m,{variant:"outline",style:{width:"100%"},onClick:()=>{var e;null===(e=w.current)||void 0===e||e.click()},children:[e(o,{name:"action.add"}),l("sidePanel.uploadImage")]}),e("input",{type:"file",ref:w,style:{display:"none"},onChange:async e=>{var t;const{target:i}=e;j(!0);try{for(const e of Array.from(null!==(t=i.files)&&void 0!==t?t:[])){const t=await f(e),i=g(e);let o=t;"video"===i?o=await r(t):"audio"===i&&(o=v()),x(e=>e.concat([{url:t,type:i,preview:o}]))}}catch(e){console.error(e)}j(!1),i.value=""},multiple:!0})]})}),e(n,{images:h,isLoading:y,getPreview:e=>e.preview,hideNoResults:!0,onSelect:async(e,t,i)=>{const o=e.url,r=e.type;"image"===r?a({src:o,store:s,droppedPos:t,targetElement:i}):"video"===r?d({src:o,store:s,droppedPos:t,targetElement:i}):"gif"===r?p({src:o,store:s,droppedPos:t,targetElement:i}):"svg"===r?c({src:o,store:s,droppedPos:t,targetElement:i}):"audio"===r&&s.addAudio({src:o})}})]})};
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import*as i from"react";import{PolotnoIcon as r}from"../icons/registry.js";import{getVideoPreview as o}from"../utils/video.js";import{getType as l,getUploadFunc as s}from"../utils/file.js";import{insertMediaIntoPage as n}from"../utils/insert-file.js";import{ImagesGrid as a}from"./images-grid.js";import{t as c}from"../utils/l10n.js";import{Button as p}from"../primitives/button.js";export{setUploadFunc}from"../utils/file.js";let d=[];function m(){const e=new Blob(['\n <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">\n <circle cx="50" cy="50" r="45" fill="#f0f0f0" stroke="#ccc" stroke-width="2"/>\n <path d="M40,35 L40,65 L55,50 L70,50 M70,35 Q80,50 70,65" fill="none" stroke="#666" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>\n </svg>\n '],{type:"image/svg+xml"});return URL.createObjectURL(e)}export const UploadPanel=({store:u})=>{const[f,g]=i.useState(d),[h,v]=i.useState(!1),y=i.useRef(null);return i.useEffect(()=>{d=f},[f]),t("div",{className:"pn:flex pn:h-full pn:flex-col",children:[e("div",{style:{height:"45px",paddingTop:"5px"},children:c("sidePanel.uploadTip")}),e("div",{style:{marginBottom:"20px"},children:t("label",{htmlFor:"input-file",children:[t(p,{variant:"outline",style:{width:"100%"},onClick:()=>{var e;null===(e=y.current)||void 0===e||e.click()},children:[e(r,{name:"action.add"}),c("sidePanel.uploadImage")]}),e("input",{type:"file",ref:y,style:{display:"none"},onChange:async e=>{var t;const{target:i}=e;v(!0);try{for(const e of Array.from(null!==(t=i.files)&&void 0!==t?t:[])){const t=await s()(e),i=l(e);let r=t;"video"===i?r=await o(t):"audio"===i&&(r=m()),g(e=>e.concat([{url:t,type:i,preview:r}]))}}catch(e){console.error(e)}v(!1),i.value=""},multiple:!0})]})}),e(a,{images:f,isLoading:h,getPreview:e=>e.preview,hideNoResults:!0,onSelect:async(e,t,i)=>{n({url:e.url,type:e.type,store:u,droppedPos:t,targetElement:i})}})]})};
@@ -1,4 +1,4 @@
1
- import{jsx as t,jsxs as e}from"react/jsx-runtime";import o from"react";import{observer as n}from"mobx-react-lite";import{PolotnoIcon as i}from"../icons/registry.js";import{Button as l}from"../primitives/button.js";import{Tooltip as r,TooltipContent as s,TooltipTrigger as a}from"../primitives/tooltip.js";import{TooltipIconButton as c}from"../primitives/tooltip-icon-button.js";import{ColorPicker as m}from"./color-picker.js";import p from"./filters-picker.js";import{ElementContainer as u,extendToolbar as d}from"./element-container.js";import f from"../utils/styled.js";import{AnimationsPicker as x}from"./animations-picker.js";import{flags as g}from"../utils/flags.js";import{TextAiWrite as v}from"./text-ai-write.js";import{t as h}from"../utils/l10n.js";import{quillRef as b,createQuill as T,setQuillContent as y}from"../canvas/html-element.js";import{FontMenu as F,fetcher as S,TextSpacing as z,TextFontSize as j,TextTransform as C,ALIGN_OPTIONS as w,VERTICAL_ALIGN_OPTIONS as A,VERTICAL_ALIGN_ICONS as D}from"./text-toolbar.js";import{cycleNext as N}from"./toolbar-shared.js";import E from"swr";import{getFontsList as k,globalFonts as I,isGoogleFontChanged as L}from"../utils/fonts.js";import{getGoogleFontsListAPI as M}from"../utils/api.js";import{normalizeRichTextHtml as B,listEffectiveFontFamilies as R,isBoldWeight as W}from"../utils/rich-text-html.js";import{patchTextFormat as _}from"../utils/text-format.js";import{useTextFormat as O,getActiveTextEditor as P,resolveSelectionScope as V,applyToLiveEditor as G}from"../utils/text-format-state.js";const H=f("div")`
1
+ import{jsx as t,jsxs as e}from"react/jsx-runtime";import o from"react";import{observer as n}from"mobx-react-lite";import{PolotnoIcon as i}from"../icons/registry.js";import{Button as l}from"../primitives/button.js";import{Tooltip as r,TooltipContent as s,TooltipTrigger as a}from"../primitives/tooltip.js";import{TooltipIconButton as c}from"../primitives/tooltip-icon-button.js";import{ColorPicker as m}from"./color-picker.js";import p from"./filters-picker.js";import{ElementContainer as u,extendToolbar as d}from"./element-container.js";import f from"../utils/styled.js";import{AnimationsPicker as x}from"./animations-picker.js";import{flags as g}from"../utils/flags.js";import{TextAiWrite as v}from"./text-ai-write.js";import{t as h}from"../utils/l10n.js";import{quillRef as b,createQuill as T,setQuillContent as y}from"../canvas/html-element.js";import{FontMenu as F,fetcher as S,TextSpacing as z,TextFontSize as j,TextTransform as C,ALIGN_OPTIONS as A,VERTICAL_ALIGN_OPTIONS as D,VERTICAL_ALIGN_ICONS as N}from"./text-toolbar.js";import{cycleNext as w}from"./toolbar-shared.js";import E from"swr";import{getFontsList as k,globalFonts as L,isGoogleFontChanged as I}from"../utils/fonts.js";import{getGoogleFontsListAPI as M}from"../utils/api.js";import{normalizeRichTextHtml as B,listEffectiveFontFamilies as R,isBoldWeight as W}from"../utils/rich-text-html.js";import{patchTextFormat as O}from"../utils/text-format.js";import{useTextFormat as P,getActiveTextEditor as V,resolveSelectionScope as _,applyToLiveEditor as G}from"../utils/text-format-state.js";const H=f("div")`
2
2
  position: relative;
3
3
  display: inline-block;
4
4
 
@@ -8,7 +8,7 @@ import{jsx as t,jsxs as e}from"react/jsx-runtime";import o from"react";import{ob
8
8
  &.polotno-mixed:focus-within input {
9
9
  color: inherit !important;
10
10
  }
11
- `,Q=f("span")`
11
+ `,J=f("span")`
12
12
  position: absolute;
13
13
  left: 11px;
14
14
  top: 0;
@@ -22,4 +22,4 @@ import{jsx as t,jsxs as e}from"react/jsx-runtime";import o from"react";import{ob
22
22
  ${H}:focus-within & {
23
23
  display: none;
24
24
  }
25
- `,J=t=>{const e=P();return!!e&&e.store===t&&!!e.instance};let U=null;const X=()=>{b.pendingToolbarInteraction=!0,U&&clearTimeout(U),U=setTimeout(()=>{b.pendingToolbarInteraction=!1,U=null},100)},$=t=>{var e;(!(e=t.target)||"INPUT"!==e.tagName&&"TEXTAREA"!==e.tagName&&"SELECT"!==e.tagName&&!e.isContentEditable)&&t.preventDefault(),X()},q=n(({store:e,isActive:o,toggle:n,icon:i,ariaLabel:l,tooltipContent:r})=>{const{format:s,applyTextFormat:a}=O(e);return t(c,{label:r||l||"",side:"bottom",active:o(s),onMouseDown:t=>{t.preventDefault()},onClick:()=>n(s,a),children:i})});function K(t,e){const o=t.textDecoration.value||"",n="underline"===e?"line-through":"underline";return[!o.split(/\s+/).includes(e)&&e,o.split(/\s+/).includes(n)&&n].filter(Boolean).join(" ")}export const TextBold=n(({store:e})=>t(q,{store:e,isActive:t=>W(t.fontWeight.value),toggle:(t,e)=>e({fontWeight:W(t.fontWeight.value)?400:700}),icon:t(i,{name:"text.bold",className:"pn:size-4"}),tooltipContent:h("toolbar.bold")}));export const FontStyleGroup=n(({element:o,store:n,elements:m,components:p})=>{const u=(null==p?void 0:p.TextBold)||TextBold;return e("div",{className:"pn:flex pn:items-center pn:gap-0.5",children:[t(u,{element:o,store:n}),t(q,{store:n,isActive:t=>"italic"===t.fontStyle.value,toggle:(t,e)=>e({fontStyle:"italic"===t.fontStyle.value?"normal":"italic"}),icon:t(i,{name:"text.italic",className:"pn:size-4"}),tooltipContent:h("toolbar.italic")}),t(q,{store:n,isActive:t=>{var e;return!!(null===(e=t.textDecoration.value)||void 0===e?void 0:e.split(/\s+/).includes("underline"))},toggle:(t,e)=>e({textDecoration:K(t,"underline")}),icon:t(i,{name:"text.underline",className:"pn:size-4"}),tooltipContent:h("toolbar.underline")}),t(q,{store:n,isActive:t=>{var e;return!!(null===(e=t.textDecoration.value)||void 0===e?void 0:e.split(/\s+/).includes("line-through"))},toggle:(t,e)=>e({textDecoration:K(t,"line-through")}),icon:t(i,{name:"text.strikethrough",className:"pn:size-4"}),tooltipContent:h("toolbar.strikethrough")}),t(c,{label:h("toolbar.textAlign"),side:"bottom",onClick:()=>{const t=N(w,o.align);n.history.transaction(()=>{m.forEach(e=>{e.set({align:t})})})},children:"left"===o.align?t(i,{name:"text.alignLeft",className:"pn:size-4"}):"center"===o.align?t(i,{name:"text.alignCenter",className:"pn:size-4"}):"right"===o.align?t(i,{name:"text.alignRight",className:"pn:size-4"}):t(i,{name:"text.alignJustify",className:"pn:size-4"})}),g.textVerticalResizeEnabled&&e(r,{children:[t(a,{render:t(l,{variant:"ghost",size:"icon-sm",onClick:()=>{const t=N(A,o.verticalAlign);n.history.transaction(()=>{o.set({verticalAlign:t})})},"aria-label":h("toolbar.verticalAlign"),children:D[o.verticalAlign]})}),t(s,{side:"bottom",children:h("toolbar.verticalAlign")})]}),t(c,{label:h("toolbar.listFormat"),side:"bottom",onMouseDown:t=>{t.preventDefault()},onClick:()=>{let t=window.__polotnoQuill;const e=!t;t=t||(({html:t})=>{const e=document.createElement("div");document.body.appendChild(e),e.style.display="none",e.style.whiteSpace="pre-wrap";const o=T(e);return y(o,t),o})({html:o.text}),e&&t.setSelection(0,t.getLength(),"api");const n=t.getFormat();n.list?"bullet"===n.list?t.format("list","ordered"):t.format("list",!1):t.format("list","bullet"),e&&(o.set({text:B(t.root.innerHTML,{fontSize:o.fontSize,fontFamily:o.fontFamily})}),(t=>{t.root.parentElement.remove()})(t))},children:(()=>{const e=window.__polotnoQuill;return"bullet"===(e?e.getFormat(e.getSelection()):{}).list?t(i,{name:"text.numberedList",className:"pn:size-5"}):t(i,{name:"text.bulletList",className:"pn:size-5"})})()})]})});export const FontColorInput=n(({element:e,store:o})=>{var n;const{format:i,applyTextFormat:l}=O(o);return t("div",{"data-polotno-keep-focus":!0,onMouseDown:$,children:t(m,{value:null!==(n=i.fill.value)&&void 0!==n?n:e.fill,gradientEnabled:!0,onClose:()=>{const t=P();(null==t?void 0:t.instance)&&t.lastSelection&&t.instance.setSelection(t.lastSelection)},onChange:t=>l({fill:t}),store:o})})});export const DirectionInput=n(({element:e})=>{const o="rtl"===e.dir,n=h("toolbar.textDirection");return t(c,{label:n,side:"bottom",onClick:()=>{e.set({dir:o?"ltr":"rtl"})},children:t(i,o?{name:"text.paragraph",className:"pn:size-5 pn:-scale-x-100"}:{name:"text.richText",className:"pn:size-5"})})});const Y=k(),Z={TextFontFamily:n(({elements:e,store:n})=>{var i;const{format:l,applyTextFormat:r}=O(n),s=J(n),a=l.fontFamily.mixed,c=a?Array.from(new Set(e.flatMap(t=>R(t.text,t.fontFamily)))).sort((t,e)=>t.localeCompare(e,void 0,{sensitivity:"base"})):void 0,[m,p]=o.useState(!1),{data:u,mutate:d}=E(m?M():null,S,{isPaused:()=>L(),fallbackData:[]});o.useEffect(()=>{d()},[L()]);const f=n.fonts.concat(I).map(t=>t.fontFamily).concat((null==u?void 0:u.length)&&!L()?u:Y),x=[];n.find(t=>("text"===t.type&&x.push(t.fontFamily),!1));const g=[...new Set(x.concat("_divider").concat(f))],v=null!==(i=l.fontFamily.value)&&void 0!==i?i:e[0].fontFamily;let h=v;h.length>15&&(h=h.slice(0,15)+"...");const b=t(F,{fonts:g,activeFont:v,activeFontLabel:h,store:n,mixed:a,mixedFonts:c,open:m,onOpenChange:p,onFontSelect:t=>r({fontFamily:t})});return s?t("div",{"data-polotno-keep-focus":!0,onMouseDown:$,children:b}):b}),TextFontSize:n(({elements:o,store:n})=>{const{format:i}=O(n),l=J(n),r=i.fontSize.mixed,s=i.fontSize.value,a=o.map(t=>new Proxy(t,{get:(t,e)=>"fontSize"===e?null!=s?s:t.fontSize:"set"===e?e=>((t,e)=>{if(!e.fontSize){return void t.set(e)}const o=P();if(o&&o.store===n&&o.instance){const{scope:t,isEmpty:n}=V(o.instance,o.lastSelection);if("partial"===t||"collapsed"===t&&n){return void G(o.instance,{fontSize:e.fontSize},o.lastSelection)}}const{attrsToSet:i}=_(t,{fontSize:e.fontSize});t.set(Object.assign(Object.assign({},e),i))})(t,e):Reflect.get(t,e)})),c=e(H,{className:r?"polotno-mixed":"",children:[t(j,{elements:a,store:n}),r&&t(Q,{"aria-hidden":!0,children:"—"})]});return l?t("div",{"data-polotno-keep-focus":!0,onMouseDown:X,children:c}):c}),TextFontVariant:FontStyleGroup,TextTransform:C,TextFilters:p,TextFill:FontColorInput,TextSpacing:z,TextDirection:DirectionInput,TextAnimations:x,TextAiWrite:v};export const HtmlToolbar=n(({store:e,components:o})=>{const n=e.selectedElements,i=e.selectedElements[0],l=["TextFill","TextFontFamily","TextFontSize","TextFontVariant","TextSpacing","TextTransform","TextFilters",g.animationsEnabled&&"TextAnimations",g.aiTextEnabled&&"TextAiWrite"],r=d({type:"text",usedItems:l,components:o});return t(u,{items:r,itemRender:l=>{if("TextBold"===l){return null}const r=(null==o?void 0:o[l])||Z[l];return t(r,{element:i,elements:n,store:e,components:o},l)}})});
25
+ `,Q=t=>{const e=V();return!!e&&e.store===t&&!!e.instance};let U=null;const X=()=>{b.pendingToolbarInteraction=!0,U&&clearTimeout(U),U=setTimeout(()=>{b.pendingToolbarInteraction=!1,U=null},100)},$=t=>{var e;(!(e=t.target)||"INPUT"!==e.tagName&&"TEXTAREA"!==e.tagName&&"SELECT"!==e.tagName&&!e.isContentEditable)&&t.preventDefault(),X()},q=n(({store:e,isActive:o,toggle:n,icon:i,ariaLabel:l,tooltipContent:r})=>{const{format:s,applyTextFormat:a}=P(e);return t(c,{label:r||l||"",side:"bottom",active:o(s),onMouseDown:t=>{t.preventDefault()},onClick:()=>n(s,a),children:i})});function K(t,e){const o=t.textDecoration.value||"",n="underline"===e?"line-through":"underline";return[!o.split(/\s+/).includes(e)&&e,o.split(/\s+/).includes(n)&&n].filter(Boolean).join(" ")}export const TextBold=n(({store:e})=>t(q,{store:e,isActive:t=>W(t.fontWeight.value),toggle:(t,e)=>e({fontWeight:W(t.fontWeight.value)?400:700}),icon:t(i,{name:"text.bold",className:"pn:size-4"}),tooltipContent:h("toolbar.bold")}));export const FontStyleGroup=n(({element:o,store:n,elements:m,components:p})=>{const u=(null==p?void 0:p.TextBold)||TextBold;return e("div",{className:"pn:flex pn:items-center pn:gap-0.5",children:[t(u,{element:o,store:n}),t(q,{store:n,isActive:t=>"italic"===t.fontStyle.value,toggle:(t,e)=>e({fontStyle:"italic"===t.fontStyle.value?"normal":"italic"}),icon:t(i,{name:"text.italic",className:"pn:size-4"}),tooltipContent:h("toolbar.italic")}),t(q,{store:n,isActive:t=>{var e;return!!(null===(e=t.textDecoration.value)||void 0===e?void 0:e.split(/\s+/).includes("underline"))},toggle:(t,e)=>e({textDecoration:K(t,"underline")}),icon:t(i,{name:"text.underline",className:"pn:size-4"}),tooltipContent:h("toolbar.underline")}),t(q,{store:n,isActive:t=>{var e;return!!(null===(e=t.textDecoration.value)||void 0===e?void 0:e.split(/\s+/).includes("line-through"))},toggle:(t,e)=>e({textDecoration:K(t,"line-through")}),icon:t(i,{name:"text.strikethrough",className:"pn:size-4"}),tooltipContent:h("toolbar.strikethrough")}),t(c,{label:h("toolbar.textAlign"),side:"bottom",onClick:()=>{const t=w(A,o.align);n.history.transaction(()=>{m.forEach(e=>{e.set({align:t})})})},children:"left"===o.align?t(i,{name:"text.alignLeft",className:"pn:size-4"}):"center"===o.align?t(i,{name:"text.alignCenter",className:"pn:size-4"}):"right"===o.align?t(i,{name:"text.alignRight",className:"pn:size-4"}):t(i,{name:"text.alignJustify",className:"pn:size-4"})}),g.textVerticalResizeEnabled&&e(r,{children:[t(a,{render:t(l,{variant:"ghost",size:"icon-sm",onClick:()=>{const t=w(D,o.verticalAlign);n.history.transaction(()=>{o.set({verticalAlign:t})})},"aria-label":h("toolbar.verticalAlign"),children:N[o.verticalAlign]})}),t(s,{side:"bottom",children:h("toolbar.verticalAlign")})]}),t(c,{label:h("toolbar.listFormat"),side:"bottom",onMouseDown:t=>{t.preventDefault()},onClick:()=>{var t;let e=window.__polotnoQuill;const n=!e;e=e||(({html:t})=>{const e=document.createElement("div");document.body.appendChild(e),e.style.display="none",e.style.whiteSpace="pre-wrap";const o=T(e);return y(o,t),o})({html:o.text}),n&&e.setSelection(0,e.getLength(),"api");const i=e.getSelection(!0)||(null===(t=V())||void 0===t?void 0:t.lastSelection)||{index:0,length:e.getLength()},l=e.getFormat(i);l.list?"bullet"===l.list?e.format("list","ordered"):e.format("list",!1):e.format("list","bullet"),n&&(o.set({text:B(e.root.innerHTML,{fontSize:o.fontSize,fontFamily:o.fontFamily})}),(t=>{t.root.parentElement.remove()})(e))},children:(()=>{const e=V();return"bullet"===(e&&e.store===n?e.currentFormat:{}).list?t(i,{name:"text.numberedList",className:"pn:size-5"}):t(i,{name:"text.bulletList",className:"pn:size-5"})})()})]})});export const FontColorInput=n(({element:e,store:o})=>{var n;const{format:i,applyTextFormat:l}=P(o);return t("div",{"data-polotno-keep-focus":!0,onMouseDown:$,children:t(m,{value:null!==(n=i.fill.value)&&void 0!==n?n:e.fill,gradientEnabled:!0,onClose:()=>{const t=V();(null==t?void 0:t.instance)&&t.lastSelection&&t.instance.setSelection(t.lastSelection)},onChange:t=>l({fill:t}),store:o})})});export const DirectionInput=n(({element:e})=>{const o="rtl"===e.dir,n=h("toolbar.textDirection");return t(c,{label:n,side:"bottom",onClick:()=>{e.set({dir:o?"ltr":"rtl"})},children:t(i,o?{name:"text.paragraph",className:"pn:size-5 pn:-scale-x-100"}:{name:"text.richText",className:"pn:size-5"})})});const Y=k(),Z={TextFontFamily:n(({elements:e,store:n})=>{var i;const{format:l,applyTextFormat:r}=P(n),s=Q(n),a=l.fontFamily.mixed,c=a?Array.from(new Set(e.flatMap(t=>R(t.text,t.fontFamily)))).sort((t,e)=>t.localeCompare(e,void 0,{sensitivity:"base"})):void 0,[m,p]=o.useState(!1),{data:u,mutate:d}=E(m?M():null,S,{isPaused:()=>I(),fallbackData:[]});o.useEffect(()=>{d()},[I()]);const f=n.fonts.concat(L).map(t=>t.fontFamily).concat((null==u?void 0:u.length)&&!I()?u:Y),x=[];n.find(t=>("text"===t.type&&x.push(t.fontFamily),!1));const g=[...new Set(x.concat("_divider").concat(f))],v=null!==(i=l.fontFamily.value)&&void 0!==i?i:e[0].fontFamily;let h=v;h.length>15&&(h=h.slice(0,15)+"...");const b=t(F,{fonts:g,activeFont:v,activeFontLabel:h,store:n,mixed:a,mixedFonts:c,open:m,onOpenChange:p,onFontSelect:t=>r({fontFamily:t})});return s?t("div",{"data-polotno-keep-focus":!0,onMouseDown:$,children:b}):b}),TextFontSize:n(({elements:o,store:n})=>{const{format:i}=P(n),l=Q(n),r=i.fontSize.mixed,s=i.fontSize.value,a=o.map(t=>new Proxy(t,{get:(t,e)=>"fontSize"===e?null!=s?s:t.fontSize:"set"===e?e=>((t,e)=>{if(!e.fontSize){return void t.set(e)}const o=V();if(o&&o.store===n&&o.instance){const{scope:t,isEmpty:n}=_(o.instance,o.lastSelection);if("partial"===t||"collapsed"===t&&n){return void G(o.instance,{fontSize:e.fontSize},o.lastSelection)}}const{attrsToSet:i}=O(t,{fontSize:e.fontSize});t.set(Object.assign(Object.assign({},e),i))})(t,e):Reflect.get(t,e)})),c=e(H,{className:r?"polotno-mixed":"",children:[t(j,{elements:a,store:n}),r&&t(J,{"aria-hidden":!0,children:"—"})]});return l?t("div",{"data-polotno-keep-focus":!0,onMouseDown:X,children:c}):c}),TextFontVariant:FontStyleGroup,TextTransform:C,TextFilters:p,TextFill:FontColorInput,TextSpacing:z,TextDirection:DirectionInput,TextAnimations:x,TextAiWrite:v};export const HtmlToolbar=n(({store:e,components:o})=>{const n=e.selectedElements,i=e.selectedElements[0],l=["TextFill","TextFontFamily","TextFontSize","TextFontVariant","TextSpacing","TextTransform","TextFilters",g.animationsEnabled&&"TextAnimations",g.aiTextEnabled&&"TextAiWrite"],r=d({type:"text",usedItems:l,components:o});return t(u,{items:r,itemRender:l=>{if("TextBold"===l){return null}const r=(null==o?void 0:o[l])||Z[l];return t(r,{element:i,elements:n,store:e,components:o},l)}})});
@@ -0,0 +1,2 @@
1
+ export declare const decodeBase64: (value: string) => Uint8Array;
2
+ export declare const encodeBase64: (bytes: Uint8Array) => string;
@@ -0,0 +1 @@
1
+ const e=()=>"undefined"!=typeof globalThis?globalThis.Buffer:void 0;export const decodeBase64=o=>{if("function"==typeof atob){const e=atob(o),t=new Uint8Array(e.length);for(let o=0;o<e.length;o++){t[o]=e.charCodeAt(o)}return t}const t=e();if(t){return new Uint8Array(t.from(o,"base64"))}throw new Error("No base64 decoder available")};export const encodeBase64=o=>{if("function"==typeof btoa){let e="";for(let t=0;t<o.length;t++){e+=String.fromCharCode(o[t])}return btoa(e)}const t=e();if(t){return t.from(o).toString("base64")}throw new Error("No base64 encoder available")};
@@ -4,3 +4,362 @@ export declare const cut: (store: StoreType) => void;
4
4
  export declare const paste: (store: StoreType) => void;
5
5
  export declare const isClipboardEmpty: () => boolean;
6
6
  export declare const resetClipboard: () => void;
7
+ export declare const copyToEvent: (store: StoreType, e: ClipboardEvent) => boolean;
8
+ export declare const cutToEvent: (store: StoreType, e: ClipboardEvent) => boolean;
9
+ export declare const insertTextElement: (store: StoreType, text: string, extra?: Record<string, any>) => (import("mobx-state-tree").ModelInstanceTypeProps<{
10
+ id: import("mobx-state-tree").ISimpleType<string>;
11
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
12
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
13
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
14
+ custom: import("mobx-state-tree").IType<any, any, any>;
15
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
16
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
17
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
18
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
19
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
20
+ } & {
21
+ x: import("mobx-state-tree").IType<number | undefined, number, number>;
22
+ y: import("mobx-state-tree").IType<number | undefined, number, number>;
23
+ width: import("mobx-state-tree").IType<number | undefined, number, number>;
24
+ height: import("mobx-state-tree").IType<number | undefined, number, number>;
25
+ rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
26
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
27
+ animations: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
28
+ delay: import("mobx-state-tree").IType<number | undefined, number, number>;
29
+ duration: import("mobx-state-tree").IType<number | undefined, number, number>;
30
+ enabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
31
+ type: import("mobx-state-tree").ISimpleType<"exit" | "enter" | "loop">;
32
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
33
+ data: import("mobx-state-tree").IType<{} | null | undefined, {}, {}>;
34
+ }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
35
+ blurEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
36
+ blurRadius: import("mobx-state-tree").IType<number | undefined, number, number>;
37
+ brightnessEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
38
+ brightness: import("mobx-state-tree").IType<number | undefined, number, number>;
39
+ sepiaEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
40
+ grayscaleEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
41
+ filters: import("mobx-state-tree").IMapType<import("mobx-state-tree").IModelType<{
42
+ intensity: import("mobx-state-tree").IType<number | undefined, number, number>;
43
+ }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
44
+ shadowEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
45
+ shadowBlur: import("mobx-state-tree").IType<number | undefined, number, number>;
46
+ shadowOffsetX: import("mobx-state-tree").IType<number | undefined, number, number>;
47
+ shadowOffsetY: import("mobx-state-tree").IType<number | undefined, number, number>;
48
+ shadowColor: import("mobx-state-tree").IType<string | undefined, string, string>;
49
+ shadowOpacity: import("mobx-state-tree").IType<number | undefined, number, number>;
50
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
51
+ draggable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
52
+ resizable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
53
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
54
+ contentEditable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
55
+ styleEditable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
56
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
57
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
58
+ } & {
59
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
60
+ text: import("mobx-state-tree").IType<string | undefined, string, string>;
61
+ placeholder: import("mobx-state-tree").IType<string | undefined, string, string>;
62
+ fontSize: import("mobx-state-tree").IType<number | undefined, number, number>;
63
+ fontFamily: import("mobx-state-tree").IType<string | undefined, string, string>;
64
+ fontStyle: import("mobx-state-tree").IType<string | undefined, string, string>;
65
+ fontWeight: import("mobx-state-tree").IType<string | undefined, string, string>;
66
+ textDecoration: import("mobx-state-tree").IType<string | undefined, string, string>;
67
+ textTransform: import("mobx-state-tree").IType<string | undefined, string, string>;
68
+ fill: import("mobx-state-tree").IType<string | undefined, string, string>;
69
+ align: import("mobx-state-tree").IType<string | undefined, string, string>;
70
+ width: import("mobx-state-tree").IType<number | undefined, number, number>;
71
+ height: import("mobx-state-tree").IType<number | undefined, number, number>;
72
+ verticalAlign: import("mobx-state-tree").IType<string | undefined, string, string>;
73
+ strokeWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
74
+ stroke: import("mobx-state-tree").IType<string | undefined, string, string>;
75
+ lineHeight: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree/dist/internal").IUnionType<[import("mobx-state-tree").ISimpleType<number>, import("mobx-state-tree").ISimpleType<string>]>, [undefined]>;
76
+ letterSpacing: import("mobx-state-tree").IType<number | undefined, number, number>;
77
+ _editModeEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
78
+ backgroundEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
79
+ backgroundColor: import("mobx-state-tree").IType<string | undefined, string, string>;
80
+ backgroundOpacity: import("mobx-state-tree").IType<number | undefined, number, number>;
81
+ backgroundCornerRadius: import("mobx-state-tree").IType<number | undefined, number, number>;
82
+ backgroundPadding: import("mobx-state-tree").IType<number | undefined, number, number>;
83
+ legacyBackground: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<boolean>>;
84
+ curveEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
85
+ curvePower: import("mobx-state-tree").IType<number | undefined, number, number>;
86
+ }> & {
87
+ readonly page: any;
88
+ readonly store: any;
89
+ readonly top: import("mobx-state-tree").ModelInstanceTypeProps<{
90
+ id: import("mobx-state-tree").ISimpleType<string>;
91
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
92
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
93
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
94
+ custom: import("mobx-state-tree").IType<any, any, any>;
95
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
96
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
97
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
98
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
99
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
100
+ }> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
101
+ id: import("mobx-state-tree").ISimpleType<string>;
102
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
103
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
104
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
105
+ custom: import("mobx-state-tree").IType<any, any, any>;
106
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
107
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
108
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
109
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
110
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
111
+ }, {}, import("mobx-state-tree").ModelCreationType<{
112
+ id: string;
113
+ type: string | undefined;
114
+ name: string | undefined;
115
+ opacity: number | undefined;
116
+ custom: any;
117
+ visible: boolean | undefined;
118
+ selectable: boolean | undefined;
119
+ removable: boolean | undefined;
120
+ alwaysOnTop: boolean | undefined;
121
+ showInExport: boolean | undefined;
122
+ }>, import("mobx-state-tree").ModelSnapshotType<{
123
+ id: import("mobx-state-tree").ISimpleType<string>;
124
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
125
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
126
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
127
+ custom: import("mobx-state-tree").IType<any, any, any>;
128
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
129
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
130
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
131
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
132
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
133
+ }>>>;
134
+ readonly parent: any;
135
+ readonly zIndex: any;
136
+ } & {
137
+ toJSON(): {
138
+ id: string;
139
+ type: string;
140
+ name: string;
141
+ opacity: number;
142
+ custom: any;
143
+ visible: boolean;
144
+ selectable: boolean;
145
+ removable: boolean;
146
+ alwaysOnTop: boolean;
147
+ showInExport: boolean;
148
+ };
149
+ } & {
150
+ clone(attrs?: any, { skipSelect }?: {
151
+ skipSelect?: boolean | undefined;
152
+ }): import("../model/node-model.js").NodeType;
153
+ set(attrs: any): void;
154
+ moveUp(): void;
155
+ moveTop(): void;
156
+ moveDown(): void;
157
+ moveBottom(): void;
158
+ setZIndex(zIndex: number): void;
159
+ beforeDestroy(): void;
160
+ } & {
161
+ readonly locked: boolean;
162
+ readonly a: import("../model/shape-model.js").AnimatedAttrs;
163
+ animated(attr: any): any;
164
+ readonly timeRange: {
165
+ start: number;
166
+ end: number;
167
+ };
168
+ readonly active: boolean;
169
+ readonly isSelected: boolean;
170
+ readonly isSelectedDirectly: boolean;
171
+ } & {
172
+ setAnimation(type: any, attrs: any): void;
173
+ setFilter(type: any, value: any): void;
174
+ } & {
175
+ set(attrs: any): void;
176
+ afterCreate(): void;
177
+ toggleEditMode(editing?: boolean): void;
178
+ beforeDestroy(): void;
179
+ } & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
180
+ id: import("mobx-state-tree").ISimpleType<string>;
181
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
182
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
183
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
184
+ custom: import("mobx-state-tree").IType<any, any, any>;
185
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
186
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
187
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
188
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
189
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
190
+ } & {
191
+ x: import("mobx-state-tree").IType<number | undefined, number, number>;
192
+ y: import("mobx-state-tree").IType<number | undefined, number, number>;
193
+ width: import("mobx-state-tree").IType<number | undefined, number, number>;
194
+ height: import("mobx-state-tree").IType<number | undefined, number, number>;
195
+ rotation: import("mobx-state-tree").IType<number | undefined, number, number>;
196
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
197
+ animations: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
198
+ delay: import("mobx-state-tree").IType<number | undefined, number, number>;
199
+ duration: import("mobx-state-tree").IType<number | undefined, number, number>;
200
+ enabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
201
+ type: import("mobx-state-tree").ISimpleType<"exit" | "enter" | "loop">;
202
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
203
+ data: import("mobx-state-tree").IType<{} | null | undefined, {}, {}>;
204
+ }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
205
+ blurEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
206
+ blurRadius: import("mobx-state-tree").IType<number | undefined, number, number>;
207
+ brightnessEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
208
+ brightness: import("mobx-state-tree").IType<number | undefined, number, number>;
209
+ sepiaEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
210
+ grayscaleEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
211
+ filters: import("mobx-state-tree").IMapType<import("mobx-state-tree").IModelType<{
212
+ intensity: import("mobx-state-tree").IType<number | undefined, number, number>;
213
+ }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
214
+ shadowEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
215
+ shadowBlur: import("mobx-state-tree").IType<number | undefined, number, number>;
216
+ shadowOffsetX: import("mobx-state-tree").IType<number | undefined, number, number>;
217
+ shadowOffsetY: import("mobx-state-tree").IType<number | undefined, number, number>;
218
+ shadowColor: import("mobx-state-tree").IType<string | undefined, string, string>;
219
+ shadowOpacity: import("mobx-state-tree").IType<number | undefined, number, number>;
220
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
221
+ draggable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
222
+ resizable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
223
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
224
+ contentEditable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
225
+ styleEditable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
226
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
227
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
228
+ } & {
229
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
230
+ text: import("mobx-state-tree").IType<string | undefined, string, string>;
231
+ placeholder: import("mobx-state-tree").IType<string | undefined, string, string>;
232
+ fontSize: import("mobx-state-tree").IType<number | undefined, number, number>;
233
+ fontFamily: import("mobx-state-tree").IType<string | undefined, string, string>;
234
+ fontStyle: import("mobx-state-tree").IType<string | undefined, string, string>;
235
+ fontWeight: import("mobx-state-tree").IType<string | undefined, string, string>;
236
+ textDecoration: import("mobx-state-tree").IType<string | undefined, string, string>;
237
+ textTransform: import("mobx-state-tree").IType<string | undefined, string, string>;
238
+ fill: import("mobx-state-tree").IType<string | undefined, string, string>;
239
+ align: import("mobx-state-tree").IType<string | undefined, string, string>;
240
+ width: import("mobx-state-tree").IType<number | undefined, number, number>;
241
+ height: import("mobx-state-tree").IType<number | undefined, number, number>;
242
+ verticalAlign: import("mobx-state-tree").IType<string | undefined, string, string>;
243
+ strokeWidth: import("mobx-state-tree").IType<number | undefined, number, number>;
244
+ stroke: import("mobx-state-tree").IType<string | undefined, string, string>;
245
+ lineHeight: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree/dist/internal").IUnionType<[import("mobx-state-tree").ISimpleType<number>, import("mobx-state-tree").ISimpleType<string>]>, [undefined]>;
246
+ letterSpacing: import("mobx-state-tree").IType<number | undefined, number, number>;
247
+ _editModeEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
248
+ backgroundEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
249
+ backgroundColor: import("mobx-state-tree").IType<string | undefined, string, string>;
250
+ backgroundOpacity: import("mobx-state-tree").IType<number | undefined, number, number>;
251
+ backgroundCornerRadius: import("mobx-state-tree").IType<number | undefined, number, number>;
252
+ backgroundPadding: import("mobx-state-tree").IType<number | undefined, number, number>;
253
+ legacyBackground: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<boolean>>;
254
+ curveEnabled: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
255
+ curvePower: import("mobx-state-tree").IType<number | undefined, number, number>;
256
+ }, {
257
+ readonly page: any;
258
+ readonly store: any;
259
+ readonly top: import("mobx-state-tree").ModelInstanceTypeProps<{
260
+ id: import("mobx-state-tree").ISimpleType<string>;
261
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
262
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
263
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
264
+ custom: import("mobx-state-tree").IType<any, any, any>;
265
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
266
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
267
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
268
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
269
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
270
+ }> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
271
+ id: import("mobx-state-tree").ISimpleType<string>;
272
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
273
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
274
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
275
+ custom: import("mobx-state-tree").IType<any, any, any>;
276
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
277
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
278
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
279
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
280
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
281
+ }, {}, import("mobx-state-tree").ModelCreationType<{
282
+ id: string;
283
+ type: string | undefined;
284
+ name: string | undefined;
285
+ opacity: number | undefined;
286
+ custom: any;
287
+ visible: boolean | undefined;
288
+ selectable: boolean | undefined;
289
+ removable: boolean | undefined;
290
+ alwaysOnTop: boolean | undefined;
291
+ showInExport: boolean | undefined;
292
+ }>, import("mobx-state-tree").ModelSnapshotType<{
293
+ id: import("mobx-state-tree").ISimpleType<string>;
294
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
295
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
296
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
297
+ custom: import("mobx-state-tree").IType<any, any, any>;
298
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
299
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
300
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
301
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
302
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
303
+ }>>>;
304
+ readonly parent: any;
305
+ readonly zIndex: any;
306
+ } & {
307
+ toJSON(): {
308
+ id: string;
309
+ type: string;
310
+ name: string;
311
+ opacity: number;
312
+ custom: any;
313
+ visible: boolean;
314
+ selectable: boolean;
315
+ removable: boolean;
316
+ alwaysOnTop: boolean;
317
+ showInExport: boolean;
318
+ };
319
+ } & {
320
+ clone(attrs?: any, { skipSelect }?: {
321
+ skipSelect?: boolean | undefined;
322
+ }): import("../model/node-model.js").NodeType;
323
+ set(attrs: any): void;
324
+ moveUp(): void;
325
+ moveTop(): void;
326
+ moveDown(): void;
327
+ moveBottom(): void;
328
+ setZIndex(zIndex: number): void;
329
+ beforeDestroy(): void;
330
+ } & {
331
+ readonly locked: boolean;
332
+ readonly a: import("../model/shape-model.js").AnimatedAttrs;
333
+ animated(attr: any): any;
334
+ readonly timeRange: {
335
+ start: number;
336
+ end: number;
337
+ };
338
+ readonly active: boolean;
339
+ readonly isSelected: boolean;
340
+ readonly isSelectedDirectly: boolean;
341
+ } & {
342
+ setAnimation(type: any, attrs: any): void;
343
+ setFilter(type: any, value: any): void;
344
+ } & {
345
+ set(attrs: any): void;
346
+ afterCreate(): void;
347
+ toggleEditMode(editing?: boolean): void;
348
+ beforeDestroy(): void;
349
+ }, any, import("mobx-state-tree").ModelSnapshotType<{
350
+ id: import("mobx-state-tree").ISimpleType<string>;
351
+ type: import("mobx-state-tree").IType<string | undefined, string, string>;
352
+ name: import("mobx-state-tree").IType<string | undefined, string, string>;
353
+ opacity: import("mobx-state-tree").IType<number | undefined, number, number>;
354
+ custom: import("mobx-state-tree").IType<any, any, any>;
355
+ visible: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
356
+ selectable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
357
+ removable: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
358
+ alwaysOnTop: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
359
+ showInExport: import("mobx-state-tree").IType<boolean | undefined, boolean, boolean>;
360
+ }>>> & {
361
+ type: "text";
362
+ }) | undefined;
363
+ export declare const pasteFromEvent: (store: StoreType, e: ClipboardEvent, opts?: {
364
+ onText?: (text: string) => void;
365
+ }) => boolean;
@@ -1 +1 @@
1
- import{forEveryChild as e}from"../model/group-model.js";import{getTotalClientRect as t}from"./math.js";let a={data:[],pageId:""};const o="polotno_clipboard",l=(e,t)=>{a={data:JSON.parse(JSON.stringify(e)),pageId:t||""};try{localStorage.setItem(o,JSON.stringify(e)),localStorage.setItem(o+"_page",t||"")}catch(l){}},r=()=>{try{const e=localStorage.getItem(o),t=localStorage.getItem(o+"_page");if(e){return{data:JSON.parse(e),pageId:t}}}catch(e){}return a};export const copy=e=>{var t;0!==e.selectedElements.length&&l(e.selectedElements.map(e=>e.toJSON()),null===(t=e.activePage)||void 0===t?void 0:t.id)};export const cut=e=>{var t;l(e.selectedElements.map(e=>e.toJSON()),null===(t=e.activePage)||void 0===t?void 0:t.id);let a=e.selectedElements.filter(e=>e.removable).map(e=>e.id);e.deleteElements(a)};export const paste=a=>{a.history.transaction(()=>{var o,d;let i=0,c=0;const{data:s,pageId:n}=r();if(n===(null===(o=a.activePage)||void 0===o?void 0:o.id)){i=a.width/20,c=a.height/20}else{const o=[];e({children:s},e=>{"group"!==e.type&&o.push(e)});const l=t(o);l.maxX>a.width&&(i=-l.minX),l.maxY>a.height&&(c=-l.minY)}const p=[];e({children:s},e=>{delete e.id,"group"!==e.type&&(e.x+=i,e.y+=c)}),s.forEach(e=>{var t;const o=null===(t=a.activePage)||void 0===t?void 0:t.addElement(e);o&&p.push(o.id)}),l(s,null===(d=a.activePage)||void 0===d?void 0:d.id),a.selectElements(p)})};export const isClipboardEmpty=()=>0===r().data.length;export const resetClipboard=()=>{a={data:[],pageId:""};try{localStorage.removeItem(o),localStorage.removeItem(o+"_page")}catch(e){}};
1
+ import{forEveryChild as e}from"../model/group-model.js";import{nanoid as t}from"nanoid";import{getTotalClientRect as a}from"./math.js";import{removeTags as o}from"./text.js";import{insertFileIntoPage as r}from"./insert-file.js";import{decodeBase64 as l,encodeBase64 as n}from"./base64.js";let i={data:[],pageId:"",payloadId:""};const d="polotno_clipboard",s=(e,t,a)=>{i={data:JSON.parse(JSON.stringify(e)),pageId:t||"",payloadId:a||""};try{localStorage.setItem(d,JSON.stringify(e)),localStorage.setItem(d+"_page",t||""),localStorage.setItem(d+"_payload",a||"")}catch(o){}},c=()=>{try{const e=localStorage.getItem(d),t=localStorage.getItem(d+"_page"),a=localStorage.getItem(d+"_payload");if(e){return{data:JSON.parse(e),pageId:t,payloadId:a}}}catch(e){}return i},p="data-polotno-clipboard";export const copy=e=>{var t;0!==e.selectedElements.length&&s(e.selectedElements.map(e=>e.toJSON()),null===(t=e.activePage)||void 0===t?void 0:t.id)};export const cut=e=>{if(0===e.selectedElements.length){return}copy(e);const t=e.selectedElements.filter(e=>e.removable).map(e=>e.id);e.deleteElements(t)};const m=(t,o)=>{t.history.transaction(()=>{var r,l;let n=0,i=0;const{data:d,pageId:c,payloadId:p}=o;if(c===(null===(r=t.activePage)||void 0===r?void 0:r.id)){n=t.width/20,i=t.height/20}else{const o=[];e({children:d},e=>{"group"!==e.type&&o.push(e)});const r=a(o);r.maxX>t.width&&(n=-r.minX),r.maxY>t.height&&(i=-r.minY)}const m=[];e({children:d},e=>{delete e.id,"group"!==e.type&&(e.x+=n,e.y+=i)}),d.forEach(e=>{var a;const o=null===(a=t.activePage)||void 0===a?void 0:a.addElement(e);o&&m.push(o.id)}),s(d,null===(l=t.activePage)||void 0===l?void 0:l.id,p),t.selectElements(m)})};export const paste=e=>{m(e,c())};export const isClipboardEmpty=()=>0===c().data.length;export const resetClipboard=()=>{i={data:[],pageId:"",payloadId:""};try{localStorage.removeItem(d),localStorage.removeItem(d+"_page"),localStorage.removeItem(d+"_payload")}catch(e){}};export const copyToEvent=(a,r)=>{var l,i;if(!r.clipboardData||0===a.selectedElements.length){return!1}const d=a.selectedElements.map(e=>e.toJSON()),c=t(),m={v:1,id:c,pageId:(null===(l=a.activePage)||void 0===l?void 0:l.id)||"",elements:d};r.clipboardData.setData("text/html",`<div ${p}="${(e=>n((new TextEncoder).encode(JSON.stringify(e))))(m)}"></div>`);const g=[];return e({children:d},e=>{"text"===e.type&&g.push(o(e.text))}),r.clipboardData.setData("text/plain",g.join("\n")||" "),r.preventDefault(),s(d,null===(i=a.activePage)||void 0===i?void 0:i.id,c),!0};export const cutToEvent=(e,t)=>{const a=copyToEvent(e,t);if(a){const t=e.selectedElements.filter(e=>e.removable).map(e=>e.id);e.deleteElements(t)}return a};export const insertTextElement=(e,t,a={})=>{var o;const r=e.width/2,l=(e.width+e.height)/2160;return null===(o=e.activePage)||void 0===o?void 0:o.addElement(Object.assign({type:"text",x:e.width/2-r/2,y:e.height/2-15,width:r,fontSize:30*l,text:t},a))};export const pasteFromEvent=(e,t,a={})=>{const o=t.clipboardData;if(!o){return!1}const n=o.getData("text/html");if(n&&n.includes(p)){const a=(e=>{var a;try{const t=null===(a=(new DOMParser).parseFromString(e,"text/html").querySelector(`[${p}]`))||void 0===a?void 0:a.getAttribute(p);if(!t){return null}const o=JSON.parse((new TextDecoder).decode(l(t)));return Array.isArray(o.elements)?o:null}catch(t){return null}})(n);if(a){t.preventDefault();const o=c();return a.id&&a.id===o.payloadId?m(e,o):m(e,{data:a.elements,pageId:a.pageId,payloadId:a.id}),!0}}const i=o.files?Array.from(o.files):[];if(i.length>0){return t.preventDefault(),(async()=>{for(const a of i){try{await r({file:a,store:e})}catch(t){console.error("polotno: failed to insert pasted file",t)}}})(),!0}const d=o.getData("text/plain");if(d&&d.trim()){if(t.preventDefault(),a.onText){a.onText(d)}else{const t=insertTextElement(e,(e=>e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"))(d));t&&e.selectElements([t.id])}return!0}return 0===o.types.length&&0!==c().data.length&&(t.preventDefault(),paste(e),!0)};
package/utils/file.d.ts CHANGED
@@ -1 +1,7 @@
1
1
  export declare function localFileToURL(file: File): Promise<string>;
2
+ export type MediaType = 'image' | 'svg' | 'video' | 'audio' | 'gif';
3
+ export declare function getType(file: File): MediaType;
4
+ declare let uploadFunc: (file: File) => Promise<string>;
5
+ export declare function setUploadFunc(func: typeof uploadFunc): void;
6
+ export declare function getUploadFunc(): (file: File) => Promise<string>;
7
+ export {};
package/utils/file.js CHANGED
@@ -1 +1 @@
1
- export async function localFileToURL(e){return new Promise((o,r)=>{const n=new FileReader;n.readAsDataURL(e),n.onload=()=>o(n.result),n.onerror=e=>r(e)})}
1
+ export async function localFileToURL(o){return new Promise((e,n)=>{const i=new FileReader;i.readAsDataURL(o),i.onload=()=>e(i.result),i.onerror=o=>n(o)})}export function getType(o){const{type:e}=o;return e.indexOf("svg")>=0?"svg":e.indexOf("gif")>=0?"gif":e.indexOf("image")>=0?"image":e.indexOf("video")>=0?"video":e.indexOf("audio")>=0?"audio":"image"}let o=async o=>(console.warn("Polotno: using data URL for file embeding. This is not recommended for production. Set upload function https://polotno.com/docs/editor-configuration#how-to-change-image-upload-behavior"),localFileToURL(o));export function setUploadFunc(e){o=e}export function getUploadFunc(){return o}
@@ -1 +1 @@
1
- const t=[112,72,89,115],e=(()=>{const t=new Uint32Array(256);for(let e=0;e<256;e++){let n=e;for(let t=0;t<8;t++){n=1&n?3988292384^n>>>1:n>>>1}t[e]=n>>>0}return t})(),n=()=>"undefined"!=typeof globalThis?globalThis.Buffer:void 0,r=(t,e,n)=>{t[e]=n>>>24&255,t[e+1]=n>>>16&255,t[e+2]=n>>>8&255,t[e+3]=255&n};export const addDpiMetadataToImage=(o,s,a)=>{const l=o.indexOf(","),i=(t=>{if("function"==typeof atob){const e=atob(t),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++){n[t]=e.charCodeAt(t)}return n}const e=n();if(e){return new Uint8Array(e.from(t,"base64"))}throw new Error("No base64 decoder available")})(l>=0?o.slice(l+1):o),f="image/png"===s?((n,o)=>{const s=(n=>{const o=new Uint8Array(9),s=new DataView(o.buffer);s.setUint32(0,n,!1),s.setUint32(4,n,!1),o[8]=1;const a=new Uint8Array(8+o.length+4);r(a,0,o.length),a.set(t,4),a.set(o,8);const l=new Uint8Array(4+o.length);return l.set(t,0),l.set(o,4),r(a,8+o.length,(t=>{let n=4294967295;for(let r=0;r<t.length;r++){n=e[255&(n^t[r])]^n>>>8}return(4294967295^n)>>>0})(l)),a})(Math.round(o/.0254)),a=((t,e)=>{let n=8;for(;n+8<=t.length;){const r=t[n]<<24|t[n+1]<<16|t[n+2]<<8|t[n+3],o=n+4,s=t.subarray(o,o+4),a=8+r+4;if(e.every((t,e)=>s[e]===t)){return{offset:n,totalLength:a}}n+=a}return null})(n,t);if(a){const t=new Uint8Array(n.length-a.totalLength+s.length);return t.set(n.slice(0,a.offset),0),t.set(s,a.offset),t.set(n.slice(a.offset+a.totalLength),a.offset+s.length),t}const l=16+(n[8]<<24|n[9]<<16|n[10]<<8|n[11])+4;if(l>n.length){return n}const i=new Uint8Array(n.length+s.length);return i.set(n.slice(0,l),0),i.set(s,l),i.set(n.slice(l),l+s.length),i})(i,a):((t,e)=>{const n=(t=>{let e=2;for(;e+4<t.length;){if(255!==t[e]){return-1}const n=t[e+1];if(216===n||217===n){e+=2;continue}const r=t[e+2]<<8|t[e+3];if(r<2){return-1}if(224===n&&74===t[e+4]&&70===t[e+5]&&73===t[e+6]&&70===t[e+7]&&0===t[e+8]){return e}const o=e+2+r;if(o<=e||o>t.length){return-1}e=o}return-1})(t);if(n>=0){const r=new Uint8Array(t),o=n+11;return r[o]=1,r[o+1]=e>>8&255,r[o+2]=255&e,r[o+3]=e>>8&255,r[o+4]=255&e,r}const r=(t=>{const e=new Uint8Array(18);return e[0]=255,e[1]=224,e[2]=0,e[3]=16,e[4]=74,e[5]=70,e[6]=73,e[7]=70,e[8]=0,e[9]=1,e[10]=1,e[11]=1,e[12]=t>>8&255,e[13]=255&t,e[14]=t>>8&255,e[15]=255&t,e})(e),o=new Uint8Array(t.length+r.length);return o.set(t.subarray(0,2),0),o.set(r,2),o.set(t.subarray(2),2+r.length),o})(i,a);return`data:${s};base64,${(t=>{if("function"==typeof btoa){let e="";for(let n=0;n<t.length;n++){e+=String.fromCharCode(t[n])}return btoa(e)}const e=n();if(e){return e.from(t).toString("base64")}throw new Error("No base64 encoder available")})(f)}`};
1
+ import{decodeBase64 as t,encodeBase64 as e}from"./base64.js";const n=[112,72,89,115],r=(()=>{const t=new Uint32Array(256);for(let e=0;e<256;e++){let n=e;for(let t=0;t<8;t++){n=1&n?3988292384^n>>>1:n>>>1}t[e]=n>>>0}return t})(),s=(t,e,n)=>{t[e]=n>>>24&255,t[e+1]=n>>>16&255,t[e+2]=n>>>8&255,t[e+3]=255&n};export const addDpiMetadataToImage=(o,l,a)=>{const i=o.indexOf(","),f=i>=0?o.slice(i+1):o,c=t(f),g="image/png"===l?((t,e)=>{const o=(t=>{const e=new Uint8Array(9),o=new DataView(e.buffer);o.setUint32(0,t,!1),o.setUint32(4,t,!1),e[8]=1;const l=new Uint8Array(8+e.length+4);s(l,0,e.length),l.set(n,4),l.set(e,8);const a=new Uint8Array(4+e.length);return a.set(n,0),a.set(e,4),s(l,8+e.length,(t=>{let e=4294967295;for(let n=0;n<t.length;n++){e=r[255&(e^t[n])]^e>>>8}return(4294967295^e)>>>0})(a)),l})(Math.round(e/.0254)),l=((t,e)=>{let n=8;for(;n+8<=t.length;){const r=t[n]<<24|t[n+1]<<16|t[n+2]<<8|t[n+3],s=n+4,o=t.subarray(s,s+4),l=8+r+4;if(e.every((t,e)=>o[e]===t)){return{offset:n,totalLength:l}}n+=l}return null})(t,n);if(l){const e=new Uint8Array(t.length-l.totalLength+o.length);return e.set(t.slice(0,l.offset),0),e.set(o,l.offset),e.set(t.slice(l.offset+l.totalLength),l.offset+o.length),e}const a=16+(t[8]<<24|t[9]<<16|t[10]<<8|t[11])+4;if(a>t.length){return t}const i=new Uint8Array(t.length+o.length);return i.set(t.slice(0,a),0),i.set(o,a),i.set(t.slice(a),a+o.length),i})(c,a):((t,e)=>{const n=(t=>{let e=2;for(;e+4<t.length;){if(255!==t[e]){return-1}const n=t[e+1];if(216===n||217===n){e+=2;continue}const r=t[e+2]<<8|t[e+3];if(r<2){return-1}if(224===n&&74===t[e+4]&&70===t[e+5]&&73===t[e+6]&&70===t[e+7]&&0===t[e+8]){return e}const s=e+2+r;if(s<=e||s>t.length){return-1}e=s}return-1})(t);if(n>=0){const r=new Uint8Array(t),s=n+11;return r[s]=1,r[s+1]=e>>8&255,r[s+2]=255&e,r[s+3]=e>>8&255,r[s+4]=255&e,r}const r=(t=>{const e=new Uint8Array(18);return e[0]=255,e[1]=224,e[2]=0,e[3]=16,e[4]=74,e[5]=70,e[6]=73,e[7]=70,e[8]=0,e[9]=1,e[10]=1,e[11]=1,e[12]=t>>8&255,e[13]=255&t,e[14]=t>>8&255,e[15]=255&t,e})(e),s=new Uint8Array(t.length+r.length);return s.set(t.subarray(0,2),0),s.set(r,2),s.set(t.subarray(2),2+r.length),s})(c,a);return`data:${l};base64,${e(g)}`};
@@ -0,0 +1,23 @@
1
+ import type { StoreType, ShapeType } from '../ui-types.js';
2
+ import { MediaType } from './file.js';
3
+ type MediaProps = {
4
+ url: string;
5
+ type: MediaType;
6
+ store: StoreType;
7
+ droppedPos?: {
8
+ x: number;
9
+ y: number;
10
+ };
11
+ targetElement?: ShapeType;
12
+ };
13
+ export declare const insertMediaIntoPage: ({ url, type, store, droppedPos, targetElement, }: MediaProps) => Promise<void>;
14
+ type FileProps = {
15
+ file: File;
16
+ store: StoreType;
17
+ droppedPos?: {
18
+ x: number;
19
+ y: number;
20
+ };
21
+ };
22
+ export declare const insertFileIntoPage: ({ file, store, droppedPos }: FileProps) => Promise<void>;
23
+ export {};
@@ -0,0 +1 @@
1
+ import{getType as e,getUploadFunc as t}from"./file.js";import{selectImage as o}from"../side-panel/select-image.js";import{selectVideo as s}from"../side-panel/select-video.js";import{selectSvg as r}from"../side-panel/select-svg.js";import{selectGif as a}from"../side-panel/select-gif.js";export const insertMediaIntoPage=async({url:e,type:t,store:i,droppedPos:p,targetElement:d})=>{const n=e;"image"===t?await o({src:n,store:i,droppedPos:p,targetElement:d}):"svg"===t?await r({src:n,store:i,droppedPos:p,targetElement:d}):"gif"===t?await a({src:n,store:i,droppedPos:p,targetElement:d}):"video"===t?await s({src:n,store:i,droppedPos:p,targetElement:d}):"audio"===t&&i.addAudio({src:n})};export const insertFileIntoPage=async({file:o,store:s,droppedPos:r})=>{const a=await t()(o);await insertMediaIntoPage({url:a,type:e(o),store:s,droppedPos:r})};
@@ -0,0 +1,4 @@
1
+ import { IAutorunOptions, IReactionOptions, IReactionDisposer } from 'mobx';
2
+ import { IAnyStateTreeNode } from 'mobx-state-tree';
3
+ export declare function nodeAutorun(node: IAnyStateTreeNode, view: () => void, opts?: IAutorunOptions): IReactionDisposer;
4
+ export declare function nodeReaction<T>(node: IAnyStateTreeNode, expression: () => T, effect: (value: T | undefined, prev: T | undefined) => void, opts?: IReactionOptions<T | undefined, boolean>): IReactionDisposer;
package/utils/mobx.js ADDED
@@ -0,0 +1 @@
1
+ import{autorun as o,reaction as t}from"mobx";import{isAlive as r}from"mobx-state-tree";export function nodeAutorun(t,e,n){return o(()=>{r(t)&&e()},n)}export function nodeReaction(o,e,n,i){return t(()=>r(o)?e():void 0,(t,e)=>{r(o)&&n(t,e)},i)}
@@ -1 +1 @@
1
- import*as e from"mobx";import{getAPI as o}from"./api.js";import{setRemoveBackgroundEnabled as t}from"./flags.js";const n=e.observable({value:!1}),a=e.observable({value:"v1"});export const ___=()=>a.value;const i=e.observable({value:0});export const ____=()=>i.value;export const isCreditVisible=()=>n.value;const r=e.action(()=>{n.value=!0});let s="";export const getKey=()=>s||"";export const setKey=e=>{s=e||""};let l="undefined"!=typeof window?window.location.origin:"";const c="undefined"!=typeof navigator&&navigator.userAgent.indexOf("Headless")>-1,d="undefined"!=typeof navigator&&navigator.userAgent.indexOf("Electron")>-1;"file://"===l&&c&&(l="headless"),"file://"===l&&d&&(l="electron");const p=`%cPolotno error! Current domain is not allowed. It may lead to unexpected behavior and stop working. Please add "${l}" here: https://polotno.com/cabinet`;let u=fetch;export const __=e=>{u=e};export async function isKeyPaid(n){for(let s=0;s<5;s++){try{const r=await u(o()+"/validate-key",{method:"POST",body:JSON.stringify({key:n,site:location.host,skdVersion:"4.2.1"})});if(e.runInAction(()=>{a.value=r.headers.get("x-api-version")||""}),!n){return console.error("Polotno API is initialized without API key. It may lead to unexpected behavior and stop working. Please create API key here: https://polotno.com/cabinet"),e.runInAction(()=>{i.value=1}),!1}if(200!==r.status){await new Promise(e=>setTimeout(e,3e3));continue}const s=await r.json();return s.is_valid||(console.error("Polotno API key is not valid. Please get new API key here: https://polotno.com/cabinet"),e.runInAction(()=>{i.value=1})),s.is_paid||(console.log("%cPolotno Free Version. For development usage only. https://polotno.com/","background: rgb(0, 161, 255); color: white; padding: 5px; margin: 5px;"),e.runInAction(()=>{0===i.value&&(i.value=2)})),s.is_domain_valid||console.log(p,"background: rgba(247, 101, 68, 1); color: white; padding: 5px; margin: 5px;"),t(s.remove_background_enabled),s.is_paid||!1}catch(r){await new Promise(e=>setTimeout(e,3e3))}}return console.error("Can not validate Polotno API key. Please report to anton@polotno.com immediately."),!0}export async function validateKey(e){await isKeyPaid(s)&&!e||r()}
1
+ import*as e from"mobx";import{getAPI as o}from"./api.js";import{setRemoveBackgroundEnabled as t}from"./flags.js";const n=e.observable({value:!1}),a=e.observable({value:"v1"});export const ___=()=>a.value;const i=e.observable({value:0});export const ____=()=>i.value;export const isCreditVisible=()=>n.value;const r=e.action(()=>{n.value=!0});let s="";export const getKey=()=>s||"";export const setKey=e=>{s=e||""};let l="undefined"!=typeof window?window.location.origin:"";const c="undefined"!=typeof navigator&&navigator.userAgent.indexOf("Headless")>-1,d="undefined"!=typeof navigator&&navigator.userAgent.indexOf("Electron")>-1;"file://"===l&&c&&(l="headless"),"file://"===l&&d&&(l="electron");const p=`%cPolotno error! Current domain is not allowed. It may lead to unexpected behavior and stop working. Please add "${l}" here: https://polotno.com/cabinet`;let u=fetch;export const __=e=>{u=e};export async function isKeyPaid(n){for(let s=0;s<5;s++){try{const r=await u(o()+"/validate-key",{method:"POST",body:JSON.stringify({key:n,site:location.host,skdVersion:"4.2.2"})});if(e.runInAction(()=>{a.value=r.headers.get("x-api-version")||""}),!n){return console.error("Polotno API is initialized without API key. It may lead to unexpected behavior and stop working. Please create API key here: https://polotno.com/cabinet"),e.runInAction(()=>{i.value=1}),!1}if(200!==r.status){await new Promise(e=>setTimeout(e,3e3));continue}const s=await r.json();return s.is_valid||(console.error("Polotno API key is not valid. Please get new API key here: https://polotno.com/cabinet"),e.runInAction(()=>{i.value=1})),s.is_paid||(console.log("%cPolotno Free Version. For development usage only. https://polotno.com/","background: rgb(0, 161, 255); color: white; padding: 5px; margin: 5px;"),e.runInAction(()=>{0===i.value&&(i.value=2)})),s.is_domain_valid||console.log(p,"background: rgba(247, 101, 68, 1); color: white; padding: 5px; margin: 5px;"),t(s.remove_background_enabled),s.is_paid||!1}catch(r){await new Promise(e=>setTimeout(e,3e3))}}return console.error("Can not validate Polotno API key. Please report to anton@polotno.com immediately."),!0}export async function validateKey(e){await isKeyPaid(s)&&!e||r()}