@hyperbook/markdown 0.43.2 → 0.43.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.
@@ -308,4 +308,4 @@ ${n}</tr>
308
308
  `}strong({tokens:n}){return`<strong>${this.parser.parseInline(n)}</strong>`}em({tokens:n}){return`<em>${this.parser.parseInline(n)}</em>`}codespan({text:n}){return`<code>${ha(n,!0)}</code>`}br(n){return"<br>"}del({tokens:n}){return`<del>${this.parser.parseInline(n)}</del>`}link({href:n,title:a,tokens:i}){let s=this.parser.parseInline(i),r=w0(n);if(r===null)return s;n=r;let c='<a href="'+n+'"';return a&&(c+=' title="'+ha(a)+'"'),c+=">"+s+"</a>",c}image({href:n,title:a,text:i,tokens:s}){s&&(i=this.parser.parseInline(s,this.parser.textRenderer));let r=w0(n);if(r===null)return ha(i);n=r;let c=`<img src="${n}" alt="${i}"`;return a&&(c+=` title="${ha(a)}"`),c+=">",c}text(n){return"tokens"in n&&n.tokens?this.parser.parseInline(n.tokens):"escaped"in n&&n.escaped?n.text:ha(n.text)}},sf=class{strong({text:n}){return n}em({text:n}){return n}codespan({text:n}){return n}del({text:n}){return n}html({text:n}){return n}text({text:n}){return n}link({text:n}){return""+n}image({text:n}){return""+n}br(){return""}},Jn=class qh{options;renderer;textRenderer;constructor(a){this.options=a||Hl,this.options.renderer=this.options.renderer||new Ar,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new sf}static parse(a,i){return new qh(i).parse(a)}static parseInline(a,i){return new qh(i).parseInline(a)}parse(a,i=!0){let s="";for(let r=0;r<a.length;r++){let c=a[r];if(this.options.extensions?.renderers?.[c.type]){let h=c,g=this.options.extensions.renderers[h.type].call({parser:this},h);if(g!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(h.type)){s+=g||"";continue}}let u=c;switch(u.type){case"space":{s+=this.renderer.space(u);continue}case"hr":{s+=this.renderer.hr(u);continue}case"heading":{s+=this.renderer.heading(u);continue}case"code":{s+=this.renderer.code(u);continue}case"table":{s+=this.renderer.table(u);continue}case"blockquote":{s+=this.renderer.blockquote(u);continue}case"list":{s+=this.renderer.list(u);continue}case"html":{s+=this.renderer.html(u);continue}case"def":{s+=this.renderer.def(u);continue}case"paragraph":{s+=this.renderer.paragraph(u);continue}case"text":{let h=u,g=this.renderer.text(h);for(;r+1<a.length&&a[r+1].type==="text";)h=a[++r],g+=`
309
309
  `+this.renderer.text(h);i?s+=this.renderer.paragraph({type:"paragraph",raw:g,text:g,tokens:[{type:"text",raw:g,text:g,escaped:!0}]}):s+=g;continue}default:{let h='Token with "'+u.type+'" type was not found.';if(this.options.silent)return console.error(h),"";throw new Error(h)}}}return s}parseInline(a,i=this.renderer){let s="";for(let r=0;r<a.length;r++){let c=a[r];if(this.options.extensions?.renderers?.[c.type]){let h=this.options.extensions.renderers[c.type].call({parser:this},c);if(h!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(c.type)){s+=h||"";continue}}let u=c;switch(u.type){case"escape":{s+=i.text(u);break}case"html":{s+=i.html(u);break}case"link":{s+=i.link(u);break}case"image":{s+=i.image(u);break}case"strong":{s+=i.strong(u);break}case"em":{s+=i.em(u);break}case"codespan":{s+=i.codespan(u);break}case"br":{s+=i.br(u);break}case"del":{s+=i.del(u);break}case"text":{s+=i.text(u);break}default:{let h='Token with "'+u.type+'" type was not found.';if(this.options.silent)return console.error(h),"";throw new Error(h)}}}return s}},Bo=class{options;block;constructor(n){this.options=n||Hl}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(n){return n}postprocess(n){return n}processAllTokens(n){return n}emStrongMask(n){return n}provideLexer(){return this.block?Fn.lex:Fn.lexInline}provideParser(){return this.block?Jn.parse:Jn.parseInline}},B3=class{defaults=Ju();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=Jn;Renderer=Ar;TextRenderer=sf;Lexer=Fn;Tokenizer=_r;Hooks=Bo;constructor(...n){this.use(...n)}walkTokens(n,a){let i=[];for(let s of n)switch(i=i.concat(a.call(this,s)),s.type){case"table":{let r=s;for(let c of r.header)i=i.concat(this.walkTokens(c.tokens,a));for(let c of r.rows)for(let u of c)i=i.concat(this.walkTokens(u.tokens,a));break}case"list":{let r=s;i=i.concat(this.walkTokens(r.items,a));break}default:{let r=s;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(c=>{let u=r[c].flat(1/0);i=i.concat(this.walkTokens(u,a))}):r.tokens&&(i=i.concat(this.walkTokens(r.tokens,a)))}}return i}use(...n){let a=this.defaults.extensions||{renderers:{},childTokens:{}};return n.forEach(i=>{let s={...i};if(s.async=this.defaults.async||s.async||!1,i.extensions&&(i.extensions.forEach(r=>{if(!r.name)throw new Error("extension name required");if("renderer"in r){let c=a.renderers[r.name];c?a.renderers[r.name]=function(...u){let h=r.renderer.apply(this,u);return h===!1&&(h=c.apply(this,u)),h}:a.renderers[r.name]=r.renderer}if("tokenizer"in r){if(!r.level||r.level!=="block"&&r.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let c=a[r.level];c?c.unshift(r.tokenizer):a[r.level]=[r.tokenizer],r.start&&(r.level==="block"?a.startBlock?a.startBlock.push(r.start):a.startBlock=[r.start]:r.level==="inline"&&(a.startInline?a.startInline.push(r.start):a.startInline=[r.start]))}"childTokens"in r&&r.childTokens&&(a.childTokens[r.name]=r.childTokens)}),s.extensions=a),i.renderer){let r=this.defaults.renderer||new Ar(this.defaults);for(let c in i.renderer){if(!(c in r))throw new Error(`renderer '${c}' does not exist`);if(["options","parser"].includes(c))continue;let u=c,h=i.renderer[u],g=r[u];r[u]=(...p)=>{let x=h.apply(r,p);return x===!1&&(x=g.apply(r,p)),x||""}}s.renderer=r}if(i.tokenizer){let r=this.defaults.tokenizer||new _r(this.defaults);for(let c in i.tokenizer){if(!(c in r))throw new Error(`tokenizer '${c}' does not exist`);if(["options","rules","lexer"].includes(c))continue;let u=c,h=i.tokenizer[u],g=r[u];r[u]=(...p)=>{let x=h.apply(r,p);return x===!1&&(x=g.apply(r,p)),x}}s.tokenizer=r}if(i.hooks){let r=this.defaults.hooks||new Bo;for(let c in i.hooks){if(!(c in r))throw new Error(`hook '${c}' does not exist`);if(["options","block"].includes(c))continue;let u=c,h=i.hooks[u],g=r[u];Bo.passThroughHooks.has(c)?r[u]=p=>{if(this.defaults.async&&Bo.passThroughHooksRespectAsync.has(c))return(async()=>{let y=await h.call(r,p);return g.call(r,y)})();let x=h.call(r,p);return g.call(r,x)}:r[u]=(...p)=>{if(this.defaults.async)return(async()=>{let y=await h.apply(r,p);return y===!1&&(y=await g.apply(r,p)),y})();let x=h.apply(r,p);return x===!1&&(x=g.apply(r,p)),x}}s.hooks=r}if(i.walkTokens){let r=this.defaults.walkTokens,c=i.walkTokens;s.walkTokens=function(u){let h=[];return h.push(c.call(this,u)),r&&(h=h.concat(r.call(this,u))),h}}this.defaults={...this.defaults,...s}}),this}setOptions(n){return this.defaults={...this.defaults,...n},this}lexer(n,a){return Fn.lex(n,a??this.defaults)}parser(n,a){return Jn.parse(n,a??this.defaults)}parseMarkdown(n){return(a,i)=>{let s={...i},r={...this.defaults,...s},c=this.onError(!!r.silent,!!r.async);if(this.defaults.async===!0&&s.async===!1)return c(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof a>"u"||a===null)return c(new Error("marked(): input parameter is undefined or null"));if(typeof a!="string")return c(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(a)+", string expected"));if(r.hooks&&(r.hooks.options=r,r.hooks.block=n),r.async)return(async()=>{let u=r.hooks?await r.hooks.preprocess(a):a,h=await(r.hooks?await r.hooks.provideLexer():n?Fn.lex:Fn.lexInline)(u,r),g=r.hooks?await r.hooks.processAllTokens(h):h;r.walkTokens&&await Promise.all(this.walkTokens(g,r.walkTokens));let p=await(r.hooks?await r.hooks.provideParser():n?Jn.parse:Jn.parseInline)(g,r);return r.hooks?await r.hooks.postprocess(p):p})().catch(c);try{r.hooks&&(a=r.hooks.preprocess(a));let u=(r.hooks?r.hooks.provideLexer():n?Fn.lex:Fn.lexInline)(a,r);r.hooks&&(u=r.hooks.processAllTokens(u)),r.walkTokens&&this.walkTokens(u,r.walkTokens);let h=(r.hooks?r.hooks.provideParser():n?Jn.parse:Jn.parseInline)(u,r);return r.hooks&&(h=r.hooks.postprocess(h)),h}catch(u){return c(u)}}}onError(n,a){return i=>{if(i.message+=`
310
310
  Please report this to https://github.com/markedjs/marked.`,n){let s="<p>An error occurred:</p><pre>"+ha(i.message+"",!0)+"</pre>";return a?Promise.resolve(s):s}if(a)return Promise.reject(i);throw i}}},Bl=new B3;function Fe(n,a){return Bl.parse(n,a)}Fe.options=Fe.setOptions=function(n){return Bl.setOptions(n),Fe.defaults=Bl.defaults,r0(Fe.defaults),Fe},Fe.getDefaults=Ju,Fe.defaults=Hl,Fe.use=function(...n){return Bl.use(...n),Fe.defaults=Bl.defaults,r0(Fe.defaults),Fe},Fe.walkTokens=function(n,a){return Bl.walkTokens(n,a)},Fe.parseInline=Bl.parseInline,Fe.Parser=Jn,Fe.parser=Jn.parse,Fe.Renderer=Ar,Fe.TextRenderer=sf,Fe.Lexer=Fn,Fe.lexer=Fn.lex,Fe.Tokenizer=_r,Fe.Hooks=Bo,Fe.parse=Fe,Fe.options,Fe.setOptions,Fe.use,Fe.walkTokens,Fe.parseInline,Jn.parse,Fn.lex;/*! @license DOMPurify 3.3.0 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.0/LICENSE */const{entries:A0,setPrototypeOf:N0,isFrozen:U3,getPrototypeOf:V3,getOwnPropertyDescriptor:$3}=Object;let{freeze:en,seal:zn,create:rf}=Object,{apply:cf,construct:uf}=typeof Reflect<"u"&&Reflect;en||(en=function(a){return a}),zn||(zn=function(a){return a}),cf||(cf=function(a,i){for(var s=arguments.length,r=new Array(s>2?s-2:0),c=2;c<s;c++)r[c-2]=arguments[c];return a.apply(i,r)}),uf||(uf=function(a){for(var i=arguments.length,s=new Array(i>1?i-1:0),r=1;r<i;r++)s[r-1]=arguments[r];return new a(...s)});const Nr=nn(Array.prototype.forEach),Y3=nn(Array.prototype.lastIndexOf),k0=nn(Array.prototype.pop),Uo=nn(Array.prototype.push),q3=nn(Array.prototype.splice),kr=nn(String.prototype.toLowerCase),ff=nn(String.prototype.toString),df=nn(String.prototype.match),Vo=nn(String.prototype.replace),X3=nn(String.prototype.indexOf),G3=nn(String.prototype.trim),Pn=nn(Object.prototype.hasOwnProperty),tn=nn(RegExp.prototype.test),$o=Z3(TypeError);function nn(n){return function(a){a instanceof RegExp&&(a.lastIndex=0);for(var i=arguments.length,s=new Array(i>1?i-1:0),r=1;r<i;r++)s[r-1]=arguments[r];return cf(n,a,s)}}function Z3(n){return function(){for(var a=arguments.length,i=new Array(a),s=0;s<a;s++)i[s]=arguments[s];return uf(n,i)}}function Le(n,a){let i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:kr;N0&&N0(n,null);let s=a.length;for(;s--;){let r=a[s];if(typeof r=="string"){const c=i(r);c!==r&&(U3(a)||(a[s]=c),r=c)}n[r]=!0}return n}function I3(n){for(let a=0;a<n.length;a++)Pn(n,a)||(n[a]=null);return n}function Aa(n){const a=rf(null);for(const[i,s]of A0(n))Pn(n,i)&&(Array.isArray(s)?a[i]=I3(s):s&&typeof s=="object"&&s.constructor===Object?a[i]=Aa(s):a[i]=s);return a}function Yo(n,a){for(;n!==null;){const s=$3(n,a);if(s){if(s.get)return nn(s.get);if(typeof s.value=="function")return nn(s.value)}n=V3(n)}function i(){return null}return i}const T0=en(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","search","section","select","shadow","slot","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),hf=en(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","enterkeyhint","exportparts","filter","font","g","glyph","glyphref","hkern","image","inputmode","line","lineargradient","marker","mask","metadata","mpath","part","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),pf=en(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),Q3=en(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),gf=en(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),K3=en(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),C0=en(["#text"]),M0=en(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","exportparts","face","for","headers","height","hidden","high","href","hreflang","id","inert","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","part","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","slot","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),mf=en(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","mask-type","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),z0=en(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),Tr=en(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),F3=zn(/\{\{[\w\W]*|[\w\W]*\}\}/gm),J3=zn(/<%[\w\W]*|[\w\W]*%>/gm),P3=zn(/\$\{[\w\W]*/gm),W3=zn(/^data-[\-\w.\u00B7-\uFFFF]+$/),ek=zn(/^aria-[\-\w]+$/),D0=zn(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),tk=zn(/^(?:\w+script|data):/i),nk=zn(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),O0=zn(/^html$/i),ak=zn(/^[a-z][.\w]*(-[.\w]+)+$/i);var R0=Object.freeze({__proto__:null,ARIA_ATTR:ek,ATTR_WHITESPACE:nk,CUSTOM_ELEMENT:ak,DATA_ATTR:W3,DOCTYPE_NAME:O0,ERB_EXPR:J3,IS_ALLOWED_URI:D0,IS_SCRIPT_OR_DATA:tk,MUSTACHE_EXPR:F3,TMPLIT_EXPR:P3});const qo={element:1,text:3,progressingInstruction:7,comment:8,document:9},lk=function(){return typeof window>"u"?null:window},ik=function(a,i){if(typeof a!="object"||typeof a.createPolicy!="function")return null;let s=null;const r="data-tt-policy-suffix";i&&i.hasAttribute(r)&&(s=i.getAttribute(r));const c="dompurify"+(s?"#"+s:"");try{return a.createPolicy(c,{createHTML(u){return u},createScriptURL(u){return u}})}catch{return console.warn("TrustedTypes policy "+c+" could not be created."),null}},j0=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function L0(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:lk();const a=ve=>L0(ve);if(a.version="3.3.0",a.removed=[],!n||!n.document||n.document.nodeType!==qo.document||!n.Element)return a.isSupported=!1,a;let{document:i}=n;const s=i,r=s.currentScript,{DocumentFragment:c,HTMLTemplateElement:u,Node:h,Element:g,NodeFilter:p,NamedNodeMap:x=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:y,DOMParser:v,trustedTypes:S}=n,b=g.prototype,E=Yo(b,"cloneNode"),_=Yo(b,"remove"),T=Yo(b,"nextSibling"),z=Yo(b,"childNodes"),N=Yo(b,"parentNode");if(typeof u=="function"){const ve=i.createElement("template");ve.content&&ve.content.ownerDocument&&(i=ve.content.ownerDocument)}let C,D="";const{implementation:R,createNodeIterator:j,createDocumentFragment:K,getElementsByTagName:J}=i,{importNode:fe}=s;let U=j0();a.isSupported=typeof A0=="function"&&typeof N=="function"&&R&&R.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:F,ERB_EXPR:ae,TMPLIT_EXPR:H,DATA_ATTR:I,ARIA_ATTR:k,IS_SCRIPT_OR_DATA:L,ATTR_WHITESPACE:$,CUSTOM_ELEMENT:Z}=R0;let{IS_ALLOWED_URI:Y}=R0,A=null;const O=Le({},[...T0,...hf,...pf,...gf,...C0]);let G=null;const P=Le({},[...M0,...mf,...z0,...Tr]);let se=Object.seal(rf(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ge=null,he=null;const ue=Object.seal(rf(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let me=!0,Ne=!0,ke=!1,Se=!0,_e=!1,we=!0,Me=!1,Re=!1,le=!1,de=!1,Je=!1,et=!1,on=!0,wn=!1;const _t="user-content-";let gt=!0,sn=!1,Bt={},$t=null;const Rt=Le({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Na=null;const ea=Le({},["audio","video","img","source","image","track"]);let ta=null;const pa=Le({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),rn="http://www.w3.org/1998/Math/MathML",vt="http://www.w3.org/2000/svg",mt="http://www.w3.org/1999/xhtml";let dt=mt,ka=!1,ga=null;const je=Le({},[rn,vt,mt],ff);let tt=Le({},["mi","mo","mn","ms","mtext"]),yt=Le({},["annotation-xml"]);const jt=Le({},["title","style","font","a","script"]);let Ye=null;const En=["application/xhtml+xml","text/html"],na="text/html";let ht=null,Ft=null;const Ta=i.createElement("form"),Dn=function(q){return q instanceof RegExp||q instanceof Function},ma=function(){let q=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(Ft&&Ft===q)){if((!q||typeof q!="object")&&(q={}),q=Aa(q),Ye=En.indexOf(q.PARSER_MEDIA_TYPE)===-1?na:q.PARSER_MEDIA_TYPE,ht=Ye==="application/xhtml+xml"?ff:kr,A=Pn(q,"ALLOWED_TAGS")?Le({},q.ALLOWED_TAGS,ht):O,G=Pn(q,"ALLOWED_ATTR")?Le({},q.ALLOWED_ATTR,ht):P,ga=Pn(q,"ALLOWED_NAMESPACES")?Le({},q.ALLOWED_NAMESPACES,ff):je,ta=Pn(q,"ADD_URI_SAFE_ATTR")?Le(Aa(pa),q.ADD_URI_SAFE_ATTR,ht):pa,Na=Pn(q,"ADD_DATA_URI_TAGS")?Le(Aa(ea),q.ADD_DATA_URI_TAGS,ht):ea,$t=Pn(q,"FORBID_CONTENTS")?Le({},q.FORBID_CONTENTS,ht):Rt,ge=Pn(q,"FORBID_TAGS")?Le({},q.FORBID_TAGS,ht):Aa({}),he=Pn(q,"FORBID_ATTR")?Le({},q.FORBID_ATTR,ht):Aa({}),Bt=Pn(q,"USE_PROFILES")?q.USE_PROFILES:!1,me=q.ALLOW_ARIA_ATTR!==!1,Ne=q.ALLOW_DATA_ATTR!==!1,ke=q.ALLOW_UNKNOWN_PROTOCOLS||!1,Se=q.ALLOW_SELF_CLOSE_IN_ATTR!==!1,_e=q.SAFE_FOR_TEMPLATES||!1,we=q.SAFE_FOR_XML!==!1,Me=q.WHOLE_DOCUMENT||!1,de=q.RETURN_DOM||!1,Je=q.RETURN_DOM_FRAGMENT||!1,et=q.RETURN_TRUSTED_TYPE||!1,le=q.FORCE_BODY||!1,on=q.SANITIZE_DOM!==!1,wn=q.SANITIZE_NAMED_PROPS||!1,gt=q.KEEP_CONTENT!==!1,sn=q.IN_PLACE||!1,Y=q.ALLOWED_URI_REGEXP||D0,dt=q.NAMESPACE||mt,tt=q.MATHML_TEXT_INTEGRATION_POINTS||tt,yt=q.HTML_INTEGRATION_POINTS||yt,se=q.CUSTOM_ELEMENT_HANDLING||{},q.CUSTOM_ELEMENT_HANDLING&&Dn(q.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(se.tagNameCheck=q.CUSTOM_ELEMENT_HANDLING.tagNameCheck),q.CUSTOM_ELEMENT_HANDLING&&Dn(q.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(se.attributeNameCheck=q.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),q.CUSTOM_ELEMENT_HANDLING&&typeof q.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(se.allowCustomizedBuiltInElements=q.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),_e&&(Ne=!1),Je&&(de=!0),Bt&&(A=Le({},C0),G=[],Bt.html===!0&&(Le(A,T0),Le(G,M0)),Bt.svg===!0&&(Le(A,hf),Le(G,mf),Le(G,Tr)),Bt.svgFilters===!0&&(Le(A,pf),Le(G,mf),Le(G,Tr)),Bt.mathMl===!0&&(Le(A,gf),Le(G,z0),Le(G,Tr))),q.ADD_TAGS&&(typeof q.ADD_TAGS=="function"?ue.tagCheck=q.ADD_TAGS:(A===O&&(A=Aa(A)),Le(A,q.ADD_TAGS,ht))),q.ADD_ATTR&&(typeof q.ADD_ATTR=="function"?ue.attributeCheck=q.ADD_ATTR:(G===P&&(G=Aa(G)),Le(G,q.ADD_ATTR,ht))),q.ADD_URI_SAFE_ATTR&&Le(ta,q.ADD_URI_SAFE_ATTR,ht),q.FORBID_CONTENTS&&($t===Rt&&($t=Aa($t)),Le($t,q.FORBID_CONTENTS,ht)),gt&&(A["#text"]=!0),Me&&Le(A,["html","head","body"]),A.table&&(Le(A,["tbody"]),delete ge.tbody),q.TRUSTED_TYPES_POLICY){if(typeof q.TRUSTED_TYPES_POLICY.createHTML!="function")throw $o('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof q.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw $o('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');C=q.TRUSTED_TYPES_POLICY,D=C.createHTML("")}else C===void 0&&(C=ik(S,r)),C!==null&&typeof D=="string"&&(D=C.createHTML(""));en&&en(q),Ft=q}},Ca=Le({},[...hf,...pf,...Q3]),Ma=Le({},[...gf,...K3]),On=function(q){let pe=N(q);(!pe||!pe.tagName)&&(pe={namespaceURI:dt,tagName:"template"});const ye=kr(q.tagName),Xe=kr(pe.tagName);return ga[q.namespaceURI]?q.namespaceURI===vt?pe.namespaceURI===mt?ye==="svg":pe.namespaceURI===rn?ye==="svg"&&(Xe==="annotation-xml"||tt[Xe]):!!Ca[ye]:q.namespaceURI===rn?pe.namespaceURI===mt?ye==="math":pe.namespaceURI===vt?ye==="math"&&yt[Xe]:!!Ma[ye]:q.namespaceURI===mt?pe.namespaceURI===vt&&!yt[Xe]||pe.namespaceURI===rn&&!tt[Xe]?!1:!Ma[ye]&&(jt[ye]||!Ca[ye]):!!(Ye==="application/xhtml+xml"&&ga[q.namespaceURI]):!1},Ct=function(q){Uo(a.removed,{element:q});try{N(q).removeChild(q)}catch{_(q)}},Yt=function(q,pe){try{Uo(a.removed,{attribute:pe.getAttributeNode(q),from:pe})}catch{Uo(a.removed,{attribute:null,from:pe})}if(pe.removeAttribute(q),q==="is")if(de||Je)try{Ct(pe)}catch{}else try{pe.setAttribute(q,"")}catch{}},Rn=function(q){let pe=null,ye=null;if(le)q="<remove></remove>"+q;else{const De=df(q,/^[\r\n\t ]+/);ye=De&&De[0]}Ye==="application/xhtml+xml"&&dt===mt&&(q='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+q+"</body></html>");const Xe=C?C.createHTML(q):q;if(dt===mt)try{pe=new v().parseFromString(Xe,Ye)}catch{}if(!pe||!pe.documentElement){pe=R.createDocument(dt,"template",null);try{pe.documentElement.innerHTML=ka?D:Xe}catch{}}const st=pe.body||pe.documentElement;return q&&ye&&st.insertBefore(i.createTextNode(ye),st.childNodes[0]||null),dt===mt?J.call(pe,Me?"html":"body")[0]:Me?pe.documentElement:st},Vl=function(q){return j.call(q.ownerDocument||q,q,p.SHOW_ELEMENT|p.SHOW_COMMENT|p.SHOW_TEXT|p.SHOW_PROCESSING_INSTRUCTION|p.SHOW_CDATA_SECTION,null)},cn=function(q){return q instanceof y&&(typeof q.nodeName!="string"||typeof q.textContent!="string"||typeof q.removeChild!="function"||!(q.attributes instanceof x)||typeof q.removeAttribute!="function"||typeof q.setAttribute!="function"||typeof q.namespaceURI!="string"||typeof q.insertBefore!="function"||typeof q.hasChildNodes!="function")},bt=function(q){return typeof h=="function"&&q instanceof h};function ot(ve,q,pe){Nr(ve,ye=>{ye.call(a,q,pe,Ft)})}const jn=function(q){let pe=null;if(ot(U.beforeSanitizeElements,q,null),cn(q))return Ct(q),!0;const ye=ht(q.nodeName);if(ot(U.uponSanitizeElement,q,{tagName:ye,allowedTags:A}),we&&q.hasChildNodes()&&!bt(q.firstElementChild)&&tn(/<[/\w!]/g,q.innerHTML)&&tn(/<[/\w!]/g,q.textContent)||q.nodeType===qo.progressingInstruction||we&&q.nodeType===qo.comment&&tn(/<[/\w]/g,q.data))return Ct(q),!0;if(!(ue.tagCheck instanceof Function&&ue.tagCheck(ye))&&(!A[ye]||ge[ye])){if(!ge[ye]&&$l(ye)&&(se.tagNameCheck instanceof RegExp&&tn(se.tagNameCheck,ye)||se.tagNameCheck instanceof Function&&se.tagNameCheck(ye)))return!1;if(gt&&!$t[ye]){const Xe=N(q)||q.parentNode,st=z(q)||q.childNodes;if(st&&Xe){const De=st.length;for(let Lt=De-1;Lt>=0;--Lt){const un=E(st[Lt],!0);un.__removalCount=(q.__removalCount||0)+1,Xe.insertBefore(un,T(q))}}}return Ct(q),!0}return q instanceof g&&!On(q)||(ye==="noscript"||ye==="noembed"||ye==="noframes")&&tn(/<\/no(script|embed|frames)/i,q.innerHTML)?(Ct(q),!0):(_e&&q.nodeType===qo.text&&(pe=q.textContent,Nr([F,ae,H],Xe=>{pe=Vo(pe,Xe," ")}),q.textContent!==pe&&(Uo(a.removed,{element:q.cloneNode()}),q.textContent=pe)),ot(U.afterSanitizeElements,q,null),!1)},za=function(q,pe,ye){if(on&&(pe==="id"||pe==="name")&&(ye in i||ye in Ta))return!1;if(!(Ne&&!he[pe]&&tn(I,pe))){if(!(me&&tn(k,pe))){if(!(ue.attributeCheck instanceof Function&&ue.attributeCheck(pe,q))){if(!G[pe]||he[pe]){if(!($l(q)&&(se.tagNameCheck instanceof RegExp&&tn(se.tagNameCheck,q)||se.tagNameCheck instanceof Function&&se.tagNameCheck(q))&&(se.attributeNameCheck instanceof RegExp&&tn(se.attributeNameCheck,pe)||se.attributeNameCheck instanceof Function&&se.attributeNameCheck(pe,q))||pe==="is"&&se.allowCustomizedBuiltInElements&&(se.tagNameCheck instanceof RegExp&&tn(se.tagNameCheck,ye)||se.tagNameCheck instanceof Function&&se.tagNameCheck(ye))))return!1}else if(!ta[pe]){if(!tn(Y,Vo(ye,$,""))){if(!((pe==="src"||pe==="xlink:href"||pe==="href")&&q!=="script"&&X3(ye,"data:")===0&&Na[q])){if(!(ke&&!tn(L,Vo(ye,$,"")))){if(ye)return!1}}}}}}}return!0},$l=function(q){return q!=="annotation-xml"&&df(q,Z)},bi=function(q){ot(U.beforeSanitizeAttributes,q,null);const{attributes:pe}=q;if(!pe||cn(q))return;const ye={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:G,forceKeepAttr:void 0};let Xe=pe.length;for(;Xe--;){const st=pe[Xe],{name:De,namespaceURI:Lt,value:un}=st,Jt=ht(De),Ln=un;let At=De==="value"?Ln:G3(Ln);if(ye.attrName=Jt,ye.attrValue=At,ye.keepAttr=!0,ye.forceKeepAttr=void 0,ot(U.uponSanitizeAttribute,q,ye),At=ye.attrValue,wn&&(Jt==="id"||Jt==="name")&&(Yt(De,q),At=_t+At),we&&tn(/((--!?|])>)|<\/(style|title|textarea)/i,At)){Yt(De,q);continue}if(Jt==="attributename"&&df(At,"href")){Yt(De,q);continue}if(ye.forceKeepAttr)continue;if(!ye.keepAttr){Yt(De,q);continue}if(!Se&&tn(/\/>/i,At)){Yt(De,q);continue}_e&&Nr([F,ae,H],Yl=>{At=Vo(At,Yl," ")});const al=ht(q.nodeName);if(!za(al,Jt,At)){Yt(De,q);continue}if(C&&typeof S=="object"&&typeof S.getAttributeType=="function"&&!Lt)switch(S.getAttributeType(al,Jt)){case"TrustedHTML":{At=C.createHTML(At);break}case"TrustedScriptURL":{At=C.createScriptURL(At);break}}if(At!==Ln)try{Lt?q.setAttributeNS(Lt,De,At):q.setAttribute(De,At),cn(q)?Ct(q):k0(a.removed)}catch{Yt(De,q)}}ot(U.afterSanitizeAttributes,q,null)},Si=function ve(q){let pe=null;const ye=Vl(q);for(ot(U.beforeSanitizeShadowDOM,q,null);pe=ye.nextNode();)ot(U.uponSanitizeShadowNode,pe,null),jn(pe),bi(pe),pe.content instanceof c&&ve(pe.content);ot(U.afterSanitizeShadowDOM,q,null)};return a.sanitize=function(ve){let q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},pe=null,ye=null,Xe=null,st=null;if(ka=!ve,ka&&(ve="<!-->"),typeof ve!="string"&&!bt(ve))if(typeof ve.toString=="function"){if(ve=ve.toString(),typeof ve!="string")throw $o("dirty is not a string, aborting")}else throw $o("toString is not a function");if(!a.isSupported)return ve;if(Re||ma(q),a.removed=[],typeof ve=="string"&&(sn=!1),sn){if(ve.nodeName){const un=ht(ve.nodeName);if(!A[un]||ge[un])throw $o("root node is forbidden and cannot be sanitized in-place")}}else if(ve instanceof h)pe=Rn("<!---->"),ye=pe.ownerDocument.importNode(ve,!0),ye.nodeType===qo.element&&ye.nodeName==="BODY"||ye.nodeName==="HTML"?pe=ye:pe.appendChild(ye);else{if(!de&&!_e&&!Me&&ve.indexOf("<")===-1)return C&&et?C.createHTML(ve):ve;if(pe=Rn(ve),!pe)return de?null:et?D:""}pe&&le&&Ct(pe.firstChild);const De=Vl(sn?ve:pe);for(;Xe=De.nextNode();)jn(Xe),bi(Xe),Xe.content instanceof c&&Si(Xe.content);if(sn)return ve;if(de){if(Je)for(st=K.call(pe.ownerDocument);pe.firstChild;)st.appendChild(pe.firstChild);else st=pe;return(G.shadowroot||G.shadowrootmode)&&(st=fe.call(s,st,!0)),st}let Lt=Me?pe.outerHTML:pe.innerHTML;return Me&&A["!doctype"]&&pe.ownerDocument&&pe.ownerDocument.doctype&&pe.ownerDocument.doctype.name&&tn(O0,pe.ownerDocument.doctype.name)&&(Lt="<!DOCTYPE "+pe.ownerDocument.doctype.name+`>
311
- `+Lt),_e&&Nr([F,ae,H],un=>{Lt=Vo(Lt,un," ")}),C&&et?C.createHTML(Lt):Lt},a.setConfig=function(){let ve=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};ma(ve),Re=!0},a.clearConfig=function(){Ft=null,Re=!1},a.isValidAttribute=function(ve,q,pe){Ft||ma({});const ye=ht(ve),Xe=ht(q);return za(ye,Xe,pe)},a.addHook=function(ve,q){typeof q=="function"&&Uo(U[ve],q)},a.removeHook=function(ve,q){if(q!==void 0){const pe=Y3(U[ve],q);return pe===-1?void 0:q3(U[ve],pe,1)[0]}return k0(U[ve])},a.removeHooks=function(ve){U[ve]=[]},a.removeAllHooks=function(){U=j0()},a}var ok=L0();const H0=n=>{let a;const i=new Set,s=(p,x)=>{const y=typeof p=="function"?p(a):p;if(!Object.is(y,a)){const v=a;a=x??(typeof y!="object"||y===null)?y:Object.assign({},a,y),i.forEach(S=>S(a,v))}},r=()=>a,h={setState:s,getState:r,getInitialState:()=>g,subscribe:p=>(i.add(p),()=>i.delete(p))},g=a=n(s,r,h);return h},B0=(n=>n?H0(n):H0),sk=n=>n;function rk(n,a=sk){const i=Ka.useSyncExternalStore(n.subscribe,Ka.useCallback(()=>a(n.getState()),[n,a]),Ka.useCallback(()=>a(n.getInitialState()),[n,a]));return Ka.useDebugValue(i),i}const ck=n=>{const a=B0(n),i=s=>rk(a,s);return Object.assign(i,a),i},U0=(n=>ck),yf=n=>!!n&&n[0]==="o",xf=Do.unstable_batchedUpdates,Xo=(n,a)=>n===!0||!!(n&&n[a]),Sn=(n,a)=>typeof n=="function"?n(a):n,V0="_szhsinMenu",uk=n=>n[V0],fk=(n,a)=>Object.defineProperty(a,V0,{value:n}),Go=(n,a)=>(a&&Object.keys(a).forEach(i=>{const s=n[i],r=a[i];typeof r=="function"&&s?n[i]=(...c)=>{r(...c),s(...c)}:n[i]=r}),n),dk=n=>{if(typeof n!="string")return{top:0,right:0,bottom:0,left:0};const a=n.trim().split(/\s+/,4).map(parseFloat),i=isNaN(a[0])?0:a[0],s=isNaN(a[1])?i:a[1];return{top:i,right:s,bottom:isNaN(a[2])?i:a[2],left:isNaN(a[3])?s:a[3]}},vf=n=>{for(;n;){if(n=n.parentNode,!n||n===document.body||!n.parentNode)return;const{overflow:a,overflowX:i,overflowY:s}=getComputedStyle(n);if(/auto|scroll|overlay|hidden/.test(a+s+i))return n}};function bf(n,a){return{"aria-disabled":n||void 0,tabIndex:a?0:-1}}function $0(n,a){for(let i=0;i<n.length;i++)if(n[i]===a)return i;return-1}const nl=({block:n,element:a,modifiers:i,className:s})=>B.useMemo(()=>{const r=a?`${n}__${a}`:n;let c=r;i&&Object.keys(i).forEach(h=>{const g=i[h];g&&(c+=` ${r}--${g===!0?h:`${h}-${g}`}`)});let u=typeof s=="function"?s(i):s;return typeof u=="string"&&(u=u.trim(),u&&(c+=` ${u}`)),c},[n,a,i,s]),hk="szh-menu-container",Ul="szh-menu",pk="szh-menu-button",gk="arrow",Y0="item",mk="divider",yk="submenu",q0=B.createContext(),Sf=B.createContext({}),wf=B.createContext({}),X0=B.createContext({}),xk=B.createContext({}),Cr=B.createContext({}),Qt=Object.freeze({ENTER:"Enter",ESC:"Escape",SPACE:" ",HOME:"Home",END:"End",LEFT:"ArrowLeft",RIGHT:"ArrowRight",UP:"ArrowUp",DOWN:"ArrowDown"}),Et=Object.freeze({RESET:0,SET:1,UNSET:2,INCREASE:3,DECREASE:4,FIRST:5,LAST:6,SET_INDEX:7}),Zo=Object.freeze({CLICK:"click",CANCEL:"cancel",BLUR:"blur",SCROLL:"scroll"}),vi=Object.freeze({FIRST:"first",LAST:"last"}),vk=Object.freeze({entering:"opening",entered:"open",exiting:"closing",exited:"closed"}),G0="absolute",Z0="none",I0="menuitem",Ef={preventScroll:!0},Q0=fk("MenuButton",B.forwardRef(function({className:a,isOpen:i,disabled:s,children:r,...c},u){const h=B.useMemo(()=>({open:i}),[i]);return m.jsx("button",{"aria-haspopup":!0,"aria-expanded":i,"aria-disabled":s||void 0,type:"button",disabled:s,...c,ref:u,className:nl({block:pk,modifiers:h,className:a}),children:r})})),bk=({className:n,containerRef:a,containerProps:i,children:s,isOpen:r,theming:c,transition:u,onClose:h})=>{const g=Xo(u,"item"),p=({key:y})=>{switch(y){case Qt.ESC:Sn(h,{key:y,reason:Zo.CANCEL});break}},x=y=>{r&&!y.currentTarget.contains(y.relatedTarget)&&Sn(h,{reason:Zo.BLUR})};return m.jsx("div",{...Go({onKeyDown:p,onBlur:x},i),className:nl({block:hk,modifiers:B.useMemo(()=>({theme:c,itemTransition:g}),[c,g]),className:n}),style:{position:"absolute",...i?.style},ref:a,children:s})},Sk=()=>{let n,a=0;return{toggle:i=>{i?a++:a--,a=Math.max(a,0)},on:(i,s,r)=>{a?n||(n=setTimeout(()=>{n=0,s()},i)):r?.()},off:()=>{n&&(clearTimeout(n),n=0)}}},wk=n=>{const[a,i]=B.useState(),r=B.useRef({items:[],hoverIndex:-1,sorted:!1}).current,c=B.useCallback((h,g)=>{const{items:p}=r;if(!h)r.items=[];else if(g)p.push(h);else{const x=p.indexOf(h);x>-1&&(p.splice(x,1),h.contains(document.activeElement)&&(n.current.focus(Ef),i()))}r.hoverIndex=-1,r.sorted=!1},[r,n]),u=B.useCallback((h,g,p)=>{const{items:x,hoverIndex:y}=r,v=()=>{if(r.sorted)return;const E=n.current.querySelectorAll(".szh-menu__item");x.sort((_,T)=>$0(E,_)-$0(E,T)),r.sorted=!0};let S=-1,b;switch(h){case Et.RESET:break;case Et.SET:b=g;break;case Et.UNSET:b=E=>E===g?void 0:E;break;case Et.FIRST:v(),S=0,b=x[S];break;case Et.LAST:v(),S=x.length-1,b=x[S];break;case Et.SET_INDEX:v(),S=p,b=x[S];break;case Et.INCREASE:v(),S=y,S<0&&(S=x.indexOf(g)),S++,S>=x.length&&(S=0),b=x[S];break;case Et.DECREASE:v(),S=y,S<0&&(S=x.indexOf(g)),S--,S<0&&(S=x.length-1),b=x[S];break}b||(S=-1),i(b),r.hoverIndex=S},[n,r]);return{hoverItem:a,dispatch:u,updateItems:c}},K0=(n,a)=>Math.round(n)===a?n:a,Ek=n=>{const a=n.getBoundingClientRect();return a.width=K0(a.width,n.offsetWidth),a.height=K0(a.height,n.offsetHeight),a},_k=(n,a,i,s)=>{const r=Ek(a),c=n.getBoundingClientRect(),u=i===window?{left:0,top:0,right:document.documentElement.clientWidth,bottom:window.innerHeight}:i.getBoundingClientRect(),h=dk(s),g=b=>b+c.left-u.left-h.left,p=b=>b+c.left+r.width-u.right+h.right,x=b=>b+c.top-u.top-h.top,y=b=>b+c.top+r.height-u.bottom+h.bottom;return{menuRect:r,containerRect:c,getLeftOverflow:g,getRightOverflow:p,getTopOverflow:x,getBottomOverflow:y,confineHorizontally:b=>{let E=g(b);if(E<0)b-=E;else{const _=p(b);_>0&&(b-=_,E=g(b),E<0&&(b-=E))}return b},confineVertically:b=>{let E=x(b);if(E<0)b-=E;else{const _=y(b);_>0&&(b-=_,E=x(b),E<0&&(b-=E))}return b}}},Ak=({arrowRef:n,menuY:a,anchorRect:i,containerRect:s,menuRect:r})=>{let c=i.top-s.top-a+i.height/2;const u=n.current.offsetHeight*1.25;return c=Math.max(u,c),c=Math.min(c,r.height-u),c},Nk=({anchorRect:n,containerRect:a,menuRect:i,placeLeftorRightY:s,placeLeftX:r,placeRightX:c,getLeftOverflow:u,getRightOverflow:h,confineHorizontally:g,confineVertically:p,arrowRef:x,arrow:y,direction:v,position:S})=>{let b=v,E=s;S!=="initial"&&(E=p(E),S==="anchor"&&(E=Math.min(E,n.bottom-a.top),E=Math.max(E,n.top-a.top-i.height)));let _,T,z;return b==="left"?(_=r,S!=="initial"&&(T=u(_),T<0&&(z=h(c),(z<=0||-T>z)&&(_=c,b="right")))):(_=c,S!=="initial"&&(z=h(_),z>0&&(T=u(r),(T>=0||-T<z)&&(_=r,b="left")))),S==="auto"&&(_=g(_)),{arrowY:y?Ak({menuY:E,arrowRef:x,anchorRect:n,containerRect:a,menuRect:i}):void 0,x:_,y:E,computedDirection:b}},kk=({arrowRef:n,menuX:a,anchorRect:i,containerRect:s,menuRect:r})=>{let c=i.left-s.left-a+i.width/2;const u=n.current.offsetWidth*1.25;return c=Math.max(u,c),c=Math.min(c,r.width-u),c},Tk=({anchorRect:n,containerRect:a,menuRect:i,placeToporBottomX:s,placeTopY:r,placeBottomY:c,getTopOverflow:u,getBottomOverflow:h,confineHorizontally:g,confineVertically:p,arrowRef:x,arrow:y,direction:v,position:S})=>{let b=v==="top"?"top":"bottom",E=s;S!=="initial"&&(E=g(E),S==="anchor"&&(E=Math.min(E,n.right-a.left),E=Math.max(E,n.left-a.left-i.width)));let _,T,z;return b==="top"?(_=r,S!=="initial"&&(T=u(_),T<0&&(z=h(c),(z<=0||-T>z)&&(_=c,b="bottom")))):(_=c,S!=="initial"&&(z=h(_),z>0&&(T=u(r),(T>=0||-T<z)&&(_=r,b="top")))),S==="auto"&&(_=p(_)),{arrowX:y?kk({menuX:E,arrowRef:x,anchorRect:n,containerRect:a,menuRect:i}):void 0,x:E,y:_,computedDirection:b}},Ck=({arrow:n,align:a,direction:i,gap:s,shift:r,position:c,anchorRect:u,arrowRef:h,positionHelpers:g})=>{const{menuRect:p,containerRect:x}=g,y=i==="left"||i==="right";let v=y?s:r,S=y?r:s;if(n){const D=h.current;y?v+=D.offsetWidth:S+=D.offsetHeight}const b=u.left-x.left-p.width-v,E=u.right-x.left+v,_=u.top-x.top-p.height-S,T=u.bottom-x.top+S;let z,N;a==="end"?(z=u.right-x.left-p.width,N=u.bottom-x.top-p.height):a==="center"?(z=u.left-x.left-(p.width-u.width)/2,N=u.top-x.top-(p.height-u.height)/2):(z=u.left-x.left,N=u.top-x.top),z+=v,N+=S;const C={...g,anchorRect:u,placeLeftX:b,placeRightX:E,placeLeftorRightY:N,placeTopY:_,placeBottomY:T,placeToporBottomX:z,arrowRef:h,arrow:n,direction:i,position:c};switch(i){case"left":case"right":return Nk(C);case"top":case"bottom":default:return Tk(C)}},Mr=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u"?B.useLayoutEffect:B.useEffect;function F0(n,a){typeof n=="function"?n(a):n.current=a}const zr=(n,a)=>B.useMemo(()=>n?a?i=>{F0(n,i),F0(a,i)}:n:a,[n,a]),J0=-9999,P0=({ariaLabel:n,menuClassName:a,menuStyle:i,arrow:s,arrowProps:r={},anchorPoint:c,anchorRef:u,containerRef:h,containerProps:g,externalRef:p,parentScrollingRef:x,align:y="start",direction:v="bottom",position:S="auto",overflow:b="visible",setDownOverflow:E,repositionFlag:_,captureFocus:T=!0,state:z,endTransition:N,isDisabled:C,menuItemFocus:D,gap:R=0,shift:j=0,children:K,onClose:J,focusProps:fe,...U})=>{const[F,ae]=B.useState({x:J0,y:J0}),[H,I]=B.useState({}),[k,L]=B.useState(),[$,Z]=B.useState(v),[Y]=B.useState(Sk),[A,O]=B.useReducer(je=>je+1,1),{transition:G,boundingBoxRef:P,boundingBoxPadding:se,rootMenuRef:ge,rootAnchorRef:he,scrollNodesRef:ue,reposition:me,viewScroll:Ne,submenuCloseDelay:ke}=B.useContext(Cr),{submenuCtx:Se,reposSubmenu:_e=_}=B.useContext(wf),we=B.useRef(),Me=B.useRef(),Re=B.useRef(!1),{hoverItem:le,dispatch:de,updateItems:Je}=wk(we),et=yf(z),on=Xo(G,"open"),wn=Xo(G,"close"),_t=ue.current,gt=je=>{switch(je.key){case Qt.HOME:de(Et.FIRST);break;case Qt.END:de(Et.LAST);break;case Qt.UP:de(Et.DECREASE,le);break;case Qt.DOWN:de(Et.INCREASE,le);break;case Qt.SPACE:je.target&&je.target.className.indexOf(Ul)!==-1&&je.preventDefault();return;default:return}je.preventDefault(),je.stopPropagation()},sn=()=>{z==="closing"&&L(),Sn(N)},Bt=je=>{je.stopPropagation(),Y.on(ke,()=>{de(Et.RESET),we.current.focus(Ef)})},$t=je=>{je.target===je.currentTarget&&Y.off()},Rt=B.useCallback(je=>{const tt=we.current,yt=h.current;if(!tt||!yt)return;const jt=u?u.current?.getBoundingClientRect():c?{left:c.x,right:c.x,top:c.y,bottom:c.y,width:0,height:0}:null;if(!jt)return;_t.menu||(_t.menu=(P?P.current:vf(ge.current))||window);const Ye=_k(yt,tt,_t.menu,se);let{arrowX:En,arrowY:na,x:ht,y:Ft,computedDirection:Ta}=Ck({arrow:s,align:y,direction:v,gap:R,shift:j,position:S,anchorRect:jt,arrowRef:Me,positionHelpers:Ye});const{menuRect:Dn}=Ye,ma=Dn.height;if(!je&&b!=="visible"){const{getTopOverflow:Ca,getBottomOverflow:Ma}=Ye;let On,Ct;const Yt=Ma(Ft);if(Yt>0)On=ma-Yt,Ct=Yt;else{const Rn=Ca(Ft);Rn<0&&(On=ma+Rn,Ct=0-Rn,On>=0&&(Ft-=Rn))}On>=0&&L({height:On,overflowAmt:Ct})}s&&I({x:En,y:na}),ae({x:ht,y:Ft}),Z(Ta)},[s,y,se,v,R,j,S,b,c,u,h,P,ge,_t]);Mr(()=>{et&&(Rt(),Re.current&&O()),Re.current=et},[et,Rt,_e]),Mr(()=>{k&&!E&&(we.current.scrollTop=0)},[k,E]),Mr(()=>Je,[Je]),B.useEffect(()=>{let{menu:je}=_t;if(!et||!je)return;if(je=je.addEventListener?je:window,!_t.anchors){_t.anchors=[];let Ye=vf(he&&he.current);for(;Ye&&Ye!==je;)_t.anchors.push(Ye),Ye=vf(Ye)}let tt=Ne;if(_t.anchors.length&&tt==="initial"&&(tt="auto"),tt==="initial")return;const yt=()=>{tt==="auto"?xf(()=>Rt(!0)):Sn(J,{reason:Zo.SCROLL})},jt=_t.anchors.concat(Ne!=="initial"?je:[]);return jt.forEach(Ye=>Ye.addEventListener("scroll",yt)),()=>jt.forEach(Ye=>Ye.removeEventListener("scroll",yt))},[he,_t,et,J,Ne,Rt]);const Na=!!k&&k.overflowAmt>0;B.useEffect(()=>{if(Na||!et||!x)return;const je=()=>xf(Rt),tt=x.current;return tt.addEventListener("scroll",je),()=>tt.removeEventListener("scroll",je)},[et,Na,x,Rt]),B.useEffect(()=>{if(!et||typeof ResizeObserver!="function"||me==="initial")return;const je=[],tt=new ResizeObserver(Ye=>Ye.forEach(({target:En})=>{je.indexOf(En)<0?je.push(En):Do.flushSync(()=>{Rt(),O()})})),yt={box:"border-box"};tt.observe(we.current,yt);const jt=u?.current;return jt&&tt.observe(jt,yt),()=>tt.disconnect()},[et,me,u,Rt]),B.useEffect(()=>{if(!et){de(Et.RESET),wn||L();return}const{position:je,alwaysUpdate:tt}=D||{},yt=()=>{je===vi.FIRST?de(Et.FIRST):je===vi.LAST?de(Et.LAST):je>=-1&&de(Et.SET_INDEX,void 0,je)};if(tt)yt();else if(T){const jt=setTimeout(()=>{const Ye=we.current;Ye&&!Ye.contains(document.activeElement)&&(Ye.focus(Ef),yt())},on?170:100);return()=>clearTimeout(jt)}},[et,on,wn,T,D,de]);const ea=B.useMemo(()=>({isParentOpen:et,submenuCtx:Y,dispatch:de,updateItems:Je}),[et,Y,de,Je]);let ta,pa;k&&(E?pa=k.overflowAmt:ta=k.height);const rn=B.useMemo(()=>({reposSubmenu:A,submenuCtx:Y,overflow:b,overflowAmt:pa,parentMenuRef:we,parentDir:$}),[A,Y,b,pa,$]),vt=ta>=0?{maxHeight:ta,overflow:b}:void 0,mt=B.useMemo(()=>({state:z,align:y,dir:$}),[z,y,$]),dt=B.useMemo(()=>({dir:$}),[$]),ka=nl({block:Ul,element:gk,modifiers:dt,className:r.className}),ga=m.jsxs("ul",{role:"menu","aria-label":n,...bf(C),...Go({onPointerEnter:Se?.off,onPointerMove:Bt,onPointerLeave:$t,onKeyDown:gt,onAnimationEnd:sn},U),ref:zr(p,we),className:nl({block:Ul,modifiers:mt,className:a}),style:{...i,...vt,margin:0,display:z==="closed"?"none":void 0,position:G0,left:F.x,top:F.y},children:[s&&m.jsx("li",{"aria-hidden":!0,...r,className:ka,style:{display:"block",position:G0,left:H.x,top:H.y,...r.style},ref:Me}),m.jsx(wf.Provider,{value:rn,children:m.jsx(Sf.Provider,{value:ea,children:m.jsx(q0.Provider,{value:le,children:Sn(K,mt)})})})]});return g?m.jsx(bk,{...g,isOpen:et,children:ga}):ga},Mk=B.forwardRef(function({"aria-label":a,className:i,containerProps:s,initialMounted:r,unmountOnClose:c,transition:u,transitionTimeout:h,boundingBoxRef:g,boundingBoxPadding:p,reposition:x="auto",submenuOpenDelay:y=300,submenuCloseDelay:v=150,viewScroll:S="initial",portal:b,theming:E,onItemClick:_,...T},z){const N=B.useRef(null),C=B.useRef({}),{anchorRef:D,state:R,onClose:j}=T,K=B.useMemo(()=>({initialMounted:r,unmountOnClose:c,transition:u,transitionTimeout:h,boundingBoxRef:g,boundingBoxPadding:p,rootMenuRef:N,rootAnchorRef:D,scrollNodesRef:C,reposition:x,viewScroll:S,submenuOpenDelay:y,submenuCloseDelay:v}),[r,c,u,h,D,g,p,x,S,y,v]),J=B.useMemo(()=>({handleClick(U,F){U.stopPropagation||Sn(_,U);let ae=U.keepOpen;ae===void 0&&(ae=F&&U.key===Qt.SPACE),ae||Sn(j,{value:U.value,key:U.key,reason:Zo.CLICK})},handleClose(U){Sn(j,{key:U,reason:Zo.CLICK})}}),[_,j]);if(!R)return null;const fe=m.jsx(Cr.Provider,{value:K,children:m.jsx(X0.Provider,{value:J,children:m.jsx(P0,{...T,ariaLabel:a||"Menu",externalRef:z,containerRef:N,containerProps:{className:i,containerRef:N,containerProps:s,theming:E,transition:u,onClose:j}})})});return b===!0&&typeof document<"u"?Do.createPortal(fe,document.body):b?b.target?Do.createPortal(fe,b.target):b.stablePosition?null:fe:fe}),_f=0,Af=1,Dr=2,Or=3,Rr=4,zk=5,W0=6,Dk=["preEnter","entering","entered","preExit","exiting","exited","unmounted"],ey=n=>({_s:n,status:Dk[n],isEnter:n<Or,isMounted:n!==W0,isResolved:n===Dr||n>Rr}),Nf=n=>n?W0:zk,Ok=(n,a)=>{switch(n){case Af:case _f:return Dr;case Rr:case Or:return Nf(a)}},Rk=n=>typeof n=="object"?[n.enter,n.exit]:[n,n],jk=(n,a)=>setTimeout(()=>{isNaN(document.body.offsetTop)||n(a+1)},0),ty=(n,a,i,s,r)=>{clearTimeout(s.current);const c=ey(n);a(c),i.current=c,r&&r({current:c})},Lk=({enter:n=!0,exit:a=!0,preEnter:i,preExit:s,timeout:r,initialEntered:c,mountOnEnter:u,unmountOnExit:h,onStateChange:g}={})=>{const[p,x]=B.useState(()=>ey(c?Dr:Nf(u))),y=B.useRef(p),v=B.useRef(),[S,b]=Rk(r),E=B.useCallback(()=>{const T=Ok(y.current._s,h);T&&ty(T,x,y,v,g)},[g,h]),_=B.useCallback(T=>{const z=C=>{switch(ty(C,x,y,v,g),C){case Af:S>=0&&(v.current=setTimeout(E,S));break;case Rr:b>=0&&(v.current=setTimeout(E,b));break;case _f:case Or:v.current=jk(z,C);break}},N=y.current.isEnter;typeof T!="boolean"&&(T=!N),T?!N&&z(n?i?_f:Af:Dr):N&&z(a?s?Or:Rr:Nf(h))},[E,g,n,a,i,s,S,b,h]);return[p,_,E]},Hk=({initialOpen:n,initialMounted:a,unmountOnClose:i,transition:s,transitionTimeout:r=500,onMenuChange:c}={})=>{const u=Xo(s,"open"),h=Xo(s,"close"),[{status:g},p,x]=Lk({initialEntered:n,mountOnEnter:!a,unmountOnExit:i,timeout:r,enter:u,exit:h,onStateChange:B.useCallback(({current:{isEnter:y,isResolved:v}})=>{!c||y&&u&&v||!y&&h&&v||c({open:y})},[c,u,h])});return[{state:vk[g],endTransition:x},p]},ny=n=>{const[a,i]=Hk(n),[s,r]=B.useState(),c=(u,h)=>{r({position:u,alwaysUpdate:h}),i(!0)};return[{menuItemFocus:s,...a},i,c]},Bk=(n,a)=>{const[i]=B.useState({});return{onMouseDown:()=>{i.v=n&&n!=="closed"},onClick:s=>i.v?i.v=!1:a(!0,s)}},Uk=parseInt(B.version)<19,ay=B.forwardRef(function({"aria-label":a,captureFocus:i,initialOpen:s,menuButton:r,instanceRef:c,onMenuChange:u,...h},g){const[p,x,y]=ny({...h,onMenuChange:u}),{state:v}=p,S=yf(v),b=B.useRef(null),E=Bk(v,(D,R)=>y(R.detail?void 0:vi.FIRST)),_=B.useCallback(D=>{x(!1),D.key&&b.current.focus()},[x]),T=D=>{switch(D.key){case Qt.UP:y(vi.LAST);break;case Qt.DOWN:y(vi.FIRST);break;default:return}D.preventDefault()},z=Sn(r,{open:S});if(!z||!z.type)throw new Error("Menu requires a menuButton prop.");const N={...Go({onKeyDown:T,...E},z.props),ref:zr(Uk?z.ref:z.props.ref,b)};uk(z.type)==="MenuButton"&&(N.isOpen=S);const C=B.cloneElement(z,N);return B.useImperativeHandle(c,()=>({openMenu:y,closeMenu:()=>x(!1)})),m.jsxs(B.Fragment,{children:[C,m.jsx(Mk,{...h,...p,"aria-label":a||(typeof z.props.children=="string"?z.props.children:"Menu"),anchorRef:b,ref:g,onClose:_})]})}),ly=(n,a)=>{const i=B.memo(a),s=B.forwardRef((r,c)=>{const u=B.useRef(null);return m.jsx(i,{...r,itemRef:u,externalRef:c,isHovering:B.useContext(q0)===u.current})});return s.displayName=`WithHovering(${n})`,s},iy=n=>{const[a,i]=B.useState(!1);return B.useEffect(()=>{!n&&i(!1)},[n]),[a,()=>!a&&i(!0),()=>i(!1)]},oy=(n,a,i)=>{Mr(()=>{if(n)return;const s=a.current;return i(s,!0),()=>{i(s)}},[n,a,i])},Vk=ly("SubMenu",function({"aria-label":a,className:i,disabled:s,direction:r,label:c,openTrigger:u,onMenuChange:h,isHovering:g,instanceRef:p,itemRef:x,captureFocus:y,repositionFlag:v,itemProps:S={},portal:b=!1,...E}){const _=B.useContext(Cr),{rootMenuRef:T,submenuOpenDelay:z,submenuCloseDelay:N}=_,{parentMenuRef:C,parentDir:D,overflow:R}=B.useContext(wf),{isParentOpen:j,submenuCtx:K,dispatch:J,updateItems:fe}=B.useContext(Sf),U=b||R!=="visible",[F,ae,H]=ny({..._,onMenuChange:h}),[I,k,L]=iy(g),{state:$}=F,Z=!!s,Y=yf($),A=B.useRef(null),[O]=B.useState({v:0}),G=()=>{K.off(),O.v&&(clearTimeout(O.v),O.v=0)},P=(...le)=>{G(),se(),!Z&&H(...le)},se=()=>!g&&!Z&&J(Et.SET,x.current),ge=le=>{se(),u||(O.v=setTimeout(()=>xf(P),Math.max(le,0)))},he=le=>{Z||(le.stopPropagation(),k(),!(O.v||Y)&&K.on(N,()=>ge(z-N),()=>ge(z)))},ue=()=>{L(),G(),Y||J(Et.UNSET,x.current)},me=le=>{if(g)switch(le.key){case Qt.ENTER:le.preventDefault();case Qt.SPACE:case Qt.RIGHT:u!=="none"&&P(vi.FIRST)}},Ne=le=>{let de=!1;switch(le.key){case Qt.LEFT:Y&&(x.current.focus(),ae(!1),de=!0);break;case Qt.RIGHT:Y||(de=!0);break}de&&(le.preventDefault(),le.stopPropagation())};oy(Z,x,fe),B.useEffect(()=>K.toggle(Y),[K,Y]),B.useEffect(()=>()=>{clearTimeout(O.v),K.toggle(!1)},[O,K]),B.useEffect(()=>{g&&j?x.current.focus():ae(!1)},[g,j,ae,x]),B.useImperativeHandle(p,()=>({openMenu:(...le)=>{j&&P(...le)},closeMenu:()=>{Y&&(x.current.focus(),ae(!1))}}));const ke=B.useMemo(()=>({open:Y,hover:I||g,disabled:Z,submenu:!0}),[Y,g,Z,I]),{ref:Se,className:_e,...we}=S,Me=Go({onPointerEnter:K.off,onPointerMove:he,onPointerLeave:ue,onKeyDown:me,onClick:()=>u!=="none"&&P()},we),Re=()=>{const le=m.jsx(P0,{...E,...F,ariaLabel:a||(typeof c=="string"?c:"Submenu"),anchorRef:x,containerRef:U?T:A,direction:r||(D==="right"||D==="left"?D:"right"),parentScrollingRef:U&&C,isDisabled:Z}),de=T.current;return U&&de?Do.createPortal(le,de):le};return m.jsxs("li",{className:nl({block:Ul,element:yk,className:i}),style:{position:"relative"},role:Z0,ref:A,onKeyDown:Ne,children:[m.jsx("div",{role:I0,"aria-haspopup":!0,"aria-expanded":Y,...bf(Z,g),...Me,ref:zr(Se,x),className:nl({block:Ul,element:Y0,modifiers:ke,className:_e}),children:B.useMemo(()=>Sn(c,ke),[c,ke])}),$&&Re()]})}),$k=(n,a,i,s)=>{const[r,c,u]=iy(i),{submenuCloseDelay:h}=B.useContext(Cr),{isParentOpen:g,submenuCtx:p,dispatch:x,updateItems:y}=B.useContext(Sf),v=()=>{!i&&!s&&x(Et.SET,n.current)},S=()=>{!s&&x(Et.UNSET,n.current)},b=T=>{i&&!T.currentTarget.contains(T.relatedTarget)&&S()},E=T=>{s||(T.stopPropagation(),c(),p.on(h,v,v))},_=(T,z)=>{u(),p.off(),!z&&S()};return oy(s,n,y),B.useEffect(()=>{i&&g&&a.current&&a.current.focus()},[a,i,g]),{mouseOver:r,setHover:v,onBlur:b,onPointerMove:E,onPointerLeave:_}},Kt=ly("MenuItem",function({className:a,value:i,href:s,type:r,checked:c,disabled:u,children:h,onClick:g,isHovering:p,itemRef:x,externalRef:y,...v}){const S=!!u,{mouseOver:b,setHover:E,..._}=$k(x,x,p,S),T=B.useContext(X0),z=B.useContext(xk),N=r==="radio",C=r==="checkbox",D=!!s&&!S&&!N&&!C,R=N?z.value===i:C?!!c:!1,j=F=>{if(S){F.stopPropagation(),F.preventDefault();return}const ae={value:i,syntheticEvent:F};F.key!==void 0&&(ae.key=F.key),C&&(ae.checked=!R),N&&(ae.name=z.name),Sn(g,ae),N&&Sn(z.onRadioChange,ae),T.handleClick(ae,C||N)},K=F=>{if(p)switch(F.key){case Qt.ENTER:F.preventDefault();case Qt.SPACE:D?x.current.click():j(F)}},J=B.useMemo(()=>({type:r,disabled:S,hover:b||p,checked:R,anchor:D}),[r,S,b,p,R,D]),fe=Go({..._,onPointerDown:E,onKeyDown:K,onClick:j},v),U={role:N?"menuitemradio":C?"menuitemcheckbox":I0,"aria-checked":N||C?R:void 0,...bf(S,p),...fe,ref:zr(y,x),className:nl({block:Ul,element:Y0,modifiers:J,className:a}),children:B.useMemo(()=>Sn(h,J),[h,J])};return D?m.jsx("li",{role:Z0,children:m.jsx("a",{href:s,...U})}):m.jsx("li",{...U})}),kf=B.memo(B.forwardRef(function({className:a,...i},s){return m.jsx("li",{role:"separator",...i,ref:s,className:nl({block:Ul,element:mk,className:a})})}));function Yk(n,a){let i;try{i=n()}catch{return}return{getItem:r=>{var c;const u=g=>g===null?null:JSON.parse(g,void 0),h=(c=i.getItem(r))!=null?c:null;return h instanceof Promise?h.then(u):u(h)},setItem:(r,c)=>i.setItem(r,JSON.stringify(c,void 0)),removeItem:r=>i.removeItem(r)}}const Tf=n=>a=>{try{const i=n(a);return i instanceof Promise?i:{then(s){return Tf(s)(i)},catch(s){return this}}}catch(i){return{then(s){return this},catch(s){return Tf(s)(i)}}}},qk=(n,a)=>(i,s,r)=>{let c={storage:Yk(()=>localStorage),partialize:E=>E,version:0,merge:(E,_)=>({..._,...E}),...a},u=!1;const h=new Set,g=new Set;let p=c.storage;if(!p)return n((...E)=>{console.warn(`[zustand persist middleware] Unable to update item '${c.name}', the given storage is currently unavailable.`),i(...E)},s,r);const x=()=>{const E=c.partialize({...s()});return p.setItem(c.name,{state:E,version:c.version})},y=r.setState;r.setState=(E,_)=>(y(E,_),x());const v=n((...E)=>(i(...E),x()),s,r);r.getInitialState=()=>v;let S;const b=()=>{var E,_;if(!p)return;u=!1,h.forEach(z=>{var N;return z((N=s())!=null?N:v)});const T=((_=c.onRehydrateStorage)==null?void 0:_.call(c,(E=s())!=null?E:v))||void 0;return Tf(p.getItem.bind(p))(c.name).then(z=>{if(z)if(typeof z.version=="number"&&z.version!==c.version){if(c.migrate){const N=c.migrate(z.state,z.version);return N instanceof Promise?N.then(C=>[!0,C]):[!0,N]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,z.state];return[!1,void 0]}).then(z=>{var N;const[C,D]=z;if(S=c.merge(D,(N=s())!=null?N:v),i(S,!0),C)return x()}).then(()=>{T?.(S,void 0),S=s(),u=!0,g.forEach(z=>z(S))}).catch(z=>{T?.(void 0,z)})};return r.persist={setOptions:E=>{c={...c,...E},E.storage&&(p=E.storage)},clearStorage:()=>{p?.removeItem(c.name)},getOptions:()=>c,rehydrate:()=>b(),hasHydrated:()=>u,onHydrate:E=>(h.add(E),()=>{h.delete(E)}),onFinishHydration:E=>(g.add(E),()=>{g.delete(E)})},c.skipHydration||b(),S||v};var sy=(n,a,i)=>(r,c)=>({pastStates:i?.pastStates||[],futureStates:i?.futureStates||[],undo:(u=1)=>{if(c().pastStates.length){const h=i?.partialize?.(a())||a(),g=c().pastStates.splice(-u,u),p=g.shift();n(p),r({pastStates:c().pastStates,futureStates:c().futureStates.concat(i?.diff?.(h,p)||h,g.reverse())})}},redo:(u=1)=>{if(c().futureStates.length){const h=i?.partialize?.(a())||a(),g=c().futureStates.splice(-u,u),p=g.shift();n(p),r({pastStates:c().pastStates.concat(i?.diff?.(h,p)||h,g.reverse()),futureStates:c().futureStates})}},clear:()=>r({pastStates:[],futureStates:[]}),isTracking:!0,pause:()=>r({isTracking:!1}),resume:()=>r({isTracking:!0}),setOnSave:u=>r({_onSave:u}),_onSave:i?.onSave,_handleSet:(u,h,g,p)=>{i?.limit&&c().pastStates.length>=i?.limit&&c().pastStates.shift(),c()._onSave?.(u,g),r({pastStates:c().pastStates.concat(p||u),futureStates:[]})}}),Xk=(n,a)=>(s,r,c)=>{c.temporal=B0(a?.wrapTemporal?.(sy(s,r,a))||sy(s,r,a));const u=a?.handleSet?.(c.temporal.getState()._handleSet)||c.temporal.getState()._handleSet,h=p=>{if(!c.temporal.getState().isTracking)return;const x=a?.partialize?.(r())||r(),y=a?.diff?.(p,x);y===null||a?.equality?.(p,x)||u(p,void 0,x,y)},g=c.setState;return c.setState=(...p)=>{const x=a?.partialize?.(r())||r();g(...p),h(x)},n((...p)=>{const x=a?.partialize?.(r())||r();s(...p),h(x)},r,c)};const{useSyncExternalStoreWithSelector:Gk}=Xg,Zk=n=>n;function Ik(n,a=Zk,i){const s=Gk(n.subscribe,n.getState,n.getInitialState,a,i);return Ka.useDebugValue(s),s}var Cf,ry;function Qk(){return ry||(ry=1,Cf=function n(a,i){if(a===i)return!0;if(a&&i&&typeof a=="object"&&typeof i=="object"){if(a.constructor!==i.constructor)return!1;var s,r,c;if(Array.isArray(a)){if(s=a.length,s!=i.length)return!1;for(r=s;r--!==0;)if(!n(a[r],i[r]))return!1;return!0}if(a.constructor===RegExp)return a.source===i.source&&a.flags===i.flags;if(a.valueOf!==Object.prototype.valueOf)return a.valueOf()===i.valueOf();if(a.toString!==Object.prototype.toString)return a.toString()===i.toString();if(c=Object.keys(a),s=c.length,s!==Object.keys(i).length)return!1;for(r=s;r--!==0;)if(!Object.prototype.hasOwnProperty.call(i,c[r]))return!1;for(r=s;r--!==0;){var u=c[r];if(!n(a[u],i[u]))return!1}return!0}return a!==a&&i!==i}),Cf}var Kk=Qk();const Fk=ii(Kk);function Jk(n,a,i){var s=i||{},r=s.noTrailing,c=r===void 0?!1:r,u=s.noLeading,h=u===void 0?!1:u,g=s.debounceMode,p=g===void 0?void 0:g,x,y=!1,v=0;function S(){x&&clearTimeout(x)}function b(_){var T=_||{},z=T.upcomingOnly,N=z===void 0?!1:z;S(),y=!N}function E(){for(var _=arguments.length,T=new Array(_),z=0;z<_;z++)T[z]=arguments[z];var N=this,C=Date.now()-v;if(y)return;function D(){v=Date.now(),a.apply(N,T)}function R(){x=void 0}!h&&p&&!x&&D(),S(),p===void 0&&C>n?h?(v=Date.now(),c||(x=setTimeout(p?R:D,n))):D():c!==!0&&(x=setTimeout(p?R:D,p===void 0?n-C:n))}return E.cancel=b,E}function cy(n){n=n.trim(),n.match(/^[a-z]+:\/\//i)||(n="https://"+n);try{const a=new URL(n);return["http:","https:","mailto:"].includes(a.protocol)?a.href:null}catch{return null}}function Pk(n){const a=[],i=/\[([^\]]+)\]\(([^)]+)\)|(https?:\/\/[^\s<>"{}|\\^`\[\]]+)/g,s=Array.from(n.matchAll(i));let r=0;return s.forEach((c,u)=>{if(c.index!==void 0&&c.index>r&&a.push(n.substring(r,c.index)),c[1]&&c[2]){const h=c[1],g=c[2],p=cy(g);p?a.push(m.jsx("a",{href:p,target:"_blank",rel:"noopener noreferrer",style:{color:"#3b82f6",textDecoration:"underline"},children:h},u)):a.push(`[${h}](${g})`)}else if(c[3]){const h=c[3],g=cy(h);g?a.push(m.jsx("a",{href:g,target:"_blank",rel:"noopener noreferrer",style:{color:"#3b82f6",textDecoration:"underline"},children:h},u)):a.push(h)}c.index!==void 0&&(r=c.index+c[0].length)}),r<n.length&&a.push(n.substring(r)),a.length>0?a:[n]}var uy=({data:n,selected:a})=>m.jsx(m.Fragment,{children:n.data?m.jsxs(m.Fragment,{children:[m.jsx(Qu,{isVisible:a,keepAspectRatio:!0}),m.jsxs("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",width:"100%",height:"100%",overflow:"hidden",gap:"4px"},children:[m.jsx("img",{src:n.data,style:{maxWidth:"100%",maxHeight:n.caption?"calc(100% - 24px)":"100%",objectFit:"contain"}}),n.caption&&m.jsx("div",{style:{fontSize:"11px",color:"#6b7280",textAlign:"center",padding:"0 4px",lineHeight:"1.3"},children:Pk(n.caption)})]})]}):m.jsx("span",{children:"No Image"})}),Io={S:10,M:14,L:18,XL:24},fy="M",Wk=10,eT=14,tT=18;function dy(n){return n<=Wk?"S":n<=eT?"M":n<=tT?"L":"XL"}function hy(n){return typeof n=="number"?Io[dy(n)]:n&&n in Io?Io[n]:Io[fy]}function nT(n){return n?dy(n):fy}var py=({data:n,selected:a,isConnectable:i,...s})=>m.jsxs(m.Fragment,{children:[i&&m.jsx(Qu,{isVisible:a}),m.jsx(ZN,{className:"icon"}),m.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",width:"100%",height:"100%",textAlign:"center"},children:[m.jsx("div",{style:{fontWeight:600,fontSize:`${hy(n.fontSize)}px`},children:n.label||"Untitled"}),n.summary&&m.jsx("div",{style:{fontSize:"12px",color:"#4b5563",marginTop:"4px"},children:n.summary})]}),["Bottom","Top","Left","Right"].map(r=>m.jsx(el,{type:"source",position:be[r],style:{visibility:i?"visible":"hidden"},id:r.toLowerCase(),isConnectable:!0},`${r}-source`)),["Bottom","Top","Left","Right"].map(r=>m.jsx(el,{type:"target",position:be[r],style:{visibility:i?"visible":"hidden"},id:r.toLowerCase(),isConnectable:!0},`${r}-target`))]}),gy=({data:n})=>m.jsx(m.Fragment,{children:m.jsx("div",{style:{fontSize:n.fontSize||32,color:n.color||"#e5e7eb",fontWeight:"bold",transform:`rotate(${n.rotation||0}deg)`},children:n.text||"No Text"})}),aT=n=>m.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",fill:"none",className:n.className,stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",viewBox:"0 0 24 24",children:[m.jsx("circle",{cx:"12",cy:"12",r:"10"}),m.jsx("path",{d:"M11.051 7.616a1 1 0 0 1 1.909.024l.737 1.452a1 1 0 0 0 .737.535l1.634.256a1 1 0 0 1 .588 1.806l-1.172 1.168a1 1 0 0 0-.282.866l.259 1.613a1 1 0 0 1-1.541 1.134l-1.465-.75a1 1 0 0 0-.912 0l-1.465.75a1 1 0 0 1-1.539-1.133l.258-1.613a1 1 0 0 0-.282-.867l-1.156-1.152a1 1 0 0 1 .572-1.822l1.633-.256a1 1 0 0 0 .737-.535z"})]}),Mf=aT,my=({data:n,selected:a,isConnectable:i})=>m.jsxs(m.Fragment,{children:[i&&m.jsx(Qu,{isVisible:a}),n.state==="mastered"&&m.jsx(Mf,{className:"icon"}),m.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",width:"100%",height:"100%",textAlign:"center"},children:[m.jsx("div",{style:{fontWeight:600,fontSize:`${hy(n.fontSize)}px`},children:n.label||"Untitled"}),n.summary&&m.jsx("div",{style:{fontSize:"12px",color:"#4b5563",marginTop:"4px"},children:n.summary})]}),["Bottom","Top","Left","Right"].map(s=>m.jsx(el,{type:"source",style:{visibility:i?"visible":"hidden"},position:be[s],id:s.toLowerCase(),isConnectable:!0},`${s}-source`)),["Bottom","Top","Left","Right"].map(s=>m.jsx(el,{type:"target",style:{visibility:i?"visible":"hidden"},position:be[s],id:s.toLowerCase(),isConnectable:!0},`${s}-target`))]});function yy(n,a){const{width:i,height:s}=n.measured,r=n.internals.positionAbsolute,c=a.internals.positionAbsolute,u=i/2,h=s/2,g=r.x+u,p=r.y+h,x=c.x+a.measured.width/2,y=c.y+a.measured.height/2,v=(x-g)/(2*u)-(y-p)/(2*h),S=(x-g)/(2*u)+(y-p)/(2*h),b=1/(Math.abs(v)+Math.abs(S)),E=b*v,_=b*S,T=u*(E+_)+g,z=h*(-E+_)+p;return{x:T,y:z}}function xy(n,a){const i={...n.internals.positionAbsolute,...n},s=Math.round(i.x),r=Math.round(i.y),c=Math.round(a.x),u=Math.round(a.y);return c<=s+1?be.Left:c>=s+i.measured.width-1?be.Right:u<=r+1?be.Top:u>=i.y+i.measured.height-1?be.Bottom:be.Top}function lT(n,a){const i=yy(n,a),s=yy(a,n),r=xy(n,i),c=xy(a,s);return{sx:i.x,sy:i.y,tx:s.x,ty:s.y,sourcePos:r,targetPos:c}}var Qo={settings:{title:"New Roadmap",viewport:{x:0,y:0,zoom:1}},version:1,nodes:[],edges:[]},iT=n=>{let a={};if(typeof n!="string")a=n;else try{a=JSON.parse(n)}catch{}return{...Qo,...a,settings:{...Qo.settings,...a.settings,viewport:{...Qo.settings.viewport,...a.settings?.viewport||{}}},nodes:a.nodes||Qo.nodes,edges:a.edges||Qo.edges}},oT=()=>{const n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";return[9,11,1].map(i=>{let s="";for(let r=0;r<i;r++)s+=n.charAt(Math.floor(Math.random()*n.length));return s}).join("-")};function sT(n){return typeof n=="string"&&(n.includes("youtube.com/watch?v=")||n.includes("youtu.be/"))}function rT(n){return n.includes("youtube.com/watch?v=")?`https://www.youtube-nocookie.com/embed/${n.split("v=")[1].split("&")[0]}`:n.includes("youtu.be/")?`https://www.youtube-nocookie.com/embed/${n.split("youtu.be/")[1].split("?")[0]}`:n}function cT(n){return n.endsWith(".webm")?"video/webm":(n.endsWith(".mp4"),"video/mp4")}var uT=({url:n,title:a})=>{if(sT(n)){const i=rT(n);return m.jsx("div",{className:"video-container",style:{position:"relative",paddingBottom:"56.25%",height:0,overflow:"hidden",marginBottom:16},children:m.jsx("iframe",{src:i,title:a||"YouTube video",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})}else{const i=cT(n);return m.jsxs("video",{controls:!0,style:{width:"100%",maxHeight:"400px",marginBottom:16},children:[m.jsx("source",{src:n,type:i}),"Your browser does not support the video tag."]})}},fT={nodes:"Nodes",addTask:"Add Task",addTopic:"Add Topic",addImage:"Add Image",addText:"Add Text",settings:"Settings",debug:"Debug",enableDebugMode:"Enable Debug Mode",showCompletionNeedsEdges:"Show Completion Needs Edges",showCompletionOptionalEdges:"Show Completion Optional Edges",showUnlockAfterEdges:"Show Unlock After Edges",preview:"Preview",save:"Save",download:"Download",open:"Open",exportAsSVG:"Export as SVG",undo:"Undo",redo:"Redo",reset:"Reset",help:"Help",unsavedChanges:"Unsaved Changes (Click to save or press Ctrl+S)",keyboardShortcuts:"Keyboard Shortcuts",action:"Action",shortcut:"Shortcut",close:"Close",shortcuts:{save:"Save",undo:"Undo",redo:"Redo",addTaskNode:"Add Task Node",addTopicNode:"Add Topic Node",addImageNode:"Add Image Node",addTextNode:"Add Text Node",deleteNodeEdge:"Delete Node/Edge",togglePreviewMode:"Toggle Preview Mode",toggleDebugMode:"Toggle Debug Mode",selectMultipleNodes:"Select Multiple Nodes",selectAllNodes:"Select All Nodes",showHelp:"Show Help",zoomIn:"Zoom In",zoomOut:"Zoom Out",resetZoom:"Reset Zoom",fitView:"Fit View",zoomToSelection:"Zoom to Selection",toggleGrid:"Toggle Grid",resetMap:"Reset Map",cut:"Cut",copy:"Copy",paste:"Paste"},editTask:"Edit Task",editTopic:"Edit Topic",editImage:"Edit Image",editText:"Edit Text",backgroundSettings:"Background Settings",editEdge:"Edit Edge",nodeColor:"Node Color",label:"Label",labelRequired:"Label *",summary:"Summary",description:"Description",duration:"Duration",videoURL:"Video URL",resources:"Resources",addResource:"Add Resource",unlockPassword:"Unlock Password",unlockDate:"Unlock Date",unlockAfter:"Unlock After",completionNeeds:"Completion Needs",completionOptional:"Completion Optional",backgroundColor:"Background Color",text:"Text",fontSize:"Font Size",color:"Color",image:"Image",width:"Width",height:"Height",rotation:"Rotation",opacity:"Opacity",edgeColor:"Color",edgeWidth:"Width",edgeType:"Type",animated:"Animated",placeholderNodeLabel:"Node label",placeholderTitleLabel:"Lerningmap label",placeholderShortSummary:"Short summary",placeholderDetailedDescription:"Detailed description",placeholderVideoURL:"YouTube or video URL",placeholderLabel:"Label",placeholderURL:"URL",placeholderOptionalPassword:"Optional password",placeholderBackgroundText:"Background Text",selectNode:"Select node...",deleteNode:"Delete Node",saveChanges:"Save Changes",deleteEdge:"Delete Edge",copyNode:"Copy",openFileWarning:"Opening a file will replace your current map. Continue?",resetMapWarning:"Are you sure you want to reset the map? This action cannot be undone.",failedToLoadFile:"Failed to load the file. Please make sure it is a valid roadmap JSON file.",failedToExportSVG:"Failed to export SVG: ",loadExternalWarning:"Loading an external learningmap will replace your existing content. You can back up your current learningmap first by using one of the options below.",loadExternalBackupPrompt:"Would you like to back up your current learningmap before loading the external one?",emptyMapCannotBeShared:"An empty learningmap cannot be shared.",uploadFailed:"Upload failed. Please try again!",uploadFileTooLarge:"Sharing bigger files is not allowed. You can still download your learningmap and share it via other means.",loadFailed:"Failed to load. Please check the URL.",share:"Share",shareLink:"Share Link",copyLink:"Copy Link",linkCopied:"Link copied to clipboard!",downloadCurrentMap:"Download Current Map",replaceWithExternal:"Replace with External Map",blue:"Blue",yellow:"Yellow",lila:"Lila",pink:"Pink",teal:"Teal",red:"Red",black:"Black",white:"White",newTask:"New task",newTopic:"New topic",backgroundTextDefault:"Background Text",noText:"No Text",untitled:"Untitled",alignLeftHorizontal:"Align Left Horizontal",alignCenterHorizontal:"Align Center Horizontal",alignRightHorizontal:"Align Right Horizontal",alignTopVertical:"Align Top Vertical",alignCenterVertical:"Align Center Vertical",alignBottomVertical:"Align Bottom Vertical",distributeHorizontally:"Distribute Horizontally",distributeVertically:"Distribute Vertically",default:"Default",straight:"Straight",step:"Step",smoothstep:"Smooth Step",floating:"Floating",resourcesLabel:"Resources:",unlockConditionsMessage:"Complete the following nodes first to unlock this one:",completionNeedsMessage:"The following nodes need to be completed or mastered before this one is completed:",locked:"Locked",markAsStarted:"Mark as Started",markAsCompleted:"Mark as Completed",completedLabel:"Completed",mastered:"Mastered",completedTitle:"Completed",masteredTitle:"Mastered",finishNeedsToComplete:"Finish needs to complete",finishOptionalToMaster:"Finish optional to master",languageLabel:"Language",languageEnglish:"English",languageGerman:"German",initialViewport:"Initial Viewport",viewportX:"X Position",viewportY:"Y Position",viewportZoom:"Zoom",useCurrentViewport:"Use Current Viewport",storageId:"ID",generateRandomId:"Generate Random ID",storageIdHint:"Learning maps with the same ID will share the same state when a student is working on it.",welcomeTitle:"Learningmap",welcomeSubtitle:"All data is stored locally in your browser",welcomeOpenFile:"Open File",welcomeAddTopic:"Add Topic",welcomeHelp:"Help",fontSizeSmall:"Small",fontSizeMedium:"Medium",fontSizeLarge:"Large",fontSizeXLarge:"Extra Large",caption:"Caption",placeholderImageCaption:"Add caption (supports [markdown links](url))"},dT={nodes:"Knoten",addTask:"Aufgabe hinzufügen",addTopic:"Thema hinzufügen",addImage:"Bild hinzufügen",addText:"Text hinzufügen",settings:"Einstellungen",debug:"Debug",enableDebugMode:"Debug-Modus aktivieren",showCompletionNeedsEdges:"Abschluss-Benötigte Kanten anzeigen",showCompletionOptionalEdges:"Abschluss-Optionale Kanten anzeigen",showUnlockAfterEdges:"Entsperr-Nach Kanten anzeigen",preview:"Vorschau",save:"Speichern",download:"Herunterladen",open:"Öffnen",exportAsSVG:"Als SVG exportieren",undo:"Rückgängig",redo:"Wiederholen",reset:"Zurücksetzen",help:"Hilfe",unsavedChanges:"Ungespeicherte Änderungen (Klicken zum Speichern oder Strg+S drücken)",keyboardShortcuts:"Tastaturkürzel",action:"Aktion",shortcut:"Tastenkombination",close:"Schließen",shortcuts:{save:"Speichern",undo:"Rückgängig",redo:"Wiederholen",addTaskNode:"Aufgaben-Knoten hinzufügen",addTopicNode:"Themen-Knoten hinzufügen",addImageNode:"Bild-Knoten hinzufügen",addTextNode:"Text-Knoten hinzufügen",deleteNodeEdge:"Knoten/Kante löschen",togglePreviewMode:"Vorschau-Modus umschalten",toggleDebugMode:"Debug-Modus umschalten",selectMultipleNodes:"Mehrere Knoten auswählen",selectAllNodes:"Alle Knoten auswählen",showHelp:"Hilfe anzeigen",zoomIn:"Vergrößern",zoomOut:"Verkleinern",resetZoom:"Zoom zurücksetzen",fitView:"Alles anzeigen",zoomToSelection:"Auswahl anzeigen",toggleGrid:"Raster umschalten",resetMap:"Karte zurücksetzen",cut:"Ausschneiden",copy:"Kopieren",paste:"Einfügen"},editTask:"Aufgabe bearbeiten",editTopic:"Thema bearbeiten",editImage:"Bild bearbeiten",editText:"Text bearbeiten",backgroundSettings:"Hintergrund-Einstellungen",editEdge:"Kante bearbeiten",nodeColor:"Knotenfarbe",label:"Bezeichnung",labelRequired:"Bezeichnung *",summary:"Zusammenfassung",description:"Beschreibung",duration:"Dauer",videoURL:"Video-URL",resources:"Ressourcen",addResource:"Ressource hinzufügen",unlockPassword:"Entsperr-Passwort",unlockDate:"Entsperr-Datum",unlockAfter:"Entsperren nach",completionNeeds:"Abschluss benötigt",completionOptional:"Abschluss optional",backgroundColor:"Hintergrundfarbe",text:"Text",fontSize:"Schriftgröße",color:"Farbe",image:"Bild",width:"Breite",height:"Höhe",rotation:"Drehung",opacity:"Deckkraft",edgeColor:"Farbe",edgeWidth:"Breite",edgeType:"Typ",animated:"Animiert",placeholderNodeLabel:"Knotenbezeichnung",placeholderTitleLabel:"Lernkartenbezeichnung",placeholderShortSummary:"Kurze Zusammenfassung",placeholderDetailedDescription:"Detaillierte Beschreibung",placeholderVideoURL:"YouTube oder Video-URL",placeholderLabel:"Bezeichnung",placeholderURL:"URL",placeholderOptionalPassword:"Optionales Passwort",placeholderBackgroundText:"Hintergrundtext",selectNode:"Knoten auswählen...",deleteNode:"Knoten löschen",saveChanges:"Änderungen speichern",deleteEdge:"Kante löschen",copyNode:"Kopieren",openFileWarning:"Das Öffnen einer Datei ersetzt Ihre aktuelle Karte. Fortfahren?",resetMapWarning:"Sind Sie sicher, dass Sie die Karte zurücksetzen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",failedToLoadFile:"Datei konnte nicht geladen werden. Bitte stellen Sie sicher, dass es sich um eine gültige Roadmap-JSON-Datei handelt.",failedToExportSVG:"SVG-Export fehlgeschlagen: ",loadExternalWarning:"Das Laden einer externen Learningmap ersetzt Ihren aktuellen Inhalt. Sie können Ihre aktuelle Learningmap zuerst sichern, indem Sie eine der folgenden Optionen verwenden.",loadExternalBackupPrompt:"Möchten Sie Ihre aktuelle Learningmap sichern, bevor Sie die externe laden?",emptyMapCannotBeShared:"Eine leere Learningmap kann nicht geteilt werden.",uploadFailed:"Beim Upload ist was schief gelaufen. Bitte versuche es erneut!",uploadFileTooLarge:"Das Teilen größerer Dateien ist nicht erlaubt. Du kannst deine Learningmap weiterhin herunterladen und über andere Wege teilen.",loadFailed:"Beim Laden ist etwas schief gegangen. Bitte überprüfe die URL.",share:"Teilen",shareLink:"Link teilen",copyLink:"Link kopieren",linkCopied:"Link in die Zwischenablage kopiert!",downloadCurrentMap:"Aktuelle Karte herunterladen",replaceWithExternal:"Mit externer Karte ersetzen",blue:"Blau",yellow:"Gelb",lila:"Lila",pink:"Rosa",teal:"Türkis",red:"Rot",black:"Schwarz",white:"Weiß",newTask:"Neue Aufgabe",newTopic:"Neues Thema",backgroundTextDefault:"Hintergrundtext",noText:"Kein Text",untitled:"Ohne Titel",alignLeftHorizontal:"Horizontal links ausrichten",alignCenterHorizontal:"Horizontal zentrieren",alignRightHorizontal:"Horizontal rechts ausrichten",alignTopVertical:"Vertikal oben ausrichten",alignCenterVertical:"Vertikal zentrieren",alignBottomVertical:"Vertikal unten ausrichten",distributeHorizontally:"Horizontal verteilen",distributeVertically:"Vertikal verteilen",default:"Standard",straight:"Gerade",step:"Stufe",smoothstep:"Weiche Stufe",floating:"Schwebend",resourcesLabel:"Ressourcen:",unlockConditionsMessage:"Vervollständige zuerst die folgenden Knoten, um diesen freizuschalten:",completionNeedsMessage:"Die folgenden Knoten müssen abgeschlossen oder gemeistert werden, bevor dieser abgeschlossen ist:",locked:"Gesperrt",markAsStarted:"Als begonnen markieren",markAsCompleted:"Als abgeschlossen markieren",completedLabel:"Abgeschlossen",mastered:"Gemeistert",completedTitle:"Abgeschlossen",masteredTitle:"Gemeistert",finishNeedsToComplete:"Benötigtes abschließen",finishOptionalToMaster:"Optionale zum Meistern abschließen",languageLabel:"Sprache",languageEnglish:"Englisch",languageGerman:"Deutsch",initialViewport:"Initialer Ansichtsbereich",viewportX:"X-Position",viewportY:"Y-Position",viewportZoom:"Zoom",useCurrentViewport:"Aktuellen Ansichtsbereich verwenden",storageId:"ID",generateRandomId:"Zufällige ID generieren",storageIdHint:"Lernkarten mit der gleichen ID teilen sich den gleichen Zustand, wenn ein Schüler daran arbeitet.",welcomeTitle:"Learningmap",welcomeSubtitle:"Alle Daten werden lokal in Ihrem Browser gespeichert",welcomeOpenFile:"Datei öffnen",welcomeAddTopic:"Thema hinzufügen",welcomeHelp:"Hilfe",fontSizeSmall:"Klein",fontSizeMedium:"Mittel",fontSizeLarge:"Groß",fontSizeXLarge:"Extra Groß",caption:"Bildunterschrift",placeholderImageCaption:"Bildunterschrift hinzufügen (unterstützt [Markdown-Links](url))"},vy={en:fT,de:dT};function Vt(n="en"){return vy[n]||vy.en}function hT(n,a){const i=[];return n.data?.unlock?.after&&n.data.unlock.after.forEach(s=>{const r=a.find(c=>c.id===s);r&&r.data?.state!=="completed"&&r.data?.state!=="mastered"&&i.push(r)}),i}function pT(n,a){const i=[];return n.data?.completion?.needs&&n.data.completion.needs.forEach(s=>{const r=a.find(c=>c.id===s);r&&r.data?.state!=="completed"&&r.data?.state!=="mastered"&&i.push(r)}),i}function gT(n,a){const i=[];return n.data?.completion?.optional&&n.data.completion.optional.forEach(s=>{const r=a.find(c=>c.id===s);r&&r.data?.state!=="completed"&&r.data?.state!=="mastered"&&i.push(r)}),i}function mT({open:n,onClose:a,onUpdate:i,node:s,nodes:r,onNodeClick:c,language:u="en"}){const h=Vt(u),g=B.useMemo(()=>{if(!s||!s.data?.description)return"";const z=Fe.parse(s.data.description,{async:!1});return ok.sanitize(z)},[s,s?.data?.description]);if(!n||!s)return null;const p=s.data?.state==="locked"||!1,x=s.data?.state==="unlocked"||!1,y=s.data?.state==="completed"||!1,v=s.data?.state==="started"||!1,S=s.data?.state==="mastered"||!1,b=hT(s,r),E=pT(s,r),_=gT(s,r),T=z=>()=>{s.type==="topic"||p||i({...s,data:{...s.data,state:z}})};return m.jsxs(m.Fragment,{children:[m.jsx("div",{className:"drawer-overlay",onClick:a}),m.jsxs("aside",{className:"drawer",children:[m.jsxs("header",{className:"drawer-header",children:[m.jsxs("div",{children:[m.jsx("h2",{className:"drawer-title",children:s.data?.label}),s.data?.duration&&m.jsx("div",{style:{fontSize:16,color:"#6b7280",marginTop:4},children:s.data.duration})]}),m.jsx("button",{className:"close-button",onClick:a,"aria-label":"Close",children:m.jsx(da,{size:20})})]}),m.jsxs("div",{className:"drawer-content",children:[s.data?.description&&m.jsx("div",{className:"drawer-description",style:{marginBottom:16},dangerouslySetInnerHTML:{__html:g}}),s.data?.video&&m.jsx("div",{className:"drawer-video",style:{marginBottom:16},children:m.jsx(uT,{url:s.data?.video})}),s.data?.resources&&s.data?.resources.length>0&&m.jsxs("div",{className:"drawer-resources",style:{marginBottom:16},children:[m.jsx("div",{style:{fontWeight:600,marginBottom:8},children:h.resourcesLabel}),m.jsx("ul",{children:s.data?.resources.map((z,N)=>{if(z.type==="book"){const C=[];z.bookName&&C.push(z.bookName),z.bookLocation&&C.push(z.bookLocation);const D=C.length>0?` (${C.join(", ")})`:"";return m.jsxs("li",{children:["📚 ",m.jsx("strong",{children:z.label}),D]},N)}return m.jsxs("li",{children:["🌐 ",z.url?m.jsx("a",{href:z.url,target:"_blank",rel:"noopener noreferrer",children:z.label}):m.jsx("span",{children:z.label})]},N)})})]}),b.length>0&&m.jsxs("div",{className:"drawer-unlock-conditions",style:{marginBottom:16},children:[m.jsx("div",{style:{fontWeight:600,marginBottom:8},children:h.unlockConditionsMessage}),m.jsx("ul",{children:b.map(z=>m.jsx("li",{children:m.jsxs("button",{className:"link-button",onClick:()=>{c(null,z,!0)},children:[z.data?.label||z.id," - ",z.data?.state]})},z.id))})]}),!p&&E.length>0&&m.jsxs("div",{className:"drawer-completion-needs",style:{marginBottom:16},children:[m.jsx("div",{style:{fontWeight:600,marginBottom:8},children:h.completionNeedsMessage}),m.jsx("ul",{children:E.map(z=>m.jsx("li",{children:m.jsxs("button",{className:"link-button",onClick:()=>{c(null,z,!0)},children:[z.data?.label||z.id," - ",z.data?.state]})},z.id))})]})]}),m.jsx("div",{className:"drawer-footer",children:s.type==="topic"?m.jsxs(m.Fragment,{children:[!p&&E.length>0&&m.jsx("button",{className:"drawer-button needs",disabled:!0,children:h.finishNeedsToComplete}),!p&&E.length===0&&_.length>0&&m.jsx("button",{className:"drawer-button optional",disabled:!0,children:h.finishOptionalToMaster}),!p&&E.length===0&&_.length===0&&m.jsxs("button",{className:"drawer-button completed",disabled:!0,children:[m.jsx(Ku,{})," ",h.mastered]}),p&&m.jsxs("button",{className:"drawer-button locked",children:[m.jsx(o0,{})," ",h.locked]})]}):m.jsxs(m.Fragment,{children:[p&&m.jsxs("button",{className:"drawer-button locked",children:[m.jsx(o0,{})," ",h.locked]}),x&&m.jsx("button",{className:"drawer-button unlocked",onClick:T("started"),children:h.markAsStarted}),v&&m.jsx("button",{className:"drawer-button started",onClick:T("completed"),children:h.markAsCompleted}),y&&m.jsxs("button",{className:"drawer-button completed",disabled:!0,children:[m.jsx(Ku,{})," ",h.completedLabel]}),S&&m.jsxs("button",{className:"drawer-button mastered",disabled:!0,children:[m.jsx(Mf,{})," ",h.mastered]})]})})]})]})}var yT=({completed:n,mastered:a,total:i,language:s="en"})=>{const r=Vt(s),c=i>0?n/i*100:0;return m.jsxs(m.Fragment,{children:[m.jsxs("span",{className:"completed-counter",title:r.completedTitle,style:{display:"flex",alignItems:"center",gap:"4px"},children:[m.jsx(Ku,{}),n," / ",i]}),m.jsxs("div",{className:"progress-bar-container",children:[m.jsxs("span",{className:"progress-value",children:[c.toFixed(0),"%"]}),m.jsx("div",{className:"progress-bar-fill",style:{width:`${c}%`}})]}),m.jsxs("span",{className:"mastered-counter",title:r.masteredTitle,style:{display:"flex",alignItems:"center",gap:"4px"},children:[m.jsx(Mf,{}),a]})]})},xT=n=>{const a={};return n.forEach(i=>{i.data?.state&&(a[i.id]=i.data.state)}),a},zf=n=>n==="completed"||n==="mastered",by=n=>n.type==="task"||n.type==="topic",Df=n=>{const a=[...n];for(let i=0;i<2;i++){const s=xT(a);for(const r of a){if(r.data.state=r.data?.state||"locked",r.data?.unlock?.after&&(r.data.unlock.after.every(u=>zf(s[u]))?r.data.state==="locked"&&(r.data.state="unlocked"):r.data.state="locked"),r.data?.unlock?.date){const c=new Date(r.data.unlock.date);new Date>=c?r.data.state==="locked"&&(r.data.state="unlocked"):r.data.state="locked"}if(!r.data?.unlock?.after&&!r.data?.unlock?.date&&r.data.state==="locked"&&(r.data.state="unlocked"),r.type==="topic"){if(r.data?.completion?.needs){const c=r.data.completion.needs.every(u=>zf(s[u]));r.data.state==="unlocked"&&c&&(r.data.state="completed")}else!r.data?.completion?.needs&&r.data.state==="unlocked"&&(r.data.state="completed");if(r.data?.completion?.optional){const c=r.data.completion.optional.every(u=>zf(s[u]));r.data.state==="completed"&&c&&(r.data.state="mastered")}else!r.data?.completion?.optional&&r.data.state==="completed"&&(r.data.state="mastered")}}}return a},Wn=U0()((n,a)=>({nodes:[],edges:[],settings:{},selectedNode:null,drawerOpen:!1,onNodesChange:i=>{n({nodes:Yu(i,a().nodes)})},setNodes:i=>{n({nodes:i})},setEdges:i=>{n({edges:i})},setSettings:i=>{n({settings:i})},updateNodeState:(i,s)=>{const r=a().nodes.map(u=>u.id===i?{...u,data:{...u.data,state:s}}:u),c=Df(r);n({nodes:c})},setSelectedNode:i=>{n({selectedNode:i})},setDrawerOpen:i=>{n({drawerOpen:i})},loadRoadmapData:(i,s)=>{const r=Array.isArray(i?.nodes)?i.nodes:[],c=Array.isArray(i?.edges)?i.edges:[];let u=r.map(h=>({...h,draggable:!1,connectable:!1,selectable:by(h),focusable:by(h),data:{...h.data,state:s?.nodes?.[h.id]?.state||h.data?.state}}));u=Df(u),n({nodes:u,edges:c,settings:i?.settings||{}})},getRoadmapState:i=>{const s={nodes:{},x:i.x,y:i.y,zoom:i.zoom};return a().nodes.forEach(r=>{r.data.state&&r.type==="task"&&(s.nodes[r.id]={state:r.data.state})}),s},updateNodesStates:()=>{const i=Df(a().nodes);n({nodes:i})}})),vT={topic:my,task:py,image:uy,text:gy},bT=n=>n.type==="task"||n.type==="topic",ST=n=>{let a=0,i=0,s=0;return n.forEach(r=>{(r.type==="task"||r.type==="topic")&&(s++,r.data?.state==="completed"?a++:r.data?.state==="mastered"&&(a++,i++))}),{completed:a,mastered:i,total:s}};function Sy({roadmapData:n,onChange:a,language:i="en",initialState:s}){const r=Wn(U=>U.nodes),c=Wn(U=>U.edges),u=Wn(U=>U.settings),h=Wn(U=>U.selectedNode),g=Wn(U=>U.drawerOpen),p=Wn(U=>U.onNodesChange),x=Wn(U=>U.setSelectedNode),y=Wn(U=>U.setDrawerOpen),v=Wn(U=>U.loadRoadmapData),S=Wn(U=>U.getRoadmapState),b=Wn(U=>U.updateNodeState),{fitView:E,getViewport:_}=Wa(),T=u?.language||i,{completed:z,mastered:N,total:C}=ST(r),D=iT(n);B.useEffect(()=>{v(D,s),s||setTimeout(()=>{E({duration:0,padding:.2})},0)},[n,s,v,E]);const R=B.useCallback((U,F,ae=!1)=>{bT(F)&&(x(F),y(!0),ae&&E({nodes:[F],duration:150}))},[E,x,y]),j=B.useCallback(()=>{y(!1),x(null)},[y,x]),K=B.useCallback(U=>{U.data.state&&b(U.id,U.data.state),x(U)},[b,x]);B.useEffect(()=>{const U=_(),F=S(U);if(a)a(F);else{const ae=document.querySelector("hyperbook-learningmap");ae&&ae.dispatchEvent(new CustomEvent("change",{detail:F}))}},[r,_,S]);const J={animated:!1,style:{stroke:"#94a3b8",strokeWidth:2},type:"default"},fe={x:s?.x||u?.viewport?.x||0,y:s?.y||u?.viewport?.y||0,zoom:s?.zoom||u?.viewport?.zoom||1};return m.jsxs("div",{className:"editor-canvas",style:{backgroundColor:u?.background?.color||"#ffffff"},children:[m.jsxs(Zm,{nodes:r.map(U=>{const F=[];return U.data?.color&&F.push(U.data.color),F.push(U.data?.state),{...U,selected:h?.id===U.id,className:F.join(" ")}}),edges:c,onNodeClick:R,onNodesChange:p,minZoom:.2,nodeTypes:vT,defaultViewport:fe,proOptions:{hideAttribution:!0},defaultEdgeOptions:J,nodesDraggable:!1,nodesConnectable:!1,children:[u?.title&&m.jsx(fa,{position:"bottom-right",children:m.jsx("div",{className:"map-title",children:u.title})}),m.jsx(fa,{position:"top-center",className:"progress-panel",children:m.jsx(yT,{completed:z,total:C,mastered:N,language:T})}),m.jsx(Fm,{showInteractive:!1})]}),m.jsx(mT,{node:h,open:g,onClose:j,onUpdate:K,nodes:r,onNodeClick:R,language:T})]})}var wT=n=>m.jsx("div",{className:"hyperbook-learningmap-container",children:m.jsx(Zu,{children:m.jsx(Sy,{...n})})});function Of(n){switch(n){case"image":return 10;case"text":return 20;case"topic":case"task":return 30;default:return 30}}var jr=!0;function ET(n){jr=n}var wy={nodes:[],edges:[],settings:{background:{color:"#ffffff"}},previewMode:!1,debugMode:!1,showGrid:!1,helpOpen:!1,drawerOpen:!1,settingsDrawerOpen:!1,edgeDrawerOpen:!1,shareDialogOpen:!1,loadExternalDialogOpen:!1,selectedNodeId:null,selectedNodeIds:[],selectedEdge:null,nextNodeId:1,clipboard:null,lastMousePosition:null,shareLink:"",pendingExternalId:null,showCompletionNeeds:!0,showCompletionOptional:!0,showUnlockAfter:!0},_T={equality:(n,a)=>Fk(n,a),handleSet:n=>Jk(500,a=>{n(a)},{noLeading:!1,noTrailing:!0}),partialize:n=>{const{nodes:a,edges:i,settings:s}=n;return{nodes:a,edges:i,settings:s}}},AT={name:"learningmap-data",version:1,partialize:n=>{const{nodes:a,edges:i,settings:s}=n;return{nodes:a,edges:i,settings:s}},storage:{getItem:n=>{if(!jr)return null;const a=localStorage.getItem(n);return a?JSON.parse(a):null},setItem:(n,a)=>{jr&&localStorage.setItem(n,JSON.stringify(a))},removeItem:n=>{jr&&localStorage.removeItem(n)}}},ie=U0()(qk(Xk((n,a)=>({...wy,onNodesChange:i=>{n({nodes:Yu(i,a().nodes)})},onEdgesChange:i=>{n({edges:om(i,a().edges)})},onConnect:i=>{n({edges:xg(i,a().edges)})},setNodes:i=>{n({nodes:i})},setEdges:i=>{n({edges:i})},setSettings:i=>{n({settings:i})},updateDebugEdges:()=>{const i=a().debugMode,s=a().nodes,r=a().showCompletionNeeds,c=a().showCompletionOptional,u=a().showUnlockAfter,g=[...a().edges.filter(p=>!p.id.startsWith("debug-"))];i&&(s.forEach(p=>{r&&p.type==="topic"&&p.data?.completion?.needs&&p.data.completion.needs.forEach(x=>{const y=`debug-edge-${x}-to-${p.id}`;g.push({id:y,target:x,source:p.id,animated:!0,style:{stroke:"#f97316",strokeWidth:2,strokeDasharray:"5,5"},type:"floating"})}),c&&p.data?.completion?.optional&&p.data.completion.optional.forEach(x=>{const y=`debug-edge-optional-${x}-to-${p.id}`;g.push({id:y,target:x,source:p.id,animated:!0,style:{stroke:"#eab308",strokeWidth:2,strokeDasharray:"5,5"},type:"floating"})})}),s.forEach(p=>{u&&p.data.unlock?.after&&p.data.unlock.after.forEach(x=>{const y=`debug-edge-${x}-to-${p.id}`;g.push({id:y,target:x,source:p.id,animated:!0,style:{stroke:"#10b981",strokeWidth:2,strokeDasharray:"5,5"},type:"floating"})})})),n({edges:g})},updateNode:(i,s)=>{n({nodes:a().nodes.map(r=>r.id===i?{...r,...s}:r)})},updateNodeData:(i,s)=>{n({nodes:a().nodes.map(r=>r.id===i?{...r,data:{...r.data,...s}}:r)})},updateNodes:i=>{n({nodes:a().nodes.map(s=>{const r=i.find(c=>c.id===s.id);return r||s})})},updateEdge:(i,s)=>{n({edges:a().edges.map(c=>c.id===i?{...c,...s}:c)});const r=a().selectedEdge;r&&r.id===i&&n({selectedEdge:{...r,...s}})},deleteNode:i=>{n({nodes:a().nodes.filter(s=>s.id!==i),edges:a().edges.filter(s=>s.source!==i&&s.target!==i)})},deleteEdge:i=>{n({edges:a().edges.filter(s=>s.id!==i)})},addNode:i=>{n({nodes:[...a().nodes,i]})},setJsonStore:i=>{n({jsonStore:i})},setDefaultLanguage:i=>{n({defaultLanguage:i})},setPreviewMode:i=>n({previewMode:i}),setDebugMode:i=>{n({debugMode:i}),a().updateDebugEdges()},setShowGrid:i=>n({showGrid:i}),setHelpOpen:i=>n({helpOpen:i}),setDrawerOpen:i=>n({drawerOpen:i}),setSettingsDrawerOpen:i=>n({settingsDrawerOpen:i}),setEdgeDrawerOpen:i=>n({edgeDrawerOpen:i}),setShareDialogOpen:i=>n({shareDialogOpen:i}),setLoadExternalDialogOpen:i=>n({loadExternalDialogOpen:i}),setSelectedNodeId:i=>n({selectedNodeId:i}),setSelectedNodeIds:i=>n({selectedNodeIds:i}),setSelectedEdge:i=>n({selectedEdge:i}),setNextNodeId:i=>n({nextNodeId:i}),setClipboard:i=>n({clipboard:i}),setLastMousePosition:i=>n({lastMousePosition:i}),setShareLink:i=>n({shareLink:i}),setPendingExternalId:i=>n({pendingExternalId:i}),setShowCompletionNeeds:i=>{n({showCompletionNeeds:i}),a().updateDebugEdges()},setShowCompletionOptional:i=>{n({showCompletionOptional:i}),a().updateDebugEdges()},setShowUnlockAfter:i=>{n({showUnlockAfter:i}),a().updateDebugEdges()},loadRoadmapData:i=>{const s=Array.isArray(i?.nodes)?i.nodes:[],r=Array.isArray(i?.edges)?i.edges:[],c=s.map(h=>({...h,draggable:!0,className:h.data.color?h.data.color:h.className,zIndex:h.zIndex!==void 0?h.zIndex:Of(h.type),data:{...h.data}}));let u=1;s.length>0&&(u=Math.max(...s.map(g=>parseInt(g.id.replace(/\D/g,""),10)).filter(g=>!isNaN(g)))+1),n({nodes:c,edges:r,settings:i?.settings||{background:{color:"#ffffff"}},nextNodeId:u})},getRoadmapData:()=>{const i=a();return{nodes:i.nodes.map(s=>({id:s.id,type:s.type,position:s.position,width:s.width,height:s.height,zIndex:s.zIndex!==void 0?s.zIndex:Of(s.type),data:s.data})),edges:i.edges.filter(s=>!s.id.startsWith("debug-")).map(s=>({id:s.id,source:s.source,target:s.target,sourceHandle:s.sourceHandle,targetHandle:s.targetHandle,animated:s.animated,type:s.type,style:s.style})),settings:i.settings,version:1,type:"learningmap",source:"https://learningmap.app"}},closeAllDrawers:()=>{n({drawerOpen:!1,selectedNodeId:null,edgeDrawerOpen:!1,selectedEdge:null,settingsDrawerOpen:!1})},reset:()=>{n(wy)}}),_T),AT));function Ey(n,a){return Ik(ie.temporal,n,a)}var _y=()=>{const n=ie(v=>v.jsonStore),a=ie(v=>v.getRoadmapData),i=ie(v=>v.settings.language),s=ie(v=>v.defaultLanguage),r=Vt(i||s),c=ie(v=>v.setShareLink),u=ie(v=>v.setShareDialogOpen),h=ie(v=>v.setLoadExternalDialogOpen),g=ie(v=>v.setPendingExternalId),p=ie(v=>v.loadRoadmapData),x=B.useCallback(()=>{const v=a();if(!v.nodes||v.nodes.length===0){alert(r.emptyMapCannotBeShared);return}fetch(`${n}/api/v2/post`,{method:"POST",mode:"cors",headers:{"Content-Type":"application/json"},body:JSON.stringify(v)}).then(S=>{if(S.status===413)throw alert(r.uploadFileTooLarge),new Error("Payload too large");if(!S.ok)throw new Error(`HTTP error! status: ${S.status}`);return S.json()}).then(S=>{const b=window.location.origin+"#json="+S.id;c(b),u(!0)}).catch(S=>{S.message!=="Payload too large"&&alert(r.uploadFailed)})},[a,n,r,c,u]);return[B.useCallback(v=>{fetch(`${n}/api/v2/${v}`,{method:"GET",mode:"cors"}).then(S=>S.text()).then(S=>{const b=JSON.parse(S);p(b),h(!1)}).catch(()=>{alert(r.loadFailed),h(!1),g(null),window.location.hash=""})},[n,r,p]),x]},Rf=()=>{const n=ie(u=>u.getRoadmapData),a=ie(u=>u.loadRoadmapData),i=ie(u=>u.settings),s=B.useCallback(()=>{if(i?.title&&i.title.trim())return`${i.title.trim().replace(/[<>:"/\\|?*\x00-\x1F]/g,"-").replace(/\s+/g,"-")}.learningmap`;const u=new Date,h=u.getFullYear(),g=String(u.getMonth()+1).padStart(2,"0"),p=String(u.getDate()).padStart(2,"0"),x=String(u.getHours()).padStart(2,"0"),y=String(u.getMinutes()).padStart(2,"0"),v=String(u.getSeconds()).padStart(2,"0");return`${h}-${g}-${p}-${x}${y}${v}.learningmap`},[i?.title]),r=B.useCallback(()=>{const u=n(),h="data:text/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(u,null,2)),g=document.createElement("a");g.setAttribute("href",h),g.setAttribute("download",s()),document.body.appendChild(g),g.click(),g.remove()},[n,s]),c=B.useCallback(()=>{const u=document.createElement("input");u.type="file",u.accept=".learningmap,.json,application/json",u.onchange=h=>{const g=h.target.files[0];if(g){const p=new FileReader;p.onload=x=>{try{const y=JSON.parse(x.target.result);a(y)}catch(y){console.error("Failed to parse file",y)}},p.readAsText(g)}},u.click()},[a]);return{downloadRoadmap:r,openRoadmap:c,getFilename:s}},NT=({defaultLanguage:n="en",disableSharing:a=!1,disableFileOperations:i=!1})=>{const{screenToFlowPosition:s}=Wa(),r=ie(Y=>Y.settings),c=ie(Y=>Y.debugMode),u=ie(Y=>Y.previewMode),h=ie(Y=>Y.showCompletionNeeds),g=ie(Y=>Y.showCompletionOptional),p=ie(Y=>Y.showUnlockAfter),x=ie(Y=>Y.setDebugMode),y=ie(Y=>Y.setPreviewMode),v=ie(Y=>Y.setShowCompletionNeeds),S=ie(Y=>Y.setShowCompletionOptional),b=ie(Y=>Y.setShowUnlockAfter),E=ie(Y=>Y.addNode),_=ie(Y=>Y.setSettingsDrawerOpen),T=ie(Y=>Y.setDrawerOpen),z=ie(Y=>Y.setEdgeDrawerOpen),N=ie(Y=>Y.setSelectedNodeId),C=ie(Y=>Y.setSelectedEdge),D=ie(Y=>Y.reset),[R,j]=_y(),{downloadRoadmap:K,openRoadmap:J}=Rf(),fe=r?.language||n,U=Vt(fe),F=()=>x(!c),ae=()=>y(!u),H=Y=>v(Y),I=Y=>S(Y),k=Y=>b(Y),L=Y=>{const A=s({x:window.innerWidth/2,y:window.innerHeight/2}),O={id:`node-${Date.now()}`,type:Y,position:A,zIndex:Of(Y),data:{label:Y==="task"?U.newTask:Y==="topic"?U.newTopic:Y,state:"unlocked"}};E(O)},$=()=>{_(!0),T(!1),z(!1),N(null),C(null)},Z=()=>{confirm(U.resetMapWarning)&&D()};return m.jsxs("div",{className:"editor-toolbar",children:[m.jsxs("div",{className:"toolbar-group",children:[m.jsxs(ay,{menuButton:m.jsxs(Q0,{disabled:u,className:"toolbar-button",children:[m.jsx(yi,{size:16})," ",m.jsx("span",{className:"toolbar-label",children:U.nodes})]}),children:[m.jsxs(Kt,{onClick:()=>L("task"),children:[m.jsx("span",{children:U.addTask}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+1"})]}),m.jsxs(Kt,{onClick:()=>L("topic"),children:[m.jsx("span",{children:U.addTopic}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+2"})]}),m.jsxs(Kt,{onClick:()=>L("image"),children:[m.jsx("span",{children:U.addImage}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+3"})]}),m.jsxs(Kt,{onClick:()=>L("text"),children:[m.jsx("span",{children:U.addText}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+4"})]})]}),m.jsxs("button",{disabled:u,onClick:$,className:"toolbar-button",children:[m.jsx(WN,{size:16})," ",m.jsx("span",{className:"toolbar-label",children:U.settings})]})]}),m.jsx("div",{className:"toolbar-group",children:m.jsxs(ay,{menuButton:m.jsx(Q0,{className:"toolbar-button",children:m.jsx(KN,{})}),children:[!i&&m.jsxs(Kt,{onClick:J,children:[m.jsx(a0,{size:16})," ",m.jsx("span",{children:U.open})]}),!i&&m.jsxs(Kt,{onClick:K,children:[m.jsx(n0,{size:16})," ",m.jsx("span",{children:U.download})]}),!a&&m.jsxs(Kt,{onClick:j,children:[m.jsx(e3,{size:16})," ",m.jsx("span",{children:U.share})]}),m.jsx(kf,{}),m.jsxs(Kt,{onClick:Z,children:[m.jsx(PN,{size:16})," ",m.jsx("span",{children:U.reset}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+Del"})]}),m.jsx(kf,{}),m.jsxs(Vk,{className:`${c?"active":""}`,label:m.jsxs(m.Fragment,{children:[m.jsx(GN,{size:16})," ",m.jsx("span",{children:U.debug})]}),children:[m.jsxs(Kt,{type:"checkbox",checked:c,onClick:F,children:[m.jsx("span",{children:U.enableDebugMode}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+D"})]}),m.jsx(Kt,{type:"checkbox",checked:h,onClick:Y=>H(Y.checked??!1),disabled:!c,children:U.showCompletionNeedsEdges}),m.jsx(Kt,{type:"checkbox",checked:g,onClick:Y=>I(Y.checked??!1),disabled:!c,children:U.showCompletionOptionalEdges}),m.jsx(Kt,{type:"checkbox",checked:p,onClick:Y=>k(Y.checked??!1),disabled:!c,children:U.showUnlockAfterEdges})]}),m.jsxs(Kt,{onClick:ae,className:`${u?"active":""}`,children:[m.jsx(QN,{size:16})," ",m.jsx("span",{children:U.preview}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+P"})]}),m.jsx(kf,{}),m.jsxs(Kt,{href:"https://openpatch.org",target:"_blank",rel:"noopener noreferrer",children:[m.jsx(Fu,{size:16})," ",m.jsx("span",{children:"OpenPatch"})]}),m.jsxs(Kt,{href:"https://github.com/openpatch/learningmap",target:"_blank",rel:"noopener noreferrer",children:[m.jsx(Fu,{size:16})," ",m.jsx("span",{children:"GitHub"})]}),m.jsxs(Kt,{href:"https://fosstodon.org/@openpatch",target:"_blank",rel:"noopener noreferrer",children:[m.jsx(Fu,{size:16})," ",m.jsx("span",{children:"Mastodon"})]})]})})]})},kT='data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg%0A version="1.0"%0A width="50"%0A height="50"%0A viewBox="0 0 37.500001 37.500001"%0A preserveAspectRatio="xMidYMid"%0A id="svg54"%0A sodipodi:docname="learningmap-plain-mixed.svg"%0A inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"%0A inkscape:export-filename="/home/mike/Downloads/learningmap.png"%0A inkscape:export-xdpi="491.51999"%0A inkscape:export-ydpi="491.51999"%0A xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"%0A xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"%0A xmlns="http://www.w3.org/2000/svg"%0A xmlns:svg="http://www.w3.org/2000/svg">%0A <defs%0A id="defs58" />%0A <sodipodi:namedview%0A id="namedview56"%0A pagecolor="%23ffffff"%0A bordercolor="%23666666"%0A borderopacity="1.0"%0A inkscape:pageshadow="2"%0A inkscape:pageopacity="0.0"%0A inkscape:pagecheckerboard="true"%0A inkscape:document-units="pt"%0A showgrid="false"%0A inkscape:zoom="7.7603997"%0A inkscape:cx="26.931603"%0A inkscape:cy="30.604094"%0A inkscape:window-width="1245"%0A inkscape:window-height="1150"%0A inkscape:window-x="0"%0A inkscape:window-y="0"%0A inkscape:window-maximized="1"%0A inkscape:current-layer="g52"%0A inkscape:showpageshadow="2"%0A inkscape:deskcolor="%23d1d1d1"%0A showguides="false" />%0A <g%0A transform="matrix(0.0013712,0,0,-0.0013712,-38.39034,81.01027)"%0A fill="%23000000"%0A stroke="none"%0A id="g52"%0A style="fill:none;stroke:%23ffffff">%0A <g%0A id="g16"%0A transform="translate(63.576458,-228.27348)"%0A style="stroke:%23004c45;stroke-opacity:1;stroke-width:729.28821288;stroke-dasharray:none;fill:none;stroke-linecap:round">%0A <path%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:0.219075;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"%0A d="M 7.8503375,12.263719 C 5.987097,12.170355 4.4345451,14.117912 4.897315,15.915685 5.1668841,17.442336 6.7312924,18.536741 8.2606756,18.268177 10.187887,18.09635 11.40714,15.817375 10.649965,14.076224 10.233925,12.9249 9.0517431,12.226794 7.8503375,12.263719 Z"%0A id="path3"%0A transform="matrix(546.96616,0,0,-546.96616,27934.046,59308.109)" />%0A <path%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:0.219075;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"%0A d="m 25.056299,3.0627741 c -1.974898,-0.015164 -3.467995,2.2292736 -2.727957,4.0486125 0.450169,1.2654015 1.767925,2.1859291 3.129391,1.9534515 1.34906,0.022204 2.496898,-1.1939386 2.731298,-2.4592071 0.255249,-1.5561519 -0.773325,-3.2597319 -2.388219,-3.4912972 -0.245289,-0.044603 -0.495438,-0.061389 -0.744513,-0.05156 z"%0A id="path4"%0A transform="matrix(546.96616,0,0,-546.96616,27934.046,59308.109)" />%0A <path%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:0.219075;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"%0A d="m 42.066077,12.257728 c -2.070515,-0.09267 -3.611178,2.384816 -2.692657,4.220835 0.746299,1.945097 3.64545,2.452556 5.004713,0.868813 1.314217,-1.327061 0.967161,-3.771925 -0.658081,-4.691504 -0.493432,-0.300762 -1.083284,-0.401997 -1.653975,-0.398144 z"%0A id="path5"%0A transform="matrix(546.96616,0,0,-546.96616,27934.046,59308.109)" />%0A <path%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:0.219075;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"%0A d="m 42.123627,32.194856 c -1.934022,-0.06402 -3.513785,2.071529 -2.876004,3.893933 0.398196,1.298064 1.673135,2.284371 3.058281,2.14069 1.963712,0.01584 3.419813,-2.200138 2.727101,-4.010531 -0.396895,-1.232189 -1.619636,-2.071043 -2.909378,-2.024092 z"%0A id="path6"%0A transform="matrix(546.96616,0,0,-546.96616,27934.046,59308.109)" />%0A <path%0A d="m 43605.56,35704.39 5863.142,3474.937 c -149.103,262.479 -227.509,559.171 -227.546,861.044 0.116,452.903 176.187,888.384 491.415,1213.581 315.226,325.197 744.877,514.593 1197.556,528.805 v 7431.048 c -452.865,14.218 -882.3,204.448 -1197.556,529.874 -315.257,325.426 -491.578,760.493 -491.415,1213.581 0.05,246.783 52.483,490.746 153.834,715.757 v 1.068 l -6117.048,3531.777 c -291.575,-601.244 -901.107,-982.981 -1569.322,-982.829 -704.464,0.132 -1339.645,424.149 -1609.918,1074.703 l -6278.36,-3624.719 c 101.718,-224.93 154.517,-468.896 154.903,-715.757 0.163,-453.088 -176.158,-888.155 -491.415,-1213.581 -315.257,-325.427 -744.691,-515.657 -1197.557,-529.874 v -8013.267 c 452.865,-14.218 882.3,-204.448 1197.557,-529.874 315.257,-325.427 491.577,-760.493 491.415,-1213.581 -0.01,-129.026 -14.343,-257.653 -42.732,-383.517 v -1.069 l 5755.41,-3213.941"%0A style="fill:none;stroke:%23017460;stroke-width:729.288;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill"%0A id="path18"%0A sodipodi:nodetypes="cccsccsccccccccsccscccc" />%0A <g%0A id="g12"%0A transform="translate(20.985367)"%0A style="fill:none;fill-opacity:1;stroke:%23004c45;stroke-opacity:1;stroke-width:729.28821288;stroke-dasharray:none;stroke-linecap:round" />%0A <g%0A id="g12-4"%0A transform="matrix(1.0000018,0,0,1.0000018,2848.628,2322.2166)"%0A style="fill:none;fill-opacity:1;stroke:%23004c45;stroke-opacity:1;stroke-width:729.28690016;stroke-dasharray:none;stroke-linecap:round" />%0A <path%0A d="m 43595.73,35689.66 c 62.193,-490.969 -53.597,-909.978 -156.775,-1126.242 -193.529,-405.641 -309.849,-610.393 -672.936,-875.187 -363.091,-264.797 -805.968,-397.066 -1254.802,-374.784 -448.829,22.282 -876.497,197.766 -1211.694,497.155 -335.196,299.389 -557.677,704.601 -630.309,1148.074 -72.633,443.478 8.975,898.424 231.245,1288.998 222.268,390.571 571.757,693.153 990.166,857.263"%0A id="path1-2-0"%0A style="fill:none;stroke:%23017460;stroke-width:729.288;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"%0A sodipodi:nodetypes="cssssssc" />%0A <path%0A d="m 40849.11,35368.518 683.354,-477.479 1591.603,2277.848"%0A id="path2-2"%0A style="stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;fill:none;stroke-linecap:round;fill-opacity:0" />%0A <circle%0A cx="50984.348"%0A cy="-50953.406"%0A r="1743.692"%0A id="circle1-9-0-6"%0A transform="scale(1,-1)"%0A style="fill:none;fill-opacity:1;stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:round" />%0A <circle%0A cx="50988.066"%0A cy="-40043.738"%0A r="1743.692"%0A id="circle1-9-0-6-0"%0A transform="scale(1,-1)"%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:round" />%0A <circle%0A cx="41713.258"%0A cy="-55971.996"%0A r="1743.692"%0A id="circle1-9-0-6-1"%0A transform="scale(1,-1)"%0A style="fill:none;fill-opacity:1;stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:round" />%0A <circle%0A cx="32237.596"%0A cy="-50954.227"%0A r="1743.6952"%0A id="circle1-9-0-6-1-5"%0A transform="scale(1,-1)"%0A style="fill:none;fill-opacity:1;stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:round" />%0A <g%0A id="g6">%0A <path%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:0.219075;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"%0A d="m 7.7589848,33.262848 c -1.9285094,-0.03754 -3.4162729,2.069333 -2.828509,3.882808 0.4477732,1.743016 2.5850355,2.717411 4.190883,1.898509 1.0920472,-0.463941 1.8542062,-1.605018 1.7136832,-2.809147 0.117257,-1.625749 -1.4957684,-3.052661 -3.0760572,-2.97217 z"%0A id="path2"%0A transform="matrix(546.96616,0,0,-546.96616,27934.046,59308.109)" />%0A <circle%0A cx="32230.184"%0A cy="-39458.945"%0A r="1743.6984"%0A id="circle1-9-0-6-1-5-7"%0A transform="scale(1,-1)"%0A style="fill:none;fill-opacity:1;stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:round" />%0A </g>%0A </g>%0A <g%0A id="g15"%0A transform="matrix(1.1225034,0,0,1.1225034,-5720.3933,-6172.9528)"%0A style="fill:none;stroke:%23017460;stroke-width:974.54700097;stroke-dasharray:none;stroke-opacity:1">%0A <path%0A d="m 45485.685,47422.605 a 4375.7293,4375.7293 0 0 1 -8735.049,-380.688 c 0,-2565.272 2673.023,-5230.091 3840.796,-6272.608"%0A id="path1-4"%0A style="fill:none;stroke:%23017460;stroke-width:974.54700097;stroke-dasharray:none;stroke-opacity:1" />%0A <path%0A d="m 47349.746,43417.719 a 1161.8375,1161.8375 0 0 1 -1643.086,1643.086 l -2193.335,-2194.428 a 1093.9323,1093.9323 0 0 1 -276.764,-467.109 l -457.811,-1569.793 a 273.48308,273.48308 0 0 1 339.119,-339.119 l 1569.793,457.811 a 1093.9323,1093.9323 0 0 1 467.109,276.764 z"%0A id="path2-7"%0A style="fill:%23a9f7a1;fill-opacity:1;stroke:%23017460;stroke-width:974.54700097;stroke-dasharray:none;stroke-opacity:1" />%0A <circle%0A cx="41126.367"%0A cy="-47041.914"%0A r="1640.8984"%0A id="circle2"%0A transform="scale(1,-1)"%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:974.54700097;stroke-dasharray:none;stroke-opacity:1" />%0A </g>%0A </g>%0A</svg>%0A',TT=({defaultLanguage:n="en"})=>{const a=ie(p=>p.settings),i=ie(p=>p.addNode),s=ie(p=>p.setHelpOpen),{openRoadmap:r}=Rf(),c=a?.language||n,u=Vt(c),h=()=>{const p={x:window.innerWidth/2,y:window.innerHeight/2},x={id:`node-${Date.now()}`,type:"topic",position:p,data:{label:u.newTopic,state:"unlocked"}};i(x)},g=()=>s(!0);return m.jsx("div",{className:"welcome-message",children:m.jsxs("div",{className:"welcome-content",children:[m.jsxs("h1",{className:"welcome-title",children:[m.jsx("img",{src:kT,alt:"Logo",className:"welcome-logo"}),u.welcomeTitle]}),m.jsx("p",{className:"welcome-subtitle",children:u.welcomeSubtitle}),m.jsxs("div",{className:"welcome-actions",children:[m.jsxs("button",{onClick:r,className:"primary-button",children:[m.jsx(a0,{size:18}),u.welcomeOpenFile]}),m.jsxs("button",{onClick:h,className:"primary-button",children:[m.jsx(yi,{size:18}),u.welcomeAddTopic]}),m.jsxs("button",{onClick:g,className:"secondary-button",children:[m.jsx(l0,{size:18}),u.welcomeHelp]})]})]})})},CT=({id:n,source:a,target:i,markerEnd:s,style:r})=>{const c=Im(a),u=Im(i);if(!c||!u)return null;const{sx:h,sy:g,tx:p,ty:x,sourcePos:y,targetPos:v}=lT(c,u),[S]=Nu({sourceX:h,sourceY:g,sourcePosition:y,targetPosition:v,targetX:p,targetY:x});return m.jsx("path",{id:n,className:"react-flow__edge-path",d:S,markerEnd:s,style:r})},MT=CT,zT=()=>{const n=ie(b=>b.selectedNodeIds),a=ie(b=>b.nodes),i=ie(b=>b.updateNodes),s=a.filter(b=>n.includes(b.id));if(s.length<2)return null;const r=()=>{if(s.length<2)return;const b=Math.min(...s.map(_=>_.position.x)),E=s.map(_=>({..._,position:{..._.position,x:b}}));i(E)},c=()=>{if(s.length<2)return;const b=s.reduce((_,T)=>_+T.position.x+(T.width||T.measured.width)/2,0)/s.length,E=s.map(_=>({..._,position:{..._.position,x:b-(_.width||_.measured.width)/2}}));i(E)},u=()=>{if(s.length<2)return;const b=Math.max(...s.map(_=>_.position.x+(_.width||0))),E=s.map(_=>({..._,position:{..._.position,x:b-(_.width||_.measured.width)}}));i(E)},h=()=>{if(s.length<2)return;const b=Math.min(...s.map(_=>_.position.y)),E=s.map(_=>({..._,position:{..._.position,y:b}}));i(E)},g=()=>{if(s.length<2)return;const b=s.reduce((_,T)=>_+T.position.y+(T.height||T.measured.height)/2,0)/s.length,E=s.map(_=>({..._,position:{..._.position,y:b-(_.height||_.measured.height)/2}}));i(E)},p=()=>{if(s.length<2)return;const b=Math.max(...s.map(_=>_.position.y+(_.height||0))),E=s.map(_=>({..._,position:{..._.position,y:b-(_.height||_.measured.height)}}));i(E)},x=()=>{if(s.length<3)return;const b=[...s].sort((R,j)=>R.position.y-j.position.y),E=b[0].position.y,_=b.reduce((R,j)=>R+(j.height||j.measured.height),0),z=b[b.length-1].position.y-E+(b[b.length-1].height||b[b.length-1].measured.height)-_,N=b.length>1?z/(b.length-1):0;let C=E;const D=b.map((R,j)=>{const K={...R,position:{...R.position,y:C}};return C+=(R.height||R.measured.height)+N,K});i(D)},y=()=>{if(s.length<3)return;const b=[...s].sort((R,j)=>R.position.x-j.position.x),E=b[0].position.x,_=b.reduce((R,j)=>R+(j.width||j.measured.width),0),z=b[b.length-1].position.x-E+(b[b.length-1].width||b[b.length-1].measured.width)-_,N=b.length>1?z/(b.length-1):0;let C=E;const D=b.map((R,j)=>{const K={...R,position:{...R.position,x:C}};return C+=(R.width||R.measured.width)+N,K});i(D)},v=()=>{if(s.length<2)return;const b=Math.max(...s.map(_=>_.width||_.measured.width)),E=s.map(_=>({..._,width:b}));i(E)},S=()=>{if(s.length<2)return;const b=Math.max(...s.map(_=>_.height||_.measured.height)),E=s.map(_=>({..._,height:b}));i(E)};return m.jsxs(fa,{position:"bottom-center",className:"multi-node-panel",children:[m.jsx("button",{title:"Align Left Horizontal",onClick:h,children:m.jsx(YN,{})}),m.jsx("button",{title:"Align Center Horizontal",onClick:g,children:m.jsx(HN,{})}),m.jsx("button",{title:"Align Right Horizontal",onClick:p,children:m.jsx(UN,{})}),m.jsx("button",{title:"Align Top Vertical",onClick:r,children:m.jsx(qN,{})}),m.jsx("button",{title:"Align Center Vertical",onClick:c,children:m.jsx(BN,{})}),m.jsx("button",{title:"Align Bottom Vertical",onClick:u,children:m.jsx($N,{})}),s.length>2&&m.jsx("button",{title:"Distribute Vertical",onClick:x,children:m.jsx(XN,{})}),s.length>2&&m.jsx("button",{title:"Distribute Horizontal",onClick:y,children:m.jsx(VN,{})}),m.jsx("button",{title:"Same Width",onClick:v,children:m.jsx(s0,{})}),m.jsx("button",{title:"Same Height",onClick:S,children:m.jsx(s0,{style:{transform:"rotate(90deg)"}})})]})};function Ay({localNode:n,handleFieldChange:a,handleResourceChange:i,addResource:s,removeResource:r,handleUnlockAfterChange:c,addUnlockAfter:u,removeUnlockAfter:h,renderNodeSelect:g,handleCompletionNeedsChange:p,addCompletionNeed:x,removeCompletionNeed:y,handleCompletionOptionalChange:v,addCompletionOptional:S,removeCompletionOptional:b,language:E="en"}){const _=Vt(E),T=[{value:"blue",label:_.blue,className:"react-flow__node-topic blue"},{value:"yellow",label:_.yellow,className:"react-flow__node-topic yellow"},{value:"lila",label:_.lila,className:"react-flow__node-topic lila"},{value:"pink",label:_.pink,className:"react-flow__node-topic pink"},{value:"teal",label:_.teal,className:"react-flow__node-topic teal"},{value:"red",label:_.red,className:"react-flow__node-topic red"},{value:"black",label:_.black,className:"react-flow__node-topic black"},{value:"white",label:_.white,className:"react-flow__node-topic white"}];let z="blue";n.type==="topic"&&(z="yellow");const N=n.data?.color||z;return m.jsxs("div",{className:"panel-content",children:[m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.nodeColor}),m.jsx("div",{style:{display:"flex",gap:12,marginTop:8},children:T.map(C=>m.jsx("button",{type:"button","aria-label":C.label,onClick:()=>a("color",C.value),className:C.className,style:{width:28,height:28,borderRadius:6,cursor:"pointer",fontWeight:"bold",boxSizing:"border-box",display:"inline-block",padding:0},children:N===C.value?"X":""},C.value))})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.labelRequired}),m.jsx("input",{type:"text",value:n.data?.label||"",onChange:C=>a("label",C.target.value),placeholder:_.placeholderNodeLabel})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.fontSize}),m.jsx("div",{style:{display:"flex",gap:8,marginTop:8},children:["S","M","L","XL"].map(C=>{const D=nT(n.data.fontSize)===C;return m.jsx("button",{type:"button",onClick:()=>a("fontSize",Io[C]),style:{width:40,height:40,borderRadius:6,border:D?"2px solid #3b82f6":"1px solid #d1d5db",backgroundColor:D?"#eff6ff":"#ffffff",color:D?"#3b82f6":"#374151",cursor:"pointer",fontWeight:D?"bold":"normal",fontSize:"14px"},children:C},C)})})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.summary}),m.jsx("input",{type:"text",value:n.data.summary||"",onChange:C=>a("summary",C.target.value),placeholder:_.placeholderShortSummary})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.description}),m.jsx("textarea",{value:n.data.description||"",onChange:C=>a("description",C.target.value),placeholder:_.placeholderDetailedDescription,rows:4})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.duration}),m.jsx("input",{type:"text",value:n.data.duration||"",onChange:C=>a("duration",C.target.value),placeholder:"e.g., 30 min"})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.videoURL}),m.jsx("input",{type:"text",value:n.data.video||"",onChange:C=>a("video",C.target.value),placeholder:_.placeholderVideoURL})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.resources}),(n.data.resources||[]).map((C,D)=>{const R=C.type==="book";return m.jsxs("div",{style:{marginBottom:"16px",padding:"12px",border:"1px solid #e5e7eb",borderRadius:"6px"},children:[m.jsxs("div",{style:{display:"flex",gap:"8px",marginBottom:"8px"},children:[m.jsxs("select",{value:C.type||"url",onChange:j=>i(D,"type",j.target.value),style:{flex:.5},children:[m.jsx("option",{value:"url",children:"URL"}),m.jsx("option",{value:"book",children:"Book"})]}),m.jsx("input",{type:"text",value:C.label||"",onChange:j=>i(D,"label",j.target.value),placeholder:_.placeholderLabel,style:{flex:1}}),m.jsx("button",{onClick:()=>r(D),className:"icon-button",children:m.jsx(xi,{size:16})})]}),R?m.jsxs(m.Fragment,{children:[m.jsx("input",{type:"text",value:C.bookName||"",onChange:j=>i(D,"bookName",j.target.value),placeholder:"Book name (e.g., Lambacher Schweitzer GK)",style:{width:"100%",marginBottom:"8px"}}),m.jsx("input",{type:"text",value:C.bookLocation||"",onChange:j=>i(D,"bookLocation",j.target.value),placeholder:"Location (e.g., S. 223 Nr. 5)",style:{width:"100%"}})]}):m.jsx("input",{type:"text",value:C.url||"",onChange:j=>i(D,"url",j.target.value),placeholder:_.placeholderURL,style:{width:"100%"}})]},D)}),m.jsxs("button",{onClick:s,className:"secondary-button",children:[m.jsx(yi,{size:16})," ",_.addResource]})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.unlockPassword}),m.jsx("input",{type:"text",value:n.data.unlock?.password||"",onChange:C=>a("unlock",{...n.data.unlock||{},password:C.target.value}),placeholder:_.placeholderOptionalPassword})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.unlockDate}),m.jsx("input",{type:"date",value:n.data.unlock?.date||"",onChange:C=>a("unlock",{...n.data.unlock||{},date:C.target.value})})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.unlockAfter}),(n.data.unlock?.after||[]).map((C,D)=>m.jsxs("div",{style:{display:"flex",gap:"8px",marginBottom:"8px"},children:[g(C,R=>c(D,R)),m.jsx("button",{onClick:()=>h(D),className:"icon-button",children:m.jsx(xi,{size:16})})]},D)),m.jsxs("button",{onClick:u,className:"secondary-button",children:[m.jsx(yi,{size:16})," ",_.unlockAfter]})]}),n.type==="topic"&&m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.completionNeeds}),(n.data.completion?.needs||[]).map((C,D)=>m.jsxs("div",{style:{display:"flex",gap:"8px",marginBottom:"8px"},children:[g(C,R=>p(D,R)),m.jsx("button",{onClick:()=>y(D),className:"icon-button",children:m.jsx(xi,{size:16})})]},D)),m.jsxs("button",{onClick:x,className:"secondary-button",children:[m.jsx(yi,{size:16})," ",_.completionNeeds]})]}),n.type==="topic"&&m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.completionOptional}),(n.data.completion?.optional||[]).map((C,D)=>m.jsxs("div",{style:{display:"flex",gap:"8px",marginBottom:"8px"},children:[g(C,R=>v(D,R)),m.jsx("button",{onClick:()=>b(D),className:"icon-button",children:m.jsx(xi,{size:16})})]},D)),m.jsxs("button",{onClick:S,className:"secondary-button",children:[m.jsx(yi,{size:16})," ",_.completionOptional]})]})]})}function DT(n){return m.jsx(Ay,{...n})}async function OT(n,a=1920,i=1920,s=.85){return new Promise((r,c)=>{const u=new FileReader;u.onload=h=>{const g=new Image;g.onload=()=>{const p=document.createElement("canvas");let x=g.width,y=g.height;if(x>a||y>i){const b=x/y;x>y?(x=a,y=a/b):(y=i,x=i*b)}p.width=x,p.height=y;const v=p.getContext("2d");if(!v){c(new Error("Failed to get canvas context"));return}v.drawImage(g,0,0,x,y);const S=p.toDataURL("image/jpeg",s);r(S)},g.onerror=()=>{c(new Error("Failed to load image"))},g.src=h.target?.result},u.onerror=()=>{c(new Error("Failed to read file"))},u.readAsDataURL(n)})}function RT({localNode:n,handleFieldChange:a,language:i="en"}){const s=Vt(i),r=async c=>{const u=c.target.files?.[0];if(u)try{if(u.type==="image/svg+xml"){const h=new FileReader;h.onload=()=>{typeof h.result=="string"&&a("data",h.result)},h.readAsDataURL(u)}else{const h=await OT(u);a("data",h)}}catch(h){console.error("Failed to process image:",h);const g=new FileReader;g.onload=()=>{typeof g.result=="string"&&a("data",g.result)},g.readAsDataURL(u)}};return m.jsxs("div",{className:"panel-content",children:[m.jsxs("div",{className:"form-group",children:[m.jsxs("label",{children:[s.image," (JPG, PNG, WebP, SVG)"]}),m.jsx("input",{type:"file",accept:"image/png,image/jpeg,image/webp,image/svg+xml",onChange:r})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:s.caption}),m.jsx("input",{type:"text",value:n.data.caption||"",onChange:c=>a("caption",c.target.value),placeholder:s.placeholderImageCaption})]}),n.data.data&&m.jsxs("div",{style:{marginTop:16},children:[m.jsx("label",{children:"Preview:"}),m.jsx("div",{children:m.jsx("img",{src:n.data.data,alt:"Preview",style:{maxWidth:"100%",maxHeight:200}})})]})]})}var Lr=({value:n,onChange:a,label:i})=>m.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[i&&m.jsx("label",{style:{marginRight:8},children:i}),m.jsx("input",{type:"color",value:n,onChange:s=>a(s.target.value),style:{width:32,height:32,border:"none",background:"none",padding:0}}),m.jsx("input",{type:"text",value:n,onChange:s=>a(s.target.value),placeholder:"#e5e7eb",style:{width:100}})]});function jT({value:n,onChange:a}){return m.jsxs("div",{className:"form-group",children:[m.jsxs("label",{children:["Rotation (degrees): ",n,"°"]}),m.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[m.jsx("input",{type:"range",min:0,max:360,value:n,onChange:i=>a(Number(i.target.value)),style:{flex:1}}),m.jsx("input",{type:"number",min:0,max:360,value:n,onChange:i=>{let s=Number(i.target.value);isNaN(s)&&(s=0),s<0&&(s=0),s>360&&(s=360),a(s)},style:{width:100}})]})]})}function LT({localNode:n,handleFieldChange:a,language:i="en"}){const s=Vt(i);return m.jsxs("div",{className:"panel-content",children:[m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:s.text}),m.jsx("input",{type:"text",value:n.data.text||"",onChange:r=>a("text",r.target.value),placeholder:s.placeholderBackgroundText})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:s.fontSize}),m.jsx("input",{type:"number",value:n.data.fontSize||32,onChange:r=>a("fontSize",Number(r.target.value))})]}),m.jsx("div",{className:"form-group",children:m.jsx(Lr,{label:s.color,value:n.data.color||"#e5e7eb",onChange:r=>a("color",r)})}),m.jsx(jT,{value:n.data.rotation||0,onChange:r=>a("rotation",r)})]})}var HT=({defaultLanguage:n="en"})=>{const a=ie(A=>A.selectedNodeId),i=ie(A=>A.nodes),s=ie(A=>A.drawerOpen),r=ie(A=>A.settings),c=ie(A=>A.nextNodeId),u=ie(A=>A.setDrawerOpen),h=ie(A=>A.setSelectedNodeId),g=ie(A=>A.updateNode),p=ie(A=>A.deleteNode),x=ie(A=>A.addNode),y=ie(A=>A.setNextNodeId),v=r?.language||n,S=Vt(v),b=i.find(A=>A.id===a)||null;B.useEffect(()=>{s&&!b&&(u(!1),h(null))},[b,s,u,h]);const E=()=>{u(!1),h(null)},_=()=>{b&&(p(b.id),E())},T=()=>{if(!b)return;const A=`node-${c}`,O={...b,id:A,position:{x:b.position.x+20,y:b.position.y+20},data:{...b.data,label:`${b.data.label} (copy)`},selected:!1};x(O),y(c+1),h(A)};if(!s||!b)return null;const z=i.filter(A=>A.id!==b.id&&(A.type==="task"||A.type==="topic")),N=ie.getState().edges,C=new Set;N.forEach(A=>{A.source===b.id&&C.add(A.target),A.target===b.id&&C.add(A.source)});const D=[...z].sort((A,O)=>{const G=C.has(A.id),P=C.has(O.id);if(G&&!P)return-1;if(!G&&P)return 1;const se=(A.data.label||A.id).toLowerCase(),ge=(O.data.label||O.id).toLowerCase();return se.localeCompare(ge)}),R=(A,O)=>m.jsxs("select",{value:A,onChange:G=>O(G.target.value),children:[m.jsx("option",{value:"",children:S.selectNode}),D.map(G=>m.jsx("option",{value:G.id,children:G.data.label||G.id},G.id))]}),j=(A,O)=>{if(!b)return;const G=[...b.data.completion?.needs||[]];G[A]=O,k("completion",{...b.data.completion||{},needs:G})},K=()=>{if(!b)return;const A=[...b.data.completion?.needs||[],""];k("completion",{...b.data.completion||{},needs:A})},J=A=>{if(!b)return;const O=(b.data.completion?.needs||[]).filter((G,P)=>P!==A);k("completion",{...b.data.completion||{},needs:O})},fe=(A,O)=>{if(!b)return;const G=[...b.data.completion?.optional||[]];G[A]=O,k("completion",{...b.data.completion||{},optional:G})},U=()=>{if(!b)return;const A=[...b.data.completion?.optional||[],""];k("completion",{...b.data.completion||{},optional:A})},F=A=>{if(!b)return;const O=(b.data.completion?.optional||[]).filter((G,P)=>P!==A);k("completion",{...b.data.completion||{},optional:O})},ae=(A,O)=>{if(!b)return;const G=[...b.data.unlock?.after||[]];G[A]=O,k("unlock",{...b.data.unlock||{},after:G})},H=()=>{if(!b)return;const A=[...b.data.unlock?.after||[],""];k("unlock",{...b.data.unlock||{},after:A})},I=A=>{if(!b)return;const O=(b.data.unlock?.after||[]).filter((G,P)=>P!==A);k("unlock",{...b.data.unlock||{},after:O})},k=(A,O)=>{if(!b)return;const G={...b,data:{...b.data,[A]:O},className:A==="color"?O:b.className};g(b.id,G)},L=(A,O,G)=>{if(!b)return;const P=[...b.data.resources||[]];P[A]={...P[A],[O]:G},k("resources",P)},$=()=>{if(!b)return;const A=[...b.data.resources||[],{label:"",type:"url",url:""}];k("resources",A)},Z=A=>{if(!b)return;const O=(b.data.resources||[]).filter((G,P)=>P!==A);k("resources",O)};let Y;return b.type==="task"?Y=m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:S.editTask}),m.jsx("button",{onClick:E,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsx(Ay,{localNode:b,handleFieldChange:k,handleResourceChange:L,addResource:$,removeResource:Z,handleUnlockAfterChange:ae,addUnlockAfter:H,removeUnlockAfter:I,renderNodeSelect:R,handleCompletionNeedsChange:j,addCompletionNeed:K,removeCompletionNeed:J,handleCompletionOptionalChange:fe,addCompletionOptional:U,removeCompletionOptional:F,language:v})]}):b.type==="topic"?Y=m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:S.editTopic}),m.jsx("button",{onClick:E,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsx(DT,{localNode:b,handleFieldChange:k,handleResourceChange:L,addResource:$,removeResource:Z,handleUnlockAfterChange:ae,addUnlockAfter:H,removeUnlockAfter:I,renderNodeSelect:R,handleCompletionNeedsChange:j,addCompletionNeed:K,removeCompletionNeed:J,handleCompletionOptionalChange:fe,addCompletionOptional:U,removeCompletionOptional:F,language:v})]}):b.type==="image"?Y=m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:S.editImage}),m.jsx("button",{onClick:E,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsx(RT,{localNode:b,handleFieldChange:k,language:v})]}):b.type==="text"&&(Y=m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:S.editText}),m.jsx("button",{onClick:E,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsx(LT,{localNode:b,handleFieldChange:k,language:v})]})),m.jsx(fa,{position:"center-right",className:"editor-panel",children:m.jsxs("div",{className:"panel-inner",children:[Y,m.jsxs("div",{className:"panel-footer",children:[m.jsxs("button",{onClick:T,className:"secondary-button",children:[m.jsx(IN,{size:16})," ",S.copyNode]}),m.jsxs("button",{onClick:_,className:"danger-button",children:[m.jsx(xi,{size:16})," ",S.deleteNode]})]})]})})};function BT({localEdge:n,handleFieldChange:a,language:i="en"}){const s=Vt(i);return m.jsxs("div",{className:"panel-content",children:[m.jsx("div",{className:"form-group",children:m.jsx(Lr,{label:s.edgeColor,value:n.style?.stroke||"#222222",onChange:r=>a("color",r)})}),m.jsx("div",{className:"form-group",children:m.jsxs("label",{children:[m.jsx("input",{type:"checkbox",checked:!!n.animated,onChange:r=>a("animated",r.target.checked)}),s.animated]})}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:s.edgeType}),m.jsxs("select",{value:n.type||"default",onChange:r=>a("type",r.target.value),children:[m.jsx("option",{value:"default",children:s.default}),m.jsx("option",{value:"straight",children:s.straight}),m.jsx("option",{value:"step",children:s.step}),m.jsx("option",{value:"smoothstep",children:s.smoothstep}),m.jsx("option",{value:"simplebezier",children:"Simple Bezier"})]})]})]})}var UT=({defaultLanguage:n="en"})=>{const a=ie(S=>S.selectedEdge),i=ie(S=>S.edgeDrawerOpen),s=ie(S=>S.settings);ie(S=>S.edges);const r=ie(S=>S.setEdgeDrawerOpen),c=ie(S=>S.setSelectedEdge),u=ie(S=>S.updateEdge),h=ie(S=>S.deleteEdge),g=s?.language||n,p=Vt(g);B.useEffect(()=>{i&&!a&&r(!1)},[a,i,r]);const x=()=>{r(!1),c(null)},y=S=>{u(S.id,S)},v=()=>{a&&(h(a.id),x())};return!a||!i?null:m.jsx(fa,{position:"center-right",className:"editor-panel",children:m.jsxs("div",{className:"panel-inner",children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:p.editEdge}),m.jsx("button",{onClick:x,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsx(BT,{localEdge:a,handleFieldChange:(S,b)=>{let E={...a};S==="color"?E={...E,style:{...E.style,stroke:b}}:S==="animated"?E={...E,animated:b}:S==="type"&&(E={...E,type:b}),y(E)},language:g}),m.jsx("div",{className:"panel-footer panel-footer-centered",children:m.jsxs("button",{onClick:v,className:"danger-button",children:[m.jsx(xi,{size:16})," ",p.deleteEdge]})})]})})},VT=({defaultLanguage:n="en"})=>{const a=ie(b=>b.settingsDrawerOpen),i=ie(b=>b.settings),s=ie(b=>b.edges),r=ie(b=>b.setEdges),c=ie(b=>b.setSettingsDrawerOpen),u=ie(b=>b.setSettings),h=i?.language||n,g=Vt(h),{getViewport:p}=Wa(),x=()=>c(!1);if(!a)return null;const y=b=>{u({...i,...b})},v=()=>{const b=p();y({viewport:{x:Math.round(b.x),y:Math.round(b.y),zoom:parseFloat(b.zoom.toFixed(2))}})},S=()=>{const b=i?.defaultEdgeType||"default",E=i?.defaultEdgeColor||"#94a3b8",_=s.map(T=>({...T,type:b,style:{...T.style,stroke:E}}));r(_)};return m.jsx(fa,{position:"center-right",className:"editor-panel",children:m.jsxs("div",{className:"panel-inner",children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:g.backgroundSettings}),m.jsx("button",{onClick:x,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsxs("div",{className:"panel-content",children:[m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:g.labelRequired}),m.jsx("input",{type:"text",value:i?.title||"",onChange:b=>y({title:b.target.value}),placeholder:g.placeholderTitleLabel})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:g.languageLabel}),m.jsxs("select",{value:i?.language||"en",onChange:b=>y({language:b.target.value}),children:[m.jsx("option",{value:"en",children:g.languageEnglish}),m.jsx("option",{value:"de",children:g.languageGerman})]})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:g.storageId}),m.jsxs("div",{style:{display:"flex",gap:"8px",marginBottom:"8px"},children:[m.jsx("input",{type:"text",value:i?.id||"",onChange:b=>y({id:b.target.value}),placeholder:"Optional",style:{flex:1}}),m.jsx("button",{onClick:()=>y({id:oT()}),className:"secondary-button",type:"button",style:{padding:"8px 12px",width:"auto",display:"flex",alignItems:"center",gap:"4px"},title:g.generateRandomId,children:m.jsx(JN,{size:16})})]}),m.jsxs("p",{style:{fontSize:"0.875rem",color:"#666",margin:0,fontStyle:"italic"},children:["ℹ️ ",g.storageIdHint]})]}),m.jsx("div",{className:"form-group",children:m.jsx(Lr,{label:g.backgroundColor,value:i?.background?.color||"#ffffff",onChange:b=>y({background:{...i.background,color:b}})})}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:g.initialViewport}),m.jsxs("div",{style:{display:"flex",gap:"8px",alignItems:"center",marginTop:"8px"},children:[m.jsxs("div",{style:{flex:1},children:[m.jsx("label",{style:{fontSize:"0.875rem",color:"#666"},children:g.viewportX}),m.jsx("input",{type:"number",value:i?.viewport?.x??0,onChange:b=>y({viewport:{...i.viewport,x:parseFloat(b.target.value)||0,y:i.viewport?.y??0,zoom:i.viewport?.zoom??1}}),style:{width:"100%"}})]}),m.jsxs("div",{style:{flex:1},children:[m.jsx("label",{style:{fontSize:"0.875rem",color:"#666"},children:g.viewportY}),m.jsx("input",{type:"number",value:i?.viewport?.y??0,onChange:b=>y({viewport:{...i.viewport,y:parseFloat(b.target.value)||0,x:i.viewport?.x??0,zoom:i.viewport?.zoom??1}}),style:{width:"100%"}})]}),m.jsxs("div",{style:{flex:1},children:[m.jsx("label",{style:{fontSize:"0.875rem",color:"#666"},children:g.viewportZoom}),m.jsx("input",{type:"number",step:"0.1",min:"0.1",max:"10",value:i?.viewport?.zoom??1,onChange:b=>y({viewport:{...i.viewport,zoom:parseFloat(b.target.value)||1,x:i.viewport?.x??0,y:i.viewport?.y??0}}),style:{width:"100%"}})]})]}),m.jsx("button",{onClick:v,className:"secondary-button",style:{marginTop:"8px",width:"100%"},type:"button",children:g.useCurrentViewport})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:"Default Edge Type"}),m.jsxs("select",{value:i?.defaultEdgeType||"default",onChange:b=>y({defaultEdgeType:b.target.value}),children:[m.jsx("option",{value:"default",children:"Default"}),m.jsx("option",{value:"straight",children:"Straight"}),m.jsx("option",{value:"step",children:"Step"}),m.jsx("option",{value:"smoothstep",children:"Smooth Step"}),m.jsx("option",{value:"simplebezier",children:"Simple Bezier"})]})]}),m.jsx("div",{className:"form-group",children:m.jsx(Lr,{label:"Default Edge Color",value:i?.defaultEdgeColor||"#94a3b8",onChange:b=>y({defaultEdgeColor:b})})}),m.jsx("div",{className:"form-group",children:m.jsx("button",{onClick:S,className:"secondary-button",style:{width:"100%"},type:"button",children:"Update All Edges to Default Settings"})})]})]})})},$T={topic:my,task:py,image:uy,text:gy},YT={floating:MT},Ny=B.memo(({defaultLanguage:n="en"})=>{const a=ie(k=>k.settings),i=ie(k=>k.nodes),s=ie(k=>k.edges),r=ie(k=>k.showGrid),c=ie(k=>k.selectedNodeIds),u=ie(k=>k.onNodesChange),h=ie(k=>k.onEdgesChange),g=ie(k=>k.onConnect),p=ie(k=>k.setSelectedNodeIds),x=ie(k=>k.setSelectedNodeId),y=ie(k=>k.setSelectedEdge),v=ie(k=>k.setDrawerOpen),S=ie(k=>k.setEdgeDrawerOpen),b=ie(k=>k.setSettingsDrawerOpen),E=ie(k=>k.setHelpOpen),_=ie(k=>k.setLastMousePosition),{setViewport:T,screenToFlowPosition:z}=Wa(),N=B.useRef(null),C=a?.language||n,D=Vt(C);B.useEffect(()=>{a?.viewport&&T({x:a.viewport.x,y:a.viewport.y,zoom:a.viewport.zoom})},[a?.viewport,T]);const{undo:R,redo:j,canUndo:K,canRedo:J}=Ey(k=>({undo:k.undo,redo:k.redo,canUndo:k.pastStates.length>0,canRedo:k.futureStates.length>0})),fe=B.useCallback((k,L)=>{x(L.id),v(!0),y(null),S(!1),b(!1)},[x,v,y,S,b]),U=B.useCallback((k,L)=>{y(L),S(!0),x(null),v(!1),b(!1)},[y,S,x,v,b]),F=B.useCallback(({nodes:k})=>{p(k.map(L=>L.id)),k.length===0&&(v(!1),x(null))},[p,v,x]),ae=B.useCallback(k=>{const L=z({x:k.clientX,y:k.clientY});_(L)},[z,_]),H=B.useCallback(()=>{v(!1),x(null),S(!1),y(null),b(!1)},[v,x,S,y,b]),I={animated:!1,style:{stroke:a?.defaultEdgeColor||"#94a3b8",strokeWidth:2},type:a?.defaultEdgeType||"default"};return m.jsx("div",{ref:N,className:"editor-canvas",style:{backgroundColor:a?.background?.color||"#ffffff"},onMouseMove:ae,children:m.jsxs(Zm,{nodes:i,edges:s,onEdgesChange:h,onNodeClick:fe,onEdgeClick:U,onNodesChange:u,onConnect:g,onSelectionChange:F,onPaneClick:H,nodeTypes:$T,selectionOnDrag:!1,minZoom:.2,edgeTypes:YT,proOptions:{hideAttribution:!0},defaultEdgeOptions:I,nodesDraggable:!0,elevateNodesOnSelect:!1,nodesConnectable:!0,selectNodesOnDrag:!1,colorMode:"light",children:[r&&m.jsx(uN,{}),m.jsxs(Fm,{children:[m.jsx(Ll,{title:D.undo,disabled:!K,onClick:()=>R(),children:m.jsx(n3,{})}),m.jsx(Ll,{title:D.redo,disabled:!J,onClick:()=>j(),children:m.jsx(FN,{})}),m.jsx(Ll,{title:D.help,onClick:()=>E(!0),children:m.jsx(l0,{})})]}),c.length>1&&m.jsx(zT,{}),m.jsx(HT,{defaultLanguage:n}),m.jsx(UT,{defaultLanguage:n}),m.jsx(VT,{defaultLanguage:n})]})})});Ny.displayName="EditorCanvas";function qT(){const[n,a]=B.useState(!1),[i,s]=B.useState(!1),r=ie(E=>E.shareDialogOpen),c=ie(E=>E.shareLink),u=ie(E=>E.settings),h=ie(E=>E.setShareDialogOpen),g=u?.language||"en",p=Vt(g),x=()=>h(!1);if(!r)return null;const y=c.replace(/(#json=.+)/,"/create$1"),v=c.replace(/(#json=.+)/,"/learn$1"),S=async()=>{try{await navigator.clipboard.writeText(y),a(!0),setTimeout(()=>a(!1),2e3)}catch(E){console.error("Failed to copy link:",E)}},b=async()=>{try{await navigator.clipboard.writeText(v),s(!0),setTimeout(()=>s(!1),2e3)}catch(E){console.error("Failed to copy link:",E)}};return m.jsxs(m.Fragment,{children:[m.jsx("div",{className:"drawer-overlay",onClick:x}),m.jsxs("div",{className:"share-dialog",children:[m.jsxs("header",{className:"drawer-header",children:[m.jsx("h2",{className:"drawer-title",children:p.share}),m.jsx("button",{className:"close-button",onClick:x,"aria-label":p.close,children:m.jsx(da,{size:20})})]}),m.jsxs("div",{className:"drawer-content",children:[m.jsxs("div",{style:{marginBottom:24},children:[m.jsx("h3",{style:{fontSize:14,fontWeight:600,marginBottom:8},children:"Edit Link"}),m.jsx("p",{style:{fontSize:13,color:"#666",marginBottom:12},children:"Share this link to allow others to edit the map"}),m.jsx("div",{style:{display:"flex",gap:8,marginBottom:8},children:m.jsx("input",{type:"text",value:y,readOnly:!0,style:{flex:1,padding:"8px 12px",border:"1px solid #d1d5db",borderRadius:4,fontSize:14,fontFamily:"monospace"},onClick:E=>E.currentTarget.select()})}),m.jsx("button",{onClick:S,className:"drawer-button",style:{width:"100%",display:"flex",alignItems:"center",justifyContent:"center",gap:8},children:n?m.jsxs(m.Fragment,{children:[m.jsx(t0,{size:16}),p.linkCopied]}):m.jsxs(m.Fragment,{children:[m.jsx(i0,{size:16}),"Copy Edit Link"]})})]}),m.jsxs("div",{children:[m.jsx("h3",{style:{fontSize:14,fontWeight:600,marginBottom:8},children:"Learn Link"}),m.jsx("p",{style:{fontSize:13,color:"#666",marginBottom:12},children:"Share this link for others to learn from the map"}),m.jsx("div",{style:{display:"flex",gap:8,marginBottom:8},children:m.jsx("input",{type:"text",value:v,readOnly:!0,style:{flex:1,padding:"8px 12px",border:"1px solid #d1d5db",borderRadius:4,fontSize:14,fontFamily:"monospace"},onClick:E=>E.currentTarget.select()})}),m.jsx("button",{onClick:b,className:"drawer-button",style:{width:"100%",display:"flex",alignItems:"center",justifyContent:"center",gap:8},children:i?m.jsxs(m.Fragment,{children:[m.jsx(t0,{size:16}),p.linkCopied]}):m.jsxs(m.Fragment,{children:[m.jsx(i0,{size:16}),"Copy Learn Link"]})})]})]})]})]})}function XT({onClose:n,onDownloadCurrent:a,onReplace:i}){const s=ie(g=>g.loadExternalDialogOpen),c=ie(g=>g.settings)?.language||"en",u=Vt(c);if(!s)return null;const h=()=>{a(),setTimeout(()=>i(),100)};return m.jsxs(m.Fragment,{children:[m.jsx("div",{className:"drawer-overlay",onClick:n}),m.jsxs("div",{className:"share-dialog",children:[m.jsxs("header",{className:"drawer-header",children:[m.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[m.jsx(t3,{size:20,color:"#f59e0b"}),m.jsx("h2",{className:"drawer-title",style:{margin:0},children:"Warning"})]}),m.jsx("button",{className:"close-button",onClick:n,"aria-label":u.close,children:m.jsx(da,{size:20})})]}),m.jsxs("div",{className:"drawer-content",children:[m.jsx("p",{style:{marginBottom:16},children:u.loadExternalWarning}),m.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8},children:[m.jsxs("button",{onClick:h,className:"drawer-button",style:{display:"flex",alignItems:"center",justifyContent:"center",gap:8},children:[m.jsx(n0,{size:16}),u.downloadCurrentMap]}),m.jsx("button",{onClick:i,className:"drawer-button",style:{display:"flex",alignItems:"center",justifyContent:"center",gap:8,backgroundColor:"#dc2626"},children:u.replaceWithExternal})]})]})]})]})}var ky=B.memo(({defaultLanguage:n="en",jsonStore:a="https://json.openpatch.org"})=>{const i=ie(S=>S.settings),s=ie(S=>S.helpOpen),r=ie(S=>S.pendingExternalId),[c]=_y(),u=ie(S=>S.setHelpOpen);ie(S=>S.setShareDialogOpen);const h=ie(S=>S.setLoadExternalDialogOpen),g=ie(S=>S.setPendingExternalId),{downloadRoadmap:p}=Rf(),x=i?.language||n,y=Vt(x);B.useEffect(()=>{const S=window.location.hash;if(S.startsWith("#json=")){const b=S.replace("#json=","");b&&b!==r&&(g(b),h(!0))}},[]);const v=[{action:y.shortcuts.undo,shortcut:"Ctrl+Z"},{action:y.shortcuts.redo,shortcut:"Ctrl+Y or Ctrl+Shift+Z"},{action:y.shortcuts.addTaskNode,shortcut:"Ctrl+1"},{action:y.shortcuts.addTopicNode,shortcut:"Ctrl+2"},{action:y.shortcuts.addImageNode,shortcut:"Ctrl+3"},{action:y.shortcuts.addTextNode,shortcut:"Ctrl+4"},{action:y.shortcuts.deleteNodeEdge,shortcut:"Delete"},{action:y.shortcuts.togglePreviewMode,shortcut:"Ctrl+P"},{action:y.shortcuts.toggleDebugMode,shortcut:"Ctrl+D"},{action:y.shortcuts.selectMultipleNodes,shortcut:"Ctrl+Click or Shift+Drag"},{action:y.shortcuts.selectAllNodes,shortcut:"Ctrl+A"},{action:y.shortcuts.showHelp,shortcut:"Ctrl+? or Help Button"},{action:y.shortcuts.save,shortcut:"Ctrl+S"},{action:y.shortcuts.zoomIn,shortcut:"Ctrl++"},{action:y.shortcuts.zoomOut,shortcut:"Ctrl+-"},{action:y.shortcuts.resetZoom,shortcut:"Ctrl+0"},{action:y.shortcuts.resetMap,shortcut:"Ctrl+Delete"},{action:y.shortcuts.fitView,shortcut:"Shift+!"},{action:y.shortcuts.zoomToSelection,shortcut:"Shift+@"},{action:y.shortcuts.toggleGrid,shortcut:"Ctrl+'"},{action:y.shortcuts.cut,shortcut:"Ctrl+X"},{action:y.shortcuts.copy,shortcut:"Ctrl+C"},{action:y.shortcuts.paste,shortcut:"Ctrl+V"}];return m.jsxs(m.Fragment,{children:[m.jsxs("dialog",{className:"help",open:s,onClose:()=>u(!1),children:[m.jsxs("header",{className:"help-header",children:[m.jsx("h2",{children:y.keyboardShortcuts}),m.jsx("button",{className:"close-button",onClick:()=>u(!1),"aria-label":y.close,children:m.jsx(da,{size:20})})]}),m.jsx("div",{className:"help-content",children:m.jsxs("table",{children:[m.jsx("thead",{children:m.jsxs("tr",{children:[m.jsx("th",{children:y.action}),m.jsx("th",{children:y.shortcut})]})}),m.jsx("tbody",{children:v.map(S=>m.jsxs("tr",{children:[m.jsx("td",{children:S.action}),m.jsx("td",{children:S.shortcut})]},S.action))})]})}),m.jsx("div",{className:"help-footer",children:m.jsx("button",{className:"primary-button",onClick:()=>u(!1),children:y.close})})]}),m.jsx(qT,{}),m.jsx(XT,{onClose:()=>{h(!1),g(null)},onDownloadCurrent:p,onReplace:()=>{r&&c(r)}})]})});ky.displayName="EditorDialogs";var GT={addTaskNode:{key:"1",ctrl:!0},addTopicNode:{key:"2",ctrl:!0},addImageNode:{key:"3",ctrl:!0},addTextNode:{key:"4",ctrl:!0},save:{key:"s",ctrl:!0},undo:{key:"z",ctrl:!0},redo:{key:"y",ctrl:!0},help:{key:"?",ctrl:!0},togglePreview:{key:"p",ctrl:!0},toggleDebug:{key:"d",ctrl:!0},zoomIn:{key:"+",ctrl:!0},zoomOut:{key:"-",ctrl:!0},resetZoom:{key:"0",ctrl:!0},toggleGrid:{key:"'",ctrl:!0},resetMap:{key:"Delete",ctrl:!0},cut:{key:"x",ctrl:!0},copy:{key:"c",ctrl:!0},paste:{key:"v",ctrl:!0},selectAll:{key:"a",ctrl:!0},fitView:{key:"!",shift:!0},zoomToSelection:{key:"@",shift:!0},deleteSelected:{key:"Delete"}},xt=(n,a)=>{if(!a)return!1;const i=n.key.toLowerCase()===a.key.toLowerCase(),s=a.ctrl?n.ctrlKey||n.metaKey:!(n.ctrlKey||n.metaKey),r=a.shift?n.shiftKey:!n.shiftKey,c=a.alt?n.altKey:!n.altKey;return i&&s&&r&&c},ZT=({jsonStore:n="https://json.openpatch.org",keyBindings:a={}})=>{const i={...GT,...a},{zoomIn:s,zoomOut:r,setCenter:c,fitView:u,screenToFlowPosition:h}=Wa(),g=ie(le=>le.helpOpen),p=ie(le=>le.selectedNodeIds),x=ie(le=>le.selectedEdge),y=ie(le=>le.nodes),v=ie(le=>le.lastMousePosition),S=ie(le=>le.settings),b=ie(le=>le.setHelpOpen),E=ie(le=>le.addNode),_=ie(le=>le.getRoadmapData),T=ie(le=>le.setPreviewMode),z=ie(le=>le.setDebugMode),N=ie(le=>le.setClipboard),C=ie(le=>le.clipboard),D=ie(le=>le.setNodes),R=ie(le=>le.setEdges),j=ie(le=>le.setSelectedNodeIds),K=ie(le=>le.showGrid),J=ie(le=>le.setShowGrid),fe=ie(le=>le.deleteNode),U=ie(le=>le.deleteEdge),F=ie(le=>le.setSelectedEdge),ae=ie(le=>le.setEdgeDrawerOpen),H=ie(le=>le.drawerOpen),I=ie(le=>le.edgeDrawerOpen),k=ie(le=>le.settingsDrawerOpen),L=S?.language||"en",$=Vt(L),{undo:Z,redo:Y}=Ey(le=>({undo:le.undo,redo:le.redo})),A=le=>{const de=v||h({x:window.innerWidth/2,y:window.innerHeight/2}),Je={id:`node-${Date.now()}`,type:le,position:de,data:{label:le==="task"?$.newTask:le==="topic"?$.newTopic:le,state:"unlocked"}};E(Je)},O=()=>{if(x){U(x.id),F(null),ae(!1);return}p.length>0&&(p.forEach(le=>{fe(le)}),j([]))},G=()=>{const le=_(),de="data:text/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(le,null,2)),Je=document.createElement("a");Je.setAttribute("href",de),Je.setAttribute("download","learningmap.json"),document.body.appendChild(Je),Je.click(),Je.remove()},P=()=>{const le=ie.getState().previewMode;T(!le)},se=()=>{const le=ie.getState().debugMode;z(!le)},ge=()=>{confirm($.resetMapWarning)&&(D([]),R([]))},he=()=>{const le=y.filter(de=>p.includes(de.id));le.length>0&&(N({nodes:le,edges:[]}),p.forEach(de=>{fe(de)}),j([]))},ue=()=>{const le=y.filter(de=>p.includes(de.id));le.length>0&&N({nodes:le,edges:[]})},me=()=>{if(C&&C.nodes.length>0){const le=C.nodes.map(de=>({...de,id:`node-${Date.now()}-${Math.random()}`,position:{x:de.position.x+50,y:de.position.y+50}}));D([...y,...le]),j(le.map(de=>de.id))}},Ne=()=>{j(y.map(le=>le.id))},ke=()=>s(),Se=()=>r(),_e=()=>c(0,0,{zoom:1}),we=()=>u(),Me=()=>{if(p.length>0){const le=y.filter(de=>p.includes(de.id));le.length>0&&u({nodes:le,duration:300})}},Re=()=>J(!K);return B.useEffect(()=>{const le=de=>{H||I||k||(xt(de,i.addTaskNode)?(de.preventDefault(),A("task")):xt(de,i.addTopicNode)?(de.preventDefault(),A("topic")):xt(de,i.addImageNode)?(de.preventDefault(),A("image")):xt(de,i.addTextNode)?(de.preventDefault(),A("text")):xt(de,i.save)?(de.preventDefault(),G()):xt(de,i.undo)?(de.preventDefault(),Z()):xt(de,i.redo)?(de.preventDefault(),Y()):xt(de,i.help)?(de.preventDefault(),b(!g)):xt(de,i.togglePreview)?(de.preventDefault(),P()):xt(de,i.toggleDebug)?(de.preventDefault(),se()):xt(de,i.zoomIn)?(de.preventDefault(),ke()):xt(de,i.zoomOut)?(de.preventDefault(),Se()):xt(de,i.resetZoom)?(de.preventDefault(),_e()):xt(de,i.toggleGrid)?(de.preventDefault(),Re()):xt(de,i.resetMap)?(de.preventDefault(),ge()):xt(de,i.cut)?(de.preventDefault(),he()):xt(de,i.copy)?(de.preventDefault(),ue()):xt(de,i.paste)?(de.preventDefault(),me()):xt(de,i.selectAll)?(de.preventDefault(),Ne()):xt(de,i.fitView)?(de.preventDefault(),we()):xt(de,i.zoomToSelection)?(de.preventDefault(),Me()):xt(de,i.deleteSelected)&&(de.preventDefault(),O()))};return window.addEventListener("keydown",le),()=>{window.removeEventListener("keydown",le)}},[A,O,G,Z,Y,g,b,P,se,ke,Se,_e,we,Me,Re,ge,he,ue,me,Ne,H,I,k,i]),null};function IT({roadmapData:n,language:a="en",jsonStore:i="https://json.openpatch.org",disableSharing:s=!1,disableFileOperations:r=!1,disablePersist:c=!1,keyBindings:u}){const h=ie(_=>_.nodes),g=ie(_=>_.edges),p=ie(_=>_.settings),x=ie(_=>_.previewMode),y=ie(_=>_.getRoadmapData),v=ie(_=>_.setJsonStore),S=ie(_=>_.setDefaultLanguage),b=ie(_=>_.loadRoadmapData),E=p?.language||a;return B.useEffect(()=>{ET(!c)},[c]),B.useEffect(()=>{v(i),S(a)},[i,a,v,S]),B.useEffect(()=>{if(n)if(typeof n=="string")try{const _=JSON.parse(n);b(_)}catch(_){console.error("Failed to parse roadmapData JSON string",_)}else b(n)},[n,b]),m.jsxs(m.Fragment,{children:[m.jsx(ZT,{jsonStore:i,keyBindings:u}),m.jsx(NT,{defaultLanguage:a,disableSharing:s,disableFileOperations:r}),x&&m.jsx(Sy,{roadmapData:y(),language:E}),!x&&m.jsxs(m.Fragment,{children:[h.length===0&&g.length===0&&m.jsx(TT,{defaultLanguage:a}),m.jsx(Ny,{defaultLanguage:a}),m.jsx(ky,{defaultLanguage:a,jsonStore:i})]})]})}var QT=n=>m.jsx("div",{className:"hyperbook-learningmap-container",children:m.jsx(Zu,{children:m.jsx(IT,{...n})})});const KT=ep(wT,{props:{roadmapData:"string",language:"string",onChange:"function",initialState:"json"},events:{change:!0}});customElements.define("hyperbook-learningmap",KT);const FT=ep(QT,{props:{roadmapData:"string",language:"string",jsonStore:"string",disableSharing:"boolean",disableFileOperations:"boolean",keyBindings:"json",onChange:"function"},events:{change:!0}});customElements.define("hyperbook-learningmap-editor",FT)}));
311
+ `+Lt),_e&&Nr([F,ae,H],un=>{Lt=Vo(Lt,un," ")}),C&&et?C.createHTML(Lt):Lt},a.setConfig=function(){let ve=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};ma(ve),Re=!0},a.clearConfig=function(){Ft=null,Re=!1},a.isValidAttribute=function(ve,q,pe){Ft||ma({});const ye=ht(ve),Xe=ht(q);return za(ye,Xe,pe)},a.addHook=function(ve,q){typeof q=="function"&&Uo(U[ve],q)},a.removeHook=function(ve,q){if(q!==void 0){const pe=Y3(U[ve],q);return pe===-1?void 0:q3(U[ve],pe,1)[0]}return k0(U[ve])},a.removeHooks=function(ve){U[ve]=[]},a.removeAllHooks=function(){U=j0()},a}var ok=L0();const H0=n=>{let a;const i=new Set,s=(p,x)=>{const y=typeof p=="function"?p(a):p;if(!Object.is(y,a)){const v=a;a=x??(typeof y!="object"||y===null)?y:Object.assign({},a,y),i.forEach(S=>S(a,v))}},r=()=>a,h={setState:s,getState:r,getInitialState:()=>g,subscribe:p=>(i.add(p),()=>i.delete(p))},g=a=n(s,r,h);return h},B0=(n=>n?H0(n):H0),sk=n=>n;function rk(n,a=sk){const i=Ka.useSyncExternalStore(n.subscribe,Ka.useCallback(()=>a(n.getState()),[n,a]),Ka.useCallback(()=>a(n.getInitialState()),[n,a]));return Ka.useDebugValue(i),i}const ck=n=>{const a=B0(n),i=s=>rk(a,s);return Object.assign(i,a),i},U0=(n=>ck),yf=n=>!!n&&n[0]==="o",xf=Do.unstable_batchedUpdates,Xo=(n,a)=>n===!0||!!(n&&n[a]),Sn=(n,a)=>typeof n=="function"?n(a):n,V0="_szhsinMenu",uk=n=>n[V0],fk=(n,a)=>Object.defineProperty(a,V0,{value:n}),Go=(n,a)=>(a&&Object.keys(a).forEach(i=>{const s=n[i],r=a[i];typeof r=="function"&&s?n[i]=(...c)=>{r(...c),s(...c)}:n[i]=r}),n),dk=n=>{if(typeof n!="string")return{top:0,right:0,bottom:0,left:0};const a=n.trim().split(/\s+/,4).map(parseFloat),i=isNaN(a[0])?0:a[0],s=isNaN(a[1])?i:a[1];return{top:i,right:s,bottom:isNaN(a[2])?i:a[2],left:isNaN(a[3])?s:a[3]}},vf=n=>{for(;n;){if(n=n.parentNode,!n||n===document.body||!n.parentNode)return;const{overflow:a,overflowX:i,overflowY:s}=getComputedStyle(n);if(/auto|scroll|overlay|hidden/.test(a+s+i))return n}};function bf(n,a){return{"aria-disabled":n||void 0,tabIndex:a?0:-1}}function $0(n,a){for(let i=0;i<n.length;i++)if(n[i]===a)return i;return-1}const nl=({block:n,element:a,modifiers:i,className:s})=>B.useMemo(()=>{const r=a?`${n}__${a}`:n;let c=r;i&&Object.keys(i).forEach(h=>{const g=i[h];g&&(c+=` ${r}--${g===!0?h:`${h}-${g}`}`)});let u=typeof s=="function"?s(i):s;return typeof u=="string"&&(u=u.trim(),u&&(c+=` ${u}`)),c},[n,a,i,s]),hk="szh-menu-container",Ul="szh-menu",pk="szh-menu-button",gk="arrow",Y0="item",mk="divider",yk="submenu",q0=B.createContext(),Sf=B.createContext({}),wf=B.createContext({}),X0=B.createContext({}),xk=B.createContext({}),Cr=B.createContext({}),Qt=Object.freeze({ENTER:"Enter",ESC:"Escape",SPACE:" ",HOME:"Home",END:"End",LEFT:"ArrowLeft",RIGHT:"ArrowRight",UP:"ArrowUp",DOWN:"ArrowDown"}),Et=Object.freeze({RESET:0,SET:1,UNSET:2,INCREASE:3,DECREASE:4,FIRST:5,LAST:6,SET_INDEX:7}),Zo=Object.freeze({CLICK:"click",CANCEL:"cancel",BLUR:"blur",SCROLL:"scroll"}),vi=Object.freeze({FIRST:"first",LAST:"last"}),vk=Object.freeze({entering:"opening",entered:"open",exiting:"closing",exited:"closed"}),G0="absolute",Z0="none",I0="menuitem",Ef={preventScroll:!0},Q0=fk("MenuButton",B.forwardRef(function({className:a,isOpen:i,disabled:s,children:r,...c},u){const h=B.useMemo(()=>({open:i}),[i]);return m.jsx("button",{"aria-haspopup":!0,"aria-expanded":i,"aria-disabled":s||void 0,type:"button",disabled:s,...c,ref:u,className:nl({block:pk,modifiers:h,className:a}),children:r})})),bk=({className:n,containerRef:a,containerProps:i,children:s,isOpen:r,theming:c,transition:u,onClose:h})=>{const g=Xo(u,"item"),p=({key:y})=>{switch(y){case Qt.ESC:Sn(h,{key:y,reason:Zo.CANCEL});break}},x=y=>{r&&!y.currentTarget.contains(y.relatedTarget)&&Sn(h,{reason:Zo.BLUR})};return m.jsx("div",{...Go({onKeyDown:p,onBlur:x},i),className:nl({block:hk,modifiers:B.useMemo(()=>({theme:c,itemTransition:g}),[c,g]),className:n}),style:{position:"absolute",...i?.style},ref:a,children:s})},Sk=()=>{let n,a=0;return{toggle:i=>{i?a++:a--,a=Math.max(a,0)},on:(i,s,r)=>{a?n||(n=setTimeout(()=>{n=0,s()},i)):r?.()},off:()=>{n&&(clearTimeout(n),n=0)}}},wk=n=>{const[a,i]=B.useState(),r=B.useRef({items:[],hoverIndex:-1,sorted:!1}).current,c=B.useCallback((h,g)=>{const{items:p}=r;if(!h)r.items=[];else if(g)p.push(h);else{const x=p.indexOf(h);x>-1&&(p.splice(x,1),h.contains(document.activeElement)&&(n.current.focus(Ef),i()))}r.hoverIndex=-1,r.sorted=!1},[r,n]),u=B.useCallback((h,g,p)=>{const{items:x,hoverIndex:y}=r,v=()=>{if(r.sorted)return;const E=n.current.querySelectorAll(".szh-menu__item");x.sort((_,T)=>$0(E,_)-$0(E,T)),r.sorted=!0};let S=-1,b;switch(h){case Et.RESET:break;case Et.SET:b=g;break;case Et.UNSET:b=E=>E===g?void 0:E;break;case Et.FIRST:v(),S=0,b=x[S];break;case Et.LAST:v(),S=x.length-1,b=x[S];break;case Et.SET_INDEX:v(),S=p,b=x[S];break;case Et.INCREASE:v(),S=y,S<0&&(S=x.indexOf(g)),S++,S>=x.length&&(S=0),b=x[S];break;case Et.DECREASE:v(),S=y,S<0&&(S=x.indexOf(g)),S--,S<0&&(S=x.length-1),b=x[S];break}b||(S=-1),i(b),r.hoverIndex=S},[n,r]);return{hoverItem:a,dispatch:u,updateItems:c}},K0=(n,a)=>Math.round(n)===a?n:a,Ek=n=>{const a=n.getBoundingClientRect();return a.width=K0(a.width,n.offsetWidth),a.height=K0(a.height,n.offsetHeight),a},_k=(n,a,i,s)=>{const r=Ek(a),c=n.getBoundingClientRect(),u=i===window?{left:0,top:0,right:document.documentElement.clientWidth,bottom:window.innerHeight}:i.getBoundingClientRect(),h=dk(s),g=b=>b+c.left-u.left-h.left,p=b=>b+c.left+r.width-u.right+h.right,x=b=>b+c.top-u.top-h.top,y=b=>b+c.top+r.height-u.bottom+h.bottom;return{menuRect:r,containerRect:c,getLeftOverflow:g,getRightOverflow:p,getTopOverflow:x,getBottomOverflow:y,confineHorizontally:b=>{let E=g(b);if(E<0)b-=E;else{const _=p(b);_>0&&(b-=_,E=g(b),E<0&&(b-=E))}return b},confineVertically:b=>{let E=x(b);if(E<0)b-=E;else{const _=y(b);_>0&&(b-=_,E=x(b),E<0&&(b-=E))}return b}}},Ak=({arrowRef:n,menuY:a,anchorRect:i,containerRect:s,menuRect:r})=>{let c=i.top-s.top-a+i.height/2;const u=n.current.offsetHeight*1.25;return c=Math.max(u,c),c=Math.min(c,r.height-u),c},Nk=({anchorRect:n,containerRect:a,menuRect:i,placeLeftorRightY:s,placeLeftX:r,placeRightX:c,getLeftOverflow:u,getRightOverflow:h,confineHorizontally:g,confineVertically:p,arrowRef:x,arrow:y,direction:v,position:S})=>{let b=v,E=s;S!=="initial"&&(E=p(E),S==="anchor"&&(E=Math.min(E,n.bottom-a.top),E=Math.max(E,n.top-a.top-i.height)));let _,T,z;return b==="left"?(_=r,S!=="initial"&&(T=u(_),T<0&&(z=h(c),(z<=0||-T>z)&&(_=c,b="right")))):(_=c,S!=="initial"&&(z=h(_),z>0&&(T=u(r),(T>=0||-T<z)&&(_=r,b="left")))),S==="auto"&&(_=g(_)),{arrowY:y?Ak({menuY:E,arrowRef:x,anchorRect:n,containerRect:a,menuRect:i}):void 0,x:_,y:E,computedDirection:b}},kk=({arrowRef:n,menuX:a,anchorRect:i,containerRect:s,menuRect:r})=>{let c=i.left-s.left-a+i.width/2;const u=n.current.offsetWidth*1.25;return c=Math.max(u,c),c=Math.min(c,r.width-u),c},Tk=({anchorRect:n,containerRect:a,menuRect:i,placeToporBottomX:s,placeTopY:r,placeBottomY:c,getTopOverflow:u,getBottomOverflow:h,confineHorizontally:g,confineVertically:p,arrowRef:x,arrow:y,direction:v,position:S})=>{let b=v==="top"?"top":"bottom",E=s;S!=="initial"&&(E=g(E),S==="anchor"&&(E=Math.min(E,n.right-a.left),E=Math.max(E,n.left-a.left-i.width)));let _,T,z;return b==="top"?(_=r,S!=="initial"&&(T=u(_),T<0&&(z=h(c),(z<=0||-T>z)&&(_=c,b="bottom")))):(_=c,S!=="initial"&&(z=h(_),z>0&&(T=u(r),(T>=0||-T<z)&&(_=r,b="top")))),S==="auto"&&(_=p(_)),{arrowX:y?kk({menuX:E,arrowRef:x,anchorRect:n,containerRect:a,menuRect:i}):void 0,x:E,y:_,computedDirection:b}},Ck=({arrow:n,align:a,direction:i,gap:s,shift:r,position:c,anchorRect:u,arrowRef:h,positionHelpers:g})=>{const{menuRect:p,containerRect:x}=g,y=i==="left"||i==="right";let v=y?s:r,S=y?r:s;if(n){const D=h.current;y?v+=D.offsetWidth:S+=D.offsetHeight}const b=u.left-x.left-p.width-v,E=u.right-x.left+v,_=u.top-x.top-p.height-S,T=u.bottom-x.top+S;let z,N;a==="end"?(z=u.right-x.left-p.width,N=u.bottom-x.top-p.height):a==="center"?(z=u.left-x.left-(p.width-u.width)/2,N=u.top-x.top-(p.height-u.height)/2):(z=u.left-x.left,N=u.top-x.top),z+=v,N+=S;const C={...g,anchorRect:u,placeLeftX:b,placeRightX:E,placeLeftorRightY:N,placeTopY:_,placeBottomY:T,placeToporBottomX:z,arrowRef:h,arrow:n,direction:i,position:c};switch(i){case"left":case"right":return Nk(C);case"top":case"bottom":default:return Tk(C)}},Mr=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u"?B.useLayoutEffect:B.useEffect;function F0(n,a){typeof n=="function"?n(a):n.current=a}const zr=(n,a)=>B.useMemo(()=>n?a?i=>{F0(n,i),F0(a,i)}:n:a,[n,a]),J0=-9999,P0=({ariaLabel:n,menuClassName:a,menuStyle:i,arrow:s,arrowProps:r={},anchorPoint:c,anchorRef:u,containerRef:h,containerProps:g,externalRef:p,parentScrollingRef:x,align:y="start",direction:v="bottom",position:S="auto",overflow:b="visible",setDownOverflow:E,repositionFlag:_,captureFocus:T=!0,state:z,endTransition:N,isDisabled:C,menuItemFocus:D,gap:R=0,shift:j=0,children:K,onClose:J,focusProps:fe,...U})=>{const[F,ae]=B.useState({x:J0,y:J0}),[H,I]=B.useState({}),[k,L]=B.useState(),[$,Z]=B.useState(v),[Y]=B.useState(Sk),[A,O]=B.useReducer(je=>je+1,1),{transition:G,boundingBoxRef:P,boundingBoxPadding:se,rootMenuRef:ge,rootAnchorRef:he,scrollNodesRef:ue,reposition:me,viewScroll:Ne,submenuCloseDelay:ke}=B.useContext(Cr),{submenuCtx:Se,reposSubmenu:_e=_}=B.useContext(wf),we=B.useRef(),Me=B.useRef(),Re=B.useRef(!1),{hoverItem:le,dispatch:de,updateItems:Je}=wk(we),et=yf(z),on=Xo(G,"open"),wn=Xo(G,"close"),_t=ue.current,gt=je=>{switch(je.key){case Qt.HOME:de(Et.FIRST);break;case Qt.END:de(Et.LAST);break;case Qt.UP:de(Et.DECREASE,le);break;case Qt.DOWN:de(Et.INCREASE,le);break;case Qt.SPACE:je.target&&je.target.className.indexOf(Ul)!==-1&&je.preventDefault();return;default:return}je.preventDefault(),je.stopPropagation()},sn=()=>{z==="closing"&&L(),Sn(N)},Bt=je=>{je.stopPropagation(),Y.on(ke,()=>{de(Et.RESET),we.current.focus(Ef)})},$t=je=>{je.target===je.currentTarget&&Y.off()},Rt=B.useCallback(je=>{const tt=we.current,yt=h.current;if(!tt||!yt)return;const jt=u?u.current?.getBoundingClientRect():c?{left:c.x,right:c.x,top:c.y,bottom:c.y,width:0,height:0}:null;if(!jt)return;_t.menu||(_t.menu=(P?P.current:vf(ge.current))||window);const Ye=_k(yt,tt,_t.menu,se);let{arrowX:En,arrowY:na,x:ht,y:Ft,computedDirection:Ta}=Ck({arrow:s,align:y,direction:v,gap:R,shift:j,position:S,anchorRect:jt,arrowRef:Me,positionHelpers:Ye});const{menuRect:Dn}=Ye,ma=Dn.height;if(!je&&b!=="visible"){const{getTopOverflow:Ca,getBottomOverflow:Ma}=Ye;let On,Ct;const Yt=Ma(Ft);if(Yt>0)On=ma-Yt,Ct=Yt;else{const Rn=Ca(Ft);Rn<0&&(On=ma+Rn,Ct=0-Rn,On>=0&&(Ft-=Rn))}On>=0&&L({height:On,overflowAmt:Ct})}s&&I({x:En,y:na}),ae({x:ht,y:Ft}),Z(Ta)},[s,y,se,v,R,j,S,b,c,u,h,P,ge,_t]);Mr(()=>{et&&(Rt(),Re.current&&O()),Re.current=et},[et,Rt,_e]),Mr(()=>{k&&!E&&(we.current.scrollTop=0)},[k,E]),Mr(()=>Je,[Je]),B.useEffect(()=>{let{menu:je}=_t;if(!et||!je)return;if(je=je.addEventListener?je:window,!_t.anchors){_t.anchors=[];let Ye=vf(he&&he.current);for(;Ye&&Ye!==je;)_t.anchors.push(Ye),Ye=vf(Ye)}let tt=Ne;if(_t.anchors.length&&tt==="initial"&&(tt="auto"),tt==="initial")return;const yt=()=>{tt==="auto"?xf(()=>Rt(!0)):Sn(J,{reason:Zo.SCROLL})},jt=_t.anchors.concat(Ne!=="initial"?je:[]);return jt.forEach(Ye=>Ye.addEventListener("scroll",yt)),()=>jt.forEach(Ye=>Ye.removeEventListener("scroll",yt))},[he,_t,et,J,Ne,Rt]);const Na=!!k&&k.overflowAmt>0;B.useEffect(()=>{if(Na||!et||!x)return;const je=()=>xf(Rt),tt=x.current;return tt.addEventListener("scroll",je),()=>tt.removeEventListener("scroll",je)},[et,Na,x,Rt]),B.useEffect(()=>{if(!et||typeof ResizeObserver!="function"||me==="initial")return;const je=[],tt=new ResizeObserver(Ye=>Ye.forEach(({target:En})=>{je.indexOf(En)<0?je.push(En):Do.flushSync(()=>{Rt(),O()})})),yt={box:"border-box"};tt.observe(we.current,yt);const jt=u?.current;return jt&&tt.observe(jt,yt),()=>tt.disconnect()},[et,me,u,Rt]),B.useEffect(()=>{if(!et){de(Et.RESET),wn||L();return}const{position:je,alwaysUpdate:tt}=D||{},yt=()=>{je===vi.FIRST?de(Et.FIRST):je===vi.LAST?de(Et.LAST):je>=-1&&de(Et.SET_INDEX,void 0,je)};if(tt)yt();else if(T){const jt=setTimeout(()=>{const Ye=we.current;Ye&&!Ye.contains(document.activeElement)&&(Ye.focus(Ef),yt())},on?170:100);return()=>clearTimeout(jt)}},[et,on,wn,T,D,de]);const ea=B.useMemo(()=>({isParentOpen:et,submenuCtx:Y,dispatch:de,updateItems:Je}),[et,Y,de,Je]);let ta,pa;k&&(E?pa=k.overflowAmt:ta=k.height);const rn=B.useMemo(()=>({reposSubmenu:A,submenuCtx:Y,overflow:b,overflowAmt:pa,parentMenuRef:we,parentDir:$}),[A,Y,b,pa,$]),vt=ta>=0?{maxHeight:ta,overflow:b}:void 0,mt=B.useMemo(()=>({state:z,align:y,dir:$}),[z,y,$]),dt=B.useMemo(()=>({dir:$}),[$]),ka=nl({block:Ul,element:gk,modifiers:dt,className:r.className}),ga=m.jsxs("ul",{role:"menu","aria-label":n,...bf(C),...Go({onPointerEnter:Se?.off,onPointerMove:Bt,onPointerLeave:$t,onKeyDown:gt,onAnimationEnd:sn},U),ref:zr(p,we),className:nl({block:Ul,modifiers:mt,className:a}),style:{...i,...vt,margin:0,display:z==="closed"?"none":void 0,position:G0,left:F.x,top:F.y},children:[s&&m.jsx("li",{"aria-hidden":!0,...r,className:ka,style:{display:"block",position:G0,left:H.x,top:H.y,...r.style},ref:Me}),m.jsx(wf.Provider,{value:rn,children:m.jsx(Sf.Provider,{value:ea,children:m.jsx(q0.Provider,{value:le,children:Sn(K,mt)})})})]});return g?m.jsx(bk,{...g,isOpen:et,children:ga}):ga},Mk=B.forwardRef(function({"aria-label":a,className:i,containerProps:s,initialMounted:r,unmountOnClose:c,transition:u,transitionTimeout:h,boundingBoxRef:g,boundingBoxPadding:p,reposition:x="auto",submenuOpenDelay:y=300,submenuCloseDelay:v=150,viewScroll:S="initial",portal:b,theming:E,onItemClick:_,...T},z){const N=B.useRef(null),C=B.useRef({}),{anchorRef:D,state:R,onClose:j}=T,K=B.useMemo(()=>({initialMounted:r,unmountOnClose:c,transition:u,transitionTimeout:h,boundingBoxRef:g,boundingBoxPadding:p,rootMenuRef:N,rootAnchorRef:D,scrollNodesRef:C,reposition:x,viewScroll:S,submenuOpenDelay:y,submenuCloseDelay:v}),[r,c,u,h,D,g,p,x,S,y,v]),J=B.useMemo(()=>({handleClick(U,F){U.stopPropagation||Sn(_,U);let ae=U.keepOpen;ae===void 0&&(ae=F&&U.key===Qt.SPACE),ae||Sn(j,{value:U.value,key:U.key,reason:Zo.CLICK})},handleClose(U){Sn(j,{key:U,reason:Zo.CLICK})}}),[_,j]);if(!R)return null;const fe=m.jsx(Cr.Provider,{value:K,children:m.jsx(X0.Provider,{value:J,children:m.jsx(P0,{...T,ariaLabel:a||"Menu",externalRef:z,containerRef:N,containerProps:{className:i,containerRef:N,containerProps:s,theming:E,transition:u,onClose:j}})})});return b===!0&&typeof document<"u"?Do.createPortal(fe,document.body):b?b.target?Do.createPortal(fe,b.target):b.stablePosition?null:fe:fe}),_f=0,Af=1,Dr=2,Or=3,Rr=4,zk=5,W0=6,Dk=["preEnter","entering","entered","preExit","exiting","exited","unmounted"],ey=n=>({_s:n,status:Dk[n],isEnter:n<Or,isMounted:n!==W0,isResolved:n===Dr||n>Rr}),Nf=n=>n?W0:zk,Ok=(n,a)=>{switch(n){case Af:case _f:return Dr;case Rr:case Or:return Nf(a)}},Rk=n=>typeof n=="object"?[n.enter,n.exit]:[n,n],jk=(n,a)=>setTimeout(()=>{isNaN(document.body.offsetTop)||n(a+1)},0),ty=(n,a,i,s,r)=>{clearTimeout(s.current);const c=ey(n);a(c),i.current=c,r&&r({current:c})},Lk=({enter:n=!0,exit:a=!0,preEnter:i,preExit:s,timeout:r,initialEntered:c,mountOnEnter:u,unmountOnExit:h,onStateChange:g}={})=>{const[p,x]=B.useState(()=>ey(c?Dr:Nf(u))),y=B.useRef(p),v=B.useRef(),[S,b]=Rk(r),E=B.useCallback(()=>{const T=Ok(y.current._s,h);T&&ty(T,x,y,v,g)},[g,h]),_=B.useCallback(T=>{const z=C=>{switch(ty(C,x,y,v,g),C){case Af:S>=0&&(v.current=setTimeout(E,S));break;case Rr:b>=0&&(v.current=setTimeout(E,b));break;case _f:case Or:v.current=jk(z,C);break}},N=y.current.isEnter;typeof T!="boolean"&&(T=!N),T?!N&&z(n?i?_f:Af:Dr):N&&z(a?s?Or:Rr:Nf(h))},[E,g,n,a,i,s,S,b,h]);return[p,_,E]},Hk=({initialOpen:n,initialMounted:a,unmountOnClose:i,transition:s,transitionTimeout:r=500,onMenuChange:c}={})=>{const u=Xo(s,"open"),h=Xo(s,"close"),[{status:g},p,x]=Lk({initialEntered:n,mountOnEnter:!a,unmountOnExit:i,timeout:r,enter:u,exit:h,onStateChange:B.useCallback(({current:{isEnter:y,isResolved:v}})=>{!c||y&&u&&v||!y&&h&&v||c({open:y})},[c,u,h])});return[{state:vk[g],endTransition:x},p]},ny=n=>{const[a,i]=Hk(n),[s,r]=B.useState(),c=(u,h)=>{r({position:u,alwaysUpdate:h}),i(!0)};return[{menuItemFocus:s,...a},i,c]},Bk=(n,a)=>{const[i]=B.useState({});return{onMouseDown:()=>{i.v=n&&n!=="closed"},onClick:s=>i.v?i.v=!1:a(!0,s)}},Uk=parseInt(B.version)<19,ay=B.forwardRef(function({"aria-label":a,captureFocus:i,initialOpen:s,menuButton:r,instanceRef:c,onMenuChange:u,...h},g){const[p,x,y]=ny({...h,onMenuChange:u}),{state:v}=p,S=yf(v),b=B.useRef(null),E=Bk(v,(D,R)=>y(R.detail?void 0:vi.FIRST)),_=B.useCallback(D=>{x(!1),D.key&&b.current.focus()},[x]),T=D=>{switch(D.key){case Qt.UP:y(vi.LAST);break;case Qt.DOWN:y(vi.FIRST);break;default:return}D.preventDefault()},z=Sn(r,{open:S});if(!z||!z.type)throw new Error("Menu requires a menuButton prop.");const N={...Go({onKeyDown:T,...E},z.props),ref:zr(Uk?z.ref:z.props.ref,b)};uk(z.type)==="MenuButton"&&(N.isOpen=S);const C=B.cloneElement(z,N);return B.useImperativeHandle(c,()=>({openMenu:y,closeMenu:()=>x(!1)})),m.jsxs(B.Fragment,{children:[C,m.jsx(Mk,{...h,...p,"aria-label":a||(typeof z.props.children=="string"?z.props.children:"Menu"),anchorRef:b,ref:g,onClose:_})]})}),ly=(n,a)=>{const i=B.memo(a),s=B.forwardRef((r,c)=>{const u=B.useRef(null);return m.jsx(i,{...r,itemRef:u,externalRef:c,isHovering:B.useContext(q0)===u.current})});return s.displayName=`WithHovering(${n})`,s},iy=n=>{const[a,i]=B.useState(!1);return B.useEffect(()=>{!n&&i(!1)},[n]),[a,()=>!a&&i(!0),()=>i(!1)]},oy=(n,a,i)=>{Mr(()=>{if(n)return;const s=a.current;return i(s,!0),()=>{i(s)}},[n,a,i])},Vk=ly("SubMenu",function({"aria-label":a,className:i,disabled:s,direction:r,label:c,openTrigger:u,onMenuChange:h,isHovering:g,instanceRef:p,itemRef:x,captureFocus:y,repositionFlag:v,itemProps:S={},portal:b=!1,...E}){const _=B.useContext(Cr),{rootMenuRef:T,submenuOpenDelay:z,submenuCloseDelay:N}=_,{parentMenuRef:C,parentDir:D,overflow:R}=B.useContext(wf),{isParentOpen:j,submenuCtx:K,dispatch:J,updateItems:fe}=B.useContext(Sf),U=b||R!=="visible",[F,ae,H]=ny({..._,onMenuChange:h}),[I,k,L]=iy(g),{state:$}=F,Z=!!s,Y=yf($),A=B.useRef(null),[O]=B.useState({v:0}),G=()=>{K.off(),O.v&&(clearTimeout(O.v),O.v=0)},P=(...le)=>{G(),se(),!Z&&H(...le)},se=()=>!g&&!Z&&J(Et.SET,x.current),ge=le=>{se(),u||(O.v=setTimeout(()=>xf(P),Math.max(le,0)))},he=le=>{Z||(le.stopPropagation(),k(),!(O.v||Y)&&K.on(N,()=>ge(z-N),()=>ge(z)))},ue=()=>{L(),G(),Y||J(Et.UNSET,x.current)},me=le=>{if(g)switch(le.key){case Qt.ENTER:le.preventDefault();case Qt.SPACE:case Qt.RIGHT:u!=="none"&&P(vi.FIRST)}},Ne=le=>{let de=!1;switch(le.key){case Qt.LEFT:Y&&(x.current.focus(),ae(!1),de=!0);break;case Qt.RIGHT:Y||(de=!0);break}de&&(le.preventDefault(),le.stopPropagation())};oy(Z,x,fe),B.useEffect(()=>K.toggle(Y),[K,Y]),B.useEffect(()=>()=>{clearTimeout(O.v),K.toggle(!1)},[O,K]),B.useEffect(()=>{g&&j?x.current.focus():ae(!1)},[g,j,ae,x]),B.useImperativeHandle(p,()=>({openMenu:(...le)=>{j&&P(...le)},closeMenu:()=>{Y&&(x.current.focus(),ae(!1))}}));const ke=B.useMemo(()=>({open:Y,hover:I||g,disabled:Z,submenu:!0}),[Y,g,Z,I]),{ref:Se,className:_e,...we}=S,Me=Go({onPointerEnter:K.off,onPointerMove:he,onPointerLeave:ue,onKeyDown:me,onClick:()=>u!=="none"&&P()},we),Re=()=>{const le=m.jsx(P0,{...E,...F,ariaLabel:a||(typeof c=="string"?c:"Submenu"),anchorRef:x,containerRef:U?T:A,direction:r||(D==="right"||D==="left"?D:"right"),parentScrollingRef:U&&C,isDisabled:Z}),de=T.current;return U&&de?Do.createPortal(le,de):le};return m.jsxs("li",{className:nl({block:Ul,element:yk,className:i}),style:{position:"relative"},role:Z0,ref:A,onKeyDown:Ne,children:[m.jsx("div",{role:I0,"aria-haspopup":!0,"aria-expanded":Y,...bf(Z,g),...Me,ref:zr(Se,x),className:nl({block:Ul,element:Y0,modifiers:ke,className:_e}),children:B.useMemo(()=>Sn(c,ke),[c,ke])}),$&&Re()]})}),$k=(n,a,i,s)=>{const[r,c,u]=iy(i),{submenuCloseDelay:h}=B.useContext(Cr),{isParentOpen:g,submenuCtx:p,dispatch:x,updateItems:y}=B.useContext(Sf),v=()=>{!i&&!s&&x(Et.SET,n.current)},S=()=>{!s&&x(Et.UNSET,n.current)},b=T=>{i&&!T.currentTarget.contains(T.relatedTarget)&&S()},E=T=>{s||(T.stopPropagation(),c(),p.on(h,v,v))},_=(T,z)=>{u(),p.off(),!z&&S()};return oy(s,n,y),B.useEffect(()=>{i&&g&&a.current&&a.current.focus()},[a,i,g]),{mouseOver:r,setHover:v,onBlur:b,onPointerMove:E,onPointerLeave:_}},Kt=ly("MenuItem",function({className:a,value:i,href:s,type:r,checked:c,disabled:u,children:h,onClick:g,isHovering:p,itemRef:x,externalRef:y,...v}){const S=!!u,{mouseOver:b,setHover:E,..._}=$k(x,x,p,S),T=B.useContext(X0),z=B.useContext(xk),N=r==="radio",C=r==="checkbox",D=!!s&&!S&&!N&&!C,R=N?z.value===i:C?!!c:!1,j=F=>{if(S){F.stopPropagation(),F.preventDefault();return}const ae={value:i,syntheticEvent:F};F.key!==void 0&&(ae.key=F.key),C&&(ae.checked=!R),N&&(ae.name=z.name),Sn(g,ae),N&&Sn(z.onRadioChange,ae),T.handleClick(ae,C||N)},K=F=>{if(p)switch(F.key){case Qt.ENTER:F.preventDefault();case Qt.SPACE:D?x.current.click():j(F)}},J=B.useMemo(()=>({type:r,disabled:S,hover:b||p,checked:R,anchor:D}),[r,S,b,p,R,D]),fe=Go({..._,onPointerDown:E,onKeyDown:K,onClick:j},v),U={role:N?"menuitemradio":C?"menuitemcheckbox":I0,"aria-checked":N||C?R:void 0,...bf(S,p),...fe,ref:zr(y,x),className:nl({block:Ul,element:Y0,modifiers:J,className:a}),children:B.useMemo(()=>Sn(h,J),[h,J])};return D?m.jsx("li",{role:Z0,children:m.jsx("a",{href:s,...U})}):m.jsx("li",{...U})}),kf=B.memo(B.forwardRef(function({className:a,...i},s){return m.jsx("li",{role:"separator",...i,ref:s,className:nl({block:Ul,element:mk,className:a})})}));function Yk(n,a){let i;try{i=n()}catch{return}return{getItem:r=>{var c;const u=g=>g===null?null:JSON.parse(g,void 0),h=(c=i.getItem(r))!=null?c:null;return h instanceof Promise?h.then(u):u(h)},setItem:(r,c)=>i.setItem(r,JSON.stringify(c,void 0)),removeItem:r=>i.removeItem(r)}}const Tf=n=>a=>{try{const i=n(a);return i instanceof Promise?i:{then(s){return Tf(s)(i)},catch(s){return this}}}catch(i){return{then(s){return this},catch(s){return Tf(s)(i)}}}},qk=(n,a)=>(i,s,r)=>{let c={storage:Yk(()=>localStorage),partialize:E=>E,version:0,merge:(E,_)=>({..._,...E}),...a},u=!1;const h=new Set,g=new Set;let p=c.storage;if(!p)return n((...E)=>{console.warn(`[zustand persist middleware] Unable to update item '${c.name}', the given storage is currently unavailable.`),i(...E)},s,r);const x=()=>{const E=c.partialize({...s()});return p.setItem(c.name,{state:E,version:c.version})},y=r.setState;r.setState=(E,_)=>(y(E,_),x());const v=n((...E)=>(i(...E),x()),s,r);r.getInitialState=()=>v;let S;const b=()=>{var E,_;if(!p)return;u=!1,h.forEach(z=>{var N;return z((N=s())!=null?N:v)});const T=((_=c.onRehydrateStorage)==null?void 0:_.call(c,(E=s())!=null?E:v))||void 0;return Tf(p.getItem.bind(p))(c.name).then(z=>{if(z)if(typeof z.version=="number"&&z.version!==c.version){if(c.migrate){const N=c.migrate(z.state,z.version);return N instanceof Promise?N.then(C=>[!0,C]):[!0,N]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,z.state];return[!1,void 0]}).then(z=>{var N;const[C,D]=z;if(S=c.merge(D,(N=s())!=null?N:v),i(S,!0),C)return x()}).then(()=>{T?.(S,void 0),S=s(),u=!0,g.forEach(z=>z(S))}).catch(z=>{T?.(void 0,z)})};return r.persist={setOptions:E=>{c={...c,...E},E.storage&&(p=E.storage)},clearStorage:()=>{p?.removeItem(c.name)},getOptions:()=>c,rehydrate:()=>b(),hasHydrated:()=>u,onHydrate:E=>(h.add(E),()=>{h.delete(E)}),onFinishHydration:E=>(g.add(E),()=>{g.delete(E)})},c.skipHydration||b(),S||v};var sy=(n,a,i)=>(r,c)=>({pastStates:i?.pastStates||[],futureStates:i?.futureStates||[],undo:(u=1)=>{if(c().pastStates.length){const h=i?.partialize?.(a())||a(),g=c().pastStates.splice(-u,u),p=g.shift();n(p),r({pastStates:c().pastStates,futureStates:c().futureStates.concat(i?.diff?.(h,p)||h,g.reverse())})}},redo:(u=1)=>{if(c().futureStates.length){const h=i?.partialize?.(a())||a(),g=c().futureStates.splice(-u,u),p=g.shift();n(p),r({pastStates:c().pastStates.concat(i?.diff?.(h,p)||h,g.reverse()),futureStates:c().futureStates})}},clear:()=>r({pastStates:[],futureStates:[]}),isTracking:!0,pause:()=>r({isTracking:!1}),resume:()=>r({isTracking:!0}),setOnSave:u=>r({_onSave:u}),_onSave:i?.onSave,_handleSet:(u,h,g,p)=>{i?.limit&&c().pastStates.length>=i?.limit&&c().pastStates.shift(),c()._onSave?.(u,g),r({pastStates:c().pastStates.concat(p||u),futureStates:[]})}}),Xk=(n,a)=>(s,r,c)=>{c.temporal=B0(a?.wrapTemporal?.(sy(s,r,a))||sy(s,r,a));const u=a?.handleSet?.(c.temporal.getState()._handleSet)||c.temporal.getState()._handleSet,h=p=>{if(!c.temporal.getState().isTracking)return;const x=a?.partialize?.(r())||r(),y=a?.diff?.(p,x);y===null||a?.equality?.(p,x)||u(p,void 0,x,y)},g=c.setState;return c.setState=(...p)=>{const x=a?.partialize?.(r())||r();g(...p),h(x)},n((...p)=>{const x=a?.partialize?.(r())||r();s(...p),h(x)},r,c)};const{useSyncExternalStoreWithSelector:Gk}=Xg,Zk=n=>n;function Ik(n,a=Zk,i){const s=Gk(n.subscribe,n.getState,n.getInitialState,a,i);return Ka.useDebugValue(s),s}var Cf,ry;function Qk(){return ry||(ry=1,Cf=function n(a,i){if(a===i)return!0;if(a&&i&&typeof a=="object"&&typeof i=="object"){if(a.constructor!==i.constructor)return!1;var s,r,c;if(Array.isArray(a)){if(s=a.length,s!=i.length)return!1;for(r=s;r--!==0;)if(!n(a[r],i[r]))return!1;return!0}if(a.constructor===RegExp)return a.source===i.source&&a.flags===i.flags;if(a.valueOf!==Object.prototype.valueOf)return a.valueOf()===i.valueOf();if(a.toString!==Object.prototype.toString)return a.toString()===i.toString();if(c=Object.keys(a),s=c.length,s!==Object.keys(i).length)return!1;for(r=s;r--!==0;)if(!Object.prototype.hasOwnProperty.call(i,c[r]))return!1;for(r=s;r--!==0;){var u=c[r];if(!n(a[u],i[u]))return!1}return!0}return a!==a&&i!==i}),Cf}var Kk=Qk();const Fk=ii(Kk);function Jk(n,a,i){var s=i||{},r=s.noTrailing,c=r===void 0?!1:r,u=s.noLeading,h=u===void 0?!1:u,g=s.debounceMode,p=g===void 0?void 0:g,x,y=!1,v=0;function S(){x&&clearTimeout(x)}function b(_){var T=_||{},z=T.upcomingOnly,N=z===void 0?!1:z;S(),y=!N}function E(){for(var _=arguments.length,T=new Array(_),z=0;z<_;z++)T[z]=arguments[z];var N=this,C=Date.now()-v;if(y)return;function D(){v=Date.now(),a.apply(N,T)}function R(){x=void 0}!h&&p&&!x&&D(),S(),p===void 0&&C>n?h?(v=Date.now(),c||(x=setTimeout(p?R:D,n))):D():c!==!0&&(x=setTimeout(p?R:D,p===void 0?n-C:n))}return E.cancel=b,E}function cy(n){n=n.trim(),n.match(/^[a-z]+:\/\//i)||(n="https://"+n);try{const a=new URL(n);return["http:","https:","mailto:"].includes(a.protocol)?a.href:null}catch{return null}}function Pk(n){const a=[],i=/\[([^\]]+)\]\(([^)]+)\)|(https?:\/\/[^\s<>"{}|\\^`\[\]]+)/g,s=Array.from(n.matchAll(i));let r=0;return s.forEach((c,u)=>{if(c.index!==void 0&&c.index>r&&a.push(n.substring(r,c.index)),c[1]&&c[2]){const h=c[1],g=c[2],p=cy(g);p?a.push(m.jsx("a",{href:p,target:"_blank",rel:"noopener noreferrer",style:{color:"#3b82f6",textDecoration:"underline"},children:h},u)):a.push(`[${h}](${g})`)}else if(c[3]){const h=c[3],g=cy(h);g?a.push(m.jsx("a",{href:g,target:"_blank",rel:"noopener noreferrer",style:{color:"#3b82f6",textDecoration:"underline"},children:h},u)):a.push(h)}c.index!==void 0&&(r=c.index+c[0].length)}),r<n.length&&a.push(n.substring(r)),a.length>0?a:[n]}var uy=({data:n,selected:a})=>m.jsx(m.Fragment,{children:n.data?m.jsxs(m.Fragment,{children:[m.jsx(Qu,{isVisible:a,keepAspectRatio:!0}),m.jsxs("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",width:"100%",height:"100%",overflow:"hidden",gap:"4px"},children:[m.jsx("img",{src:n.data,style:{maxWidth:"100%",maxHeight:n.caption?"calc(100% - 24px)":"100%",objectFit:"contain"}}),n.caption&&m.jsx("div",{style:{fontSize:"11px",color:"#6b7280",textAlign:"center",padding:"0 4px",lineHeight:"1.3"},children:Pk(n.caption)})]})]}):m.jsx("span",{children:"No Image"})}),Io={S:10,M:14,L:18,XL:24},fy="M",Wk=10,eT=14,tT=18;function dy(n){return n<=Wk?"S":n<=eT?"M":n<=tT?"L":"XL"}function hy(n){return typeof n=="number"?Io[dy(n)]:n&&n in Io?Io[n]:Io[fy]}function nT(n){return n?dy(n):fy}var py=({data:n,selected:a,isConnectable:i,...s})=>m.jsxs(m.Fragment,{children:[i&&m.jsx(Qu,{isVisible:a}),m.jsx(ZN,{className:"icon"}),m.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",width:"100%",height:"100%",textAlign:"center"},children:[m.jsx("div",{style:{fontWeight:600,fontSize:`${hy(n.fontSize)}px`},children:n.label||"Untitled"}),n.summary&&m.jsx("div",{style:{fontSize:"12px",color:"#4b5563",marginTop:"4px"},children:n.summary})]}),["Bottom","Top","Left","Right"].map(r=>m.jsx(el,{type:"source",position:be[r],style:{visibility:i?"visible":"hidden"},id:r.toLowerCase(),isConnectable:!0},`${r}-source`)),["Bottom","Top","Left","Right"].map(r=>m.jsx(el,{type:"target",position:be[r],style:{visibility:i?"visible":"hidden"},id:r.toLowerCase(),isConnectable:!0},`${r}-target`))]}),gy=({data:n})=>m.jsx(m.Fragment,{children:m.jsx("div",{style:{fontSize:n.fontSize||32,color:n.color||"#e5e7eb",fontWeight:"bold",transform:`rotate(${n.rotation||0}deg)`},children:n.text||"No Text"})}),aT=n=>m.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",fill:"none",className:n.className,stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",viewBox:"0 0 24 24",children:[m.jsx("circle",{cx:"12",cy:"12",r:"10"}),m.jsx("path",{d:"M11.051 7.616a1 1 0 0 1 1.909.024l.737 1.452a1 1 0 0 0 .737.535l1.634.256a1 1 0 0 1 .588 1.806l-1.172 1.168a1 1 0 0 0-.282.866l.259 1.613a1 1 0 0 1-1.541 1.134l-1.465-.75a1 1 0 0 0-.912 0l-1.465.75a1 1 0 0 1-1.539-1.133l.258-1.613a1 1 0 0 0-.282-.867l-1.156-1.152a1 1 0 0 1 .572-1.822l1.633-.256a1 1 0 0 0 .737-.535z"})]}),Mf=aT,my=({data:n,selected:a,isConnectable:i})=>m.jsxs(m.Fragment,{children:[i&&m.jsx(Qu,{isVisible:a}),n.state==="mastered"&&m.jsx(Mf,{className:"icon"}),m.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",width:"100%",height:"100%",textAlign:"center"},children:[m.jsx("div",{style:{fontWeight:600,fontSize:`${hy(n.fontSize)}px`},children:n.label||"Untitled"}),n.summary&&m.jsx("div",{style:{fontSize:"12px",color:"#4b5563",marginTop:"4px"},children:n.summary})]}),["Bottom","Top","Left","Right"].map(s=>m.jsx(el,{type:"source",style:{visibility:i?"visible":"hidden"},position:be[s],id:s.toLowerCase(),isConnectable:!0},`${s}-source`)),["Bottom","Top","Left","Right"].map(s=>m.jsx(el,{type:"target",style:{visibility:i?"visible":"hidden"},position:be[s],id:s.toLowerCase(),isConnectable:!0},`${s}-target`))]});function yy(n,a){const{width:i,height:s}=n.measured,r=n.internals.positionAbsolute,c=a.internals.positionAbsolute,u=i/2,h=s/2,g=r.x+u,p=r.y+h,x=c.x+a.measured.width/2,y=c.y+a.measured.height/2,v=(x-g)/(2*u)-(y-p)/(2*h),S=(x-g)/(2*u)+(y-p)/(2*h),b=1/(Math.abs(v)+Math.abs(S)),E=b*v,_=b*S,T=u*(E+_)+g,z=h*(-E+_)+p;return{x:T,y:z}}function xy(n,a){const i={...n.internals.positionAbsolute,...n},s=Math.round(i.x),r=Math.round(i.y),c=Math.round(a.x),u=Math.round(a.y);return c<=s+1?be.Left:c>=s+i.measured.width-1?be.Right:u<=r+1?be.Top:u>=i.y+i.measured.height-1?be.Bottom:be.Top}function lT(n,a){const i=yy(n,a),s=yy(a,n),r=xy(n,i),c=xy(a,s);return{sx:i.x,sy:i.y,tx:s.x,ty:s.y,sourcePos:r,targetPos:c}}var Qo={settings:{title:"New Roadmap",viewport:{x:0,y:0,zoom:1}},version:1,nodes:[],edges:[]},iT=n=>{let a={};if(typeof n!="string")a=n;else try{a=JSON.parse(n)}catch{}return{...Qo,...a,settings:{...Qo.settings,...a.settings,viewport:{...Qo.settings.viewport,...a.settings?.viewport||{}}},nodes:a.nodes||Qo.nodes,edges:a.edges||Qo.edges}},oT=()=>{const n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";return[9,11,1].map(i=>{let s="";for(let r=0;r<i;r++)s+=n.charAt(Math.floor(Math.random()*n.length));return s}).join("-")};function sT(n){return typeof n=="string"&&(n.includes("youtube.com/watch?v=")||n.includes("youtu.be/"))}function rT(n){return n.includes("youtube.com/watch?v=")?`https://www.youtube-nocookie.com/embed/${n.split("v=")[1].split("&")[0]}`:n.includes("youtu.be/")?`https://www.youtube-nocookie.com/embed/${n.split("youtu.be/")[1].split("?")[0]}`:n}function cT(n){return n.endsWith(".webm")?"video/webm":(n.endsWith(".mp4"),"video/mp4")}var uT=({url:n,title:a})=>{if(sT(n)){const i=rT(n);return m.jsx("div",{className:"video-container",style:{position:"relative",paddingBottom:"56.25%",height:0,overflow:"hidden",marginBottom:16},children:m.jsx("iframe",{src:i,title:a||"YouTube video",frameBorder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})}else{const i=cT(n);return m.jsxs("video",{controls:!0,style:{width:"100%",maxHeight:"400px",marginBottom:16},children:[m.jsx("source",{src:n,type:i}),"Your browser does not support the video tag."]})}},fT={nodes:"Nodes",addTask:"Add Task",addTopic:"Add Topic",addImage:"Add Image",addText:"Add Text",settings:"Settings",debug:"Debug",enableDebugMode:"Enable Debug Mode",showCompletionNeedsEdges:"Show Completion Needs Edges",showCompletionOptionalEdges:"Show Completion Optional Edges",showUnlockAfterEdges:"Show Unlock After Edges",preview:"Preview",save:"Save",download:"Download",open:"Open",exportAsSVG:"Export as SVG",undo:"Undo",redo:"Redo",reset:"Reset",help:"Help",unsavedChanges:"Unsaved Changes (Click to save or press Ctrl+S)",keyboardShortcuts:"Keyboard Shortcuts",action:"Action",shortcut:"Shortcut",close:"Close",shortcuts:{save:"Save",undo:"Undo",redo:"Redo",addTaskNode:"Add Task Node",addTopicNode:"Add Topic Node",addImageNode:"Add Image Node",addTextNode:"Add Text Node",deleteNodeEdge:"Delete Node/Edge",togglePreviewMode:"Toggle Preview Mode",toggleDebugMode:"Toggle Debug Mode",selectMultipleNodes:"Select Multiple Nodes",selectAllNodes:"Select All Nodes",showHelp:"Show Help",zoomIn:"Zoom In",zoomOut:"Zoom Out",resetZoom:"Reset Zoom",fitView:"Fit View",zoomToSelection:"Zoom to Selection",toggleGrid:"Toggle Grid",resetMap:"Reset Map",cut:"Cut",copy:"Copy",paste:"Paste"},editTask:"Edit Task",editTopic:"Edit Topic",editImage:"Edit Image",editText:"Edit Text",backgroundSettings:"Background Settings",editEdge:"Edit Edge",nodeColor:"Node Color",label:"Label",labelRequired:"Label *",summary:"Summary",description:"Description",duration:"Duration",videoURL:"Video URL",resources:"Resources",addResource:"Add Resource",unlockPassword:"Unlock Password",unlockDate:"Unlock Date",unlockAfter:"Unlock After",completionNeeds:"Completion Needs",completionOptional:"Completion Optional",backgroundColor:"Background Color",text:"Text",fontSize:"Font Size",color:"Color",image:"Image",width:"Width",height:"Height",rotation:"Rotation",opacity:"Opacity",edgeColor:"Color",edgeWidth:"Width",edgeType:"Type",animated:"Animated",placeholderNodeLabel:"Node label",placeholderTitleLabel:"Lerningmap label",placeholderShortSummary:"Short summary",placeholderDetailedDescription:"Detailed description",placeholderVideoURL:"YouTube or video URL",placeholderLabel:"Label",placeholderURL:"URL",placeholderOptionalPassword:"Optional password",placeholderBackgroundText:"Background Text",selectNode:"Select node...",deleteNode:"Delete Node",saveChanges:"Save Changes",deleteEdge:"Delete Edge",copyNode:"Copy",openFileWarning:"Opening a file will replace your current map. Continue?",resetMapWarning:"Are you sure you want to reset the map? This action cannot be undone.",failedToLoadFile:"Failed to load the file. Please make sure it is a valid roadmap JSON file.",failedToExportSVG:"Failed to export SVG: ",loadExternalWarning:"Loading an external learningmap will replace your existing content. You can back up your current learningmap first by using one of the options below.",loadExternalBackupPrompt:"Would you like to back up your current learningmap before loading the external one?",emptyMapCannotBeShared:"An empty learningmap cannot be shared.",uploadFailed:"Upload failed. Please try again!",uploadFileTooLarge:"Sharing bigger files is not allowed. You can still download your learningmap and share it via other means.",loadFailed:"Failed to load. Please check the URL.",share:"Share",shareLink:"Share Link",copyLink:"Copy Link",linkCopied:"Link copied to clipboard!",downloadCurrentMap:"Download Current Map",replaceWithExternal:"Replace with External Map",blue:"Blue",yellow:"Yellow",lila:"Lila",pink:"Pink",teal:"Teal",red:"Red",black:"Black",white:"White",newTask:"New task",newTopic:"New topic",backgroundTextDefault:"Background Text",noText:"No Text",untitled:"Untitled",alignLeftHorizontal:"Align Left Horizontal",alignCenterHorizontal:"Align Center Horizontal",alignRightHorizontal:"Align Right Horizontal",alignTopVertical:"Align Top Vertical",alignCenterVertical:"Align Center Vertical",alignBottomVertical:"Align Bottom Vertical",distributeHorizontally:"Distribute Horizontally",distributeVertically:"Distribute Vertically",default:"Default",straight:"Straight",step:"Step",smoothstep:"Smooth Step",floating:"Floating",resourcesLabel:"Resources:",unlockConditionsMessage:"Complete the following nodes first to unlock this one:",completionNeedsMessage:"The following nodes need to be completed or mastered before this one is completed:",locked:"Locked",markAsStarted:"Mark as Started",markAsCompleted:"Mark as Completed",completedLabel:"Completed",mastered:"Mastered",completedTitle:"Completed",masteredTitle:"Mastered",finishNeedsToComplete:"Finish needs to complete",finishOptionalToMaster:"Finish optional to master",languageLabel:"Language",languageEnglish:"English",languageGerman:"German",initialViewport:"Initial Viewport",viewportX:"X Position",viewportY:"Y Position",viewportZoom:"Zoom",useCurrentViewport:"Use Current Viewport",storageId:"ID",generateRandomId:"Generate Random ID",storageIdHint:"Learning maps with the same ID will share the same state when a student is working on it.",welcomeTitle:"Learningmap",welcomeSubtitle:"All data is stored locally in your browser",welcomeOpenFile:"Open File",welcomeAddTopic:"Add Topic",welcomeHelp:"Help",fontSizeSmall:"Small",fontSizeMedium:"Medium",fontSizeLarge:"Large",fontSizeXLarge:"Extra Large",caption:"Caption",placeholderImageCaption:"Add caption (supports [markdown links](url))"},dT={nodes:"Knoten",addTask:"Aufgabe hinzufügen",addTopic:"Thema hinzufügen",addImage:"Bild hinzufügen",addText:"Text hinzufügen",settings:"Einstellungen",debug:"Debug",enableDebugMode:"Debug-Modus aktivieren",showCompletionNeedsEdges:"Abschluss-Benötigte Kanten anzeigen",showCompletionOptionalEdges:"Abschluss-Optionale Kanten anzeigen",showUnlockAfterEdges:"Entsperr-Nach Kanten anzeigen",preview:"Vorschau",save:"Speichern",download:"Herunterladen",open:"Öffnen",exportAsSVG:"Als SVG exportieren",undo:"Rückgängig",redo:"Wiederholen",reset:"Zurücksetzen",help:"Hilfe",unsavedChanges:"Ungespeicherte Änderungen (Klicken zum Speichern oder Strg+S drücken)",keyboardShortcuts:"Tastaturkürzel",action:"Aktion",shortcut:"Tastenkombination",close:"Schließen",shortcuts:{save:"Speichern",undo:"Rückgängig",redo:"Wiederholen",addTaskNode:"Aufgaben-Knoten hinzufügen",addTopicNode:"Themen-Knoten hinzufügen",addImageNode:"Bild-Knoten hinzufügen",addTextNode:"Text-Knoten hinzufügen",deleteNodeEdge:"Knoten/Kante löschen",togglePreviewMode:"Vorschau-Modus umschalten",toggleDebugMode:"Debug-Modus umschalten",selectMultipleNodes:"Mehrere Knoten auswählen",selectAllNodes:"Alle Knoten auswählen",showHelp:"Hilfe anzeigen",zoomIn:"Vergrößern",zoomOut:"Verkleinern",resetZoom:"Zoom zurücksetzen",fitView:"Alles anzeigen",zoomToSelection:"Auswahl anzeigen",toggleGrid:"Raster umschalten",resetMap:"Karte zurücksetzen",cut:"Ausschneiden",copy:"Kopieren",paste:"Einfügen"},editTask:"Aufgabe bearbeiten",editTopic:"Thema bearbeiten",editImage:"Bild bearbeiten",editText:"Text bearbeiten",backgroundSettings:"Hintergrund-Einstellungen",editEdge:"Kante bearbeiten",nodeColor:"Knotenfarbe",label:"Bezeichnung",labelRequired:"Bezeichnung *",summary:"Zusammenfassung",description:"Beschreibung",duration:"Dauer",videoURL:"Video-URL",resources:"Ressourcen",addResource:"Ressource hinzufügen",unlockPassword:"Entsperr-Passwort",unlockDate:"Entsperr-Datum",unlockAfter:"Entsperren nach",completionNeeds:"Abschluss benötigt",completionOptional:"Abschluss optional",backgroundColor:"Hintergrundfarbe",text:"Text",fontSize:"Schriftgröße",color:"Farbe",image:"Bild",width:"Breite",height:"Höhe",rotation:"Drehung",opacity:"Deckkraft",edgeColor:"Farbe",edgeWidth:"Breite",edgeType:"Typ",animated:"Animiert",placeholderNodeLabel:"Knotenbezeichnung",placeholderTitleLabel:"Lernkartenbezeichnung",placeholderShortSummary:"Kurze Zusammenfassung",placeholderDetailedDescription:"Detaillierte Beschreibung",placeholderVideoURL:"YouTube oder Video-URL",placeholderLabel:"Bezeichnung",placeholderURL:"URL",placeholderOptionalPassword:"Optionales Passwort",placeholderBackgroundText:"Hintergrundtext",selectNode:"Knoten auswählen...",deleteNode:"Knoten löschen",saveChanges:"Änderungen speichern",deleteEdge:"Kante löschen",copyNode:"Kopieren",openFileWarning:"Das Öffnen einer Datei ersetzt Ihre aktuelle Karte. Fortfahren?",resetMapWarning:"Sind Sie sicher, dass Sie die Karte zurücksetzen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",failedToLoadFile:"Datei konnte nicht geladen werden. Bitte stellen Sie sicher, dass es sich um eine gültige Roadmap-JSON-Datei handelt.",failedToExportSVG:"SVG-Export fehlgeschlagen: ",loadExternalWarning:"Das Laden einer externen Learningmap ersetzt Ihren aktuellen Inhalt. Sie können Ihre aktuelle Learningmap zuerst sichern, indem Sie eine der folgenden Optionen verwenden.",loadExternalBackupPrompt:"Möchten Sie Ihre aktuelle Learningmap sichern, bevor Sie die externe laden?",emptyMapCannotBeShared:"Eine leere Learningmap kann nicht geteilt werden.",uploadFailed:"Beim Upload ist was schief gelaufen. Bitte versuche es erneut!",uploadFileTooLarge:"Das Teilen größerer Dateien ist nicht erlaubt. Du kannst deine Learningmap weiterhin herunterladen und über andere Wege teilen.",loadFailed:"Beim Laden ist etwas schief gegangen. Bitte überprüfe die URL.",share:"Teilen",shareLink:"Link teilen",copyLink:"Link kopieren",linkCopied:"Link in die Zwischenablage kopiert!",downloadCurrentMap:"Aktuelle Karte herunterladen",replaceWithExternal:"Mit externer Karte ersetzen",blue:"Blau",yellow:"Gelb",lila:"Lila",pink:"Rosa",teal:"Türkis",red:"Rot",black:"Schwarz",white:"Weiß",newTask:"Neue Aufgabe",newTopic:"Neues Thema",backgroundTextDefault:"Hintergrundtext",noText:"Kein Text",untitled:"Ohne Titel",alignLeftHorizontal:"Horizontal links ausrichten",alignCenterHorizontal:"Horizontal zentrieren",alignRightHorizontal:"Horizontal rechts ausrichten",alignTopVertical:"Vertikal oben ausrichten",alignCenterVertical:"Vertikal zentrieren",alignBottomVertical:"Vertikal unten ausrichten",distributeHorizontally:"Horizontal verteilen",distributeVertically:"Vertikal verteilen",default:"Standard",straight:"Gerade",step:"Stufe",smoothstep:"Weiche Stufe",floating:"Schwebend",resourcesLabel:"Ressourcen:",unlockConditionsMessage:"Vervollständige zuerst die folgenden Knoten, um diesen freizuschalten:",completionNeedsMessage:"Die folgenden Knoten müssen abgeschlossen oder gemeistert werden, bevor dieser abgeschlossen ist:",locked:"Gesperrt",markAsStarted:"Als begonnen markieren",markAsCompleted:"Als abgeschlossen markieren",completedLabel:"Abgeschlossen",mastered:"Gemeistert",completedTitle:"Abgeschlossen",masteredTitle:"Gemeistert",finishNeedsToComplete:"Benötigtes abschließen",finishOptionalToMaster:"Optionale zum Meistern abschließen",languageLabel:"Sprache",languageEnglish:"Englisch",languageGerman:"Deutsch",initialViewport:"Initialer Ansichtsbereich",viewportX:"X-Position",viewportY:"Y-Position",viewportZoom:"Zoom",useCurrentViewport:"Aktuellen Ansichtsbereich verwenden",storageId:"ID",generateRandomId:"Zufällige ID generieren",storageIdHint:"Lernkarten mit der gleichen ID teilen sich den gleichen Zustand, wenn ein Schüler daran arbeitet.",welcomeTitle:"Learningmap",welcomeSubtitle:"Alle Daten werden lokal in Ihrem Browser gespeichert",welcomeOpenFile:"Datei öffnen",welcomeAddTopic:"Thema hinzufügen",welcomeHelp:"Hilfe",fontSizeSmall:"Klein",fontSizeMedium:"Mittel",fontSizeLarge:"Groß",fontSizeXLarge:"Extra Groß",caption:"Bildunterschrift",placeholderImageCaption:"Bildunterschrift hinzufügen (unterstützt [Markdown-Links](url))"},vy={en:fT,de:dT};function Vt(n="en"){return vy[n]||vy.en}function hT(n,a){const i=[];return n.data?.unlock?.after&&n.data.unlock.after.forEach(s=>{const r=a.find(c=>c.id===s);r&&r.data?.state!=="completed"&&r.data?.state!=="mastered"&&i.push(r)}),i}function pT(n,a){const i=[];return n.data?.completion?.needs&&n.data.completion.needs.forEach(s=>{const r=a.find(c=>c.id===s);r&&r.data?.state!=="completed"&&r.data?.state!=="mastered"&&i.push(r)}),i}function gT(n,a){const i=[];return n.data?.completion?.optional&&n.data.completion.optional.forEach(s=>{const r=a.find(c=>c.id===s);r&&r.data?.state!=="completed"&&r.data?.state!=="mastered"&&i.push(r)}),i}function mT({open:n,onClose:a,onUpdate:i,node:s,nodes:r,onNodeClick:c,language:u="en"}){const h=Vt(u),g=B.useMemo(()=>{if(!s||!s.data?.description)return"";const z=Fe.parse(s.data.description,{async:!1});return ok.sanitize(z)},[s,s?.data?.description]);if(!n||!s)return null;const p=s.data?.state==="locked"||!1,x=s.data?.state==="unlocked"||!1,y=s.data?.state==="completed"||!1,v=s.data?.state==="started"||!1,S=s.data?.state==="mastered"||!1,b=hT(s,r),E=pT(s,r),_=gT(s,r),T=z=>()=>{s.type==="topic"||p||i({...s,data:{...s.data,state:z}})};return m.jsxs(m.Fragment,{children:[m.jsx("div",{className:"drawer-overlay",onClick:a}),m.jsxs("aside",{className:"drawer",children:[m.jsxs("header",{className:"drawer-header",children:[m.jsxs("div",{children:[m.jsx("h2",{className:"drawer-title",children:s.data?.label}),s.data?.duration&&m.jsx("div",{style:{fontSize:16,color:"#6b7280",marginTop:4},children:s.data.duration})]}),m.jsx("button",{className:"close-button",onClick:a,"aria-label":"Close",children:m.jsx(da,{size:20})})]}),m.jsxs("div",{className:"drawer-content",children:[b.length>0?m.jsxs("div",{className:"drawer-unlock-conditions",style:{marginBottom:16},children:[m.jsx("div",{style:{fontWeight:600,marginBottom:8},children:h.unlockConditionsMessage}),m.jsx("ul",{children:b.map(z=>m.jsx("li",{children:m.jsxs("button",{className:"link-button",onClick:()=>{c(null,z,!0)},children:[z.data?.label||z.id," - ",z.data?.state==="locked"?"🔒":"🔓"]})},z.id))})]}):m.jsxs(m.Fragment,{children:[s.data?.description&&m.jsx("div",{className:"drawer-description",style:{marginBottom:16},dangerouslySetInnerHTML:{__html:g}}),s.data?.video&&m.jsx("div",{className:"drawer-video",style:{marginBottom:16},children:m.jsx(uT,{url:s.data?.video})}),s.data?.resources&&s.data?.resources.length>0&&m.jsxs("div",{className:"drawer-resources",style:{marginBottom:16},children:[m.jsx("div",{style:{fontWeight:600,marginBottom:8},children:h.resourcesLabel}),m.jsx("ul",{children:s.data?.resources.map((z,N)=>{if(z.type==="book"){const C=[];z.bookName&&C.push(z.bookName),z.bookLocation&&C.push(z.bookLocation);const D=C.length>0?` (${C.join(", ")})`:"";return m.jsxs("li",{children:["📚 ",m.jsx("strong",{children:z.label}),D]},N)}return m.jsxs("li",{children:["🌐 ",z.url?m.jsx("a",{href:z.url,target:"_blank",rel:"noopener noreferrer",children:z.label}):m.jsx("span",{children:z.label})]},N)})})]})]}),!p&&E.length>0&&m.jsxs("div",{className:"drawer-completion-needs",style:{marginBottom:16},children:[m.jsx("div",{style:{fontWeight:600,marginBottom:8},children:h.completionNeedsMessage}),m.jsx("ul",{children:E.map(z=>m.jsx("li",{children:m.jsxs("button",{className:"link-button",onClick:()=>{c(null,z,!0)},children:[z.data?.label||z.id," - ",z.data?.state]})},z.id))})]})]}),m.jsx("div",{className:"drawer-footer",children:s.type==="topic"?m.jsxs(m.Fragment,{children:[!p&&E.length>0&&m.jsx("button",{className:"drawer-button needs",disabled:!0,children:h.finishNeedsToComplete}),!p&&E.length===0&&_.length>0&&m.jsx("button",{className:"drawer-button optional",disabled:!0,children:h.finishOptionalToMaster}),!p&&E.length===0&&_.length===0&&m.jsxs("button",{className:"drawer-button completed",disabled:!0,children:[m.jsx(Ku,{})," ",h.mastered]}),p&&m.jsxs("button",{className:"drawer-button locked",children:[m.jsx(o0,{})," ",h.locked]})]}):m.jsxs(m.Fragment,{children:[p&&m.jsxs("button",{className:"drawer-button locked",children:[m.jsx(o0,{})," ",h.locked]}),x&&m.jsx("button",{className:"drawer-button unlocked",onClick:T("started"),children:h.markAsStarted}),v&&m.jsx("button",{className:"drawer-button started",onClick:T("completed"),children:h.markAsCompleted}),y&&m.jsxs("button",{className:"drawer-button completed",disabled:!0,children:[m.jsx(Ku,{})," ",h.completedLabel]}),S&&m.jsxs("button",{className:"drawer-button mastered",disabled:!0,children:[m.jsx(Mf,{})," ",h.mastered]})]})})]})]})}var yT=({completed:n,mastered:a,total:i,language:s="en"})=>{const r=Vt(s),c=i>0?n/i*100:0;return m.jsxs(m.Fragment,{children:[m.jsxs("span",{className:"completed-counter",title:r.completedTitle,style:{display:"flex",alignItems:"center",gap:"4px"},children:[m.jsx(Ku,{}),n," / ",i]}),m.jsxs("div",{className:"progress-bar-container",children:[m.jsxs("span",{className:"progress-value",children:[c.toFixed(0),"%"]}),m.jsx("div",{className:"progress-bar-fill",style:{width:`${c}%`}})]}),m.jsxs("span",{className:"mastered-counter",title:r.masteredTitle,style:{display:"flex",alignItems:"center",gap:"4px"},children:[m.jsx(Mf,{}),a]})]})},xT=n=>{const a={};return n.forEach(i=>{i.data?.state&&(a[i.id]=i.data.state)}),a},zf=n=>n==="completed"||n==="mastered",by=n=>n.type==="task"||n.type==="topic",Df=n=>{const a=[...n];for(let i=0;i<2;i++){const s=xT(a);for(const r of a){if(r.data.state=r.data?.state||"locked",r.data?.unlock?.after&&(r.data.unlock.after.every(u=>zf(s[u]))?r.data.state==="locked"&&(r.data.state="unlocked"):r.data.state="locked"),r.data?.unlock?.date){const c=new Date(r.data.unlock.date);new Date>=c?r.data.state==="locked"&&(r.data.state="unlocked"):r.data.state="locked"}if(!r.data?.unlock?.after&&!r.data?.unlock?.date&&r.data.state==="locked"&&(r.data.state="unlocked"),r.type==="topic"){if(r.data?.completion?.needs){const c=r.data.completion.needs.every(u=>zf(s[u]));r.data.state==="unlocked"&&c&&(r.data.state="completed")}else!r.data?.completion?.needs&&r.data.state==="unlocked"&&(r.data.state="completed");if(r.data?.completion?.optional){const c=r.data.completion.optional.every(u=>zf(s[u]));r.data.state==="completed"&&c&&(r.data.state="mastered")}else!r.data?.completion?.optional&&r.data.state==="completed"&&(r.data.state="mastered")}}}return a},Wn=U0()((n,a)=>({nodes:[],edges:[],settings:{},selectedNode:null,drawerOpen:!1,onNodesChange:i=>{n({nodes:Yu(i,a().nodes)})},setNodes:i=>{n({nodes:i})},setEdges:i=>{n({edges:i})},setSettings:i=>{n({settings:i})},updateNodeState:(i,s)=>{const r=a().nodes.map(u=>u.id===i?{...u,data:{...u.data,state:s}}:u),c=Df(r);n({nodes:c})},setSelectedNode:i=>{n({selectedNode:i})},setDrawerOpen:i=>{n({drawerOpen:i})},loadRoadmapData:(i,s)=>{const r=Array.isArray(i?.nodes)?i.nodes:[],c=Array.isArray(i?.edges)?i.edges:[];let u=r.map(h=>({...h,draggable:!1,connectable:!1,selectable:by(h),focusable:by(h),data:{...h.data,state:s?.nodes?.[h.id]?.state||h.data?.state}}));u=Df(u),n({nodes:u,edges:c,settings:i?.settings||{}})},getRoadmapState:i=>{const s={nodes:{},x:i.x,y:i.y,zoom:i.zoom};return a().nodes.forEach(r=>{r.data.state&&r.type==="task"&&(s.nodes[r.id]={state:r.data.state})}),s},updateNodesStates:()=>{const i=Df(a().nodes);n({nodes:i})}})),vT={topic:my,task:py,image:uy,text:gy},bT=n=>n.type==="task"||n.type==="topic",ST=n=>{let a=0,i=0,s=0;return n.forEach(r=>{(r.type==="task"||r.type==="topic")&&(s++,r.data?.state==="completed"?a++:r.data?.state==="mastered"&&(a++,i++))}),{completed:a,mastered:i,total:s}};function Sy({roadmapData:n,onChange:a,language:i="en",initialState:s}){const r=Wn(U=>U.nodes),c=Wn(U=>U.edges),u=Wn(U=>U.settings),h=Wn(U=>U.selectedNode),g=Wn(U=>U.drawerOpen),p=Wn(U=>U.onNodesChange),x=Wn(U=>U.setSelectedNode),y=Wn(U=>U.setDrawerOpen),v=Wn(U=>U.loadRoadmapData),S=Wn(U=>U.getRoadmapState),b=Wn(U=>U.updateNodeState),{fitView:E,getViewport:_}=Wa(),T=u?.language||i,{completed:z,mastered:N,total:C}=ST(r),D=iT(n);B.useEffect(()=>{v(D,s),s||setTimeout(()=>{E({duration:0,padding:.2})},0)},[n,s,v,E]);const R=B.useCallback((U,F,ae=!1)=>{bT(F)&&(x(F),y(!0),ae&&E({nodes:[F],duration:150}))},[E,x,y]),j=B.useCallback(()=>{y(!1),x(null)},[y,x]),K=B.useCallback(U=>{U.data.state&&b(U.id,U.data.state),x(U)},[b,x]);B.useEffect(()=>{const U=_(),F=S(U);if(a)a(F);else{const ae=document.querySelector("hyperbook-learningmap");ae&&ae.dispatchEvent(new CustomEvent("change",{detail:F}))}},[r,_,S]);const J={animated:!1,style:{stroke:"#94a3b8",strokeWidth:2},type:"default"},fe={x:s?.x||u?.viewport?.x||0,y:s?.y||u?.viewport?.y||0,zoom:s?.zoom||u?.viewport?.zoom||1};return m.jsxs("div",{className:"editor-canvas",style:{backgroundColor:u?.background?.color||"#ffffff"},children:[m.jsxs(Zm,{nodes:r.map(U=>{const F=[];return U.data?.color&&F.push(U.data.color),F.push(U.data?.state),{...U,selected:h?.id===U.id,className:F.join(" ")}}),edges:c,onNodeClick:R,onNodesChange:p,minZoom:.2,nodeTypes:vT,defaultViewport:fe,proOptions:{hideAttribution:!0},defaultEdgeOptions:J,nodesDraggable:!1,nodesConnectable:!1,children:[u?.title&&m.jsx(fa,{position:"bottom-right",children:m.jsx("div",{className:"map-title",children:u.title})}),m.jsx(fa,{position:"top-center",className:"progress-panel",children:m.jsx(yT,{completed:z,total:C,mastered:N,language:T})}),m.jsx(Fm,{showInteractive:!1})]}),m.jsx(mT,{node:h,open:g,onClose:j,onUpdate:K,nodes:r,onNodeClick:R,language:T})]})}var wT=n=>m.jsx("div",{className:"hyperbook-learningmap-container",children:m.jsx(Zu,{children:m.jsx(Sy,{...n})})});function Of(n){switch(n){case"image":return 10;case"text":return 20;case"topic":case"task":return 30;default:return 30}}var jr=!0;function ET(n){jr=n}var wy={nodes:[],edges:[],settings:{background:{color:"#ffffff"}},previewMode:!1,debugMode:!1,showGrid:!1,helpOpen:!1,drawerOpen:!1,settingsDrawerOpen:!1,edgeDrawerOpen:!1,shareDialogOpen:!1,loadExternalDialogOpen:!1,selectedNodeId:null,selectedNodeIds:[],selectedEdge:null,nextNodeId:1,clipboard:null,lastMousePosition:null,shareLink:"",pendingExternalId:null,showCompletionNeeds:!0,showCompletionOptional:!0,showUnlockAfter:!0},_T={equality:(n,a)=>Fk(n,a),handleSet:n=>Jk(500,a=>{n(a)},{noLeading:!1,noTrailing:!0}),partialize:n=>{const{nodes:a,edges:i,settings:s}=n;return{nodes:a,edges:i,settings:s}}},AT={name:"learningmap-data",version:1,partialize:n=>{const{nodes:a,edges:i,settings:s}=n;return{nodes:a,edges:i,settings:s}},storage:{getItem:n=>{if(!jr)return null;const a=localStorage.getItem(n);return a?JSON.parse(a):null},setItem:(n,a)=>{jr&&localStorage.setItem(n,JSON.stringify(a))},removeItem:n=>{jr&&localStorage.removeItem(n)}}},ie=U0()(qk(Xk((n,a)=>({...wy,onNodesChange:i=>{n({nodes:Yu(i,a().nodes)})},onEdgesChange:i=>{n({edges:om(i,a().edges)})},onConnect:i=>{n({edges:xg(i,a().edges)})},setNodes:i=>{n({nodes:i})},setEdges:i=>{n({edges:i})},setSettings:i=>{n({settings:i})},updateDebugEdges:()=>{const i=a().debugMode,s=a().nodes,r=a().showCompletionNeeds,c=a().showCompletionOptional,u=a().showUnlockAfter,g=[...a().edges.filter(p=>!p.id.startsWith("debug-"))];i&&(s.forEach(p=>{r&&p.type==="topic"&&p.data?.completion?.needs&&p.data.completion.needs.forEach(x=>{const y=`debug-edge-${x}-to-${p.id}`;g.push({id:y,target:x,source:p.id,animated:!0,style:{stroke:"#f97316",strokeWidth:2,strokeDasharray:"5,5"},type:"floating"})}),c&&p.data?.completion?.optional&&p.data.completion.optional.forEach(x=>{const y=`debug-edge-optional-${x}-to-${p.id}`;g.push({id:y,target:x,source:p.id,animated:!0,style:{stroke:"#eab308",strokeWidth:2,strokeDasharray:"5,5"},type:"floating"})})}),s.forEach(p=>{u&&p.data.unlock?.after&&p.data.unlock.after.forEach(x=>{const y=`debug-edge-${x}-to-${p.id}`;g.push({id:y,target:x,source:p.id,animated:!0,style:{stroke:"#10b981",strokeWidth:2,strokeDasharray:"5,5"},type:"floating"})})})),n({edges:g})},updateNode:(i,s)=>{n({nodes:a().nodes.map(r=>r.id===i?{...r,...s}:r)}),a().updateDebugEdges()},updateNodeData:(i,s)=>{n({nodes:a().nodes.map(r=>r.id===i?{...r,data:{...r.data,...s}}:r)}),a().updateDebugEdges()},updateNodes:i=>{n({nodes:a().nodes.map(s=>{const r=i.find(c=>c.id===s.id);return r||s})}),a().updateDebugEdges()},updateEdge:(i,s)=>{n({edges:a().edges.map(c=>c.id===i?{...c,...s}:c)});const r=a().selectedEdge;r&&r.id===i&&n({selectedEdge:{...r,...s}})},deleteNode:i=>{n({nodes:a().nodes.filter(s=>s.id!==i),edges:a().edges.filter(s=>s.source!==i&&s.target!==i)})},deleteEdge:i=>{n({edges:a().edges.filter(s=>s.id!==i)})},addNode:i=>{n({nodes:[...a().nodes,i]})},setJsonStore:i=>{n({jsonStore:i})},setDefaultLanguage:i=>{n({defaultLanguage:i})},setPreviewMode:i=>n({previewMode:i}),setDebugMode:i=>{n({debugMode:i}),a().updateDebugEdges()},setShowGrid:i=>n({showGrid:i}),setHelpOpen:i=>n({helpOpen:i}),setDrawerOpen:i=>n({drawerOpen:i}),setSettingsDrawerOpen:i=>n({settingsDrawerOpen:i}),setEdgeDrawerOpen:i=>n({edgeDrawerOpen:i}),setShareDialogOpen:i=>n({shareDialogOpen:i}),setLoadExternalDialogOpen:i=>n({loadExternalDialogOpen:i}),setSelectedNodeId:i=>n({selectedNodeId:i}),setSelectedNodeIds:i=>n({selectedNodeIds:i}),setSelectedEdge:i=>n({selectedEdge:i}),setNextNodeId:i=>n({nextNodeId:i}),setClipboard:i=>n({clipboard:i}),setLastMousePosition:i=>n({lastMousePosition:i}),setShareLink:i=>n({shareLink:i}),setPendingExternalId:i=>n({pendingExternalId:i}),setShowCompletionNeeds:i=>{n({showCompletionNeeds:i}),a().updateDebugEdges()},setShowCompletionOptional:i=>{n({showCompletionOptional:i}),a().updateDebugEdges()},setShowUnlockAfter:i=>{n({showUnlockAfter:i}),a().updateDebugEdges()},updateRoadmapData:i=>{a().loadRoadmapData(i),a().updateDebugEdges()},loadRoadmapData:i=>{const s=Array.isArray(i?.nodes)?i.nodes:[],r=Array.isArray(i?.edges)?i.edges:[],c=s.map(h=>({...h,draggable:!0,className:h.data.color?h.data.color:h.className,zIndex:h.zIndex!==void 0?h.zIndex:Of(h.type),data:{...h.data}}));let u=1;s.length>0&&(u=Math.max(...s.map(g=>parseInt(g.id.replace(/\D/g,""),10)).filter(g=>!isNaN(g)))+1),n({nodes:c,edges:r,settings:i?.settings||{background:{color:"#ffffff"}},nextNodeId:u})},getRoadmapData:()=>{const i=a();return{nodes:i.nodes.map(s=>({id:s.id,type:s.type,position:s.position,width:s.width,height:s.height,zIndex:s.zIndex!==void 0?s.zIndex:Of(s.type),data:s.data})),edges:i.edges.filter(s=>!s.id.startsWith("debug-")).map(s=>({id:s.id,source:s.source,target:s.target,sourceHandle:s.sourceHandle,targetHandle:s.targetHandle,animated:s.animated,type:s.type,style:s.style})),settings:i.settings,version:1,type:"learningmap",source:"https://learningmap.app"}},closeAllDrawers:()=>{n({drawerOpen:!1,selectedNodeId:null,edgeDrawerOpen:!1,selectedEdge:null,settingsDrawerOpen:!1})},reset:()=>{n(wy)}}),_T),AT));function Ey(n,a){return Ik(ie.temporal,n,a)}var _y=()=>{const n=ie(v=>v.jsonStore),a=ie(v=>v.getRoadmapData),i=ie(v=>v.settings.language),s=ie(v=>v.defaultLanguage),r=Vt(i||s),c=ie(v=>v.setShareLink),u=ie(v=>v.setShareDialogOpen),h=ie(v=>v.setLoadExternalDialogOpen),g=ie(v=>v.setPendingExternalId),p=ie(v=>v.loadRoadmapData),x=B.useCallback(()=>{const v=a();if(!v.nodes||v.nodes.length===0){alert(r.emptyMapCannotBeShared);return}fetch(`${n}/api/v2/post`,{method:"POST",mode:"cors",headers:{"Content-Type":"application/json"},body:JSON.stringify(v)}).then(S=>{if(S.status===413)throw alert(r.uploadFileTooLarge),new Error("Payload too large");if(!S.ok)throw new Error(`HTTP error! status: ${S.status}`);return S.json()}).then(S=>{const b=window.location.origin+"#json="+S.id;c(b),u(!0)}).catch(S=>{S.message!=="Payload too large"&&alert(r.uploadFailed)})},[a,n,r,c,u]);return[B.useCallback(v=>{fetch(`${n}/api/v2/${v}`,{method:"GET",mode:"cors"}).then(S=>S.text()).then(S=>{const b=JSON.parse(S);p(b),h(!1)}).catch(()=>{alert(r.loadFailed),h(!1),g(null),window.location.hash=""})},[n,r,p]),x]},Rf=()=>{const n=ie(u=>u.getRoadmapData),a=ie(u=>u.loadRoadmapData),i=ie(u=>u.settings),s=B.useCallback(()=>{if(i?.title&&i.title.trim())return`${i.title.trim().replace(/[<>:"/\\|?*\x00-\x1F]/g,"-").replace(/\s+/g,"-")}.learningmap`;const u=new Date,h=u.getFullYear(),g=String(u.getMonth()+1).padStart(2,"0"),p=String(u.getDate()).padStart(2,"0"),x=String(u.getHours()).padStart(2,"0"),y=String(u.getMinutes()).padStart(2,"0"),v=String(u.getSeconds()).padStart(2,"0");return`${h}-${g}-${p}-${x}${y}${v}.learningmap`},[i?.title]),r=B.useCallback(()=>{const u=n(),h="data:text/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(u,null,2)),g=document.createElement("a");g.setAttribute("href",h),g.setAttribute("download",s()),document.body.appendChild(g),g.click(),g.remove()},[n,s]),c=B.useCallback(()=>{const u=document.createElement("input");u.type="file",u.accept=".learningmap,.json,application/json",u.onchange=h=>{const g=h.target.files[0];if(g){const p=new FileReader;p.onload=x=>{try{const y=JSON.parse(x.target.result);a(y)}catch(y){console.error("Failed to parse file",y)}},p.readAsText(g)}},u.click()},[a]);return{downloadRoadmap:r,openRoadmap:c,getFilename:s}},NT=({defaultLanguage:n="en",disableSharing:a=!1,disableFileOperations:i=!1})=>{const{screenToFlowPosition:s}=Wa(),r=ie(Y=>Y.settings),c=ie(Y=>Y.debugMode),u=ie(Y=>Y.previewMode),h=ie(Y=>Y.showCompletionNeeds),g=ie(Y=>Y.showCompletionOptional),p=ie(Y=>Y.showUnlockAfter),x=ie(Y=>Y.setDebugMode),y=ie(Y=>Y.setPreviewMode),v=ie(Y=>Y.setShowCompletionNeeds),S=ie(Y=>Y.setShowCompletionOptional),b=ie(Y=>Y.setShowUnlockAfter),E=ie(Y=>Y.addNode),_=ie(Y=>Y.setSettingsDrawerOpen),T=ie(Y=>Y.setDrawerOpen),z=ie(Y=>Y.setEdgeDrawerOpen),N=ie(Y=>Y.setSelectedNodeId),C=ie(Y=>Y.setSelectedEdge),D=ie(Y=>Y.reset),[R,j]=_y(),{downloadRoadmap:K,openRoadmap:J}=Rf(),fe=r?.language||n,U=Vt(fe),F=()=>x(!c),ae=()=>y(!u),H=Y=>v(Y),I=Y=>S(Y),k=Y=>b(Y),L=Y=>{const A=s({x:window.innerWidth/2,y:window.innerHeight/2}),O={id:`node-${Date.now()}`,type:Y,position:A,zIndex:Of(Y),data:{label:Y==="task"?U.newTask:Y==="topic"?U.newTopic:Y,state:"unlocked"}};E(O)},$=()=>{_(!0),T(!1),z(!1),N(null),C(null)},Z=()=>{confirm(U.resetMapWarning)&&D()};return m.jsxs("div",{className:"editor-toolbar",children:[m.jsxs("div",{className:"toolbar-group",children:[m.jsxs(ay,{menuButton:m.jsxs(Q0,{disabled:u,className:"toolbar-button",children:[m.jsx(yi,{size:16})," ",m.jsx("span",{className:"toolbar-label",children:U.nodes})]}),children:[m.jsxs(Kt,{onClick:()=>L("task"),children:[m.jsx("span",{children:U.addTask}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+1"})]}),m.jsxs(Kt,{onClick:()=>L("topic"),children:[m.jsx("span",{children:U.addTopic}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+2"})]}),m.jsxs(Kt,{onClick:()=>L("image"),children:[m.jsx("span",{children:U.addImage}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+3"})]}),m.jsxs(Kt,{onClick:()=>L("text"),children:[m.jsx("span",{children:U.addText}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+4"})]})]}),m.jsxs("button",{disabled:u,onClick:$,className:"toolbar-button",children:[m.jsx(WN,{size:16})," ",m.jsx("span",{className:"toolbar-label",children:U.settings})]})]}),m.jsx("div",{className:"toolbar-group",children:m.jsxs(ay,{menuButton:m.jsx(Q0,{className:"toolbar-button",children:m.jsx(KN,{})}),children:[!i&&m.jsxs(Kt,{onClick:J,children:[m.jsx(a0,{size:16})," ",m.jsx("span",{children:U.open})]}),!i&&m.jsxs(Kt,{onClick:K,children:[m.jsx(n0,{size:16})," ",m.jsx("span",{children:U.download})]}),!a&&m.jsxs(Kt,{onClick:j,children:[m.jsx(e3,{size:16})," ",m.jsx("span",{children:U.share})]}),m.jsx(kf,{}),m.jsxs(Kt,{onClick:Z,children:[m.jsx(PN,{size:16})," ",m.jsx("span",{children:U.reset}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+Del"})]}),m.jsx(kf,{}),m.jsxs(Vk,{className:`${c?"active":""}`,label:m.jsxs(m.Fragment,{children:[m.jsx(GN,{size:16})," ",m.jsx("span",{children:U.debug})]}),children:[m.jsxs(Kt,{type:"checkbox",checked:c,onClick:F,children:[m.jsx("span",{children:U.enableDebugMode}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+D"})]}),m.jsx(Kt,{type:"checkbox",checked:h,onClick:Y=>H(Y.checked??!1),disabled:!c,children:U.showCompletionNeedsEdges}),m.jsx(Kt,{type:"checkbox",checked:g,onClick:Y=>I(Y.checked??!1),disabled:!c,children:U.showCompletionOptionalEdges}),m.jsx(Kt,{type:"checkbox",checked:p,onClick:Y=>k(Y.checked??!1),disabled:!c,children:U.showUnlockAfterEdges})]}),m.jsxs(Kt,{onClick:ae,className:`${u?"active":""}`,children:[m.jsx(QN,{size:16})," ",m.jsx("span",{children:U.preview}),m.jsx("span",{style:{marginLeft:"auto",paddingLeft:"16px",color:"#9ca3af",fontSize:"0.875rem"},children:"Ctrl+P"})]}),m.jsx(kf,{}),m.jsxs(Kt,{href:"https://openpatch.org",target:"_blank",rel:"noopener noreferrer",children:[m.jsx(Fu,{size:16})," ",m.jsx("span",{children:"OpenPatch"})]}),m.jsxs(Kt,{href:"https://github.com/openpatch/learningmap",target:"_blank",rel:"noopener noreferrer",children:[m.jsx(Fu,{size:16})," ",m.jsx("span",{children:"GitHub"})]}),m.jsxs(Kt,{href:"https://fosstodon.org/@openpatch",target:"_blank",rel:"noopener noreferrer",children:[m.jsx(Fu,{size:16})," ",m.jsx("span",{children:"Mastodon"})]})]})})]})},kT='data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg%0A version="1.0"%0A width="50"%0A height="50"%0A viewBox="0 0 37.500001 37.500001"%0A preserveAspectRatio="xMidYMid"%0A id="svg54"%0A sodipodi:docname="learningmap-plain-mixed.svg"%0A inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"%0A inkscape:export-filename="/home/mike/Downloads/learningmap.png"%0A inkscape:export-xdpi="491.51999"%0A inkscape:export-ydpi="491.51999"%0A xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"%0A xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"%0A xmlns="http://www.w3.org/2000/svg"%0A xmlns:svg="http://www.w3.org/2000/svg">%0A <defs%0A id="defs58" />%0A <sodipodi:namedview%0A id="namedview56"%0A pagecolor="%23ffffff"%0A bordercolor="%23666666"%0A borderopacity="1.0"%0A inkscape:pageshadow="2"%0A inkscape:pageopacity="0.0"%0A inkscape:pagecheckerboard="true"%0A inkscape:document-units="pt"%0A showgrid="false"%0A inkscape:zoom="7.7603997"%0A inkscape:cx="26.931603"%0A inkscape:cy="30.604094"%0A inkscape:window-width="1245"%0A inkscape:window-height="1150"%0A inkscape:window-x="0"%0A inkscape:window-y="0"%0A inkscape:window-maximized="1"%0A inkscape:current-layer="g52"%0A inkscape:showpageshadow="2"%0A inkscape:deskcolor="%23d1d1d1"%0A showguides="false" />%0A <g%0A transform="matrix(0.0013712,0,0,-0.0013712,-38.39034,81.01027)"%0A fill="%23000000"%0A stroke="none"%0A id="g52"%0A style="fill:none;stroke:%23ffffff">%0A <g%0A id="g16"%0A transform="translate(63.576458,-228.27348)"%0A style="stroke:%23004c45;stroke-opacity:1;stroke-width:729.28821288;stroke-dasharray:none;fill:none;stroke-linecap:round">%0A <path%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:0.219075;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"%0A d="M 7.8503375,12.263719 C 5.987097,12.170355 4.4345451,14.117912 4.897315,15.915685 5.1668841,17.442336 6.7312924,18.536741 8.2606756,18.268177 10.187887,18.09635 11.40714,15.817375 10.649965,14.076224 10.233925,12.9249 9.0517431,12.226794 7.8503375,12.263719 Z"%0A id="path3"%0A transform="matrix(546.96616,0,0,-546.96616,27934.046,59308.109)" />%0A <path%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:0.219075;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"%0A d="m 25.056299,3.0627741 c -1.974898,-0.015164 -3.467995,2.2292736 -2.727957,4.0486125 0.450169,1.2654015 1.767925,2.1859291 3.129391,1.9534515 1.34906,0.022204 2.496898,-1.1939386 2.731298,-2.4592071 0.255249,-1.5561519 -0.773325,-3.2597319 -2.388219,-3.4912972 -0.245289,-0.044603 -0.495438,-0.061389 -0.744513,-0.05156 z"%0A id="path4"%0A transform="matrix(546.96616,0,0,-546.96616,27934.046,59308.109)" />%0A <path%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:0.219075;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"%0A d="m 42.066077,12.257728 c -2.070515,-0.09267 -3.611178,2.384816 -2.692657,4.220835 0.746299,1.945097 3.64545,2.452556 5.004713,0.868813 1.314217,-1.327061 0.967161,-3.771925 -0.658081,-4.691504 -0.493432,-0.300762 -1.083284,-0.401997 -1.653975,-0.398144 z"%0A id="path5"%0A transform="matrix(546.96616,0,0,-546.96616,27934.046,59308.109)" />%0A <path%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:0.219075;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"%0A d="m 42.123627,32.194856 c -1.934022,-0.06402 -3.513785,2.071529 -2.876004,3.893933 0.398196,1.298064 1.673135,2.284371 3.058281,2.14069 1.963712,0.01584 3.419813,-2.200138 2.727101,-4.010531 -0.396895,-1.232189 -1.619636,-2.071043 -2.909378,-2.024092 z"%0A id="path6"%0A transform="matrix(546.96616,0,0,-546.96616,27934.046,59308.109)" />%0A <path%0A d="m 43605.56,35704.39 5863.142,3474.937 c -149.103,262.479 -227.509,559.171 -227.546,861.044 0.116,452.903 176.187,888.384 491.415,1213.581 315.226,325.197 744.877,514.593 1197.556,528.805 v 7431.048 c -452.865,14.218 -882.3,204.448 -1197.556,529.874 -315.257,325.426 -491.578,760.493 -491.415,1213.581 0.05,246.783 52.483,490.746 153.834,715.757 v 1.068 l -6117.048,3531.777 c -291.575,-601.244 -901.107,-982.981 -1569.322,-982.829 -704.464,0.132 -1339.645,424.149 -1609.918,1074.703 l -6278.36,-3624.719 c 101.718,-224.93 154.517,-468.896 154.903,-715.757 0.163,-453.088 -176.158,-888.155 -491.415,-1213.581 -315.257,-325.427 -744.691,-515.657 -1197.557,-529.874 v -8013.267 c 452.865,-14.218 882.3,-204.448 1197.557,-529.874 315.257,-325.427 491.577,-760.493 491.415,-1213.581 -0.01,-129.026 -14.343,-257.653 -42.732,-383.517 v -1.069 l 5755.41,-3213.941"%0A style="fill:none;stroke:%23017460;stroke-width:729.288;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill"%0A id="path18"%0A sodipodi:nodetypes="cccsccsccccccccsccscccc" />%0A <g%0A id="g12"%0A transform="translate(20.985367)"%0A style="fill:none;fill-opacity:1;stroke:%23004c45;stroke-opacity:1;stroke-width:729.28821288;stroke-dasharray:none;stroke-linecap:round" />%0A <g%0A id="g12-4"%0A transform="matrix(1.0000018,0,0,1.0000018,2848.628,2322.2166)"%0A style="fill:none;fill-opacity:1;stroke:%23004c45;stroke-opacity:1;stroke-width:729.28690016;stroke-dasharray:none;stroke-linecap:round" />%0A <path%0A d="m 43595.73,35689.66 c 62.193,-490.969 -53.597,-909.978 -156.775,-1126.242 -193.529,-405.641 -309.849,-610.393 -672.936,-875.187 -363.091,-264.797 -805.968,-397.066 -1254.802,-374.784 -448.829,22.282 -876.497,197.766 -1211.694,497.155 -335.196,299.389 -557.677,704.601 -630.309,1148.074 -72.633,443.478 8.975,898.424 231.245,1288.998 222.268,390.571 571.757,693.153 990.166,857.263"%0A id="path1-2-0"%0A style="fill:none;stroke:%23017460;stroke-width:729.288;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"%0A sodipodi:nodetypes="cssssssc" />%0A <path%0A d="m 40849.11,35368.518 683.354,-477.479 1591.603,2277.848"%0A id="path2-2"%0A style="stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;fill:none;stroke-linecap:round;fill-opacity:0" />%0A <circle%0A cx="50984.348"%0A cy="-50953.406"%0A r="1743.692"%0A id="circle1-9-0-6"%0A transform="scale(1,-1)"%0A style="fill:none;fill-opacity:1;stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:round" />%0A <circle%0A cx="50988.066"%0A cy="-40043.738"%0A r="1743.692"%0A id="circle1-9-0-6-0"%0A transform="scale(1,-1)"%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:round" />%0A <circle%0A cx="41713.258"%0A cy="-55971.996"%0A r="1743.692"%0A id="circle1-9-0-6-1"%0A transform="scale(1,-1)"%0A style="fill:none;fill-opacity:1;stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:round" />%0A <circle%0A cx="32237.596"%0A cy="-50954.227"%0A r="1743.6952"%0A id="circle1-9-0-6-1-5"%0A transform="scale(1,-1)"%0A style="fill:none;fill-opacity:1;stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:round" />%0A <g%0A id="g6">%0A <path%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:0.219075;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"%0A d="m 7.7589848,33.262848 c -1.9285094,-0.03754 -3.4162729,2.069333 -2.828509,3.882808 0.4477732,1.743016 2.5850355,2.717411 4.190883,1.898509 1.0920472,-0.463941 1.8542062,-1.605018 1.7136832,-2.809147 0.117257,-1.625749 -1.4957684,-3.052661 -3.0760572,-2.97217 z"%0A id="path2"%0A transform="matrix(546.96616,0,0,-546.96616,27934.046,59308.109)" />%0A <circle%0A cx="32230.184"%0A cy="-39458.945"%0A r="1743.6984"%0A id="circle1-9-0-6-1-5-7"%0A transform="scale(1,-1)"%0A style="fill:none;fill-opacity:1;stroke:%23017460;stroke-width:729.28821288;stroke-dasharray:none;stroke-opacity:1;stroke-linecap:round" />%0A </g>%0A </g>%0A <g%0A id="g15"%0A transform="matrix(1.1225034,0,0,1.1225034,-5720.3933,-6172.9528)"%0A style="fill:none;stroke:%23017460;stroke-width:974.54700097;stroke-dasharray:none;stroke-opacity:1">%0A <path%0A d="m 45485.685,47422.605 a 4375.7293,4375.7293 0 0 1 -8735.049,-380.688 c 0,-2565.272 2673.023,-5230.091 3840.796,-6272.608"%0A id="path1-4"%0A style="fill:none;stroke:%23017460;stroke-width:974.54700097;stroke-dasharray:none;stroke-opacity:1" />%0A <path%0A d="m 47349.746,43417.719 a 1161.8375,1161.8375 0 0 1 -1643.086,1643.086 l -2193.335,-2194.428 a 1093.9323,1093.9323 0 0 1 -276.764,-467.109 l -457.811,-1569.793 a 273.48308,273.48308 0 0 1 339.119,-339.119 l 1569.793,457.811 a 1093.9323,1093.9323 0 0 1 467.109,276.764 z"%0A id="path2-7"%0A style="fill:%23a9f7a1;fill-opacity:1;stroke:%23017460;stroke-width:974.54700097;stroke-dasharray:none;stroke-opacity:1" />%0A <circle%0A cx="41126.367"%0A cy="-47041.914"%0A r="1640.8984"%0A id="circle2"%0A transform="scale(1,-1)"%0A style="fill:%23b5e3d9;fill-opacity:1;stroke:%23017460;stroke-width:974.54700097;stroke-dasharray:none;stroke-opacity:1" />%0A </g>%0A </g>%0A</svg>%0A',TT=({defaultLanguage:n="en"})=>{const a=ie(p=>p.settings),i=ie(p=>p.addNode),s=ie(p=>p.setHelpOpen),{openRoadmap:r}=Rf(),c=a?.language||n,u=Vt(c),h=()=>{const p={x:window.innerWidth/2,y:window.innerHeight/2},x={id:`node-${Date.now()}`,type:"topic",position:p,data:{label:u.newTopic,state:"unlocked"}};i(x)},g=()=>s(!0);return m.jsx("div",{className:"welcome-message",children:m.jsxs("div",{className:"welcome-content",children:[m.jsxs("h1",{className:"welcome-title",children:[m.jsx("img",{src:kT,alt:"Logo",className:"welcome-logo"}),u.welcomeTitle]}),m.jsx("p",{className:"welcome-subtitle",children:u.welcomeSubtitle}),m.jsxs("div",{className:"welcome-actions",children:[m.jsxs("button",{onClick:r,className:"primary-button",children:[m.jsx(a0,{size:18}),u.welcomeOpenFile]}),m.jsxs("button",{onClick:h,className:"primary-button",children:[m.jsx(yi,{size:18}),u.welcomeAddTopic]}),m.jsxs("button",{onClick:g,className:"secondary-button",children:[m.jsx(l0,{size:18}),u.welcomeHelp]})]})]})})},CT=({id:n,source:a,target:i,markerEnd:s,style:r})=>{const c=Im(a),u=Im(i);if(!c||!u)return null;const{sx:h,sy:g,tx:p,ty:x,sourcePos:y,targetPos:v}=lT(c,u),[S]=Nu({sourceX:h,sourceY:g,sourcePosition:y,targetPosition:v,targetX:p,targetY:x});return m.jsx("path",{id:n,className:"react-flow__edge-path",d:S,markerEnd:s,style:r})},MT=CT,zT=()=>{const n=ie(b=>b.selectedNodeIds),a=ie(b=>b.nodes),i=ie(b=>b.updateNodes),s=a.filter(b=>n.includes(b.id));if(s.length<2)return null;const r=()=>{if(s.length<2)return;const b=Math.min(...s.map(_=>_.position.x)),E=s.map(_=>({..._,position:{..._.position,x:b}}));i(E)},c=()=>{if(s.length<2)return;const b=s.reduce((_,T)=>_+T.position.x+(T.width||T.measured.width)/2,0)/s.length,E=s.map(_=>({..._,position:{..._.position,x:b-(_.width||_.measured.width)/2}}));i(E)},u=()=>{if(s.length<2)return;const b=Math.max(...s.map(_=>_.position.x+(_.width||0))),E=s.map(_=>({..._,position:{..._.position,x:b-(_.width||_.measured.width)}}));i(E)},h=()=>{if(s.length<2)return;const b=Math.min(...s.map(_=>_.position.y)),E=s.map(_=>({..._,position:{..._.position,y:b}}));i(E)},g=()=>{if(s.length<2)return;const b=s.reduce((_,T)=>_+T.position.y+(T.height||T.measured.height)/2,0)/s.length,E=s.map(_=>({..._,position:{..._.position,y:b-(_.height||_.measured.height)/2}}));i(E)},p=()=>{if(s.length<2)return;const b=Math.max(...s.map(_=>_.position.y+(_.height||0))),E=s.map(_=>({..._,position:{..._.position,y:b-(_.height||_.measured.height)}}));i(E)},x=()=>{if(s.length<3)return;const b=[...s].sort((R,j)=>R.position.y-j.position.y),E=b[0].position.y,_=b.reduce((R,j)=>R+(j.height||j.measured.height),0),z=b[b.length-1].position.y-E+(b[b.length-1].height||b[b.length-1].measured.height)-_,N=b.length>1?z/(b.length-1):0;let C=E;const D=b.map((R,j)=>{const K={...R,position:{...R.position,y:C}};return C+=(R.height||R.measured.height)+N,K});i(D)},y=()=>{if(s.length<3)return;const b=[...s].sort((R,j)=>R.position.x-j.position.x),E=b[0].position.x,_=b.reduce((R,j)=>R+(j.width||j.measured.width),0),z=b[b.length-1].position.x-E+(b[b.length-1].width||b[b.length-1].measured.width)-_,N=b.length>1?z/(b.length-1):0;let C=E;const D=b.map((R,j)=>{const K={...R,position:{...R.position,x:C}};return C+=(R.width||R.measured.width)+N,K});i(D)},v=()=>{if(s.length<2)return;const b=Math.max(...s.map(_=>_.width||_.measured.width)),E=s.map(_=>({..._,width:b}));i(E)},S=()=>{if(s.length<2)return;const b=Math.max(...s.map(_=>_.height||_.measured.height)),E=s.map(_=>({..._,height:b}));i(E)};return m.jsxs(fa,{position:"bottom-center",className:"multi-node-panel",children:[m.jsx("button",{title:"Align Left Horizontal",onClick:h,children:m.jsx(YN,{})}),m.jsx("button",{title:"Align Center Horizontal",onClick:g,children:m.jsx(HN,{})}),m.jsx("button",{title:"Align Right Horizontal",onClick:p,children:m.jsx(UN,{})}),m.jsx("button",{title:"Align Top Vertical",onClick:r,children:m.jsx(qN,{})}),m.jsx("button",{title:"Align Center Vertical",onClick:c,children:m.jsx(BN,{})}),m.jsx("button",{title:"Align Bottom Vertical",onClick:u,children:m.jsx($N,{})}),s.length>2&&m.jsx("button",{title:"Distribute Vertical",onClick:x,children:m.jsx(XN,{})}),s.length>2&&m.jsx("button",{title:"Distribute Horizontal",onClick:y,children:m.jsx(VN,{})}),m.jsx("button",{title:"Same Width",onClick:v,children:m.jsx(s0,{})}),m.jsx("button",{title:"Same Height",onClick:S,children:m.jsx(s0,{style:{transform:"rotate(90deg)"}})})]})};function Ay({localNode:n,handleFieldChange:a,handleResourceChange:i,addResource:s,removeResource:r,handleUnlockAfterChange:c,addUnlockAfter:u,removeUnlockAfter:h,renderNodeSelect:g,handleCompletionNeedsChange:p,addCompletionNeed:x,removeCompletionNeed:y,handleCompletionOptionalChange:v,addCompletionOptional:S,removeCompletionOptional:b,language:E="en"}){const _=Vt(E),T=[{value:"blue",label:_.blue,className:"react-flow__node-topic blue"},{value:"yellow",label:_.yellow,className:"react-flow__node-topic yellow"},{value:"lila",label:_.lila,className:"react-flow__node-topic lila"},{value:"pink",label:_.pink,className:"react-flow__node-topic pink"},{value:"teal",label:_.teal,className:"react-flow__node-topic teal"},{value:"red",label:_.red,className:"react-flow__node-topic red"},{value:"black",label:_.black,className:"react-flow__node-topic black"},{value:"white",label:_.white,className:"react-flow__node-topic white"}];let z="blue";n.type==="topic"&&(z="yellow");const N=n.data?.color||z;return m.jsxs("div",{className:"panel-content",children:[m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.nodeColor}),m.jsx("div",{style:{display:"flex",gap:12,marginTop:8},children:T.map(C=>m.jsx("button",{type:"button","aria-label":C.label,onClick:()=>a("color",C.value),className:C.className,style:{width:28,height:28,borderRadius:6,cursor:"pointer",fontWeight:"bold",boxSizing:"border-box",display:"inline-block",padding:0},children:N===C.value?"X":""},C.value))})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.labelRequired}),m.jsx("input",{type:"text",value:n.data?.label||"",onChange:C=>a("label",C.target.value),placeholder:_.placeholderNodeLabel})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.fontSize}),m.jsx("div",{style:{display:"flex",gap:8,marginTop:8},children:["S","M","L","XL"].map(C=>{const D=nT(n.data.fontSize)===C;return m.jsx("button",{type:"button",onClick:()=>a("fontSize",Io[C]),style:{width:40,height:40,borderRadius:6,border:D?"2px solid #3b82f6":"1px solid #d1d5db",backgroundColor:D?"#eff6ff":"#ffffff",color:D?"#3b82f6":"#374151",cursor:"pointer",fontWeight:D?"bold":"normal",fontSize:"14px"},children:C},C)})})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.summary}),m.jsx("input",{type:"text",value:n.data.summary||"",onChange:C=>a("summary",C.target.value),placeholder:_.placeholderShortSummary})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.description}),m.jsx("textarea",{value:n.data.description||"",onChange:C=>a("description",C.target.value),placeholder:_.placeholderDetailedDescription,rows:4})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.duration}),m.jsx("input",{type:"text",value:n.data.duration||"",onChange:C=>a("duration",C.target.value),placeholder:"e.g., 30 min"})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.videoURL}),m.jsx("input",{type:"text",value:n.data.video||"",onChange:C=>a("video",C.target.value),placeholder:_.placeholderVideoURL})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.resources}),(n.data.resources||[]).map((C,D)=>{const R=C.type==="book";return m.jsxs("div",{style:{marginBottom:"16px",padding:"12px",border:"1px solid #e5e7eb",borderRadius:"6px"},children:[m.jsxs("div",{style:{display:"flex",gap:"8px",marginBottom:"8px"},children:[m.jsxs("select",{value:C.type||"url",onChange:j=>i(D,"type",j.target.value),style:{flex:.5},children:[m.jsx("option",{value:"url",children:"URL"}),m.jsx("option",{value:"book",children:"Book"})]}),m.jsx("input",{type:"text",value:C.label||"",onChange:j=>i(D,"label",j.target.value),placeholder:_.placeholderLabel,style:{flex:1}}),m.jsx("button",{onClick:()=>r(D),className:"icon-button",children:m.jsx(xi,{size:16})})]}),R?m.jsxs(m.Fragment,{children:[m.jsx("input",{type:"text",value:C.bookName||"",onChange:j=>i(D,"bookName",j.target.value),placeholder:"Book name (e.g., Lambacher Schweitzer GK)",style:{width:"100%",marginBottom:"8px"}}),m.jsx("input",{type:"text",value:C.bookLocation||"",onChange:j=>i(D,"bookLocation",j.target.value),placeholder:"Location (e.g., S. 223 Nr. 5)",style:{width:"100%"}})]}):m.jsx("input",{type:"text",value:C.url||"",onChange:j=>i(D,"url",j.target.value),placeholder:_.placeholderURL,style:{width:"100%"}})]},D)}),m.jsxs("button",{onClick:s,className:"secondary-button",children:[m.jsx(yi,{size:16})," ",_.addResource]})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.unlockPassword}),m.jsx("input",{type:"text",value:n.data.unlock?.password||"",onChange:C=>a("unlock",{...n.data.unlock||{},password:C.target.value}),placeholder:_.placeholderOptionalPassword})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.unlockDate}),m.jsx("input",{type:"date",value:n.data.unlock?.date||"",onChange:C=>a("unlock",{...n.data.unlock||{},date:C.target.value})})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.unlockAfter}),(n.data.unlock?.after||[]).map((C,D)=>m.jsxs("div",{style:{display:"flex",gap:"8px",marginBottom:"8px"},children:[g(C,R=>c(D,R)),m.jsx("button",{onClick:()=>h(D),className:"icon-button",children:m.jsx(xi,{size:16})})]},D)),m.jsxs("button",{onClick:u,className:"secondary-button",children:[m.jsx(yi,{size:16})," ",_.unlockAfter]})]}),n.type==="topic"&&m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.completionNeeds}),(n.data.completion?.needs||[]).map((C,D)=>m.jsxs("div",{style:{display:"flex",gap:"8px",marginBottom:"8px"},children:[g(C,R=>p(D,R)),m.jsx("button",{onClick:()=>y(D),className:"icon-button",children:m.jsx(xi,{size:16})})]},D)),m.jsxs("button",{onClick:x,className:"secondary-button",children:[m.jsx(yi,{size:16})," ",_.completionNeeds]})]}),n.type==="topic"&&m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:_.completionOptional}),(n.data.completion?.optional||[]).map((C,D)=>m.jsxs("div",{style:{display:"flex",gap:"8px",marginBottom:"8px"},children:[g(C,R=>v(D,R)),m.jsx("button",{onClick:()=>b(D),className:"icon-button",children:m.jsx(xi,{size:16})})]},D)),m.jsxs("button",{onClick:S,className:"secondary-button",children:[m.jsx(yi,{size:16})," ",_.completionOptional]})]})]})}function DT(n){return m.jsx(Ay,{...n})}async function OT(n,a=1920,i=1920,s=.85){return new Promise((r,c)=>{const u=new FileReader;u.onload=h=>{const g=new Image;g.onload=()=>{const p=document.createElement("canvas");let x=g.width,y=g.height;if(x>a||y>i){const b=x/y;x>y?(x=a,y=a/b):(y=i,x=i*b)}p.width=x,p.height=y;const v=p.getContext("2d");if(!v){c(new Error("Failed to get canvas context"));return}v.drawImage(g,0,0,x,y);const S=p.toDataURL("image/jpeg",s);r(S)},g.onerror=()=>{c(new Error("Failed to load image"))},g.src=h.target?.result},u.onerror=()=>{c(new Error("Failed to read file"))},u.readAsDataURL(n)})}function RT({localNode:n,handleFieldChange:a,language:i="en"}){const s=Vt(i),r=async c=>{const u=c.target.files?.[0];if(u)try{if(u.type==="image/svg+xml"){const h=new FileReader;h.onload=()=>{typeof h.result=="string"&&a("data",h.result)},h.readAsDataURL(u)}else{const h=await OT(u);a("data",h)}}catch(h){console.error("Failed to process image:",h);const g=new FileReader;g.onload=()=>{typeof g.result=="string"&&a("data",g.result)},g.readAsDataURL(u)}};return m.jsxs("div",{className:"panel-content",children:[m.jsxs("div",{className:"form-group",children:[m.jsxs("label",{children:[s.image," (JPG, PNG, WebP, SVG)"]}),m.jsx("input",{type:"file",accept:"image/png,image/jpeg,image/webp,image/svg+xml",onChange:r})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:s.caption}),m.jsx("input",{type:"text",value:n.data.caption||"",onChange:c=>a("caption",c.target.value),placeholder:s.placeholderImageCaption})]}),n.data.data&&m.jsxs("div",{style:{marginTop:16},children:[m.jsx("label",{children:"Preview:"}),m.jsx("div",{children:m.jsx("img",{src:n.data.data,alt:"Preview",style:{maxWidth:"100%",maxHeight:200}})})]})]})}var Lr=({value:n,onChange:a,label:i})=>m.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[i&&m.jsx("label",{style:{marginRight:8},children:i}),m.jsx("input",{type:"color",value:n,onChange:s=>a(s.target.value),style:{width:32,height:32,border:"none",background:"none",padding:0}}),m.jsx("input",{type:"text",value:n,onChange:s=>a(s.target.value),placeholder:"#e5e7eb",style:{width:100}})]});function jT({value:n,onChange:a}){return m.jsxs("div",{className:"form-group",children:[m.jsxs("label",{children:["Rotation (degrees): ",n,"°"]}),m.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[m.jsx("input",{type:"range",min:0,max:360,value:n,onChange:i=>a(Number(i.target.value)),style:{flex:1}}),m.jsx("input",{type:"number",min:0,max:360,value:n,onChange:i=>{let s=Number(i.target.value);isNaN(s)&&(s=0),s<0&&(s=0),s>360&&(s=360),a(s)},style:{width:100}})]})]})}function LT({localNode:n,handleFieldChange:a,language:i="en"}){const s=Vt(i);return m.jsxs("div",{className:"panel-content",children:[m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:s.text}),m.jsx("input",{type:"text",value:n.data.text||"",onChange:r=>a("text",r.target.value),placeholder:s.placeholderBackgroundText})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:s.fontSize}),m.jsx("input",{type:"number",value:n.data.fontSize||32,onChange:r=>a("fontSize",Number(r.target.value))})]}),m.jsx("div",{className:"form-group",children:m.jsx(Lr,{label:s.color,value:n.data.color||"#e5e7eb",onChange:r=>a("color",r)})}),m.jsx(jT,{value:n.data.rotation||0,onChange:r=>a("rotation",r)})]})}var HT=({defaultLanguage:n="en"})=>{const a=ie(A=>A.selectedNodeId),i=ie(A=>A.nodes),s=ie(A=>A.drawerOpen),r=ie(A=>A.settings),c=ie(A=>A.nextNodeId),u=ie(A=>A.setDrawerOpen),h=ie(A=>A.setSelectedNodeId),g=ie(A=>A.updateNode),p=ie(A=>A.deleteNode),x=ie(A=>A.addNode),y=ie(A=>A.setNextNodeId),v=r?.language||n,S=Vt(v),b=i.find(A=>A.id===a)||null;B.useEffect(()=>{s&&!b&&(u(!1),h(null))},[b,s,u,h]);const E=()=>{u(!1),h(null)},_=()=>{b&&(p(b.id),E())},T=()=>{if(!b)return;const A=`node-${c}`,O={...b,id:A,position:{x:b.position.x+20,y:b.position.y+20},data:{...b.data,label:`${b.data.label} (copy)`},selected:!1};x(O),y(c+1),h(A)};if(!s||!b)return null;const z=i.filter(A=>A.id!==b.id&&(A.type==="task"||A.type==="topic")),N=ie.getState().edges,C=new Set;N.forEach(A=>{A.source===b.id&&C.add(A.target),A.target===b.id&&C.add(A.source)});const D=[...z].sort((A,O)=>{const G=C.has(A.id),P=C.has(O.id);if(G&&!P)return-1;if(!G&&P)return 1;const se=(A.data.label||A.id).toLowerCase(),ge=(O.data.label||O.id).toLowerCase();return se.localeCompare(ge)}),R=(A,O)=>m.jsxs("select",{value:A,onChange:G=>O(G.target.value),children:[m.jsx("option",{value:"",children:S.selectNode}),D.map(G=>m.jsx("option",{value:G.id,children:G.data.label||G.id},G.id))]}),j=(A,O)=>{if(!b)return;const G=[...b.data.completion?.needs||[]];G[A]=O,k("completion",{...b.data.completion||{},needs:G})},K=()=>{if(!b)return;const A=[...b.data.completion?.needs||[],""];k("completion",{...b.data.completion||{},needs:A})},J=A=>{if(!b)return;const O=(b.data.completion?.needs||[]).filter((G,P)=>P!==A);k("completion",{...b.data.completion||{},needs:O})},fe=(A,O)=>{if(!b)return;const G=[...b.data.completion?.optional||[]];G[A]=O,k("completion",{...b.data.completion||{},optional:G})},U=()=>{if(!b)return;const A=[...b.data.completion?.optional||[],""];k("completion",{...b.data.completion||{},optional:A})},F=A=>{if(!b)return;const O=(b.data.completion?.optional||[]).filter((G,P)=>P!==A);k("completion",{...b.data.completion||{},optional:O})},ae=(A,O)=>{if(!b)return;const G=[...b.data.unlock?.after||[]];G[A]=O,k("unlock",{...b.data.unlock||{},after:G})},H=()=>{if(!b)return;const A=[...b.data.unlock?.after||[],""];k("unlock",{...b.data.unlock||{},after:A})},I=A=>{if(!b)return;const O=(b.data.unlock?.after||[]).filter((G,P)=>P!==A);k("unlock",{...b.data.unlock||{},after:O})},k=(A,O)=>{if(!b)return;const G={...b,data:{...b.data,[A]:O},className:A==="color"?O:b.className};g(b.id,G)},L=(A,O,G)=>{if(!b)return;const P=[...b.data.resources||[]];P[A]={...P[A],[O]:G},k("resources",P)},$=()=>{if(!b)return;const A=[...b.data.resources||[],{label:"",type:"url",url:""}];k("resources",A)},Z=A=>{if(!b)return;const O=(b.data.resources||[]).filter((G,P)=>P!==A);k("resources",O)};let Y;return b.type==="task"?Y=m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:S.editTask}),m.jsx("button",{onClick:E,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsx(Ay,{localNode:b,handleFieldChange:k,handleResourceChange:L,addResource:$,removeResource:Z,handleUnlockAfterChange:ae,addUnlockAfter:H,removeUnlockAfter:I,renderNodeSelect:R,handleCompletionNeedsChange:j,addCompletionNeed:K,removeCompletionNeed:J,handleCompletionOptionalChange:fe,addCompletionOptional:U,removeCompletionOptional:F,language:v})]}):b.type==="topic"?Y=m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:S.editTopic}),m.jsx("button",{onClick:E,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsx(DT,{localNode:b,handleFieldChange:k,handleResourceChange:L,addResource:$,removeResource:Z,handleUnlockAfterChange:ae,addUnlockAfter:H,removeUnlockAfter:I,renderNodeSelect:R,handleCompletionNeedsChange:j,addCompletionNeed:K,removeCompletionNeed:J,handleCompletionOptionalChange:fe,addCompletionOptional:U,removeCompletionOptional:F,language:v})]}):b.type==="image"?Y=m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:S.editImage}),m.jsx("button",{onClick:E,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsx(RT,{localNode:b,handleFieldChange:k,language:v})]}):b.type==="text"&&(Y=m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:S.editText}),m.jsx("button",{onClick:E,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsx(LT,{localNode:b,handleFieldChange:k,language:v})]})),m.jsx(fa,{position:"center-right",className:"editor-panel",children:m.jsxs("div",{className:"panel-inner",children:[Y,m.jsxs("div",{className:"panel-footer",children:[m.jsxs("button",{onClick:T,className:"secondary-button",children:[m.jsx(IN,{size:16})," ",S.copyNode]}),m.jsxs("button",{onClick:_,className:"danger-button",children:[m.jsx(xi,{size:16})," ",S.deleteNode]})]})]})})};function BT({localEdge:n,handleFieldChange:a,language:i="en"}){const s=Vt(i);return m.jsxs("div",{className:"panel-content",children:[m.jsx("div",{className:"form-group",children:m.jsx(Lr,{label:s.edgeColor,value:n.style?.stroke||"#222222",onChange:r=>a("color",r)})}),m.jsx("div",{className:"form-group",children:m.jsxs("label",{children:[m.jsx("input",{type:"checkbox",checked:!!n.animated,onChange:r=>a("animated",r.target.checked)}),s.animated]})}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:s.edgeType}),m.jsxs("select",{value:n.type||"default",onChange:r=>a("type",r.target.value),children:[m.jsx("option",{value:"default",children:s.default}),m.jsx("option",{value:"straight",children:s.straight}),m.jsx("option",{value:"step",children:s.step}),m.jsx("option",{value:"smoothstep",children:s.smoothstep}),m.jsx("option",{value:"simplebezier",children:"Simple Bezier"})]})]})]})}var UT=({defaultLanguage:n="en"})=>{const a=ie(S=>S.selectedEdge),i=ie(S=>S.edgeDrawerOpen),s=ie(S=>S.settings);ie(S=>S.edges);const r=ie(S=>S.setEdgeDrawerOpen),c=ie(S=>S.setSelectedEdge),u=ie(S=>S.updateEdge),h=ie(S=>S.deleteEdge),g=s?.language||n,p=Vt(g);B.useEffect(()=>{i&&!a&&r(!1)},[a,i,r]);const x=()=>{r(!1),c(null)},y=S=>{u(S.id,S)},v=()=>{a&&(h(a.id),x())};return!a||!i?null:m.jsx(fa,{position:"center-right",className:"editor-panel",children:m.jsxs("div",{className:"panel-inner",children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:p.editEdge}),m.jsx("button",{onClick:x,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsx(BT,{localEdge:a,handleFieldChange:(S,b)=>{let E={...a};S==="color"?E={...E,style:{...E.style,stroke:b}}:S==="animated"?E={...E,animated:b}:S==="type"&&(E={...E,type:b}),y(E)},language:g}),m.jsx("div",{className:"panel-footer panel-footer-centered",children:m.jsxs("button",{onClick:v,className:"danger-button",children:[m.jsx(xi,{size:16})," ",p.deleteEdge]})})]})})},VT=({defaultLanguage:n="en"})=>{const a=ie(b=>b.settingsDrawerOpen),i=ie(b=>b.settings),s=ie(b=>b.edges),r=ie(b=>b.setEdges),c=ie(b=>b.setSettingsDrawerOpen),u=ie(b=>b.setSettings),h=i?.language||n,g=Vt(h),{getViewport:p}=Wa(),x=()=>c(!1);if(!a)return null;const y=b=>{u({...i,...b})},v=()=>{const b=p();y({viewport:{x:Math.round(b.x),y:Math.round(b.y),zoom:parseFloat(b.zoom.toFixed(2))}})},S=()=>{const b=i?.defaultEdgeType||"default",E=i?.defaultEdgeColor||"#94a3b8",_=s.map(T=>({...T,type:b,style:{...T.style,stroke:E}}));r(_)};return m.jsx(fa,{position:"center-right",className:"editor-panel",children:m.jsxs("div",{className:"panel-inner",children:[m.jsxs("div",{className:"panel-header",children:[m.jsx("h2",{className:"panel-title",children:g.backgroundSettings}),m.jsx("button",{onClick:x,className:"close-button",children:m.jsx(da,{size:20})})]}),m.jsxs("div",{className:"panel-content",children:[m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:g.labelRequired}),m.jsx("input",{type:"text",value:i?.title||"",onChange:b=>y({title:b.target.value}),placeholder:g.placeholderTitleLabel})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:g.languageLabel}),m.jsxs("select",{value:i?.language||"en",onChange:b=>y({language:b.target.value}),children:[m.jsx("option",{value:"en",children:g.languageEnglish}),m.jsx("option",{value:"de",children:g.languageGerman})]})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:g.storageId}),m.jsxs("div",{style:{display:"flex",gap:"8px",marginBottom:"8px"},children:[m.jsx("input",{type:"text",value:i?.id||"",onChange:b=>y({id:b.target.value}),placeholder:"Optional",style:{flex:1}}),m.jsx("button",{onClick:()=>y({id:oT()}),className:"secondary-button",type:"button",style:{padding:"8px 12px",width:"auto",display:"flex",alignItems:"center",gap:"4px"},title:g.generateRandomId,children:m.jsx(JN,{size:16})})]}),m.jsxs("p",{style:{fontSize:"0.875rem",color:"#666",margin:0,fontStyle:"italic"},children:["ℹ️ ",g.storageIdHint]})]}),m.jsx("div",{className:"form-group",children:m.jsx(Lr,{label:g.backgroundColor,value:i?.background?.color||"#ffffff",onChange:b=>y({background:{...i.background,color:b}})})}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:g.initialViewport}),m.jsxs("div",{style:{display:"flex",gap:"8px",alignItems:"center",marginTop:"8px"},children:[m.jsxs("div",{style:{flex:1},children:[m.jsx("label",{style:{fontSize:"0.875rem",color:"#666"},children:g.viewportX}),m.jsx("input",{type:"number",value:i?.viewport?.x??0,onChange:b=>y({viewport:{...i.viewport,x:parseFloat(b.target.value)||0,y:i.viewport?.y??0,zoom:i.viewport?.zoom??1}}),style:{width:"100%"}})]}),m.jsxs("div",{style:{flex:1},children:[m.jsx("label",{style:{fontSize:"0.875rem",color:"#666"},children:g.viewportY}),m.jsx("input",{type:"number",value:i?.viewport?.y??0,onChange:b=>y({viewport:{...i.viewport,y:parseFloat(b.target.value)||0,x:i.viewport?.x??0,zoom:i.viewport?.zoom??1}}),style:{width:"100%"}})]}),m.jsxs("div",{style:{flex:1},children:[m.jsx("label",{style:{fontSize:"0.875rem",color:"#666"},children:g.viewportZoom}),m.jsx("input",{type:"number",step:"0.1",min:"0.1",max:"10",value:i?.viewport?.zoom??1,onChange:b=>y({viewport:{...i.viewport,zoom:parseFloat(b.target.value)||1,x:i.viewport?.x??0,y:i.viewport?.y??0}}),style:{width:"100%"}})]})]}),m.jsx("button",{onClick:v,className:"secondary-button",style:{marginTop:"8px",width:"100%"},type:"button",children:g.useCurrentViewport})]}),m.jsxs("div",{className:"form-group",children:[m.jsx("label",{children:"Default Edge Type"}),m.jsxs("select",{value:i?.defaultEdgeType||"default",onChange:b=>y({defaultEdgeType:b.target.value}),children:[m.jsx("option",{value:"default",children:"Default"}),m.jsx("option",{value:"straight",children:"Straight"}),m.jsx("option",{value:"step",children:"Step"}),m.jsx("option",{value:"smoothstep",children:"Smooth Step"}),m.jsx("option",{value:"simplebezier",children:"Simple Bezier"})]})]}),m.jsx("div",{className:"form-group",children:m.jsx(Lr,{label:"Default Edge Color",value:i?.defaultEdgeColor||"#94a3b8",onChange:b=>y({defaultEdgeColor:b})})}),m.jsx("div",{className:"form-group",children:m.jsx("button",{onClick:S,className:"secondary-button",style:{width:"100%"},type:"button",children:"Update All Edges to Default Settings"})})]})]})})},$T={topic:my,task:py,image:uy,text:gy},YT={floating:MT},Ny=B.memo(({defaultLanguage:n="en"})=>{const a=ie(k=>k.settings),i=ie(k=>k.nodes),s=ie(k=>k.edges),r=ie(k=>k.showGrid),c=ie(k=>k.selectedNodeIds),u=ie(k=>k.onNodesChange),h=ie(k=>k.onEdgesChange),g=ie(k=>k.onConnect),p=ie(k=>k.setSelectedNodeIds),x=ie(k=>k.setSelectedNodeId),y=ie(k=>k.setSelectedEdge),v=ie(k=>k.setDrawerOpen),S=ie(k=>k.setEdgeDrawerOpen),b=ie(k=>k.setSettingsDrawerOpen),E=ie(k=>k.setHelpOpen),_=ie(k=>k.setLastMousePosition),{setViewport:T,screenToFlowPosition:z}=Wa(),N=B.useRef(null),C=a?.language||n,D=Vt(C);B.useEffect(()=>{a?.viewport&&T({x:a.viewport.x,y:a.viewport.y,zoom:a.viewport.zoom})},[a?.viewport,T]);const{undo:R,redo:j,canUndo:K,canRedo:J}=Ey(k=>({undo:k.undo,redo:k.redo,canUndo:k.pastStates.length>0,canRedo:k.futureStates.length>0})),fe=B.useCallback((k,L)=>{x(L.id),v(!0),y(null),S(!1),b(!1)},[x,v,y,S,b]),U=B.useCallback((k,L)=>{y(L),S(!0),x(null),v(!1),b(!1)},[y,S,x,v,b]),F=B.useCallback(({nodes:k})=>{p(k.map(L=>L.id)),k.length===0&&(v(!1),x(null))},[p,v,x]),ae=B.useCallback(k=>{const L=z({x:k.clientX,y:k.clientY});_(L)},[z,_]),H=B.useCallback(()=>{v(!1),x(null),S(!1),y(null),b(!1)},[v,x,S,y,b]),I={animated:!1,style:{stroke:a?.defaultEdgeColor||"#94a3b8",strokeWidth:2},type:a?.defaultEdgeType||"default"};return m.jsx("div",{ref:N,className:"editor-canvas",style:{backgroundColor:a?.background?.color||"#ffffff"},onMouseMove:ae,children:m.jsxs(Zm,{nodes:i,edges:s,onEdgesChange:h,onNodeClick:fe,onEdgeClick:U,onNodesChange:u,onConnect:g,onSelectionChange:F,onPaneClick:H,nodeTypes:$T,selectionOnDrag:!1,minZoom:.2,edgeTypes:YT,proOptions:{hideAttribution:!0},defaultEdgeOptions:I,nodesDraggable:!0,elevateNodesOnSelect:!1,nodesConnectable:!0,selectNodesOnDrag:!1,colorMode:"light",children:[r&&m.jsx(uN,{}),m.jsxs(Fm,{children:[m.jsx(Ll,{title:D.undo,disabled:!K,onClick:()=>R(),children:m.jsx(n3,{})}),m.jsx(Ll,{title:D.redo,disabled:!J,onClick:()=>j(),children:m.jsx(FN,{})}),m.jsx(Ll,{title:D.help,onClick:()=>E(!0),children:m.jsx(l0,{})})]}),c.length>1&&m.jsx(zT,{}),m.jsx(HT,{defaultLanguage:n}),m.jsx(UT,{defaultLanguage:n}),m.jsx(VT,{defaultLanguage:n})]})})});Ny.displayName="EditorCanvas";function qT(){const[n,a]=B.useState(!1),[i,s]=B.useState(!1),r=ie(E=>E.shareDialogOpen),c=ie(E=>E.shareLink),u=ie(E=>E.settings),h=ie(E=>E.setShareDialogOpen),g=u?.language||"en",p=Vt(g),x=()=>h(!1);if(!r)return null;const y=c.replace(/(#json=.+)/,"/create$1"),v=c.replace(/(#json=.+)/,"/learn$1"),S=async()=>{try{await navigator.clipboard.writeText(y),a(!0),setTimeout(()=>a(!1),2e3)}catch(E){console.error("Failed to copy link:",E)}},b=async()=>{try{await navigator.clipboard.writeText(v),s(!0),setTimeout(()=>s(!1),2e3)}catch(E){console.error("Failed to copy link:",E)}};return m.jsxs(m.Fragment,{children:[m.jsx("div",{className:"drawer-overlay",onClick:x}),m.jsxs("div",{className:"share-dialog",children:[m.jsxs("header",{className:"drawer-header",children:[m.jsx("h2",{className:"drawer-title",children:p.share}),m.jsx("button",{className:"close-button",onClick:x,"aria-label":p.close,children:m.jsx(da,{size:20})})]}),m.jsxs("div",{className:"drawer-content",children:[m.jsxs("div",{style:{marginBottom:24},children:[m.jsx("h3",{style:{fontSize:14,fontWeight:600,marginBottom:8},children:"Edit Link"}),m.jsx("p",{style:{fontSize:13,color:"#666",marginBottom:12},children:"Share this link to allow others to edit the map"}),m.jsx("div",{style:{display:"flex",gap:8,marginBottom:8},children:m.jsx("input",{type:"text",value:y,readOnly:!0,style:{flex:1,padding:"8px 12px",border:"1px solid #d1d5db",borderRadius:4,fontSize:14,fontFamily:"monospace"},onClick:E=>E.currentTarget.select()})}),m.jsx("button",{onClick:S,className:"drawer-button",style:{width:"100%",display:"flex",alignItems:"center",justifyContent:"center",gap:8},children:n?m.jsxs(m.Fragment,{children:[m.jsx(t0,{size:16}),p.linkCopied]}):m.jsxs(m.Fragment,{children:[m.jsx(i0,{size:16}),"Copy Edit Link"]})})]}),m.jsxs("div",{children:[m.jsx("h3",{style:{fontSize:14,fontWeight:600,marginBottom:8},children:"Learn Link"}),m.jsx("p",{style:{fontSize:13,color:"#666",marginBottom:12},children:"Share this link for others to learn from the map"}),m.jsx("div",{style:{display:"flex",gap:8,marginBottom:8},children:m.jsx("input",{type:"text",value:v,readOnly:!0,style:{flex:1,padding:"8px 12px",border:"1px solid #d1d5db",borderRadius:4,fontSize:14,fontFamily:"monospace"},onClick:E=>E.currentTarget.select()})}),m.jsx("button",{onClick:b,className:"drawer-button",style:{width:"100%",display:"flex",alignItems:"center",justifyContent:"center",gap:8},children:i?m.jsxs(m.Fragment,{children:[m.jsx(t0,{size:16}),p.linkCopied]}):m.jsxs(m.Fragment,{children:[m.jsx(i0,{size:16}),"Copy Learn Link"]})})]})]})]})]})}function XT({onClose:n,onDownloadCurrent:a,onReplace:i}){const s=ie(g=>g.loadExternalDialogOpen),c=ie(g=>g.settings)?.language||"en",u=Vt(c);if(!s)return null;const h=()=>{a(),setTimeout(()=>i(),100)};return m.jsxs(m.Fragment,{children:[m.jsx("div",{className:"drawer-overlay",onClick:n}),m.jsxs("div",{className:"share-dialog",children:[m.jsxs("header",{className:"drawer-header",children:[m.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[m.jsx(t3,{size:20,color:"#f59e0b"}),m.jsx("h2",{className:"drawer-title",style:{margin:0},children:"Warning"})]}),m.jsx("button",{className:"close-button",onClick:n,"aria-label":u.close,children:m.jsx(da,{size:20})})]}),m.jsxs("div",{className:"drawer-content",children:[m.jsx("p",{style:{marginBottom:16},children:u.loadExternalWarning}),m.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8},children:[m.jsxs("button",{onClick:h,className:"drawer-button",style:{display:"flex",alignItems:"center",justifyContent:"center",gap:8},children:[m.jsx(n0,{size:16}),u.downloadCurrentMap]}),m.jsx("button",{onClick:i,className:"drawer-button",style:{display:"flex",alignItems:"center",justifyContent:"center",gap:8,backgroundColor:"#dc2626"},children:u.replaceWithExternal})]})]})]})]})}var ky=B.memo(({defaultLanguage:n="en",jsonStore:a="https://json.openpatch.org"})=>{const i=ie(S=>S.settings),s=ie(S=>S.helpOpen),r=ie(S=>S.pendingExternalId),[c]=_y(),u=ie(S=>S.setHelpOpen);ie(S=>S.setShareDialogOpen);const h=ie(S=>S.setLoadExternalDialogOpen),g=ie(S=>S.setPendingExternalId),{downloadRoadmap:p}=Rf(),x=i?.language||n,y=Vt(x);B.useEffect(()=>{const S=window.location.hash;if(S.startsWith("#json=")){const b=S.replace("#json=","");b&&b!==r&&(g(b),h(!0))}},[]);const v=[{action:y.shortcuts.undo,shortcut:"Ctrl+Z"},{action:y.shortcuts.redo,shortcut:"Ctrl+Y or Ctrl+Shift+Z"},{action:y.shortcuts.addTaskNode,shortcut:"Ctrl+1"},{action:y.shortcuts.addTopicNode,shortcut:"Ctrl+2"},{action:y.shortcuts.addImageNode,shortcut:"Ctrl+3"},{action:y.shortcuts.addTextNode,shortcut:"Ctrl+4"},{action:y.shortcuts.deleteNodeEdge,shortcut:"Delete"},{action:y.shortcuts.togglePreviewMode,shortcut:"Ctrl+P"},{action:y.shortcuts.toggleDebugMode,shortcut:"Ctrl+D"},{action:y.shortcuts.selectMultipleNodes,shortcut:"Ctrl+Click or Shift+Drag"},{action:y.shortcuts.selectAllNodes,shortcut:"Ctrl+A"},{action:y.shortcuts.showHelp,shortcut:"Ctrl+? or Help Button"},{action:y.shortcuts.save,shortcut:"Ctrl+S"},{action:y.shortcuts.zoomIn,shortcut:"Ctrl++"},{action:y.shortcuts.zoomOut,shortcut:"Ctrl+-"},{action:y.shortcuts.resetZoom,shortcut:"Ctrl+0"},{action:y.shortcuts.resetMap,shortcut:"Ctrl+Delete"},{action:y.shortcuts.fitView,shortcut:"Shift+!"},{action:y.shortcuts.zoomToSelection,shortcut:"Shift+@"},{action:y.shortcuts.toggleGrid,shortcut:"Ctrl+'"},{action:y.shortcuts.cut,shortcut:"Ctrl+X"},{action:y.shortcuts.copy,shortcut:"Ctrl+C"},{action:y.shortcuts.paste,shortcut:"Ctrl+V"}];return m.jsxs(m.Fragment,{children:[m.jsxs("dialog",{className:"help",open:s,onClose:()=>u(!1),children:[m.jsxs("header",{className:"help-header",children:[m.jsx("h2",{children:y.keyboardShortcuts}),m.jsx("button",{className:"close-button",onClick:()=>u(!1),"aria-label":y.close,children:m.jsx(da,{size:20})})]}),m.jsx("div",{className:"help-content",children:m.jsxs("table",{children:[m.jsx("thead",{children:m.jsxs("tr",{children:[m.jsx("th",{children:y.action}),m.jsx("th",{children:y.shortcut})]})}),m.jsx("tbody",{children:v.map(S=>m.jsxs("tr",{children:[m.jsx("td",{children:S.action}),m.jsx("td",{children:S.shortcut})]},S.action))})]})}),m.jsx("div",{className:"help-footer",children:m.jsx("button",{className:"primary-button",onClick:()=>u(!1),children:y.close})})]}),m.jsx(qT,{}),m.jsx(XT,{onClose:()=>{h(!1),g(null)},onDownloadCurrent:p,onReplace:()=>{r&&c(r)}})]})});ky.displayName="EditorDialogs";var GT={addTaskNode:{key:"1",ctrl:!0},addTopicNode:{key:"2",ctrl:!0},addImageNode:{key:"3",ctrl:!0},addTextNode:{key:"4",ctrl:!0},save:{key:"s",ctrl:!0},undo:{key:"z",ctrl:!0},redo:{key:"y",ctrl:!0},help:{key:"?",ctrl:!0},togglePreview:{key:"p",ctrl:!0},toggleDebug:{key:"d",ctrl:!0},zoomIn:{key:"+",ctrl:!0},zoomOut:{key:"-",ctrl:!0},resetZoom:{key:"0",ctrl:!0},toggleGrid:{key:"'",ctrl:!0},resetMap:{key:"Delete",ctrl:!0},cut:{key:"x",ctrl:!0},copy:{key:"c",ctrl:!0},paste:{key:"v",ctrl:!0},selectAll:{key:"a",ctrl:!0},fitView:{key:"!",shift:!0},zoomToSelection:{key:"@",shift:!0},deleteSelected:{key:"Delete"}},xt=(n,a)=>{if(!a)return!1;const i=n.key.toLowerCase()===a.key.toLowerCase(),s=a.ctrl?n.ctrlKey||n.metaKey:!(n.ctrlKey||n.metaKey),r=a.shift?n.shiftKey:!n.shiftKey,c=a.alt?n.altKey:!n.altKey;return i&&s&&r&&c},ZT=({jsonStore:n="https://json.openpatch.org",keyBindings:a={}})=>{const i={...GT,...a},{zoomIn:s,zoomOut:r,setCenter:c,fitView:u,screenToFlowPosition:h}=Wa(),g=ie(le=>le.helpOpen),p=ie(le=>le.selectedNodeIds),x=ie(le=>le.selectedEdge),y=ie(le=>le.nodes),v=ie(le=>le.lastMousePosition),S=ie(le=>le.settings),b=ie(le=>le.setHelpOpen),E=ie(le=>le.addNode),_=ie(le=>le.getRoadmapData),T=ie(le=>le.setPreviewMode),z=ie(le=>le.setDebugMode),N=ie(le=>le.setClipboard),C=ie(le=>le.clipboard),D=ie(le=>le.setNodes),R=ie(le=>le.setEdges),j=ie(le=>le.setSelectedNodeIds),K=ie(le=>le.showGrid),J=ie(le=>le.setShowGrid),fe=ie(le=>le.deleteNode),U=ie(le=>le.deleteEdge),F=ie(le=>le.setSelectedEdge),ae=ie(le=>le.setEdgeDrawerOpen),H=ie(le=>le.drawerOpen),I=ie(le=>le.edgeDrawerOpen),k=ie(le=>le.settingsDrawerOpen),L=S?.language||"en",$=Vt(L),{undo:Z,redo:Y}=Ey(le=>({undo:le.undo,redo:le.redo})),A=le=>{const de=v||h({x:window.innerWidth/2,y:window.innerHeight/2}),Je={id:`node-${Date.now()}`,type:le,position:de,data:{label:le==="task"?$.newTask:le==="topic"?$.newTopic:le,state:"unlocked"}};E(Je)},O=()=>{if(x){U(x.id),F(null),ae(!1);return}p.length>0&&(p.forEach(le=>{fe(le)}),j([]))},G=()=>{const le=_(),de="data:text/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(le,null,2)),Je=document.createElement("a");Je.setAttribute("href",de),Je.setAttribute("download","learningmap.json"),document.body.appendChild(Je),Je.click(),Je.remove()},P=()=>{const le=ie.getState().previewMode;T(!le)},se=()=>{const le=ie.getState().debugMode;z(!le)},ge=()=>{confirm($.resetMapWarning)&&(D([]),R([]))},he=()=>{const le=y.filter(de=>p.includes(de.id));le.length>0&&(N({nodes:le,edges:[]}),p.forEach(de=>{fe(de)}),j([]))},ue=()=>{const le=y.filter(de=>p.includes(de.id));le.length>0&&N({nodes:le,edges:[]})},me=()=>{if(C&&C.nodes.length>0){const le=C.nodes.map(de=>({...de,id:`node-${Date.now()}-${Math.random()}`,position:{x:de.position.x+50,y:de.position.y+50}}));D([...y,...le]),j(le.map(de=>de.id))}},Ne=()=>{j(y.map(le=>le.id))},ke=()=>s(),Se=()=>r(),_e=()=>c(0,0,{zoom:1}),we=()=>u(),Me=()=>{if(p.length>0){const le=y.filter(de=>p.includes(de.id));le.length>0&&u({nodes:le,duration:300})}},Re=()=>J(!K);return B.useEffect(()=>{const le=de=>{H||I||k||(xt(de,i.addTaskNode)?(de.preventDefault(),A("task")):xt(de,i.addTopicNode)?(de.preventDefault(),A("topic")):xt(de,i.addImageNode)?(de.preventDefault(),A("image")):xt(de,i.addTextNode)?(de.preventDefault(),A("text")):xt(de,i.save)?(de.preventDefault(),G()):xt(de,i.undo)?(de.preventDefault(),Z()):xt(de,i.redo)?(de.preventDefault(),Y()):xt(de,i.help)?(de.preventDefault(),b(!g)):xt(de,i.togglePreview)?(de.preventDefault(),P()):xt(de,i.toggleDebug)?(de.preventDefault(),se()):xt(de,i.zoomIn)?(de.preventDefault(),ke()):xt(de,i.zoomOut)?(de.preventDefault(),Se()):xt(de,i.resetZoom)?(de.preventDefault(),_e()):xt(de,i.toggleGrid)?(de.preventDefault(),Re()):xt(de,i.resetMap)?(de.preventDefault(),ge()):xt(de,i.cut)?(de.preventDefault(),he()):xt(de,i.copy)?(de.preventDefault(),ue()):xt(de,i.paste)?(de.preventDefault(),me()):xt(de,i.selectAll)?(de.preventDefault(),Ne()):xt(de,i.fitView)?(de.preventDefault(),we()):xt(de,i.zoomToSelection)?(de.preventDefault(),Me()):xt(de,i.deleteSelected)&&(de.preventDefault(),O()))};return window.addEventListener("keydown",le),()=>{window.removeEventListener("keydown",le)}},[A,O,G,Z,Y,g,b,P,se,ke,Se,_e,we,Me,Re,ge,he,ue,me,Ne,H,I,k,i]),null};function IT({roadmapData:n,language:a="en",jsonStore:i="https://json.openpatch.org",disableSharing:s=!1,disableFileOperations:r=!1,disablePersist:c=!1,keyBindings:u}){const h=ie(_=>_.nodes),g=ie(_=>_.edges),p=ie(_=>_.settings),x=ie(_=>_.previewMode),y=ie(_=>_.getRoadmapData),v=ie(_=>_.setJsonStore),S=ie(_=>_.setDefaultLanguage),b=ie(_=>_.loadRoadmapData),E=p?.language||a;return B.useEffect(()=>{ET(!c)},[c]),B.useEffect(()=>{v(i),S(a)},[i,a,v,S]),B.useEffect(()=>{if(n)if(typeof n=="string")try{const _=JSON.parse(n);b(_)}catch(_){console.error("Failed to parse roadmapData JSON string",_)}else b(n)},[n,b]),m.jsxs(m.Fragment,{children:[m.jsx(ZT,{jsonStore:i,keyBindings:u}),m.jsx(NT,{defaultLanguage:a,disableSharing:s,disableFileOperations:r}),x&&m.jsx(Sy,{roadmapData:y(),language:E}),!x&&m.jsxs(m.Fragment,{children:[h.length===0&&g.length===0&&m.jsx(TT,{defaultLanguage:a}),m.jsx(Ny,{defaultLanguage:a}),m.jsx(ky,{defaultLanguage:a,jsonStore:i})]})]})}var QT=n=>m.jsx("div",{className:"hyperbook-learningmap-container",children:m.jsx(Zu,{children:m.jsx(IT,{...n})})});const KT=ep(wT,{props:{roadmapData:"string",language:"string",onChange:"function",initialState:"json"},events:{change:!0}});customElements.define("hyperbook-learningmap",KT);const FT=ep(QT,{props:{roadmapData:"string",language:"string",jsonStore:"string",disableSharing:"boolean",disableFileOperations:"boolean",keyBindings:"json",onChange:"function"},events:{change:!0}});customElements.define("hyperbook-learningmap-editor",FT)}));
@@ -1 +1 @@
1
- @charset "UTF-8";.szh-menu{margin:0;padding:0;list-style:none;box-sizing:border-box;width:max-content;z-index:100;border:1px solid rgba(0,0,0,.1);background-color:#fff}.szh-menu:focus{outline:none}.szh-menu__arrow{box-sizing:border-box;width:.75rem;height:.75rem;background-color:#fff;border:1px solid transparent;border-left-color:#0000001a;border-top-color:#0000001a;z-index:-1}.szh-menu__arrow--dir-left{right:-.375rem;transform:translateY(-50%) rotate(135deg)}.szh-menu__arrow--dir-right{left:-.375rem;transform:translateY(-50%) rotate(-45deg)}.szh-menu__arrow--dir-top{bottom:-.375rem;transform:translate(-50%) rotate(-135deg)}.szh-menu__arrow--dir-bottom{top:-.375rem;transform:translate(-50%) rotate(45deg)}.szh-menu__item{cursor:pointer}.szh-menu__item:focus{outline:none}.szh-menu__item--hover{background-color:#ebebeb}.szh-menu__item--focusable{cursor:default;background-color:inherit}.szh-menu__item--disabled{cursor:default;color:#aaa}.szh-menu__group{box-sizing:border-box}.szh-menu__radio-group{margin:0;padding:0;list-style:none}.szh-menu__divider{height:1px;margin:.5rem 0;background-color:#0000001f}.szh-menu-button{box-sizing:border-box}.szh-menu{-webkit-user-select:none;user-select:none;color:#212529;border:none;border-radius:.25rem;box-shadow:0 3px 7px #0002,0 .6px 2px #0000001a;min-width:10rem;padding:.5rem 0}.szh-menu__item{display:flex;align-items:center;position:relative;padding:.375rem 1.5rem}.szh-menu-container--itemTransition .szh-menu__item{transition-property:background-color,color;transition-duration:.15s;transition-timing-function:ease-in-out}.szh-menu__item--type-radio{padding-left:2.2rem}.szh-menu__item--type-radio:before{content:"○";position:absolute;left:.8rem;top:.55rem;font-size:.8rem}.szh-menu__item--type-radio.szh-menu__item--checked:before{content:"●"}.szh-menu__item--type-checkbox{padding-left:2.2rem}.szh-menu__item--type-checkbox:before{position:absolute;left:.8rem}.szh-menu__item--type-checkbox.szh-menu__item--checked:before{content:"✔"}.szh-menu__submenu>.szh-menu__item{padding-right:2.5rem}.szh-menu__submenu>.szh-menu__item:after{content:"❯";position:absolute;right:1rem}.szh-menu__header{color:#888;font-size:.8rem;padding:.2rem 1.5rem;text-transform:uppercase}.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}:root{--learningmap-color-openpatch: #007864;--learningmap-color-dark-forest: #004c45;--learningmap-color-freshmint: #b5e3d8;--learningmap-color-black: #000000;--learningmap-color-coal: #242428;--learningmap-color-charcoal: #3c3c3c;--learningmap-color-quicksilver: #a4a4a4;--learningmap-color-whitesmoke: #f5f5f5;--learningmap-color-white: #ffffff}.hyperbook-learningmap-container{width:100%;height:100%;display:flex;flex-direction:column;color:var(--learningmap-color-black);overflow:hidden;font-family:sans-serif}.editor-toolbar{width:100%;background:#fff;border-bottom:1px solid #e5e7eb;padding:12px 24px;display:flex;justify-content:space-between;align-items:center;z-index:10;box-sizing:border-box}.toolbar-group{display:flex;gap:8px}.toolbar-button{padding:8px 16px;border:1px solid #d1d5db;border-radius:6px;background:#fff;color:#1f2937;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;gap:6px;transition:all .2s}.toolbar-button:hover{background:#f3f4f6;border-color:#3b82f6}.toolbar-button.primary{background:var(--learningmap-color-openpatch);color:#fff;border-color:var(--learningmap-color-openpatch)}.toolbar-button.primary:hover{background:#2563eb;border-color:#2563eb}.toolbar-button.active{background:var(--learningmap-color-openpatch);color:#fff;border-color:var(--learningmap-color-openpatch)}.toolbar-button.active:hover{background:#2563eb;border-color:#2563eb}.toolbar-button:disabled{background:#f3f4f6;color:#9ca3af;border-color:#e5e7eb;cursor:not-allowed}.editor-canvas{flex:1;min-height:0;position:relative;width:100%}.react-flow__node{color:#000}.react-flow__node-background img{max-width:none}.drawer-overlay{position:fixed;inset:0;background:#000000b3;z-index:1002;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideIn{0%{transform:translate(100%)}to{transform:translate(0)}}.drawer{position:fixed;top:0;right:0;bottom:0;width:500px;max-width:90vw;background:var(--color-nav, white);color:var(--color-text, #000);box-shadow:-4px 0 12px #0000001a;z-index:1003;display:flex;flex-direction:column;animation:slideIn .3s ease}header.drawer-header{background:none;box-shadow:none}.drawer-header{padding-top:24px;padding-left:24px;padding-right:24px;display:flex;justify-content:space-between;align-items:center}.drawer-title{font-size:24px;font-weight:700;margin:0}.drawer-title h2{text-decoration:none;border:none}.drawer-footer button{width:100%}.close-button{background:none;border:none;cursor:pointer;padding:4px;color:var(--color-text, #6b7280);transition:color .2s}.close-button:hover{color:var(--color-text, #1f2937)}.drawer-content{flex:1;overflow-y:auto;padding:24px}.drawer-description{line-height:1.6}.drawer-description h1,.drawer-description h2,.drawer-description h3,.drawer-description h4,.drawer-description h5,.drawer-description h6{margin-top:1em;margin-bottom:.5em;font-weight:600;line-height:1.25}.drawer-description h1{font-size:1.5em}.drawer-description h2{font-size:1.25em}.drawer-description h3{font-size:1.1em}.drawer-description p{margin-bottom:1em}.drawer-description ul,.drawer-description ol{margin-bottom:1em;padding-left:2em}.drawer-description li{margin-bottom:.25em}.drawer-description code{background-color:#f3f4f6;padding:.2em .4em;border-radius:3px;font-size:.9em;font-family:monospace}.drawer-description pre{background-color:#f3f4f6;padding:1em;border-radius:6px;overflow-x:auto;margin-bottom:1em}.drawer-description pre code{background-color:transparent;padding:0}.drawer-description a{color:var(--learningmap-color-openpatch);text-decoration:underline}.drawer-description blockquote{border-left:4px solid #d1d5db;padding-left:1em;margin-left:0;margin-bottom:1em;color:#6b7280}.drawer-footer{padding:24px;display:flex;gap:12px;justify-content:flex-end}.share-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90%;max-width:500px;background:var(--color-nav, white);border-radius:8px;box-shadow:0 8px 32px #0003;z-index:1003;display:flex;flex-direction:column;animation:scaleIn .2s ease}@keyframes scaleIn{0%{opacity:0;transform:translate(-50%,-50%) scale(.95)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.form-group{margin-bottom:20px}.form-group label{display:block;font-size:14px;font-weight:600;margin-bottom:6px;color:#374151}.form-group input[type=text],.form-group input[type=date],.form-group input[type=number],.form-group input[type=color],.form-group textarea,.form-group select{width:100%;padding:10px 12px;border:1px solid #d1d5db;border-radius:6px;font-size:14px;background:#fff;color:#1f2937;box-sizing:border-box;transition:border-color .2s}.form-group input[type=color]{height:64px}.form-group input:focus,.form-group textarea:focus,.form-group select:focus{outline:none;border-color:var(--learningmap-color-openpatch)}.form-group textarea{resize:vertical;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.primary-button{padding:10px 20px;background:var(--learningmap-color-openpatch);color:#fff;border:none;border-radius:6px;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:6px;transition:background .2s}.primary-button:hover{background:var(--learningmap-color-dark-forest)}.secondary-button{padding:8px 16px;background:#fff;color:#1f2937;border:1px solid #d1d5db;border-radius:6px;font-size:14px;cursor:pointer;display:flex;align-items:center;gap:6px;transition:all .2s;width:100%;justify-content:center}.secondary-button:hover{background:#f3f4f6}.danger-button{padding:10px 20px;background:#ef4444;color:#fff;border:none;border-radius:6px;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;gap:6px;transition:background .2s}.danger-button:hover{background:#dc2626}.drawer-button{padding:14px 20px;display:flex;align-items:center;justify-content:center;gap:8px;transition:all .2s;background:var(--color-nav, white);color:var(--color-text, #1f2937);border:1px solid var(--color-nav-border, #d1d5db);border-radius:6px;font-size:14px;cursor:pointer}.drawer-button:hover{background:var(--color-spacer, #f3f4f6);border-color:var(--color-brand, var(--learningmap-color-openpatch))}.drawer-button.locked{background:var(--color-nav, #f3f4f6);color:var(--color-text, #9ca3af);border-color:var(--color-nav-border, #e5e7eb);cursor:not-allowed}.drawer-button.started{background:#fef3c7;border-color:#f59e42;color:#b45309}.drawer-button.completed,.drawer-button.mastered{background:#d1fae5;border-color:#10b981;color:#065f46}.icon-button{padding:6px;background:none;border:1px solid var(--color-nav-border, #d1d5db);border-radius:4px;cursor:pointer;color:var(--color-text, #6b7280);transition:all .2s}.icon-button:hover{background:var(--color-spacer, #f3f4f6);color:#ef4444}.react-flow__controls-button svg.lucide{fill:none}.react-flow__controls-button{transition:all .2s;color:#000}.react-flow__controls-button:hover{background:#f3f4f6}.react-flow__controls-button:disabled{background:#f3f4f6;color:#9ca3af}.react-flow__handle{width:10px;height:10px;background:var(--learningmap-color-openpatch);border:2px solid white}.react-flow__edge.selected path{stroke:var(--learningmap-color-openpatch)!important;stroke-width:3!important}.react-flow__node.selected{outline:2px solid var(--learningmap-color-openpatch);box-shadow:0 0 0 4px #3b82f64d}.react-flow__node-image img{width:100%}.react-flow__node-task{padding:16px 24px;border-radius:16px;border:2px solid;border-color:var(--learningmap-color-openpatch);background:#f0f7ff;box-shadow:0 4px 6px -1px #0000001a}.react-flow__node-task .icon{position:absolute;top:-10px;right:-10px;fill:#fff;stroke:var(--learningmap-color-openpatch)}.react-flow__node-topic{padding:16px 24px;border-radius:16px;border:2px solid;border-color:#f59e42;background:#fffbe6;box-shadow:0 4px 6px -1px #0000001a}.react-flow__node-topic .icon{position:absolute;top:-10px;left:-10px;fill:#fff;stroke:#f59e42}.react-flow__node-topic.black,.react-flow__node-task.black{border-color:#374151;background:#f3f4f6}:is(.react-flow__node-topic.black,.react-flow__node-task.black) .icon{stroke:#374151}.react-flow__node-topic.white,.react-flow__node-task.white{border-color:#9ca3af;background:#f9fafb}:is(.react-flow__node-topic.white,.react-flow__node-task.white) .icon{stroke:#9ca3af}.react-flow__node-topic.lila,.react-flow__node-task.lila{border-color:#9e86ed;background:#f3e8ff}:is(.react-flow__node-topic.lila,.react-flow__node-task.lila) .icon{stroke:#9e86ed}.react-flow__node-topic.pink,.react-flow__node-task.pink{border-color:#ec4899;background:#fdf2f8}:is(.react-flow__node-topic.pink,.react-flow__node-task.pink) .icon{stroke:#ec4899}.react-flow__node-topic.teal,.react-flow__node-task.teal{border-color:#14b8a6;background:#e0f2fe}:is(.react-flow__node-topic.teal,.react-flow__node-task.teal) .icon{stroke:#14b8a6}.react-flow__node-topic.yellow,.react-flow__node-task.yellow{border-color:#f59e42;background:#fffbeb}:is(.react-flow__node-topic.yellow,.react-flow__node-task.yellow) .icon{stroke:#f59e42}.react-flow__node-topic.red,.react-flow__node-task.red{border-color:#ef4444;background:#fef2f2}:is(.react-flow__node-topic.red,.react-flow__node-task.red) .icon{stroke:#ef4444}.react-flow__node-topic.blue,.react-flow__node-task.blue{border-color:var(--learningmap-color-openpatch);background:#eff6ff}:is(.react-flow__node-topic.blue,.react-flow__node-task.blue) .icon{stroke:var(--learningmap-color-openpatch)}.react-flow__node-task.completed,.react-flow__node-topic.completed{text-decoration:line-through;border-color:#10b981;background:#ecfdf5}:is(.react-flow__node-task.completed,.react-flow__node-topic.completed) .icon{stroke:#10b981}.react-flow__node-task.locked,.react-flow__node-topic.locked{border-color:#6b7280;background:#e5e7eb}:is(.react-flow__node-task.locked,.react-flow__node-topic.locked) .icon{stroke:#6b7280}.react-flow__node-task.mastered,.react-flow__node-topic.mastered{text-decoration:line-through;border-color:#10b981;background:#ecfdf5}:is(.react-flow__node-task.mastered,.react-flow__node-topic.mastered) .icon{stroke:#10b981}dialog.help[open]{width:600px;max-width:90vw;max-height:90vh;border:none;border-radius:12px;box-shadow:0 10px 25px #0000001a;padding:0;background:#fff;position:fixed;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;z-index:1000;overflow:hidden}dialog.help[open] .help-header{padding:24px 24px 16px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #e5e7eb}dialog.help[open] .help-header button{width:auto}dialog.help[open] .help-header h2{margin:0;font-size:24px;font-weight:700}dialog.help[open] .help-content{flex:1;overflow-y:auto;padding:16px 24px}dialog.help[open] .help-footer{padding:16px 24px 24px;border-top:1px solid #e5e7eb}dialog.help[open] table{width:100%;border-collapse:collapse}dialog.help[open] th,dialog.help[open] td{border:1px solid #e5e7eb;padding:8px;text-align:left}dialog.help[open] th{background:#f3f4f6}dialog.help[open] button{width:100%}.szh-menu__item svg{margin-right:8px}.szh-menu__item--anchor{color:inherit;text-decoration:none}.szh-menu__submenu.active,.szh-menu__item.active{color:var(--learningmap-color-openpatch)}.link-button{color:var(--learningmap-color-openpatch);text-decoration:underline;background:none;border:none;padding:0;font:inherit;cursor:pointer}.multi-node-panel{border-color:var(--learningmap-color-openpatch);border-bottom:1px solid #e5e7eb;background:#fff;border-radius:6px;display:flex;justify-content:space-between;align-items:center;gap:12px;box-sizing:border-box}.multi-node-panel button{padding:8px;border:none;border-radius:6px;background:#fff;color:#1f2937;font-size:10px;font-weight:500;cursor:pointer;transition:all .2s}.multi-node-panel button:hover{background:#f3f4f6;border-color:var(--learningmap-color-openpatch)}.progress-panel{width:80%;padding:8px;border-radius:6px;box-shadow:0 1px 2px #0000000d;background:#fff;border:1px solid #d1d5db;display:flex;justify-content:space-between;font-size:14px;margin-bottom:4px}.progress-panel .mastered-counter,.progress-panel .completed-counter{color:#10b981;width:150px;-webkit-user-select:none;user-select:none}.progress-panel .completed-counter{display:flex;justify-content:flex-start}.progress-panel .mastered-counter{display:flex;justify-content:flex-end}.progress-panel .progress-value{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);color:#266651;-webkit-user-select:none;user-select:none;font-weight:600}.progress-panel .progress-bar-container{position:relative;width:100%;border:1px solid #d1d5db;background:#f3f4f6;border-radius:9999px;overflow:hidden}.progress-panel .progress-bar-fill{height:100%;background:#10b981;border-radius:9999px;transition:width .3s ease}.progress-panel .progress-text{font-size:12px;margin-top:4px}.welcome-message{position:absolute;inset:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;z-index:1;pointer-events:none;overflow-y:auto;overflow-x:hidden}.welcome-content{text-align:center;max-width:500px;width:100%;padding:40px 20px;pointer-events:auto;box-sizing:border-box;flex-shrink:0}.welcome-title{font-size:48px;display:flex;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;font-weight:700;color:#1f2937;margin:0 0 16px}.welcome-title img{height:96px;width:96px;margin-right:16px}.welcome-subtitle{-webkit-user-select:none;user-select:none;font-size:24px;color:#6b7280;margin:0 0 32px}.welcome-actions{display:flex;flex-direction:column;gap:12px;align-items:center}.welcome-actions button{width:100%;max-width:280px;justify-content:center;font-size:16px;padding:12px 24px}@media (max-width: 640px){.editor-toolbar{padding:8px 12px}.toolbar-button{padding:6px 12px;font-size:13px}.toolbar-label{display:none}.welcome-title{font-size:36px}.welcome-content{padding:20px 16px}.welcome-subtitle{font-size:24px;margin:0 0 24px}.welcome-actions button{max-width:100%;font-size:14px;padding:10px 20px}}.editor-panel{pointer-events:all}.panel-inner{width:450px;max-width:90vw;max-height:80vh;background:var(--color-nav, white);border:1px solid #e5e7eb;border-radius:8px;box-shadow:0 4px 12px #00000026;display:flex;flex-direction:column;overflow:hidden}.panel-header{padding:16px 20px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #e5e7eb;flex-shrink:0}.panel-title{font-size:20px;font-weight:700;margin:0}.panel-content{flex:1;overflow-y:auto;padding:20px}.panel-footer{padding:16px 20px;display:flex;gap:8px;border-top:1px solid #e5e7eb;flex-shrink:0}.panel-footer button{flex:1;justify-content:center}.panel-footer-centered{justify-content:center}.panel-footer-centered button{flex:1}
1
+ @charset "UTF-8";.szh-menu{margin:0;padding:0;list-style:none;box-sizing:border-box;width:max-content;z-index:100;border:1px solid rgba(0,0,0,.1);background-color:#fff}.szh-menu:focus{outline:none}.szh-menu__arrow{box-sizing:border-box;width:.75rem;height:.75rem;background-color:#fff;border:1px solid transparent;border-left-color:#0000001a;border-top-color:#0000001a;z-index:-1}.szh-menu__arrow--dir-left{right:-.375rem;transform:translateY(-50%) rotate(135deg)}.szh-menu__arrow--dir-right{left:-.375rem;transform:translateY(-50%) rotate(-45deg)}.szh-menu__arrow--dir-top{bottom:-.375rem;transform:translate(-50%) rotate(-135deg)}.szh-menu__arrow--dir-bottom{top:-.375rem;transform:translate(-50%) rotate(45deg)}.szh-menu__item{cursor:pointer}.szh-menu__item:focus{outline:none}.szh-menu__item--hover{background-color:#ebebeb}.szh-menu__item--focusable{cursor:default;background-color:inherit}.szh-menu__item--disabled{cursor:default;color:#aaa}.szh-menu__group{box-sizing:border-box}.szh-menu__radio-group{margin:0;padding:0;list-style:none}.szh-menu__divider{height:1px;margin:.5rem 0;background-color:#0000001f}.szh-menu-button{box-sizing:border-box}.szh-menu{-webkit-user-select:none;user-select:none;color:#212529;border:none;border-radius:.25rem;box-shadow:0 3px 7px #0002,0 .6px 2px #0000001a;min-width:10rem;padding:.5rem 0}.szh-menu__item{display:flex;align-items:center;position:relative;padding:.375rem 1.5rem}.szh-menu-container--itemTransition .szh-menu__item{transition-property:background-color,color;transition-duration:.15s;transition-timing-function:ease-in-out}.szh-menu__item--type-radio{padding-left:2.2rem}.szh-menu__item--type-radio:before{content:"○";position:absolute;left:.8rem;top:.55rem;font-size:.8rem}.szh-menu__item--type-radio.szh-menu__item--checked:before{content:"●"}.szh-menu__item--type-checkbox{padding-left:2.2rem}.szh-menu__item--type-checkbox:before{position:absolute;left:.8rem}.szh-menu__item--type-checkbox.szh-menu__item--checked:before{content:"✔"}.szh-menu__submenu>.szh-menu__item{padding-right:2.5rem}.szh-menu__submenu>.szh-menu__item:after{content:"❯";position:absolute;right:1rem}.szh-menu__header{color:#888;font-size:.8rem;padding:.2rem 1.5rem;text-transform:uppercase}.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}:root{--learningmap-color-openpatch: #007864;--learningmap-color-dark-forest: #004c45;--learningmap-color-freshmint: #b5e3d8;--learningmap-color-black: #000000;--learningmap-color-coal: #242428;--learningmap-color-charcoal: #3c3c3c;--learningmap-color-quicksilver: #a4a4a4;--learningmap-color-whitesmoke: #f5f5f5;--learningmap-color-white: #ffffff}.hyperbook-learningmap-container{width:100%;height:100%;display:flex;flex-direction:column;color:var(--learningmap-color-black);overflow:hidden;font-family:sans-serif}.editor-toolbar{width:100%;background:#fff;border-bottom:1px solid #e5e7eb;padding:12px 24px;display:flex;justify-content:space-between;align-items:center;z-index:10;box-sizing:border-box}.toolbar-group{display:flex;gap:8px}.toolbar-button{padding:8px 16px;border:1px solid #d1d5db;border-radius:6px;background:#fff;color:#1f2937;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;gap:6px;transition:all .2s}.toolbar-button:hover{background:#f3f4f6;border-color:#3b82f6}.toolbar-button.primary{background:var(--learningmap-color-openpatch);color:#fff;border-color:var(--learningmap-color-openpatch)}.toolbar-button.primary:hover{background:#2563eb;border-color:#2563eb}.toolbar-button.active{background:var(--learningmap-color-openpatch);color:#fff;border-color:var(--learningmap-color-openpatch)}.toolbar-button.active:hover{background:#2563eb;border-color:#2563eb}.toolbar-button:disabled{background:#f3f4f6;color:#9ca3af;border-color:#e5e7eb;cursor:not-allowed}.editor-canvas{flex:1;min-height:0;position:relative;width:100%}.react-flow__node{color:#000}.react-flow__node-background img{max-width:none}.drawer-overlay{position:fixed;inset:0;background:#000000b3;z-index:1002;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideIn{0%{transform:translate(100%)}to{transform:translate(0)}}.drawer{position:fixed;top:0;right:0;bottom:0;width:500px;max-width:90vw;background:var(--color-nav, white);color:var(--color-text, #000);box-shadow:-4px 0 12px #0000001a;z-index:1003;display:flex;flex-direction:column;animation:slideIn .3s ease}header.drawer-header{background:none;box-shadow:none}.drawer-header{padding-top:24px;padding-left:24px;padding-right:24px;display:flex;justify-content:space-between;align-items:center}.drawer-title{font-size:24px;font-weight:700;margin:0}.drawer-title h2{text-decoration:none;border:none}.drawer-footer button{width:100%}.close-button{background:none;border:none;cursor:pointer;padding:4px;color:var(--color-text, #6b7280);transition:color .2s}.close-button:hover{color:var(--color-text, #1f2937)}.drawer-content{flex:1;overflow-y:auto;padding:24px}.drawer-description{line-height:1.6}.drawer-description h1,.drawer-description h2,.drawer-description h3,.drawer-description h4,.drawer-description h5,.drawer-description h6{margin-top:1em;margin-bottom:.5em;font-weight:600;line-height:1.25}.drawer-description h1{font-size:1.5em}.drawer-description h2{font-size:1.25em}.drawer-description h3{font-size:1.1em}.drawer-description p{margin-bottom:1em}.drawer-description ul,.drawer-description ol{margin-bottom:1em;padding-left:2em}.drawer-description li{margin-bottom:.25em}.drawer-description code{background-color:#f3f4f6;padding:.2em .4em;border-radius:3px;font-size:.9em;font-family:monospace}.drawer-description pre{background-color:#f3f4f6;padding:1em;border-radius:6px;overflow-x:auto;margin-bottom:1em}.drawer-description pre code{background-color:transparent;padding:0}.drawer-description a{color:var(--learningmap-color-openpatch);text-decoration:underline}.drawer-description blockquote{border-left:4px solid #d1d5db;padding-left:1em;margin-left:0;margin-bottom:1em;color:#6b7280}.drawer-footer{padding:24px;display:flex;gap:12px;justify-content:flex-end}.share-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90%;max-width:500px;background:var(--color-nav, white);border-radius:8px;box-shadow:0 8px 32px #0003;z-index:1003;display:flex;flex-direction:column;animation:scaleIn .2s ease}@keyframes scaleIn{0%{opacity:0;transform:translate(-50%,-50%) scale(.95)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.form-group{margin-bottom:20px}.form-group label{display:block;font-size:14px;font-weight:600;margin-bottom:6px;color:#374151}.form-group input[type=text],.form-group input[type=date],.form-group input[type=number],.form-group input[type=color],.form-group textarea,.form-group select{width:100%;padding:10px 12px;border:1px solid #d1d5db;border-radius:6px;font-size:14px;background:#fff;color:#1f2937;box-sizing:border-box;transition:border-color .2s}.form-group input[type=color]{height:64px}.form-group input:focus,.form-group textarea:focus,.form-group select:focus{outline:none;border-color:var(--learningmap-color-openpatch)}.form-group textarea{resize:vertical;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}.primary-button{padding:10px 20px;background:var(--learningmap-color-openpatch);color:#fff;border:none;border-radius:6px;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:6px;transition:background .2s}.primary-button:hover{background:var(--learningmap-color-dark-forest)}.secondary-button{padding:8px 16px;background:#fff;color:#1f2937;border:1px solid #d1d5db;border-radius:6px;font-size:14px;cursor:pointer;display:flex;align-items:center;gap:6px;transition:all .2s;width:100%;justify-content:center}.secondary-button:hover{background:#f3f4f6}.danger-button{padding:10px 20px;background:#ef4444;color:#fff;border:none;border-radius:6px;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;gap:6px;transition:background .2s}.danger-button:hover{background:#dc2626}.drawer-button{padding:14px 20px;display:flex;align-items:center;justify-content:center;gap:8px;transition:all .2s;background:var(--color-nav, white);color:var(--color-text, #1f2937);border:1px solid var(--color-nav-border, #d1d5db);border-radius:6px;font-size:14px;cursor:pointer}.drawer-button:hover{background:var(--color-spacer, #f3f4f6);border-color:var(--color-brand, var(--learningmap-color-openpatch))}.drawer-button.locked{background:var(--color-nav, #f3f4f6);color:var(--color-text, #9ca3af);border-color:var(--color-nav-border, #e5e7eb);cursor:not-allowed}.drawer-button.started{background:#fef3c7;border-color:#f59e42;color:#b45309}.drawer-button.completed,.drawer-button.mastered{background:#d1fae5;border-color:#10b981;color:#065f46}.icon-button{padding:6px;background:none;border:1px solid var(--color-nav-border, #d1d5db);border-radius:4px;cursor:pointer;color:var(--color-text, #6b7280);transition:all .2s}.icon-button:hover{background:var(--color-spacer, #f3f4f6);color:#ef4444}.react-flow__controls-button svg.lucide{fill:none}.react-flow__controls-button{transition:all .2s;color:#000}.react-flow__controls-button:hover{background:#f3f4f6}.react-flow__controls-button:disabled{background:#f3f4f6;color:#9ca3af}.react-flow__handle{width:10px;height:10px;background:var(--learningmap-color-openpatch);border:2px solid white}.react-flow__edge.selected path{stroke:var(--learningmap-color-openpatch)!important;stroke-width:3!important}.react-flow__node.selected{outline:2px solid var(--learningmap-color-openpatch);box-shadow:0 0 0 4px #3b82f64d}.react-flow__node-image img{width:100%}.react-flow__node-task{padding:16px 24px;border-radius:16px;border:2px solid;border-color:var(--learningmap-color-openpatch);background:#f0f7ff;box-shadow:0 4px 6px -1px #0000001a}.react-flow__node-task .icon{position:absolute;top:-10px;right:-10px;fill:#fff;stroke:var(--learningmap-color-openpatch)}.react-flow__node-topic{padding:16px 24px;border-radius:16px;border:2px solid;border-color:#f59e42;background:#fffbe6;box-shadow:0 4px 6px -1px #0000001a}.react-flow__node-topic .icon{position:absolute;top:-10px;left:-10px;fill:#fff;stroke:#f59e42}.react-flow__node-topic.black,.react-flow__node-task.black{border-color:#374151;background:#f3f4f6}:is(.react-flow__node-topic.black,.react-flow__node-task.black) .icon{stroke:#374151}.react-flow__node-topic.white,.react-flow__node-task.white{border-color:#9ca3af;background:#f9fafb}:is(.react-flow__node-topic.white,.react-flow__node-task.white) .icon{stroke:#9ca3af}.react-flow__node-topic.lila,.react-flow__node-task.lila{border-color:#9e86ed;background:#f3e8ff}:is(.react-flow__node-topic.lila,.react-flow__node-task.lila) .icon{stroke:#9e86ed}.react-flow__node-topic.pink,.react-flow__node-task.pink{border-color:#ec4899;background:#fdf2f8}:is(.react-flow__node-topic.pink,.react-flow__node-task.pink) .icon{stroke:#ec4899}.react-flow__node-topic.teal,.react-flow__node-task.teal{border-color:#14b8a6;background:#e0f2fe}:is(.react-flow__node-topic.teal,.react-flow__node-task.teal) .icon{stroke:#14b8a6}.react-flow__node-topic.yellow,.react-flow__node-task.yellow{border-color:#f59e42;background:#fffbeb}:is(.react-flow__node-topic.yellow,.react-flow__node-task.yellow) .icon{stroke:#f59e42}.react-flow__node-topic.red,.react-flow__node-task.red{border-color:#ef4444;background:#fef2f2}:is(.react-flow__node-topic.red,.react-flow__node-task.red) .icon{stroke:#ef4444}.react-flow__node-topic.blue,.react-flow__node-task.blue{border-color:var(--learningmap-color-openpatch);background:#eff6ff}:is(.react-flow__node-topic.blue,.react-flow__node-task.blue) .icon{stroke:var(--learningmap-color-openpatch)}.react-flow__node-task.completed,.react-flow__node-topic.completed{text-decoration:line-through;border-color:#10b981;background:#ecfdf5}:is(.react-flow__node-task.completed,.react-flow__node-topic.completed) .icon{stroke:#10b981}.react-flow__node-task.locked,.react-flow__node-topic.locked{border-color:#6b7280;background:#e5e7eb}:is(.react-flow__node-task.locked,.react-flow__node-topic.locked) .icon{stroke:#6b7280}.react-flow__node-task.started,.react-flow__node-topic.started{outline:2px dashed #f59e42}.react-flow__node-task.mastered,.react-flow__node-topic.mastered{text-decoration:line-through;border-color:#10b981;background:#ecfdf5}:is(.react-flow__node-task.mastered,.react-flow__node-topic.mastered) .icon{stroke:#10b981}dialog.help[open]{width:600px;max-width:90vw;max-height:90vh;border:none;border-radius:12px;box-shadow:0 10px 25px #0000001a;padding:0;background:#fff;position:fixed;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;z-index:1000;overflow:hidden}dialog.help[open] .help-header{padding:24px 24px 16px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #e5e7eb}dialog.help[open] .help-header button{width:auto}dialog.help[open] .help-header h2{margin:0;font-size:24px;font-weight:700}dialog.help[open] .help-content{flex:1;overflow-y:auto;padding:16px 24px}dialog.help[open] .help-footer{padding:16px 24px 24px;border-top:1px solid #e5e7eb}dialog.help[open] table{width:100%;border-collapse:collapse}dialog.help[open] th,dialog.help[open] td{border:1px solid #e5e7eb;padding:8px;text-align:left}dialog.help[open] th{background:#f3f4f6}dialog.help[open] button{width:100%}.szh-menu__item svg{margin-right:8px}.szh-menu__item--anchor{color:inherit;text-decoration:none}.szh-menu__submenu.active,.szh-menu__item.active{color:var(--learningmap-color-openpatch)}.link-button{color:var(--learningmap-color-openpatch);text-decoration:underline;background:none;border:none;padding:0;font:inherit;cursor:pointer}.multi-node-panel{border-color:var(--learningmap-color-openpatch);border-bottom:1px solid #e5e7eb;background:#fff;border-radius:6px;display:flex;justify-content:space-between;align-items:center;gap:12px;box-sizing:border-box}.multi-node-panel button{padding:8px;border:none;border-radius:6px;background:#fff;color:#1f2937;font-size:10px;font-weight:500;cursor:pointer;transition:all .2s}.multi-node-panel button:hover{background:#f3f4f6;border-color:var(--learningmap-color-openpatch)}.progress-panel{width:80%;padding:8px;border-radius:6px;box-shadow:0 1px 2px #0000000d;background:#fff;border:1px solid #d1d5db;display:flex;justify-content:space-between;font-size:14px;margin-bottom:4px}.progress-panel .mastered-counter,.progress-panel .completed-counter{color:#10b981;width:150px;-webkit-user-select:none;user-select:none}.progress-panel .completed-counter{display:flex;justify-content:flex-start}.progress-panel .mastered-counter{display:flex;justify-content:flex-end}.progress-panel .progress-value{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);color:#266651;-webkit-user-select:none;user-select:none;font-weight:600}.progress-panel .progress-bar-container{position:relative;width:100%;border:1px solid #d1d5db;background:#f3f4f6;border-radius:9999px;overflow:hidden}.progress-panel .progress-bar-fill{height:100%;background:#10b981;border-radius:9999px;transition:width .3s ease}.progress-panel .progress-text{font-size:12px;margin-top:4px}.welcome-message{position:absolute;inset:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;z-index:1;pointer-events:none;overflow-y:auto;overflow-x:hidden}.welcome-content{text-align:center;max-width:500px;width:100%;padding:40px 20px;pointer-events:auto;box-sizing:border-box;flex-shrink:0}.welcome-title{font-size:48px;display:flex;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;font-weight:700;color:#1f2937;margin:0 0 16px}.welcome-title img{height:96px;width:96px;margin-right:16px}.welcome-subtitle{-webkit-user-select:none;user-select:none;font-size:24px;color:#6b7280;margin:0 0 32px}.welcome-actions{display:flex;flex-direction:column;gap:12px;align-items:center}.welcome-actions button{width:100%;max-width:280px;justify-content:center;font-size:16px;padding:12px 24px}@media (max-width: 640px){.editor-toolbar{padding:8px 12px}.toolbar-button{padding:6px 12px;font-size:13px}.toolbar-label{display:none}.welcome-title{font-size:36px}.welcome-content{padding:20px 16px}.welcome-subtitle{font-size:24px;margin:0 0 24px}.welcome-actions button{max-width:100%;font-size:14px;padding:10px 20px}}.editor-panel{pointer-events:all}.panel-inner{width:450px;max-width:90vw;max-height:80vh;background:var(--color-nav, white);border:1px solid #e5e7eb;border-radius:8px;box-shadow:0 4px 12px #00000026;display:flex;flex-direction:column;overflow:hidden}.panel-header{padding:16px 20px;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #e5e7eb;flex-shrink:0}.panel-title{font-size:20px;font-weight:700;margin:0}.panel-content{flex:1;overflow-y:auto;padding:20px}.panel-footer{padding:16px 20px;display:flex;gap:8px;border-top:1px solid #e5e7eb;flex-shrink:0}.panel-footer button{flex:1;justify-content:center}.panel-footer-centered{justify-content:center}.panel-footer-centered button{flex:1}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperbook/markdown",
3
- "version": "0.43.2",
3
+ "version": "0.43.3",
4
4
  "author": "Mike Barkmin",
5
5
  "homepage": "https://github.com/openpatch/hyperbook#readme",
6
6
  "license": "MIT",
@@ -63,7 +63,7 @@
63
63
  },
64
64
  "devDependencies": {
65
65
  "@excalidraw/excalidraw": "0.18.0",
66
- "@learningmap/web-component": "^0.3.1",
66
+ "@learningmap/web-component": "^0.3.3",
67
67
  "@shikijs/types": "^3.6.0",
68
68
  "@types/hast": "3.0.4",
69
69
  "@types/js-yaml": "^4.0.9",