anniedrawing 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +4 -0
  3. package/dist/agent/index.js +1 -1
  4. package/dist/agent/index.js.map +1 -1
  5. package/dist/agent/toolDefs.d.ts +1 -0
  6. package/dist/board.d.ts +7 -1
  7. package/dist/core/index.js +1 -1
  8. package/dist/core/types.d.ts +12 -0
  9. package/dist/docs/agents-repository.md +1 -1
  10. package/dist/docs/agents.md +4 -0
  11. package/dist/docs/api.md +4 -0
  12. package/dist/docs/board-js.md +4 -0
  13. package/dist/docs/decisions.md +6 -0
  14. package/dist/docs/llms-full.txt +4 -0
  15. package/dist/docs/llms.txt +4 -0
  16. package/dist/fellow.d.ts +2 -2
  17. package/dist/fellow.js +1 -1
  18. package/dist/fellow.js.map +1 -1
  19. package/dist/index.js +1 -1
  20. package/dist/shared/board-p60lv7As.js +2 -0
  21. package/dist/shared/board-p60lv7As.js.map +1 -0
  22. package/dist/shared/{cards-DWgSVE54.js → cards-DF0uI4-I.js} +2 -2
  23. package/dist/shared/{cards-DWgSVE54.js.map → cards-DF0uI4-I.js.map} +1 -1
  24. package/dist/shared/{paste-C22i8o-g.js → paste-B8nZA2Gh.js} +2 -2
  25. package/dist/shared/{paste-C22i8o-g.js.map → paste-B8nZA2Gh.js.map} +1 -1
  26. package/dist/shared/{picker-Dv_i4iNP.js → picker-DZpEpkED.js} +2 -2
  27. package/dist/shared/picker-DZpEpkED.js.map +1 -0
  28. package/dist/shared/{ui-DEBI1jv_.js → ui-DWQtW0zJ.js} +2 -2
  29. package/dist/shared/{ui-DEBI1jv_.js.map → ui-DWQtW0zJ.js.map} +1 -1
  30. package/dist/shared/{urlPaste-DN4JtgeB.js → urlPaste-Oc4kZ0P7.js} +2 -2
  31. package/dist/shared/{urlPaste-DN4JtgeB.js.map → urlPaste-Oc4kZ0P7.js.map} +1 -1
  32. package/dist/ui/index.js +1 -1
  33. package/dist/ui/version.d.ts +1 -1
  34. package/llms-full.txt +4 -0
  35. package/llms.txt +4 -0
  36. package/package.json +1 -1
  37. package/dist/shared/board-DV5lzxNR.js +0 -2
  38. package/dist/shared/board-DV5lzxNR.js.map +0 -1
  39. package/dist/shared/picker-Dv_i4iNP.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cards-DWgSVE54.js","names":[],"sources":["../../src/stage/cards.ts"],"sourcesContent":["import { normalizeHref, videoEmbed } from '../core/links';\nimport { displayUrl, prettyTitle } from '../core/paste';\nimport type { AnnieDoc, Item } from '../core/types';\n\n/** Injected once from this async chunk so video/link rules stay out of the 100 KiB editor CSS. */\nfunction ensureCss() {\n if (document.getElementById('ad-card-css')) return;\n const style = document.createElement('style');\n style.id = 'ad-card-css';\n style.textContent = `.ad-video{display:block;width:100%;height:100%;border:0;pointer-events:none;background:#103639}.ad-item[data-ad-interactive=true] .ad-video{pointer-events:auto}.ad-link{display:flex;flex-direction:column;height:100%;min-width:0;min-height:0;overflow:hidden;container-type:size;background:var(--ad-paper,#fff);color:var(--ad-ink,#103639)}.ad-link-media{position:relative;flex:1 1 46%;min-height:0;background:#8f93f914}.ad-link-media img{width:100%;height:100%;object-fit:cover}.ad-link-mark{position:absolute;inset:0;display:grid;place-items:center;color:#8f93f9;font-size:36px;font-weight:800}.ad-link-body{display:flex;flex:0 0 auto;flex-direction:column;gap:4px;min-width:0;padding:10px 12px 12px}.ad-link-title,.ad-link-url{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.ad-link-title{font-size:15px;font-weight:800}.ad-link-url{color:#606062;font-size:12px}.ad-root[data-theme=dark] .ad-link-url{color:#b6c5c1}.ad-link-open{flex:0 0 auto;align-self:start;margin-top:2px;padding:5px 10px;border-radius:999px;background:#05d9ab;color:#103639;font-size:11px;font-weight:800;text-decoration:none;pointer-events:auto}@container (max-height:160px){.ad-link-media{flex-basis:34%}.ad-link-body{padding:8px 10px 10px}.ad-link-title{font-size:13px}.ad-link-url{font-size:11px}}@container (max-height:118px){.ad-link-media{display:none}.ad-link-open{padding:4px 8px}}@container (max-width:150px){.ad-link-title{font-size:12px}.ad-link-url{font-size:10px}.ad-link-open{padding:4px 8px;font-size:10px}}`;\n document.head.append(style);\n}\n\nfunction el<K extends keyof HTMLElementTagNameMap>(tag: K, cls: string, text?: string) {\n const node = document.createElement(tag);\n if (cls) node.className = cls;\n if (text) node.textContent = text;\n return node;\n}\n\nexport function paintCard(root: HTMLElement, item: Item, doc: AnnieDoc) {\n ensureCss();\n if (item.kind === 'video') {\n const src = videoEmbed(item.href);\n if (!src) {\n root.innerHTML =\n '<div class=\"ad-placeholder\"><span aria-hidden=\"true\">◇</span><span>Video unavailable</span></div>';\n return;\n }\n const frame = document.createElement('iframe');\n frame.className = 'ad-video';\n frame.src = src;\n frame.title = item.name ?? item.text?.value ?? 'Video';\n frame.allow = 'autoplay; fullscreen; picture-in-picture';\n frame.referrerPolicy = 'strict-origin-when-cross-origin';\n frame.setAttribute(\n 'sandbox',\n 'allow-scripts allow-same-origin allow-presentation allow-popups',\n );\n root.append(frame);\n return;\n }\n const href = normalizeHref(item.href);\n const title = item.text?.value || (href ? prettyTitle(href) : item.name || 'Link');\n const card = el('div', 'ad-link');\n const media = el('div', 'ad-link-media');\n const record = item.media ? doc.media[item.media] : undefined;\n if (record) {\n const img = el('img', '');\n img.draggable = false;\n img.alt = '';\n img.src = record.src;\n media.append(img);\n } else media.append(el('span', 'ad-link-mark', title.trim().slice(0, 1).toUpperCase() || '•'));\n const open = el('a', 'ad-link-open', 'Open');\n if (href) {\n open.href = href;\n open.target = '_blank';\n open.rel = 'noopener noreferrer';\n } else open.setAttribute('aria-disabled', 'true');\n const url = el('div', 'ad-link-url', href ? displayUrl(href) : '');\n url.hidden = !href;\n const body = el('div', 'ad-link-body');\n body.append(el('div', 'ad-link-title', title), url, open);\n card.append(media, body);\n root.append(card);\n}\n"],"mappings":"+FAaA,SAAS,EAA0C,EAAQ,EAAa,GACtE,MAAM,EAAO,SAAS,cAAc,GAGpC,OAFI,IAAK,EAAK,UAAY,GACtB,IAAM,EAAK,YAAc,GACtB,CACT,CAEA,SAAgB,EAAU,EAAmB,EAAY,GAEvD,GAjBF,WACE,GAAI,SAAS,eAAe,eAAgB,OAC5C,MAAM,EAAQ,SAAS,cAAc,SACrC,EAAM,GAAK,cACX,EAAM,YAAc,g/CACpB,SAAS,KAAK,OAAO,EACvB,CAUE,GACkB,UAAd,EAAK,KAAkB,CACzB,MAAM,EAAM,EAAW,EAAK,MAC5B,IAAK,EAGH,YAFA,EAAK,UACH,qGAGJ,MAAM,EAAQ,SAAS,cAAc,UAWrC,OAVA,EAAM,UAAY,WAClB,EAAM,IAAM,EACZ,EAAM,MAAQ,EAAK,MAAQ,EAAK,MAAM,OAAS,QAC/C,EAAM,MAAQ,2CACd,EAAM,eAAiB,kCACvB,EAAM,aACJ,UACA,wEAEF,EAAK,OAAO,EAEd,CACA,MAAM,EAAO,EAAc,EAAK,MAC1B,EAAQ,EAAK,MAAM,QAAU,EAAO,EAAY,GAAQ,EAAK,MAAQ,QACrE,EAAO,EAAG,MAAO,WACjB,EAAQ,EAAG,MAAO,iBAClB,EAAS,EAAK,MAAQ,EAAI,MAAM,EAAK,YAAS,EACpD,GAAI,EAAQ,CACV,MAAM,EAAM,EAAG,MAAO,IACtB,EAAI,WAAY,EAChB,EAAI,IAAM,GACV,EAAI,IAAM,EAAO,IACjB,EAAM,OAAO,EACf,MAAO,EAAM,OAAO,EAAG,OAAQ,eAAgB,EAAM,OAAO,MAAM,EAAG,GAAG,eAAiB,MACzF,MAAM,EAAO,EAAG,IAAK,eAAgB,QACjC,GACF,EAAK,KAAO,EACZ,EAAK,OAAS,SACd,EAAK,IAAM,uBACN,EAAK,aAAa,gBAAiB,QAC1C,MAAM,EAAM,EAAG,MAAO,cAAe,EAAO,EAAW,GAAQ,IAC/D,EAAI,QAAU,EACd,MAAM,EAAO,EAAG,MAAO,gBACvB,EAAK,OAAO,EAAG,MAAO,gBAAiB,GAAQ,EAAK,GACpD,EAAK,OAAO,EAAO,GACnB,EAAK,OAAO,EACd"}
1
+ {"version":3,"file":"cards-DF0uI4-I.js","names":[],"sources":["../../src/stage/cards.ts"],"sourcesContent":["import { normalizeHref, videoEmbed } from '../core/links';\nimport { displayUrl, prettyTitle } from '../core/paste';\nimport type { AnnieDoc, Item } from '../core/types';\n\n/** Injected once from this async chunk so video/link rules stay out of the 100 KiB editor CSS. */\nfunction ensureCss() {\n if (document.getElementById('ad-card-css')) return;\n const style = document.createElement('style');\n style.id = 'ad-card-css';\n style.textContent = `.ad-video{display:block;width:100%;height:100%;border:0;pointer-events:none;background:#103639}.ad-item[data-ad-interactive=true] .ad-video{pointer-events:auto}.ad-link{display:flex;flex-direction:column;height:100%;min-width:0;min-height:0;overflow:hidden;container-type:size;background:var(--ad-paper,#fff);color:var(--ad-ink,#103639)}.ad-link-media{position:relative;flex:1 1 46%;min-height:0;background:#8f93f914}.ad-link-media img{width:100%;height:100%;object-fit:cover}.ad-link-mark{position:absolute;inset:0;display:grid;place-items:center;color:#8f93f9;font-size:36px;font-weight:800}.ad-link-body{display:flex;flex:0 0 auto;flex-direction:column;gap:4px;min-width:0;padding:10px 12px 12px}.ad-link-title,.ad-link-url{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.ad-link-title{font-size:15px;font-weight:800}.ad-link-url{color:#606062;font-size:12px}.ad-root[data-theme=dark] .ad-link-url{color:#b6c5c1}.ad-link-open{flex:0 0 auto;align-self:start;margin-top:2px;padding:5px 10px;border-radius:999px;background:#05d9ab;color:#103639;font-size:11px;font-weight:800;text-decoration:none;pointer-events:auto}@container (max-height:160px){.ad-link-media{flex-basis:34%}.ad-link-body{padding:8px 10px 10px}.ad-link-title{font-size:13px}.ad-link-url{font-size:11px}}@container (max-height:118px){.ad-link-media{display:none}.ad-link-open{padding:4px 8px}}@container (max-width:150px){.ad-link-title{font-size:12px}.ad-link-url{font-size:10px}.ad-link-open{padding:4px 8px;font-size:10px}}`;\n document.head.append(style);\n}\n\nfunction el<K extends keyof HTMLElementTagNameMap>(tag: K, cls: string, text?: string) {\n const node = document.createElement(tag);\n if (cls) node.className = cls;\n if (text) node.textContent = text;\n return node;\n}\n\nexport function paintCard(root: HTMLElement, item: Item, doc: AnnieDoc) {\n ensureCss();\n if (item.kind === 'video') {\n const src = videoEmbed(item.href);\n if (!src) {\n root.innerHTML =\n '<div class=\"ad-placeholder\"><span aria-hidden=\"true\">◇</span><span>Video unavailable</span></div>';\n return;\n }\n const frame = document.createElement('iframe');\n frame.className = 'ad-video';\n frame.src = src;\n frame.title = item.name ?? item.text?.value ?? 'Video';\n frame.allow = 'autoplay; fullscreen; picture-in-picture';\n frame.referrerPolicy = 'strict-origin-when-cross-origin';\n frame.setAttribute(\n 'sandbox',\n 'allow-scripts allow-same-origin allow-presentation allow-popups',\n );\n root.append(frame);\n return;\n }\n const href = normalizeHref(item.href);\n const title = item.text?.value || (href ? prettyTitle(href) : item.name || 'Link');\n const card = el('div', 'ad-link');\n const media = el('div', 'ad-link-media');\n const record = item.media ? doc.media[item.media] : undefined;\n if (record) {\n const img = el('img', '');\n img.draggable = false;\n img.alt = '';\n img.src = record.src;\n media.append(img);\n } else media.append(el('span', 'ad-link-mark', title.trim().slice(0, 1).toUpperCase() || '•'));\n const open = el('a', 'ad-link-open', 'Open');\n if (href) {\n open.href = href;\n open.target = '_blank';\n open.rel = 'noopener noreferrer';\n } else open.setAttribute('aria-disabled', 'true');\n const url = el('div', 'ad-link-url', href ? displayUrl(href) : '');\n url.hidden = !href;\n const body = el('div', 'ad-link-body');\n body.append(el('div', 'ad-link-title', title), url, open);\n card.append(media, body);\n root.append(card);\n}\n"],"mappings":"+FAaA,SAAS,EAA0C,EAAQ,EAAa,GACtE,MAAM,EAAO,SAAS,cAAc,GAGpC,OAFI,IAAK,EAAK,UAAY,GACtB,IAAM,EAAK,YAAc,GACtB,CACT,CAEA,SAAgB,EAAU,EAAmB,EAAY,GAEvD,GAjBF,WACE,GAAI,SAAS,eAAe,eAAgB,OAC5C,MAAM,EAAQ,SAAS,cAAc,SACrC,EAAM,GAAK,cACX,EAAM,YAAc,g/CACpB,SAAS,KAAK,OAAO,EACvB,CAUE,GACkB,UAAd,EAAK,KAAkB,CACzB,MAAM,EAAM,EAAW,EAAK,MAC5B,IAAK,EAGH,YAFA,EAAK,UACH,qGAGJ,MAAM,EAAQ,SAAS,cAAc,UAWrC,OAVA,EAAM,UAAY,WAClB,EAAM,IAAM,EACZ,EAAM,MAAQ,EAAK,MAAQ,EAAK,MAAM,OAAS,QAC/C,EAAM,MAAQ,2CACd,EAAM,eAAiB,kCACvB,EAAM,aACJ,UACA,wEAEF,EAAK,OAAO,EAEd,CACA,MAAM,EAAO,EAAc,EAAK,MAC1B,EAAQ,EAAK,MAAM,QAAU,EAAO,EAAY,GAAQ,EAAK,MAAQ,QACrE,EAAO,EAAG,MAAO,WACjB,EAAQ,EAAG,MAAO,iBAClB,EAAS,EAAK,MAAQ,EAAI,MAAM,EAAK,YAAS,EACpD,GAAI,EAAQ,CACV,MAAM,EAAM,EAAG,MAAO,IACtB,EAAI,WAAY,EAChB,EAAI,IAAM,GACV,EAAI,IAAM,EAAO,IACjB,EAAM,OAAO,EACf,MAAO,EAAM,OAAO,EAAG,OAAQ,eAAgB,EAAM,OAAO,MAAM,EAAG,GAAG,eAAiB,MACzF,MAAM,EAAO,EAAG,IAAK,eAAgB,QACjC,GACF,EAAK,KAAO,EACZ,EAAK,OAAS,SACd,EAAK,IAAM,uBACN,EAAK,aAAa,gBAAiB,QAC1C,MAAM,EAAM,EAAG,MAAO,cAAe,EAAO,EAAW,GAAQ,IAC/D,EAAI,QAAU,EACd,MAAM,EAAO,EAAG,MAAO,gBACvB,EAAK,OAAO,EAAG,MAAO,gBAAiB,GAAQ,EAAK,GACpD,EAAK,OAAO,EAAO,GACnB,EAAK,OAAO,EACd"}
@@ -1,2 +1,2 @@
1
- import{c as t,d as e,l as i,o as r,u as n}from"./picker-Dv_i4iNP.js";function s(t){const e=t.match(/image\/([a-z]+)|[.](png|jpe?g|gif|webp|avif)(?:$|[?#])/i),i=(e?.[1]??e?.[2]??"jpeg").toLowerCase();return`image/${"jpg"===i?"jpeg":i}`}var a=/\.(png|jpe?g|gif|webp|avif)$/i,o=/^[\w-]+(\.[\w-]+)+([/:?#]|$)/,c={nbsp:" ",amp:"&",quot:'"',apos:"'",lt:"<",gt:">"};function p(t){return t.replace(/&(#x?[\da-f]+|nbsp|amp|quot|apos|#39|lt|gt);/gi,(t,e)=>"#"===e[0]?String.fromCodePoint("x"===e[1]||"X"===e[1]?parseInt(e.slice(2),16):+e.slice(1)):c[e.toLowerCase()]??t)}function l(t){let i=t.trim();/^<.*>$/.test(i)&&(i=i.slice(1,-1).trim());const s=i.match(/https?:\/\/[^\s<>"']+/i)?.[0];s?i=s.replace(/&amp;/g,"&"):r.test(i)?i=i.replace(/\s+/g,""):o.test(i)&&!/\s/.test(i)&&(i=`https://${i}`);const c=/\s/.test(i)&&!i.startsWith("data:")?void 0:n(i);if(!c)return{kind:"text",value:t};const p=e(c);if(p)return{kind:"video",href:c,video:p};try{if(r.test(c)||a.test(new URL(c).pathname))return{kind:"image",href:c}}catch{}return{kind:"link",href:c}}function f(t,e){for(const i of t.match(/<meta\b[^>]*>/gi)??[]){if(!new RegExp(`(?:property|name|itemprop)\\s*=\\s*["']${e}["']`,"i").test(i))continue;const t=i.match(/\bcontent\s*=\s*["']([^"']*)["']/i)?.[1];if(t)return p(t.trim())}}function u(t,e){const r=f(t,"og:title")??f(t,"twitter:title")??p(t.match(/<title[^>]*>([^<]*)<\/title>/i)?.[1]?.trim()??""),s=f(t,"og:description")??f(t,"twitter:description")??f(t,"description");let a=f(t,"og:image")??f(t,"og:image:secure_url")??f(t,"twitter:image")??f(t,"twitter:image:src");if(a)try{a=n(new URL(a,e).href)}catch{a=void 0}return!a||a.startsWith("data:")||i(a)||(a=void 0),{...r?{title:r.slice(0,200)}:{},...s?{description:s.slice(0,400)}:{},...a?{image:a}:{}}}async function m(t){const e=n(t);if(e&&!e.startsWith("data:")&&"function"==typeof fetch&&i(e))try{const t=await fetch(e,{credentials:"omit",headers:{Accept:"text/html"},redirect:"follow",signal:AbortSignal.timeout(4e3)}),r=t.headers.get("content-type")??"";if(!t.ok||r&&!/html|xml/i.test(r))return;if(!i(t.url||e))return;return u((await t.text()).slice(0,2e5),t.url||e)}catch{return}}function g(e){try{const i=new URL(e),r=decodeURIComponent(i.pathname).replace(/\/$/,"");return`${t(e)}${r}`}catch{return e.replace(/^https?:\/\//,"").replace(/\/$/,"")}}function h(e){const i=t(e).split(".")[0]??"";return i?i[0].toUpperCase()+i.slice(1):t(e)}function d(e){return{title:h(e),description:g(e),host:t(e)}}export{d as a,m as c,s as i,p as n,u as o,g as r,h as s,l as t};
2
- //# sourceMappingURL=paste-C22i8o-g.js.map
1
+ import{c as t,d as e,l as i,o as r,u as n}from"./picker-DZpEpkED.js";function s(t){const e=t.match(/image\/([a-z]+)|[.](png|jpe?g|gif|webp|avif)(?:$|[?#])/i),i=(e?.[1]??e?.[2]??"jpeg").toLowerCase();return`image/${"jpg"===i?"jpeg":i}`}var a=/\.(png|jpe?g|gif|webp|avif)$/i,o=/^[\w-]+(\.[\w-]+)+([/:?#]|$)/,c={nbsp:" ",amp:"&",quot:'"',apos:"'",lt:"<",gt:">"};function p(t){return t.replace(/&(#x?[\da-f]+|nbsp|amp|quot|apos|#39|lt|gt);/gi,(t,e)=>"#"===e[0]?String.fromCodePoint("x"===e[1]||"X"===e[1]?parseInt(e.slice(2),16):+e.slice(1)):c[e.toLowerCase()]??t)}function l(t){let i=t.trim();/^<.*>$/.test(i)&&(i=i.slice(1,-1).trim());const s=i.match(/https?:\/\/[^\s<>"']+/i)?.[0];s?i=s.replace(/&amp;/g,"&"):r.test(i)?i=i.replace(/\s+/g,""):o.test(i)&&!/\s/.test(i)&&(i=`https://${i}`);const c=/\s/.test(i)&&!i.startsWith("data:")?void 0:n(i);if(!c)return{kind:"text",value:t};const p=e(c);if(p)return{kind:"video",href:c,video:p};try{if(r.test(c)||a.test(new URL(c).pathname))return{kind:"image",href:c}}catch{}return{kind:"link",href:c}}function f(t,e){for(const i of t.match(/<meta\b[^>]*>/gi)??[]){if(!new RegExp(`(?:property|name|itemprop)\\s*=\\s*["']${e}["']`,"i").test(i))continue;const t=i.match(/\bcontent\s*=\s*["']([^"']*)["']/i)?.[1];if(t)return p(t.trim())}}function u(t,e){const r=f(t,"og:title")??f(t,"twitter:title")??p(t.match(/<title[^>]*>([^<]*)<\/title>/i)?.[1]?.trim()??""),s=f(t,"og:description")??f(t,"twitter:description")??f(t,"description");let a=f(t,"og:image")??f(t,"og:image:secure_url")??f(t,"twitter:image")??f(t,"twitter:image:src");if(a)try{a=n(new URL(a,e).href)}catch{a=void 0}return!a||a.startsWith("data:")||i(a)||(a=void 0),{...r?{title:r.slice(0,200)}:{},...s?{description:s.slice(0,400)}:{},...a?{image:a}:{}}}async function m(t){const e=n(t);if(e&&!e.startsWith("data:")&&"function"==typeof fetch&&i(e))try{const t=await fetch(e,{credentials:"omit",headers:{Accept:"text/html"},redirect:"follow",signal:AbortSignal.timeout(4e3)}),r=t.headers.get("content-type")??"";if(!t.ok||r&&!/html|xml/i.test(r))return;if(!i(t.url||e))return;return u((await t.text()).slice(0,2e5),t.url||e)}catch{return}}function g(e){try{const i=new URL(e),r=decodeURIComponent(i.pathname).replace(/\/$/,"");return`${t(e)}${r}`}catch{return e.replace(/^https?:\/\//,"").replace(/\/$/,"")}}function h(e){const i=t(e).split(".")[0]??"";return i?i[0].toUpperCase()+i.slice(1):t(e)}function d(e){return{title:h(e),description:g(e),host:t(e)}}export{d as a,m as c,s as i,p as n,u as o,g as r,h as s,l as t};
2
+ //# sourceMappingURL=paste-B8nZA2Gh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paste-C22i8o-g.js","names":[],"sources":["../../src/core/paste.ts"],"sourcesContent":["import {\n hostnameOf,\n IMAGE_DATA_URL,\n isPublicHttpUrl,\n normalizeHref,\n parseVideo,\n type LinkPreview,\n type VideoRef,\n} from './links';\n\nexport function imageMime(href: string): string {\n const ext = href.match(/image\\/([a-z]+)|[.](png|jpe?g|gif|webp|avif)(?:$|[?#])/i);\n const token = (ext?.[1] ?? ext?.[2] ?? 'jpeg').toLowerCase();\n return `image/${token === 'jpg' ? 'jpeg' : token}`;\n}\n\nexport type PastedContent =\n | { kind: 'video'; href: string; video: VideoRef }\n | { kind: 'image'; href: string }\n | { kind: 'link'; href: string }\n | { kind: 'text'; value: string };\n\nconst IMAGE = /\\.(png|jpe?g|gif|webp|avif)$/i;\nconst SITE = /^[\\w-]+(\\.[\\w-]+)+([/:?#]|$)/;\nconst NAMED: Record<string, string> = {\n nbsp: ' ',\n amp: '&',\n quot: '\"',\n apos: \"'\",\n lt: '<',\n gt: '>',\n};\n\nexport function decodeEntities(value: string): string {\n return value.replace(/&(#x?[\\da-f]+|nbsp|amp|quot|apos|#39|lt|gt);/gi, (all, token: string) => {\n if (token[0] === '#')\n return String.fromCodePoint(\n token[1] === 'x' || token[1] === 'X' ? parseInt(token.slice(2), 16) : +token.slice(1),\n );\n return NAMED[token.toLowerCase()] ?? all;\n });\n}\n\nexport function classifyPaste(value: string): PastedContent {\n let text = value.trim();\n if (/^<.*>$/.test(text)) text = text.slice(1, -1).trim();\n const found = text.match(/https?:\\/\\/[^\\s<>\"']+/i)?.[0];\n if (found) text = found.replace(/&amp;/g, '&');\n else if (IMAGE_DATA_URL.test(text)) text = text.replace(/\\s+/g, '');\n else if (SITE.test(text) && !/\\s/.test(text)) text = `https://${text}`;\n const href = /\\s/.test(text) && !text.startsWith('data:') ? undefined : normalizeHref(text);\n if (!href) return { kind: 'text', value };\n const video = parseVideo(href);\n if (video) return { kind: 'video', href, video };\n try {\n if (IMAGE_DATA_URL.test(href) || IMAGE.test(new URL(href).pathname))\n return { kind: 'image', href };\n } catch {\n /* Invalid URL is treated as a link or plain text above. */\n }\n return { kind: 'link', href };\n}\n\nfunction meta(html: string, name: string): string | undefined {\n for (const tag of html.match(/<meta\\b[^>]*>/gi) ?? []) {\n if (!new RegExp(`(?:property|name|itemprop)\\\\s*=\\\\s*[\"']${name}[\"']`, 'i').test(tag)) continue;\n const content = tag.match(/\\bcontent\\s*=\\s*[\"']([^\"']*)[\"']/i)?.[1];\n if (content) return decodeEntities(content.trim());\n }\n}\n\nexport function parseLinkPreview(html: string, base: string): LinkPreview {\n const title =\n meta(html, 'og:title') ??\n meta(html, 'twitter:title') ??\n decodeEntities(html.match(/<title[^>]*>([^<]*)<\\/title>/i)?.[1]?.trim() ?? '');\n const description =\n meta(html, 'og:description') ?? meta(html, 'twitter:description') ?? meta(html, 'description');\n let image =\n meta(html, 'og:image') ??\n meta(html, 'og:image:secure_url') ??\n meta(html, 'twitter:image') ??\n meta(html, 'twitter:image:src');\n if (image)\n try {\n image = normalizeHref(new URL(image, base).href);\n } catch {\n image = undefined;\n }\n if (image && !image.startsWith('data:') && !isPublicHttpUrl(image)) image = undefined;\n return {\n ...(title ? { title: title.slice(0, 200) } : {}),\n ...(description ? { description: description.slice(0, 400) } : {}),\n ...(image ? { image } : {}),\n };\n}\n\nexport async function unfurlPage(href: string): Promise<LinkPreview | undefined> {\n const url = normalizeHref(href);\n if (!url || url.startsWith('data:') || typeof fetch !== 'function' || !isPublicHttpUrl(url))\n return;\n try {\n const response = await fetch(url, {\n credentials: 'omit',\n headers: { Accept: 'text/html' },\n redirect: 'follow',\n signal: AbortSignal.timeout(4000),\n });\n const type = response.headers.get('content-type') ?? '';\n if (!response.ok || (type && !/html|xml/i.test(type))) return;\n if (!isPublicHttpUrl(response.url || url)) return;\n return parseLinkPreview((await response.text()).slice(0, 200000), response.url || url);\n } catch {\n return;\n }\n}\n\nexport function displayUrl(href: string): string {\n try {\n const url = new URL(href);\n const path = decodeURIComponent(url.pathname).replace(/\\/$/, '');\n return `${hostnameOf(href)}${path}`;\n } catch {\n return href.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n }\n}\n\nexport function prettyTitle(href: string): string {\n const name = hostnameOf(href).split('.')[0] ?? '';\n return name ? name[0].toUpperCase() + name.slice(1) : hostnameOf(href);\n}\n\nexport function linkFallback(href: string): { title: string; description: string; host: string } {\n return { title: prettyTitle(href), description: displayUrl(href), host: hostnameOf(href) };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"paste-B8nZA2Gh.js","names":[],"sources":["../../src/core/paste.ts"],"sourcesContent":["import {\n hostnameOf,\n IMAGE_DATA_URL,\n isPublicHttpUrl,\n normalizeHref,\n parseVideo,\n type LinkPreview,\n type VideoRef,\n} from './links';\n\nexport function imageMime(href: string): string {\n const ext = href.match(/image\\/([a-z]+)|[.](png|jpe?g|gif|webp|avif)(?:$|[?#])/i);\n const token = (ext?.[1] ?? ext?.[2] ?? 'jpeg').toLowerCase();\n return `image/${token === 'jpg' ? 'jpeg' : token}`;\n}\n\nexport type PastedContent =\n | { kind: 'video'; href: string; video: VideoRef }\n | { kind: 'image'; href: string }\n | { kind: 'link'; href: string }\n | { kind: 'text'; value: string };\n\nconst IMAGE = /\\.(png|jpe?g|gif|webp|avif)$/i;\nconst SITE = /^[\\w-]+(\\.[\\w-]+)+([/:?#]|$)/;\nconst NAMED: Record<string, string> = {\n nbsp: ' ',\n amp: '&',\n quot: '\"',\n apos: \"'\",\n lt: '<',\n gt: '>',\n};\n\nexport function decodeEntities(value: string): string {\n return value.replace(/&(#x?[\\da-f]+|nbsp|amp|quot|apos|#39|lt|gt);/gi, (all, token: string) => {\n if (token[0] === '#')\n return String.fromCodePoint(\n token[1] === 'x' || token[1] === 'X' ? parseInt(token.slice(2), 16) : +token.slice(1),\n );\n return NAMED[token.toLowerCase()] ?? all;\n });\n}\n\nexport function classifyPaste(value: string): PastedContent {\n let text = value.trim();\n if (/^<.*>$/.test(text)) text = text.slice(1, -1).trim();\n const found = text.match(/https?:\\/\\/[^\\s<>\"']+/i)?.[0];\n if (found) text = found.replace(/&amp;/g, '&');\n else if (IMAGE_DATA_URL.test(text)) text = text.replace(/\\s+/g, '');\n else if (SITE.test(text) && !/\\s/.test(text)) text = `https://${text}`;\n const href = /\\s/.test(text) && !text.startsWith('data:') ? undefined : normalizeHref(text);\n if (!href) return { kind: 'text', value };\n const video = parseVideo(href);\n if (video) return { kind: 'video', href, video };\n try {\n if (IMAGE_DATA_URL.test(href) || IMAGE.test(new URL(href).pathname))\n return { kind: 'image', href };\n } catch {\n /* Invalid URL is treated as a link or plain text above. */\n }\n return { kind: 'link', href };\n}\n\nfunction meta(html: string, name: string): string | undefined {\n for (const tag of html.match(/<meta\\b[^>]*>/gi) ?? []) {\n if (!new RegExp(`(?:property|name|itemprop)\\\\s*=\\\\s*[\"']${name}[\"']`, 'i').test(tag)) continue;\n const content = tag.match(/\\bcontent\\s*=\\s*[\"']([^\"']*)[\"']/i)?.[1];\n if (content) return decodeEntities(content.trim());\n }\n}\n\nexport function parseLinkPreview(html: string, base: string): LinkPreview {\n const title =\n meta(html, 'og:title') ??\n meta(html, 'twitter:title') ??\n decodeEntities(html.match(/<title[^>]*>([^<]*)<\\/title>/i)?.[1]?.trim() ?? '');\n const description =\n meta(html, 'og:description') ?? meta(html, 'twitter:description') ?? meta(html, 'description');\n let image =\n meta(html, 'og:image') ??\n meta(html, 'og:image:secure_url') ??\n meta(html, 'twitter:image') ??\n meta(html, 'twitter:image:src');\n if (image)\n try {\n image = normalizeHref(new URL(image, base).href);\n } catch {\n image = undefined;\n }\n if (image && !image.startsWith('data:') && !isPublicHttpUrl(image)) image = undefined;\n return {\n ...(title ? { title: title.slice(0, 200) } : {}),\n ...(description ? { description: description.slice(0, 400) } : {}),\n ...(image ? { image } : {}),\n };\n}\n\nexport async function unfurlPage(href: string): Promise<LinkPreview | undefined> {\n const url = normalizeHref(href);\n if (!url || url.startsWith('data:') || typeof fetch !== 'function' || !isPublicHttpUrl(url))\n return;\n try {\n const response = await fetch(url, {\n credentials: 'omit',\n headers: { Accept: 'text/html' },\n redirect: 'follow',\n signal: AbortSignal.timeout(4000),\n });\n const type = response.headers.get('content-type') ?? '';\n if (!response.ok || (type && !/html|xml/i.test(type))) return;\n if (!isPublicHttpUrl(response.url || url)) return;\n return parseLinkPreview((await response.text()).slice(0, 200000), response.url || url);\n } catch {\n return;\n }\n}\n\nexport function displayUrl(href: string): string {\n try {\n const url = new URL(href);\n const path = decodeURIComponent(url.pathname).replace(/\\/$/, '');\n return `${hostnameOf(href)}${path}`;\n } catch {\n return href.replace(/^https?:\\/\\//, '').replace(/\\/$/, '');\n }\n}\n\nexport function prettyTitle(href: string): string {\n const name = hostnameOf(href).split('.')[0] ?? '';\n return name ? name[0].toUpperCase() + name.slice(1) : hostnameOf(href);\n}\n\nexport function linkFallback(href: string): { title: string; description: string; host: string } {\n return { title: prettyTitle(href), description: displayUrl(href), host: hostnameOf(href) };\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as t,b as e,c as i,f as n,g as r,i as o,l as s,o as a,s as d}from"./defaults-C-aC_B4z.js";import{A as c,E as h,M as f,N as l,R as p,S as u,T as m,_ as g,c as v,g as w,h as x,i as y,l as b,n as M,r as E,s as k,t as $,v as S,w as O,y as X}from"./describe-DaWyf3qV.js";var Y,j=Symbol.for("preact-signals");function _(){if(N>1)N--;else{var t,e=!1;for(!function(){var t=R;for(R=void 0;void 0!==t;){var e=t.S;if(e.v===t.v)for(var i=e.t;void 0!==i;i=i.x)i.i===t.i&&(i.i=e.i);t=t.o}}();void 0!==I;){var i=I;for(I=void 0,L++;void 0!==i;){var n=i.u;if(i.u=void 0,i.f&=-3,!(8&i.f)&&W(i))try{i.c()}catch(i){e||(t=i,e=!0)}i=n}}if(L=0,N--,e)throw t}}var B=void 0;function A(t){var e=B,i=Y;B=void 0,Y=void 0;try{return t()}finally{B=e,Y=i}}var I=void 0,N=0,L=0,D=0,T=0,R=void 0,U=0;function P(t){if(void 0!==B){var e=t.n;if(void 0===e||e.t!==B)return e={i:0,S:t,p:B.s,n:void 0,t:B,e:void 0,x:void 0,r:e},void 0!==B.s&&(B.s.n=e),B.s=e,t.n=e,32&B.f&&t.S(e),e;if(-1===e.i)return e.i=0,void 0!==e.n&&(e.n.p=e.p,void 0!==e.p&&(e.p.n=e.n),e.p=B.s,e.n=void 0,B.s.n=e,B.s=e),e}}function z(t,e){this.v=t,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=null==e?void 0:e.watched,this.Z=null==e?void 0:e.unwatched,this.name=null==e?void 0:e.name}function H(t,e){return new z(t,e)}function W(t){for(var e=t.s;void 0!==e;e=e.n)if(e.S.i!==e.i||!e.S.h()||e.S.i!==e.i)return!0;return!1}function C(t){for(var e=t.s;void 0!==e;e=e.n){var i=e.S.n;if(void 0!==i&&(e.r=i),e.S.n=e,e.i=-1,void 0===e.n){t.s=e;break}}}function J(t){for(var e=t.s,i=void 0;void 0!==e;){var n=e.p;-1===e.i?(e.S.U(e),void 0!==n&&(n.n=e.n),void 0!==e.n&&(e.n.p=n)):i=e,e.S.n=e.r,void 0!==e.r&&(e.r=void 0),e=n}t.s=i}function q(t,e){z.call(this,void 0,e),this.x=t,this.s=void 0,this.g=U-1,this.f=4}function G(t){var e=t.m;if(t.m=void 0,"function"==typeof e){N++;var i=B;B=void 0;try{e()}catch(_){throw t.f&=-2,t.f|=8,V(t),_}finally{B=i,_()}}}function V(t){for(var e=t.s;void 0!==e;e=e.n)e.S.U(e);t.x=void 0,t.s=void 0,G(t)}function F(t){if(B!==this)throw new Error("Out-of-order effect");J(this),B=t,this.f&=-2,8&this.f&&V(this),_()}function Z(t,e){this.x=t,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=null==e?void 0:e.name,Y&&Y.push(this)}z.prototype.brand=j,z.prototype.h=function(){return!0},z.prototype.S=function(t){var e=this,i=this.t;i!==t&&void 0===t.e&&(t.x=i,this.t=t,void 0!==i?i.e=t:A(function(){var t;null==(t=e.W)||t.call(e)}))},z.prototype.U=function(t){var e=this;if(void 0!==this.t){var i=t.e,n=t.x;void 0!==i&&(i.x=n,t.e=void 0),void 0!==n&&(n.e=i,t.x=void 0),t===this.t&&(this.t=n,void 0===n&&A(function(){var t;null==(t=e.Z)||t.call(e)}))}},z.prototype.subscribe=function(t){var e=this;return function(t,e){var i=new Z(t,e);try{i.c()}catch(t){throw i.d(),t}var n=i.d.bind(i);return n[Symbol.dispose]=n,n}(function(){var i=e.value;A(function(){return t(i)})},{name:"sub"})},z.prototype.valueOf=function(){return this.value},z.prototype.toString=function(){return this.value+""},z.prototype.toJSON=function(){return this.value},z.prototype.peek=function(){var t=this;return A(function(){return t.value})},Object.defineProperty(z.prototype,"value",{get:function(){var t=P(this);return void 0!==t&&(t.i=this.i),this.v},set:function(t){if(t!==this.v){if(L>100)throw new Error("Cycle detected");!function(t){0!==N&&0===L&&t.l!==T&&(t.l=T,R={S:t,v:t.v,i:t.i,o:R})}(this),this.v=t,this.i++,U++,N++;try{for(var e=this.t;void 0!==e;e=e.x)e.t.N()}finally{_()}}}}),q.prototype=new z,q.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if(32==(36&this.f))return!0;if(this.f&=-5,this.g===U)return!0;if(this.g=U,this.f|=1,this.i>0&&!W(this))return this.f&=-2,!0;var t=B;try{C(this),B=this;var e=this.x();(16&this.f||this.v!==e||0===this.i)&&(this.v=e,this.f&=-17,this.i++)}catch(t){this.v=t,this.f|=16,this.i++}return B=t,J(this),this.f&=-2,!0},q.prototype.S=function(t){if(void 0===this.t){this.f|=36;for(var e=this.s;void 0!==e;e=e.n)e.S.S(e)}z.prototype.S.call(this,t)},q.prototype.U=function(t){if(void 0!==this.t&&(z.prototype.U.call(this,t),void 0===this.t)){this.f&=-33;for(var e=this.s;void 0!==e;e=e.n)e.S.U(e)}},q.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var t=this.t;void 0!==t;t=t.x)t.t.N()}},Object.defineProperty(q.prototype,"value",{get:function(){if(1&this.f)throw new Error("Cycle detected");var t=P(this);if(this.h(),void 0!==t&&(t.i=this.i),16&this.f)throw this.v;return this.v}}),Z.prototype.c=function(){var t=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var e=this.x();"function"==typeof e&&(this.m=e)}finally{t()}},Z.prototype.S=function(){if(1&this.f)throw new Error("Cycle detected");this.f|=1,this.f&=-9,G(this),C(this),N++;var t=B;return B=this,F.bind(this,t)},Z.prototype.N=function(){2&this.f||(this.f|=2,this.u=I,I=this)},Z.prototype.d=function(){this.f|=8,1&this.f||V(this)},Z.prototype.dispose=function(){this.d()};var K={1:t=>({...t,format:"anniedrawing",version:1,media:t.media??{},meta:t.meta??{title:"Untitled board"}}),2:t=>{const{sheets:e,...i}=t,n=e??t.pages;return{...i,version:2,pages:Array.isArray(n)?n.map(t=>({...t,name:"string"==typeof t.name&&/^Sheet [1-9]\d*$/.test(t.name)?t.name.replace(/^Sheet /,"Page "):t.name})):n}}};function Q(e,i={}){if(!e||"object"!=typeof e)throw new Error("A drawing must be a JSON object.");let n=t(e);if(void 0!==n.format&&"anniedrawing"!==n.format)throw new Error("This is not an AnnieDrawing document.");const r=n.version??0;if("number"!=typeof r||!Number.isInteger(r)||r<0)throw new Error("Invalid drawing version.");if(r>2)throw new Error(`Drawing version ${r} is newer than supported version 2.`);for(let t=r+1;t<=2;t++)n=K[t](n);const o=n;return Array.isArray(o.pages)&&(o.pages=function(t){const e=new Set(g(t.flatMap(t=>t.items??[])).map(t=>t.id)),i=t=>{let i=t;for(let n=2;e.has(i);n++)i=`${t}_${n}`;return e.add(i),i},n=t=>{const e=t.children?.map(n);if("frame"!==t.kind)return{...t,...e?{children:e}:{}};const{clip:r,title:o,text:s,style:a,...d}=t,c={x:t.x??0,y:t.y??0,w:t.w??600,h:t.h??400},h=[{kind:"rect",id:i(`${t.id}_background`),...c,rotation:t.rotation,style:{fill:"paper",strokeWidth:1.5,...a},...s?{text:s}:{}}],f="string"==typeof o?o:t.name;return f&&h.push({kind:"text",id:i(`${t.id}_label`),x:c.x,y:c.y-30,w:c.w,h:20,text:{value:f,size:14,align:"start",valign:"top"}}),{...d,...c,kind:"group",name:t.name??f,children:[...h,...e??[]]}};return t.map(t=>({...t,items:Array.isArray(t.items)?t.items.map(n):t.items}))}(o.pages).map(t=>({...t,items:Array.isArray(t.items)?t.items.map(t=>s(t,i)):t.items}))),o}var tt=/^[\w-]{11}$/,et=/^data:image\/(png|jpeg|gif|webp|avif);base64,[a-z0-9+/=\s]+$/i,it=/^data:image\/(png|jpeg|gif|webp|avif|svg\+xml);base64,[a-z0-9+/=\s]+$/i;function nt(t){if("string"!=typeof t)return;const e=t.trim();if(et.test(e))return e.replace(/\s+/g,"");try{const t=new URL(e);if("http:"!==t.protocol&&"https:"!==t.protocol)return;return t.username=t.password="",t.href}catch{return}}function rt(t){try{const e=new URL(t);return("http:"===e.protocol||"https:"===e.protocol)&&(!e.username&&!e.password&&!function(t){const e=t.replace(/^\[|\]$/g,"").replace(/\.+$/,"").toLowerCase();if("localhost"===e||"0.0.0.0"===e||"::"===e||e.endsWith(".localhost")||e.endsWith(".local")||e.endsWith(".internal"))return!0;const i=e.match(/^(\d{1,3}(?:\.\d{1,3}){3})(?:\.|$)/);if(i&&ot(i[1]))return!0;const n=function(t){if(/^\d{1,3}(?:\.\d{1,3}){3}$/.test(t))return t;const e=at(t);return e?st(e):void 0}(e);if(n)return ot(n);const r=at(e);if(!r)return!1;if(r.every(t=>0===t))return!0;if(1===r[7]&&r.slice(0,7).every(t=>0===t))return!0;if(65152==(65472&r[0])||64512==(65024&r[0])||!(65280&~r[0]))return!0;const o=st(r);return!!o&&ot(o)}(e.hostname))}catch{return!1}}function ot(t){const e=t.split(".").map(Number);if(4!==e.length||e.some(t=>t>255))return!1;const[i,n]=e;return 0===i||10===i||127===i||(169===i&&254===n||(192===i&&168===n||(172===i&&n>=16&&n<=31||(100===i&&n>=64&&n<=127||(198===i&&(18===n||19===n)||i>=224)))))}function st(t){const e=`${t[6]>>8&255}.${255&t[6]}.${t[7]>>8&255}.${255&t[7]}`;return 0===t[0]&&0===t[1]&&0===t[2]&&0===t[3]&&0===t[4]&&65535===t[5]||100===t[0]&&65435===t[1]&&t.slice(2,6).every(t=>0===t)?e:void 0}function at(t){if(!t.includes(":"))return;let e=t;const i=e.match(/:(\d{1,3}(?:\.\d{1,3}){3})$/);if(i){const[t,n,r,o]=i[1].split(".").map(Number);if([t,n,r,o].some(t=>t>255))return;e=`${e.slice(0,-i[1].length)}${t<<8|n}:${r<<8|o}`}const n=e.split("::");if(n.length>2)return;const r=t=>t?t.split(":").filter(Boolean).map(t=>/^[0-9a-f]{1,4}$/i.test(t)?parseInt(t,16):NaN):[],o=r(n[0]),s=2===n.length?r(n[1]):[];if(o.some(Number.isNaN)||s.some(Number.isNaN))return;if(1===n.length)return 8===o.length?o:void 0;const a=8-o.length-s.length;return a<0?void 0:[...o,...Array(a).fill(0),...s]}function dt(t){try{return new URL(t).hostname.replace(/^www\./,"")}catch{return t}}function ct(t){const e=nt(t);if(!e||e.startsWith("data:"))return;const i=new URL(e),n=i.hostname.replace(/^(www|m)\./,""),r=i.pathname.split("/").filter(Boolean);if(n.includes("youtu")){const t="youtu.be"===n?r[0]:i.searchParams.get("v")??r[r.findIndex(t=>/^(embed|shorts|live|v)$/.test(t))+1];if(t&&tt.test(t))return{provider:"youtube",id:t}}if(!/^(player\.)?vimeo\.com$/.test(n))return;const o="video"===r[0]||n.startsWith("player")?1:0,s=r[o];if(!s||!/^\d+$/.test(s))return;const a=i.searchParams.get("h")??r[o+1]?.match(/^[\w]+$/)?.[0];return{provider:"vimeo",id:s,...a?{hash:a}:{}}}function ht(t){const e=ct(t);if(e)return"youtube"===e.provider?`https://www.youtube-nocookie.com/embed/${e.id}?rel=0`:`https://player.vimeo.com/video/${e.id}${e.hash?`?h=${encodeURIComponent(e.hash)}`:""}`}var ft=(t,e)=>JSON.stringify(t)===JSON.stringify(e);function lt(t,e){return e?e(t):t.replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-f]+);)/gi,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function pt(t){if(Object.keys(t).some(t=>"name"!==t&&"background"!==t))throw new Error("page.set may only update name and background. Use item operations to change page content.")}function ut(t,e){for(const i of t.pages){const t=(n,r)=>{for(let o=0;o<n.length;o++){const s=n[o];if(s.id===e)return{item:s,list:n,index:o,parent:r,page:i};if(s.children){const e=t(s.children,s);if(e)return e}}},n=t(i.items);if(n)return n}}function mt(t,e){const i=ut(t,e);if(!i){const i=y(t).map(t=>t.id).slice(0,5);throw new Error(`Item ${e} does not exist.${i.length?` Known ids: ${i.join(", ")}.`:""}`)}return i}function gt(e,i,n=[]){const r={...e};for(const[o,s]of Object.entries(i))if(void 0!==s)if(n.includes(o)&&s&&"object"==typeof s&&!Array.isArray(s)){const t=r[o];r[o]=gt(t&&"object"==typeof t?t:{},s)}else r[o]=t(s);else delete r[o];return r}function vt(e,i,n=[]){const r=e,o={};for(const s of Object.keys(i)){const e=i[s];o[s]=n.includes(s)&&e&&"object"==typeof e&&r[s]&&"object"==typeof r[s]?vt(r[s],e):t(r[s])}return o}function wt(t,e=0,i=/* @__PURE__ */new Set){if(e>f.maxJsonDepth)throw new Error(`Document data exceeds maximum nesting depth ${f.maxJsonDepth}.`);if(null==t||"boolean"==typeof t||"string"==typeof t)return;if("number"==typeof t){if(!Number.isFinite(t))throw new Error("All numbers must be finite.");return}if("object"!=typeof t)throw new Error("Document values must be plain JSON data.");if(i.has(t))throw new Error("Circular document data is not supported.");const n=Object.getPrototypeOf(t);if(!Array.isArray(t)&&n!==Object.prototype&&null!==n)throw new Error("Document values must be plain JSON objects.");i.add(t);for(const[r,o]of Object.entries(t)){if(["__proto__","prototype","constructor"].includes(r))throw new Error(`Unsafe property ${r}.`);wt(o,e+1,i)}i.delete(t)}function xt(t,e={},i="user",n){wt(t);const r=p(c,t);if(r)throw new Error(r);const o=/* @__PURE__ */new Set,s=/* @__PURE__ */new Set;let a=0;for(const d of t.pages){if(s.has(d.id))throw new Error(`Duplicate page id ${d.id}.`);s.add(d.id);const i=(n,r)=>{if(r>f.maxDepth)throw new Error("Item nesting is too deep.");for(const s of n){if(a++,"string"!=typeof s.id||!s.id)throw new Error("Every item must have a stable string id.");for(const t of["x","y","w","h"])if("number"!=typeof s[t]||!Number.isFinite(s[t]))throw new Error(`Item ${s.id} requires finite ${t}.`);if(o.has(s.id))throw new Error(`Duplicate item id ${s.id}.`);if(o.add(s.id),s.children&&"group"!==s.kind)throw new Error(`Only groups may contain children (${s.id}).`);if(!("connector"!==s.kind||s.from&&s.to))throw new Error(`Connector ${s.id} needs both from and to endpoints.`);if(!("image"!==s.kind||s.media&&t.media[s.media]))throw new Error(`Image ${s.id} references missing media ${s.media??"(unset)"}.`);if("video"===s.kind||"link"===s.kind||void 0!==s.href){if(!nt(s.href))throw new Error(`Bad href (${s.id}).`);if("video"===s.kind&&!ct(s.href))throw new Error(`Bad video (${s.id}).`)}const n=e.kinds?.find(t=>t.kind===s.kind)?.schema;if(n){const t=p(n,s);if(t)throw new Error(`${s.kind} ${s.id}: ${t}`)}s.children&&i(s.children,r+1)}};i(d.items,0)}if(a>f.maxItems)throw new Error(`A document may contain at most ${f.maxItems} items.`);for(const d of t.pages){const t=g(d.items),e=new Map(t.map(t=>[t.id,t]));for(const i of t)for(const t of[i.from,i.to])if(t&&"item"in t){const n=e.get(t.item);if(!n)throw new Error(`Endpoint ${t.item} does not exist on page ${d.id}.`);if("connector"===n.kind||n.id===i.id)throw new Error(`Connector endpoints must attach to a non-connector item (${t.item}).`)}}for(const[d,c]of Object.entries(t.media)){const t=it.test(c.src);let r;try{r=new URL(c.src)}catch{}if(!(t||r&&["http:","https:"].includes(r.protocol)))throw new Error("Images must use an image data URL or an HTTP(S) URL.");if(r&&(r.username||r.password))throw new Error("Image URLs must not include credentials.");if("user"!==i&&(!n||n.has(d))&&!t&&r&&!e.allowedImageOrigins?.includes(r.origin))throw new Error(`Image origin ${r.origin} is not allowed. Pass allowedImageOrigins when creating the board.`)}}function yt(t){if(void 0===t.href)return;const e=nt(t.href);if(!e)throw new Error(`Bad href (${t.id}).`);t.href=e,t.children?.forEach(yt)}function bt(t,e){void 0!==t.html&&(t.html=lt(t.html,e)),t.mount&&delete t.mount,t.children?.forEach(t=>bt(t,e))}function Mt(e,i,a,c={}){const h=t(i),f=d(c.kinds),l=t=>c.kinds?.find(e=>e.kind===t.kind)?.outline?.(t);let p=[],u=[];if("add"===h.op){let i=s(h.item,f);"user"!==a&&bt(i,c.sanitizeHTML),yt(i);const n=h.parent??h.place?.inside,r=n?mt(e,n):void 0;if(r&&"group"!==r.item.kind)throw new Error(`Parent ${n} must be a group.`);const o=r?.page??e.pages.find(t=>!h.page||t.id===h.page);if(!o)throw new Error(`Page ${h.page??"(first)"} does not exist.`);if(r&&h.page&&h.page!==r.page.id)throw new Error("Parent and page must refer to the same page.");if(h.place){const t=h.place.gap??(a.startsWith("agent:")?c.agentPlaceGap??32:32);i=E(i,{...h.place,gap:t},g(o.items))}const d=r?r.item.children??=[]:o.items;if(void 0!==h.index&&h.index>d.length)throw new Error("Insert index is outside the target list.");return d.splice(h.index??d.length,0,i),p=[{op:"remove",id:i.id}],u=g([i]).map(t=>t.id),{op:{op:"add",item:t(i),page:o.id,...r?{parent:r.item.id}:{},...void 0!==h.index?{index:h.index}:{}},inverse:p,created:u}}if("set"===h.op){const i=mt(e,h.id),r=Object.hasOwn(h.patch,"children")?new Map(y(e).map(t=>[t.id,t])):void 0;if(Object.hasOwn(h.patch,"id")&&h.patch.id!==h.id)throw new Error("Item ids cannot be changed.");p=[{op:"set",id:h.id,patch:vt(i.item,h.patch,["style","text","data"])}];const d=t(h.patch),{from:m,to:w,style:x,children:b,...M}=d,E={...M};Object.hasOwn(d,"style")&&(E.style=o(x)),Object.hasOwn(d,"from")&&(E.from=n(m)),Object.hasOwn(d,"to")&&(E.to=n(w)),Object.hasOwn(d,"children")&&(E.children=b?b.map(t=>s(t,f)):void 0);for(const t of["kind","x","y","w","h"])if(Object.hasOwn(E,t)&&void 0===E[t])throw new Error(`Required field ${t} cannot be deleted.`);if("string"==typeof E.href){const t=nt(E.href);if(!t)throw new Error(`Bad href (${h.id}).`);E.href=t}return"user"!==a&&("string"==typeof E.html&&(E.html=lt(E.html,c.sanitizeHTML)),Object.hasOwn(E,"mount")&&delete E.mount,E.children&&E.children.forEach(t=>bt(t,c.sanitizeHTML))),i.list[i.index]=gt(i.item,E,["style","text","data"]),r&&(u=[...new Set(g(i.list[i.index].children??[]).map(t=>t.id))].filter(t=>!r.has(t)),p.push(...k(v(e),r,l))),{op:{...h,patch:E},inverse:p,created:u}}if("remove"===h.op){const i=mt(e,h.id),n=new Map(y(e).map(t=>[t.id,t]));p=[{op:"add",item:t(i.item),page:i.page.id,...i.parent?{parent:i.parent.id}:{},index:i.index}],i.list.splice(i.index,1),p.push(...k(v(e),n,l))}if("order"===h.op){const t=mt(e,h.id),i="number"==typeof h.to?h.to:"front"===h.to?t.list.length-1:"back"===h.to?0:"forward"===h.to?Math.min(t.list.length-1,t.index+1):Math.max(0,t.index-1);if(i>=t.list.length)throw new Error("Order index is outside the item list.");t.list.splice(t.index,1),t.list.splice(i,0,t.item),p=[{op:"order",id:h.id,to:t.index}]}if("reparent"===h.op){const t=mt(e,h.id),i=h.parent?mt(e,h.parent):void 0;if(i&&"group"!==i.item.kind)throw new Error("New parent must be a group.");if(i&&g([t.item]).some(t=>t.id===i.item.id))throw new Error("An item cannot be placed inside itself or a descendant.");if(i&&i.page.id!==t.page.id)throw new Error("Reparenting across pages is not supported.");p=[{op:"reparent",id:h.id,parent:t.parent?.id??null,index:t.index}],t.list.splice(t.index,1);const n=i?i.item.children??=[]:t.page.items;if(void 0!==h.index&&h.index>n.length)throw new Error("Reparent index is outside the target list.");n.splice(h.index??n.length,0,t.item)}if("page.add"===h.op){const i={...h.page,id:h.page.id??r(),items:(h.page.items??[]).map(t=>s(t,f))};if("user"!==a&&i.items.forEach(t=>bt(t,c.sanitizeHTML)),void 0!==h.index&&h.index>e.pages.length)throw new Error("Page insert index is outside the page list.");return e.pages.splice(h.index??e.pages.length,0,i),p=[{op:"page.remove",id:i.id}],u=g(i.items).map(t=>t.id),{op:{op:"page.add",page:t(i),...void 0!==h.index?{index:h.index}:{}},inverse:p,created:u}}if("page.set"===h.op){pt(h.patch);const t=e.pages.find(t=>t.id===h.id);if(!t)throw new Error(`Page ${h.id} does not exist.`);p=[{op:"page.set",id:h.id,patch:vt(t,h.patch)}],Object.assign(t,gt(t,h.patch));for(const e of Object.keys(h.patch))void 0===h.patch[e]&&delete t[e]}if("page.remove"===h.op){const i=e.pages.findIndex(t=>t.id===h.id);if(i<0)throw new Error(`Page ${h.id} does not exist.`);const[n]=e.pages.splice(i,1);p=[{op:"page.add",page:t(n),index:i}]}if("meta.set"===h.op&&(p=[{op:"meta.set",patch:vt(e.meta,h.patch)}],e.meta=gt(e.meta,h.patch)),"media.set"===h.op&&(p=e.media[h.id]?[{op:"media.set",id:h.id,media:t(e.media[h.id])}]:[{op:"media.remove",id:h.id}],e.media[h.id]=t(h.media)),"media.remove"===h.op){if(!e.media[h.id])throw new Error(`Media ${h.id} does not exist.`);p=[{op:"media.set",id:h.id,media:t(e.media[h.id])}],delete e.media[h.id]}return{op:h,inverse:p,created:u}}function Et(e,i,n,r=[]){const o={};for(const s of/* @__PURE__ */new Set([...Object.keys(e),...Object.keys(i)]))if(!ft(e[s],i[s]))if(!r.includes(s)||!n[s]||"object"!=typeof n[s]||void 0!==e[s]&&"object"!=typeof e[s]||void 0!==i[s]&&"object"!=typeof i[s])ft(n[s],i[s])&&(o[s]=t(e[s]));else{const t=Et(e[s]??{},i[s]??{},n[s]);Object.keys(t).length&&(o[s]=t)}return o}function kt(n,r={}){r.sanitizeHTML&&function(t){let e;try{e=t('<img src="x" onerror="alert(1)"><script>alert(1)<\/script>')}catch(n){throw new Error(`sanitizeHTML failed on a safety probe (${n instanceof Error?n.message:n}).`)}if("string"!=typeof e)throw new Error("sanitizeHTML must return a string.");const i=e.toLowerCase();if(i.includes("onerror")||/<script\b/.test(i))throw new Error("sanitizeHTML must strip active HTML. Do not pass an identity function or a no-op.")}(r.sanitizeHTML);const o=t=>Q(t,d(r.kinds));let s=n?o(n):a();xt(s,r);let c=new Map(y(s).map(t=>[t.id,t]));const h=/* @__PURE__ */new Map,u=/* @__PURE__ */new Map,m=/* @__PURE__ */new Map,v=e=>{const i=t(e),n=t=>{t&&"object"==typeof t&&(Object.values(t).forEach(n),Object.freeze(t))};return n(i),i},w=t=>(c.get(t)?.children??s.pages.find(e=>e.id===t)?.items??[]).map(t=>t.id),x=()=>{c=new Map(y(s).map(t=>[t.id,t])),function(t){if(N>0)return t();T=++D,N++;try{return t()}finally{_()}}(()=>{for(const[t,e]of h){const i=c.get(t);ft(e.peek(),i)||(e.value=v(i))}for(const[t,e]of u)for(const[i,n]of e){const e=c.get(t)?.[i];ft(n.peek(),e)||(n.value=v(e))}for(const[t,e]of m){const i=w(t);ft(e.peek(),i)||(e.value=Object.freeze(i))}})},E=/* @__PURE__ */new Set,k=[],O=[];let Y=0;const j=[],B=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,I=()=>"hidden"===r.agentHistory,L=t=>t.startsWith("agent:"),R=(t,e)=>{let i=t.length-1;for(;i>=0&&!e(t[i].origin);)i--;return i},U=t=>{const e=/* @__PURE__ */new Map;for(const i of t.pages)for(const t of g(i.items))e.set(t.id,i.id);return e},P=()=>{Y=0,j.length=0,B.clear(),A.clear()},z=(e,i,n)=>(Y+=1,((t,e,i,n)=>{const r=new Map(y(t).map(t=>[t.id,t])),o=new Map(y(e).map(t=>[t.id,t])),s=U(t),a=U(e);for(const[d,c]of o){const t=r.get(d);t&&ft(t,c)||(B.set(d,{revision:i,origin:n,kind:c.kind,page:a.get(d)}),A.delete(d))}for(const[d,c]of r)o.has(d)||(B.delete(d),A.set(d,{revision:i,origin:n,kind:c.kind,page:s.get(d)}))})(i,n,Y,e.origin),j.push({...e,revision:Y,ops:t(e.ops)}),j.length>f.maxSessionLog&&j.shift(),Y),W=e=>{for(const i of E)try{i(t({ops:e.ops,inverse:e.inverse,origin:e.origin,label:e.label,revision:e.revision}))}catch{}};return{itemSignal(t){let e=h.get(t);return e||(e=H(v(c.get(t))),h.set(t,e)),e},fieldSignal(t,e){let i=u.get(t);i||(i=/* @__PURE__ */new Map,u.set(t,i));let n=i.get(e);return n||(n=H(v(c.get(t)?.[e])),i.set(e,n)),n},childrenSignal(t){let e=m.get(t);return e||(e=H(Object.freeze(w(t))),m.set(t,e)),e},apply(e,i={}){const n={ok:!1,created:[],errors:[],warnings:[]},o=i.origin??"api",a=!!i.lenient;if(r.readonly)return n.errors.push({index:0,code:"READONLY",message:"This document is read-only."}),n;const d="user"===o?f.maxItems:f.maxBatch;if(!Array.isArray(e)||e.length>d)return n.errors.push({index:0,code:"BATCH_LIMIT",message:`A batch must be an array of at most ${d} operations for origin ${o}.`}),n;let c;try{wt(e),c=t(s)}catch(_){return n.errors.push({index:0,code:"INVALID_DATA",message:String(_ instanceof Error?_.message:_)}),n}const h=o.startsWith("agent:")?b(c,e):{ops:e,warnings:[]};n.warnings.push(...h.warnings);const u=[],m=[],g=[],v=/* @__PURE__ */new Map,w=()=>new Set(u.filter(t=>"media.set"===t.op).map(t=>t.id)),M=h.ops;for(let s=0;s<M.length;s++){const e=a?t(c):void 0;try{const t=p(l,M[s]);if(t)throw new Error(t);const e=Mt(c,M[s],o,r);if("user"!==o&&n.created.length+e.created.length>f.maxBatch)throw new Error(`An agent batch may create at most ${f.maxBatch} items, including nested children.`);a&&xt(c,r,o,/* @__PURE__ */new Set([...w(),..."media.set"===e.op.op?[e.op.id]:[]])),u.push(e.op),m.unshift(...e.inverse),n.created.push(...e.created),e.created.forEach(t=>v.set(t,s))}catch(_){e&&(c=e),g.push({index:s,code:"INVALID_OP",message:`${M[s]?.op??"operation"} #${s+1}: ${_ instanceof Error?_.message:String(_)}`})}}if(!a&&!g.length)try{xt(c,r,o,w())}catch(_){g.push({index:Math.max(0,e.length-1),code:"INVALID_DOCUMENT",message:_ instanceof Error?_.message:String(_)})}if(!a&&g.length)return n.errors=g,n.created=[],n.warnings=[],n;if(a&&!u.length)return n.skipped=g,n.created=[],n;a&&g.length&&(n.skipped=g);const E=y(c),$=new Map(E.map(t=>[t.id,t]));for(const t of n.created){const e=$.get(t);e&&("connector"!==e.kind&&E.some(i=>i.id!==t&&!i.children?.length&&"connector"!==i.kind&&S(X(e,$),X(i,$)))&&n.warnings.push({index:v.get(t)??0,code:"OVERLAPS_EXISTING",message:`Item ${t} overlaps another item.`}))}if(n.ok=!0,i.dryRun||!u.length)return n;const Y={ops:u,inverse:m,before:s,after:c,origin:o,label:i.label};s=c,x();const j=k.at(-1);return i.merge&&j&&j.origin===o&&j.label===Y.label?(j.ops.push(...Y.ops),j.inverse.unshift(...Y.inverse),j.after=s):(k.push(Y),k.length>f.maxHistory&&k.shift()),O.length=0,W({...Y,revision:z({origin:o,label:i.label,ops:u},Y.before,s)}),n},get:e=>t(c.get(e)),query:t=>M(s,t),describe:t=>$(s,t,{written:B,removed:A}),changesSince(e,i){const n=Y;if(!Number.isFinite(e)||e>=n)return{cursor:n,since:e,changes:[]};const r=j[0];if(r&&e+1<r.revision)return{cursor:n,since:e,changes:[],truncated:!0};let o=j.filter(t=>t.revision>e);const s=i?.origin;return"agent"===s?o=o.filter(t=>L(t.origin)):void 0!==s&&(o=o.filter(t=>t.origin===s)),{cursor:n,since:e,changes:t(o)}},kindsSince:t=>e(t),toJSON(e){const n=t(s);if(!1===e?.compact)return n;for(const t of n.pages)t.items=t.items.map(t=>i(t,d(r.kinds)));return n},undo(e){if(r.readonly)return!1;const i=e?.origin?R(k,t=>t===e.origin):I()?R(k,t=>!L(t)):k.length-1;if(i<0)return!1;const n=k[i],o=i!==k.length-1?function(t,e){return t.inverse.flatMap(i=>{if("set"===i.op){const n=ut(t.before,i.id)?.item,r=ut(t.after,i.id)?.item,o=ut(e,i.id)?.item;if(!n||!r||!o)return[];const s=Et(n,r,o,["style","text","data"]);return Object.keys(s).length?[{...i,patch:s}]:[]}if("meta.set"===i.op){const n=Et(t.before.meta,t.after.meta,e.meta);return Object.keys(n).length?[{...i,patch:n}]:[]}if("remove"===i.op)return ut(e,i.id)?[i]:[];if("add"===i.op)return ut(e,String(i.item.id))?[]:[i];if("order"===i.op||"reparent"===i.op){const n=ut(e,i.id),r=ut(t.after,i.id);return n&&r&&n.parent?.id===r.parent?.id&&n.page.id===r.page.id?[i]:[]}if("media.set"===i.op||"media.remove"===i.op)return ft(e.media[i.id],t.after.media[i.id])?[i]:[];if("page.set"===i.op){pt(i.patch);const n=t.before.pages.find(t=>t.id===i.id),r=t.after.pages.find(t=>t.id===i.id),o=e.pages.find(t=>t.id===i.id);if(!n||!r||!o)return[];const s=Et(n,r,o);return delete s.items,Object.keys(s).length?[{...i,patch:s}]:[]}return[i]})}(n,s):n.inverse,a=t(s),d=[],c=[];try{for(const t of o){const e=Mt(a,t,"user",r);d.push(e.op),c.unshift(...e.inverse)}xt(a,r)}catch{return!1}const h={ops:d,inverse:c,before:s,after:a,origin:n.origin,label:n.label},f=s;s=a,x(),k.splice(i,1),O.push(h);const l=`Undo ${n.label??"change"}`;return W({ops:d,inverse:c,origin:n.origin,label:l,revision:z({origin:n.origin,label:l,ops:d},f,s)}),!0},redo(){if(r.readonly)return!1;const e=I()?R(O,t=>!L(t)):O.length-1;if(e<0)return!1;const i=O[e],n=t(s),o=[],a=[];try{for(const t of i.inverse){const e=Mt(n,t,"user",r);o.push(e.op),a.unshift(...e.inverse)}xt(n,r)}catch{return!1}const d={ops:o,inverse:a,before:s,after:n,origin:i.origin,label:i.label},c=s;s=n,x(),O.splice(e,1),k.push(d);const h=`Redo ${d.label??"change"}`;return W({ops:o,inverse:a,origin:d.origin,label:h,revision:z({origin:d.origin,label:h,ops:o},c,s)}),!0},load(t){if(r.readonly)throw new Error("This document is read-only.");const e=o(t);xt(e,r),s=e,x(),k.length=0,O.length=0,P(),W({ops:[],inverse:[],origin:"api",label:"Load document",revision:0})},clear(){if(r.readonly)throw new Error("This document is read-only.");s=a(),x(),k.length=0,O.length=0,P(),W({ops:[],inverse:[],origin:"api",label:"Clear document",revision:0})},on:(t,e)=>(E.add(e),()=>E.delete(e)),get revision(){return Y},get canUndo(){return I()?k.some(t=>!L(t.origin)):k.length>0},get canRedo(){return I()?O.some(t=>!L(t.origin)):O.length>0}}}function $t(t){return(t?.getData("text/uri-list")?.split(/\r?\n/).find(t=>t&&!t.startsWith("#")))?.trim()||t?.getData("text/plain")||""}function St(t,e,i=0,n=t.length-1,r=Xt){for(;n>i;){if(n-i>600){const o=n-i+1,s=e-i+1,a=Math.log(o),d=.5*Math.exp(2*a/3),c=.5*Math.sqrt(a*d*(o-d)/o)*(s-o/2<0?-1:1);St(t,e,Math.max(i,Math.floor(e-s*d/o+c)),Math.min(n,Math.floor(e+(o-s)*d/o+c)),r)}const o=t[e];let s=i,a=n;for(Ot(t,i,e),r(t[n],o)>0&&Ot(t,i,n);s<a;){for(Ot(t,s,a),s++,a--;r(t[s],o)<0;)s++;for(;r(t[a],o)>0;)a--}0===r(t[i],o)?Ot(t,i,a):(a++,Ot(t,a,n)),a<=e&&(i=a+1),e<=a&&(n=a-1)}}function Ot(t,e,i){const n=t[e];t[e]=t[i],t[i]=n}function Xt(t,e){return t<e?-1:t>e?1:0}var Yt=class{constructor(t=9){this._maxEntries=Math.max(4,t),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()}all(){return this._all(this.data,[])}search(t){let e=this.data;const i=[];if(!Pt(t,e))return i;const n=this.toBBox,r=[];for(;e;){for(let o=0;o<e.children.length;o++){const s=e.children[o],a=e.leaf?n(s):s;Pt(t,a)&&(e.leaf?i.push(s):Ut(t,a)?this._all(s,i):r.push(s))}e=r.pop()}return i}collides(t){let e=this.data;if(!Pt(t,e))return!1;const i=[];for(;e;){for(let n=0;n<e.children.length;n++){const r=e.children[n],o=e.leaf?this.toBBox(r):r;if(Pt(t,o)){if(e.leaf||Ut(t,o))return!0;i.push(r)}}e=i.pop()}return!1}load(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(let e=0;e<t.length;e++)this.insert(t[e]);return this}let e=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===e.height)this._splitRoot(this.data,e);else{if(this.data.height<e.height){const t=this.data;this.data=e,e=t}this._insert(e,this.data.height-e.height-1,!0)}else this.data=e;return this}insert(t){return t&&this._insert(t,this.data.height-1),this}clear(){return this.data=zt([]),this}remove(t,e){if(!t)return this;let i=this.data;const n=this.toBBox(t),r=[],o=[];let s,a,d;for(;i||r.length;){if(i||(i=r.pop(),a=r[r.length-1],s=o.pop(),d=!0),i.leaf){const n=jt(t,i.children,e);if(-1!==n)return i.children.splice(n,1),r.push(i),this._condense(r),this}d||i.leaf||!Ut(i,n)?a?(s++,i=a.children[s],d=!1):i=null:(r.push(i),o.push(s),s=0,a=i,i=i.children[0])}return this}toBBox(t){return t}compareMinX(t,e){return t.minX-e.minX}compareMinY(t,e){return t.minY-e.minY}toJSON(){return this.data}fromJSON(t){return this.data=t,this}_all(t,e){const i=[];for(;t;)t.leaf?e.push(...t.children):i.push(...t.children),t=i.pop();return e}_build(t,e,i,n){const r=i-e+1;let o,s=this._maxEntries;if(r<=s)return o=zt(t.slice(e,i+1)),_t(o,this.toBBox),o;n||(n=Math.ceil(Math.log(r)/Math.log(s)),s=Math.ceil(r/Math.pow(s,n-1))),o=zt([]),o.leaf=!1,o.height=n;const a=Math.ceil(r/s),d=a*Math.ceil(Math.sqrt(s));Ht(t,e,i,d,this.compareMinX);for(let c=e;c<=i;c+=d){const e=Math.min(c+d-1,i);Ht(t,c,e,a,this.compareMinY);for(let i=c;i<=e;i+=a){const r=Math.min(i+a-1,e);o.children.push(this._build(t,i,r,n-1))}}return _t(o,this.toBBox),o}_chooseSubtree(t,e,i,n){for(;n.push(e),!e.leaf&&n.length-1!==i;){let i,n=1/0,r=1/0;for(let o=0;o<e.children.length;o++){const s=e.children[o],a=Lt(s),d=Tt(t,s)-a;d<r?(r=d,n=a<n?a:n,i=s):d===r&&a<n&&(n=a,i=s)}e=i||e.children[0]}return e}_insert(t,e,i){const n=i?t:this.toBBox(t),r=[],o=this._chooseSubtree(n,this.data,e,r);for(o.children.push(t),At(o,n);e>=0&&r[e].children.length>this._maxEntries;)this._split(r,e),e--;this._adjustParentBBoxes(n,r,e)}_split(t,e){const i=t[e],n=i.children.length,r=this._minEntries;this._chooseSplitAxis(i,r,n);const o=this._chooseSplitIndex(i,r,n),s=zt(i.children.splice(o,i.children.length-o));s.height=i.height,s.leaf=i.leaf,_t(i,this.toBBox),_t(s,this.toBBox),e?t[e-1].children.push(s):this._splitRoot(i,s)}_splitRoot(t,e){this.data=zt([t,e]),this.data.height=t.height+1,this.data.leaf=!1,_t(this.data,this.toBBox)}_chooseSplitIndex(t,e,i){let n,r=1/0,o=1/0;for(let s=e;s<=i-e;s++){const e=Bt(t,0,s,this.toBBox),a=Bt(t,s,i,this.toBBox),d=Rt(e,a),c=Lt(e)+Lt(a);d<r?(r=d,n=s,o=c<o?c:o):d===r&&c<o&&(o=c,n=s)}return n||i-e}_chooseSplitAxis(t,e,i){const n=t.leaf?this.compareMinX:It,r=t.leaf?this.compareMinY:Nt;this._allDistMargin(t,e,i,n)<this._allDistMargin(t,e,i,r)&&t.children.sort(n)}_allDistMargin(t,e,i,n){t.children.sort(n);const r=this.toBBox,o=Bt(t,0,e,r),s=Bt(t,i-e,i,r);let a=Dt(o)+Dt(s);for(let d=e;d<i-e;d++){const e=t.children[d];At(o,t.leaf?r(e):e),a+=Dt(o)}for(let d=i-e-1;d>=e;d--){const e=t.children[d];At(s,t.leaf?r(e):e),a+=Dt(s)}return a}_adjustParentBBoxes(t,e,i){for(let n=i;n>=0;n--)At(e[n],t)}_condense(t){for(let e,i=t.length-1;i>=0;i--)0===t[i].children.length?i>0?(e=t[i-1].children,e.splice(e.indexOf(t[i]),1)):this.clear():_t(t[i],this.toBBox)}};function jt(t,e,i){if(!i)return e.indexOf(t);for(let n=0;n<e.length;n++)if(i(t,e[n]))return n;return-1}function _t(t,e){Bt(t,0,t.children.length,e,t)}function Bt(t,e,i,n,r){r||(r=zt(null)),r.minX=1/0,r.minY=1/0,r.maxX=-1/0,r.maxY=-1/0;for(let o=e;o<i;o++){const e=t.children[o];At(r,t.leaf?n(e):e)}return r}function At(t,e){return t.minX=Math.min(t.minX,e.minX),t.minY=Math.min(t.minY,e.minY),t.maxX=Math.max(t.maxX,e.maxX),t.maxY=Math.max(t.maxY,e.maxY),t}function It(t,e){return t.minX-e.minX}function Nt(t,e){return t.minY-e.minY}function Lt(t){return(t.maxX-t.minX)*(t.maxY-t.minY)}function Dt(t){return t.maxX-t.minX+(t.maxY-t.minY)}function Tt(t,e){return(Math.max(e.maxX,t.maxX)-Math.min(e.minX,t.minX))*(Math.max(e.maxY,t.maxY)-Math.min(e.minY,t.minY))}function Rt(t,e){const i=Math.max(t.minX,e.minX),n=Math.max(t.minY,e.minY),r=Math.min(t.maxX,e.maxX),o=Math.min(t.maxY,e.maxY);return Math.max(0,r-i)*Math.max(0,o-n)}function Ut(t,e){return t.minX<=e.minX&&t.minY<=e.minY&&e.maxX<=t.maxX&&e.maxY<=t.maxY}function Pt(t,e){return e.minX<=t.maxX&&e.minY<=t.maxY&&e.maxX>=t.minX&&e.maxY>=t.minY}function zt(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function Ht(t,e,i,n,r){const o=[e,i];for(;o.length;){if((i=o.pop())-(e=o.pop())<=n)continue;const s=e+Math.ceil((i-e)/n/2)*n;St(t,s,e,i,r),o.push(e,s,s,i)}}function Wt(t,e,i=4,n,r){const o="function"==typeof r?r:void 0;if("group"===t.kind)return w(X(t,n,o),e);if("connector"===t.kind){const r=u(t,n,o).points;return r.slice(1).some((n,o)=>h(e,r[o],n)<=i+(t.style?.strokeWidth??2)/2)}const s=m(e,{x:t.x+t.w/2,y:t.y+t.h/2},-(t.rotation??0)),a=s.x-t.x,d=s.y-t.y,c=i+(t.style?.strokeWidth??2)/2,f=t.points??("line"===t.kind?[[0,0],[t.w,t.h]]:void 0);if(("line"===t.kind||"path"===t.kind)&&f){const e=f.map(([e,i])=>({x:t.x+e,y:t.y+i}));return t.closed&&O(s,e)||e.slice(1).some((t,i)=>h(s,e[i],t)<=c)}const l=!!t.text?.value||void 0!==t.style?.fill&&"none"!==t.style.fill||["note","text","image","video","link","html","group"].includes(t.kind),p="function"==typeof r?r(t):r;if(p){const t=Array.isArray(p)?p:[p],e={x:a,y:d};return t.some(t=>{if(!t.points.length)return!1;if(t.closed&&l&&O(e,t.points))return!0;const i=t.closed?[...t.points,t.points[0]]:t.points;return 1===i.length?h(e,i[0],i[0])<=c:i.slice(1).some((t,n)=>h(e,i[n],t)<=c)})}if("ellipse"===t.kind){const e=t.w/2,i=t.h/2;if(!e||!i)return!1;const n=Math.hypot((a-e)/e,(d-i)/i),r=c/Math.min(e,i);return l?n<=1+r:Math.abs(n-1)<=r}if("diamond"===t.kind){const e=[{x:t.w/2,y:0},{x:t.w,y:t.h/2},{x:t.w/2,y:t.h},{x:0,y:t.h/2}],i={x:a,y:d};return l&&O(i,e)||e.some((t,n)=>h(i,t,e[(n+1)%4])<=c)}return a>=-c&&a<=t.w+c&&d>=-c&&d<=t.h+c&&(l||a<=c||a>=t.w-c||d<=c||d>=t.h-c)}var Ct=class{outline;tree=new Yt;lookup=/* @__PURE__ */new Map;entries=/* @__PURE__ */new Map;constructor(t=[],e){this.outline=e,this.set(t)}set(t,e=this.outline){this.outline=e,this.tree.clear(),this.lookup=new Map(g(t).map(t=>[t.id,t]));const i=[];let n=0;const r=(t,e)=>{for(const o of t){const t=X(o,this.lookup,this.outline);i.push({minX:t.x,minY:t.y,maxX:t.x+t.w,maxY:t.y+t.h,item:o,order:n++,parents:e}),o.children&&r(o.children,[...e,o])}};r(t,[]),this.entries=new Map(i.map(t=>[t.item.id,t])),this.tree.load(i)}search(t){return this.tree.search({minX:t.x,minY:t.y,maxX:t.x+t.w,maxY:t.y+t.h}).filter(t=>!t.item.hidden&&!t.parents.some(t=>t.hidden)).sort((t,e)=>t.order-e.order).map(t=>t.item)}enclosed(t,e={}){const i=/* @__PURE__ */new Map,n=this.tree.search({minX:t.x,minY:t.y,maxX:t.x+t.w,maxY:t.y+t.h}),r=t=>{if(!(t.item.hidden||t.item.locked||e.ignore?.(t.item)||t.parents.some(t=>t.hidden||t.locked||e.ignore?.(t))))return{x:t.minX,y:t.minY,w:t.maxX-t.minX,h:t.maxY-t.minY}};for(const o of n){const n=r(o);if(!n||!x(t,n))continue;const s=o.parents.filter(t=>"group"===t.kind),a=s[s.findIndex(t=>t.id===e.enteredGroup)+1],d=a?this.entries.get(a.id):o;if(d.item.id===e.enteredGroup)continue;const c=d===o?n:r(d);c&&x(t,c)&&i.set(d.item.id,d)}return[...i.values()].sort((t,e)=>t.order-e.order).map(t=>t.item)}pick(t,e={}){const i=e.tolerance??6,n=this.tree.search({minX:t.x-i,minY:t.y-i,maxX:t.x+i,maxY:t.y+i}).sort((t,e)=>e.order-t.order);for(const r of n){if(r.item.hidden||e.ignore?.(r.item)||!e.includeLocked&&r.item.locked||r.parents.some(t=>t.hidden||e.ignore?.(t)||!e.includeLocked&&t.locked))continue;if(!Wt(r.item,t,i,this.lookup,e.outline??this.outline))continue;const n=r.parents.filter(t=>"group"===t.kind);return n[n.findIndex(t=>t.id===e.enteredGroup)+1]??r.item}}};export{kt as a,dt as c,ct as d,ht as f,$t as i,rt as l,H as m,Wt as n,et as o,Q as p,Yt as r,it as s,Ct as t,nt as u};
2
- //# sourceMappingURL=picker-Dv_i4iNP.js.map
1
+ import{a as t,b as e,c as i,f as n,g as r,i as o,l as s,o as a,s as d}from"./defaults-C-aC_B4z.js";import{A as c,E as h,M as f,N as l,R as p,S as u,T as m,_ as g,c as v,g as w,h as x,i as y,l as b,n as M,r as E,s as k,t as $,v as S,w as O,y as X}from"./describe-DaWyf3qV.js";var Y,j=Symbol.for("preact-signals");function _(){if(A>1)A--;else{var t,e=!1;for(!function(){var t=D;for(D=void 0;void 0!==t;){var e=t.S;if(e.v===t.v)for(var i=e.t;void 0!==i;i=i.x)i.i===t.i&&(i.i=e.i);t=t.o}}();void 0!==N;){var i=N;for(N=void 0,L++;void 0!==i;){var n=i.u;if(i.u=void 0,i.f&=-3,!(8&i.f)&&W(i))try{i.c()}catch(i){e||(t=i,e=!0)}i=n}}if(L=0,A--,e)throw t}}var B=void 0;function I(t){var e=B,i=Y;B=void 0,Y=void 0;try{return t()}finally{B=e,Y=i}}var N=void 0,A=0,L=0,R=0,T=0,D=void 0,U=0;function P(t){if(void 0!==B){var e=t.n;if(void 0===e||e.t!==B)return e={i:0,S:t,p:B.s,n:void 0,t:B,e:void 0,x:void 0,r:e},void 0!==B.s&&(B.s.n=e),B.s=e,t.n=e,32&B.f&&t.S(e),e;if(-1===e.i)return e.i=0,void 0!==e.n&&(e.n.p=e.p,void 0!==e.p&&(e.p.n=e.n),e.p=B.s,e.n=void 0,B.s.n=e,B.s=e),e}}function z(t,e){this.v=t,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=null==e?void 0:e.watched,this.Z=null==e?void 0:e.unwatched,this.name=null==e?void 0:e.name}function H(t,e){return new z(t,e)}function W(t){for(var e=t.s;void 0!==e;e=e.n)if(e.S.i!==e.i||!e.S.h()||e.S.i!==e.i)return!0;return!1}function C(t){for(var e=t.s;void 0!==e;e=e.n){var i=e.S.n;if(void 0!==i&&(e.r=i),e.S.n=e,e.i=-1,void 0===e.n){t.s=e;break}}}function J(t){for(var e=t.s,i=void 0;void 0!==e;){var n=e.p;-1===e.i?(e.S.U(e),void 0!==n&&(n.n=e.n),void 0!==e.n&&(e.n.p=n)):i=e,e.S.n=e.r,void 0!==e.r&&(e.r=void 0),e=n}t.s=i}function q(t,e){z.call(this,void 0,e),this.x=t,this.s=void 0,this.g=U-1,this.f=4}function G(t){var e=t.m;if(t.m=void 0,"function"==typeof e){A++;var i=B;B=void 0;try{e()}catch(_){throw t.f&=-2,t.f|=8,V(t),_}finally{B=i,_()}}}function V(t){for(var e=t.s;void 0!==e;e=e.n)e.S.U(e);t.x=void 0,t.s=void 0,G(t)}function F(t){if(B!==this)throw new Error("Out-of-order effect");J(this),B=t,this.f&=-2,8&this.f&&V(this),_()}function Z(t,e){this.x=t,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=null==e?void 0:e.name,Y&&Y.push(this)}z.prototype.brand=j,z.prototype.h=function(){return!0},z.prototype.S=function(t){var e=this,i=this.t;i!==t&&void 0===t.e&&(t.x=i,this.t=t,void 0!==i?i.e=t:I(function(){var t;null==(t=e.W)||t.call(e)}))},z.prototype.U=function(t){var e=this;if(void 0!==this.t){var i=t.e,n=t.x;void 0!==i&&(i.x=n,t.e=void 0),void 0!==n&&(n.e=i,t.x=void 0),t===this.t&&(this.t=n,void 0===n&&I(function(){var t;null==(t=e.Z)||t.call(e)}))}},z.prototype.subscribe=function(t){var e=this;return function(t,e){var i=new Z(t,e);try{i.c()}catch(t){throw i.d(),t}var n=i.d.bind(i);return n[Symbol.dispose]=n,n}(function(){var i=e.value;I(function(){return t(i)})},{name:"sub"})},z.prototype.valueOf=function(){return this.value},z.prototype.toString=function(){return this.value+""},z.prototype.toJSON=function(){return this.value},z.prototype.peek=function(){var t=this;return I(function(){return t.value})},Object.defineProperty(z.prototype,"value",{get:function(){var t=P(this);return void 0!==t&&(t.i=this.i),this.v},set:function(t){if(t!==this.v){if(L>100)throw new Error("Cycle detected");!function(t){0!==A&&0===L&&t.l!==T&&(t.l=T,D={S:t,v:t.v,i:t.i,o:D})}(this),this.v=t,this.i++,U++,A++;try{for(var e=this.t;void 0!==e;e=e.x)e.t.N()}finally{_()}}}}),q.prototype=new z,q.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if(32==(36&this.f))return!0;if(this.f&=-5,this.g===U)return!0;if(this.g=U,this.f|=1,this.i>0&&!W(this))return this.f&=-2,!0;var t=B;try{C(this),B=this;var e=this.x();(16&this.f||this.v!==e||0===this.i)&&(this.v=e,this.f&=-17,this.i++)}catch(t){this.v=t,this.f|=16,this.i++}return B=t,J(this),this.f&=-2,!0},q.prototype.S=function(t){if(void 0===this.t){this.f|=36;for(var e=this.s;void 0!==e;e=e.n)e.S.S(e)}z.prototype.S.call(this,t)},q.prototype.U=function(t){if(void 0!==this.t&&(z.prototype.U.call(this,t),void 0===this.t)){this.f&=-33;for(var e=this.s;void 0!==e;e=e.n)e.S.U(e)}},q.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var t=this.t;void 0!==t;t=t.x)t.t.N()}},Object.defineProperty(q.prototype,"value",{get:function(){if(1&this.f)throw new Error("Cycle detected");var t=P(this);if(this.h(),void 0!==t&&(t.i=this.i),16&this.f)throw this.v;return this.v}}),Z.prototype.c=function(){var t=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var e=this.x();"function"==typeof e&&(this.m=e)}finally{t()}},Z.prototype.S=function(){if(1&this.f)throw new Error("Cycle detected");this.f|=1,this.f&=-9,G(this),C(this),A++;var t=B;return B=this,F.bind(this,t)},Z.prototype.N=function(){2&this.f||(this.f|=2,this.u=N,N=this)},Z.prototype.d=function(){this.f|=8,1&this.f||V(this)},Z.prototype.dispose=function(){this.d()};var K={1:t=>({...t,format:"anniedrawing",version:1,media:t.media??{},meta:t.meta??{title:"Untitled board"}}),2:t=>{const{sheets:e,...i}=t,n=e??t.pages;return{...i,version:2,pages:Array.isArray(n)?n.map(t=>({...t,name:"string"==typeof t.name&&/^Sheet [1-9]\d*$/.test(t.name)?t.name.replace(/^Sheet /,"Page "):t.name})):n}}};function Q(e,i={}){if(!e||"object"!=typeof e)throw new Error("A drawing must be a JSON object.");let n=t(e);if(void 0!==n.format&&"anniedrawing"!==n.format)throw new Error("This is not an AnnieDrawing document.");const r=n.version??0;if("number"!=typeof r||!Number.isInteger(r)||r<0)throw new Error("Invalid drawing version.");if(r>2)throw new Error(`Drawing version ${r} is newer than supported version 2.`);for(let t=r+1;t<=2;t++)n=K[t](n);const o=n;return Array.isArray(o.pages)&&(o.pages=function(t){const e=new Set(g(t.flatMap(t=>t.items??[])).map(t=>t.id)),i=t=>{let i=t;for(let n=2;e.has(i);n++)i=`${t}_${n}`;return e.add(i),i},n=t=>{const e=t.children?.map(n);if("frame"!==t.kind)return{...t,...e?{children:e}:{}};const{clip:r,title:o,text:s,style:a,...d}=t,c={x:t.x??0,y:t.y??0,w:t.w??600,h:t.h??400},h=[{kind:"rect",id:i(`${t.id}_background`),...c,rotation:t.rotation,style:{fill:"paper",strokeWidth:1.5,...a},...s?{text:s}:{}}],f="string"==typeof o?o:t.name;return f&&h.push({kind:"text",id:i(`${t.id}_label`),x:c.x,y:c.y-30,w:c.w,h:20,text:{value:f,size:14,align:"start",valign:"top"}}),{...d,...c,kind:"group",name:t.name??f,children:[...h,...e??[]]}};return t.map(t=>({...t,items:Array.isArray(t.items)?t.items.map(n):t.items}))}(o.pages).map(t=>({...t,items:Array.isArray(t.items)?t.items.map(t=>s(t,i)):t.items}))),o}var tt=/^[\w-]{11}$/,et=/^data:image\/(png|jpeg|gif|webp|avif);base64,[a-z0-9+/=\s]+$/i,it=/^data:image\/(png|jpeg|gif|webp|avif|svg\+xml);base64,[a-z0-9+/=\s]+$/i;function nt(t){if("string"!=typeof t)return;const e=t.trim();if(et.test(e))return e.replace(/\s+/g,"");try{const t=new URL(e);if("http:"!==t.protocol&&"https:"!==t.protocol)return;return t.username=t.password="",t.href}catch{return}}function rt(t){try{const e=new URL(t);return("http:"===e.protocol||"https:"===e.protocol)&&(!e.username&&!e.password&&!function(t){const e=t.replace(/^\[|\]$/g,"").replace(/\.+$/,"").toLowerCase();if("localhost"===e||"0.0.0.0"===e||"::"===e||e.endsWith(".localhost")||e.endsWith(".local")||e.endsWith(".internal"))return!0;const i=e.match(/^(\d{1,3}(?:\.\d{1,3}){3})(?:\.|$)/);if(i&&ot(i[1]))return!0;const n=function(t){if(/^\d{1,3}(?:\.\d{1,3}){3}$/.test(t))return t;const e=at(t);return e?st(e):void 0}(e);if(n)return ot(n);const r=at(e);if(!r)return!1;if(r.every(t=>0===t))return!0;if(1===r[7]&&r.slice(0,7).every(t=>0===t))return!0;if(65152==(65472&r[0])||64512==(65024&r[0])||!(65280&~r[0]))return!0;const o=st(r);return!!o&&ot(o)}(e.hostname))}catch{return!1}}function ot(t){const e=t.split(".").map(Number);if(4!==e.length||e.some(t=>t>255))return!1;const[i,n]=e;return 0===i||10===i||127===i||(169===i&&254===n||(192===i&&168===n||(172===i&&n>=16&&n<=31||(100===i&&n>=64&&n<=127||(198===i&&(18===n||19===n)||i>=224)))))}function st(t){const e=`${t[6]>>8&255}.${255&t[6]}.${t[7]>>8&255}.${255&t[7]}`;return 0===t[0]&&0===t[1]&&0===t[2]&&0===t[3]&&0===t[4]&&65535===t[5]||100===t[0]&&65435===t[1]&&t.slice(2,6).every(t=>0===t)?e:void 0}function at(t){if(!t.includes(":"))return;let e=t;const i=e.match(/:(\d{1,3}(?:\.\d{1,3}){3})$/);if(i){const[t,n,r,o]=i[1].split(".").map(Number);if([t,n,r,o].some(t=>t>255))return;e=`${e.slice(0,-i[1].length)}${t<<8|n}:${r<<8|o}`}const n=e.split("::");if(n.length>2)return;const r=t=>t?t.split(":").filter(Boolean).map(t=>/^[0-9a-f]{1,4}$/i.test(t)?parseInt(t,16):NaN):[],o=r(n[0]),s=2===n.length?r(n[1]):[];if(o.some(Number.isNaN)||s.some(Number.isNaN))return;if(1===n.length)return 8===o.length?o:void 0;const a=8-o.length-s.length;return a<0?void 0:[...o,...Array(a).fill(0),...s]}function dt(t){try{return new URL(t).hostname.replace(/^www\./,"")}catch{return t}}function ct(t){const e=nt(t);if(!e||e.startsWith("data:"))return;const i=new URL(e),n=i.hostname.replace(/^(www|m)\./,""),r=i.pathname.split("/").filter(Boolean);if(n.includes("youtu")){const t="youtu.be"===n?r[0]:i.searchParams.get("v")??r[r.findIndex(t=>/^(embed|shorts|live|v)$/.test(t))+1];if(t&&tt.test(t))return{provider:"youtube",id:t}}if(!/^(player\.)?vimeo\.com$/.test(n))return;const o="video"===r[0]||n.startsWith("player")?1:0,s=r[o];if(!s||!/^\d+$/.test(s))return;const a=i.searchParams.get("h")??r[o+1]?.match(/^[\w]+$/)?.[0];return{provider:"vimeo",id:s,...a?{hash:a}:{}}}function ht(t){const e=ct(t);if(e)return"youtube"===e.provider?`https://www.youtube-nocookie.com/embed/${e.id}?rel=0`:`https://player.vimeo.com/video/${e.id}${e.hash?`?h=${encodeURIComponent(e.hash)}`:""}`}var ft=(t,e)=>JSON.stringify(t)===JSON.stringify(e);function lt(t,e){return e?e(t):t.replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-f]+);)/gi,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function pt(t){if(Object.keys(t).some(t=>"name"!==t&&"background"!==t))throw new Error("page.set may only update name and background. Use item operations to change page content.")}function ut(t,e){for(const i of t.pages){const t=(n,r)=>{for(let o=0;o<n.length;o++){const s=n[o];if(s.id===e)return{item:s,list:n,index:o,parent:r,page:i};if(s.children){const e=t(s.children,s);if(e)return e}}},n=t(i.items);if(n)return n}}function mt(t,e){const i=ut(t,e);if(!i){const i=y(t).map(t=>t.id).slice(0,5);throw new Error(`Item ${e} does not exist.${i.length?` Known ids: ${i.join(", ")}.`:""}`)}return i}function gt(e,i,n=[]){const r={...e};for(const[o,s]of Object.entries(i))if(void 0!==s)if(n.includes(o)&&s&&"object"==typeof s&&!Array.isArray(s)){const t=r[o];r[o]=gt(t&&"object"==typeof t?t:{},s)}else r[o]=t(s);else delete r[o];return r}function vt(e,i,n=[]){const r=e,o={};for(const s of Object.keys(i)){const e=i[s];o[s]=n.includes(s)&&e&&"object"==typeof e&&r[s]&&"object"==typeof r[s]?vt(r[s],e):t(r[s])}return o}function wt(t,e=0,i=/* @__PURE__ */new Set){if(e>f.maxJsonDepth)throw new Error(`Document data exceeds maximum nesting depth ${f.maxJsonDepth}.`);if(null==t||"boolean"==typeof t||"string"==typeof t)return;if("number"==typeof t){if(!Number.isFinite(t))throw new Error("All numbers must be finite.");return}if("object"!=typeof t)throw new Error("Document values must be plain JSON data.");if(i.has(t))throw new Error("Circular document data is not supported.");const n=Object.getPrototypeOf(t);if(!Array.isArray(t)&&n!==Object.prototype&&null!==n)throw new Error("Document values must be plain JSON objects.");i.add(t);for(const[r,o]of Object.entries(t)){if(["__proto__","prototype","constructor"].includes(r))throw new Error(`Unsafe property ${r}.`);wt(o,e+1,i)}i.delete(t)}function xt(t,e={},i="user",n){wt(t);const r=p(c,t);if(r)throw new Error(r);const o=/* @__PURE__ */new Set,s=/* @__PURE__ */new Set;let a=0;for(const d of t.pages){if(s.has(d.id))throw new Error(`Duplicate page id ${d.id}.`);s.add(d.id);const i=(n,r)=>{if(r>f.maxDepth)throw new Error("Item nesting is too deep.");for(const s of n){if(a++,"string"!=typeof s.id||!s.id)throw new Error("Every item must have a stable string id.");for(const t of["x","y","w","h"])if("number"!=typeof s[t]||!Number.isFinite(s[t]))throw new Error(`Item ${s.id} requires finite ${t}.`);if(o.has(s.id))throw new Error(`Duplicate item id ${s.id}.`);if(o.add(s.id),s.children&&"group"!==s.kind)throw new Error(`Only groups may contain children (${s.id}).`);if(!("connector"!==s.kind||s.from&&s.to))throw new Error(`Connector ${s.id} needs both from and to endpoints.`);if(!("image"!==s.kind||s.media&&t.media[s.media]))throw new Error(`Image ${s.id} references missing media ${s.media??"(unset)"}.`);if("video"===s.kind||"link"===s.kind||void 0!==s.href){if(!nt(s.href))throw new Error(`Bad href (${s.id}).`);if("video"===s.kind&&!ct(s.href))throw new Error(`Bad video (${s.id}).`)}const n=e.kinds?.find(t=>t.kind===s.kind)?.schema;if(n){const t=p(n,s);if(t)throw new Error(`${s.kind} ${s.id}: ${t}`)}s.children&&i(s.children,r+1)}};i(d.items,0)}if(a>f.maxItems)throw new Error(`A document may contain at most ${f.maxItems} items.`);for(const d of t.pages){const t=g(d.items),e=new Map(t.map(t=>[t.id,t]));for(const i of t)for(const t of[i.from,i.to])if(t&&"item"in t){const n=e.get(t.item);if(!n)throw new Error(`Endpoint ${t.item} does not exist on page ${d.id}.`);if("connector"===n.kind||n.id===i.id)throw new Error(`Connector endpoints must attach to a non-connector item (${t.item}).`)}}for(const[d,c]of Object.entries(t.media)){const t=it.test(c.src);let r;try{r=new URL(c.src)}catch{}if(!(t||r&&["http:","https:"].includes(r.protocol)))throw new Error("Images must use an image data URL or an HTTP(S) URL.");if(r&&(r.username||r.password))throw new Error("Image URLs must not include credentials.");if("user"!==i&&(!n||n.has(d))&&!t&&r&&!e.allowedImageOrigins?.includes(r.origin))throw new Error(`Image origin ${r.origin} is not allowed. Pass allowedImageOrigins when creating the board.`)}}function yt(t){if(void 0===t.href)return;const e=nt(t.href);if(!e)throw new Error(`Bad href (${t.id}).`);t.href=e,t.children?.forEach(yt)}function bt(t,e){void 0!==t.html&&(t.html=lt(t.html,e)),t.mount&&delete t.mount,t.children?.forEach(t=>bt(t,e))}function Mt(e,i,a,c={}){const h=t(i),f=d(c.kinds),l=t=>c.kinds?.find(e=>e.kind===t.kind)?.outline?.(t);let p=[],u=[];if("add"===h.op){let i=s(h.item,f);"user"!==a&&bt(i,c.sanitizeHTML),yt(i);const n=h.parent??h.place?.inside,r=n?mt(e,n):void 0;if(r&&"group"!==r.item.kind)throw new Error(`Parent ${n} must be a group.`);const o=r?.page??e.pages.find(t=>!h.page||t.id===h.page);if(!o)throw new Error(`Page ${h.page??"(first)"} does not exist.`);if(r&&h.page&&h.page!==r.page.id)throw new Error("Parent and page must refer to the same page.");if(h.place){const t=h.place.gap??(a.startsWith("agent:")?c.agentPlaceGap??32:32);i=E(i,{...h.place,gap:t},g(o.items))}const d=r?r.item.children??=[]:o.items;if(void 0!==h.index&&h.index>d.length)throw new Error("Insert index is outside the target list.");return d.splice(h.index??d.length,0,i),p=[{op:"remove",id:i.id}],u=g([i]).map(t=>t.id),{op:{op:"add",item:t(i),page:o.id,...r?{parent:r.item.id}:{},...void 0!==h.index?{index:h.index}:{}},inverse:p,created:u}}if("set"===h.op){const i=mt(e,h.id),r=Object.hasOwn(h.patch,"children")?new Map(y(e).map(t=>[t.id,t])):void 0;if(Object.hasOwn(h.patch,"id")&&h.patch.id!==h.id)throw new Error("Item ids cannot be changed.");p=[{op:"set",id:h.id,patch:vt(i.item,h.patch,["style","text","data"])}];const d=t(h.patch),{from:m,to:w,style:x,children:b,...M}=d,E={...M};Object.hasOwn(d,"style")&&(E.style=o(x)),Object.hasOwn(d,"from")&&(E.from=n(m)),Object.hasOwn(d,"to")&&(E.to=n(w)),Object.hasOwn(d,"children")&&(E.children=b?b.map(t=>s(t,f)):void 0);for(const t of["kind","x","y","w","h"])if(Object.hasOwn(E,t)&&void 0===E[t])throw new Error(`Required field ${t} cannot be deleted.`);if("string"==typeof E.href){const t=nt(E.href);if(!t)throw new Error(`Bad href (${h.id}).`);E.href=t}return"user"!==a&&("string"==typeof E.html&&(E.html=lt(E.html,c.sanitizeHTML)),Object.hasOwn(E,"mount")&&delete E.mount,E.children&&E.children.forEach(t=>bt(t,c.sanitizeHTML))),i.list[i.index]=gt(i.item,E,["style","text","data"]),r&&(u=[...new Set(g(i.list[i.index].children??[]).map(t=>t.id))].filter(t=>!r.has(t)),p.push(...k(v(e),r,l))),{op:{...h,patch:E},inverse:p,created:u}}if("remove"===h.op){const i=mt(e,h.id),n=new Map(y(e).map(t=>[t.id,t]));p=[{op:"add",item:t(i.item),page:i.page.id,...i.parent?{parent:i.parent.id}:{},index:i.index}],i.list.splice(i.index,1),p.push(...k(v(e),n,l))}if("order"===h.op){const t=mt(e,h.id),i="number"==typeof h.to?h.to:"front"===h.to?t.list.length-1:"back"===h.to?0:"forward"===h.to?Math.min(t.list.length-1,t.index+1):Math.max(0,t.index-1);if(i>=t.list.length)throw new Error("Order index is outside the item list.");t.list.splice(t.index,1),t.list.splice(i,0,t.item),p=[{op:"order",id:h.id,to:t.index}]}if("reparent"===h.op){const t=mt(e,h.id),i=h.parent?mt(e,h.parent):void 0;if(i&&"group"!==i.item.kind)throw new Error("New parent must be a group.");if(i&&g([t.item]).some(t=>t.id===i.item.id))throw new Error("An item cannot be placed inside itself or a descendant.");if(i&&i.page.id!==t.page.id)throw new Error("Reparenting across pages is not supported.");p=[{op:"reparent",id:h.id,parent:t.parent?.id??null,index:t.index}],t.list.splice(t.index,1);const n=i?i.item.children??=[]:t.page.items;if(void 0!==h.index&&h.index>n.length)throw new Error("Reparent index is outside the target list.");n.splice(h.index??n.length,0,t.item)}if("page.add"===h.op){const i={...h.page,id:h.page.id??r(),items:(h.page.items??[]).map(t=>s(t,f))};if("user"!==a&&i.items.forEach(t=>bt(t,c.sanitizeHTML)),void 0!==h.index&&h.index>e.pages.length)throw new Error("Page insert index is outside the page list.");return e.pages.splice(h.index??e.pages.length,0,i),p=[{op:"page.remove",id:i.id}],u=g(i.items).map(t=>t.id),{op:{op:"page.add",page:t(i),...void 0!==h.index?{index:h.index}:{}},inverse:p,created:u}}if("page.set"===h.op){pt(h.patch);const t=e.pages.find(t=>t.id===h.id);if(!t)throw new Error(`Page ${h.id} does not exist.`);p=[{op:"page.set",id:h.id,patch:vt(t,h.patch)}],Object.assign(t,gt(t,h.patch));for(const e of Object.keys(h.patch))void 0===h.patch[e]&&delete t[e]}if("page.remove"===h.op){const i=e.pages.findIndex(t=>t.id===h.id);if(i<0)throw new Error(`Page ${h.id} does not exist.`);const[n]=e.pages.splice(i,1);p=[{op:"page.add",page:t(n),index:i}]}if("meta.set"===h.op&&(p=[{op:"meta.set",patch:vt(e.meta,h.patch)}],e.meta=gt(e.meta,h.patch)),"media.set"===h.op&&(p=e.media[h.id]?[{op:"media.set",id:h.id,media:t(e.media[h.id])}]:[{op:"media.remove",id:h.id}],e.media[h.id]=t(h.media)),"media.remove"===h.op){if(!e.media[h.id])throw new Error(`Media ${h.id} does not exist.`);p=[{op:"media.set",id:h.id,media:t(e.media[h.id])}],delete e.media[h.id]}return{op:h,inverse:p,created:u}}function Et(e,i,n,r=[]){const o={};for(const s of/* @__PURE__ */new Set([...Object.keys(e),...Object.keys(i)]))if(!ft(e[s],i[s]))if(!r.includes(s)||!n[s]||"object"!=typeof n[s]||void 0!==e[s]&&"object"!=typeof e[s]||void 0!==i[s]&&"object"!=typeof i[s])ft(n[s],i[s])&&(o[s]=t(e[s]));else{const t=Et(e[s]??{},i[s]??{},n[s]);Object.keys(t).length&&(o[s]=t)}return o}function kt(n,r={}){r.sanitizeHTML&&function(t){let e;try{e=t('<img src="x" onerror="alert(1)"><script>alert(1)<\/script>')}catch(n){throw new Error(`sanitizeHTML failed on a safety probe (${n instanceof Error?n.message:n}).`)}if("string"!=typeof e)throw new Error("sanitizeHTML must return a string.");const i=e.toLowerCase();if(i.includes("onerror")||/<script\b/.test(i))throw new Error("sanitizeHTML must strip active HTML. Do not pass an identity function or a no-op.")}(r.sanitizeHTML);const o=t=>Q(t,d(r.kinds));let s=n?o(n):a();xt(s,r);let c=new Map(y(s).map(t=>[t.id,t]));const h=/* @__PURE__ */new Map,u=/* @__PURE__ */new Map,m=/* @__PURE__ */new Map,v=e=>{const i=t(e),n=t=>{t&&"object"==typeof t&&(Object.values(t).forEach(n),Object.freeze(t))};return n(i),i},w=t=>(c.get(t)?.children??s.pages.find(e=>e.id===t)?.items??[]).map(t=>t.id),x=()=>{c=new Map(y(s).map(t=>[t.id,t])),function(t){if(A>0)return t();T=++R,A++;try{return t()}finally{_()}}(()=>{for(const[t,e]of h){const i=c.get(t);ft(e.peek(),i)||(e.value=v(i))}for(const[t,e]of u)for(const[i,n]of e){const e=c.get(t)?.[i];ft(n.peek(),e)||(n.value=v(e))}for(const[t,e]of m){const i=w(t);ft(e.peek(),i)||(e.value=Object.freeze(i))}})},E=/* @__PURE__ */new Set,k=[],O=[];let Y=0;const j=[],B=/* @__PURE__ */new Map,I=/* @__PURE__ */new Map,N=()=>"hidden"===r.agentHistory,L=t=>t.startsWith("agent:"),D=(t,e)=>{let i=t.length-1;for(;i>=0&&!e(t[i].origin);)i--;return i},U=t=>{const e=/* @__PURE__ */new Map;for(const i of t.pages)for(const t of g(i.items))e.set(t.id,i.id);return e},P=()=>{Y=0,j.length=0,B.clear(),I.clear()},z=(e,i,n)=>(Y+=1,((t,e,i,n)=>{const r=new Map(y(t).map(t=>[t.id,t])),o=new Map(y(e).map(t=>[t.id,t])),s=U(t),a=U(e);for(const[d,c]of o){const t=r.get(d);t&&ft(t,c)||(B.set(d,{revision:i,origin:n,kind:c.kind,page:a.get(d)}),I.delete(d))}for(const[d,c]of r)o.has(d)||(B.delete(d),I.set(d,{revision:i,origin:n,kind:c.kind,page:s.get(d)}))})(i,n,Y,e.origin),j.push({...e,revision:Y,ops:t(e.ops)}),j.length>f.maxSessionLog&&j.shift(),Y),W=e=>{for(const i of E)try{i(t({ops:e.ops,inverse:e.inverse,origin:e.origin,label:e.label,revision:e.revision}))}catch{}};return{itemSignal(t){let e=h.get(t);return e||(e=H(v(c.get(t))),h.set(t,e)),e},fieldSignal(t,e){let i=u.get(t);i||(i=/* @__PURE__ */new Map,u.set(t,i));let n=i.get(e);return n||(n=H(v(c.get(t)?.[e])),i.set(e,n)),n},childrenSignal(t){let e=m.get(t);return e||(e=H(Object.freeze(w(t))),m.set(t,e)),e},apply(e,i={}){const n={ok:!1,created:[],errors:[],warnings:[]},o=i.origin??"api",a=!!i.lenient;if(r.readonly)return n.errors.push({index:0,code:"READONLY",message:"This document is read-only."}),n;if(void 0!==i.expectedRevision&&(!Number.isSafeInteger(i.expectedRevision)||i.expectedRevision!==Y))return n.errors.push({index:0,code:"STALE_REVISION",message:`Read the board again before editing. Expected revision ${i.expectedRevision}; current revision is ${Y}.`}),n;const d="user"===o?f.maxItems:f.maxBatch;if(!Array.isArray(e)||e.length>d)return n.errors.push({index:0,code:"BATCH_LIMIT",message:`A batch must be an array of at most ${d} operations for origin ${o}.`}),n;let c;try{wt(e),c=t(s)}catch(B){return n.errors.push({index:0,code:"INVALID_DATA",message:String(B instanceof Error?B.message:B)}),n}const h=o.startsWith("agent:")?b(c,e):{ops:e,warnings:[]};n.warnings.push(...h.warnings);const u=[],m=[],g=[],v=/* @__PURE__ */new Map,w=()=>new Set(u.filter(t=>"media.set"===t.op).map(t=>t.id)),M=h.ops;for(let s=0;s<M.length;s++){const e=a?t(c):void 0;try{const t=p(l,M[s]);if(t)throw new Error(t);const e=Mt(c,M[s],o,r);if("user"!==o&&n.created.length+e.created.length>f.maxBatch)throw new Error(`An agent batch may create at most ${f.maxBatch} items, including nested children.`);a&&xt(c,r,o,/* @__PURE__ */new Set([...w(),..."media.set"===e.op.op?[e.op.id]:[]])),u.push(e.op),m.unshift(...e.inverse),n.created.push(...e.created),e.created.forEach(t=>v.set(t,s))}catch(B){e&&(c=e),g.push({index:s,code:"INVALID_OP",message:`${M[s]?.op??"operation"} #${s+1}: ${B instanceof Error?B.message:String(B)}`})}}if(!a&&!g.length)try{xt(c,r,o,w())}catch(B){g.push({index:Math.max(0,e.length-1),code:"INVALID_DOCUMENT",message:B instanceof Error?B.message:String(B)})}if(!a&&g.length)return n.errors=g,n.created=[],n.warnings=[],n;if(a&&!u.length)return n.skipped=g,n.created=[],n;a&&g.length&&(n.skipped=g);const E=y(c),$=new Map(E.map(t=>[t.id,t]));for(const t of n.created){const e=$.get(t);e&&("connector"!==e.kind&&E.some(i=>i.id!==t&&!i.children?.length&&"connector"!==i.kind&&S(X(e,$),X(i,$)))&&n.warnings.push({index:v.get(t)??0,code:"OVERLAPS_EXISTING",message:`Item ${t} overlaps another item.`}))}if(n.ok=!0,i.dryRun||!u.length)return n;const j={ops:u,inverse:m,before:s,after:c,origin:o,label:i.label};s=c,x();const _=k.at(-1);return i.merge&&_&&_.origin===o&&_.label===j.label?(_.ops.push(...j.ops),_.inverse.unshift(...j.inverse),_.after=s):(k.push(j),k.length>f.maxHistory&&k.shift()),O.length=0,W({...j,revision:z({origin:o,label:i.label,ops:u},j.before,s)}),n},get:e=>t(c.get(e)),query:t=>M(s,t),describe:t=>$(s,t,{written:B,removed:I}),changesSince(e,i){const n=Y;if(!Number.isFinite(e)||e>=n)return{cursor:n,since:e,changes:[]};const r=j[0];if(r&&e+1<r.revision)return{cursor:n,since:e,changes:[],truncated:!0};let o=j.filter(t=>t.revision>e);const s=i?.origin;return"agent"===s?o=o.filter(t=>L(t.origin)):void 0!==s&&(o=o.filter(t=>t.origin===s)),{cursor:n,since:e,changes:t(o)}},kindsSince:t=>e(t),toJSON(e){const n=t(s);if(!1===e?.compact)return n;for(const t of n.pages)t.items=t.items.map(t=>i(t,d(r.kinds)));return n},undo(e){if(r.readonly)return!1;const i=e?.origin?D(k,t=>t===e.origin):N()?D(k,t=>!L(t)):k.length-1;if(i<0)return!1;const n=k[i],o=i!==k.length-1?function(t,e){return t.inverse.flatMap(i=>{if("set"===i.op){const n=ut(t.before,i.id)?.item,r=ut(t.after,i.id)?.item,o=ut(e,i.id)?.item;if(!n||!r||!o)return[];const s=Et(n,r,o,["style","text","data"]);return Object.keys(s).length?[{...i,patch:s}]:[]}if("meta.set"===i.op){const n=Et(t.before.meta,t.after.meta,e.meta);return Object.keys(n).length?[{...i,patch:n}]:[]}if("remove"===i.op)return ut(e,i.id)?[i]:[];if("add"===i.op)return ut(e,String(i.item.id))?[]:[i];if("order"===i.op||"reparent"===i.op){const n=ut(e,i.id),r=ut(t.after,i.id);return n&&r&&n.parent?.id===r.parent?.id&&n.page.id===r.page.id?[i]:[]}if("media.set"===i.op||"media.remove"===i.op)return ft(e.media[i.id],t.after.media[i.id])?[i]:[];if("page.set"===i.op){pt(i.patch);const n=t.before.pages.find(t=>t.id===i.id),r=t.after.pages.find(t=>t.id===i.id),o=e.pages.find(t=>t.id===i.id);if(!n||!r||!o)return[];const s=Et(n,r,o);return delete s.items,Object.keys(s).length?[{...i,patch:s}]:[]}return[i]})}(n,s):n.inverse,a=t(s),d=[],c=[];try{for(const t of o){const e=Mt(a,t,"user",r);d.push(e.op),c.unshift(...e.inverse)}xt(a,r)}catch{return!1}const h={ops:d,inverse:c,before:s,after:a,origin:n.origin,label:n.label},f=s;s=a,x(),k.splice(i,1),O.push(h);const l=`Undo ${n.label??"change"}`;return W({ops:d,inverse:c,origin:n.origin,label:l,revision:z({origin:n.origin,label:l,ops:d},f,s)}),!0},redo(){if(r.readonly)return!1;const e=N()?D(O,t=>!L(t)):O.length-1;if(e<0)return!1;const i=O[e],n=t(s),o=[],a=[];try{for(const t of i.inverse){const e=Mt(n,t,"user",r);o.push(e.op),a.unshift(...e.inverse)}xt(n,r)}catch{return!1}const d={ops:o,inverse:a,before:s,after:n,origin:i.origin,label:i.label},c=s;s=n,x(),O.splice(e,1),k.push(d);const h=`Redo ${d.label??"change"}`;return W({ops:o,inverse:a,origin:d.origin,label:h,revision:z({origin:d.origin,label:h,ops:o},c,s)}),!0},load(t){if(r.readonly)throw new Error("This document is read-only.");const e=o(t);xt(e,r),s=e,x(),k.length=0,O.length=0,P(),W({ops:[],inverse:[],origin:"api",label:"Load document",revision:0})},clear(){if(r.readonly)throw new Error("This document is read-only.");s=a(),x(),k.length=0,O.length=0,P(),W({ops:[],inverse:[],origin:"api",label:"Clear document",revision:0})},on:(t,e)=>(E.add(e),()=>E.delete(e)),get revision(){return Y},get canUndo(){return N()?k.some(t=>!L(t.origin)):k.length>0},get canRedo(){return N()?O.some(t=>!L(t.origin)):O.length>0}}}function $t(t){return(t?.getData("text/uri-list")?.split(/\r?\n/).find(t=>t&&!t.startsWith("#")))?.trim()||t?.getData("text/plain")||""}function St(t,e,i=0,n=t.length-1,r=Xt){for(;n>i;){if(n-i>600){const o=n-i+1,s=e-i+1,a=Math.log(o),d=.5*Math.exp(2*a/3),c=.5*Math.sqrt(a*d*(o-d)/o)*(s-o/2<0?-1:1);St(t,e,Math.max(i,Math.floor(e-s*d/o+c)),Math.min(n,Math.floor(e+(o-s)*d/o+c)),r)}const o=t[e];let s=i,a=n;for(Ot(t,i,e),r(t[n],o)>0&&Ot(t,i,n);s<a;){for(Ot(t,s,a),s++,a--;r(t[s],o)<0;)s++;for(;r(t[a],o)>0;)a--}0===r(t[i],o)?Ot(t,i,a):(a++,Ot(t,a,n)),a<=e&&(i=a+1),e<=a&&(n=a-1)}}function Ot(t,e,i){const n=t[e];t[e]=t[i],t[i]=n}function Xt(t,e){return t<e?-1:t>e?1:0}var Yt=class{constructor(t=9){this._maxEntries=Math.max(4,t),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()}all(){return this._all(this.data,[])}search(t){let e=this.data;const i=[];if(!Pt(t,e))return i;const n=this.toBBox,r=[];for(;e;){for(let o=0;o<e.children.length;o++){const s=e.children[o],a=e.leaf?n(s):s;Pt(t,a)&&(e.leaf?i.push(s):Ut(t,a)?this._all(s,i):r.push(s))}e=r.pop()}return i}collides(t){let e=this.data;if(!Pt(t,e))return!1;const i=[];for(;e;){for(let n=0;n<e.children.length;n++){const r=e.children[n],o=e.leaf?this.toBBox(r):r;if(Pt(t,o)){if(e.leaf||Ut(t,o))return!0;i.push(r)}}e=i.pop()}return!1}load(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(let e=0;e<t.length;e++)this.insert(t[e]);return this}let e=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===e.height)this._splitRoot(this.data,e);else{if(this.data.height<e.height){const t=this.data;this.data=e,e=t}this._insert(e,this.data.height-e.height-1,!0)}else this.data=e;return this}insert(t){return t&&this._insert(t,this.data.height-1),this}clear(){return this.data=zt([]),this}remove(t,e){if(!t)return this;let i=this.data;const n=this.toBBox(t),r=[],o=[];let s,a,d;for(;i||r.length;){if(i||(i=r.pop(),a=r[r.length-1],s=o.pop(),d=!0),i.leaf){const n=jt(t,i.children,e);if(-1!==n)return i.children.splice(n,1),r.push(i),this._condense(r),this}d||i.leaf||!Ut(i,n)?a?(s++,i=a.children[s],d=!1):i=null:(r.push(i),o.push(s),s=0,a=i,i=i.children[0])}return this}toBBox(t){return t}compareMinX(t,e){return t.minX-e.minX}compareMinY(t,e){return t.minY-e.minY}toJSON(){return this.data}fromJSON(t){return this.data=t,this}_all(t,e){const i=[];for(;t;)t.leaf?e.push(...t.children):i.push(...t.children),t=i.pop();return e}_build(t,e,i,n){const r=i-e+1;let o,s=this._maxEntries;if(r<=s)return o=zt(t.slice(e,i+1)),_t(o,this.toBBox),o;n||(n=Math.ceil(Math.log(r)/Math.log(s)),s=Math.ceil(r/Math.pow(s,n-1))),o=zt([]),o.leaf=!1,o.height=n;const a=Math.ceil(r/s),d=a*Math.ceil(Math.sqrt(s));Ht(t,e,i,d,this.compareMinX);for(let c=e;c<=i;c+=d){const e=Math.min(c+d-1,i);Ht(t,c,e,a,this.compareMinY);for(let i=c;i<=e;i+=a){const r=Math.min(i+a-1,e);o.children.push(this._build(t,i,r,n-1))}}return _t(o,this.toBBox),o}_chooseSubtree(t,e,i,n){for(;n.push(e),!e.leaf&&n.length-1!==i;){let i,n=1/0,r=1/0;for(let o=0;o<e.children.length;o++){const s=e.children[o],a=Lt(s),d=Tt(t,s)-a;d<r?(r=d,n=a<n?a:n,i=s):d===r&&a<n&&(n=a,i=s)}e=i||e.children[0]}return e}_insert(t,e,i){const n=i?t:this.toBBox(t),r=[],o=this._chooseSubtree(n,this.data,e,r);for(o.children.push(t),It(o,n);e>=0&&r[e].children.length>this._maxEntries;)this._split(r,e),e--;this._adjustParentBBoxes(n,r,e)}_split(t,e){const i=t[e],n=i.children.length,r=this._minEntries;this._chooseSplitAxis(i,r,n);const o=this._chooseSplitIndex(i,r,n),s=zt(i.children.splice(o,i.children.length-o));s.height=i.height,s.leaf=i.leaf,_t(i,this.toBBox),_t(s,this.toBBox),e?t[e-1].children.push(s):this._splitRoot(i,s)}_splitRoot(t,e){this.data=zt([t,e]),this.data.height=t.height+1,this.data.leaf=!1,_t(this.data,this.toBBox)}_chooseSplitIndex(t,e,i){let n,r=1/0,o=1/0;for(let s=e;s<=i-e;s++){const e=Bt(t,0,s,this.toBBox),a=Bt(t,s,i,this.toBBox),d=Dt(e,a),c=Lt(e)+Lt(a);d<r?(r=d,n=s,o=c<o?c:o):d===r&&c<o&&(o=c,n=s)}return n||i-e}_chooseSplitAxis(t,e,i){const n=t.leaf?this.compareMinX:Nt,r=t.leaf?this.compareMinY:At;this._allDistMargin(t,e,i,n)<this._allDistMargin(t,e,i,r)&&t.children.sort(n)}_allDistMargin(t,e,i,n){t.children.sort(n);const r=this.toBBox,o=Bt(t,0,e,r),s=Bt(t,i-e,i,r);let a=Rt(o)+Rt(s);for(let d=e;d<i-e;d++){const e=t.children[d];It(o,t.leaf?r(e):e),a+=Rt(o)}for(let d=i-e-1;d>=e;d--){const e=t.children[d];It(s,t.leaf?r(e):e),a+=Rt(s)}return a}_adjustParentBBoxes(t,e,i){for(let n=i;n>=0;n--)It(e[n],t)}_condense(t){for(let e,i=t.length-1;i>=0;i--)0===t[i].children.length?i>0?(e=t[i-1].children,e.splice(e.indexOf(t[i]),1)):this.clear():_t(t[i],this.toBBox)}};function jt(t,e,i){if(!i)return e.indexOf(t);for(let n=0;n<e.length;n++)if(i(t,e[n]))return n;return-1}function _t(t,e){Bt(t,0,t.children.length,e,t)}function Bt(t,e,i,n,r){r||(r=zt(null)),r.minX=1/0,r.minY=1/0,r.maxX=-1/0,r.maxY=-1/0;for(let o=e;o<i;o++){const e=t.children[o];It(r,t.leaf?n(e):e)}return r}function It(t,e){return t.minX=Math.min(t.minX,e.minX),t.minY=Math.min(t.minY,e.minY),t.maxX=Math.max(t.maxX,e.maxX),t.maxY=Math.max(t.maxY,e.maxY),t}function Nt(t,e){return t.minX-e.minX}function At(t,e){return t.minY-e.minY}function Lt(t){return(t.maxX-t.minX)*(t.maxY-t.minY)}function Rt(t){return t.maxX-t.minX+(t.maxY-t.minY)}function Tt(t,e){return(Math.max(e.maxX,t.maxX)-Math.min(e.minX,t.minX))*(Math.max(e.maxY,t.maxY)-Math.min(e.minY,t.minY))}function Dt(t,e){const i=Math.max(t.minX,e.minX),n=Math.max(t.minY,e.minY),r=Math.min(t.maxX,e.maxX),o=Math.min(t.maxY,e.maxY);return Math.max(0,r-i)*Math.max(0,o-n)}function Ut(t,e){return t.minX<=e.minX&&t.minY<=e.minY&&e.maxX<=t.maxX&&e.maxY<=t.maxY}function Pt(t,e){return e.minX<=t.maxX&&e.minY<=t.maxY&&e.maxX>=t.minX&&e.maxY>=t.minY}function zt(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function Ht(t,e,i,n,r){const o=[e,i];for(;o.length;){if((i=o.pop())-(e=o.pop())<=n)continue;const s=e+Math.ceil((i-e)/n/2)*n;St(t,s,e,i,r),o.push(e,s,s,i)}}function Wt(t,e,i=4,n,r){const o="function"==typeof r?r:void 0;if("group"===t.kind)return w(X(t,n,o),e);if("connector"===t.kind){const r=u(t,n,o).points;return r.slice(1).some((n,o)=>h(e,r[o],n)<=i+(t.style?.strokeWidth??2)/2)}const s=m(e,{x:t.x+t.w/2,y:t.y+t.h/2},-(t.rotation??0)),a=s.x-t.x,d=s.y-t.y,c=i+(t.style?.strokeWidth??2)/2,f=t.points??("line"===t.kind?[[0,0],[t.w,t.h]]:void 0);if(("line"===t.kind||"path"===t.kind)&&f){const e=f.map(([e,i])=>({x:t.x+e,y:t.y+i}));return t.closed&&O(s,e)||e.slice(1).some((t,i)=>h(s,e[i],t)<=c)}const l=!!t.text?.value||void 0!==t.style?.fill&&"none"!==t.style.fill||["note","text","image","video","link","html","group"].includes(t.kind),p="function"==typeof r?r(t):r;if(p){const t=Array.isArray(p)?p:[p],e={x:a,y:d};return t.some(t=>{if(!t.points.length)return!1;if(t.closed&&l&&O(e,t.points))return!0;const i=t.closed?[...t.points,t.points[0]]:t.points;return 1===i.length?h(e,i[0],i[0])<=c:i.slice(1).some((t,n)=>h(e,i[n],t)<=c)})}if("ellipse"===t.kind){const e=t.w/2,i=t.h/2;if(!e||!i)return!1;const n=Math.hypot((a-e)/e,(d-i)/i),r=c/Math.min(e,i);return l?n<=1+r:Math.abs(n-1)<=r}if("diamond"===t.kind){const e=[{x:t.w/2,y:0},{x:t.w,y:t.h/2},{x:t.w/2,y:t.h},{x:0,y:t.h/2}],i={x:a,y:d};return l&&O(i,e)||e.some((t,n)=>h(i,t,e[(n+1)%4])<=c)}return a>=-c&&a<=t.w+c&&d>=-c&&d<=t.h+c&&(l||a<=c||a>=t.w-c||d<=c||d>=t.h-c)}var Ct=class{outline;tree=new Yt;lookup=/* @__PURE__ */new Map;entries=/* @__PURE__ */new Map;constructor(t=[],e){this.outline=e,this.set(t)}set(t,e=this.outline){this.outline=e,this.tree.clear(),this.lookup=new Map(g(t).map(t=>[t.id,t]));const i=[];let n=0;const r=(t,e)=>{for(const o of t){const t=X(o,this.lookup,this.outline);i.push({minX:t.x,minY:t.y,maxX:t.x+t.w,maxY:t.y+t.h,item:o,order:n++,parents:e}),o.children&&r(o.children,[...e,o])}};r(t,[]),this.entries=new Map(i.map(t=>[t.item.id,t])),this.tree.load(i)}search(t){return this.tree.search({minX:t.x,minY:t.y,maxX:t.x+t.w,maxY:t.y+t.h}).filter(t=>!t.item.hidden&&!t.parents.some(t=>t.hidden)).sort((t,e)=>t.order-e.order).map(t=>t.item)}enclosed(t,e={}){const i=/* @__PURE__ */new Map,n=this.tree.search({minX:t.x,minY:t.y,maxX:t.x+t.w,maxY:t.y+t.h}),r=t=>{if(!(t.item.hidden||t.item.locked||e.ignore?.(t.item)||t.parents.some(t=>t.hidden||t.locked||e.ignore?.(t))))return{x:t.minX,y:t.minY,w:t.maxX-t.minX,h:t.maxY-t.minY}};for(const o of n){const n=r(o);if(!n||!x(t,n))continue;const s=o.parents.filter(t=>"group"===t.kind),a=s[s.findIndex(t=>t.id===e.enteredGroup)+1],d=a?this.entries.get(a.id):o;if(d.item.id===e.enteredGroup)continue;const c=d===o?n:r(d);c&&x(t,c)&&i.set(d.item.id,d)}return[...i.values()].sort((t,e)=>t.order-e.order).map(t=>t.item)}pick(t,e={}){const i=e.tolerance??6,n=this.tree.search({minX:t.x-i,minY:t.y-i,maxX:t.x+i,maxY:t.y+i}).sort((t,e)=>e.order-t.order);for(const r of n){if(r.item.hidden||e.ignore?.(r.item)||!e.includeLocked&&r.item.locked||r.parents.some(t=>t.hidden||e.ignore?.(t)||!e.includeLocked&&t.locked))continue;if(!Wt(r.item,t,i,this.lookup,e.outline??this.outline))continue;const n=r.parents.filter(t=>"group"===t.kind);return n[n.findIndex(t=>t.id===e.enteredGroup)+1]??r.item}}};export{kt as a,dt as c,ct as d,ht as f,$t as i,rt as l,H as m,Wt as n,et as o,Q as p,Yt as r,it as s,Ct as t,nt as u};
2
+ //# sourceMappingURL=picker-DZpEpkED.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker-DZpEpkED.js","names":[],"sources":["../../node_modules/@preact/signals-core/dist/signals-core.module.js","../../src/core/migrate.ts","../../src/core/links.ts","../../src/core/doc.ts","../../src/core/clipboard.ts","../../node_modules/quickselect/index.js","../../node_modules/rbush/index.js","../../src/geo/picker.ts"],"sourcesContent":["var i=Symbol.for(\"preact-signals\");function t(){if(!(v>1)){var i,t=!1;!function(){var i=c;c=void 0;while(void 0!==i){var t=i.S;if(t.v===i.v)for(var n=t.t;void 0!==n;n=n.x)if(n.i===i.i)n.i=t.i;i=i.o}}();while(void 0!==h){var n=h;h=void 0;s++;while(void 0!==n){var r=n.u;n.u=void 0;n.f&=-3;if(!(8&n.f)&&w(n))try{n.c()}catch(n){if(!t){i=n;t=!0}}n=r}}s=0;v--;if(t)throw i}else v--}function n(i){if(v>0)return i();e=++u;v++;try{return i()}finally{t()}}var r,o=void 0;function f(i){var t=o,n=r;o=void 0;r=void 0;try{return i()}finally{o=t;r=n}}var h=void 0,v=0,s=0,u=0,e=0,c=void 0,d=0;function a(i){if(void 0!==o){var t=i.n;if(void 0===t||t.t!==o){t={i:0,S:i,p:o.s,n:void 0,t:o,e:void 0,x:void 0,r:t};if(void 0!==o.s)o.s.n=t;o.s=t;i.n=t;if(32&o.f)i.S(t);return t}else if(-1===t.i){t.i=0;if(void 0!==t.n){t.n.p=t.p;if(void 0!==t.p)t.p.n=t.n;t.p=o.s;t.n=void 0;o.s.n=t;o.s=t}return t}}}function l(i,t){this.v=i;this.i=0;this.n=void 0;this.t=void 0;this.l=0;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}l.prototype.brand=i;l.prototype.h=function(){return!0};l.prototype.S=function(i){var t=this,n=this.t;if(n!==i&&void 0===i.e){i.x=n;this.t=i;if(void 0!==n)n.e=i;else f(function(){var i;null==(i=t.W)||i.call(t)})}};l.prototype.U=function(i){var t=this;if(void 0!==this.t){var n=i.e,r=i.x;if(void 0!==n){n.x=r;i.e=void 0}if(void 0!==r){r.e=n;i.x=void 0}if(i===this.t){this.t=r;if(void 0===r)f(function(){var i;null==(i=t.Z)||i.call(t)})}}};l.prototype.subscribe=function(i){var t=this;return j(function(){var n=t.value;f(function(){return i(n)})},{name:\"sub\"})};l.prototype.valueOf=function(){return this.value};l.prototype.toString=function(){return this.value+\"\"};l.prototype.toJSON=function(){return this.value};l.prototype.peek=function(){var i=this;return f(function(){return i.value})};Object.defineProperty(l.prototype,\"value\",{get:function(){var i=a(this);if(void 0!==i)i.i=this.i;return this.v},set:function(i){if(i!==this.v){if(s>100)throw new Error(\"Cycle detected\");!function(i){if(0!==v&&0===s)if(i.l!==e){i.l=e;c={S:i,v:i.v,i:i.i,o:c}}}(this);this.v=i;this.i++;d++;v++;try{for(var n=this.t;void 0!==n;n=n.x)n.t.N()}finally{t()}}}});function y(i,t){return new l(i,t)}function w(i){for(var t=i.s;void 0!==t;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return!0;return!1}function _(i){for(var t=i.s;void 0!==t;t=t.n){var n=t.S.n;if(void 0!==n)t.r=n;t.S.n=t;t.i=-1;if(void 0===t.n){i.s=t;break}}}function b(i){var t=i.s,n=void 0;while(void 0!==t){var r=t.p;if(-1===t.i){t.S.U(t);if(void 0!==r)r.n=t.n;if(void 0!==t.n)t.n.p=r}else n=t;t.S.n=t.r;if(void 0!==t.r)t.r=void 0;t=r}i.s=n}function p(i,t){l.call(this,void 0,t);this.x=i;this.s=void 0;this.g=d-1;this.f=4}p.prototype=new l;p.prototype.h=function(){this.f&=-3;if(1&this.f)return!1;if(32==(36&this.f))return!0;this.f&=-5;if(this.g===d)return!0;this.g=d;this.f|=1;if(this.i>0&&!w(this)){this.f&=-2;return!0}var i=o;try{_(this);o=this;var t=this.x();if(16&this.f||this.v!==t||0===this.i){this.v=t;this.f&=-17;this.i++}}catch(i){this.v=i;this.f|=16;this.i++}o=i;b(this);this.f&=-2;return!0};p.prototype.S=function(i){if(void 0===this.t){this.f|=36;for(var t=this.s;void 0!==t;t=t.n)t.S.S(t)}l.prototype.S.call(this,i)};p.prototype.U=function(i){if(void 0!==this.t){l.prototype.U.call(this,i);if(void 0===this.t){this.f&=-33;for(var t=this.s;void 0!==t;t=t.n)t.S.U(t)}}};p.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var i=this.t;void 0!==i;i=i.x)i.t.N()}};Object.defineProperty(p.prototype,\"value\",{get:function(){if(1&this.f)throw new Error(\"Cycle detected\");var i=a(this);this.h();if(void 0!==i)i.i=this.i;if(16&this.f)throw this.v;return this.v}});function g(i,t){return new p(i,t)}function S(i){var n=i.m;i.m=void 0;if(\"function\"==typeof n){v++;var r=o;o=void 0;try{n()}catch(t){i.f&=-2;i.f|=8;m(i);throw t}finally{o=r;t()}}}function m(i){for(var t=i.s;void 0!==t;t=t.n)t.S.U(t);i.x=void 0;i.s=void 0;S(i)}function x(i){if(o!==this)throw new Error(\"Out-of-order effect\");b(this);o=i;this.f&=-2;if(8&this.f)m(this);t()}function E(i,t){this.x=i;this.m=void 0;this.s=void 0;this.u=void 0;this.f=32;this.name=null==t?void 0:t.name;if(r)r.push(this)}E.prototype.c=function(){var i=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var t=this.x();if(\"function\"==typeof t)this.m=t}finally{i()}};E.prototype.S=function(){if(1&this.f)throw new Error(\"Cycle detected\");this.f|=1;this.f&=-9;S(this);_(this);v++;var i=o;o=this;return x.bind(this,i)};E.prototype.N=function(){if(!(2&this.f)){this.f|=2;this.u=h;h=this}};E.prototype.d=function(){this.f|=8;if(!(1&this.f))m(this)};E.prototype.dispose=function(){this.d()};function j(i,t){var n=new E(i,t);try{n.c()}catch(i){n.d();throw i}var r=n.d.bind(n);r[Symbol.dispose]=r;return r}function C(i){return function(){var t=arguments,r=this;return n(function(){return f(function(){return i.apply(r,[].slice.call(t))})})}}function O(){var i=r;r=[];return function(){var t=r;if(r&&i)i=i.concat(r);r=i;return t}}var k=function(i){for(var t in i){var n=i[t];if(\"function\"==typeof n)i[t]=C(n);else if(\"object\"==typeof n&&null!==n&&!(\"brand\"in n))k(n)}};function T(i){return function(){var t,n,o=O();try{n=i.apply(void 0,[].slice.call(arguments))}catch(i){r=void 0;throw i}finally{t=o()}k(n);n[Symbol.dispose]=C(function(){if(t)for(var i=0;i<t.length;i++)t[i].dispose();t=void 0});return n}}export{p as Computed,E as Effect,l as Signal,C as action,n as batch,g as computed,T as createModel,j as effect,y as signal,f as untracked};//# sourceMappingURL=signals-core.module.js.map\n","import type { AnnieDoc, Item, NewItem } from './types';\nimport { clone, normalizeItem } from './defaults';\nimport { flattenItems } from '../geo/box';\n\n/** Retired containers become editable groups; no child or visible label is discarded. */\nfunction convertContainers(pages: AnnieDoc['pages']) {\n const ids = new Set(\n flattenItems(pages.flatMap((page) => page.items ?? [])).map((item) => item.id),\n );\n const unique = (base: string) => {\n let id = base;\n for (let suffix = 2; ids.has(id); suffix++) id = `${base}_${suffix}`;\n ids.add(id);\n return id;\n };\n const convert = (input: NewItem): NewItem => {\n const children = input.children?.map(convert);\n if (input.kind !== 'frame') return { ...input, ...(children ? { children } : {}) };\n const { clip, title, text, style, ...rest } = input;\n const box = { x: input.x ?? 0, y: input.y ?? 0, w: input.w ?? 600, h: input.h ?? 400 };\n const parts: NewItem[] = [\n {\n kind: 'rect',\n id: unique(`${input.id}_background`),\n ...box,\n rotation: input.rotation,\n style: { fill: 'paper', strokeWidth: 1.5, ...style },\n ...(text ? { text } : {}),\n },\n ];\n const label = typeof title === 'string' ? title : input.name;\n if (label)\n parts.push({\n kind: 'text',\n id: unique(`${input.id}_label`),\n x: box.x,\n y: box.y - 30,\n w: box.w,\n h: 20,\n text: { value: label, size: 14, align: 'start', valign: 'top' },\n });\n return {\n ...rest,\n ...box,\n kind: 'group',\n name: input.name ?? label,\n children: [...parts, ...(children ?? [])],\n };\n };\n return pages.map((page) => ({\n ...page,\n items: Array.isArray(page.items) ? page.items.map(convert) : page.items,\n }));\n}\nexport const CURRENT_VERSION = 2;\nexport const migrations: Record<number, (doc: Record<string, unknown>) => Record<string, unknown>> =\n {\n 1: (doc) => ({\n ...doc,\n format: 'anniedrawing',\n version: 1,\n media: doc.media ?? {},\n meta: doc.meta ?? { title: 'Untitled board' },\n }),\n 2: (doc) => {\n const { sheets, ...rest } = doc;\n const pages = sheets ?? doc.pages;\n return {\n ...rest,\n version: 2,\n pages: Array.isArray(pages)\n ? pages.map((page: Record<string, unknown>) => ({\n ...page,\n name:\n typeof page.name === 'string' && /^Sheet [1-9]\\d*$/.test(page.name)\n ? page.name.replace(/^Sheet /, 'Page ')\n : page.name,\n }))\n : pages,\n };\n },\n };\n\n/** Load any supported version. Retired `frame` items become groups on every import. */\nexport function migrate(\n input: unknown,\n kindDefaults: Record<string, Partial<Item>> = {},\n): AnnieDoc {\n if (!input || typeof input !== 'object') throw new Error('A drawing must be a JSON object.');\n let doc = clone(input) as Record<string, unknown>;\n if (doc.format !== undefined && doc.format !== 'anniedrawing')\n throw new Error('This is not an AnnieDrawing document.');\n const version = doc.version ?? 0;\n if (typeof version !== 'number' || !Number.isInteger(version) || version < 0)\n throw new Error('Invalid drawing version.');\n if (version > CURRENT_VERSION)\n throw new Error(\n `Drawing version ${version} is newer than supported version ${CURRENT_VERSION}.`,\n );\n for (let next = version + 1; next <= CURRENT_VERSION; next++) doc = migrations[next](doc);\n const result = doc as unknown as AnnieDoc;\n if (Array.isArray(result.pages))\n result.pages = convertContainers(result.pages).map((page) => ({\n ...page,\n items: Array.isArray(page.items)\n ? page.items.map((item) => normalizeItem(item, kindDefaults))\n : page.items,\n }));\n return result;\n}\n","export type VideoProvider = 'youtube' | 'vimeo';\nexport interface VideoRef {\n provider: VideoProvider;\n id: string;\n hash?: string;\n}\nexport interface LinkPreview {\n title?: string;\n description?: string;\n image?: string;\n}\n\nconst YT = /^[\\w-]{11}$/;\n/** Raster image data URLs accepted as image items. */\nexport const IMAGE_DATA_URL = /^data:image\\/(png|jpeg|gif|webp|avif);base64,[a-z0-9+/=\\s]+$/i;\n/** Image media table sources, including SVG. */\nexport const MEDIA_DATA_URL =\n /^data:image\\/(png|jpeg|gif|webp|avif|svg\\+xml);base64,[a-z0-9+/=\\s]+$/i;\n\nexport function normalizeHref(value?: string): string | undefined {\n if (typeof value !== 'string') return;\n const text = value.trim();\n if (IMAGE_DATA_URL.test(text)) return text.replace(/\\s+/g, '');\n try {\n const url = new URL(text);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return;\n url.username = url.password = '';\n return url.href;\n } catch {\n return;\n }\n}\n\n/** True for http(s) URLs whose host is not loopback, link-local, ULA, or RFC1918. */\nexport function isPublicHttpUrl(value: string): boolean {\n try {\n const url = new URL(value);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false;\n if (url.username || url.password) return false;\n return !isPrivateOrLocalHostname(url.hostname);\n } catch {\n return false;\n }\n}\n\nfunction isPrivateOrLocalHostname(host: string): boolean {\n const hostname = host\n .replace(/^\\[|\\]$/g, '')\n .replace(/\\.+$/, '')\n .toLowerCase();\n if (\n hostname === 'localhost' ||\n hostname === '0.0.0.0' ||\n hostname === '::' ||\n hostname.endsWith('.localhost') ||\n hostname.endsWith('.local') ||\n hostname.endsWith('.internal')\n )\n return true;\n const prefix = hostname.match(/^(\\d{1,3}(?:\\.\\d{1,3}){3})(?:\\.|$)/);\n if (prefix && isPrivateIPv4(prefix[1])) return true;\n const v4 = ipv4Address(hostname);\n if (v4) return isPrivateIPv4(v4);\n const v6 = parseIPv6(hostname);\n if (!v6) return false;\n if (v6.every((part) => part === 0)) return true;\n if (v6[7] === 1 && v6.slice(0, 7).every((part) => part === 0)) return true;\n if ((v6[0] & 0xffc0) === 0xfe80 || (v6[0] & 0xfe00) === 0xfc00 || (v6[0] & 0xff00) === 0xff00)\n return true;\n const mapped = mappedIPv4(v6);\n return mapped ? isPrivateIPv4(mapped) : false;\n}\n\nfunction isPrivateIPv4(value: string): boolean {\n const parts = value.split('.').map(Number);\n if (parts.length !== 4 || parts.some((n) => n > 255)) return false;\n const [a, b] = parts;\n if (a === 0 || a === 10 || a === 127) return true;\n if (a === 169 && b === 254) return true;\n if (a === 192 && b === 168) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 100 && b >= 64 && b <= 127) return true;\n if (a === 198 && (b === 18 || b === 19)) return true;\n return a >= 224;\n}\n\nfunction ipv4Address(hostname: string): string | undefined {\n if (/^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(hostname)) return hostname;\n const v6 = parseIPv6(hostname);\n return v6 ? mappedIPv4(v6) : undefined;\n}\n\nfunction mappedIPv4(groups: number[]): string | undefined {\n const last = `${(groups[6] >> 8) & 255}.${groups[6] & 255}.${(groups[7] >> 8) & 255}.${groups[7] & 255}`;\n if (\n groups[0] === 0 &&\n groups[1] === 0 &&\n groups[2] === 0 &&\n groups[3] === 0 &&\n groups[4] === 0 &&\n groups[5] === 0xffff\n )\n return last;\n if (groups[0] === 0x64 && groups[1] === 0xff9b && groups.slice(2, 6).every((part) => part === 0))\n return last;\n return;\n}\n\nfunction parseIPv6(host: string): number[] | undefined {\n if (!host.includes(':')) return;\n let value = host;\n const dotted = value.match(/:(\\d{1,3}(?:\\.\\d{1,3}){3})$/);\n if (dotted) {\n const [a, b, c, d] = dotted[1].split('.').map(Number);\n if ([a, b, c, d].some((n) => n > 255)) return;\n value = `${value.slice(0, -dotted[1].length)}${(a << 8) | b}:${(c << 8) | d}`;\n }\n const halves = value.split('::');\n if (halves.length > 2) return;\n const parse = (side: string | undefined) =>\n side\n ? side\n .split(':')\n .filter(Boolean)\n .map((part) => (/^[0-9a-f]{1,4}$/i.test(part) ? parseInt(part, 16) : NaN))\n : [];\n const head = parse(halves[0]);\n const tail = halves.length === 2 ? parse(halves[1]) : [];\n if (head.some(Number.isNaN) || tail.some(Number.isNaN)) return;\n if (halves.length === 1) return head.length === 8 ? head : undefined;\n const missing = 8 - head.length - tail.length;\n if (missing < 0) return;\n return [...head, ...Array(missing).fill(0), ...tail];\n}\n\nexport function hostnameOf(href: string): string {\n try {\n return new URL(href).hostname.replace(/^www\\./, '');\n } catch {\n return href;\n }\n}\n\nexport function parseVideo(href?: string): VideoRef | undefined {\n const normalized = normalizeHref(href);\n if (!normalized || normalized.startsWith('data:')) return;\n const url = new URL(normalized);\n const host = url.hostname.replace(/^(www|m)\\./, '');\n const parts = url.pathname.split('/').filter(Boolean);\n if (host.includes('youtu')) {\n const id =\n host === 'youtu.be'\n ? parts[0]\n : (url.searchParams.get('v') ??\n parts[parts.findIndex((part) => /^(embed|shorts|live|v)$/.test(part)) + 1]);\n if (id && YT.test(id)) return { provider: 'youtube', id };\n }\n if (!/^(player\\.)?vimeo\\.com$/.test(host)) return;\n const start = parts[0] === 'video' || host.startsWith('player') ? 1 : 0;\n const id = parts[start];\n if (!id || !/^\\d+$/.test(id)) return;\n const hash = url.searchParams.get('h') ?? parts[start + 1]?.match(/^[\\w]+$/)?.[0];\n return { provider: 'vimeo', id, ...(hash ? { hash } : {}) };\n}\n\nexport function videoEmbed(href?: string): string | undefined {\n const video = parseVideo(href);\n if (!video) return;\n return video.provider === 'youtube'\n ? `https://www.youtube-nocookie.com/embed/${video.id}?rel=0`\n : `https://player.vimeo.com/video/${video.id}${video.hash ? `?h=${encodeURIComponent(video.hash)}` : ''}`;\n}\n","import { batch, signal, type Signal, type ReadonlySignal } from '@preact/signals-core';\nimport type {\n AnnieDoc,\n ApplyIssue,\n ApplyResult,\n ChangeEvent,\n ChangeSlice,\n DocModel,\n DocOptions,\n Item,\n NewItem,\n Op,\n Page,\n Style,\n} from './types';\nimport { kindsSince } from './catalog';\nimport {\n aliasStyle,\n clone,\n defaultDoc,\n kindDefaultsFrom,\n minimalItem,\n normalizeItem,\n storedEndpoint,\n} from './defaults';\nimport type { ItemStamp } from '../agent/describe';\nimport { allItems, detachMissingEndpoints, pageRoots, remapAgentCreateIds } from './item';\nimport { DocumentSchema, LIMITS, OpSchema, schemaError } from './schema';\nimport { migrate } from './migrate';\nimport { pageId } from './ids';\nimport { flattenItems, intersects, itemBounds } from '../geo/box';\nimport { placeItem } from '../agent/place';\nimport { queryDoc } from '../agent/query';\nimport { describeDoc } from '../agent/describe';\nimport { MEDIA_DATA_URL, normalizeHref, parseVideo } from './links';\ninterface Location {\n item: Item;\n list: Item[];\n index: number;\n parent?: Item;\n page: Page;\n}\ninterface Entry {\n ops: Op[];\n inverse: Op[];\n before: AnnieDoc;\n after: AnnieDoc;\n origin: string;\n label?: string;\n}\nconst equal = (a: unknown, b: unknown) => JSON.stringify(a) === JSON.stringify(b);\nfunction escapeHtml(html: string, sanitize?: DocOptions['sanitizeHTML']): string {\n return sanitize\n ? sanitize(html)\n : html\n .replace(/&(?!(?:amp|lt|gt|quot|apos|#\\d+|#x[\\da-f]+);)/gi, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\nconst SANITIZER_PROBE = '<img src=\"x\" onerror=\"alert(1)\"><script>alert(1)</script>';\nfunction assertEffectiveSanitizer(sanitize: (html: string) => string): void {\n let out: string;\n try {\n out = sanitize(SANITIZER_PROBE);\n } catch (error) {\n throw new Error(\n `sanitizeHTML failed on a safety probe (${error instanceof Error ? error.message : error}).`,\n );\n }\n if (typeof out !== 'string') throw new Error('sanitizeHTML must return a string.');\n const lower = out.toLowerCase();\n if (lower.includes('onerror') || /<script\\b/.test(lower))\n throw new Error(\n 'sanitizeHTML must strip active HTML. Do not pass an identity function or a no-op.',\n );\n}\nfunction assertPagePatch(patch: object): void {\n if (Object.keys(patch).some((key) => key !== 'name' && key !== 'background'))\n throw new Error(\n 'page.set may only update name and background. Use item operations to change page content.',\n );\n}\nfunction locate(doc: AnnieDoc, id: string): Location | undefined {\n for (const page of doc.pages) {\n const walk = (list: Item[], parent?: Item): Location | undefined => {\n for (let index = 0; index < list.length; index++) {\n const item = list[index];\n if (item.id === id) return { item, list, index, parent, page };\n if (item.children) {\n const found = walk(item.children, item);\n if (found) return found;\n }\n }\n };\n const result = walk(page.items);\n if (result) return result;\n }\n}\nfunction requireItem(doc: AnnieDoc, id: string): Location {\n const result = locate(doc, id);\n if (!result) {\n const candidates = allItems(doc)\n .map((i) => i.id)\n .slice(0, 5);\n throw new Error(\n `Item ${id} does not exist.${candidates.length ? ` Known ids: ${candidates.join(', ')}.` : ''}`,\n );\n }\n return result;\n}\nfunction mergePatch<T extends object>(target: T, patch: Partial<T>, nested: string[] = []): T {\n const next = { ...target } as Record<string, unknown>;\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n delete next[key];\n continue;\n }\n if (nested.includes(key) && value && typeof value === 'object' && !Array.isArray(value)) {\n const old = next[key];\n next[key] = mergePatch(old && typeof old === 'object' ? (old as object) : {}, value);\n } else next[key] = clone(value);\n }\n return next as T;\n}\nfunction inversePatch(\n target: object,\n patch: object,\n nested: string[] = [],\n): Record<string, unknown> {\n const before = target as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(patch)) {\n const value = (patch as Record<string, unknown>)[key];\n result[key] =\n nested.includes(key) &&\n value &&\n typeof value === 'object' &&\n before[key] &&\n typeof before[key] === 'object'\n ? inversePatch(before[key] as object, value as object)\n : clone(before[key]);\n }\n return result;\n}\nfunction assertSafeJSON(value: unknown, depth = 0, seen = new Set<unknown>()): void {\n if (depth > LIMITS.maxJsonDepth)\n throw new Error(`Document data exceeds maximum nesting depth ${LIMITS.maxJsonDepth}.`);\n if (\n value === undefined ||\n value === null ||\n typeof value === 'boolean' ||\n typeof value === 'string'\n )\n return;\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) throw new Error('All numbers must be finite.');\n return;\n }\n if (typeof value !== 'object') throw new Error('Document values must be plain JSON data.');\n if (seen.has(value)) throw new Error('Circular document data is not supported.');\n const proto = Object.getPrototypeOf(value);\n if (!Array.isArray(value) && proto !== Object.prototype && proto !== null)\n throw new Error('Document values must be plain JSON objects.');\n seen.add(value);\n for (const [key, child] of Object.entries(value)) {\n if (['__proto__', 'prototype', 'constructor'].includes(key))\n throw new Error(`Unsafe property ${key}.`);\n assertSafeJSON(child, depth + 1, seen);\n }\n seen.delete(value);\n}\nfunction validateDoc(\n doc: AnnieDoc,\n options: DocOptions = {},\n origin = 'user',\n restrictedMedia?: Set<string>,\n): void {\n assertSafeJSON(doc);\n const error = schemaError(DocumentSchema, doc);\n if (error) throw new Error(error);\n const ids = new Set<string>(),\n pageIds = new Set<string>();\n let count = 0;\n for (const page of doc.pages) {\n if (pageIds.has(page.id)) throw new Error(`Duplicate page id ${page.id}.`);\n pageIds.add(page.id);\n const walk = (list: Item[], depth: number) => {\n if (depth > LIMITS.maxDepth) throw new Error('Item nesting is too deep.');\n for (const item of list) {\n count++;\n if (typeof item.id !== 'string' || !item.id)\n throw new Error('Every item must have a stable string id.');\n for (const field of ['x', 'y', 'w', 'h'] as const)\n if (typeof item[field] !== 'number' || !Number.isFinite(item[field]))\n throw new Error(`Item ${item.id} requires finite ${field}.`);\n if (ids.has(item.id)) throw new Error(`Duplicate item id ${item.id}.`);\n ids.add(item.id);\n if (item.children && item.kind !== 'group')\n throw new Error(`Only groups may contain children (${item.id}).`);\n if (item.kind === 'connector' && (!item.from || !item.to))\n throw new Error(`Connector ${item.id} needs both from and to endpoints.`);\n if (item.kind === 'image' && (!item.media || !doc.media[item.media]))\n throw new Error(`Image ${item.id} references missing media ${item.media ?? '(unset)'}.`);\n if (item.kind === 'video' || item.kind === 'link' || item.href !== undefined) {\n if (!normalizeHref(item.href)) throw new Error(`Bad href (${item.id}).`);\n if (item.kind === 'video' && !parseVideo(item.href))\n throw new Error(`Bad video (${item.id}).`);\n }\n const customSchema = options.kinds?.find((kind) => kind.kind === item.kind)?.schema;\n if (customSchema) {\n const customError = schemaError(customSchema as Parameters<typeof schemaError>[0], item);\n if (customError) throw new Error(`${item.kind} ${item.id}: ${customError}`);\n }\n if (item.children) walk(item.children, depth + 1);\n }\n };\n walk(page.items, 0);\n }\n if (count > LIMITS.maxItems)\n throw new Error(`A document may contain at most ${LIMITS.maxItems} items.`);\n for (const page of doc.pages) {\n const local = flattenItems(page.items),\n localIds = new Map(local.map((i) => [i.id, i]));\n for (const item of local)\n for (const endpoint of [item.from, item.to])\n if (endpoint && 'item' in endpoint) {\n const target = localIds.get(endpoint.item);\n if (!target)\n throw new Error(`Endpoint ${endpoint.item} does not exist on page ${page.id}.`);\n if (target.kind === 'connector' || target.id === item.id)\n throw new Error(\n `Connector endpoints must attach to a non-connector item (${endpoint.item}).`,\n );\n }\n }\n for (const [mediaId, media] of Object.entries(doc.media)) {\n const data = MEDIA_DATA_URL.test(media.src);\n let url: URL | undefined;\n try {\n url = new URL(media.src);\n } catch {\n /* Validation below reports a useful error. */\n }\n if (!data && (!url || !['http:', 'https:'].includes(url.protocol)))\n throw new Error('Images must use an image data URL or an HTTP(S) URL.');\n if (url && (url.username || url.password))\n throw new Error('Image URLs must not include credentials.');\n if (\n origin !== 'user' &&\n (!restrictedMedia || restrictedMedia.has(mediaId)) &&\n !data &&\n url &&\n !options.allowedImageOrigins?.includes(url.origin)\n )\n throw new Error(\n `Image origin ${url.origin} is not allowed. Pass allowedImageOrigins when creating the board.`,\n );\n }\n}\nfunction cleanHref(item: Item): void {\n if (item.href === undefined) return;\n const href = normalizeHref(item.href);\n if (!href) throw new Error(`Bad href (${item.id}).`);\n item.href = href;\n item.children?.forEach(cleanHref);\n}\nfunction sanitizeAgentItems(item: Item, sanitizeHTML?: DocOptions['sanitizeHTML']): void {\n if (item.html !== undefined) item.html = escapeHtml(item.html, sanitizeHTML);\n if (item.mount) delete item.mount;\n item.children?.forEach((child) => sanitizeAgentItems(child, sanitizeHTML));\n}\nfunction perform(\n doc: AnnieDoc,\n raw: Op,\n origin: string,\n options: DocOptions = {},\n): {\n op: Op;\n inverse: Op[];\n created: string[];\n} {\n const op = clone(raw),\n kindDefaults = kindDefaultsFrom(options.kinds);\n const outline = (item: Item) =>\n options.kinds?.find((kind) => kind.kind === item.kind)?.outline?.(item);\n let inverse: Op[] = [],\n created: string[] = [];\n if (op.op === 'add') {\n let item = normalizeItem(op.item, kindDefaults);\n if (origin !== 'user') sanitizeAgentItems(item, options.sanitizeHTML);\n cleanHref(item);\n const parentId = op.parent ?? op.place?.inside,\n parent = parentId ? requireItem(doc, parentId) : undefined;\n if (parent && parent.item.kind !== 'group')\n throw new Error(`Parent ${parentId} must be a group.`);\n const page = parent?.page ?? doc.pages.find((page) => (op.page ? page.id === op.page : true));\n if (!page) throw new Error(`Page ${op.page ?? '(first)'} does not exist.`);\n if (parent && op.page && op.page !== parent.page.id)\n throw new Error('Parent and page must refer to the same page.');\n if (op.place) {\n const gap =\n op.place.gap ?? (origin.startsWith('agent:') ? (options.agentPlaceGap ?? 32) : 32);\n item = placeItem(item, { ...op.place, gap }, flattenItems(page.items));\n }\n const list = parent ? (parent.item.children ??= []) : page.items;\n if (op.index !== undefined && op.index > list.length)\n throw new Error('Insert index is outside the target list.');\n list.splice(op.index ?? list.length, 0, item);\n inverse = [{ op: 'remove', id: item.id }];\n created = flattenItems([item]).map((i) => i.id);\n return {\n op: {\n op: 'add',\n item: clone(item),\n page: page.id,\n ...(parent ? { parent: parent.item.id } : {}),\n ...(op.index !== undefined ? { index: op.index } : {}),\n },\n inverse,\n created,\n };\n }\n if (op.op === 'set') {\n const at = requireItem(doc, op.id);\n const oldLookup = Object.hasOwn(op.patch, 'children')\n ? new Map(allItems(doc).map((item) => [item.id, item]))\n : undefined;\n if (Object.hasOwn(op.patch, 'id') && op.patch.id !== op.id)\n throw new Error('Item ids cannot be changed.');\n inverse = [\n { op: 'set', id: op.id, patch: inversePatch(at.item, op.patch, ['style', 'text', 'data']) },\n ];\n const incoming = clone(op.patch);\n const { from, to, style, children, ...rest } = incoming;\n const patch: Partial<Item> = { ...(rest as Partial<Item>) };\n if (Object.hasOwn(incoming, 'style')) patch.style = aliasStyle(style as Style | undefined);\n if (Object.hasOwn(incoming, 'from')) patch.from = storedEndpoint(from);\n if (Object.hasOwn(incoming, 'to')) patch.to = storedEndpoint(to);\n if (Object.hasOwn(incoming, 'children'))\n patch.children = children\n ? (children as NewItem[]).map((child) => normalizeItem(child, kindDefaults))\n : undefined;\n for (const field of ['kind', 'x', 'y', 'w', 'h'] as const)\n if (Object.hasOwn(patch, field) && patch[field] === undefined)\n throw new Error(`Required field ${field} cannot be deleted.`);\n if (typeof patch.href === 'string') {\n const href = normalizeHref(patch.href);\n if (!href) throw new Error(`Bad href (${op.id}).`);\n patch.href = href;\n }\n if (origin !== 'user') {\n if (typeof patch.html === 'string') patch.html = escapeHtml(patch.html, options.sanitizeHTML);\n if (Object.hasOwn(patch, 'mount')) delete patch.mount;\n if (patch.children)\n patch.children.forEach((child) => sanitizeAgentItems(child, options.sanitizeHTML));\n }\n at.list[at.index] = mergePatch(at.item, patch, ['style', 'text', 'data']);\n if (oldLookup) {\n const newDescendants = new Set(\n flattenItems(at.list[at.index].children ?? []).map((item) => item.id),\n );\n created = [...newDescendants].filter((id) => !oldLookup.has(id));\n inverse.push(...detachMissingEndpoints(pageRoots(doc), oldLookup, outline));\n }\n return { op: { ...op, patch }, inverse, created };\n }\n if (op.op === 'remove') {\n const at = requireItem(doc, op.id),\n lookup = new Map(allItems(doc).map((i) => [i.id, i]));\n inverse = [\n {\n op: 'add',\n item: clone(at.item),\n page: at.page.id,\n ...(at.parent ? { parent: at.parent.id } : {}),\n index: at.index,\n },\n ];\n at.list.splice(at.index, 1);\n inverse.push(...detachMissingEndpoints(pageRoots(doc), lookup, outline));\n }\n if (op.op === 'order') {\n const at = requireItem(doc, op.id),\n to =\n typeof op.to === 'number'\n ? op.to\n : op.to === 'front'\n ? at.list.length - 1\n : op.to === 'back'\n ? 0\n : op.to === 'forward'\n ? Math.min(at.list.length - 1, at.index + 1)\n : Math.max(0, at.index - 1);\n if (to >= at.list.length) throw new Error('Order index is outside the item list.');\n at.list.splice(at.index, 1);\n at.list.splice(to, 0, at.item);\n inverse = [{ op: 'order', id: op.id, to: at.index }];\n }\n if (op.op === 'reparent') {\n const at = requireItem(doc, op.id),\n parent = op.parent ? requireItem(doc, op.parent) : undefined;\n if (parent && parent.item.kind !== 'group') throw new Error('New parent must be a group.');\n if (parent && flattenItems([at.item]).some((i) => i.id === parent.item.id))\n throw new Error('An item cannot be placed inside itself or a descendant.');\n if (parent && parent.page.id !== at.page.id)\n throw new Error('Reparenting across pages is not supported.');\n inverse = [{ op: 'reparent', id: op.id, parent: at.parent?.id ?? null, index: at.index }];\n at.list.splice(at.index, 1);\n const list = parent ? (parent.item.children ??= []) : at.page.items;\n if (op.index !== undefined && op.index > list.length)\n throw new Error('Reparent index is outside the target list.');\n list.splice(op.index ?? list.length, 0, at.item);\n }\n if (op.op === 'page.add') {\n const page: Page = {\n ...op.page,\n id: op.page.id ?? pageId(),\n items: (op.page.items ?? []).map((item) => normalizeItem(item, kindDefaults)),\n };\n if (origin !== 'user')\n page.items.forEach((item) => sanitizeAgentItems(item, options.sanitizeHTML));\n if (op.index !== undefined && op.index > doc.pages.length)\n throw new Error('Page insert index is outside the page list.');\n doc.pages.splice(op.index ?? doc.pages.length, 0, page);\n inverse = [{ op: 'page.remove', id: page.id }];\n created = flattenItems(page.items).map((i) => i.id);\n return {\n op: {\n op: 'page.add',\n page: clone(page),\n ...(op.index !== undefined ? { index: op.index } : {}),\n },\n inverse,\n created,\n };\n }\n if (op.op === 'page.set') {\n assertPagePatch(op.patch);\n const page = doc.pages.find((page) => page.id === op.id);\n if (!page) throw new Error(`Page ${op.id} does not exist.`);\n inverse = [{ op: 'page.set', id: op.id, patch: inversePatch(page, op.patch) }];\n Object.assign(page, mergePatch(page, op.patch));\n for (const key of Object.keys(op.patch))\n if ((op.patch as Record<string, unknown>)[key] === undefined)\n delete (page as unknown as Record<string, unknown>)[key];\n }\n if (op.op === 'page.remove') {\n const index = doc.pages.findIndex((page) => page.id === op.id);\n if (index < 0) throw new Error(`Page ${op.id} does not exist.`);\n const [page] = doc.pages.splice(index, 1);\n inverse = [{ op: 'page.add', page: clone(page), index }];\n }\n if (op.op === 'meta.set') {\n inverse = [{ op: 'meta.set', patch: inversePatch(doc.meta, op.patch) }];\n doc.meta = mergePatch(doc.meta, op.patch);\n }\n if (op.op === 'media.set') {\n inverse = doc.media[op.id]\n ? [{ op: 'media.set', id: op.id, media: clone(doc.media[op.id]) }]\n : [{ op: 'media.remove', id: op.id }];\n doc.media[op.id] = clone(op.media);\n }\n if (op.op === 'media.remove') {\n if (!doc.media[op.id]) throw new Error(`Media ${op.id} does not exist.`);\n inverse = [{ op: 'media.set', id: op.id, media: clone(doc.media[op.id]) }];\n delete doc.media[op.id];\n }\n return { op, inverse, created };\n}\nfunction revertedPatch(\n before: Record<string, unknown>,\n after: Record<string, unknown>,\n current: Record<string, unknown>,\n nested: string[] = [],\n): Record<string, unknown> {\n const patch: Record<string, unknown> = {};\n for (const key of new Set([...Object.keys(before), ...Object.keys(after)])) {\n if (equal(before[key], after[key])) continue;\n if (\n nested.includes(key) &&\n current[key] &&\n typeof current[key] === 'object' &&\n (before[key] === undefined || typeof before[key] === 'object') &&\n (after[key] === undefined || typeof after[key] === 'object')\n ) {\n const sub = revertedPatch(\n (before[key] ?? {}) as Record<string, unknown>,\n (after[key] ?? {}) as Record<string, unknown>,\n current[key] as Record<string, unknown>,\n );\n if (Object.keys(sub).length) patch[key] = sub;\n } else if (equal(current[key], after[key])) patch[key] = clone(before[key]);\n }\n return patch;\n}\nfunction selectiveInverse(entry: Entry, current: AnnieDoc): Op[] {\n return entry.inverse.flatMap<Op>((op) => {\n if (op.op === 'set') {\n const before = locate(entry.before, op.id)?.item,\n after = locate(entry.after, op.id)?.item,\n now = locate(current, op.id)?.item;\n if (!before || !after || !now) return [];\n const patch = revertedPatch(before, after, now, ['style', 'text', 'data']);\n return Object.keys(patch).length ? [{ ...op, patch }] : [];\n }\n if (op.op === 'meta.set') {\n const patch = revertedPatch(entry.before.meta, entry.after.meta, current.meta);\n return Object.keys(patch).length ? [{ ...op, patch }] : [];\n }\n if (op.op === 'remove') return locate(current, op.id) ? [op] : [];\n if (op.op === 'add') return locate(current, String(op.item.id)) ? [] : [op];\n if (op.op === 'order' || op.op === 'reparent') {\n const now = locate(current, op.id),\n after = locate(entry.after, op.id);\n if (!now || !after || now.parent?.id !== after.parent?.id || now.page.id !== after.page.id)\n return [];\n return [op];\n }\n if (op.op === 'media.set' || op.op === 'media.remove')\n return equal(current.media[op.id], entry.after.media[op.id]) ? [op] : [];\n if (op.op === 'page.set') {\n assertPagePatch(op.patch);\n const before = entry.before.pages.find((page) => page.id === op.id),\n after = entry.after.pages.find((page) => page.id === op.id),\n now = current.pages.find((page) => page.id === op.id);\n if (!before || !after || !now) return [];\n const patch = revertedPatch(\n before as unknown as Record<string, unknown>,\n after as unknown as Record<string, unknown>,\n now as unknown as Record<string, unknown>,\n );\n delete patch.items;\n return Object.keys(patch).length ? [{ ...op, patch }] : [];\n }\n return [op];\n });\n}\nexport function createDoc(initial?: AnnieDoc, options: DocOptions = {}): DocModel {\n if (options.sanitizeHTML) assertEffectiveSanitizer(options.sanitizeHTML);\n const loadInitial = (doc: AnnieDoc) => {\n return migrate(doc, kindDefaultsFrom(options.kinds));\n };\n let state = initial ? loadInitial(initial) : defaultDoc();\n validateDoc(state, options);\n let index = new Map(allItems(state).map((item) => [item.id, item]));\n const observedItems = new Map<string, Signal<Item | undefined>>(),\n observedFields = new Map<string, Map<keyof Item, Signal<unknown>>>(),\n observedChildren = new Map<string, Signal<readonly string[]>>();\n const frozenCopy = <T>(value: T): T => {\n const result = clone(value);\n const freeze = (node: unknown) => {\n if (node && typeof node === 'object') {\n Object.values(node).forEach(freeze);\n Object.freeze(node);\n }\n };\n freeze(result);\n return result;\n };\n const childIds = (id: string) =>\n (index.get(id)?.children ?? state.pages.find((page) => page.id === id)?.items ?? []).map(\n (item) => item.id,\n );\n const reindex = () => {\n index = new Map(allItems(state).map((item) => [item.id, item]));\n batch(() => {\n for (const [id, observed] of observedItems) {\n const next = index.get(id);\n if (!equal(observed.peek(), next)) observed.value = frozenCopy(next);\n }\n for (const [id, fields] of observedFields)\n for (const [key, observed] of fields) {\n const next = index.get(id)?.[key];\n if (!equal(observed.peek(), next)) observed.value = frozenCopy(next);\n }\n for (const [id, observed] of observedChildren) {\n const next = childIds(id);\n if (!equal(observed.peek(), next)) observed.value = Object.freeze(next);\n }\n });\n };\n const listeners = new Set<(event: ChangeEvent) => void>(),\n history: Entry[] = [],\n future: Entry[] = [];\n let revision = 0;\n const sessionLog: ChangeSlice[] = [];\n const written = new Map<string, ItemStamp>(),\n removed = new Map<string, ItemStamp>();\n const hideAgent = () => options.agentHistory === 'hidden';\n const agentOrigin = (origin: string) => origin.startsWith('agent:');\n const walkBack = (stack: { origin: string }[], keep: (origin: string) => boolean) => {\n let index = stack.length - 1;\n while (index >= 0 && !keep(stack[index].origin)) index--;\n return index;\n };\n const pageOf = (doc: AnnieDoc) => {\n const map = new Map<string, string>();\n for (const page of doc.pages)\n for (const item of flattenItems(page.items)) map.set(item.id, page.id);\n return map;\n };\n const stampTransition = (before: AnnieDoc, after: AnnieDoc, rev: number, origin: string) => {\n const beforeItems = new Map(allItems(before).map((item) => [item.id, item])),\n afterItems = new Map(allItems(after).map((item) => [item.id, item])),\n beforePages = pageOf(before),\n afterPages = pageOf(after);\n for (const [id, item] of afterItems) {\n const prev = beforeItems.get(id);\n if (!prev || !equal(prev, item)) {\n written.set(id, { revision: rev, origin, kind: item.kind, page: afterPages.get(id)! });\n removed.delete(id);\n }\n }\n for (const [id, item] of beforeItems) {\n if (!afterItems.has(id)) {\n written.delete(id);\n removed.set(id, { revision: rev, origin, kind: item.kind, page: beforePages.get(id)! });\n }\n }\n };\n const resetSession = () => {\n revision = 0;\n sessionLog.length = 0;\n written.clear();\n removed.clear();\n };\n const commitSession = (\n slice: Omit<ChangeSlice, 'revision'>,\n before: AnnieDoc,\n after: AnnieDoc,\n ) => {\n revision += 1;\n stampTransition(before, after, revision, slice.origin);\n sessionLog.push({ ...slice, revision, ops: clone(slice.ops) });\n if (sessionLog.length > LIMITS.maxSessionLog) sessionLog.shift();\n return revision;\n };\n const emit = (\n entry: Pick<Entry, 'ops' | 'inverse' | 'origin' | 'label'> & { revision: number },\n ) => {\n for (const callback of listeners) {\n try {\n callback(\n clone({\n ops: entry.ops,\n inverse: entry.inverse,\n origin: entry.origin,\n label: entry.label,\n revision: entry.revision,\n }),\n );\n } catch {\n /* A subscriber cannot roll back a committed transaction. */\n }\n }\n };\n const model: DocModel = {\n itemSignal(id) {\n let observed = observedItems.get(id);\n if (!observed) {\n observed = signal(frozenCopy(index.get(id)));\n observedItems.set(id, observed);\n }\n return observed;\n },\n fieldSignal(id, key) {\n let fields = observedFields.get(id);\n if (!fields) {\n fields = new Map();\n observedFields.set(id, fields);\n }\n let observed = fields.get(key);\n if (!observed) {\n observed = signal<unknown>(frozenCopy(index.get(id)?.[key]));\n fields.set(key, observed);\n }\n return observed as ReadonlySignal<Item[typeof key] | undefined>;\n },\n childrenSignal(id) {\n let observed = observedChildren.get(id);\n if (!observed) {\n observed = signal<readonly string[]>(Object.freeze(childIds(id)));\n observedChildren.set(id, observed);\n }\n return observed;\n },\n apply(ops, applyOptions = {}) {\n const result: ApplyResult = { ok: false, created: [], errors: [], warnings: [] },\n origin = applyOptions.origin ?? 'api',\n lenient = !!applyOptions.lenient;\n if (options.readonly) {\n result.errors.push({ index: 0, code: 'READONLY', message: 'This document is read-only.' });\n return result;\n }\n if (\n applyOptions.expectedRevision !== undefined &&\n (!Number.isSafeInteger(applyOptions.expectedRevision) ||\n applyOptions.expectedRevision !== revision)\n ) {\n result.errors.push({\n index: 0,\n code: 'STALE_REVISION',\n message: `Read the board again before editing. Expected revision ${applyOptions.expectedRevision}; current revision is ${revision}.`,\n });\n return result;\n }\n const batchLimit = origin === 'user' ? LIMITS.maxItems : LIMITS.maxBatch;\n if (!Array.isArray(ops) || ops.length > batchLimit) {\n result.errors.push({\n index: 0,\n code: 'BATCH_LIMIT',\n message: `A batch must be an array of at most ${batchLimit} operations for origin ${origin}.`,\n });\n return result;\n }\n let draft: AnnieDoc;\n try {\n assertSafeJSON(ops);\n draft = clone(state);\n } catch (error) {\n result.errors.push({\n index: 0,\n code: 'INVALID_DATA',\n message: String(error instanceof Error ? error.message : error),\n });\n return result;\n }\n const remapped = origin.startsWith('agent:')\n ? remapAgentCreateIds(draft, ops)\n : { ops, warnings: [] as ApplyIssue[] };\n result.warnings.push(...remapped.warnings);\n const concrete: Op[] = [],\n inverse: Op[] = [],\n failures: ApplyIssue[] = [];\n const creationOps = new Map<string, number>();\n const mediaIds = () =>\n new Set(concrete.filter((op) => op.op === 'media.set').map((op) => op.id));\n const batch = remapped.ops;\n for (let index = 0; index < batch.length; index++) {\n const snapshot = lenient ? clone(draft) : undefined;\n try {\n const error = schemaError(OpSchema, batch[index]);\n if (error) throw new Error(error);\n const change = perform(draft, batch[index], origin, options);\n if (origin !== 'user' && result.created.length + change.created.length > LIMITS.maxBatch)\n throw new Error(\n `An agent batch may create at most ${LIMITS.maxBatch} items, including nested children.`,\n );\n if (lenient)\n validateDoc(\n draft,\n options,\n origin,\n new Set([...mediaIds(), ...(change.op.op === 'media.set' ? [change.op.id] : [])]),\n );\n concrete.push(change.op);\n inverse.unshift(...change.inverse);\n result.created.push(...change.created);\n change.created.forEach((id) => creationOps.set(id, index));\n } catch (error) {\n if (snapshot) draft = snapshot;\n failures.push({\n index,\n code: 'INVALID_OP',\n message: `${batch[index]?.op ?? 'operation'} #${index + 1}: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n if (!lenient && !failures.length) {\n try {\n validateDoc(draft, options, origin, mediaIds());\n } catch (error) {\n failures.push({\n index: Math.max(0, ops.length - 1),\n code: 'INVALID_DOCUMENT',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n if (!lenient && failures.length) {\n result.errors = failures;\n result.created = [];\n result.warnings = [];\n return result;\n }\n if (lenient && !concrete.length) {\n result.skipped = failures;\n result.created = [];\n return result;\n }\n if (lenient && failures.length) result.skipped = failures;\n const all = allItems(draft),\n lookup = new Map(all.map((i) => [i.id, i]));\n for (const id of result.created) {\n const item = lookup.get(id);\n if (!item) continue;\n if (\n item.kind !== 'connector' &&\n all.some(\n (other) =>\n other.id !== id &&\n !other.children?.length &&\n other.kind !== 'connector' &&\n intersects(itemBounds(item, lookup), itemBounds(other, lookup)),\n )\n )\n result.warnings.push({\n index: creationOps.get(id) ?? 0,\n code: 'OVERLAPS_EXISTING',\n message: `Item ${id} overlaps another item.`,\n });\n }\n result.ok = true;\n if (applyOptions.dryRun || !concrete.length) return result;\n const entry: Entry = {\n ops: concrete,\n inverse,\n before: state,\n after: draft,\n origin,\n label: applyOptions.label,\n };\n state = draft;\n reindex();\n const previous = history.at(-1);\n if (\n applyOptions.merge &&\n previous &&\n previous.origin === origin &&\n previous.label === entry.label\n ) {\n previous.ops.push(...entry.ops);\n previous.inverse.unshift(...entry.inverse);\n previous.after = state;\n } else {\n history.push(entry);\n if (history.length > LIMITS.maxHistory) history.shift();\n }\n future.length = 0;\n emit({\n ...entry,\n revision: commitSession(\n { origin, label: applyOptions.label, ops: concrete },\n entry.before,\n state,\n ),\n });\n return result;\n },\n get(id) {\n return clone(index.get(id));\n },\n query(selector) {\n return queryDoc(state, selector);\n },\n describe(describeOptions) {\n return describeDoc(state, describeOptions, { written, removed });\n },\n changesSince(since, changeOptions) {\n const cursor = revision;\n if (!Number.isFinite(since) || since >= cursor) return { cursor, since, changes: [] };\n const oldest = sessionLog[0];\n if (oldest && since + 1 < oldest.revision)\n return { cursor, since, changes: [], truncated: true };\n let changes = sessionLog.filter((slice) => slice.revision > since);\n const origin = changeOptions?.origin;\n if (origin === 'agent') changes = changes.filter((slice) => agentOrigin(slice.origin));\n else if (origin !== undefined) changes = changes.filter((slice) => slice.origin === origin);\n return { cursor, since, changes: clone(changes) };\n },\n kindsSince(since) {\n return kindsSince(since);\n },\n toJSON(saveOptions) {\n const json = clone(state);\n if (saveOptions?.compact === false) return json;\n for (const page of json.pages)\n page.items = page.items.map((item) => minimalItem(item, kindDefaultsFrom(options.kinds)));\n return json;\n },\n undo(undoOptions) {\n if (options.readonly) return false;\n const index = undoOptions?.origin\n ? walkBack(history, (origin) => origin === undoOptions.origin)\n : hideAgent()\n ? walkBack(history, (origin) => !agentOrigin(origin))\n : history.length - 1;\n if (index < 0) return false;\n const entry = history[index],\n selective = index !== history.length - 1,\n ops = selective ? selectiveInverse(entry, state) : entry.inverse,\n draft = clone(state),\n actual: Op[] = [],\n redo: Op[] = [];\n try {\n for (const op of ops) {\n const result = perform(draft, op, 'user', options);\n actual.push(result.op);\n redo.unshift(...result.inverse);\n }\n validateDoc(draft, options);\n } catch {\n return false;\n }\n const reverse: Entry = {\n ops: actual,\n inverse: redo,\n before: state,\n after: draft,\n origin: entry.origin,\n label: entry.label,\n };\n const before = state;\n state = draft;\n reindex();\n history.splice(index, 1);\n future.push(reverse);\n const label = `Undo ${entry.label ?? 'change'}`;\n emit({\n ops: actual,\n inverse: redo,\n origin: entry.origin,\n label,\n revision: commitSession({ origin: entry.origin, label, ops: actual }, before, state),\n });\n return true;\n },\n redo() {\n if (options.readonly) return false;\n const index = hideAgent()\n ? walkBack(future, (origin) => !agentOrigin(origin))\n : future.length - 1;\n if (index < 0) return false;\n const reverse = future[index];\n const draft = clone(state),\n ops: Op[] = [],\n inverse: Op[] = [];\n try {\n for (const op of reverse.inverse) {\n const change = perform(draft, op, 'user', options);\n ops.push(change.op);\n inverse.unshift(...change.inverse);\n }\n validateDoc(draft, options);\n } catch {\n return false;\n }\n const entry: Entry = {\n ops,\n inverse,\n before: state,\n after: draft,\n origin: reverse.origin,\n label: reverse.label,\n };\n const before = state;\n state = draft;\n reindex();\n future.splice(index, 1);\n history.push(entry);\n const label = `Redo ${entry.label ?? 'change'}`;\n emit({\n ops,\n inverse,\n origin: entry.origin,\n label,\n revision: commitSession({ origin: entry.origin, label, ops }, before, state),\n });\n return true;\n },\n load(doc) {\n if (options.readonly) throw new Error('This document is read-only.');\n const next = loadInitial(doc);\n validateDoc(next, options);\n state = next;\n reindex();\n history.length = 0;\n future.length = 0;\n resetSession();\n emit({ ops: [], inverse: [], origin: 'api', label: 'Load document', revision: 0 });\n },\n clear() {\n if (options.readonly) throw new Error('This document is read-only.');\n state = defaultDoc();\n reindex();\n history.length = 0;\n future.length = 0;\n resetSession();\n emit({ ops: [], inverse: [], origin: 'api', label: 'Clear document', revision: 0 });\n },\n on(_type, callback) {\n listeners.add(callback);\n return () => listeners.delete(callback);\n },\n get revision() {\n return revision;\n },\n get canUndo() {\n return hideAgent() ? history.some((entry) => !agentOrigin(entry.origin)) : history.length > 0;\n },\n get canRedo() {\n return hideAgent() ? future.some((entry) => !agentOrigin(entry.origin)) : future.length > 0;\n },\n };\n return model;\n}\n","/** First non-comment `text/uri-list` line, then `text/plain`. */\nexport function clipboardText(data: DataTransfer | null | undefined): string {\n const line = data\n ?.getData('text/uri-list')\n ?.split(/\\r?\\n/)\n .find((entry) => entry && !entry.startsWith('#'));\n return line?.trim() || data?.getData('text/plain') || '';\n}\n","\n/**\n * Rearranges items so that all items in the [left, k] are the smallest.\n * The k-th element will have the (k - left + 1)-th smallest value in [left, right].\n *\n * @template T\n * @param {T[]} arr the array to partially sort (in place)\n * @param {number} k middle index for partial sorting (as defined above)\n * @param {number} [left=0] left index of the range to sort\n * @param {number} [right=arr.length-1] right index\n * @param {(a: T, b: T) => number} [compare = (a, b) => a - b] compare function\n */\nexport default function quickselect(arr, k, left = 0, right = arr.length - 1, compare = defaultCompare) {\n\n while (right > left) {\n if (right - left > 600) {\n const n = right - left + 1;\n const m = k - left + 1;\n const z = Math.log(n);\n const s = 0.5 * Math.exp(2 * z / 3);\n const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n quickselect(arr, k, newLeft, newRight, compare);\n }\n\n const t = arr[k];\n let i = left;\n /** @type {number} */\n let j = right;\n\n swap(arr, left, k);\n if (compare(arr[right], t) > 0) swap(arr, left, right);\n\n while (i < j) {\n swap(arr, i, j);\n i++;\n j--;\n while (compare(arr[i], t) < 0) i++;\n while (compare(arr[j], t) > 0) j--;\n }\n\n if (compare(arr[left], t) === 0) swap(arr, left, j);\n else {\n j++;\n swap(arr, j, right);\n }\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n}\n\n/**\n * @template T\n * @param {T[]} arr\n * @param {number} i\n * @param {number} j\n */\nfunction swap(arr, i, j) {\n const tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\n/**\n * @template T\n * @param {T} a\n * @param {T} b\n * @returns {number}\n */\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n","import quickselect from 'quickselect';\n\nexport default class RBush {\n constructor(maxEntries = 9) {\n // max entries in a node is 9 by default; min node fill is 40% for best performance\n this._maxEntries = Math.max(4, maxEntries);\n this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));\n this.clear();\n }\n\n all() {\n return this._all(this.data, []);\n }\n\n search(bbox) {\n let node = this.data;\n const result = [];\n\n if (!intersects(bbox, node)) return result;\n\n const toBBox = this.toBBox;\n const nodesToSearch = [];\n\n while (node) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childBBox = node.leaf ? toBBox(child) : child;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf) result.push(child);\n else if (contains(bbox, childBBox)) this._all(child, result);\n else nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return result;\n }\n\n collides(bbox) {\n let node = this.data;\n\n if (!intersects(bbox, node)) return false;\n\n const nodesToSearch = [];\n while (node) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childBBox = node.leaf ? this.toBBox(child) : child;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf || contains(bbox, childBBox)) return true;\n nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return false;\n }\n\n load(data) {\n if (!(data && data.length)) return this;\n\n if (data.length < this._minEntries) {\n for (let i = 0; i < data.length; i++) {\n this.insert(data[i]);\n }\n return this;\n }\n\n // recursively build the tree with the given data from scratch using OMT algorithm\n let node = this._build(data.slice(), 0, data.length - 1, 0);\n\n if (!this.data.children.length) {\n // save as is if tree is empty\n this.data = node;\n\n } else if (this.data.height === node.height) {\n // split root if trees have the same height\n this._splitRoot(this.data, node);\n\n } else {\n if (this.data.height < node.height) {\n // swap trees if inserted one is bigger\n const tmpNode = this.data;\n this.data = node;\n node = tmpNode;\n }\n\n // insert the small tree into the large tree at appropriate level\n this._insert(node, this.data.height - node.height - 1, true);\n }\n\n return this;\n }\n\n insert(item) {\n if (item) this._insert(item, this.data.height - 1);\n return this;\n }\n\n clear() {\n this.data = createNode([]);\n return this;\n }\n\n remove(item, equalsFn) {\n if (!item) return this;\n\n let node = this.data;\n const bbox = this.toBBox(item);\n const path = [];\n const indexes = [];\n let i, parent, goingUp;\n\n // depth-first iterative tree traversal\n while (node || path.length) {\n\n if (!node) { // go up\n node = path.pop();\n parent = path[path.length - 1];\n i = indexes.pop();\n goingUp = true;\n }\n\n if (node.leaf) { // check current node\n const index = findItem(item, node.children, equalsFn);\n\n if (index !== -1) {\n // item found, remove the item and condense tree upwards\n node.children.splice(index, 1);\n path.push(node);\n this._condense(path);\n return this;\n }\n }\n\n if (!goingUp && !node.leaf && contains(node, bbox)) { // go down\n path.push(node);\n indexes.push(i);\n i = 0;\n parent = node;\n node = node.children[0];\n\n } else if (parent) { // go right\n i++;\n node = parent.children[i];\n goingUp = false;\n\n } else node = null; // nothing found\n }\n\n return this;\n }\n\n toBBox(item) { return item; }\n\n compareMinX(a, b) { return a.minX - b.minX; }\n compareMinY(a, b) { return a.minY - b.minY; }\n\n toJSON() { return this.data; }\n\n fromJSON(data) {\n this.data = data;\n return this;\n }\n\n _all(node, result) {\n const nodesToSearch = [];\n while (node) {\n if (node.leaf) result.push(...node.children);\n else nodesToSearch.push(...node.children);\n\n node = nodesToSearch.pop();\n }\n return result;\n }\n\n _build(items, left, right, height) {\n\n const N = right - left + 1;\n let M = this._maxEntries;\n let node;\n\n if (N <= M) {\n // reached leaf level; return leaf\n node = createNode(items.slice(left, right + 1));\n calcBBox(node, this.toBBox);\n return node;\n }\n\n if (!height) {\n // target height of the bulk-loaded tree\n height = Math.ceil(Math.log(N) / Math.log(M));\n\n // target number of root entries to maximize storage utilization\n M = Math.ceil(N / Math.pow(M, height - 1));\n }\n\n node = createNode([]);\n node.leaf = false;\n node.height = height;\n\n // split the items into M mostly square tiles\n\n const N2 = Math.ceil(N / M);\n const N1 = N2 * Math.ceil(Math.sqrt(M));\n\n multiSelect(items, left, right, N1, this.compareMinX);\n\n for (let i = left; i <= right; i += N1) {\n\n const right2 = Math.min(i + N1 - 1, right);\n\n multiSelect(items, i, right2, N2, this.compareMinY);\n\n for (let j = i; j <= right2; j += N2) {\n\n const right3 = Math.min(j + N2 - 1, right2);\n\n // pack each entry recursively\n node.children.push(this._build(items, j, right3, height - 1));\n }\n }\n\n calcBBox(node, this.toBBox);\n\n return node;\n }\n\n _chooseSubtree(bbox, node, level, path) {\n while (true) {\n path.push(node);\n\n if (node.leaf || path.length - 1 === level) break;\n\n let minArea = Infinity;\n let minEnlargement = Infinity;\n let targetNode;\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const area = bboxArea(child);\n const enlargement = enlargedArea(bbox, child) - area;\n\n // choose entry with the least area enlargement\n if (enlargement < minEnlargement) {\n minEnlargement = enlargement;\n minArea = area < minArea ? area : minArea;\n targetNode = child;\n\n } else if (enlargement === minEnlargement) {\n // otherwise choose one with the smallest area\n if (area < minArea) {\n minArea = area;\n targetNode = child;\n }\n }\n }\n\n node = targetNode || node.children[0];\n }\n\n return node;\n }\n\n _insert(item, level, isNode) {\n const bbox = isNode ? item : this.toBBox(item);\n const insertPath = [];\n\n // find the best node for accommodating the item, saving all nodes along the path too\n const node = this._chooseSubtree(bbox, this.data, level, insertPath);\n\n // put the item into the node\n node.children.push(item);\n extend(node, bbox);\n\n // split on node overflow; propagate upwards if necessary\n while (level >= 0) {\n if (insertPath[level].children.length > this._maxEntries) {\n this._split(insertPath, level);\n level--;\n } else break;\n }\n\n // adjust bboxes along the insertion path\n this._adjustParentBBoxes(bbox, insertPath, level);\n }\n\n // split overflowed node into two\n _split(insertPath, level) {\n const node = insertPath[level];\n const M = node.children.length;\n const m = this._minEntries;\n\n this._chooseSplitAxis(node, m, M);\n\n const splitIndex = this._chooseSplitIndex(node, m, M);\n\n const newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));\n newNode.height = node.height;\n newNode.leaf = node.leaf;\n\n calcBBox(node, this.toBBox);\n calcBBox(newNode, this.toBBox);\n\n if (level) insertPath[level - 1].children.push(newNode);\n else this._splitRoot(node, newNode);\n }\n\n _splitRoot(node, newNode) {\n // split root node\n this.data = createNode([node, newNode]);\n this.data.height = node.height + 1;\n this.data.leaf = false;\n calcBBox(this.data, this.toBBox);\n }\n\n _chooseSplitIndex(node, m, M) {\n let index;\n let minOverlap = Infinity;\n let minArea = Infinity;\n\n for (let i = m; i <= M - m; i++) {\n const bbox1 = distBBox(node, 0, i, this.toBBox);\n const bbox2 = distBBox(node, i, M, this.toBBox);\n\n const overlap = intersectionArea(bbox1, bbox2);\n const area = bboxArea(bbox1) + bboxArea(bbox2);\n\n // choose distribution with minimum overlap\n if (overlap < minOverlap) {\n minOverlap = overlap;\n index = i;\n\n minArea = area < minArea ? area : minArea;\n\n } else if (overlap === minOverlap) {\n // otherwise choose distribution with minimum area\n if (area < minArea) {\n minArea = area;\n index = i;\n }\n }\n }\n\n return index || M - m;\n }\n\n // sorts node children by the best axis for split\n _chooseSplitAxis(node, m, M) {\n const compareMinX = node.leaf ? this.compareMinX : compareNodeMinX;\n const compareMinY = node.leaf ? this.compareMinY : compareNodeMinY;\n const xMargin = this._allDistMargin(node, m, M, compareMinX);\n const yMargin = this._allDistMargin(node, m, M, compareMinY);\n\n // if total distributions margin value is minimal for x, sort by minX,\n // otherwise it's already sorted by minY\n if (xMargin < yMargin) node.children.sort(compareMinX);\n }\n\n // total margin of all possible split distributions where each node is at least m full\n _allDistMargin(node, m, M, compare) {\n node.children.sort(compare);\n\n const toBBox = this.toBBox;\n const leftBBox = distBBox(node, 0, m, toBBox);\n const rightBBox = distBBox(node, M - m, M, toBBox);\n let margin = bboxMargin(leftBBox) + bboxMargin(rightBBox);\n\n for (let i = m; i < M - m; i++) {\n const child = node.children[i];\n extend(leftBBox, node.leaf ? toBBox(child) : child);\n margin += bboxMargin(leftBBox);\n }\n\n for (let i = M - m - 1; i >= m; i--) {\n const child = node.children[i];\n extend(rightBBox, node.leaf ? toBBox(child) : child);\n margin += bboxMargin(rightBBox);\n }\n\n return margin;\n }\n\n _adjustParentBBoxes(bbox, path, level) {\n // adjust bboxes along the given tree path\n for (let i = level; i >= 0; i--) {\n extend(path[i], bbox);\n }\n }\n\n _condense(path) {\n // go through the path, removing empty nodes and updating bboxes\n for (let i = path.length - 1, siblings; i >= 0; i--) {\n if (path[i].children.length === 0) {\n if (i > 0) {\n siblings = path[i - 1].children;\n siblings.splice(siblings.indexOf(path[i]), 1);\n\n } else this.clear();\n\n } else calcBBox(path[i], this.toBBox);\n }\n }\n}\n\nfunction findItem(item, items, equalsFn) {\n if (!equalsFn) return items.indexOf(item);\n\n for (let i = 0; i < items.length; i++) {\n if (equalsFn(item, items[i])) return i;\n }\n return -1;\n}\n\n// calculate node's bbox from bboxes of its children\nfunction calcBBox(node, toBBox) {\n distBBox(node, 0, node.children.length, toBBox, node);\n}\n\n// min bounding rectangle of node children from k to p-1\nfunction distBBox(node, k, p, toBBox, destNode) {\n if (!destNode) destNode = createNode(null);\n destNode.minX = Infinity;\n destNode.minY = Infinity;\n destNode.maxX = -Infinity;\n destNode.maxY = -Infinity;\n\n for (let i = k; i < p; i++) {\n const child = node.children[i];\n extend(destNode, node.leaf ? toBBox(child) : child);\n }\n\n return destNode;\n}\n\nfunction extend(a, b) {\n a.minX = Math.min(a.minX, b.minX);\n a.minY = Math.min(a.minY, b.minY);\n a.maxX = Math.max(a.maxX, b.maxX);\n a.maxY = Math.max(a.maxY, b.maxY);\n return a;\n}\n\nfunction compareNodeMinX(a, b) { return a.minX - b.minX; }\nfunction compareNodeMinY(a, b) { return a.minY - b.minY; }\n\nfunction bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); }\nfunction bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }\n\nfunction enlargedArea(a, b) {\n return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *\n (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));\n}\n\nfunction intersectionArea(a, b) {\n const minX = Math.max(a.minX, b.minX);\n const minY = Math.max(a.minY, b.minY);\n const maxX = Math.min(a.maxX, b.maxX);\n const maxY = Math.min(a.maxY, b.maxY);\n\n return Math.max(0, maxX - minX) *\n Math.max(0, maxY - minY);\n}\n\nfunction contains(a, b) {\n return a.minX <= b.minX &&\n a.minY <= b.minY &&\n b.maxX <= a.maxX &&\n b.maxY <= a.maxY;\n}\n\nfunction intersects(a, b) {\n return b.minX <= a.maxX &&\n b.minY <= a.maxY &&\n b.maxX >= a.minX &&\n b.maxY >= a.minY;\n}\n\nfunction createNode(children) {\n return {\n children,\n height: 1,\n leaf: true,\n minX: Infinity,\n minY: Infinity,\n maxX: -Infinity,\n maxY: -Infinity\n };\n}\n\n// sort an array so that items come in groups of n unsorted items, with groups sorted between each other;\n// combines selection algorithm with binary divide & conquer approach\n\nfunction multiSelect(arr, left, right, n, compare) {\n const stack = [left, right];\n\n while (stack.length) {\n right = stack.pop();\n left = stack.pop();\n\n if (right - left <= n) continue;\n\n const mid = left + Math.ceil((right - left) / n / 2) * n;\n quickselect(arr, mid, left, right, compare);\n\n stack.push(left, mid, mid, right);\n }\n}\n","import RBush from 'rbush';\nimport type { Box, Item, Outline, Point } from '../core/types';\nimport { contains, containsPoint, flattenItems, itemBounds, type ItemLookup } from './box';\nimport { pointInPolygon, rotatePoint, segmentDistance } from './vec';\nimport { routeConnector, type OutlineResolver } from './router';\ninterface Entry {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n item: Item;\n order: number;\n parents: Item[];\n}\nexport interface PickOptions {\n tolerance?: number;\n enteredGroup?: string;\n includeLocked?: boolean;\n outline?: OutlineResolver;\n ignore?: (item: Item) => boolean;\n}\nexport function hitTest(\n item: Item,\n point: Point,\n tolerance = 4,\n lookup?: ItemLookup,\n outline?: Outline | Outline[] | OutlineResolver,\n): boolean {\n const resolveOutline = typeof outline === 'function' ? outline : undefined;\n if (item.kind === 'group') return containsPoint(itemBounds(item, lookup, resolveOutline), point);\n if (item.kind === 'connector') {\n const points = routeConnector(item, lookup, resolveOutline).points;\n return points\n .slice(1)\n .some(\n (p, i) =>\n segmentDistance(point, points[i], p) <= tolerance + (item.style?.strokeWidth ?? 2) / 2,\n );\n }\n const p = rotatePoint(\n point,\n { x: item.x + item.w / 2, y: item.y + item.h / 2 },\n -(item.rotation ?? 0),\n ),\n x = p.x - item.x,\n y = p.y - item.y,\n stroke = tolerance + (item.style?.strokeWidth ?? 2) / 2;\n const linePoints =\n item.points ??\n (item.kind === 'line'\n ? [\n [0, 0],\n [item.w, item.h],\n ]\n : undefined);\n if ((item.kind === 'line' || item.kind === 'path') && linePoints) {\n const pts = linePoints.map(([px, py]) => ({ x: item.x + px, y: item.y + py }));\n return (\n (item.closed && pointInPolygon(p, pts)) ||\n pts.slice(1).some((pt, i) => segmentDistance(p, pts[i], pt) <= stroke)\n );\n }\n const filled =\n !!item.text?.value ||\n (item.style?.fill !== undefined && item.style.fill !== 'none') ||\n ['note', 'text', 'image', 'video', 'link', 'html', 'group'].includes(item.kind);\n const resolvedOutline = typeof outline === 'function' ? outline(item) : outline;\n if (resolvedOutline) {\n const outlines = Array.isArray(resolvedOutline) ? resolvedOutline : [resolvedOutline],\n local = { x, y };\n return outlines.some((shape) => {\n if (!shape.points.length) return false;\n if (shape.closed && filled && pointInPolygon(local, shape.points)) return true;\n const points = shape.closed ? [...shape.points, shape.points[0]] : shape.points;\n return points.length === 1\n ? segmentDistance(local, points[0], points[0]) <= stroke\n : points\n .slice(1)\n .some((point, index) => segmentDistance(local, points[index], point) <= stroke);\n });\n }\n if (item.kind === 'ellipse') {\n const rx = item.w / 2,\n ry = item.h / 2;\n if (!rx || !ry) return false;\n const d = Math.hypot((x - rx) / rx, (y - ry) / ry),\n edge = stroke / Math.min(rx, ry);\n return filled ? d <= 1 + edge : Math.abs(d - 1) <= edge;\n }\n if (item.kind === 'diamond') {\n const vertices = [\n { x: item.w / 2, y: 0 },\n { x: item.w, y: item.h / 2 },\n { x: item.w / 2, y: item.h },\n { x: 0, y: item.h / 2 },\n ],\n local = { x, y };\n return (\n (filled && pointInPolygon(local, vertices)) ||\n vertices.some((a, i) => segmentDistance(local, a, vertices[(i + 1) % 4]) <= stroke)\n );\n }\n const outer = x >= -stroke && x <= item.w + stroke && y >= -stroke && y <= item.h + stroke;\n return (\n outer && (filled || x <= stroke || x >= item.w - stroke || y <= stroke || y >= item.h - stroke)\n );\n}\nexport class SpatialIndex {\n private tree = new RBush<Entry>();\n private lookup = new Map<string, Item>();\n private entries = new Map<string, Entry>();\n constructor(\n items: Item[] = [],\n private outline?: OutlineResolver,\n ) {\n this.set(items);\n }\n set(items: Item[], outline: OutlineResolver | undefined = this.outline): void {\n this.outline = outline;\n this.tree.clear();\n this.lookup = new Map(flattenItems(items).map((i) => [i.id, i]));\n const entries: Entry[] = [];\n let order = 0;\n const walk = (list: Item[], parents: Item[]) => {\n for (const item of list) {\n const b = itemBounds(item, this.lookup, this.outline);\n entries.push({\n minX: b.x,\n minY: b.y,\n maxX: b.x + b.w,\n maxY: b.y + b.h,\n item,\n order: order++,\n parents,\n });\n if (item.children) walk(item.children, [...parents, item]);\n }\n };\n walk(items, []);\n this.entries = new Map(entries.map((entry) => [entry.item.id, entry]));\n this.tree.load(entries);\n }\n search(box: Box): Item[] {\n return this.tree\n .search({ minX: box.x, minY: box.y, maxX: box.x + box.w, maxY: box.y + box.h })\n .filter((e) => !e.item.hidden && !e.parents.some((p) => p.hidden))\n .sort((a, b) => a.order - b.order)\n .map((e) => e.item);\n }\n enclosed(\n box: Box,\n options: { enteredGroup?: string; ignore?: (item: Item) => boolean } = {},\n ): Item[] {\n const selected = new Map<string, Entry>();\n const candidates = this.tree.search({\n minX: box.x,\n minY: box.y,\n maxX: box.x + box.w,\n maxY: box.y + box.h,\n });\n const visibleBounds = (entry: Entry): Box | undefined => {\n if (\n entry.item.hidden ||\n entry.item.locked ||\n options.ignore?.(entry.item) ||\n entry.parents.some((parent) => parent.hidden || parent.locked || options.ignore?.(parent))\n )\n return;\n return {\n x: entry.minX,\n y: entry.minY,\n w: entry.maxX - entry.minX,\n h: entry.maxY - entry.minY,\n };\n };\n for (const candidate of candidates) {\n const visible = visibleBounds(candidate);\n if (!visible || !contains(box, visible)) continue;\n const groups = candidate.parents.filter((parent) => parent.kind === 'group');\n const entered = groups.findIndex((parent) => parent.id === options.enteredGroup);\n const outer = groups[entered + 1];\n const entry = outer ? this.entries.get(outer.id)! : candidate;\n if (entry.item.id === options.enteredGroup) continue;\n const bounds = entry === candidate ? visible : visibleBounds(entry);\n if (bounds && contains(box, bounds)) selected.set(entry.item.id, entry);\n }\n return [...selected.values()].sort((a, b) => a.order - b.order).map((entry) => entry.item);\n }\n pick(point: Point, options: PickOptions = {}): Item | undefined {\n const tolerance = options.tolerance ?? 6;\n const found = this.tree\n .search({\n minX: point.x - tolerance,\n minY: point.y - tolerance,\n maxX: point.x + tolerance,\n maxY: point.y + tolerance,\n })\n .sort((a, b) => b.order - a.order);\n for (const e of found) {\n if (\n e.item.hidden ||\n options.ignore?.(e.item) ||\n (!options.includeLocked && e.item.locked) ||\n e.parents.some(\n (p) => p.hidden || options.ignore?.(p) || (!options.includeLocked && p.locked),\n )\n )\n continue;\n if (!hitTest(e.item, point, tolerance, this.lookup, options.outline ?? this.outline))\n continue;\n const groups = e.parents.filter((p) => p.kind === 'group');\n const entered = groups.findIndex((p) => p.id === options.enteredGroup);\n const outer = groups[entered + 1];\n return outer ?? e.item;\n }\n return undefined;\n }\n}\n"],"x_google_ignoreList":[0,5,6],"mappings":"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"}