@aquera/nile-elements 1.9.5 → 1.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +6 -0
  2. package/dist/index.cjs.js +1 -1
  3. package/dist/index.esm.js +1 -1
  4. package/dist/index.js +470 -298
  5. package/dist/nile-chip/nile-chip.css.cjs.js +1 -1
  6. package/dist/nile-chip/nile-chip.css.cjs.js.map +1 -1
  7. package/dist/nile-chip/nile-chip.css.esm.js +8 -1
  8. package/dist/nile-code-editor/nile-code-editor.cjs.js +1 -1
  9. package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
  10. package/dist/nile-code-editor/nile-code-editor.esm.js +3 -3
  11. package/dist/nile-hero/nile-hero.cjs.js +1 -1
  12. package/dist/nile-hero/nile-hero.cjs.js.map +1 -1
  13. package/dist/nile-hero/nile-hero.css.cjs.js +1 -1
  14. package/dist/nile-hero/nile-hero.css.cjs.js.map +1 -1
  15. package/dist/nile-hero/nile-hero.css.esm.js +14 -14
  16. package/dist/nile-hero/nile-hero.esm.js +1 -1
  17. package/dist/nile-hero-header/nile-hero-header.cjs.js +1 -1
  18. package/dist/nile-hero-header/nile-hero-header.cjs.js.map +1 -1
  19. package/dist/nile-hero-header/nile-hero-header.css.cjs.js +1 -1
  20. package/dist/nile-hero-header/nile-hero-header.css.cjs.js.map +1 -1
  21. package/dist/nile-hero-header/nile-hero-header.css.esm.js +11 -11
  22. package/dist/nile-hero-header/nile-hero-header.esm.js +3 -3
  23. package/dist/nile-rich-text-editor/index.cjs.js +1 -1
  24. package/dist/nile-rich-text-editor/index.esm.js +1 -1
  25. package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js +1 -1
  26. package/dist/nile-rich-text-editor/nile-rich-text-editor.cjs.js.map +1 -1
  27. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js +1 -1
  28. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.cjs.js.map +1 -1
  29. package/dist/nile-rich-text-editor/nile-rich-text-editor.css.esm.js +70 -0
  30. package/dist/nile-rich-text-editor/nile-rich-text-editor.esm.js +1 -1
  31. package/dist/nile-rich-text-editor/nile-rte-image.cjs.js +3 -0
  32. package/dist/nile-rich-text-editor/nile-rte-image.cjs.js.map +1 -0
  33. package/dist/nile-rich-text-editor/nile-rte-image.esm.js +96 -0
  34. package/dist/src/nile-chip/nile-chip.css.js +8 -1
  35. package/dist/src/nile-chip/nile-chip.css.js.map +1 -1
  36. package/dist/src/nile-code-editor/nile-code-editor.js +3 -3
  37. package/dist/src/nile-code-editor/nile-code-editor.js.map +1 -1
  38. package/dist/src/nile-hero/nile-hero.css.js +12 -12
  39. package/dist/src/nile-hero/nile-hero.css.js.map +1 -1
  40. package/dist/src/nile-hero/nile-hero.js +1 -1
  41. package/dist/src/nile-hero/nile-hero.js.map +1 -1
  42. package/dist/src/nile-hero-header/nile-hero-header.css.js +9 -9
  43. package/dist/src/nile-hero-header/nile-hero-header.css.js.map +1 -1
  44. package/dist/src/nile-hero-header/nile-hero-header.js +1 -1
  45. package/dist/src/nile-hero-header/nile-hero-header.js.map +1 -1
  46. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js +70 -0
  47. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.css.js.map +1 -1
  48. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.d.ts +3 -0
  49. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js +81 -3
  50. package/dist/src/nile-rich-text-editor/nile-rich-text-editor.js.map +1 -1
  51. package/dist/src/nile-rich-text-editor/nile-rte-image.d.ts +87 -0
  52. package/dist/src/nile-rich-text-editor/nile-rte-image.js +1073 -0
  53. package/dist/src/nile-rich-text-editor/nile-rte-image.js.map +1 -0
  54. package/dist/src/version.js +1 -1
  55. package/dist/src/version.js.map +1 -1
  56. package/dist/tsconfig.tsbuildinfo +1 -1
  57. package/package.json +1 -1
  58. package/src/nile-chip/nile-chip.css.ts +8 -1
  59. package/src/nile-code-editor/nile-code-editor.ts +3 -3
  60. package/src/nile-hero/nile-hero.css.ts +12 -12
  61. package/src/nile-hero/nile-hero.ts +1 -1
  62. package/src/nile-hero-header/nile-hero-header.css.ts +9 -9
  63. package/src/nile-hero-header/nile-hero-header.ts +1 -1
  64. package/src/nile-rich-text-editor/nile-rich-text-editor.css.ts +70 -0
  65. package/src/nile-rich-text-editor/nile-rich-text-editor.ts +89 -3
  66. package/src/nile-rich-text-editor/nile-rte-image.ts +1132 -0
  67. package/vscode-html-custom-data.json +41 -1
@@ -1 +1 @@
1
- import{__decorate as t}from"tslib";import{LitElement as i}from"lit";import{property as s,state as e,customElement as n}from"lit/decorators.js";import"./nile-rte-toolbar.esm.js";import"./nile-rte-toolbar-item.esm.js";import"./nile-rte-select.esm.js";import"./nile-rte-color.esm.js";import"./nile-rte-divider.esm.js";import"./nile-rte-preview.esm.js";import"./nile-rte-mentions.esm.js";import"./nile-rte-link.esm.js";import{s as h,a as r,n as o,c as l}from"./utils/block-utils.esm.js";import{t as c,s as a,r as u}from"./utils/inline-utils.esm.js";import{s as d,a as f}from"./utils/color-utils.esm.js";import{t as m}from"./utils/list-utils.esm.js";import{s as p}from"./nile-rich-text-editor.css.esm.js";const b={bold:"format_bold",italic:"format_italic",underline:"format_underline",link:"link_2",left:"format_align_left",center:"format_align_middle",right:"format_align_right",justify:"format_align_justify",ul:"format_list_bulleted",ol:"format_list_numbered",clear:"format_clear"},g=["font-weight","font-style","text-decoration","color","background-color","font-size","font-family","text-align","line-height","letter-spacing","white-space","vertical-align","list-style-position","padding-inline-start"];let y=class extends i{constructor(){super(...arguments),this.value="",this.noStyles=!1,this.disabled=!1,this.singleLineEditor=!1,this.placeholder="",this.mentions={},this.whitelist=[],this.content="",this.previewEl=null,this.toolbarEl=null,this.lastRange=null,this.buttonMap=new Map,this.headingSelect=null,this.fontSelect=null,this.colorInput=null,this.bgColorInput=null,this.colorSwatchEl=null,this.bgSwatchEl=null,this.containerEl=null,this.linkEl=null,this.mentionsEl=null,this.onEditorClick=t=>{if(this.disabled)return void t.preventDefault();const i=t.target.closest?.("a");i&&t.preventDefault()},this.onEditorPaste=t=>{this.disabled&&t.preventDefault()},this.onEditorDrop=t=>{this.disabled&&t.preventDefault()},this.onEditorInput=()=>{this.disabled||(this.ensureAtLeastOneParagraph(),this.scrubBrokenMentions(),this.updateContent(),this.updateToolbarState())},this.onEditorMouseup=()=>{this.saveSelection(),this.updateToolbarState()},this.onEditorKeyup=t=>{this.saveSelection(),["ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End"].includes(t.key)&&this.updateToolbarState()},this.onEditorKeydown=t=>{if(this.disabled)return void t.preventDefault();if(this.singleLineEditor&&"Enter"===t.key&&t.shiftKey)return void t.preventDefault();if(t.ctrlKey&&"i"===t.key.toLowerCase()&&(t.preventDefault(),c(this.editorEl,"em"),this.updateContent(),this.updateToolbarState()),this.singleLineEditor&&"Enter"===t.key)return void t.preventDefault();if("Tab"!==t.key)return;t.preventDefault(),this.focusAndRestore();const i=window.getSelection();if(!i||0===i.rangeCount)return;const s=i.getRangeAt(0);if(t.shiftKey){if(s.collapsed&&s.startContainer.nodeType===Node.TEXT_NODE){const t=s.startContainer,e=s.startOffset,n=t.data.slice(0,e),h=n.replace(/(\t|[ \u00a0]{2})$/,"");if(h.length!==n.length){t.data=h+t.data.slice(e);const s=document.createRange();s.setStart(t,h.length),s.collapse(!0),i.removeAllRanges(),i.addRange(s),this.updateContent(),this.updateToolbarState()}}return}s.deleteContents();const e=document.createTextNode("\t");s.insertNode(e);const n=document.createRange();n.setStartAfter(e),n.collapse(!0),i.removeAllRanges(),i.addRange(n),this.updateContent(),this.updateToolbarState()},this.onSelectionChange=()=>{if(!this.editorEl)return;const t=document.getSelection();if(!t||0===t.rangeCount)return;const i=t.getRangeAt(0);this.editorEl.contains(i.commonAncestorContainer)&&(this.lastRange=i.cloneRange(),this.updateToolbarState())}}createRenderRoot(){return this}injectCss(t){if(this.querySelector("style[data-rte-style]"))return;const i=document.createElement("style");i.setAttribute("data-rte-style","true"),i.textContent=t,this.insertBefore(i,this.firstChild)}connectedCallback(){super.connectedCallback(),this.injectCss(p.cssText),this.ensureStructure(),this.placeholder&&this.editorEl&&(this.editorEl.dataset.placeholder=this.placeholder),this.value&&!this.editorEl.innerHTML.trim()&&(this.editorEl.innerHTML=this.value),this.content=this.editorEl.innerHTML,this.toolbarEl&&this.wireAuthoredToolbar(this.toolbarEl),this.mentionsEl=this.querySelector("nile-rte-mentions"),this.mentionsEl&&(this.mentionsEl.attach?.(this.editorEl,this),this.mentionsEl.setExternalConfig?.(this.mentions)),this.wireEditor(),document.addEventListener("selectionchange",this.onSelectionChange,{passive:!0}),this.updateToolbarState(),this.syncPreview()}ensureStructure(){this.toolbarEl=this.querySelector("nile-rte-toolbar"),this.previewEl=this.querySelector("nile-rte-preview"),this.containerEl=this.querySelector(".rte-container"),this.containerEl||(this.containerEl=document.createElement("div"),this.containerEl.className="rte-container",this.appendChild(this.containerEl)),this.ensureEditor(),this.toolbarEl&&this.toolbarEl.parentElement!==this.containerEl&&this.containerEl.appendChild(this.toolbarEl),this.editorEl.parentElement!==this.containerEl&&this.containerEl.appendChild(this.editorEl),this.previewEl&&(this.previewEl.parentElement!==this&&this.appendChild(this.previewEl),this.previewEl.previousElementSibling!==this.containerEl&&this.insertBefore(this.previewEl,this.containerEl.nextSibling))}firstUpdated(t){if(super.firstUpdated(t),this.editorEl){/^((?!chrome|android).)*safari/i.test(navigator.userAgent)&&this.editorEl.classList.add("safari")}}updateContentWithMention(t){this.updateContent(),this.dispatchEvent(new CustomEvent("nile-change",{detail:{content:this.content,mention:t},bubbles:!0,composed:!0}))}disconnectedCallback(){this.unwireEditor(),document.removeEventListener("selectionchange",this.onSelectionChange),this.mentionsEl&&this.mentionsEl.detach&&this.mentionsEl.detach(),super.disconnectedCallback()}updated(t){t.has("value")&&this.editorEl&&this.value!==this.editorEl.innerHTML&&(this.editorEl.innerHTML=this.value||"<p><br></p>",this.content=this.editorEl.innerHTML,this.syncPreview()),t.has("singleLineEditor")&&(this.editorEl&&this.editorEl.classList.toggle("single-line",this.singleLineEditor),this.previewEl&&this.previewEl.classList.toggle("single-line",this.singleLineEditor)),t.has("disabled")&&this.editorEl&&(this.editorEl.setAttribute("contenteditable",this.disabled?"false":"true"),this.editorEl.tabIndex=this.disabled?-1:0,this.linkEl&&(this.linkEl.disabled=this.disabled)),t.has("placeholder")&&this.editorEl&&(this.placeholder?this.editorEl.dataset.placeholder=this.placeholder:delete this.editorEl.dataset.placeholder)}ensureEditor(){if(this.editorEl=this.querySelector(".editor"),!this.editorEl){const t=document.createElement("article");t.className="editor",t.setAttribute("contenteditable",this.disabled?"false":"true"),t.tabIndex=this.disabled?-1:0,this.editorEl=t}this.placeholder&&(this.editorEl.dataset.placeholder=this.placeholder),this.editorEl.innerHTML.trim()||(this.editorEl.innerHTML="<p><br></p>")}unwrapMention(t,i=!0){const s=t.parentNode;if(!s)return;const e=i?(t.textContent??"").replace(/\u200B/g,""):"",n=document.createTextNode(e);s.insertBefore(n,t),s.removeChild(t);const h=document.createRange();h.setStartAfter(n),h.collapse(!0);const r=window.getSelection();r?.removeAllRanges(),r?.addRange(h)}scrubBrokenMentions(){if(!this.editorEl)return;this.editorEl.querySelectorAll("span.mention").forEach((t=>{const i=t,s=i.getAttribute("data-mention-key"),e=i.getAttribute("data-mention-label"),n=i.getAttribute("data-mention-trigger")||"",h=(i.textContent??"").replace(/\u200B/g,"").trim(),r=!!s&&!!e&&h.length>0&&h.startsWith(n)&&h.includes(e);h&&r||this.unwrapMention(i,!0)}))}wireEditor(){this.editorEl.addEventListener("click",this.onEditorClick),this.editorEl.addEventListener("input",this.onEditorInput),this.editorEl.addEventListener("mouseup",this.onEditorMouseup),this.editorEl.addEventListener("keyup",this.onEditorKeyup),this.editorEl.addEventListener("keydown",this.onEditorKeydown),this.editorEl.addEventListener("paste",this.onEditorPaste),this.editorEl.addEventListener("drop",this.onEditorDrop)}unwireEditor(){this.editorEl&&(this.editorEl.removeEventListener("click",this.onEditorClick),this.editorEl.removeEventListener("input",this.onEditorInput),this.editorEl.removeEventListener("mouseup",this.onEditorMouseup),this.editorEl.removeEventListener("keyup",this.onEditorKeyup),this.editorEl.removeEventListener("keydown",this.onEditorKeydown),this.editorEl.removeEventListener("paste",this.onEditorPaste),this.editorEl.removeEventListener("drop",this.onEditorDrop))}wireAuthoredToolbar(t){this.buttonMap.clear(),this.headingSelect=null,this.fontSelect=null,this.colorInput=null,Array.from(t.children).forEach((t=>{const i=t.tagName.toLowerCase();if("nile-rte-select"===i&&"align"===t.getAttribute("type"))return t.disabled=this.disabled,void t.addEventListener("change",(t=>{this.focusAndRestore();const i=t.detail;h(this.editorEl,i),this.updateContent(),this.updateToolbarState()}));if("nile-rte-link"===i)return t.editorEl=this.editorEl,t.disabled=this.disabled,this.linkEl=t,void t.addEventListener("nile-link-changed",(()=>{this.updateContent(),this.updateToolbarState()}));if("nile-rte-toolbar-item"===i){let i=t.querySelector(":scope > nile-button");const s=t.getAttribute("name")||"",e=t.getAttribute("label")||s,n=t.getAttribute("icon"),h=t.innerHTML.trim().length>0;if(i||(i=document.createElement("nile-button"),i.variant="tertiary",i.size="small"),i.disabled=this.disabled,n)i.innerHTML=`<nile-icon name="${n}" color="${this.disabled?"var(--nile-colors-neutral-500, var(--ng-colors-fg-disabled-subtle))":"var(--nile-colors-dark-900, var(--ng-colors-text-primary-900))"}" ></nile-icon>`,t.innerHTML="";else if(h)i.innerHTML=t.innerHTML,t.innerHTML="";else{const n=b[s];n?i.innerHTML=`<nile-icon name="${n}" size="20" color="${this.disabled?"var(--nile-colors-neutral-500, var(--ng-colors-fg-disabled-subtle))":"var(--nile-colors-dark-900, var(--ng-colors-text-primary-900))"}" ></nile-icon>`:i.textContent=e||s,t.innerHTML=""}if(!i.isConnected)if(this.disabled)t.appendChild(i);else{const s=document.createElement("nile-lite-tooltip");s.setAttribute("content",e),s.appendChild(i),t.appendChild(s)}i.setAttribute("aria-label",e),i.addEventListener("mousedown",(t=>t.preventDefault())),i.addEventListener("click",(()=>this.onToolbarCommand(s)));const r=this.buttonMap.get(s)??[];return r.push(i),void this.buttonMap.set(s,r)}if("nile-rte-select"!==i)"nile-rte-color"!==i||t.addEventListener("change",(t=>{this.focusAndRestore();const{mode:i,value:s}=t.detail;"backColor"===i?d(this.editorEl,s):f(this.editorEl,s),this.updateContent(),this.updateToolbarState()}));else{const i=t.getAttribute("type")||"";t.addEventListener("change",(t=>{this.focusAndRestore();const s=t.detail;"heading"===i?r(this.editorEl,s):"font"===i&&a(this.editorEl,s),this.updateContent(),this.updateToolbarState()}))}}))}saveSelection(){const t=window.getSelection();t&&t.rangeCount&&(this.lastRange=t.getRangeAt(0).cloneRange())}restoreSelection(){if(!this.lastRange)return;const t=document.getSelection();t&&(t.removeAllRanges(),t.addRange(this.lastRange))}focusAndRestore(){this.editorEl?.focus(),this.restoreSelection()}getCleanContent(){const t=this.editorEl.cloneNode(!0);return t.querySelectorAll("*").forEach((t=>{t.removeAttribute("style")})),t.innerHTML}insertList(t){if(this.restoreSelection(),!this.lastRange)return;const i=document.createElement(t),s=this.lastRange.extractContents(),e=document.createElement("div");e.appendChild(s),Array.from(e.childNodes).forEach((t=>{if(t.nodeType===Node.TEXT_NODE&&!t.textContent?.trim())return;const s=document.createElement("li");s.appendChild(t),i.appendChild(s)})),this.lastRange.insertNode(i),this.afterListEdit(i)}afterListEdit(t){const i=document.createRange();i.setStartAfter(t),i.collapse(!0);const s=window.getSelection();s?.removeAllRanges(),s?.addRange(i),this.saveSelection(),this.updateContent(),this.updateToolbarState()}ensureAtLeastOneParagraph(){const t=this.editorEl;if(!t)return;const i=""===(t.textContent??"").replace(/\u200B/g,"").trim();if(0===t.childNodes.length||i){t.innerHTML="<p><br></p>";const i=t.querySelector("p");if(i){const t=document.createRange();t.setStart(i,0),t.collapse(!0);const s=window.getSelection();s&&(s.removeAllRanges(),s.addRange(t))}return}if(!t.querySelector("p,h1,h2,h3,h4,h5,h6,ul,ol,table,blockquote,pre")){const i=document.createElement("p");for(;t.firstChild;)i.appendChild(t.firstChild);return i.hasChildNodes()||i.appendChild(document.createElement("br")),void t.appendChild(i)}t.querySelectorAll("p").forEach((t=>{""===(t.textContent??"").replace(/\u200B/g,"")&&(t.innerHTML.toLowerCase().includes("<br")||(t.innerHTML="<br>"))}))}onToolbarCommand(t){if(!this.disabled){switch(this.focusAndRestore(),t){case"bold":c(this.editorEl,"strong");break;case"italic":c(this.editorEl,"em");break;case"underline":c(this.editorEl,"u");break;case"left":h(this.editorEl,"left");break;case"center":h(this.editorEl,"center");break;case"right":h(this.editorEl,"right");break;case"justify":h(this.editorEl,"justify");break;case"ul":m(this.editorEl,"ul"),this.updateContent(),this.updateToolbarState();break;case"ol":m(this.editorEl,"ol"),this.updateContent(),this.updateToolbarState();break;case"link":break;case"clear":const t=document.createTreeWalker(this.editorEl,NodeFilter.SHOW_ELEMENT),i=[];for(;t.nextNode();){const s=t.currentNode;s.removeAttribute("style"),["B","STRONG","I","EM","U","SPAN","FONT"].includes(s.tagName)&&i.push(s)}for(const t of i){for(;t.firstChild;)t.parentNode?.insertBefore(t.firstChild,t);t.remove()}this.ensureAtLeastOneParagraph()}this.updateContent(),this.updateToolbarState()}}setBtnActive(t,i){const s=this.buttonMap.get(t);if(s)for(const t of s)t.toggleAttribute("data-active",!!i)}updateToolbarState(){if(!this.editorEl)return;const t=document.getSelection();if(!t||0===t.rangeCount)return;const i=t.getRangeAt(0);if(!this.editorEl.contains(i.commonAncestorContainer))return;const s=o(i.startContainer)||this.editorEl,e=getComputedStyle(s),n=l(i.startContainer,this.editorEl)||this.editorEl,h=(()=>{let t=s;for(;t&&t!==this.editorEl;){if(t instanceof HTMLElement){const i=t.tagName.toLowerCase();if("strong"===i||"b"===i)return!0;const s=getComputedStyle(t).fontWeight;if(parseInt(s,10)>=600)return!0}t=t.parentNode}return!1})(),r=(()=>{let t=s;for(;t&&t!==this.editorEl;){if(t instanceof HTMLElement){const i=t.tagName.toLowerCase();if("em"===i||"i"===i)return!0;if("italic"===getComputedStyle(t).fontStyle)return!0}t=t.parentNode}return!1})(),c=(()=>{let t=s;for(;t&&t!==this.editorEl;){if(t instanceof HTMLElement){const i=getComputedStyle(t).textDecorationLine;if(i&&i.includes("underline"))return!0;if("u"===t.tagName.toLowerCase())return!0}t=t.parentNode}return!1})(),a=!!s.closest("a"),d=n.style.textAlign||getComputedStyle(n).textAlign||"start",f="start"===d?"left":d,m=!!s.closest("li")&&s.closest("ul,ol")?.tagName.toLowerCase()||"";if(this.setBtnActive("bold",h),this.setBtnActive("italic",r),this.setBtnActive("underline",c),this.setBtnActive("link",a),this.linkEl){const t=this.linkEl.querySelector("nile-button");t&&t.toggleAttribute("data-active",a)}if(this.setBtnActive("left","left"===f&&!["center","right","justify"].includes(f)),this.setBtnActive("center","center"===f),this.setBtnActive("right","right"===f),this.setBtnActive("justify","justify"===f),this.setBtnActive("ul","ul"===m),this.setBtnActive("ol","ol"===m),this.headingSelect){const t=n.tagName.toLowerCase(),i=["h1","h2","h3"].includes(t)?t:"p";this.headingSelect.value!==i&&(this.headingSelect.value=i)}if(this.fontSelect){const t=(e.fontFamily||"").replace(/["']/g,"").split(",")[0].trim().toLowerCase();if(t)for(const i of Array.from(this.fontSelect.options))if(i.value.toLowerCase()===t){this.fontSelect.value=i.value;break}}if(this.colorInput){const t=u(e.color);t&&this.colorInput.value.toLowerCase()!==t.toLowerCase()&&(this.colorInput.value=t),this.colorSwatchEl&&(this.colorSwatchEl.style.backgroundColor=this.colorInput.value)}if(this.bgColorInput){const t=getComputedStyle(s).backgroundColor;if(t&&!/transparent|rgba\(\s*0\s*,\s*0\s*,\s*0\s*,\s*0\s*\)/i.test(t)){const i=u(t);i&&this.bgColorInput.value.toLowerCase()!==i.toLowerCase()&&(this.bgColorInput.value=i)}this.bgSwatchEl&&(this.bgSwatchEl.style.backgroundColor=this.bgColorInput.value)}}syncPreview(){this.updateContent()}getComputedImportantProps(){return Array.from(new Set([...g,...this.whitelist??[]]))}updateContent(){if(!this.editorEl)return;this.ensureAtLeastOneParagraph();const t=""===(this.editorEl.textContent??"").trim();this.editorEl.classList.toggle("empty",t);const i=window.getSelection(),s=i&&i.rangeCount>0&&this.editorEl.contains(i.getRangeAt(0).startContainer)?i.getRangeAt(0).cloneRange():null,e=this.editorEl.cloneNode(!0);if(this.noStyles)e.querySelectorAll("[style]").forEach((t=>t.removeAttribute("style")));else{const t=document.createTreeWalker(this.editorEl,NodeFilter.SHOW_ELEMENT),i=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),s=this.getComputedImportantProps();for(;t.nextNode()&&i.nextNode();){const e=t.currentNode,n=i.currentNode,h=window.getComputedStyle(e),r=s.map((t=>`${t}:${h.getPropertyValue(t)}`)).join(";");r.trim()&&n.setAttribute("style",r)}}s&&i&&this.editorEl.contains(s.startContainer)&&(i.removeAllRanges(),i.addRange(s)),this.content=e.innerHTML,this.previewEl&&(this.previewEl.innerHTML=this.content),this.dispatchEvent(new CustomEvent("nile-change",{detail:{content:this.content},bubbles:!0,composed:!0}))}};t([s({type:String,attribute:!0,reflect:!0})],y.prototype,"value",void 0),t([s({type:Boolean,attribute:!0,reflect:!0})],y.prototype,"noStyles",void 0),t([s({type:Boolean,attribute:!0,reflect:!0})],y.prototype,"disabled",void 0),t([s({type:Boolean,attribute:"singlelineeditor",reflect:!0})],y.prototype,"singleLineEditor",void 0),t([s({type:String})],y.prototype,"placeholder",void 0),t([s({attribute:"mentions",reflect:!0,converter:{fromAttribute:t=>{try{const i=JSON.parse(t),s={};for(const t of Object.keys(i)){const e=i[t];Array.isArray(e)&&(s[t]=e.filter((t=>t&&"string"==typeof t.key&&"string"==typeof t.label)).map((t=>({key:t.key,label:t.label}))))}return s}catch{return{}}},toAttribute:t=>JSON.stringify(t)}})],y.prototype,"mentions",void 0),t([s({attribute:"whitelist",reflect:!1,converter:{fromAttribute:t=>{try{const i=JSON.parse(t);return Array.isArray(i)?i.filter((t=>"string"==typeof t)):[]}catch{return[]}}}})],y.prototype,"whitelist",void 0),t([e()],y.prototype,"content",void 0),y=t([n("nile-rich-text-editor")],y);export{y as N};
1
+ import{__decorate as t}from"tslib";import{LitElement as i}from"lit";import{property as s,state as e,customElement as n}from"lit/decorators.js";import"./nile-rte-toolbar.esm.js";import"./nile-rte-toolbar-item.esm.js";import"./nile-rte-select.esm.js";import"./nile-rte-color.esm.js";import"./nile-rte-divider.esm.js";import"./nile-rte-preview.esm.js";import"./nile-rte-mentions.esm.js";import"./nile-rte-link.esm.js";import"./nile-rte-image.esm.js";import{c as r,s as h,a as o,n as l}from"./utils/block-utils.esm.js";import{t as c,s as a,r as u}from"./utils/inline-utils.esm.js";import{s as d,a as f}from"./utils/color-utils.esm.js";import{t as m}from"./utils/list-utils.esm.js";import{s as p}from"./nile-rich-text-editor.css.esm.js";const g={bold:"format_bold",italic:"format_italic",underline:"format_underline",link:"link_2",left:"format_align_left",center:"format_align_middle",right:"format_align_right",justify:"format_align_justify",ul:"format_list_bulleted",ol:"format_list_numbered",clear:"format_clear"},b=["font-weight","font-style","text-decoration","color","background-color","font-size","font-family","text-align","line-height","letter-spacing","white-space","vertical-align","list-style-position","padding-inline-start"];let y=class extends i{constructor(){super(...arguments),this.value="",this.noStyles=!1,this.disabled=!1,this.singleLineEditor=!1,this.placeholder="",this.mentions={},this.whitelist=[],this.content="",this.previewEl=null,this.toolbarEl=null,this.lastRange=null,this.buttonMap=new Map,this.headingSelect=null,this.fontSelect=null,this.colorInput=null,this.bgColorInput=null,this.colorSwatchEl=null,this.bgSwatchEl=null,this.containerEl=null,this.linkEl=null,this.imageEl=null,this.mentionsEl=null,this.onEditorClick=t=>{if(this.disabled)return void t.preventDefault();const i=t.target.closest?.("a");i&&t.preventDefault()},this.onEditorPaste=t=>{this.disabled&&t.preventDefault()},this.onEditorDrop=t=>{this.disabled&&t.preventDefault()},this.onEditorInput=()=>{this.disabled||(this.ensureAtLeastOneParagraph(),this.scrubBrokenMentions(),this.updateContent(),this.updateToolbarState())},this.onEditorMouseup=()=>{this.saveSelection(),this.updateToolbarState()},this.onEditorKeyup=t=>{this.saveSelection(),["ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End"].includes(t.key)&&this.updateToolbarState()},this.onEditorKeydown=t=>{if(this.disabled)return void t.preventDefault();if(this.singleLineEditor&&"Enter"===t.key&&t.shiftKey)return void t.preventDefault();if(t.ctrlKey&&"i"===t.key.toLowerCase()&&(t.preventDefault(),c(this.editorEl,"em"),this.updateContent(),this.updateToolbarState()),("Backspace"===t.key||"Delete"===t.key)&&this.handleFigureDeletion(t))return;if(this.singleLineEditor&&"Enter"===t.key)return void t.preventDefault();if("Tab"!==t.key)return;t.preventDefault(),this.focusAndRestore();const i=window.getSelection();if(!i||0===i.rangeCount)return;const s=i.getRangeAt(0);if(t.shiftKey){if(s.collapsed&&s.startContainer.nodeType===Node.TEXT_NODE){const t=s.startContainer,e=s.startOffset,n=t.data.slice(0,e),r=n.replace(/(\t|[ \u00a0]{2})$/,"");if(r.length!==n.length){t.data=r+t.data.slice(e);const s=document.createRange();s.setStart(t,r.length),s.collapse(!0),i.removeAllRanges(),i.addRange(s),this.updateContent(),this.updateToolbarState()}}return}s.deleteContents();const e=document.createTextNode("\t");s.insertNode(e);const n=document.createRange();n.setStartAfter(e),n.collapse(!0),i.removeAllRanges(),i.addRange(n),this.updateContent(),this.updateToolbarState()},this.onSelectionChange=()=>{if(!this.editorEl)return;const t=document.getSelection();if(!t||0===t.rangeCount)return;const i=t.getRangeAt(0);this.editorEl.contains(i.commonAncestorContainer)&&(this.lastRange=i.cloneRange(),this.updateToolbarState())}}createRenderRoot(){return this}injectCss(t){if(this.querySelector("style[data-rte-style]"))return;const i=document.createElement("style");i.setAttribute("data-rte-style","true"),i.textContent=t,this.insertBefore(i,this.firstChild)}connectedCallback(){super.connectedCallback(),this.injectCss(p.cssText),this.ensureStructure(),this.placeholder&&this.editorEl&&(this.editorEl.dataset.placeholder=this.placeholder),this.value&&!this.editorEl.innerHTML.trim()&&(this.editorEl.innerHTML=this.value),this.content=this.editorEl.innerHTML,this.toolbarEl&&this.wireAuthoredToolbar(this.toolbarEl),this.mentionsEl=this.querySelector("nile-rte-mentions"),this.mentionsEl&&(this.mentionsEl.attach?.(this.editorEl,this),this.mentionsEl.setExternalConfig?.(this.mentions)),this.wireEditor(),document.addEventListener("selectionchange",this.onSelectionChange,{passive:!0}),this.updateToolbarState(),this.syncPreview()}ensureStructure(){this.toolbarEl=this.querySelector("nile-rte-toolbar"),this.previewEl=this.querySelector("nile-rte-preview"),this.containerEl=this.querySelector(".rte-container"),this.containerEl||(this.containerEl=document.createElement("div"),this.containerEl.className="rte-container",this.appendChild(this.containerEl)),this.ensureEditor(),this.toolbarEl&&this.toolbarEl.parentElement!==this.containerEl&&this.containerEl.appendChild(this.toolbarEl),this.editorEl.parentElement!==this.containerEl&&this.containerEl.appendChild(this.editorEl),this.previewEl&&(this.previewEl.parentElement!==this&&this.appendChild(this.previewEl),this.previewEl.previousElementSibling!==this.containerEl&&this.insertBefore(this.previewEl,this.containerEl.nextSibling))}firstUpdated(t){if(super.firstUpdated(t),this.editorEl){/^((?!chrome|android).)*safari/i.test(navigator.userAgent)&&this.editorEl.classList.add("safari")}}updateContentWithMention(t){this.updateContent(),this.dispatchEvent(new CustomEvent("nile-change",{detail:{content:this.content,mention:t},bubbles:!0,composed:!0}))}disconnectedCallback(){this.unwireEditor(),document.removeEventListener("selectionchange",this.onSelectionChange),this.mentionsEl&&this.mentionsEl.detach&&this.mentionsEl.detach(),super.disconnectedCallback()}updated(t){t.has("value")&&this.editorEl&&this.value!==this.editorEl.innerHTML&&(this.editorEl.innerHTML=this.value||"<p><br></p>",this.content=this.editorEl.innerHTML,this.syncPreview()),t.has("singleLineEditor")&&(this.editorEl&&this.editorEl.classList.toggle("single-line",this.singleLineEditor),this.previewEl&&this.previewEl.classList.toggle("single-line",this.singleLineEditor)),t.has("disabled")&&this.editorEl&&(this.editorEl.setAttribute("contenteditable",this.disabled?"false":"true"),this.editorEl.tabIndex=this.disabled?-1:0,this.linkEl&&(this.linkEl.disabled=this.disabled),this.imageEl&&(this.imageEl.disabled=this.disabled)),t.has("placeholder")&&this.editorEl&&(this.placeholder?this.editorEl.dataset.placeholder=this.placeholder:delete this.editorEl.dataset.placeholder)}ensureEditor(){if(this.editorEl=this.querySelector(".editor"),!this.editorEl){const t=document.createElement("article");t.className="editor",t.setAttribute("contenteditable",this.disabled?"false":"true"),t.tabIndex=this.disabled?-1:0,this.editorEl=t}this.placeholder&&(this.editorEl.dataset.placeholder=this.placeholder),this.editorEl.innerHTML.trim()||(this.editorEl.innerHTML="<p><br></p>")}unwrapMention(t,i=!0){const s=t.parentNode;if(!s)return;const e=i?(t.textContent??"").replace(/\u200B/g,""):"",n=document.createTextNode(e);s.insertBefore(n,t),s.removeChild(t);const r=document.createRange();r.setStartAfter(n),r.collapse(!0);const h=window.getSelection();h?.removeAllRanges(),h?.addRange(r)}scrubBrokenMentions(){if(!this.editorEl)return;this.editorEl.querySelectorAll("span.mention").forEach((t=>{const i=t,s=i.getAttribute("data-mention-key"),e=i.getAttribute("data-mention-label"),n=i.getAttribute("data-mention-trigger")||"",r=(i.textContent??"").replace(/\u200B/g,"").trim(),h=!!s&&!!e&&r.length>0&&r.startsWith(n)&&r.includes(e);r&&h||this.unwrapMention(i,!0)}))}wireEditor(){this.editorEl.addEventListener("click",this.onEditorClick),this.editorEl.addEventListener("input",this.onEditorInput),this.editorEl.addEventListener("mouseup",this.onEditorMouseup),this.editorEl.addEventListener("keyup",this.onEditorKeyup),this.editorEl.addEventListener("keydown",this.onEditorKeydown),this.editorEl.addEventListener("paste",this.onEditorPaste),this.editorEl.addEventListener("drop",this.onEditorDrop)}unwireEditor(){this.editorEl&&(this.editorEl.removeEventListener("click",this.onEditorClick),this.editorEl.removeEventListener("input",this.onEditorInput),this.editorEl.removeEventListener("mouseup",this.onEditorMouseup),this.editorEl.removeEventListener("keyup",this.onEditorKeyup),this.editorEl.removeEventListener("keydown",this.onEditorKeydown),this.editorEl.removeEventListener("paste",this.onEditorPaste),this.editorEl.removeEventListener("drop",this.onEditorDrop))}handleFigureDeletion(t){const i=window.getSelection();if(!i||0===i.rangeCount)return!1;const s=i.getRangeAt(0);if(!this.editorEl.contains(s.commonAncestorContainer))return!1;if(!s.collapsed){const i=Array.from(this.editorEl.querySelectorAll("figure.rte-image")).filter((t=>s.intersectsNode(t)));return!!i.length&&(t.preventDefault(),s.deleteContents(),i.forEach((t=>t.isConnected&&t.remove())),this.ensureAtLeastOneParagraph(),this.updateContent(),this.updateToolbarState(),!0)}const e=r(s.startContainer,this.editorEl)||this.editorEl;if("Backspace"===t.key){const i=document.createRange();i.setStart(e,0),i.setEnd(s.startContainer,s.startOffset);const n=""===i.toString().replace(/\u200B/g,""),r=e.previousElementSibling;if(n&&r?.matches?.("figure.rte-image"))return t.preventDefault(),r.remove(),this.updateContent(),this.updateToolbarState(),!0}else{const i=document.createRange();i.setStart(s.endContainer,s.endOffset),i.setEnd(e,e.childNodes.length);const n=""===i.toString().replace(/\u200B/g,""),r=e.nextElementSibling;if(n&&r?.matches?.("figure.rte-image"))return t.preventDefault(),r.remove(),this.updateContent(),this.updateToolbarState(),!0}return!1}wireAuthoredToolbar(t){this.buttonMap.clear(),this.headingSelect=null,this.fontSelect=null,this.colorInput=null,Array.from(t.children).forEach((t=>{const i=t.tagName.toLowerCase();if("nile-rte-select"===i&&"align"===t.getAttribute("type"))return t.disabled=this.disabled,void t.addEventListener("change",(t=>{this.focusAndRestore();const i=t.detail;h(this.editorEl,i),this.updateContent(),this.updateToolbarState()}));if("nile-rte-link"===i)return t.editorEl=this.editorEl,t.disabled=this.disabled,this.linkEl=t,void t.addEventListener("nile-link-changed",(()=>{this.updateContent(),this.updateToolbarState()}));if("nile-rte-image"===i)return t.editorEl=this.editorEl,t.disabled=this.disabled,this.imageEl=t,void t.addEventListener("nile-image-changed",(()=>{this.updateContent(),this.updateToolbarState()}));if("nile-rte-toolbar-item"===i){let i=t.querySelector(":scope > nile-button");const s=t.getAttribute("name")||"",e=t.getAttribute("label")||s,n=t.getAttribute("icon"),r=t.innerHTML.trim().length>0;if(i||(i=document.createElement("nile-button"),i.variant="tertiary",i.size="small"),i.disabled=this.disabled,n)i.innerHTML=`<nile-icon name="${n}" color="${this.disabled?"var(--nile-colors-neutral-500, var(--ng-colors-fg-disabled-subtle))":"var(--nile-colors-dark-900, var(--ng-colors-text-primary-900))"}" ></nile-icon>`,t.innerHTML="";else if(r)i.innerHTML=t.innerHTML,t.innerHTML="";else{const n=g[s];n?i.innerHTML=`<nile-icon name="${n}" size="20" color="${this.disabled?"var(--nile-colors-neutral-500, var(--ng-colors-fg-disabled-subtle))":"var(--nile-colors-dark-900, var(--ng-colors-text-primary-900))"}" ></nile-icon>`:i.textContent=e||s,t.innerHTML=""}if(!i.isConnected)if(this.disabled)t.appendChild(i);else{const s=document.createElement("nile-lite-tooltip");s.setAttribute("content",e),s.appendChild(i),t.appendChild(s)}i.setAttribute("aria-label",e),i.addEventListener("mousedown",(t=>t.preventDefault())),i.addEventListener("click",(()=>this.onToolbarCommand(s)));const h=this.buttonMap.get(s)??[];return h.push(i),void this.buttonMap.set(s,h)}if("nile-rte-select"!==i)"nile-rte-color"!==i||t.addEventListener("change",(t=>{this.focusAndRestore();const{mode:i,value:s}=t.detail;"backColor"===i?d(this.editorEl,s):f(this.editorEl,s),this.updateContent(),this.updateToolbarState()}));else{const i=t.getAttribute("type")||"";t.addEventListener("change",(t=>{this.focusAndRestore();const s=t.detail;"heading"===i?o(this.editorEl,s):"font"===i&&a(this.editorEl,s),this.updateContent(),this.updateToolbarState()}))}}))}saveSelection(){const t=window.getSelection();t&&t.rangeCount&&(this.lastRange=t.getRangeAt(0).cloneRange())}restoreSelection(){if(!this.lastRange)return;const t=document.getSelection();t&&(t.removeAllRanges(),t.addRange(this.lastRange))}focusAndRestore(){this.editorEl?.focus(),this.restoreSelection()}getCleanContent(){const t=this.editorEl.cloneNode(!0);return t.querySelectorAll("*").forEach((t=>{t.removeAttribute("style")})),t.innerHTML}insertList(t){if(this.restoreSelection(),!this.lastRange)return;const i=document.createElement(t),s=this.lastRange.extractContents(),e=document.createElement("div");e.appendChild(s),Array.from(e.childNodes).forEach((t=>{if(t.nodeType===Node.TEXT_NODE&&!t.textContent?.trim())return;const s=document.createElement("li");s.appendChild(t),i.appendChild(s)})),this.lastRange.insertNode(i),this.afterListEdit(i)}afterListEdit(t){const i=document.createRange();i.setStartAfter(t),i.collapse(!0);const s=window.getSelection();s?.removeAllRanges(),s?.addRange(i),this.saveSelection(),this.updateContent(),this.updateToolbarState()}ensureAtLeastOneParagraph(){const t=this.editorEl;if(!t)return;const i=""===(t.textContent??"").replace(/\u200B/g,"").trim()&&!t.querySelector("img");if(0===t.childNodes.length||i){t.innerHTML="<p><br></p>";const i=t.querySelector("p");if(i){const t=document.createRange();t.setStart(i,0),t.collapse(!0);const s=window.getSelection();s&&(s.removeAllRanges(),s.addRange(t))}return}if(!t.querySelector("p,h1,h2,h3,h4,h5,h6,ul,ol,table,blockquote,pre,figure")){const i=document.createElement("p");for(;t.firstChild;)i.appendChild(t.firstChild);return i.hasChildNodes()||i.appendChild(document.createElement("br")),void t.appendChild(i)}t.querySelectorAll("p").forEach((t=>{""===(t.textContent??"").replace(/\u200B/g,"")&&(t.innerHTML.toLowerCase().includes("<br")||(t.innerHTML="<br>"))}))}onToolbarCommand(t){if(!this.disabled){switch(this.focusAndRestore(),t){case"bold":c(this.editorEl,"strong");break;case"italic":c(this.editorEl,"em");break;case"underline":c(this.editorEl,"u");break;case"left":h(this.editorEl,"left");break;case"center":h(this.editorEl,"center");break;case"right":h(this.editorEl,"right");break;case"justify":h(this.editorEl,"justify");break;case"ul":m(this.editorEl,"ul"),this.updateContent(),this.updateToolbarState();break;case"ol":m(this.editorEl,"ol"),this.updateContent(),this.updateToolbarState();break;case"link":break;case"clear":const t=document.createTreeWalker(this.editorEl,NodeFilter.SHOW_ELEMENT),i=[];for(;t.nextNode();){const s=t.currentNode;s.removeAttribute("style"),["B","STRONG","I","EM","U","SPAN","FONT"].includes(s.tagName)&&i.push(s)}for(const t of i){for(;t.firstChild;)t.parentNode?.insertBefore(t.firstChild,t);t.remove()}this.ensureAtLeastOneParagraph()}this.updateContent(),this.updateToolbarState()}}setBtnActive(t,i){const s=this.buttonMap.get(t);if(s)for(const t of s)t.toggleAttribute("data-active",!!i)}updateToolbarState(){if(!this.editorEl)return;const t=document.getSelection();if(!t||0===t.rangeCount)return;const i=t.getRangeAt(0);if(!this.editorEl.contains(i.commonAncestorContainer))return;const s=l(i.startContainer)||this.editorEl,e=getComputedStyle(s),n=r(i.startContainer,this.editorEl)||this.editorEl,h=(()=>{let t=s;for(;t&&t!==this.editorEl;){if(t instanceof HTMLElement){const i=t.tagName.toLowerCase();if("strong"===i||"b"===i)return!0;const s=getComputedStyle(t).fontWeight;if(parseInt(s,10)>=600)return!0}t=t.parentNode}return!1})(),o=(()=>{let t=s;for(;t&&t!==this.editorEl;){if(t instanceof HTMLElement){const i=t.tagName.toLowerCase();if("em"===i||"i"===i)return!0;if("italic"===getComputedStyle(t).fontStyle)return!0}t=t.parentNode}return!1})(),c=(()=>{let t=s;for(;t&&t!==this.editorEl;){if(t instanceof HTMLElement){const i=getComputedStyle(t).textDecorationLine;if(i&&i.includes("underline"))return!0;if("u"===t.tagName.toLowerCase())return!0}t=t.parentNode}return!1})(),a=!!s.closest("a"),d=n.style.textAlign||getComputedStyle(n).textAlign||"start",f="start"===d?"left":d,m=!!s.closest("li")&&s.closest("ul,ol")?.tagName.toLowerCase()||"";if(this.setBtnActive("bold",h),this.setBtnActive("italic",o),this.setBtnActive("underline",c),this.setBtnActive("link",a),this.linkEl){const t=this.linkEl.querySelector("nile-button");t&&t.toggleAttribute("data-active",a)}if(this.imageEl){const t=!!s.closest("figure.rte-image"),i=this.imageEl.querySelector("nile-button");i&&i.toggleAttribute("data-active",t)}if(this.setBtnActive("left","left"===f&&!["center","right","justify"].includes(f)),this.setBtnActive("center","center"===f),this.setBtnActive("right","right"===f),this.setBtnActive("justify","justify"===f),this.setBtnActive("ul","ul"===m),this.setBtnActive("ol","ol"===m),this.headingSelect){const t=n.tagName.toLowerCase(),i=["h1","h2","h3"].includes(t)?t:"p";this.headingSelect.value!==i&&(this.headingSelect.value=i)}if(this.fontSelect){const t=(e.fontFamily||"").replace(/["']/g,"").split(",")[0].trim().toLowerCase();if(t)for(const i of Array.from(this.fontSelect.options))if(i.value.toLowerCase()===t){this.fontSelect.value=i.value;break}}if(this.colorInput){const t=u(e.color);t&&this.colorInput.value.toLowerCase()!==t.toLowerCase()&&(this.colorInput.value=t),this.colorSwatchEl&&(this.colorSwatchEl.style.backgroundColor=this.colorInput.value)}if(this.bgColorInput){const t=getComputedStyle(s).backgroundColor;if(t&&!/transparent|rgba\(\s*0\s*,\s*0\s*,\s*0\s*,\s*0\s*\)/i.test(t)){const i=u(t);i&&this.bgColorInput.value.toLowerCase()!==i.toLowerCase()&&(this.bgColorInput.value=i)}this.bgSwatchEl&&(this.bgSwatchEl.style.backgroundColor=this.bgColorInput.value)}}syncPreview(){this.updateContent()}getComputedImportantProps(){return Array.from(new Set([...b,...this.whitelist??[]]))}updateContent(){if(!this.editorEl)return;this.ensureAtLeastOneParagraph();const t=""===(this.editorEl.textContent??"").trim()&&!this.editorEl.querySelector("img");this.editorEl.classList.toggle("empty",t);const i=window.getSelection(),s=i&&i.rangeCount>0&&this.editorEl.contains(i.getRangeAt(0).startContainer)?i.getRangeAt(0).cloneRange():null,e=this.editorEl.cloneNode(!0);if(this.noStyles)e.querySelectorAll("[style]").forEach((t=>t.removeAttribute("style")));else{const t=document.createTreeWalker(this.editorEl,NodeFilter.SHOW_ELEMENT),i=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),s=this.getComputedImportantProps();for(;t.nextNode()&&i.nextNode();){const e=t.currentNode,n=i.currentNode,r=window.getComputedStyle(e),h=s.map((t=>`${t}:${r.getPropertyValue(t)}`)).join(";");h.trim()&&n.setAttribute("style",h)}}s&&i&&this.editorEl.contains(s.startContainer)&&(i.removeAllRanges(),i.addRange(s)),this.content=e.innerHTML,this.previewEl&&(this.previewEl.innerHTML=this.content),this.dispatchEvent(new CustomEvent("nile-change",{detail:{content:this.content},bubbles:!0,composed:!0}))}};t([s({type:String,attribute:!0,reflect:!0})],y.prototype,"value",void 0),t([s({type:Boolean,attribute:!0,reflect:!0})],y.prototype,"noStyles",void 0),t([s({type:Boolean,attribute:!0,reflect:!0})],y.prototype,"disabled",void 0),t([s({type:Boolean,attribute:"singlelineeditor",reflect:!0})],y.prototype,"singleLineEditor",void 0),t([s({type:String})],y.prototype,"placeholder",void 0),t([s({attribute:"mentions",reflect:!0,converter:{fromAttribute:t=>{try{const i=JSON.parse(t),s={};for(const t of Object.keys(i)){const e=i[t];Array.isArray(e)&&(s[t]=e.filter((t=>t&&"string"==typeof t.key&&"string"==typeof t.label)).map((t=>({key:t.key,label:t.label}))))}return s}catch{return{}}},toAttribute:t=>JSON.stringify(t)}})],y.prototype,"mentions",void 0),t([s({attribute:"whitelist",reflect:!1,converter:{fromAttribute:t=>{try{const i=JSON.parse(t);return Array.isArray(i)?i.filter((t=>"string"==typeof t)):[]}catch{return[]}}}})],y.prototype,"whitelist",void 0),t([e()],y.prototype,"content",void 0),y=t([n("nile-rich-text-editor")],y);export{y as N};
@@ -0,0 +1,3 @@
1
+ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o;}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o;},_typeof(o);}System.register(["tslib","lit","lit/decorators.js"],function(_export,_context){"use strict";var t,i,e,n,s,r,_templateObject,_templateObject2,_templateObject3,_templateObject4,_templateObject5,o;function _taggedTemplateLiteral(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}));}function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var n=0,F=function F(){};return{s:F,n:function(_n4){function n(){return _n4.apply(this,arguments);}n.toString=function(){return _n4.toString();};return n;}(function(){return n>=r.length?{done:!0}:{done:!1,value:r[n++]};}),e:function e(r){throw r;},f:F};}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}var o,a=!0,u=!1;return{s:function s(){t=t.call(r);},n:function n(){var r=t.next();return a=r.done,r;},e:function e(r){u=!0,o=r;},f:function f(){try{a||null==t["return"]||t["return"]();}finally{if(u)throw o;}}};}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0;}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n;}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function");}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o);}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e;}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+"";}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.");}return("string"===r?String:Number)(t);}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e));}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t);}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e;}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t;})();}function _superPropGet(t,o,e,r){var p=_get(_getPrototypeOf(1&r?t.prototype:t),o,e);return 2&r&&"function"==typeof p?function(t){return p.apply(e,t);}:p;}function _get(){return _get="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,r){var p=_superPropBase(e,t);if(p){var n=Object.getOwnPropertyDescriptor(p,t);return n.get?n.get.call(arguments.length<3?e:r):n.value;}},_get.apply(null,arguments);}function _superPropBase(t,o){for(;!{}.hasOwnProperty.call(t,o)&&null!==(t=_getPrototypeOf(t)););return t;}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t);},_getPrototypeOf(t);}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e);}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t;},_setPrototypeOf(t,e);}return{setters:[function(_tslib){t=_tslib.__decorate;},function(_lit){i=_lit.LitElement;e=_lit.html;},function(_litDecoratorsJs){n=_litDecoratorsJs.property;s=_litDecoratorsJs.state;r=_litDecoratorsJs.customElement;}],execute:function execute(){o=/*#__PURE__*/function(_i){function o(){var _this;_classCallCheck(this,o);_this=_callSuper(this,o,arguments),_this.disabled=!1,_this.label="Image",_this.placeholder="Paste image link here",_this.altPlaceholder="Describe the image",_this.captionPlaceholder="Add a caption (optional)",_this.maxFileSize=2097152,_this.uploadFromComputer=!1,_this.srcValue="",_this.altValue="",_this.captionValue="",_this.hasActiveImage=!1,_this.uploadedFileName="",_this.errorMessage="",_this.popoverStyle="",_this.selectionRange=null,_this.activeFigure=null,_this.ignoreBlur=!1,_this.isApplying=!1,_this.selectedFigure=null,_this.resizeOverlay=null,_this.dragStartX=0,_this.dragStartWidth=0,_this.dragDir="",_this.isDragging=!1,_this.trackingRaf=0,_this.onEditorInput=function(){_this.selectedFigure&&!_this.selectedFigure.isConnected?_this.deselectImage():_this.updateOverlayPosition();},_this.onEditorImagePaste=function(t){var _t$clipboardData$item,_t$clipboardData;if(_this.disabled)return;var i=Array.from((_t$clipboardData$item=(_t$clipboardData=t.clipboardData)===null||_t$clipboardData===void 0?void 0:_t$clipboardData.items)!==null&&_t$clipboardData$item!==void 0?_t$clipboardData$item:[]).filter(function(t){return"file"===t.kind&&t.type.startsWith("image/");}).map(function(t){return t.getAsFile();}).filter(function(t){return!!t;});if(i.length){t.preventDefault(),t.stopPropagation();var _iterator=_createForOfIteratorHelper(i),_step;try{var _loop=function _loop(){var t=_step.value;if(_this.maxFileSize>0&&t.size>_this.maxFileSize){console.warn("nile-rte-image: pasted image \"".concat(t.name,"\" skipped \u2014 exceeds the ").concat(_this.maxFileSize," byte limit"));return 1;// continue
2
+ }var i=new FileReader();i.onload=function(){_this.insertPastedImage(String(i.result||""),t.name.replace(/\.[^.]+$/,""));},i.readAsDataURL(t);};for(_iterator.s();!(_step=_iterator.n()).done;){if(_loop())continue;}}catch(err){_iterator.e(err);}finally{_iterator.f();}}},_this.onScroll=function(){_this.closePopover();},_this.onEditorImageClick=function(t){var _i$closest;if(_this.disabled)return;var i=t.target,e=(_i$closest=i.closest)===null||_i$closest===void 0?void 0:_i$closest.call(i,"figure.rte-image");e&&_this.editorEl.contains(e)?(t.preventDefault(),_this.selectImage(e)):_this.deselectImage();},_this.onEditorImageDblClick=function(t){var _i$closest2;if(_this.disabled)return;var i=t.target,e=(_i$closest2=i.closest)===null||_i$closest2===void 0?void 0:_i$closest2.call(i,"figure.rte-image");e&&_this.editorEl.contains(e)&&(t.preventDefault(),_this.openEditFor(e));},_this.onDocKeydown=function(t){var _i$closest3;if(!_this.selectedFigure)return;if("Escape"===t.key)return void _this.deselectImage();if("Backspace"!==t.key&&"Delete"!==t.key)return;var i=t.target;if(i!==null&&i!==void 0&&(_i$closest3=i.closest)!==null&&_i$closest3!==void 0&&_i$closest3.call(i,"input, textarea, nile-input, nile-popover"))return;t.preventDefault(),t.stopPropagation();var e=_this.selectedFigure;_this.deselectImage();var n=e.parentNode;e.remove(),n instanceof HTMLElement&&!n.hasChildNodes()&&(n.innerHTML="<br>"),_this.emit("");},_this.onSelectedImageLoad=function(){_this.updateOverlayPosition();},_this.onDocMousedown=function(t){var _this$resizeOverlay,_this$selectedFigure;var i=t.target;((_this$resizeOverlay=_this.resizeOverlay)===null||_this$resizeOverlay===void 0?void 0:_this$resizeOverlay.contains(i))||((_this$selectedFigure=_this.selectedFigure)===null||_this$selectedFigure===void 0?void 0:_this$selectedFigure.contains(i))||_this.contains(i)||_this.deselectImage();},_this.onAlignClick=function(t){if(!_this.selectedFigure)return;var i=t.currentTarget.dataset.dir||"left";"left"===i?_this.selectedFigure.removeAttribute("data-align"):_this.selectedFigure.setAttribute("data-align",i),_this.syncAlignBar(),_this.updateOverlayPosition();var e=_this.selectedFigure.querySelector("img");_this.emit((e===null||e===void 0?void 0:e.getAttribute("src"))||"");},_this.onHandleMousedown=function(t){if(_this.disabled||!_this.selectedFigure)return;t.preventDefault(),t.stopPropagation();var i=_this.selectedFigure.querySelector("img");i&&("justify"===_this.selectedFigure.getAttribute("data-align")&&(_this.selectedFigure.removeAttribute("data-align"),_this.syncAlignBar()),_this.isDragging=!0,_this.dragDir=t.currentTarget.dataset.dir||"se",_this.dragStartX=t.clientX,_this.dragStartWidth=i.getBoundingClientRect().width,document.addEventListener("mousemove",_this.onDragMove),document.addEventListener("mouseup",_this.onDragEnd));},_this.onDragMove=function(t){if(!_this.isDragging||!_this.selectedFigure)return;var i=_this.selectedFigure.querySelector("img");if(!i)return;var e=t.clientX-_this.dragStartX,n="ne"===_this.dragDir||"se"===_this.dragDir;var s=_this.dragStartWidth+(n?e:-e);var r=_this.getEditorContentWidth();s=Math.max(48,Math.min(s,r)),i.setAttribute("width",String(Math.round(s))),_this.updateOverlayPosition();},_this.onDragEnd=function(){var _this$selectedFigure2,_this$selectedFigure3;if(!_this.isDragging)return;_this.isDragging=!1,document.removeEventListener("mousemove",_this.onDragMove),document.removeEventListener("mouseup",_this.onDragEnd),_this.updateOverlayPosition();var t=(_this$selectedFigure2=_this.selectedFigure)===null||_this$selectedFigure2===void 0?void 0:_this$selectedFigure2.querySelector("img");_this.dispatchEvent(new CustomEvent("nile-image-changed",{detail:{src:(t===null||t===void 0?void 0:t.getAttribute("src"))||"",alt:(t===null||t===void 0?void 0:t.getAttribute("alt"))||"",caption:((_this$selectedFigure3=_this.selectedFigure)===null||_this$selectedFigure3===void 0||(_this$selectedFigure3=_this$selectedFigure3.querySelector("figcaption"))===null||_this$selectedFigure3===void 0?void 0:_this$selectedFigure3.textContent)||"",width:t&&Number(t.getAttribute("width"))||null},bubbles:!0,composed:!0}));},_this.onOpen=function(){if(_this.disabled)return;if(_this.selectedFigure)return void _this.openEditFor(_this.selectedFigure,_this.getToolbarButtonRect());var t=document.getSelection();if(t&&t.rangeCount>0&&_this.editorEl.contains(t.getRangeAt(0).commonAncestorContainer))_this.selectionRange=t.getRangeAt(0).cloneRange();else{var _t=document.createRange();_t.selectNodeContents(_this.editorEl),_t.collapse(!1),_this.selectionRange=_t;}_this.activeFigure=null,_this.hasActiveImage=!1,_this.srcValue="",_this.altValue="",_this.captionValue="",_this.uploadedFileName="",_this.errorMessage="",_this.positionPopover(_this.getToolbarButtonRect()),_this.openPopover(),requestAnimationFrame(function(){var t=_this.querySelector("nile-input");t===null||t===void 0||t.focus();});},_this.onInputKeydown=function(t){if("Escape"===t.key||"Enter"===t.key)if(t.preventDefault(),t.stopPropagation(),"Escape"!==t.key){_this.isApplying=!0;try{_this.applyImage();}finally{_this.isApplying=!1;}}else _this.closePopover();},_this.onInputBlur=function(){_this.ignoreBlur||_this.isApplying||requestAnimationFrame(function(){if(_this.ignoreBlur||_this.isApplying)return;var t=_this.querySelector("nile-popover");(t===null||t===void 0?void 0:t.matches(":focus-within"))||_this.closePopover();});},_this.onSrcInput=function(t){_this.srcValue=t.detail.value,_this.uploadedFileName="",_this.errorMessage="";},_this.onAltInput=function(t){_this.altValue=t.detail.value;},_this.onCaptionInput=function(t){_this.captionValue=t.detail.value;},_this.onPopoverMousedown=function(){_this.ignoreBlur=!0;},_this.onPopoverMouseup=function(){_this.ignoreBlur=!1;},_this.onToolbarButtonMousedown=function(t){t.preventDefault();},_this.onUploadClick=function(){_this.ignoreBlur=!0;var t=_this.querySelector('input[type="file"]');t!==null&&t!==void 0&&t.click(),window.addEventListener("focus",function(){setTimeout(function(){_this.ignoreBlur=!1;},200);},{once:!0});},_this.onFileChange=function(t){var _i$files;var i=t.target,e=(_i$files=i.files)===null||_i$files===void 0?void 0:_i$files[0];if(i.value="",!e)return;if(!e.type.startsWith("image/"))return void(_this.errorMessage="Only image files are supported");if(_this.maxFileSize>0&&e.size>_this.maxFileSize){var _t2=(_this.maxFileSize/1048576).toFixed(1);return void(_this.errorMessage="File is too large. Maximum size is ".concat(_t2," MB"));}var n=new FileReader();n.onload=function(){_this.srcValue=String(n.result||""),_this.uploadedFileName=e.name,_this.errorMessage="",_this.altValue||(_this.altValue=e.name.replace(/\.[^.]+$/,""));},n.onerror=function(){_this.errorMessage="Could not read the selected file";},n.readAsDataURL(e);},_this.onApplyClick=function(){_this.isApplying=!0,_this.applyImage(),_this.isApplying=!1,_this.ignoreBlur=!1;},_this.onRemoveClick=function(){_this.isApplying=!0,_this.removeImage(),_this.isApplying=!1,_this.ignoreBlur=!1;};return _this;}_inherits(o,_i);return _createClass(o,[{key:"createRenderRoot",value:function createRenderRoot(){return this;}},{key:"connectedCallback",value:function connectedCallback(){_superPropGet(o,"connectedCallback",this,3)([]),this.injectCss("\n nile-popover.rte-image-popover::part(popover) {\n min-width: 340px;\n max-width: 420px;\n background: white;\n border: 1px solid var(--nile-colors-neutral-400, var(--ng-componentcolors-utility-gray-400));\n border-radius: 8px;\n padding: 0;\n gap: 0;\n overflow: hidden;\n height: auto;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n }\n\n .image-popup-wrap {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n }\n\n .image-popup-wrap nile-input {\n width: 100%;\n }\n\n .image-popup-wrap .image-upload-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n }\n\n .image-popup-wrap .image-upload-row nile-button {\n flex-shrink: 0;\n }\n\n .image-popup-wrap .image-upload-filename {\n font-size: 12px;\n color: var(--nile-colors-neutral-600, var(--ng-colors-text-secondary));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n }\n\n .image-popup-wrap .image-error {\n font-size: 12px;\n color: var(--nile-colors-error-600, var(--ng-colors-text-error-primary-600));\n }\n\n .image-popup-wrap .image-divider-row {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--nile-colors-neutral-500, var(--ng-colors-text-secondary));\n font-size: 12px;\n }\n\n .image-popup-wrap .image-divider-row::before,\n .image-popup-wrap .image-divider-row::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--nile-colors-neutral-400, var(--ng-colors-border-neutral));\n }\n\n .image-popup-wrap .image-actions-row {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n width: 100%;\n }\n\n nile-button.rte-image-button::part(base) {\n border: none;\n height: 32px;\n width: 32px;\n }\n\n nile-rte-image input[type='file'] {\n display: none;\n }\n\n .rte-image-resize-overlay {\n position: fixed;\n z-index: 999;\n pointer-events: none;\n border: 2px solid var(--nile-colors-primary-500, var(--ng-componentcolors-utility-blue-500));\n border-radius: var(--nile-radius-radius-lg, var(--ng-radius-md));\n box-sizing: border-box;\n }\n\n .rte-image-resize-overlay .rte-resize-handle {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--nile-colors-white-base, #fff);\n border: 2px solid var(--nile-colors-primary-500, var(--ng-componentcolors-utility-blue-500));\n border-radius: 50%;\n pointer-events: auto;\n box-sizing: border-box;\n }\n\n .rte-image-resize-overlay .rte-resize-handle[data-dir='nw'] { top: -7px; left: -7px; cursor: nwse-resize; }\n .rte-image-resize-overlay .rte-resize-handle[data-dir='ne'] { top: -7px; right: -7px; cursor: nesw-resize; }\n .rte-image-resize-overlay .rte-resize-handle[data-dir='sw'] { bottom: -7px; left: -7px; cursor: nesw-resize; }\n .rte-image-resize-overlay .rte-resize-handle[data-dir='se'] { bottom: -7px; right: -7px; cursor: nwse-resize; }\n\n .rte-image-resize-overlay .rte-image-align-bar {\n position: absolute;\n top: -44px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n gap: 2px;\n padding: 4px;\n background: var(--nile-colors-white-base, #fff);\n border: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-neutral));\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n pointer-events: auto;\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n padding: 0;\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button:hover {\n background: var(--nile-colors-neutral-200, var(--ng-componentcolors-utility-gray-200));\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button[data-active] {\n background: var(--nile-colors-primary-400, var(--ng-componentcolors-utility-blue-400));\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button nile-icon {\n pointer-events: none;\n }\n\n .rte-image-resize-overlay .rte-resize-size-label {\n position: absolute;\n bottom: -26px;\n right: 0;\n background: var(--nile-colors-dark-900, #101828);\n color: #fff;\n font-size: 11px;\n line-height: 1;\n padding: 4px 6px;\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: none;\n }\n ");}},{key:"injectCss",value:function injectCss(t){if(this.querySelector("style[data-rte-image-style]"))return;var i=document.createElement("style");i.setAttribute("data-rte-image-style","true"),i.textContent=t,this.insertBefore(i,this.firstChild);}},{key:"updated",value:function updated(t){if(t.has("editorEl")){var _this$editorEl,_this$editorEl2,_this$editorEl3,_this$editorEl4;var _i2=t.get("editorEl");_i2!==null&&_i2!==void 0&&_i2.removeEventListener("click",this.onEditorImageClick),_i2!==null&&_i2!==void 0&&_i2.removeEventListener("dblclick",this.onEditorImageDblClick),_i2!==null&&_i2!==void 0&&_i2.removeEventListener("input",this.onEditorInput),_i2!==null&&_i2!==void 0&&_i2.removeEventListener("paste",this.onEditorImagePaste),(_this$editorEl=this.editorEl)!==null&&_this$editorEl!==void 0&&_this$editorEl.addEventListener("click",this.onEditorImageClick),(_this$editorEl2=this.editorEl)!==null&&_this$editorEl2!==void 0&&_this$editorEl2.addEventListener("dblclick",this.onEditorImageDblClick),(_this$editorEl3=this.editorEl)!==null&&_this$editorEl3!==void 0&&_this$editorEl3.addEventListener("input",this.onEditorInput),(_this$editorEl4=this.editorEl)===null||_this$editorEl4===void 0?void 0:_this$editorEl4.addEventListener("paste",this.onEditorImagePaste);}t.has("disabled")&&this.disabled&&this.deselectImage();}},{key:"disconnectedCallback",value:function disconnectedCallback(){var _this$editorEl5,_this$editorEl6,_this$editorEl7,_this$editorEl8;(_this$editorEl5=this.editorEl)!==null&&_this$editorEl5!==void 0&&_this$editorEl5.removeEventListener("click",this.onEditorImageClick),(_this$editorEl6=this.editorEl)!==null&&_this$editorEl6!==void 0&&_this$editorEl6.removeEventListener("dblclick",this.onEditorImageDblClick),(_this$editorEl7=this.editorEl)!==null&&_this$editorEl7!==void 0&&_this$editorEl7.removeEventListener("input",this.onEditorInput),(_this$editorEl8=this.editorEl)!==null&&_this$editorEl8!==void 0&&_this$editorEl8.removeEventListener("paste",this.onEditorImagePaste),window.removeEventListener("scroll",this.onScroll,!0),this.deselectImage(),_superPropGet(o,"disconnectedCallback",this,3)([]);}},{key:"insertPastedImage",value:function insertPastedImage(t,i){if(!t.startsWith("data:image/"))return;var e;var n=document.getSelection();n&&n.rangeCount>0&&this.editorEl.contains(n.getRangeAt(0).commonAncestorContainer)?e=n.getRangeAt(0).cloneRange():(e=document.createRange(),e.selectNodeContents(this.editorEl),e.collapse(!1));var s=this.buildFigure(t,i);this.insertFigureAt(e,s),this.emit(t);}},{key:"isSafeSrc",value:function isSafeSrc(t){return /^(https?:\/\/|data:image\/|blob:|\/)/i.test(t);}},{key:"normalizeSrc",value:function normalizeSrc(t){return this.isSafeSrc(t)?t:/^[a-z][a-z0-9+.-]*:/i.test(t)?"":"https://".concat(t);}},{key:"getSelectionRect",value:function getSelectionRect(){if(!this.selectionRange)return null;var t=this.selectionRange.getBoundingClientRect();if(0===t.width&&0===t.height){var _i3=document.createElement("span");_i3.textContent="​";this.selectionRange.cloneRange().insertNode(_i3),t=_i3.getBoundingClientRect(),_i3.remove();}return t;}},{key:"positionPopover",value:function positionPopover(t){var i=t!==null&&t!==void 0?t:this.getSelectionRect();if(!i)return;var e=Math.min(Math.max(i.left+i.width/2,178),window.innerWidth-170-8);this.popoverStyle="\n position: fixed;\n top: ".concat(i.bottom+8,"px;\n left: ").concat(e,"px;\n transform: translateX(-50%);\n z-index: 1000;\n ");}},{key:"openPopover",value:function openPopover(){var _this2=this;requestAnimationFrame(function(){var t=_this2.querySelector("nile-popover");t&&(t.isShow=!0),window.addEventListener("scroll",_this2.onScroll,!0);});}},{key:"closePopover",value:function closePopover(){var t=this.querySelector("nile-popover");t&&(t.isShow=!1),window.removeEventListener("scroll",this.onScroll,!0),this.srcValue="",this.altValue="",this.captionValue="",this.uploadedFileName="",this.errorMessage="",this.selectionRange=null,this.activeFigure=null,this.hasActiveImage=!1,this.popoverStyle="";}},{key:"openEditFor",value:function openEditFor(t,i){var e=document.createRange();e.selectNode(t),this.selectionRange=e,this.activeFigure=t,this.hasActiveImage=!0;var n=t.querySelector("img"),s=t.querySelector("figcaption");this.srcValue=(n===null||n===void 0?void 0:n.getAttribute("src"))||"",this.altValue=(n===null||n===void 0?void 0:n.getAttribute("alt"))||"",this.captionValue=(s===null||s===void 0?void 0:s.textContent)||"",this.uploadedFileName="",this.errorMessage="",this.positionPopover(i!==null&&i!==void 0?i:t.getBoundingClientRect()),this.openPopover();}},{key:"getToolbarButtonRect",value:function getToolbarButtonRect(){var t=this.querySelector("nile-button.rte-image-button");return t?t.getBoundingClientRect():null;}},{key:"selectImage",value:function selectImage(t){if(this.selectedFigure===t)return void this.updateOverlayPosition();this.deselectImage(),this.selectedFigure=t;var i=t.querySelector("img");i&&!i.complete&&i.addEventListener("load",this.onSelectedImageLoad,{once:!0}),this.buildOverlay(),this.syncAlignBar(),this.updateOverlayPosition(),this.startOverlayTracking(),document.addEventListener("mousedown",this.onDocMousedown,!0),document.addEventListener("keydown",this.onDocKeydown,!0);}},{key:"deselectImage",value:function deselectImage(){var _this$resizeOverlay2;(this.selectedFigure||this.resizeOverlay)&&(this.selectedFigure=null,(_this$resizeOverlay2=this.resizeOverlay)!==null&&_this$resizeOverlay2!==void 0&&_this$resizeOverlay2.remove(),this.resizeOverlay=null,this.isDragging=!1,this.stopOverlayTracking(),document.removeEventListener("mousedown",this.onDocMousedown,!0),document.removeEventListener("keydown",this.onDocKeydown,!0),document.removeEventListener("mousemove",this.onDragMove),document.removeEventListener("mouseup",this.onDragEnd));}},{key:"startOverlayTracking",value:function startOverlayTracking(){var _this3=this;this.stopOverlayTracking();var _t3=function t(){_this3.selectedFigure&&_this3.resizeOverlay&&(_this3.selectedFigure.isConnected?(_this3.updateOverlayPosition(),_this3.trackingRaf=requestAnimationFrame(_t3)):_this3.deselectImage());};this.trackingRaf=requestAnimationFrame(_t3);}},{key:"stopOverlayTracking",value:function stopOverlayTracking(){0!==this.trackingRaf&&(cancelAnimationFrame(this.trackingRaf),this.trackingRaf=0);}},{key:"buildOverlay",value:function buildOverlay(){var t=document.createElement("div");t.className="rte-image-resize-overlay";for(var _i4=0,_arr=["nw","ne","sw","se"];_i4<_arr.length;_i4++){var _i5=_arr[_i4];var _e=document.createElement("div");_e.className="rte-resize-handle",_e.dataset.dir=_i5,_e.addEventListener("mousedown",this.onHandleMousedown),t.appendChild(_e);}var i=document.createElement("span");i.className="rte-resize-size-label",t.appendChild(i);var e=document.createElement("div");e.className="rte-image-align-bar";var n=[{dir:"left",icon:"format_align_left",title:"Align left"},{dir:"center",icon:"format_align_middle",title:"Align center"},{dir:"right",icon:"format_align_right",title:"Align right"},{dir:"justify",icon:"format_align_justify",title:"Full width"}];for(var _i6=0,_n=n;_i6<_n.length;_i6++){var _n$_i=_n[_i6],_t4=_n$_i.dir,_i7=_n$_i.icon,_s=_n$_i.title;var _n2=document.createElement("button");_n2.type="button",_n2.dataset.dir=_t4,_n2.title=_s,_n2.setAttribute("aria-label",_s),_n2.innerHTML="<nile-icon name=\"".concat(_i7,"\" size=\"18\"></nile-icon>"),_n2.addEventListener("mousedown",function(t){return t.preventDefault();}),_n2.addEventListener("click",this.onAlignClick),e.appendChild(_n2);}t.appendChild(e),document.body.appendChild(t),this.resizeOverlay=t;}},{key:"updateOverlayPosition",value:function updateOverlayPosition(){if(!this.resizeOverlay||!this.selectedFigure)return;var t=this.selectedFigure.querySelector("img");if(!t)return void this.deselectImage();var i=t.getBoundingClientRect();this.resizeOverlay.style.top="".concat(i.top,"px"),this.resizeOverlay.style.left="".concat(i.left,"px"),this.resizeOverlay.style.width="".concat(i.width,"px"),this.resizeOverlay.style.height="".concat(i.height,"px");var e=this.resizeOverlay.querySelector(".rte-image-align-bar");e&&(i.top<56?e.style.top="8px":e.style.top="-44px");var n=this.resizeOverlay.querySelector(".rte-resize-size-label");n&&(n.textContent="".concat(Math.round(i.width)," \xD7 ").concat(Math.round(i.height)),n.style.display=this.isDragging?"":"none");}},{key:"syncAlignBar",value:function syncAlignBar(){if(!this.resizeOverlay||!this.selectedFigure)return;var t=this.selectedFigure.getAttribute("data-align")||"left";this.resizeOverlay.querySelectorAll(".rte-image-align-bar button").forEach(function(i){i.toggleAttribute("data-active",i.dataset.dir===t);});}},{key:"getEditorContentWidth",value:function getEditorContentWidth(){var t=getComputedStyle(this.editorEl);return this.editorEl.clientWidth-parseFloat(t.paddingLeft||"0")-parseFloat(t.paddingRight||"0")||1/0;}},{key:"buildFigure",value:function buildFigure(t){var i=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"";var e=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"";var n=document.createElement("figure");n.className="rte-image",n.setAttribute("contenteditable","false");var s=document.createElement("img");if(s.src=t,i.trim()&&(s.alt=i.trim()),n.appendChild(s),e.trim()){var _t5=document.createElement("figcaption");_t5.textContent=e.trim(),n.appendChild(_t5);}return n;}},{key:"insertFigureAt",value:function insertFigureAt(t,i){var _n$textContent,_n3;var e=document.getSelection();if(!e)return;var n=null,s=t.startContainer;for(;s&&s!==this.editorEl;){if(s instanceof HTMLElement&&/^(P|H[1-6]|UL|OL|BLOCKQUOTE|PRE|TABLE|FIGURE|DIV)$/.test(s.tagName)){n=s;break;}s=s.parentNode;}var r=n&&/^(P|H[1-6])$/.test(n.tagName)&&""===((_n$textContent=n.textContent)!==null&&_n$textContent!==void 0?_n$textContent:"").replace(/\u200B/g,"").trim()&&!n.querySelector("img");(_n3=n)!==null&&_n3!==void 0&&_n3.parentNode?r?(n.parentNode.insertBefore(i,n),n.remove()):n.parentNode.insertBefore(i,n.nextSibling):this.editorEl.appendChild(i);var _o=i.nextElementSibling;if(!_o){var _i$parentNode;var _t6=document.createElement("p");_t6.innerHTML="<br>",(_i$parentNode=i.parentNode)!==null&&_i$parentNode!==void 0&&_i$parentNode.insertBefore(_t6,i.nextSibling),_o=_t6;}var a=document.createRange();a.setStart(_o,0),a.collapse(!0),e.removeAllRanges(),e.addRange(a);}},{key:"applyImage",value:function applyImage(){var _this4=this;var t=this.srcValue.trim();if(!t)return void(this.uploadFromComputer&&(this.errorMessage="Enter an image link or upload a file"));var i=this.normalizeSrc(t);if(!i)return void(this.errorMessage="Enter a valid image link");if(this.activeFigure){var _e3;var _t7=this.activeFigure.querySelector("img");_t7&&(_t7.src=i,this.altValue.trim()?_t7.alt=this.altValue.trim():_t7.removeAttribute("alt"));var _e2=this.activeFigure.querySelector("figcaption");return this.captionValue.trim()?(_e2||(_e2=document.createElement("figcaption"),this.activeFigure.appendChild(_e2)),_e2.textContent=this.captionValue.trim()):(_e3=_e2)===null||_e3===void 0?void 0:_e3.remove(),this.emit(i),this.closePopover(),void requestAnimationFrame(function(){return _this4.updateOverlayPosition();});}if(!(this.selectionRange instanceof Range))return;this.editorEl.focus();var e=document.getSelection();if(!e)return;e.removeAllRanges(),e.addRange(this.selectionRange);var n=this.buildFigure(i,this.altValue,this.captionValue);this.insertFigureAt(this.selectionRange,n),this.emit(i),this.closePopover();}},{key:"removeImage",value:function removeImage(){if(!this.activeFigure)return;this.deselectImage();var t=this.activeFigure.parentNode;this.activeFigure.remove(),t instanceof HTMLElement&&!t.hasChildNodes()&&(t.innerHTML="<br>"),this.emit(""),this.closePopover();}},{key:"emit",value:function emit(t){this.dispatchEvent(new CustomEvent("nile-image-changed",{detail:{src:t,alt:this.altValue.trim(),caption:this.captionValue.trim()},bubbles:!0,composed:!0}));}},{key:"render",value:function render(){var t=this.disabled?"var(--nile-colors-neutral-500, var(--ng-colors-fg-disabled-subtle))":"var(--nile-colors-dark-900, var(--ng-colors-text-primary-900))";return e(_templateObject||(_templateObject=_taggedTemplateLiteral(["\n <nile-lite-tooltip content=",">\n <nile-button\n variant=\"tertiary\"\n size=\"small\"\n ?disabled=","\n @mousedown=","\n @click=","\n class=\"rte-image-button\"\n >\n <nile-glyph name=\"image\" color=","></nile-glyph>\n </nile-button>\n </nile-lite-tooltip>\n\n <nile-popover\n class=\"rte-image-popover\"\n .arrow=","\n style=","\n @mousedown=","\n @mouseup=","\n >\n <div class=\"image-popup-wrap\">\n <nile-input\n label=\"Image URL\"\n placeholder=","\n .value=","\n @nile-input=","\n @keydown=","\n @nile-blur=","\n ></nile-input>\n\n ","\n\n ","\n\n <nile-input\n label=\"Alt text\"\n placeholder=","\n .value=","\n @nile-input=","\n @keydown=","\n @nile-blur=","\n part=\"alt-input\"\n ></nile-input>\n\n <nile-input\n label=\"Caption\"\n placeholder=","\n .value=","\n @nile-input=","\n @keydown=","\n @nile-blur=","\n part=\"caption-input\"\n ></nile-input>\n\n <div class=\"image-actions-row\" part=\"actions-row\">\n ","\n <nile-button part=\"apply-button\" size=\"small\" variant=\"primary\" @click=",">\n ","\n </nile-button>\n </div>\n </div>\n </nile-popover>\n "])),this.label,this.disabled,this.onToolbarButtonMousedown,this.onOpen,t,!1,this.popoverStyle,this.onPopoverMousedown,this.onPopoverMouseup,this.placeholder,this.srcValue,this.onSrcInput,this.onInputKeydown,this.onInputBlur,this.uploadFromComputer?e(_templateObject2||(_templateObject2=_taggedTemplateLiteral(["\n <div class=\"image-divider-row\" part=\"divider\">or</div>\n\n <div class=\"image-upload-row\" part=\"upload-row\">\n <nile-button\n part=\"upload-button\"\n size=\"small\"\n variant=\"secondary\"\n @click=","\n >\n <nile-glyph name=\"upload\" slot=\"prefix\"></nile-glyph>\n Upload from computer\n </nile-button>\n ","\n </div>\n <input\n part=\"upload-input\"\n type=\"file\"\n accept=\"image/*\"\n @change=","\n />\n "])),this.onUploadClick,this.uploadedFileName?e(_templateObject3||(_templateObject3=_taggedTemplateLiteral(["<span class=\"image-upload-filename\" part=\"upload-filename\"\n >","</span\n >"])),this.uploadedFileName):null,this.onFileChange):null,this.errorMessage?e(_templateObject4||(_templateObject4=_taggedTemplateLiteral(["<span class=\"image-error\" part=\"error\">","</span>"])),this.errorMessage):null,this.altPlaceholder,this.altValue,this.onAltInput,this.onInputKeydown,this.onInputBlur,this.captionPlaceholder,this.captionValue,this.onCaptionInput,this.onInputKeydown,this.onInputBlur,this.hasActiveImage?e(_templateObject5||(_templateObject5=_taggedTemplateLiteral(["\n <nile-button\n part=\"remove-button\"\n size=\"small\"\n variant=\"secondary\"\n @click=","\n >\n Remove\n </nile-button>\n "])),this.onRemoveClick):null,this.onApplyClick,this.hasActiveImage?"Update":"Insert");}}]);}(i);t([n({attribute:!1})],o.prototype,"editorEl",void 0),t([n({type:Boolean,reflect:!0,attribute:!0})],o.prototype,"disabled",void 0),t([n({type:String,reflect:!0,attribute:!0})],o.prototype,"label",void 0),t([n({type:String,reflect:!0,attribute:!0})],o.prototype,"placeholder",void 0),t([n({type:String,reflect:!0,attribute:!0})],o.prototype,"altPlaceholder",void 0),t([n({type:String,reflect:!0,attribute:!0})],o.prototype,"captionPlaceholder",void 0),t([n({type:Number,reflect:!0,attribute:"maxfilesize"})],o.prototype,"maxFileSize",void 0),t([n({type:Boolean,reflect:!0,attribute:"uploadfromcomputer"})],o.prototype,"uploadFromComputer",void 0),t([s()],o.prototype,"srcValue",void 0),t([s()],o.prototype,"altValue",void 0),t([s()],o.prototype,"captionValue",void 0),t([s()],o.prototype,"hasActiveImage",void 0),t([s()],o.prototype,"uploadedFileName",void 0),t([s()],o.prototype,"errorMessage",void 0),t([s()],o.prototype,"popoverStyle",void 0),o=t([r("nile-rte-image")],o);}};});
3
+ //# sourceMappingURL=nile-rte-image.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nile-rte-image.cjs.js","sources":["../../../src/nile-rich-text-editor/nile-rte-image.ts"],"sourcesContent":["import { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\n@customElement('nile-rte-image')\nexport class NileRteImage extends LitElement {\n protected createRenderRoot() {\n return this;\n }\n\n @property({ attribute: false }) editorEl!: HTMLElement;\n @property({ type: Boolean, reflect: true, attribute: true }) disabled = false;\n @property({ type: String, reflect: true, attribute: true }) label = 'Image';\n @property({ type: String, reflect: true, attribute: true }) placeholder = 'Paste image link here';\n @property({ type: String, reflect: true, attribute: true }) altPlaceholder = 'Describe the image';\n @property({ type: String, reflect: true, attribute: true }) captionPlaceholder = 'Add a caption (optional)';\n @property({ type: Number, reflect: true, attribute: 'maxfilesize' }) maxFileSize = 2 * 1024 * 1024;\n @property({ type: Boolean, reflect: true, attribute: 'uploadfromcomputer' }) uploadFromComputer = false;\n\n @state() private srcValue = '';\n @state() private altValue = '';\n @state() private captionValue = '';\n @state() private hasActiveImage = false;\n @state() private uploadedFileName = '';\n @state() private errorMessage = '';\n @state() private popoverStyle = '';\n\n private selectionRange: Range | null = null;\n private activeFigure: HTMLElement | null = null;\n\n private ignoreBlur = false;\n private isApplying = false;\n\n private selectedFigure: HTMLElement | null = null;\n private resizeOverlay: HTMLElement | null = null;\n private dragStartX = 0;\n private dragStartWidth = 0;\n private dragDir = '';\n private isDragging = false;\n private trackingRaf = 0;\n\n connectedCallback() {\n super.connectedCallback();\n\n this.injectCss(`\n nile-popover.rte-image-popover::part(popover) {\n min-width: 340px;\n max-width: 420px;\n background: white;\n border: 1px solid var(--nile-colors-neutral-400, var(--ng-componentcolors-utility-gray-400));\n border-radius: 8px;\n padding: 0;\n gap: 0;\n overflow: hidden;\n height: auto;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n }\n\n .image-popup-wrap {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n }\n\n .image-popup-wrap nile-input {\n width: 100%;\n }\n\n .image-popup-wrap .image-upload-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n }\n\n .image-popup-wrap .image-upload-row nile-button {\n flex-shrink: 0;\n }\n\n .image-popup-wrap .image-upload-filename {\n font-size: 12px;\n color: var(--nile-colors-neutral-600, var(--ng-colors-text-secondary));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n }\n\n .image-popup-wrap .image-error {\n font-size: 12px;\n color: var(--nile-colors-error-600, var(--ng-colors-text-error-primary-600));\n }\n\n .image-popup-wrap .image-divider-row {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--nile-colors-neutral-500, var(--ng-colors-text-secondary));\n font-size: 12px;\n }\n\n .image-popup-wrap .image-divider-row::before,\n .image-popup-wrap .image-divider-row::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--nile-colors-neutral-400, var(--ng-colors-border-neutral));\n }\n\n .image-popup-wrap .image-actions-row {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n width: 100%;\n }\n\n nile-button.rte-image-button::part(base) {\n border: none;\n height: 32px;\n width: 32px;\n }\n\n nile-rte-image input[type='file'] {\n display: none;\n }\n\n .rte-image-resize-overlay {\n position: fixed;\n z-index: 999;\n pointer-events: none;\n border: 2px solid var(--nile-colors-primary-500, var(--ng-componentcolors-utility-blue-500));\n border-radius: var(--nile-radius-radius-lg, var(--ng-radius-md));\n box-sizing: border-box;\n }\n\n .rte-image-resize-overlay .rte-resize-handle {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--nile-colors-white-base, #fff);\n border: 2px solid var(--nile-colors-primary-500, var(--ng-componentcolors-utility-blue-500));\n border-radius: 50%;\n pointer-events: auto;\n box-sizing: border-box;\n }\n\n .rte-image-resize-overlay .rte-resize-handle[data-dir='nw'] { top: -7px; left: -7px; cursor: nwse-resize; }\n .rte-image-resize-overlay .rte-resize-handle[data-dir='ne'] { top: -7px; right: -7px; cursor: nesw-resize; }\n .rte-image-resize-overlay .rte-resize-handle[data-dir='sw'] { bottom: -7px; left: -7px; cursor: nesw-resize; }\n .rte-image-resize-overlay .rte-resize-handle[data-dir='se'] { bottom: -7px; right: -7px; cursor: nwse-resize; }\n\n .rte-image-resize-overlay .rte-image-align-bar {\n position: absolute;\n top: -44px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n gap: 2px;\n padding: 4px;\n background: var(--nile-colors-white-base, #fff);\n border: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-neutral));\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n pointer-events: auto;\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n padding: 0;\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button:hover {\n background: var(--nile-colors-neutral-200, var(--ng-componentcolors-utility-gray-200));\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button[data-active] {\n background: var(--nile-colors-primary-400, var(--ng-componentcolors-utility-blue-400));\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button nile-icon {\n pointer-events: none;\n }\n\n .rte-image-resize-overlay .rte-resize-size-label {\n position: absolute;\n bottom: -26px;\n right: 0;\n background: var(--nile-colors-dark-900, #101828);\n color: #fff;\n font-size: 11px;\n line-height: 1;\n padding: 4px 6px;\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: none;\n }\n `);\n }\n\n private injectCss(cssText: string) {\n if (this.querySelector('style[data-rte-image-style]')) return;\n const style = document.createElement('style');\n style.setAttribute('data-rte-image-style', 'true');\n style.textContent = cssText;\n this.insertBefore(style, this.firstChild);\n }\n\n protected updated(changed: Map<string, any>) {\n if (changed.has('editorEl')) {\n const prev = changed.get('editorEl') as HTMLElement | undefined;\n prev?.removeEventListener('click', this.onEditorImageClick);\n prev?.removeEventListener('dblclick', this.onEditorImageDblClick);\n prev?.removeEventListener('input', this.onEditorInput);\n prev?.removeEventListener('paste', this.onEditorImagePaste);\n this.editorEl?.addEventListener('click', this.onEditorImageClick);\n this.editorEl?.addEventListener('dblclick', this.onEditorImageDblClick);\n this.editorEl?.addEventListener('input', this.onEditorInput);\n this.editorEl?.addEventListener('paste', this.onEditorImagePaste);\n }\n if (changed.has('disabled') && this.disabled) {\n this.deselectImage();\n }\n }\n\n disconnectedCallback(): void {\n this.editorEl?.removeEventListener('click', this.onEditorImageClick);\n this.editorEl?.removeEventListener('dblclick', this.onEditorImageDblClick);\n this.editorEl?.removeEventListener('input', this.onEditorInput);\n this.editorEl?.removeEventListener('paste', this.onEditorImagePaste);\n window.removeEventListener('scroll', this.onScroll, true);\n this.deselectImage();\n super.disconnectedCallback();\n }\n\n private onEditorInput = () => {\n // content edits can remove or reflow the figure\n if (this.selectedFigure && !this.selectedFigure.isConnected) {\n this.deselectImage();\n } else {\n this.updateOverlayPosition();\n }\n };\n\n private onEditorImagePaste = (e: ClipboardEvent) => {\n if (this.disabled) return;\n\n const items = Array.from(e.clipboardData?.items ?? []);\n const imageFiles = items\n .filter(i => i.kind === 'file' && i.type.startsWith('image/'))\n .map(i => i.getAsFile())\n .filter((f): f is File => !!f);\n if (!imageFiles.length) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n for (const file of imageFiles) {\n if (this.maxFileSize > 0 && file.size > this.maxFileSize) {\n console.warn(\n `nile-rte-image: pasted image \"${file.name}\" skipped — exceeds the ${this.maxFileSize} byte limit`\n );\n continue;\n }\n const reader = new FileReader();\n reader.onload = () => {\n this.insertPastedImage(\n String(reader.result || ''),\n file.name.replace(/\\.[^.]+$/, '')\n );\n };\n reader.readAsDataURL(file);\n }\n };\n\n private insertPastedImage(src: string, alt: string) {\n if (!src.startsWith('data:image/')) return;\n\n let range: Range;\n const sel = document.getSelection();\n if (\n sel &&\n sel.rangeCount > 0 &&\n this.editorEl.contains(sel.getRangeAt(0).commonAncestorContainer)\n ) {\n range = sel.getRangeAt(0).cloneRange();\n } else {\n range = document.createRange();\n range.selectNodeContents(this.editorEl);\n range.collapse(false);\n }\n\n const figure = this.buildFigure(src, alt);\n this.insertFigureAt(range, figure);\n this.emit(src);\n }\n\n private isSafeSrc(src: string): boolean {\n return /^(https?:\\/\\/|data:image\\/|blob:|\\/)/i.test(src);\n }\n\n private normalizeSrc(src: string): string {\n if (this.isSafeSrc(src)) return src;\n if (/^[a-z][a-z0-9+.-]*:/i.test(src)) return '';\n return `https://${src}`;\n }\n\n private getSelectionRect(): DOMRect | null {\n if (!this.selectionRange) return null;\n\n let rect = this.selectionRange.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n const span = document.createElement('span');\n span.textContent = '\\u200b';\n const tempRange = this.selectionRange.cloneRange();\n tempRange.insertNode(span);\n rect = span.getBoundingClientRect();\n span.remove();\n }\n return rect;\n }\n\n private positionPopover(anchorRect?: DOMRect | null) {\n const rect = anchorRect ?? this.getSelectionRect();\n if (!rect) return;\n\n const half = 170;\n const centerX = Math.min(\n Math.max(rect.left + rect.width / 2, half + 8),\n window.innerWidth - half - 8\n );\n\n this.popoverStyle = `\n position: fixed;\n top: ${rect.bottom + 8}px;\n left: ${centerX}px;\n transform: translateX(-50%);\n z-index: 1000;\n `;\n }\n\n private onScroll = () => {\n this.closePopover();\n };\n\n private openPopover() {\n requestAnimationFrame(() => {\n const pop = this.querySelector('nile-popover') as any;\n pop && (pop.isShow = true);\n window.addEventListener('scroll', this.onScroll, true);\n });\n }\n\n private closePopover() {\n const pop = this.querySelector('nile-popover') as any;\n pop && (pop.isShow = false);\n\n window.removeEventListener('scroll', this.onScroll, true);\n\n this.srcValue = '';\n this.altValue = '';\n this.captionValue = '';\n this.uploadedFileName = '';\n this.errorMessage = '';\n this.selectionRange = null;\n this.activeFigure = null;\n this.hasActiveImage = false;\n this.popoverStyle = '';\n }\n\n private onEditorImageClick = (e: MouseEvent) => {\n if (this.disabled) return;\n const target = e.target as HTMLElement;\n const figure = target.closest?.('figure.rte-image') as HTMLElement | null;\n if (!figure || !this.editorEl.contains(figure)) {\n this.deselectImage();\n return;\n }\n\n e.preventDefault();\n this.selectImage(figure);\n };\n\n private onEditorImageDblClick = (e: MouseEvent) => {\n if (this.disabled) return;\n const target = e.target as HTMLElement;\n const figure = target.closest?.('figure.rte-image') as HTMLElement | null;\n if (!figure || !this.editorEl.contains(figure)) return;\n\n e.preventDefault();\n this.openEditFor(figure);\n };\n\n private openEditFor(figure: HTMLElement, anchorRect?: DOMRect | null) {\n const range = document.createRange();\n range.selectNode(figure);\n this.selectionRange = range;\n\n this.activeFigure = figure;\n this.hasActiveImage = true;\n\n const img = figure.querySelector('img');\n const figcaption = figure.querySelector('figcaption');\n this.srcValue = img?.getAttribute('src') || '';\n this.altValue = img?.getAttribute('alt') || '';\n this.captionValue = figcaption?.textContent || '';\n this.uploadedFileName = '';\n this.errorMessage = '';\n\n this.positionPopover(anchorRect ?? figure.getBoundingClientRect());\n this.openPopover();\n }\n\n private getToolbarButtonRect(): DOMRect | null {\n const btn = this.querySelector('nile-button.rte-image-button');\n return btn ? btn.getBoundingClientRect() : null;\n }\n\n // ---------- resize ----------\n\n private selectImage(figure: HTMLElement) {\n if (this.selectedFigure === figure) {\n this.updateOverlayPosition();\n return;\n }\n this.deselectImage();\n this.selectedFigure = figure;\n\n const img = figure.querySelector('img');\n if (img && !img.complete) {\n img.addEventListener('load', this.onSelectedImageLoad, { once: true });\n }\n\n this.buildOverlay();\n this.syncAlignBar();\n this.updateOverlayPosition();\n this.startOverlayTracking();\n\n document.addEventListener('mousedown', this.onDocMousedown, true);\n document.addEventListener('keydown', this.onDocKeydown, true);\n }\n\n private deselectImage() {\n if (!this.selectedFigure && !this.resizeOverlay) return;\n this.selectedFigure = null;\n this.resizeOverlay?.remove();\n this.resizeOverlay = null;\n this.isDragging = false;\n this.stopOverlayTracking();\n\n document.removeEventListener('mousedown', this.onDocMousedown, true);\n document.removeEventListener('keydown', this.onDocKeydown, true);\n document.removeEventListener('mousemove', this.onDragMove);\n document.removeEventListener('mouseup', this.onDragEnd);\n }\n\n private onDocKeydown = (e: KeyboardEvent) => {\n if (!this.selectedFigure) return;\n\n if (e.key === 'Escape') {\n this.deselectImage();\n return;\n }\n if (e.key !== 'Backspace' && e.key !== 'Delete') return;\n\n // don't hijack deletions typed into inputs (e.g. the edit popover)\n const target = e.target as HTMLElement;\n if (target?.closest?.('input, textarea, nile-input, nile-popover')) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const figure = this.selectedFigure;\n this.deselectImage();\n const parent = figure.parentNode;\n figure.remove();\n if (parent instanceof HTMLElement && !parent.hasChildNodes()) {\n parent.innerHTML = '<br>';\n }\n this.emit('');\n };\n\n private onSelectedImageLoad = () => {\n this.updateOverlayPosition();\n };\n\n // re-sync the overlay to the image every frame while selected — this keeps\n // it glued to the image through scrolling (any container), layout shifts,\n // and image loads without needing to enumerate those events\n private startOverlayTracking() {\n this.stopOverlayTracking();\n const tick = () => {\n if (!this.selectedFigure || !this.resizeOverlay) return;\n if (!this.selectedFigure.isConnected) {\n this.deselectImage();\n return;\n }\n this.updateOverlayPosition();\n this.trackingRaf = requestAnimationFrame(tick);\n };\n this.trackingRaf = requestAnimationFrame(tick);\n }\n\n private stopOverlayTracking() {\n if (this.trackingRaf !== 0) {\n cancelAnimationFrame(this.trackingRaf);\n this.trackingRaf = 0;\n }\n }\n\n private onDocMousedown = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (this.resizeOverlay?.contains(target)) return;\n if (this.selectedFigure?.contains(target)) return;\n // clicks on our own UI (toolbar image button, popover) must not clear the\n // selection, otherwise pressing the toolbar button while an image is\n // selected would drop into insert mode instead of edit mode\n if (this.contains(target)) return;\n this.deselectImage();\n };\n\n private buildOverlay() {\n const overlay = document.createElement('div');\n overlay.className = 'rte-image-resize-overlay';\n\n for (const dir of ['nw', 'ne', 'sw', 'se']) {\n const handle = document.createElement('div');\n handle.className = 'rte-resize-handle';\n handle.dataset.dir = dir;\n handle.addEventListener('mousedown', this.onHandleMousedown);\n overlay.appendChild(handle);\n }\n\n const label = document.createElement('span');\n label.className = 'rte-resize-size-label';\n overlay.appendChild(label);\n\n const alignBar = document.createElement('div');\n alignBar.className = 'rte-image-align-bar';\n const alignments: Array<{ dir: string; icon: string; title: string }> = [\n { dir: 'left', icon: 'format_align_left', title: 'Align left' },\n { dir: 'center', icon: 'format_align_middle', title: 'Align center' },\n { dir: 'right', icon: 'format_align_right', title: 'Align right' },\n { dir: 'justify', icon: 'format_align_justify', title: 'Full width' },\n ];\n for (const { dir, icon, title } of alignments) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.dataset.dir = dir;\n btn.title = title;\n btn.setAttribute('aria-label', title);\n btn.innerHTML = `<nile-icon name=\"${icon}\" size=\"18\"></nile-icon>`;\n btn.addEventListener('mousedown', e => e.preventDefault());\n btn.addEventListener('click', this.onAlignClick);\n alignBar.appendChild(btn);\n }\n overlay.appendChild(alignBar);\n\n // append to <body>: a transformed/filtered ancestor (drawer, modal,\n // animated panel) would otherwise become the containing block for\n // position:fixed and the overlay would render far from the image\n document.body.appendChild(overlay);\n this.resizeOverlay = overlay;\n }\n\n private updateOverlayPosition() {\n if (!this.resizeOverlay || !this.selectedFigure) return;\n const img = this.selectedFigure.querySelector('img');\n if (!img) {\n this.deselectImage();\n return;\n }\n const rect = img.getBoundingClientRect();\n this.resizeOverlay.style.top = `${rect.top}px`;\n this.resizeOverlay.style.left = `${rect.left}px`;\n this.resizeOverlay.style.width = `${rect.width}px`;\n this.resizeOverlay.style.height = `${rect.height}px`;\n\n // keep the align bar reachable: above the image by default, flipped to\n // just inside the top edge when the image touches the viewport top\n const bar = this.resizeOverlay.querySelector(\n '.rte-image-align-bar'\n ) as HTMLElement | null;\n if (bar) {\n if (rect.top < 56) {\n bar.style.top = '8px';\n } else {\n bar.style.top = '-44px';\n }\n }\n\n const label = this.resizeOverlay.querySelector(\n '.rte-resize-size-label'\n ) as HTMLElement | null;\n if (label) {\n label.textContent = `${Math.round(rect.width)} × ${Math.round(rect.height)}`;\n label.style.display = this.isDragging ? '' : 'none';\n }\n }\n\n private onAlignClick = (e: Event) => {\n if (!this.selectedFigure) return;\n const dir = (e.currentTarget as HTMLElement).dataset.dir || 'left';\n\n if (dir === 'left') {\n this.selectedFigure.removeAttribute('data-align');\n } else {\n this.selectedFigure.setAttribute('data-align', dir);\n }\n this.syncAlignBar();\n this.updateOverlayPosition();\n\n const img = this.selectedFigure.querySelector('img');\n this.emit(img?.getAttribute('src') || '');\n };\n\n private syncAlignBar() {\n if (!this.resizeOverlay || !this.selectedFigure) return;\n const current = this.selectedFigure.getAttribute('data-align') || 'left';\n this.resizeOverlay\n .querySelectorAll<HTMLElement>('.rte-image-align-bar button')\n .forEach(btn => {\n btn.toggleAttribute('data-active', btn.dataset.dir === current);\n });\n }\n\n private onHandleMousedown = (e: MouseEvent) => {\n if (this.disabled || !this.selectedFigure) return;\n e.preventDefault();\n e.stopPropagation();\n\n const img = this.selectedFigure.querySelector('img');\n if (!img) return;\n\n // a full-width image can't be hand-resized — dragging implies a custom\n // width, so drop back to default alignment first\n if (this.selectedFigure.getAttribute('data-align') === 'justify') {\n this.selectedFigure.removeAttribute('data-align');\n this.syncAlignBar();\n }\n\n this.isDragging = true;\n this.dragDir = (e.currentTarget as HTMLElement).dataset.dir || 'se';\n this.dragStartX = e.clientX;\n this.dragStartWidth = img.getBoundingClientRect().width;\n\n document.addEventListener('mousemove', this.onDragMove);\n document.addEventListener('mouseup', this.onDragEnd);\n };\n\n private onDragMove = (e: MouseEvent) => {\n if (!this.isDragging || !this.selectedFigure) return;\n const img = this.selectedFigure.querySelector('img');\n if (!img) return;\n\n const dx = e.clientX - this.dragStartX;\n const growsRight = this.dragDir === 'ne' || this.dragDir === 'se';\n let width = this.dragStartWidth + (growsRight ? dx : -dx);\n\n const maxWidth = this.getEditorContentWidth();\n width = Math.max(48, Math.min(width, maxWidth));\n\n img.setAttribute('width', String(Math.round(width)));\n this.updateOverlayPosition();\n };\n\n private onDragEnd = () => {\n if (!this.isDragging) return;\n this.isDragging = false;\n document.removeEventListener('mousemove', this.onDragMove);\n document.removeEventListener('mouseup', this.onDragEnd);\n this.updateOverlayPosition();\n\n const img = this.selectedFigure?.querySelector('img');\n this.dispatchEvent(\n new CustomEvent('nile-image-changed', {\n detail: {\n src: img?.getAttribute('src') || '',\n alt: img?.getAttribute('alt') || '',\n caption:\n this.selectedFigure?.querySelector('figcaption')?.textContent || '',\n width: img ? Number(img.getAttribute('width')) || null : null,\n },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private getEditorContentWidth(): number {\n const style = getComputedStyle(this.editorEl);\n return (\n this.editorEl.clientWidth -\n parseFloat(style.paddingLeft || '0') -\n parseFloat(style.paddingRight || '0') || Infinity\n );\n }\n\n private onOpen = () => {\n if (this.disabled) return;\n\n if (this.selectedFigure) {\n this.openEditFor(this.selectedFigure, this.getToolbarButtonRect());\n return;\n }\n\n const sel = document.getSelection();\n if (\n sel &&\n sel.rangeCount > 0 &&\n this.editorEl.contains(sel.getRangeAt(0).commonAncestorContainer)\n ) {\n this.selectionRange = sel.getRangeAt(0).cloneRange();\n } else {\n const range = document.createRange();\n range.selectNodeContents(this.editorEl);\n range.collapse(false);\n this.selectionRange = range;\n }\n\n this.activeFigure = null;\n this.hasActiveImage = false;\n this.srcValue = '';\n this.altValue = '';\n this.captionValue = '';\n this.uploadedFileName = '';\n this.errorMessage = '';\n this.positionPopover(this.getToolbarButtonRect());\n this.openPopover();\n\n requestAnimationFrame(() => {\n const input = this.querySelector('nile-input');\n (input as any)?.focus();\n });\n };\n\n private onInputKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' && e.key !== 'Enter') return;\n e.preventDefault();\n e.stopPropagation();\n if (e.key === 'Escape') {\n this.closePopover();\n return;\n }\n this.isApplying = true;\n try {\n this.applyImage();\n } finally {\n this.isApplying = false;\n }\n };\n\n private onInputBlur = () => {\n if (this.ignoreBlur || this.isApplying) return;\n requestAnimationFrame(() => {\n if (this.ignoreBlur || this.isApplying) return;\n const pop = this.querySelector('nile-popover');\n if (pop?.matches(':focus-within')) return;\n this.closePopover();\n });\n };\n\n private onSrcInput = (e: CustomEvent) => {\n this.srcValue = e.detail.value;\n this.uploadedFileName = '';\n this.errorMessage = '';\n };\n\n private onAltInput = (e: CustomEvent) => {\n this.altValue = e.detail.value;\n };\n\n private onCaptionInput = (e: CustomEvent) => {\n this.captionValue = e.detail.value;\n };\n\n private onPopoverMousedown = () => {\n this.ignoreBlur = true;\n };\n\n private onPopoverMouseup = () => {\n this.ignoreBlur = false;\n };\n\n private onToolbarButtonMousedown = (e: Event) => {\n e.preventDefault();\n };\n\n private onUploadClick = () => {\n // keep the popover open while the OS file dialog steals focus\n this.ignoreBlur = true;\n const fileInput = this.querySelector(\n 'input[type=\"file\"]'\n ) as HTMLInputElement | null;\n fileInput?.click();\n window.addEventListener(\n 'focus',\n () => {\n setTimeout(() => {\n this.ignoreBlur = false;\n }, 200);\n },\n { once: true }\n );\n };\n\n private onFileChange = (e: Event) => {\n const input = e.target as HTMLInputElement;\n const file = input.files?.[0];\n input.value = '';\n if (!file) return;\n\n if (!file.type.startsWith('image/')) {\n this.errorMessage = 'Only image files are supported';\n return;\n }\n if (this.maxFileSize > 0 && file.size > this.maxFileSize) {\n const mb = (this.maxFileSize / (1024 * 1024)).toFixed(1);\n this.errorMessage = `File is too large. Maximum size is ${mb} MB`;\n return;\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n this.srcValue = String(reader.result || '');\n this.uploadedFileName = file.name;\n this.errorMessage = '';\n if (!this.altValue) {\n this.altValue = file.name.replace(/\\.[^.]+$/, '');\n }\n };\n reader.onerror = () => {\n this.errorMessage = 'Could not read the selected file';\n };\n reader.readAsDataURL(file);\n };\n\n private onApplyClick = () => {\n this.isApplying = true;\n this.applyImage();\n this.isApplying = false;\n this.ignoreBlur = false;\n };\n\n private onRemoveClick = () => {\n this.isApplying = true;\n this.removeImage();\n this.isApplying = false;\n this.ignoreBlur = false;\n };\n\n private buildFigure(src: string, alt = '', caption = ''): HTMLElement {\n const figure = document.createElement('figure');\n figure.className = 'rte-image';\n figure.setAttribute('contenteditable', 'false');\n\n const img = document.createElement('img');\n img.src = src;\n if (alt.trim()) img.alt = alt.trim();\n figure.appendChild(img);\n\n if (caption.trim()) {\n const figcaption = document.createElement('figcaption');\n figcaption.textContent = caption.trim();\n figure.appendChild(figcaption);\n }\n return figure;\n }\n\n private insertFigureAt(insertRange: Range, figure: HTMLElement) {\n const sel = document.getSelection();\n if (!sel) return;\n\n // a <figure> is not valid inside <p>/<h*>, so place it after the\n // block that holds the caret instead of splitting it at the range\n let block: HTMLElement | null = null;\n let n: Node | null = insertRange.startContainer;\n while (n && n !== this.editorEl) {\n if (\n n instanceof HTMLElement &&\n /^(P|H[1-6]|UL|OL|BLOCKQUOTE|PRE|TABLE|FIGURE|DIV)$/.test(n.tagName)\n ) {\n block = n;\n break;\n }\n n = n.parentNode;\n }\n // an empty paragraph (the default '<p><br></p>' of a fresh editor) would\n // otherwise remain above the image as a blank gap — take its place instead\n const isEmptyBlock =\n block &&\n /^(P|H[1-6])$/.test(block.tagName) &&\n (block.textContent ?? '').replace(/\\u200B/g, '').trim() === '' &&\n !block.querySelector('img');\n\n if (block?.parentNode) {\n if (isEmptyBlock) {\n block.parentNode.insertBefore(figure, block);\n block.remove();\n } else {\n block.parentNode.insertBefore(figure, block.nextSibling);\n }\n } else {\n this.editorEl.appendChild(figure);\n }\n\n // keep a paragraph after the image so typing can continue below it\n let after = figure.nextElementSibling;\n if (!after) {\n const p = document.createElement('p');\n p.innerHTML = '<br>';\n figure.parentNode?.insertBefore(p, figure.nextSibling);\n after = p;\n }\n\n const range = document.createRange();\n range.setStart(after, 0);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n\n private applyImage() {\n const raw = this.srcValue.trim();\n if (!raw) {\n if (this.uploadFromComputer) {\n this.errorMessage = 'Enter an image link or upload a file';\n }\n return;\n }\n\n const src = this.normalizeSrc(raw);\n if (!src) {\n this.errorMessage = 'Enter a valid image link';\n return;\n }\n\n if (this.activeFigure) {\n const img = this.activeFigure.querySelector('img');\n if (img) {\n img.src = src;\n if (this.altValue.trim()) {\n img.alt = this.altValue.trim();\n } else {\n img.removeAttribute('alt');\n }\n }\n\n let figcaption = this.activeFigure.querySelector('figcaption');\n if (this.captionValue.trim()) {\n if (!figcaption) {\n figcaption = document.createElement('figcaption');\n this.activeFigure.appendChild(figcaption);\n }\n figcaption.textContent = this.captionValue.trim();\n } else {\n figcaption?.remove();\n }\n\n this.emit(src);\n this.closePopover();\n requestAnimationFrame(() => this.updateOverlayPosition());\n return;\n }\n\n if (!(this.selectionRange instanceof Range)) return;\n\n this.editorEl.focus();\n\n const sel = document.getSelection();\n if (!sel) return;\n sel.removeAllRanges();\n sel.addRange(this.selectionRange);\n\n const figure = this.buildFigure(src, this.altValue, this.captionValue);\n this.insertFigureAt(this.selectionRange, figure);\n\n this.emit(src);\n this.closePopover();\n }\n\n private removeImage() {\n if (!this.activeFigure) return;\n this.deselectImage();\n const parent = this.activeFigure.parentNode;\n this.activeFigure.remove();\n if (parent instanceof HTMLElement && !parent.hasChildNodes()) {\n parent.innerHTML = '<br>';\n }\n this.emit('');\n this.closePopover();\n }\n\n private emit(src: string) {\n this.dispatchEvent(\n new CustomEvent('nile-image-changed', {\n detail: {\n src,\n alt: this.altValue.trim(),\n caption: this.captionValue.trim(),\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n render() {\n const iconColor = this.disabled\n ? 'var(--nile-colors-neutral-500, var(--ng-colors-fg-disabled-subtle))'\n : 'var(--nile-colors-dark-900, var(--ng-colors-text-primary-900))';\n\n return html`\n <nile-lite-tooltip content=${this.label}>\n <nile-button\n variant=\"tertiary\"\n size=\"small\"\n ?disabled=${this.disabled}\n @mousedown=${this.onToolbarButtonMousedown}\n @click=${this.onOpen}\n class=\"rte-image-button\"\n >\n <nile-glyph name=\"image\" color=${iconColor}></nile-glyph>\n </nile-button>\n </nile-lite-tooltip>\n\n <nile-popover\n class=\"rte-image-popover\"\n .arrow=${false}\n style=${this.popoverStyle}\n @mousedown=${this.onPopoverMousedown}\n @mouseup=${this.onPopoverMouseup}\n >\n <div class=\"image-popup-wrap\">\n <nile-input\n label=\"Image URL\"\n placeholder=${this.placeholder}\n .value=${this.srcValue}\n @nile-input=${this.onSrcInput}\n @keydown=${this.onInputKeydown}\n @nile-blur=${this.onInputBlur}\n ></nile-input>\n\n ${this.uploadFromComputer\n ? html`\n <div class=\"image-divider-row\" part=\"divider\">or</div>\n\n <div class=\"image-upload-row\" part=\"upload-row\">\n <nile-button\n part=\"upload-button\"\n size=\"small\"\n variant=\"secondary\"\n @click=${this.onUploadClick}\n >\n <nile-glyph name=\"upload\" slot=\"prefix\"></nile-glyph>\n Upload from computer\n </nile-button>\n ${this.uploadedFileName\n ? html`<span class=\"image-upload-filename\" part=\"upload-filename\"\n >${this.uploadedFileName}</span\n >`\n : null}\n </div>\n <input\n part=\"upload-input\"\n type=\"file\"\n accept=\"image/*\"\n @change=${this.onFileChange}\n />\n `\n : null}\n\n ${this.errorMessage\n ? html`<span class=\"image-error\" part=\"error\">${this.errorMessage}</span>`\n : null}\n\n <nile-input\n label=\"Alt text\"\n placeholder=${this.altPlaceholder}\n .value=${this.altValue}\n @nile-input=${this.onAltInput}\n @keydown=${this.onInputKeydown}\n @nile-blur=${this.onInputBlur}\n part=\"alt-input\"\n ></nile-input>\n\n <nile-input\n label=\"Caption\"\n placeholder=${this.captionPlaceholder}\n .value=${this.captionValue}\n @nile-input=${this.onCaptionInput}\n @keydown=${this.onInputKeydown}\n @nile-blur=${this.onInputBlur}\n part=\"caption-input\"\n ></nile-input>\n\n <div class=\"image-actions-row\" part=\"actions-row\">\n ${this.hasActiveImage\n ? html`\n <nile-button\n part=\"remove-button\"\n size=\"small\"\n variant=\"secondary\"\n @click=${this.onRemoveClick}\n >\n Remove\n </nile-button>\n `\n : null}\n <nile-button part=\"apply-button\" size=\"small\" variant=\"primary\" @click=${this.onApplyClick}>\n ${this.hasActiveImage ? 'Update' : 'Insert'}\n </nile-button>\n </div>\n </div>\n </nile-popover>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-rte-image': NileRteImage;\n }\n}\n"],"names":["NileRteImage","o","constructor","this","disabled","label","placeholder","altPlaceholder","captionPlaceholder","maxFileSize","uploadFromComputer","srcValue","altValue","captionValue","hasActiveImage","uploadedFileName","errorMessage","popoverStyle","selectionRange","activeFigure","ignoreBlur","isApplying","selectedFigure","resizeOverlay","dragStartX","dragStartWidth","dragDir","isDragging","trackingRaf","onEditorInput","isConnected","deselectImage","updateOverlayPosition","onEditorImagePaste","e","_t$clipboardData$item","_t$clipboardData","imageFiles","Array","from","clipboardData","items","filter","i","kind","type","startsWith","map","getAsFile","f","length","preventDefault","stopPropagation","_iterator","_createForOfIteratorHelper","_step","_loop","file","size","console","warn","concat","name","reader","FileReader","onload","insertPastedImage","String","result","replace","readAsDataURL","s","n","done","err","onScroll","closePopover","onEditorImageClick","_i$closest","target","figure","closest","editorEl","contains","selectImage","onEditorImageDblClick","openEditFor","onDocKeydown","key","_i$closest3","parent","parentNode","remove","HTMLElement","hasChildNodes","innerHTML","emit","onSelectedImageLoad","onDocMousedown","_this$resizeOverlay","_this$selectedFigure","onAlignClick","dir","currentTarget","dataset","removeAttribute","setAttribute","syncAlignBar","img","querySelector","getAttribute","onHandleMousedown","clientX","getBoundingClientRect","width","document","addEventListener","onDragMove","onDragEnd","dx","growsRight","maxWidth","getEditorContentWidth","Math","max","min","round","_this$selectedFigure2","_this$selectedFigure3","removeEventListener","dispatchEvent","CustomEvent","detail","src","alt","caption","textContent","Number","bubbles","composed","onOpen","getToolbarButtonRect","sel","getSelection","rangeCount","getRangeAt","commonAncestorContainer","cloneRange","range","createRange","selectNodeContents","collapse","positionPopover","openPopover","requestAnimationFrame","input","focus","onInputKeydown","applyImage","onInputBlur","pop","matches","onSrcInput","value","onAltInput","onCaptionInput","onPopoverMousedown","onPopoverMouseup","onToolbarButtonMousedown","onUploadClick","fileInput","click","window","setTimeout","once","onFileChange","files","_i$files","mb","toFixed","onerror","onApplyClick","onRemoveClick","removeImage","_this","_inherits","_i","_createClass","createRenderRoot","connectedCallback","super","injectCss","cssText","style","createElement","insertBefore","firstChild","updated","changed","has","_this$editorEl","_this$editorEl2","_this$editorEl3","_this$editorEl4","prev","get","disconnectedCallback","buildFigure","insertFigureAt","isSafeSrc","test","normalizeSrc","getSelectionRect","rect","height","span","insertNode","anchorRect","centerX","left","half","innerWidth","bottom","isShow","selectNode","figcaption","btn","complete","buildOverlay","startOverlayTracking","_this$resizeOverlay2","stopOverlayTracking","tick","cancelAnimationFrame","overlay","className","_i4","_arr","handle","appendChild","alignBar","alignments","icon","title","_i6","_n","_n$_i","body","top","bar","display","current","querySelectorAll","forEach","toggleAttribute","getComputedStyle","clientWidth","parseFloat","paddingLeft","paddingRight","Infinity","arguments","undefined","trim","insertRange","block","startContainer","tagName","isEmptyBlock","_n$textContent","nextSibling","after","nextElementSibling","_i$parentNode","p","setStart","removeAllRanges","addRange","raw","_e3","Range","render","iconColor","html","_templateObject","_taggedTemplateLiteral","_templateObject2","_templateObject3","_templateObject4","_templateObject5","LitElement","__decorate","property","attribute","prototype","Boolean","reflect","state","customElement"],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import{__decorate as t}from"tslib";import{LitElement as i,html as e}from"lit";import{property as n,state as s,customElement as r}from"lit/decorators.js";let o=class extends i{constructor(){super(...arguments),this.disabled=!1,this.label="Image",this.placeholder="Paste image link here",this.altPlaceholder="Describe the image",this.captionPlaceholder="Add a caption (optional)",this.maxFileSize=2097152,this.uploadFromComputer=!1,this.srcValue="",this.altValue="",this.captionValue="",this.hasActiveImage=!1,this.uploadedFileName="",this.errorMessage="",this.popoverStyle="",this.selectionRange=null,this.activeFigure=null,this.ignoreBlur=!1,this.isApplying=!1,this.selectedFigure=null,this.resizeOverlay=null,this.dragStartX=0,this.dragStartWidth=0,this.dragDir="",this.isDragging=!1,this.trackingRaf=0,this.onEditorInput=()=>{this.selectedFigure&&!this.selectedFigure.isConnected?this.deselectImage():this.updateOverlayPosition()},this.onEditorImagePaste=t=>{if(this.disabled)return;const i=Array.from(t.clipboardData?.items??[]).filter((t=>"file"===t.kind&&t.type.startsWith("image/"))).map((t=>t.getAsFile())).filter((t=>!!t));if(i.length){t.preventDefault(),t.stopPropagation();for(const t of i){if(this.maxFileSize>0&&t.size>this.maxFileSize){console.warn(`nile-rte-image: pasted image "${t.name}" skipped — exceeds the ${this.maxFileSize} byte limit`);continue}const i=new FileReader;i.onload=()=>{this.insertPastedImage(String(i.result||""),t.name.replace(/\.[^.]+$/,""))},i.readAsDataURL(t)}}},this.onScroll=()=>{this.closePopover()},this.onEditorImageClick=t=>{if(this.disabled)return;const i=t.target,e=i.closest?.("figure.rte-image");e&&this.editorEl.contains(e)?(t.preventDefault(),this.selectImage(e)):this.deselectImage()},this.onEditorImageDblClick=t=>{if(this.disabled)return;const i=t.target,e=i.closest?.("figure.rte-image");e&&this.editorEl.contains(e)&&(t.preventDefault(),this.openEditFor(e))},this.onDocKeydown=t=>{if(!this.selectedFigure)return;if("Escape"===t.key)return void this.deselectImage();if("Backspace"!==t.key&&"Delete"!==t.key)return;const i=t.target;if(i?.closest?.("input, textarea, nile-input, nile-popover"))return;t.preventDefault(),t.stopPropagation();const e=this.selectedFigure;this.deselectImage();const n=e.parentNode;e.remove(),n instanceof HTMLElement&&!n.hasChildNodes()&&(n.innerHTML="<br>"),this.emit("")},this.onSelectedImageLoad=()=>{this.updateOverlayPosition()},this.onDocMousedown=t=>{const i=t.target;this.resizeOverlay?.contains(i)||this.selectedFigure?.contains(i)||this.contains(i)||this.deselectImage()},this.onAlignClick=t=>{if(!this.selectedFigure)return;const i=t.currentTarget.dataset.dir||"left";"left"===i?this.selectedFigure.removeAttribute("data-align"):this.selectedFigure.setAttribute("data-align",i),this.syncAlignBar(),this.updateOverlayPosition();const e=this.selectedFigure.querySelector("img");this.emit(e?.getAttribute("src")||"")},this.onHandleMousedown=t=>{if(this.disabled||!this.selectedFigure)return;t.preventDefault(),t.stopPropagation();const i=this.selectedFigure.querySelector("img");i&&("justify"===this.selectedFigure.getAttribute("data-align")&&(this.selectedFigure.removeAttribute("data-align"),this.syncAlignBar()),this.isDragging=!0,this.dragDir=t.currentTarget.dataset.dir||"se",this.dragStartX=t.clientX,this.dragStartWidth=i.getBoundingClientRect().width,document.addEventListener("mousemove",this.onDragMove),document.addEventListener("mouseup",this.onDragEnd))},this.onDragMove=t=>{if(!this.isDragging||!this.selectedFigure)return;const i=this.selectedFigure.querySelector("img");if(!i)return;const e=t.clientX-this.dragStartX,n="ne"===this.dragDir||"se"===this.dragDir;let s=this.dragStartWidth+(n?e:-e);const r=this.getEditorContentWidth();s=Math.max(48,Math.min(s,r)),i.setAttribute("width",String(Math.round(s))),this.updateOverlayPosition()},this.onDragEnd=()=>{if(!this.isDragging)return;this.isDragging=!1,document.removeEventListener("mousemove",this.onDragMove),document.removeEventListener("mouseup",this.onDragEnd),this.updateOverlayPosition();const t=this.selectedFigure?.querySelector("img");this.dispatchEvent(new CustomEvent("nile-image-changed",{detail:{src:t?.getAttribute("src")||"",alt:t?.getAttribute("alt")||"",caption:this.selectedFigure?.querySelector("figcaption")?.textContent||"",width:t&&Number(t.getAttribute("width"))||null},bubbles:!0,composed:!0}))},this.onOpen=()=>{if(this.disabled)return;if(this.selectedFigure)return void this.openEditFor(this.selectedFigure,this.getToolbarButtonRect());const t=document.getSelection();if(t&&t.rangeCount>0&&this.editorEl.contains(t.getRangeAt(0).commonAncestorContainer))this.selectionRange=t.getRangeAt(0).cloneRange();else{const t=document.createRange();t.selectNodeContents(this.editorEl),t.collapse(!1),this.selectionRange=t}this.activeFigure=null,this.hasActiveImage=!1,this.srcValue="",this.altValue="",this.captionValue="",this.uploadedFileName="",this.errorMessage="",this.positionPopover(this.getToolbarButtonRect()),this.openPopover(),requestAnimationFrame((()=>{const t=this.querySelector("nile-input");t?.focus()}))},this.onInputKeydown=t=>{if("Escape"===t.key||"Enter"===t.key)if(t.preventDefault(),t.stopPropagation(),"Escape"!==t.key){this.isApplying=!0;try{this.applyImage()}finally{this.isApplying=!1}}else this.closePopover()},this.onInputBlur=()=>{this.ignoreBlur||this.isApplying||requestAnimationFrame((()=>{if(this.ignoreBlur||this.isApplying)return;const t=this.querySelector("nile-popover");t?.matches(":focus-within")||this.closePopover()}))},this.onSrcInput=t=>{this.srcValue=t.detail.value,this.uploadedFileName="",this.errorMessage=""},this.onAltInput=t=>{this.altValue=t.detail.value},this.onCaptionInput=t=>{this.captionValue=t.detail.value},this.onPopoverMousedown=()=>{this.ignoreBlur=!0},this.onPopoverMouseup=()=>{this.ignoreBlur=!1},this.onToolbarButtonMousedown=t=>{t.preventDefault()},this.onUploadClick=()=>{this.ignoreBlur=!0;const t=this.querySelector('input[type="file"]');t?.click(),window.addEventListener("focus",(()=>{setTimeout((()=>{this.ignoreBlur=!1}),200)}),{once:!0})},this.onFileChange=t=>{const i=t.target,e=i.files?.[0];if(i.value="",!e)return;if(!e.type.startsWith("image/"))return void(this.errorMessage="Only image files are supported");if(this.maxFileSize>0&&e.size>this.maxFileSize){const t=(this.maxFileSize/1048576).toFixed(1);return void(this.errorMessage=`File is too large. Maximum size is ${t} MB`)}const n=new FileReader;n.onload=()=>{this.srcValue=String(n.result||""),this.uploadedFileName=e.name,this.errorMessage="",this.altValue||(this.altValue=e.name.replace(/\.[^.]+$/,""))},n.onerror=()=>{this.errorMessage="Could not read the selected file"},n.readAsDataURL(e)},this.onApplyClick=()=>{this.isApplying=!0,this.applyImage(),this.isApplying=!1,this.ignoreBlur=!1},this.onRemoveClick=()=>{this.isApplying=!0,this.removeImage(),this.isApplying=!1,this.ignoreBlur=!1}}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.injectCss("\n nile-popover.rte-image-popover::part(popover) {\n min-width: 340px;\n max-width: 420px;\n background: white;\n border: 1px solid var(--nile-colors-neutral-400, var(--ng-componentcolors-utility-gray-400));\n border-radius: 8px;\n padding: 0;\n gap: 0;\n overflow: hidden;\n height: auto;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);\n }\n\n .image-popup-wrap {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n }\n\n .image-popup-wrap nile-input {\n width: 100%;\n }\n\n .image-popup-wrap .image-upload-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n }\n\n .image-popup-wrap .image-upload-row nile-button {\n flex-shrink: 0;\n }\n\n .image-popup-wrap .image-upload-filename {\n font-size: 12px;\n color: var(--nile-colors-neutral-600, var(--ng-colors-text-secondary));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n }\n\n .image-popup-wrap .image-error {\n font-size: 12px;\n color: var(--nile-colors-error-600, var(--ng-colors-text-error-primary-600));\n }\n\n .image-popup-wrap .image-divider-row {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--nile-colors-neutral-500, var(--ng-colors-text-secondary));\n font-size: 12px;\n }\n\n .image-popup-wrap .image-divider-row::before,\n .image-popup-wrap .image-divider-row::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--nile-colors-neutral-400, var(--ng-colors-border-neutral));\n }\n\n .image-popup-wrap .image-actions-row {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n width: 100%;\n }\n\n nile-button.rte-image-button::part(base) {\n border: none;\n height: 32px;\n width: 32px;\n }\n\n nile-rte-image input[type='file'] {\n display: none;\n }\n\n .rte-image-resize-overlay {\n position: fixed;\n z-index: 999;\n pointer-events: none;\n border: 2px solid var(--nile-colors-primary-500, var(--ng-componentcolors-utility-blue-500));\n border-radius: var(--nile-radius-radius-lg, var(--ng-radius-md));\n box-sizing: border-box;\n }\n\n .rte-image-resize-overlay .rte-resize-handle {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--nile-colors-white-base, #fff);\n border: 2px solid var(--nile-colors-primary-500, var(--ng-componentcolors-utility-blue-500));\n border-radius: 50%;\n pointer-events: auto;\n box-sizing: border-box;\n }\n\n .rte-image-resize-overlay .rte-resize-handle[data-dir='nw'] { top: -7px; left: -7px; cursor: nwse-resize; }\n .rte-image-resize-overlay .rte-resize-handle[data-dir='ne'] { top: -7px; right: -7px; cursor: nesw-resize; }\n .rte-image-resize-overlay .rte-resize-handle[data-dir='sw'] { bottom: -7px; left: -7px; cursor: nesw-resize; }\n .rte-image-resize-overlay .rte-resize-handle[data-dir='se'] { bottom: -7px; right: -7px; cursor: nwse-resize; }\n\n .rte-image-resize-overlay .rte-image-align-bar {\n position: absolute;\n top: -44px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n gap: 2px;\n padding: 4px;\n background: var(--nile-colors-white-base, #fff);\n border: 1px solid var(--nile-colors-neutral-400, var(--ng-colors-border-neutral));\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n pointer-events: auto;\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n padding: 0;\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button:hover {\n background: var(--nile-colors-neutral-200, var(--ng-componentcolors-utility-gray-200));\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button[data-active] {\n background: var(--nile-colors-primary-400, var(--ng-componentcolors-utility-blue-400));\n }\n\n .rte-image-resize-overlay .rte-image-align-bar button nile-icon {\n pointer-events: none;\n }\n\n .rte-image-resize-overlay .rte-resize-size-label {\n position: absolute;\n bottom: -26px;\n right: 0;\n background: var(--nile-colors-dark-900, #101828);\n color: #fff;\n font-size: 11px;\n line-height: 1;\n padding: 4px 6px;\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: none;\n }\n ")}injectCss(t){if(this.querySelector("style[data-rte-image-style]"))return;const i=document.createElement("style");i.setAttribute("data-rte-image-style","true"),i.textContent=t,this.insertBefore(i,this.firstChild)}updated(t){if(t.has("editorEl")){const i=t.get("editorEl");i?.removeEventListener("click",this.onEditorImageClick),i?.removeEventListener("dblclick",this.onEditorImageDblClick),i?.removeEventListener("input",this.onEditorInput),i?.removeEventListener("paste",this.onEditorImagePaste),this.editorEl?.addEventListener("click",this.onEditorImageClick),this.editorEl?.addEventListener("dblclick",this.onEditorImageDblClick),this.editorEl?.addEventListener("input",this.onEditorInput),this.editorEl?.addEventListener("paste",this.onEditorImagePaste)}t.has("disabled")&&this.disabled&&this.deselectImage()}disconnectedCallback(){this.editorEl?.removeEventListener("click",this.onEditorImageClick),this.editorEl?.removeEventListener("dblclick",this.onEditorImageDblClick),this.editorEl?.removeEventListener("input",this.onEditorInput),this.editorEl?.removeEventListener("paste",this.onEditorImagePaste),window.removeEventListener("scroll",this.onScroll,!0),this.deselectImage(),super.disconnectedCallback()}insertPastedImage(t,i){if(!t.startsWith("data:image/"))return;let e;const n=document.getSelection();n&&n.rangeCount>0&&this.editorEl.contains(n.getRangeAt(0).commonAncestorContainer)?e=n.getRangeAt(0).cloneRange():(e=document.createRange(),e.selectNodeContents(this.editorEl),e.collapse(!1));const s=this.buildFigure(t,i);this.insertFigureAt(e,s),this.emit(t)}isSafeSrc(t){return/^(https?:\/\/|data:image\/|blob:|\/)/i.test(t)}normalizeSrc(t){return this.isSafeSrc(t)?t:/^[a-z][a-z0-9+.-]*:/i.test(t)?"":`https://${t}`}getSelectionRect(){if(!this.selectionRange)return null;let t=this.selectionRange.getBoundingClientRect();if(0===t.width&&0===t.height){const i=document.createElement("span");i.textContent="​";this.selectionRange.cloneRange().insertNode(i),t=i.getBoundingClientRect(),i.remove()}return t}positionPopover(t){const i=t??this.getSelectionRect();if(!i)return;const e=Math.min(Math.max(i.left+i.width/2,178),window.innerWidth-170-8);this.popoverStyle=`\n position: fixed;\n top: ${i.bottom+8}px;\n left: ${e}px;\n transform: translateX(-50%);\n z-index: 1000;\n `}openPopover(){requestAnimationFrame((()=>{const t=this.querySelector("nile-popover");t&&(t.isShow=!0),window.addEventListener("scroll",this.onScroll,!0)}))}closePopover(){const t=this.querySelector("nile-popover");t&&(t.isShow=!1),window.removeEventListener("scroll",this.onScroll,!0),this.srcValue="",this.altValue="",this.captionValue="",this.uploadedFileName="",this.errorMessage="",this.selectionRange=null,this.activeFigure=null,this.hasActiveImage=!1,this.popoverStyle=""}openEditFor(t,i){const e=document.createRange();e.selectNode(t),this.selectionRange=e,this.activeFigure=t,this.hasActiveImage=!0;const n=t.querySelector("img"),s=t.querySelector("figcaption");this.srcValue=n?.getAttribute("src")||"",this.altValue=n?.getAttribute("alt")||"",this.captionValue=s?.textContent||"",this.uploadedFileName="",this.errorMessage="",this.positionPopover(i??t.getBoundingClientRect()),this.openPopover()}getToolbarButtonRect(){const t=this.querySelector("nile-button.rte-image-button");return t?t.getBoundingClientRect():null}selectImage(t){if(this.selectedFigure===t)return void this.updateOverlayPosition();this.deselectImage(),this.selectedFigure=t;const i=t.querySelector("img");i&&!i.complete&&i.addEventListener("load",this.onSelectedImageLoad,{once:!0}),this.buildOverlay(),this.syncAlignBar(),this.updateOverlayPosition(),this.startOverlayTracking(),document.addEventListener("mousedown",this.onDocMousedown,!0),document.addEventListener("keydown",this.onDocKeydown,!0)}deselectImage(){(this.selectedFigure||this.resizeOverlay)&&(this.selectedFigure=null,this.resizeOverlay?.remove(),this.resizeOverlay=null,this.isDragging=!1,this.stopOverlayTracking(),document.removeEventListener("mousedown",this.onDocMousedown,!0),document.removeEventListener("keydown",this.onDocKeydown,!0),document.removeEventListener("mousemove",this.onDragMove),document.removeEventListener("mouseup",this.onDragEnd))}startOverlayTracking(){this.stopOverlayTracking();const t=()=>{this.selectedFigure&&this.resizeOverlay&&(this.selectedFigure.isConnected?(this.updateOverlayPosition(),this.trackingRaf=requestAnimationFrame(t)):this.deselectImage())};this.trackingRaf=requestAnimationFrame(t)}stopOverlayTracking(){0!==this.trackingRaf&&(cancelAnimationFrame(this.trackingRaf),this.trackingRaf=0)}buildOverlay(){const t=document.createElement("div");t.className="rte-image-resize-overlay";for(const i of["nw","ne","sw","se"]){const e=document.createElement("div");e.className="rte-resize-handle",e.dataset.dir=i,e.addEventListener("mousedown",this.onHandleMousedown),t.appendChild(e)}const i=document.createElement("span");i.className="rte-resize-size-label",t.appendChild(i);const e=document.createElement("div");e.className="rte-image-align-bar";const n=[{dir:"left",icon:"format_align_left",title:"Align left"},{dir:"center",icon:"format_align_middle",title:"Align center"},{dir:"right",icon:"format_align_right",title:"Align right"},{dir:"justify",icon:"format_align_justify",title:"Full width"}];for(const{dir:t,icon:i,title:s}of n){const n=document.createElement("button");n.type="button",n.dataset.dir=t,n.title=s,n.setAttribute("aria-label",s),n.innerHTML=`<nile-icon name="${i}" size="18"></nile-icon>`,n.addEventListener("mousedown",(t=>t.preventDefault())),n.addEventListener("click",this.onAlignClick),e.appendChild(n)}t.appendChild(e),document.body.appendChild(t),this.resizeOverlay=t}updateOverlayPosition(){if(!this.resizeOverlay||!this.selectedFigure)return;const t=this.selectedFigure.querySelector("img");if(!t)return void this.deselectImage();const i=t.getBoundingClientRect();this.resizeOverlay.style.top=`${i.top}px`,this.resizeOverlay.style.left=`${i.left}px`,this.resizeOverlay.style.width=`${i.width}px`,this.resizeOverlay.style.height=`${i.height}px`;const e=this.resizeOverlay.querySelector(".rte-image-align-bar");e&&(i.top<56?e.style.top="8px":e.style.top="-44px");const n=this.resizeOverlay.querySelector(".rte-resize-size-label");n&&(n.textContent=`${Math.round(i.width)} × ${Math.round(i.height)}`,n.style.display=this.isDragging?"":"none")}syncAlignBar(){if(!this.resizeOverlay||!this.selectedFigure)return;const t=this.selectedFigure.getAttribute("data-align")||"left";this.resizeOverlay.querySelectorAll(".rte-image-align-bar button").forEach((i=>{i.toggleAttribute("data-active",i.dataset.dir===t)}))}getEditorContentWidth(){const t=getComputedStyle(this.editorEl);return this.editorEl.clientWidth-parseFloat(t.paddingLeft||"0")-parseFloat(t.paddingRight||"0")||1/0}buildFigure(t,i="",e=""){const n=document.createElement("figure");n.className="rte-image",n.setAttribute("contenteditable","false");const s=document.createElement("img");if(s.src=t,i.trim()&&(s.alt=i.trim()),n.appendChild(s),e.trim()){const t=document.createElement("figcaption");t.textContent=e.trim(),n.appendChild(t)}return n}insertFigureAt(t,i){const e=document.getSelection();if(!e)return;let n=null,s=t.startContainer;for(;s&&s!==this.editorEl;){if(s instanceof HTMLElement&&/^(P|H[1-6]|UL|OL|BLOCKQUOTE|PRE|TABLE|FIGURE|DIV)$/.test(s.tagName)){n=s;break}s=s.parentNode}const r=n&&/^(P|H[1-6])$/.test(n.tagName)&&""===(n.textContent??"").replace(/\u200B/g,"").trim()&&!n.querySelector("img");n?.parentNode?r?(n.parentNode.insertBefore(i,n),n.remove()):n.parentNode.insertBefore(i,n.nextSibling):this.editorEl.appendChild(i);let o=i.nextElementSibling;if(!o){const t=document.createElement("p");t.innerHTML="<br>",i.parentNode?.insertBefore(t,i.nextSibling),o=t}const a=document.createRange();a.setStart(o,0),a.collapse(!0),e.removeAllRanges(),e.addRange(a)}applyImage(){const t=this.srcValue.trim();if(!t)return void(this.uploadFromComputer&&(this.errorMessage="Enter an image link or upload a file"));const i=this.normalizeSrc(t);if(!i)return void(this.errorMessage="Enter a valid image link");if(this.activeFigure){const t=this.activeFigure.querySelector("img");t&&(t.src=i,this.altValue.trim()?t.alt=this.altValue.trim():t.removeAttribute("alt"));let e=this.activeFigure.querySelector("figcaption");return this.captionValue.trim()?(e||(e=document.createElement("figcaption"),this.activeFigure.appendChild(e)),e.textContent=this.captionValue.trim()):e?.remove(),this.emit(i),this.closePopover(),void requestAnimationFrame((()=>this.updateOverlayPosition()))}if(!(this.selectionRange instanceof Range))return;this.editorEl.focus();const e=document.getSelection();if(!e)return;e.removeAllRanges(),e.addRange(this.selectionRange);const n=this.buildFigure(i,this.altValue,this.captionValue);this.insertFigureAt(this.selectionRange,n),this.emit(i),this.closePopover()}removeImage(){if(!this.activeFigure)return;this.deselectImage();const t=this.activeFigure.parentNode;this.activeFigure.remove(),t instanceof HTMLElement&&!t.hasChildNodes()&&(t.innerHTML="<br>"),this.emit(""),this.closePopover()}emit(t){this.dispatchEvent(new CustomEvent("nile-image-changed",{detail:{src:t,alt:this.altValue.trim(),caption:this.captionValue.trim()},bubbles:!0,composed:!0}))}render(){const t=this.disabled?"var(--nile-colors-neutral-500, var(--ng-colors-fg-disabled-subtle))":"var(--nile-colors-dark-900, var(--ng-colors-text-primary-900))";return e`
2
+ <nile-lite-tooltip content=${this.label}>
3
+ <nile-button
4
+ variant="tertiary"
5
+ size="small"
6
+ ?disabled=${this.disabled}
7
+ @mousedown=${this.onToolbarButtonMousedown}
8
+ @click=${this.onOpen}
9
+ class="rte-image-button"
10
+ >
11
+ <nile-glyph name="image" color=${t}></nile-glyph>
12
+ </nile-button>
13
+ </nile-lite-tooltip>
14
+
15
+ <nile-popover
16
+ class="rte-image-popover"
17
+ .arrow=${!1}
18
+ style=${this.popoverStyle}
19
+ @mousedown=${this.onPopoverMousedown}
20
+ @mouseup=${this.onPopoverMouseup}
21
+ >
22
+ <div class="image-popup-wrap">
23
+ <nile-input
24
+ label="Image URL"
25
+ placeholder=${this.placeholder}
26
+ .value=${this.srcValue}
27
+ @nile-input=${this.onSrcInput}
28
+ @keydown=${this.onInputKeydown}
29
+ @nile-blur=${this.onInputBlur}
30
+ ></nile-input>
31
+
32
+ ${this.uploadFromComputer?e`
33
+ <div class="image-divider-row" part="divider">or</div>
34
+
35
+ <div class="image-upload-row" part="upload-row">
36
+ <nile-button
37
+ part="upload-button"
38
+ size="small"
39
+ variant="secondary"
40
+ @click=${this.onUploadClick}
41
+ >
42
+ <nile-glyph name="upload" slot="prefix"></nile-glyph>
43
+ Upload from computer
44
+ </nile-button>
45
+ ${this.uploadedFileName?e`<span class="image-upload-filename" part="upload-filename"
46
+ >${this.uploadedFileName}</span
47
+ >`:null}
48
+ </div>
49
+ <input
50
+ part="upload-input"
51
+ type="file"
52
+ accept="image/*"
53
+ @change=${this.onFileChange}
54
+ />
55
+ `:null}
56
+
57
+ ${this.errorMessage?e`<span class="image-error" part="error">${this.errorMessage}</span>`:null}
58
+
59
+ <nile-input
60
+ label="Alt text"
61
+ placeholder=${this.altPlaceholder}
62
+ .value=${this.altValue}
63
+ @nile-input=${this.onAltInput}
64
+ @keydown=${this.onInputKeydown}
65
+ @nile-blur=${this.onInputBlur}
66
+ part="alt-input"
67
+ ></nile-input>
68
+
69
+ <nile-input
70
+ label="Caption"
71
+ placeholder=${this.captionPlaceholder}
72
+ .value=${this.captionValue}
73
+ @nile-input=${this.onCaptionInput}
74
+ @keydown=${this.onInputKeydown}
75
+ @nile-blur=${this.onInputBlur}
76
+ part="caption-input"
77
+ ></nile-input>
78
+
79
+ <div class="image-actions-row" part="actions-row">
80
+ ${this.hasActiveImage?e`
81
+ <nile-button
82
+ part="remove-button"
83
+ size="small"
84
+ variant="secondary"
85
+ @click=${this.onRemoveClick}
86
+ >
87
+ Remove
88
+ </nile-button>
89
+ `:null}
90
+ <nile-button part="apply-button" size="small" variant="primary" @click=${this.onApplyClick}>
91
+ ${this.hasActiveImage?"Update":"Insert"}
92
+ </nile-button>
93
+ </div>
94
+ </div>
95
+ </nile-popover>
96
+ `}};t([n({attribute:!1})],o.prototype,"editorEl",void 0),t([n({type:Boolean,reflect:!0,attribute:!0})],o.prototype,"disabled",void 0),t([n({type:String,reflect:!0,attribute:!0})],o.prototype,"label",void 0),t([n({type:String,reflect:!0,attribute:!0})],o.prototype,"placeholder",void 0),t([n({type:String,reflect:!0,attribute:!0})],o.prototype,"altPlaceholder",void 0),t([n({type:String,reflect:!0,attribute:!0})],o.prototype,"captionPlaceholder",void 0),t([n({type:Number,reflect:!0,attribute:"maxfilesize"})],o.prototype,"maxFileSize",void 0),t([n({type:Boolean,reflect:!0,attribute:"uploadfromcomputer"})],o.prototype,"uploadFromComputer",void 0),t([s()],o.prototype,"srcValue",void 0),t([s()],o.prototype,"altValue",void 0),t([s()],o.prototype,"captionValue",void 0),t([s()],o.prototype,"hasActiveImage",void 0),t([s()],o.prototype,"uploadedFileName",void 0),t([s()],o.prototype,"errorMessage",void 0),t([s()],o.prototype,"popoverStyle",void 0),o=t([r("nile-rte-image")],o);
@@ -87,11 +87,13 @@ export const styles = css `
87
87
  }
88
88
 
89
89
  .nile-chip {
90
- padding: var(--nile-spacing-5px,var( --ng-spacing-md)) var(--nile-spacing-10px,var(--ng-spacing-lg));
90
+ padding: var(--nile-spacing-5px,var(--ng-spacing-xs)) var(--nile-spacing-10px,var(--ng-spacing-lg));
91
+ min-height: var(--ng-height-40px);
91
92
  background-color: var(--nile-colors-white-base,var( --ng-colors-bg-primary));
92
93
  border-radius: var(--nile-radius-radius-xs,var(--ng-radius-md));
93
94
  border: solid 1px var(--nile-colors-neutral-500,var(--ng-colors-border-primary));
94
95
  display: flex;
96
+ align-items: center;
95
97
  flex-wrap: wrap;
96
98
  width: 100%;
97
99
  overflow-x: hidden;
@@ -100,6 +102,7 @@ export const styles = css `
100
102
 
101
103
  nile-input::part(base) {
102
104
  padding: 0px !important;
105
+ height: auto;
103
106
  }
104
107
 
105
108
  .nile-chip--no-wrap {
@@ -169,6 +172,10 @@ export const styles = css `
169
172
  nile-auto-complete::part(input) {
170
173
  padding: var(--nile-spacing-lg, var(--ng-spacing-none));
171
174
  }
175
+
176
+ nile-auto-complete::part(base) {
177
+ height: auto;
178
+ }
172
179
 
173
180
  .nile-chip:hover:not(.nile-chip--disabled) {
174
181
  border-color: var(--nile-colors-neutral-500, var(--ng-colors-border-neutral));