inconel 0.1.41 → 0.1.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("react/jsx-runtime"),s=require("react"),le=require("../FieldFeedback/FieldFeedback.cjs");;/* empty css */;/* empty css */const i=require("./icons.cjs"),y=require("./sanitize.cjs"),ae=[{tag:"p",label:"Paragraf"},{tag:"h1",label:"Başlık 1"},{tag:"h2",label:"Başlık 2"},{tag:"h3",label:"Başlık 3"},{tag:"blockquote",label:"Alıntı"}],se=[12,14,16,18,24,32],re=r=>new Promise((m,b)=>{const a=new FileReader;a.onload=()=>m(String(a.result)),a.onerror=()=>b(a.error),a.readAsDataURL(r)});function k({label:r,onClick:m,disabled:b,active:a,children:C}){return t.jsx("button",{type:"button",className:`inconel-rte__btn${a?" inconel-is-active":""}`,"aria-label":r,title:r,"aria-pressed":a,disabled:b,onMouseDown:N=>N.preventDefault(),onClick:m,children:C})}function oe({value:r="",onChange:m,onBlur:b,label:a,placeholder:C,id:N,disabled:h=!1,required:T,fullWidth:G=!0,className:W,minHeight:L=200,onImageUpload:H,onRequestMedia:A,hint:q,errorMessage:j}){const $=s.useId(),x=N??`inconel-rte-${$.replace(/:/g,"")}`,M=`${x}-hint`,w=`${x}-error`,o=s.useRef(null),B=s.useRef(null),_=s.useRef(null),[f,K]=s.useState(!1),[D,E]=s.useState(""),[u,v]=s.useState(null),[I,U]=s.useState(""),[Y,J]=s.useState({}),[Z,R]=s.useState(!r);s.useEffect(()=>{const e=o.current;if(!e||r===_.current)return;const n=y.sanitizeHtml(r);e.innerHTML!==n&&(e.innerHTML=n),_.current=r,R(!e.textContent&&!e.querySelector("img"))},[r,f]);const g=s.useCallback(()=>{const e=o.current;if(!e)return;const n=!!e.textContent||!!e.querySelector("img"),c=n?y.sanitizeHtml(e.innerHTML):"";R(!n),_.current=c,m?.(c)},[m]),d=()=>{const e=window.getSelection(),n=o.current;e&&e.rangeCount>0&&n?.contains(e.getRangeAt(0).commonAncestorContainer)&&(B.current=e.getRangeAt(0).cloneRange())},z=()=>{o.current?.focus();const e=window.getSelection();e&&B.current&&(e.removeAllRanges(),e.addRange(B.current))},F=()=>{const e=n=>{try{return document.queryCommandState(n)}catch{return!1}};J({bold:e("bold"),italic:e("italic"),underline:e("underline"),strikeThrough:e("strikeThrough"),justifyLeft:e("justifyLeft"),justifyCenter:e("justifyCenter"),justifyRight:e("justifyRight"),justifyFull:e("justifyFull"),insertUnorderedList:e("insertUnorderedList"),insertOrderedList:e("insertOrderedList")})},S=(e,n)=>{z(),document.execCommand("styleWithCSS",!1,"true"),document.execCommand(e,!1,n),d(),F(),g()},Q=e=>{z(),document.execCommand("styleWithCSS",!1,"false"),document.execCommand("fontSize",!1,"7"),o.current?.querySelectorAll('font[size="7"]').forEach(n=>{const c=document.createElement("span");c.style.fontSize=`${e}px`,c.append(...Array.from(n.childNodes)),n.replaceWith(c)}),d(),g()},V=e=>{z(),document.execCommand("insertHTML",!1,y.sanitizeHtml(e)),d(),g()},O=e=>{d(),U(""),v(u===e?null:e)},P=()=>{const e=I.trim();e&&(u==="link"?(S("createLink",e),o.current?.querySelectorAll("a").forEach(n=>{/^https?:/i.test(n.getAttribute("href")??"")&&(n.setAttribute("target","_blank"),n.setAttribute("rel","noopener noreferrer"))}),g()):u==="image"&&S("insertImage",e),v(null))},X=async e=>{const n=e.target.files?.[0];if(e.target.value="",!n||!n.type.startsWith("image/"))return;const c=H?await H(n):await re(n);S("insertImage",c),v(null)},ee=e=>{const n=e.clipboardData.getData("text/html");n&&(e.preventDefault(),document.execCommand("insertHTML",!1,y.sanitizeHtml(n)),g())},te=()=>{if(f){const e=y.sanitizeHtml(D);_.current=null,o.current&&(o.current.innerHTML=e),_.current=e,R(!e),m?.(e)}else E(y.sanitizeHtml(o.current?.innerHTML??""));v(null),K(!f)},ne=[q&&!j?M:void 0,j?w:void 0].filter(Boolean).join(" ")||void 0,p=h||f,l=(e,n,c,ie)=>t.jsx(k,{label:n,active:Y[e],disabled:p,onClick:()=>S(e,ie),children:c});return t.jsxs("div",{className:["inconel-field",G?"inconel-field--full-width":"",W??""].join(" "),children:[a&&t.jsxs("label",{className:"inconel-field__label",htmlFor:x,children:[a,T&&t.jsx("span",{"aria-hidden":"true",children:" *"})]}),t.jsxs("div",{className:["inconel-rte",j?"inconel-is-invalid":"",h?"inconel-is-disabled":""].join(" "),children:[t.jsxs("div",{className:"inconel-rte__toolbar",role:"toolbar","aria-label":"Biçimlendirme",children:[l("bold","Kalın",i.icons.bold),l("italic","İtalik",i.icons.italic),l("underline","Altı çizili",i.icons.underline),l("strikeThrough","Üstü çizili",i.icons.strike),t.jsx("span",{className:"inconel-rte__sep"}),t.jsxs("select",{className:"inconel-rte__select","aria-label":"Biçim",disabled:p,value:"",onChange:e=>{e.target.value&&S("formatBlock",e.target.value)},children:[t.jsx("option",{value:"",children:"Biçim"}),ae.map(e=>t.jsx("option",{value:e.tag,children:e.label},e.tag))]}),t.jsxs("select",{className:"inconel-rte__select","aria-label":"Yazı boyutu",disabled:p,value:"",onChange:e=>{e.target.value&&Q(Number(e.target.value))},children:[t.jsx("option",{value:"",children:"Boyut"}),se.map(e=>t.jsxs("option",{value:e,children:[e,"px"]},e))]}),t.jsx("span",{className:"inconel-rte__sep"}),l("justifyLeft","Sola hizala",i.icons.alignLeft),l("justifyCenter","Ortala",i.icons.alignCenter),l("justifyRight","Sağa hizala",i.icons.alignRight),l("justifyFull","İki yana yasla",i.icons.alignJustify),t.jsx("span",{className:"inconel-rte__sep"}),l("insertUnorderedList","Madde işaretli liste",i.icons.listUl),l("insertOrderedList","Numaralı liste",i.icons.listOl),l("outdent","Girintiyi azalt",i.icons.outdent),l("indent","Girintiyi artır",i.icons.indent),l("removeFormat","Biçimi temizle",i.icons.clearFormat),t.jsx("span",{className:"inconel-rte__sep"}),t.jsx(k,{label:"Bağlantı ekle",disabled:p,active:u==="link",onClick:()=>O("link"),children:i.icons.link}),t.jsx(k,{label:"Görsel ekle",disabled:p,active:u==="image",onClick:()=>O("image"),children:i.icons.image}),A&&t.jsx(k,{label:"Medya galerisi",disabled:p,onClick:()=>{d(),A(V)},children:i.icons.gallery}),t.jsx("span",{className:"inconel-rte__sep"}),l("undo","Geri al",i.icons.undo),l("redo","Yinele",i.icons.redo),t.jsx(k,{label:"HTML kaynağı",disabled:h,active:f,onClick:te,children:i.icons.code})]}),u&&!f&&t.jsxs("div",{className:"inconel-rte__panel",children:[t.jsx("input",{type:"url",className:"inconel-rte__input","aria-label":u==="link"?"Bağlantı adresi":"Görsel adresi",placeholder:u==="link"?"https://…":"Görsel URL (https://…)",value:I,autoFocus:!0,onChange:e=>U(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),P())}}),t.jsx("button",{type:"button",className:"inconel-rte__action",onClick:P,children:"Ekle"}),u==="image"&&t.jsxs("label",{className:"inconel-rte__action",children:["Dosya seç",t.jsx("input",{type:"file",accept:"image/*",hidden:!0,"aria-label":"Görsel dosyası",onChange:X})]})]}),f?t.jsx("textarea",{id:x,className:"inconel-rte__source",style:{minHeight:L},"aria-label":a??"HTML kaynağı",value:D,disabled:h,spellCheck:!1,onChange:e=>E(e.target.value)}):t.jsxs("div",{className:"inconel-rte__surface",style:{minHeight:L},children:[Z&&C&&t.jsx("span",{className:"inconel-rte__placeholder","aria-hidden":"true",children:C}),t.jsx("div",{ref:o,id:x,className:"inconel-rte__content",role:"textbox","aria-multiline":"true","aria-label":a,"aria-required":T,"aria-invalid":!!j,"aria-describedby":ne,"aria-disabled":h,contentEditable:!h,suppressContentEditableWarning:!0,style:{minHeight:L},onInput:g,onPaste:ee,onKeyUp:()=>{d(),F()},onMouseUp:()=>{d(),F()},onBlur:()=>{d(),b?.()}})]})]}),t.jsx(le.default,{hint:q,errorMessage:j,hintId:M,errorId:w})]})}exports.default=oe;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("react/jsx-runtime"),r=require("react"),he=require("../FieldFeedback/FieldFeedback.cjs");;/* empty css */;/* empty css */const a=require("./icons.cjs"),_=require("./sanitize.cjs"),pe=[{tag:"p",label:"Paragraf"},{tag:"h1",label:"Başlık 1"},{tag:"h2",label:"Başlık 2"},{tag:"h3",label:"Başlık 3"},{tag:"blockquote",label:"Alıntı"}],ge=[12,14,16,18,24,32],ye=new Set(["justifyLeft","justifyCenter","justifyRight","justifyFull"]),xe=m=>new Promise((h,C)=>{const o=new FileReader;o.onload=()=>h(String(o.result)),o.onerror=()=>C(o.error),o.readAsDataURL(m)});function S({label:m,onClick:h,disabled:C,active:o,children:L}){return t.jsx("button",{type:"button",className:`inconel-rte__btn${o?" inconel-is-active":""}`,"aria-label":m,title:m,"aria-pressed":o,disabled:C,onMouseDown:E=>E.preventDefault(),onClick:h,children:L})}function je({value:m="",onChange:h,onBlur:C,label:o,placeholder:L,id:E,disabled:p=!1,required:q,fullWidth:ee=!0,className:te,minHeight:B=200,onImageUpload:I,onRequestMedia:O,hint:U,errorMessage:v}){const ne=r.useId(),k=E??`inconel-rte-${ne.replace(/:/g,"")}`,P=`${k}-hint`,G=`${k}-error`,d=r.useRef(null),A=r.useRef(null),N=r.useRef(null),[f,le]=r.useState(!1),[$,W]=r.useState(""),[c,w]=r.useState(null),[K,Y]=r.useState(""),[ae,se]=r.useState({}),[ie,M]=r.useState(!m),[re,J]=r.useState(!1),[x,Z]=r.useState({rows:3,cols:3});r.useEffect(()=>{const e=d.current;if(!e||m===N.current)return;const n=_.sanitizeHtml(m);e.innerHTML!==n&&(e.innerHTML=n),N.current=m,M(!e.textContent&&!e.querySelector("img"))},[m,f]);const g=r.useCallback(()=>{const e=d.current;if(!e)return;const n=!!e.textContent||!!e.querySelector("img"),l=n?_.sanitizeHtml(e.innerHTML):"";M(!n),N.current=l,h?.(l)},[h]),b=()=>{const e=window.getSelection(),n=d.current;e&&e.rangeCount>0&&n?.contains(e.getRangeAt(0).commonAncestorContainer)&&(A.current=e.getRangeAt(0).cloneRange())},R=()=>{d.current?.focus();const e=window.getSelection();e&&A.current&&(e.removeAllRanges(),e.addRange(A.current))},Q=()=>{const e=window.getSelection()?.anchorNode,l=(e instanceof Element?e:e?.parentElement)?.closest("td, th")??null;return l&&d.current?.contains(l)?l:null},z=()=>{J(!!Q());const e=n=>{try{return document.queryCommandState(n)}catch{return!1}};se({bold:e("bold"),italic:e("italic"),underline:e("underline"),strikeThrough:e("strikeThrough"),justifyLeft:e("justifyLeft"),justifyCenter:e("justifyCenter"),justifyRight:e("justifyRight"),justifyFull:e("justifyFull"),insertUnorderedList:e("insertUnorderedList"),insertOrderedList:e("insertOrderedList")})},T=(e,n)=>{R(),document.execCommand("styleWithCSS",!1,ye.has(e)?"true":"false"),document.execCommand(e,!1,n),b(),z(),g()},oe=e=>{R(),document.execCommand("styleWithCSS",!1,"false"),document.execCommand("fontSize",!1,"7"),d.current?.querySelectorAll('font[size="7"]').forEach(n=>{const l=document.createElement("span");l.style.fontSize=`${e}px`,l.append(...Array.from(n.childNodes)),n.replaceWith(l)}),b(),g()},ce=e=>{R();const n=Q(),l=n?.parentElement,i=n?.closest("table");if(!n||!l||!i)return;const D=n.cellIndex,X=u=>{const j=document.createElement(u.tagName);return j.innerHTML="<br>",j};if(e==="addRow"){const u=document.createElement("tr");Array.from(l.cells).forEach(j=>u.append(X(j.tagName==="TH"?document.createElement("td"):j))),l.parentElement?.tagName==="THEAD"?(i.tBodies[0]??i.appendChild(document.createElement("tbody"))).prepend(u):l.after(u)}else e==="delRow"?(l.remove(),i.rows.length||i.remove()):e==="addCol"?Array.from(i.rows).forEach(u=>u.cells[D]?.after(X(u.cells[D]))):e==="delCol"?(Array.from(i.rows).forEach(u=>u.cells[D]?.remove()),Array.from(i.rows).some(u=>u.cells.length)||i.remove()):i.remove();J(!1),g()},ue=()=>{const e=Math.min(Math.max(x.rows,1),20),n=Math.min(Math.max(x.cols,1),10),i=`<tr>${"<td><br></td>".repeat(n)}</tr>`.repeat(e);V(`<table border="1" width="100%" cellspacing="0" cellpadding="6"><tbody>${i}</tbody></table><p><br></p>`),w(null)},V=e=>{R(),document.execCommand("insertHTML",!1,_.sanitizeHtml(e)),b(),g()},H=e=>{b(),Y(""),w(c===e?null:e)},F=()=>{if(c==="table"){ue();return}const e=K.trim();e&&(c==="link"?(T("createLink",e),d.current?.querySelectorAll("a").forEach(n=>{/^https?:/i.test(n.getAttribute("href")??"")&&(n.setAttribute("target","_blank"),n.setAttribute("rel","noopener noreferrer"))}),g()):c==="image"&&T("insertImage",e),w(null))},de=async e=>{const n=e.target.files?.[0];if(e.target.value="",!n||!n.type.startsWith("image/"))return;const l=I?await I(n):await xe(n);T("insertImage",l),w(null)},me=e=>{const n=e.clipboardData.getData("text/html");n&&(e.preventDefault(),document.execCommand("insertHTML",!1,_.sanitizeHtml(n)),g())},fe=()=>{if(f){const e=_.sanitizeHtml($);N.current=null,d.current&&(d.current.innerHTML=e),N.current=e,M(!e),h?.(e)}else W(_.sanitizeHtml(d.current?.innerHTML??""));w(null),le(!f)},be=[U&&!v?P:void 0,v?G:void 0].filter(Boolean).join(" ")||void 0,y=p||f,s=(e,n,l,i)=>t.jsx(S,{label:n,active:ae[e],disabled:y,onClick:()=>T(e,i),children:l});return t.jsxs("div",{className:["inconel-field",ee?"inconel-field--full-width":"",te??""].join(" "),children:[o&&t.jsxs("label",{className:"inconel-field__label",htmlFor:k,children:[o,q&&t.jsx("span",{"aria-hidden":"true",children:" *"})]}),t.jsxs("div",{className:["inconel-rte",v?"inconel-is-invalid":"",p?"inconel-is-disabled":""].join(" "),children:[t.jsxs("div",{className:"inconel-rte__toolbar",role:"toolbar","aria-label":"Biçimlendirme",children:[s("bold","Kalın",a.icons.bold),s("italic","İtalik",a.icons.italic),s("underline","Altı çizili",a.icons.underline),s("strikeThrough","Üstü çizili",a.icons.strike),t.jsx("span",{className:"inconel-rte__sep"}),t.jsxs("select",{className:"inconel-rte__select","aria-label":"Biçim",disabled:y,value:"",onChange:e=>{e.target.value&&T("formatBlock",e.target.value)},children:[t.jsx("option",{value:"",children:"Biçim"}),pe.map(e=>t.jsx("option",{value:e.tag,children:e.label},e.tag))]}),t.jsxs("select",{className:"inconel-rte__select","aria-label":"Yazı boyutu",disabled:y,value:"",onChange:e=>{e.target.value&&oe(Number(e.target.value))},children:[t.jsx("option",{value:"",children:"Boyut"}),ge.map(e=>t.jsxs("option",{value:e,children:[e,"px"]},e))]}),t.jsx("span",{className:"inconel-rte__sep"}),s("justifyLeft","Sola hizala",a.icons.alignLeft),s("justifyCenter","Ortala",a.icons.alignCenter),s("justifyRight","Sağa hizala",a.icons.alignRight),s("justifyFull","İki yana yasla",a.icons.alignJustify),t.jsx("span",{className:"inconel-rte__sep"}),s("insertUnorderedList","Madde işaretli liste",a.icons.listUl),s("insertOrderedList","Numaralı liste",a.icons.listOl),s("outdent","Girintiyi azalt",a.icons.outdent),s("indent","Girintiyi artır",a.icons.indent),s("removeFormat","Biçimi temizle",a.icons.clearFormat),t.jsx("span",{className:"inconel-rte__sep"}),t.jsx(S,{label:"Bağlantı ekle",disabled:y,active:c==="link",onClick:()=>H("link"),children:a.icons.link}),t.jsx(S,{label:"Tablo ekle",disabled:y,active:c==="table",onClick:()=>H("table"),children:a.icons.table}),t.jsx(S,{label:"Görsel ekle",disabled:y,active:c==="image",onClick:()=>H("image"),children:a.icons.image}),O&&t.jsx(S,{label:"Medya galerisi",disabled:y,onClick:()=>{b(),O(V)},children:a.icons.gallery}),t.jsx("span",{className:"inconel-rte__sep"}),s("undo","Geri al",a.icons.undo),s("redo","Yinele",a.icons.redo),t.jsx(S,{label:"HTML kaynağı",disabled:p,active:f,onClick:fe,children:a.icons.code})]}),c==="table"&&!f&&t.jsxs("div",{className:"inconel-rte__panel",children:[t.jsxs("label",{className:"inconel-rte__field",children:["Satır",t.jsx("input",{type:"number",min:1,max:20,className:"inconel-rte__input inconel-rte__input--num",value:x.rows,onChange:e=>Z({...x,rows:Number(e.target.value)})})]}),t.jsxs("label",{className:"inconel-rte__field",children:["Sütun",t.jsx("input",{type:"number",min:1,max:10,className:"inconel-rte__input inconel-rte__input--num",value:x.cols,onChange:e=>Z({...x,cols:Number(e.target.value)})})]}),t.jsx("button",{type:"button",className:"inconel-rte__action",onClick:F,children:"Tablo ekle"})]}),re&&!f&&!p&&t.jsx("div",{className:"inconel-rte__panel",role:"toolbar","aria-label":"Tablo",children:[["addRow","Satır ekle"],["delRow","Satırı sil"],["addCol","Sütun ekle"],["delCol","Sütunu sil"],["delTable","Tabloyu sil"]].map(([e,n])=>t.jsx("button",{type:"button",className:"inconel-rte__action",onMouseDown:l=>l.preventDefault(),onClick:()=>ce(e),children:n},e))}),c&&c!=="table"&&!f&&t.jsxs("div",{className:"inconel-rte__panel",children:[t.jsx("input",{type:"url",className:"inconel-rte__input","aria-label":c==="link"?"Bağlantı adresi":"Görsel adresi",placeholder:c==="link"?"https://…":"Görsel URL (https://…)",value:K,autoFocus:!0,onChange:e=>Y(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),F())}}),t.jsx("button",{type:"button",className:"inconel-rte__action",onClick:F,children:"Ekle"}),c==="image"&&t.jsxs("label",{className:"inconel-rte__action",children:["Dosya seç",t.jsx("input",{type:"file",accept:"image/*",hidden:!0,"aria-label":"Görsel dosyası",onChange:de})]})]}),f?t.jsx("textarea",{id:k,className:"inconel-rte__source",style:{minHeight:B},"aria-label":o??"HTML kaynağı",value:$,disabled:p,spellCheck:!1,onChange:e=>W(e.target.value)}):t.jsxs("div",{className:"inconel-rte__surface",style:{minHeight:B},children:[ie&&L&&t.jsx("span",{className:"inconel-rte__placeholder","aria-hidden":"true",children:L}),t.jsx("div",{ref:d,id:k,className:"inconel-rte__content",role:"textbox","aria-multiline":"true","aria-label":o,"aria-required":q,"aria-invalid":!!v,"aria-describedby":be,"aria-disabled":p,contentEditable:!p,suppressContentEditableWarning:!0,style:{minHeight:B},onInput:g,onPaste:me,onKeyUp:()=>{b(),z()},onMouseUp:()=>{b(),z()},onBlur:()=>{b(),C?.()}})]})]}),t.jsx(he.default,{hint:U,errorMessage:v,hintId:P,errorId:G})]})}exports.default=je;
2
2
  //# sourceMappingURL=RichTextEditor.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextEditor.cjs","sources":["../../../../src/components/RichTextEditor/RichTextEditor.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ChangeEvent,\n type ReactNode,\n} from 'react'\n\nimport FieldFeedback from '../FieldFeedback/FieldFeedback'\nimport type { FieldFeedbackContentProps } from '../FieldFeedback/FieldFeedback'\nimport '../shared/field.css'\nimport './styles.css'\nimport { icons } from './icons'\nimport { sanitizeHtml } from './sanitize'\n\nexport interface RichTextEditorProps extends FieldFeedbackContentProps {\n value?: string\n onChange?: (html: string) => void\n onBlur?: () => void\n label?: string\n placeholder?: string\n id?: string\n disabled?: boolean\n required?: boolean\n fullWidth?: boolean\n className?: string\n /** Editör içerik alanının minimum yüksekliği (px). */\n minHeight?: number\n /** Görsel dosyası seçilince çağrılır; dönen URL görsel olarak eklenir. Verilmezse base64 gömülür. */\n onImageUpload?: (file: File) => Promise<string>\n /**\n * Verilirse araç çubuğuna galeri düğmesi eklenir. Düğmeye basınca çağrılır;\n * uygulama kendi medya kütüphanesini açıp seçilen içeriği `insert(html)` ile ekler.\n */\n onRequestMedia?: (insert: (html: string) => void) => void\n}\n\nconst BLOCKS = [\n { tag: 'p', label: 'Paragraf' },\n { tag: 'h1', label: 'Başlık 1' },\n { tag: 'h2', label: 'Başlık 2' },\n { tag: 'h3', label: 'Başlık 3' },\n { tag: 'blockquote', label: 'Alıntı' },\n]\n\nconst FONT_SIZES = [12, 14, 16, 18, 24, 32]\n\ntype Panel = 'link' | 'image' | null\n\nconst readFileAsDataUrl = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(file)\n })\n\ninterface ToolButtonProps {\n label: string\n onClick: () => void\n disabled?: boolean\n active?: boolean\n children: ReactNode\n}\n\nfunction ToolButton({ label, onClick, disabled, active, children }: ToolButtonProps) {\n return (\n <button\n type=\"button\"\n className={`inconel-rte__btn${active ? ' inconel-is-active' : ''}`}\n aria-label={label}\n title={label}\n aria-pressed={active}\n disabled={disabled}\n onMouseDown={(event) => event.preventDefault()}\n onClick={onClick}\n >\n {children}\n </button>\n )\n}\n\nexport default function RichTextEditor({\n value = '',\n onChange,\n onBlur,\n label,\n placeholder,\n id,\n disabled = false,\n required,\n fullWidth = true,\n className,\n minHeight = 200,\n onImageUpload,\n onRequestMedia,\n hint,\n errorMessage,\n}: RichTextEditorProps) {\n const generatedId = useId()\n const editorId = id ?? `inconel-rte-${generatedId.replace(/:/g, '')}`\n const hintId = `${editorId}-hint`\n const errorId = `${editorId}-error`\n\n const editorRef = useRef<HTMLDivElement>(null)\n const savedRange = useRef<Range | null>(null)\n const lastHtml = useRef<string | null>(null)\n const [sourceMode, setSourceMode] = useState(false)\n const [source, setSource] = useState('')\n const [panel, setPanel] = useState<Panel>(null)\n const [url, setUrl] = useState('')\n const [formats, setFormats] = useState<Record<string, boolean>>({})\n const [empty, setEmpty] = useState(!value)\n\n // Dışarıdan gelen value değişince (kendi çıktımız değilse) içeriği güncelle.\n useEffect(() => {\n const editor = editorRef.current\n if (!editor || value === lastHtml.current) return\n const clean = sanitizeHtml(value)\n if (editor.innerHTML !== clean) editor.innerHTML = clean\n lastHtml.current = value\n setEmpty(!editor.textContent && !editor.querySelector('img'))\n }, [value, sourceMode])\n\n const emit = useCallback(() => {\n const editor = editorRef.current\n if (!editor) return\n const hasContent = Boolean(editor.textContent) || Boolean(editor.querySelector('img'))\n const html = hasContent ? sanitizeHtml(editor.innerHTML) : ''\n setEmpty(!hasContent)\n lastHtml.current = html\n onChange?.(html)\n }, [onChange])\n\n const saveSelection = () => {\n const selection = window.getSelection()\n const editor = editorRef.current\n if (\n selection &&\n selection.rangeCount > 0 &&\n editor?.contains(selection.getRangeAt(0).commonAncestorContainer)\n ) {\n savedRange.current = selection.getRangeAt(0).cloneRange()\n }\n }\n\n const restoreSelection = () => {\n editorRef.current?.focus()\n const selection = window.getSelection()\n if (selection && savedRange.current) {\n selection.removeAllRanges()\n selection.addRange(savedRange.current)\n }\n }\n\n const refreshFormats = () => {\n const query = (command: string) => {\n try {\n return document.queryCommandState(command)\n } catch {\n return false\n }\n }\n setFormats({\n bold: query('bold'),\n italic: query('italic'),\n underline: query('underline'),\n strikeThrough: query('strikeThrough'),\n justifyLeft: query('justifyLeft'),\n justifyCenter: query('justifyCenter'),\n justifyRight: query('justifyRight'),\n justifyFull: query('justifyFull'),\n insertUnorderedList: query('insertUnorderedList'),\n insertOrderedList: query('insertOrderedList'),\n })\n }\n\n const exec = (command: string, arg?: string) => {\n restoreSelection()\n document.execCommand('styleWithCSS', false, 'true')\n document.execCommand(command, false, arg)\n saveSelection()\n refreshFormats()\n emit()\n }\n\n const applyFontSize = (px: number) => {\n restoreSelection()\n document.execCommand('styleWithCSS', false, 'false')\n document.execCommand('fontSize', false, '7')\n editorRef.current?.querySelectorAll('font[size=\"7\"]').forEach((font) => {\n const span = document.createElement('span')\n span.style.fontSize = `${px}px`\n span.append(...Array.from(font.childNodes))\n font.replaceWith(span)\n })\n saveSelection()\n emit()\n }\n\n const insertHtml = (html: string) => {\n restoreSelection()\n document.execCommand('insertHTML', false, sanitizeHtml(html))\n saveSelection()\n emit()\n }\n\n const openPanel = (next: Exclude<Panel, null>) => {\n saveSelection()\n setUrl('')\n setPanel(panel === next ? null : next)\n }\n\n const submitPanel = () => {\n const target = url.trim()\n if (!target) return\n if (panel === 'link') {\n exec('createLink', target)\n editorRef.current?.querySelectorAll('a').forEach((a) => {\n if (/^https?:/i.test(a.getAttribute('href') ?? '')) {\n a.setAttribute('target', '_blank')\n a.setAttribute('rel', 'noopener noreferrer')\n }\n })\n emit()\n } else if (panel === 'image') {\n exec('insertImage', target)\n }\n setPanel(null)\n }\n\n const handleImageFile = async (event: ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0]\n event.target.value = ''\n if (!file || !file.type.startsWith('image/')) return\n const src = onImageUpload ? await onImageUpload(file) : await readFileAsDataUrl(file)\n exec('insertImage', src)\n setPanel(null)\n }\n\n const handlePaste = (event: React.ClipboardEvent<HTMLDivElement>) => {\n const html = event.clipboardData.getData('text/html')\n if (html) {\n event.preventDefault()\n document.execCommand('insertHTML', false, sanitizeHtml(html))\n emit()\n }\n }\n\n const toggleSource = () => {\n if (sourceMode) {\n const clean = sanitizeHtml(source)\n lastHtml.current = null\n if (editorRef.current) editorRef.current.innerHTML = clean\n lastHtml.current = clean\n setEmpty(!clean)\n onChange?.(clean)\n } else {\n setSource(sanitizeHtml(editorRef.current?.innerHTML ?? ''))\n }\n setPanel(null)\n setSourceMode(!sourceMode)\n }\n\n const describedBy =\n [hint && !errorMessage ? hintId : undefined, errorMessage ? errorId : undefined]\n .filter(Boolean)\n .join(' ') || undefined\n const toolsDisabled = disabled || sourceMode\n\n const btn = (\n command: string,\n text: string,\n content: ReactNode,\n arg?: string,\n ) => (\n <ToolButton\n label={text}\n active={formats[command]}\n disabled={toolsDisabled}\n onClick={() => exec(command, arg)}\n >\n {content}\n </ToolButton>\n )\n\n return (\n <div\n className={[\n 'inconel-field',\n fullWidth ? 'inconel-field--full-width' : '',\n className ?? '',\n ].join(' ')}\n >\n {label && (\n <label className=\"inconel-field__label\" htmlFor={editorId}>\n {label}\n {required && <span aria-hidden=\"true\"> *</span>}\n </label>\n )}\n <div\n className={[\n 'inconel-rte',\n errorMessage ? 'inconel-is-invalid' : '',\n disabled ? 'inconel-is-disabled' : '',\n ].join(' ')}\n >\n <div className=\"inconel-rte__toolbar\" role=\"toolbar\" aria-label=\"Biçimlendirme\">\n {btn('bold', 'Kalın', icons.bold)}\n {btn('italic', 'İtalik', icons.italic)}\n {btn('underline', 'Altı çizili', icons.underline)}\n {btn('strikeThrough', 'Üstü çizili', icons.strike)}\n <span className=\"inconel-rte__sep\" />\n <select\n className=\"inconel-rte__select\"\n aria-label=\"Biçim\"\n disabled={toolsDisabled}\n value=\"\"\n onChange={(event) => {\n if (event.target.value) exec('formatBlock', event.target.value)\n }}\n >\n <option value=\"\">Biçim</option>\n {BLOCKS.map((block) => (\n <option key={block.tag} value={block.tag}>\n {block.label}\n </option>\n ))}\n </select>\n <select\n className=\"inconel-rte__select\"\n aria-label=\"Yazı boyutu\"\n disabled={toolsDisabled}\n value=\"\"\n onChange={(event) => {\n if (event.target.value) applyFontSize(Number(event.target.value))\n }}\n >\n <option value=\"\">Boyut</option>\n {FONT_SIZES.map((size) => (\n <option key={size} value={size}>\n {size}px\n </option>\n ))}\n </select>\n <span className=\"inconel-rte__sep\" />\n {btn('justifyLeft', 'Sola hizala', icons.alignLeft)}\n {btn('justifyCenter', 'Ortala', icons.alignCenter)}\n {btn('justifyRight', 'Sağa hizala', icons.alignRight)}\n {btn('justifyFull', 'İki yana yasla', icons.alignJustify)}\n <span className=\"inconel-rte__sep\" />\n {btn('insertUnorderedList', 'Madde işaretli liste', icons.listUl)}\n {btn('insertOrderedList', 'Numaralı liste', icons.listOl)}\n {btn('outdent', 'Girintiyi azalt', icons.outdent)}\n {btn('indent', 'Girintiyi artır', icons.indent)}\n {btn('removeFormat', 'Biçimi temizle', icons.clearFormat)}\n <span className=\"inconel-rte__sep\" />\n <ToolButton\n label=\"Bağlantı ekle\"\n disabled={toolsDisabled}\n active={panel === 'link'}\n onClick={() => openPanel('link')}\n >\n {icons.link}\n </ToolButton>\n <ToolButton\n label=\"Görsel ekle\"\n disabled={toolsDisabled}\n active={panel === 'image'}\n onClick={() => openPanel('image')}\n >\n {icons.image}\n </ToolButton>\n {onRequestMedia && (\n <ToolButton\n label=\"Medya galerisi\"\n disabled={toolsDisabled}\n onClick={() => {\n saveSelection()\n onRequestMedia(insertHtml)\n }}\n >\n {icons.gallery}\n </ToolButton>\n )}\n <span className=\"inconel-rte__sep\" />\n {btn('undo', 'Geri al', icons.undo)}\n {btn('redo', 'Yinele', icons.redo)}\n <ToolButton\n label=\"HTML kaynağı\"\n disabled={disabled}\n active={sourceMode}\n onClick={toggleSource}\n >\n {icons.code}\n </ToolButton>\n </div>\n\n {panel && !sourceMode && (\n <div className=\"inconel-rte__panel\">\n <input\n type=\"url\"\n className=\"inconel-rte__input\"\n aria-label={panel === 'link' ? 'Bağlantı adresi' : 'Görsel adresi'}\n placeholder={panel === 'link' ? 'https://…' : 'Görsel URL (https://…)'}\n value={url}\n autoFocus\n onChange={(event) => setUrl(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n submitPanel()\n }\n }}\n />\n <button type=\"button\" className=\"inconel-rte__action\" onClick={submitPanel}>\n Ekle\n </button>\n {panel === 'image' && (\n <label className=\"inconel-rte__action\">\n Dosya seç\n <input\n type=\"file\"\n accept=\"image/*\"\n hidden\n aria-label=\"Görsel dosyası\"\n onChange={handleImageFile}\n />\n </label>\n )}\n </div>\n )}\n\n {sourceMode ? (\n <textarea\n id={editorId}\n className=\"inconel-rte__source\"\n style={{ minHeight }}\n aria-label={label ?? 'HTML kaynağı'}\n value={source}\n disabled={disabled}\n spellCheck={false}\n onChange={(event) => setSource(event.target.value)}\n />\n ) : (\n <div className=\"inconel-rte__surface\" style={{ minHeight }}>\n {empty && placeholder && (\n <span className=\"inconel-rte__placeholder\" aria-hidden=\"true\">\n {placeholder}\n </span>\n )}\n <div\n ref={editorRef}\n id={editorId}\n className=\"inconel-rte__content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-label={label}\n aria-required={required}\n aria-invalid={Boolean(errorMessage)}\n aria-describedby={describedBy}\n aria-disabled={disabled}\n contentEditable={!disabled}\n suppressContentEditableWarning\n style={{ minHeight }}\n onInput={emit}\n onPaste={handlePaste}\n onKeyUp={() => {\n saveSelection()\n refreshFormats()\n }}\n onMouseUp={() => {\n saveSelection()\n refreshFormats()\n }}\n onBlur={() => {\n saveSelection()\n onBlur?.()\n }}\n />\n </div>\n )}\n </div>\n <FieldFeedback hint={hint} errorMessage={errorMessage} hintId={hintId} errorId={errorId} />\n </div>\n )\n}\n"],"names":["BLOCKS","FONT_SIZES","readFileAsDataUrl","file","resolve","reject","reader","ToolButton","label","onClick","disabled","active","children","jsx","event","RichTextEditor","value","onChange","onBlur","placeholder","id","required","fullWidth","className","minHeight","onImageUpload","onRequestMedia","hint","errorMessage","generatedId","useId","editorId","hintId","errorId","editorRef","useRef","savedRange","lastHtml","sourceMode","setSourceMode","useState","source","setSource","panel","setPanel","url","setUrl","formats","setFormats","empty","setEmpty","useEffect","editor","clean","sanitizeHtml","emit","useCallback","hasContent","html","saveSelection","selection","restoreSelection","refreshFormats","query","command","exec","arg","applyFontSize","px","font","span","insertHtml","openPanel","next","submitPanel","target","a","handleImageFile","src","handlePaste","toggleSource","describedBy","toolsDisabled","btn","text","content","jsxs","icons","block","size","FieldFeedback"],"mappings":"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"}
1
+ {"version":3,"file":"RichTextEditor.cjs","sources":["../../../../src/components/RichTextEditor/RichTextEditor.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ChangeEvent,\n type ReactNode,\n} from 'react'\n\nimport FieldFeedback from '../FieldFeedback/FieldFeedback'\nimport type { FieldFeedbackContentProps } from '../FieldFeedback/FieldFeedback'\nimport '../shared/field.css'\nimport './styles.css'\nimport { icons } from './icons'\nimport { sanitizeHtml } from './sanitize'\n\nexport interface RichTextEditorProps extends FieldFeedbackContentProps {\n value?: string\n onChange?: (html: string) => void\n onBlur?: () => void\n label?: string\n placeholder?: string\n id?: string\n disabled?: boolean\n required?: boolean\n fullWidth?: boolean\n className?: string\n /** Editör içerik alanının minimum yüksekliği (px). */\n minHeight?: number\n /** Görsel dosyası seçilince çağrılır; dönen URL görsel olarak eklenir. Verilmezse base64 gömülür. */\n onImageUpload?: (file: File) => Promise<string>\n /**\n * Verilirse araç çubuğuna galeri düğmesi eklenir. Düğmeye basınca çağrılır;\n * uygulama kendi medya kütüphanesini açıp seçilen içeriği `insert(html)` ile ekler.\n */\n onRequestMedia?: (insert: (html: string) => void) => void\n}\n\nconst BLOCKS = [\n { tag: 'p', label: 'Paragraf' },\n { tag: 'h1', label: 'Başlık 1' },\n { tag: 'h2', label: 'Başlık 2' },\n { tag: 'h3', label: 'Başlık 3' },\n { tag: 'blockquote', label: 'Alıntı' },\n]\n\nconst FONT_SIZES = [12, 14, 16, 18, 24, 32]\n\ntype Panel = 'link' | 'image' | 'table' | null\n\nconst CSS_COMMANDS = new Set(['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'])\n\nconst readFileAsDataUrl = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(file)\n })\n\ninterface ToolButtonProps {\n label: string\n onClick: () => void\n disabled?: boolean\n active?: boolean\n children: ReactNode\n}\n\nfunction ToolButton({ label, onClick, disabled, active, children }: ToolButtonProps) {\n return (\n <button\n type=\"button\"\n className={`inconel-rte__btn${active ? ' inconel-is-active' : ''}`}\n aria-label={label}\n title={label}\n aria-pressed={active}\n disabled={disabled}\n onMouseDown={(event) => event.preventDefault()}\n onClick={onClick}\n >\n {children}\n </button>\n )\n}\n\nexport default function RichTextEditor({\n value = '',\n onChange,\n onBlur,\n label,\n placeholder,\n id,\n disabled = false,\n required,\n fullWidth = true,\n className,\n minHeight = 200,\n onImageUpload,\n onRequestMedia,\n hint,\n errorMessage,\n}: RichTextEditorProps) {\n const generatedId = useId()\n const editorId = id ?? `inconel-rte-${generatedId.replace(/:/g, '')}`\n const hintId = `${editorId}-hint`\n const errorId = `${editorId}-error`\n\n const editorRef = useRef<HTMLDivElement>(null)\n const savedRange = useRef<Range | null>(null)\n const lastHtml = useRef<string | null>(null)\n const [sourceMode, setSourceMode] = useState(false)\n const [source, setSource] = useState('')\n const [panel, setPanel] = useState<Panel>(null)\n const [url, setUrl] = useState('')\n const [formats, setFormats] = useState<Record<string, boolean>>({})\n const [empty, setEmpty] = useState(!value)\n const [inTable, setInTable] = useState(false)\n const [tableSize, setTableSize] = useState({ rows: 3, cols: 3 })\n\n // Dışarıdan gelen value değişince (kendi çıktımız değilse) içeriği güncelle.\n useEffect(() => {\n const editor = editorRef.current\n if (!editor || value === lastHtml.current) return\n const clean = sanitizeHtml(value)\n if (editor.innerHTML !== clean) editor.innerHTML = clean\n lastHtml.current = value\n setEmpty(!editor.textContent && !editor.querySelector('img'))\n }, [value, sourceMode])\n\n const emit = useCallback(() => {\n const editor = editorRef.current\n if (!editor) return\n const hasContent = Boolean(editor.textContent) || Boolean(editor.querySelector('img'))\n const html = hasContent ? sanitizeHtml(editor.innerHTML) : ''\n setEmpty(!hasContent)\n lastHtml.current = html\n onChange?.(html)\n }, [onChange])\n\n const saveSelection = () => {\n const selection = window.getSelection()\n const editor = editorRef.current\n if (\n selection &&\n selection.rangeCount > 0 &&\n editor?.contains(selection.getRangeAt(0).commonAncestorContainer)\n ) {\n savedRange.current = selection.getRangeAt(0).cloneRange()\n }\n }\n\n const restoreSelection = () => {\n editorRef.current?.focus()\n const selection = window.getSelection()\n if (selection && savedRange.current) {\n selection.removeAllRanges()\n selection.addRange(savedRange.current)\n }\n }\n\n const currentCell = () => {\n const node = window.getSelection()?.anchorNode\n const element = node instanceof Element ? node : node?.parentElement\n const cell = element?.closest('td, th') ?? null\n return cell && editorRef.current?.contains(cell) ? (cell as HTMLTableCellElement) : null\n }\n\n const refreshFormats = () => {\n setInTable(Boolean(currentCell()))\n const query = (command: string) => {\n try {\n return document.queryCommandState(command)\n } catch {\n return false\n }\n }\n setFormats({\n bold: query('bold'),\n italic: query('italic'),\n underline: query('underline'),\n strikeThrough: query('strikeThrough'),\n justifyLeft: query('justifyLeft'),\n justifyCenter: query('justifyCenter'),\n justifyRight: query('justifyRight'),\n justifyFull: query('justifyFull'),\n insertUnorderedList: query('insertUnorderedList'),\n insertOrderedList: query('insertOrderedList'),\n })\n }\n\n const exec = (command: string, arg?: string) => {\n restoreSelection()\n // Hizalama CSS (text-align) ile, kalın/italik vb. standart etiketlerle (<b>, <i>, <u>) yazılır\n document.execCommand('styleWithCSS', false, CSS_COMMANDS.has(command) ? 'true' : 'false')\n document.execCommand(command, false, arg)\n saveSelection()\n refreshFormats()\n emit()\n }\n\n const applyFontSize = (px: number) => {\n restoreSelection()\n document.execCommand('styleWithCSS', false, 'false')\n document.execCommand('fontSize', false, '7')\n editorRef.current?.querySelectorAll('font[size=\"7\"]').forEach((font) => {\n const span = document.createElement('span')\n span.style.fontSize = `${px}px`\n span.append(...Array.from(font.childNodes))\n font.replaceWith(span)\n })\n saveSelection()\n emit()\n }\n\n const tableOp = (op: 'addRow' | 'delRow' | 'addCol' | 'delCol' | 'delTable') => {\n restoreSelection()\n const cell = currentCell()\n const row = cell?.parentElement as HTMLTableRowElement | null | undefined\n const table = cell?.closest('table')\n if (!cell || !row || !table) return\n const index = cell.cellIndex\n const blankLike = (source: Element) => {\n const next = document.createElement(source.tagName)\n next.innerHTML = '<br>'\n return next\n }\n\n if (op === 'addRow') {\n const newRow = document.createElement('tr')\n Array.from(row.cells).forEach((c) => newRow.append(blankLike(c.tagName === 'TH' ? document.createElement('td') : c)))\n if (row.parentElement?.tagName === 'THEAD') {\n const body = table.tBodies[0] ?? table.appendChild(document.createElement('tbody'))\n body.prepend(newRow)\n } else {\n row.after(newRow)\n }\n } else if (op === 'delRow') {\n row.remove()\n if (!table.rows.length) table.remove()\n } else if (op === 'addCol') {\n Array.from(table.rows).forEach((tr) => tr.cells[index]?.after(blankLike(tr.cells[index])))\n } else if (op === 'delCol') {\n Array.from(table.rows).forEach((tr) => tr.cells[index]?.remove())\n if (!Array.from(table.rows).some((tr) => tr.cells.length)) table.remove()\n } else {\n table.remove()\n }\n setInTable(false)\n emit()\n }\n\n const insertTable = () => {\n const rows = Math.min(Math.max(tableSize.rows, 1), 20)\n const cols = Math.min(Math.max(tableSize.cols, 1), 10)\n const cells = '<td><br></td>'.repeat(cols)\n const body = `<tr>${cells}</tr>`.repeat(rows)\n insertHtml(\n `<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"6\"><tbody>${body}</tbody></table><p><br></p>`,\n )\n setPanel(null)\n }\n\n const insertHtml = (html: string) => {\n restoreSelection()\n document.execCommand('insertHTML', false, sanitizeHtml(html))\n saveSelection()\n emit()\n }\n\n const openPanel = (next: Exclude<Panel, null>) => {\n saveSelection()\n setUrl('')\n setPanel(panel === next ? null : next)\n }\n\n const submitPanel = () => {\n if (panel === 'table') {\n insertTable()\n return\n }\n const target = url.trim()\n if (!target) return\n if (panel === 'link') {\n exec('createLink', target)\n editorRef.current?.querySelectorAll('a').forEach((a) => {\n if (/^https?:/i.test(a.getAttribute('href') ?? '')) {\n a.setAttribute('target', '_blank')\n a.setAttribute('rel', 'noopener noreferrer')\n }\n })\n emit()\n } else if (panel === 'image') {\n exec('insertImage', target)\n }\n setPanel(null)\n }\n\n const handleImageFile = async (event: ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0]\n event.target.value = ''\n if (!file || !file.type.startsWith('image/')) return\n const src = onImageUpload ? await onImageUpload(file) : await readFileAsDataUrl(file)\n exec('insertImage', src)\n setPanel(null)\n }\n\n const handlePaste = (event: React.ClipboardEvent<HTMLDivElement>) => {\n const html = event.clipboardData.getData('text/html')\n if (html) {\n event.preventDefault()\n document.execCommand('insertHTML', false, sanitizeHtml(html))\n emit()\n }\n }\n\n const toggleSource = () => {\n if (sourceMode) {\n const clean = sanitizeHtml(source)\n lastHtml.current = null\n if (editorRef.current) editorRef.current.innerHTML = clean\n lastHtml.current = clean\n setEmpty(!clean)\n onChange?.(clean)\n } else {\n setSource(sanitizeHtml(editorRef.current?.innerHTML ?? ''))\n }\n setPanel(null)\n setSourceMode(!sourceMode)\n }\n\n const describedBy =\n [hint && !errorMessage ? hintId : undefined, errorMessage ? errorId : undefined]\n .filter(Boolean)\n .join(' ') || undefined\n const toolsDisabled = disabled || sourceMode\n\n const btn = (\n command: string,\n text: string,\n content: ReactNode,\n arg?: string,\n ) => (\n <ToolButton\n label={text}\n active={formats[command]}\n disabled={toolsDisabled}\n onClick={() => exec(command, arg)}\n >\n {content}\n </ToolButton>\n )\n\n return (\n <div\n className={[\n 'inconel-field',\n fullWidth ? 'inconel-field--full-width' : '',\n className ?? '',\n ].join(' ')}\n >\n {label && (\n <label className=\"inconel-field__label\" htmlFor={editorId}>\n {label}\n {required && <span aria-hidden=\"true\"> *</span>}\n </label>\n )}\n <div\n className={[\n 'inconel-rte',\n errorMessage ? 'inconel-is-invalid' : '',\n disabled ? 'inconel-is-disabled' : '',\n ].join(' ')}\n >\n <div className=\"inconel-rte__toolbar\" role=\"toolbar\" aria-label=\"Biçimlendirme\">\n {btn('bold', 'Kalın', icons.bold)}\n {btn('italic', 'İtalik', icons.italic)}\n {btn('underline', 'Altı çizili', icons.underline)}\n {btn('strikeThrough', 'Üstü çizili', icons.strike)}\n <span className=\"inconel-rte__sep\" />\n <select\n className=\"inconel-rte__select\"\n aria-label=\"Biçim\"\n disabled={toolsDisabled}\n value=\"\"\n onChange={(event) => {\n if (event.target.value) exec('formatBlock', event.target.value)\n }}\n >\n <option value=\"\">Biçim</option>\n {BLOCKS.map((block) => (\n <option key={block.tag} value={block.tag}>\n {block.label}\n </option>\n ))}\n </select>\n <select\n className=\"inconel-rte__select\"\n aria-label=\"Yazı boyutu\"\n disabled={toolsDisabled}\n value=\"\"\n onChange={(event) => {\n if (event.target.value) applyFontSize(Number(event.target.value))\n }}\n >\n <option value=\"\">Boyut</option>\n {FONT_SIZES.map((size) => (\n <option key={size} value={size}>\n {size}px\n </option>\n ))}\n </select>\n <span className=\"inconel-rte__sep\" />\n {btn('justifyLeft', 'Sola hizala', icons.alignLeft)}\n {btn('justifyCenter', 'Ortala', icons.alignCenter)}\n {btn('justifyRight', 'Sağa hizala', icons.alignRight)}\n {btn('justifyFull', 'İki yana yasla', icons.alignJustify)}\n <span className=\"inconel-rte__sep\" />\n {btn('insertUnorderedList', 'Madde işaretli liste', icons.listUl)}\n {btn('insertOrderedList', 'Numaralı liste', icons.listOl)}\n {btn('outdent', 'Girintiyi azalt', icons.outdent)}\n {btn('indent', 'Girintiyi artır', icons.indent)}\n {btn('removeFormat', 'Biçimi temizle', icons.clearFormat)}\n <span className=\"inconel-rte__sep\" />\n <ToolButton\n label=\"Bağlantı ekle\"\n disabled={toolsDisabled}\n active={panel === 'link'}\n onClick={() => openPanel('link')}\n >\n {icons.link}\n </ToolButton>\n <ToolButton\n label=\"Tablo ekle\"\n disabled={toolsDisabled}\n active={panel === 'table'}\n onClick={() => openPanel('table')}\n >\n {icons.table}\n </ToolButton>\n <ToolButton\n label=\"Görsel ekle\"\n disabled={toolsDisabled}\n active={panel === 'image'}\n onClick={() => openPanel('image')}\n >\n {icons.image}\n </ToolButton>\n {onRequestMedia && (\n <ToolButton\n label=\"Medya galerisi\"\n disabled={toolsDisabled}\n onClick={() => {\n saveSelection()\n onRequestMedia(insertHtml)\n }}\n >\n {icons.gallery}\n </ToolButton>\n )}\n <span className=\"inconel-rte__sep\" />\n {btn('undo', 'Geri al', icons.undo)}\n {btn('redo', 'Yinele', icons.redo)}\n <ToolButton\n label=\"HTML kaynağı\"\n disabled={disabled}\n active={sourceMode}\n onClick={toggleSource}\n >\n {icons.code}\n </ToolButton>\n </div>\n\n {panel === 'table' && !sourceMode && (\n <div className=\"inconel-rte__panel\">\n <label className=\"inconel-rte__field\">\n Satır\n <input\n type=\"number\"\n min={1}\n max={20}\n className=\"inconel-rte__input inconel-rte__input--num\"\n value={tableSize.rows}\n onChange={(event) => setTableSize({ ...tableSize, rows: Number(event.target.value) })}\n />\n </label>\n <label className=\"inconel-rte__field\">\n Sütun\n <input\n type=\"number\"\n min={1}\n max={10}\n className=\"inconel-rte__input inconel-rte__input--num\"\n value={tableSize.cols}\n onChange={(event) => setTableSize({ ...tableSize, cols: Number(event.target.value) })}\n />\n </label>\n <button type=\"button\" className=\"inconel-rte__action\" onClick={submitPanel}>\n Tablo ekle\n </button>\n </div>\n )}\n\n {inTable && !sourceMode && !disabled && (\n <div className=\"inconel-rte__panel\" role=\"toolbar\" aria-label=\"Tablo\">\n {(\n [\n ['addRow', 'Satır ekle'],\n ['delRow', 'Satırı sil'],\n ['addCol', 'Sütun ekle'],\n ['delCol', 'Sütunu sil'],\n ['delTable', 'Tabloyu sil'],\n ] as const\n ).map(([op, text]) => (\n <button\n key={op}\n type=\"button\"\n className=\"inconel-rte__action\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => tableOp(op)}\n >\n {text}\n </button>\n ))}\n </div>\n )}\n\n {panel && panel !== 'table' && !sourceMode && (\n <div className=\"inconel-rte__panel\">\n <input\n type=\"url\"\n className=\"inconel-rte__input\"\n aria-label={panel === 'link' ? 'Bağlantı adresi' : 'Görsel adresi'}\n placeholder={panel === 'link' ? 'https://…' : 'Görsel URL (https://…)'}\n value={url}\n autoFocus\n onChange={(event) => setUrl(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n submitPanel()\n }\n }}\n />\n <button type=\"button\" className=\"inconel-rte__action\" onClick={submitPanel}>\n Ekle\n </button>\n {panel === 'image' && (\n <label className=\"inconel-rte__action\">\n Dosya seç\n <input\n type=\"file\"\n accept=\"image/*\"\n hidden\n aria-label=\"Görsel dosyası\"\n onChange={handleImageFile}\n />\n </label>\n )}\n </div>\n )}\n\n {sourceMode ? (\n <textarea\n id={editorId}\n className=\"inconel-rte__source\"\n style={{ minHeight }}\n aria-label={label ?? 'HTML kaynağı'}\n value={source}\n disabled={disabled}\n spellCheck={false}\n onChange={(event) => setSource(event.target.value)}\n />\n ) : (\n <div className=\"inconel-rte__surface\" style={{ minHeight }}>\n {empty && placeholder && (\n <span className=\"inconel-rte__placeholder\" aria-hidden=\"true\">\n {placeholder}\n </span>\n )}\n <div\n ref={editorRef}\n id={editorId}\n className=\"inconel-rte__content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-label={label}\n aria-required={required}\n aria-invalid={Boolean(errorMessage)}\n aria-describedby={describedBy}\n aria-disabled={disabled}\n contentEditable={!disabled}\n suppressContentEditableWarning\n style={{ minHeight }}\n onInput={emit}\n onPaste={handlePaste}\n onKeyUp={() => {\n saveSelection()\n refreshFormats()\n }}\n onMouseUp={() => {\n saveSelection()\n refreshFormats()\n }}\n onBlur={() => {\n saveSelection()\n onBlur?.()\n }}\n />\n </div>\n )}\n </div>\n <FieldFeedback hint={hint} errorMessage={errorMessage} hintId={hintId} errorId={errorId} />\n </div>\n )\n}\n"],"names":["BLOCKS","FONT_SIZES","CSS_COMMANDS","readFileAsDataUrl","file","resolve","reject","reader","ToolButton","label","onClick","disabled","active","children","jsx","event","RichTextEditor","value","onChange","onBlur","placeholder","id","required","fullWidth","className","minHeight","onImageUpload","onRequestMedia","hint","errorMessage","generatedId","useId","editorId","hintId","errorId","editorRef","useRef","savedRange","lastHtml","sourceMode","setSourceMode","useState","source","setSource","panel","setPanel","url","setUrl","formats","setFormats","empty","setEmpty","inTable","setInTable","tableSize","setTableSize","useEffect","editor","clean","sanitizeHtml","emit","useCallback","hasContent","html","saveSelection","selection","restoreSelection","currentCell","node","cell","refreshFormats","query","command","exec","arg","applyFontSize","px","font","span","tableOp","op","row","table","index","blankLike","next","newRow","c","tr","insertTable","rows","cols","body","insertHtml","openPanel","submitPanel","target","a","handleImageFile","src","handlePaste","toggleSource","describedBy","toolsDisabled","btn","text","content","jsxs","icons","block","size","FieldFeedback"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("react/jsx-runtime"),t=M=>h.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",children:M}),a={bold:t(h.jsx("path",{d:"M7 5h6a3.5 3.5 0 0 1 0 7H7zM7 12h7a3.5 3.5 0 0 1 0 7H7z"})),italic:t(h.jsx("path",{d:"M19 4h-9M14 20H5M15 4 9 20"})),underline:t(h.jsx("path",{d:"M7 4v7a5 5 0 0 0 10 0V4M5 20h14"})),strike:t(h.jsx("path",{d:"M16 6a4 4 0 0 0-4-2c-2.5 0-4 1.3-4 3s1.5 2.5 4 3M4 12h16M8 18a4 4 0 0 0 4 2c2.5 0 4-1.3 4-3 0-.9-.4-1.6-1.2-2.1"})),alignLeft:t(h.jsx("path",{d:"M4 6h16M4 10h10M4 14h16M4 18h10"})),alignCenter:t(h.jsx("path",{d:"M4 6h16M7 10h10M4 14h16M7 18h10"})),alignRight:t(h.jsx("path",{d:"M4 6h16M10 10h10M4 14h16M10 18h10"})),alignJustify:t(h.jsx("path",{d:"M4 6h16M4 10h16M4 14h16M4 18h16"})),listUl:t(h.jsxs(h.Fragment,{children:[h.jsx("path",{d:"M9 6h11M9 12h11M9 18h11"}),h.jsx("path",{d:"M4.5 6h.01M4.5 12h.01M4.5 18h.01",strokeWidth:"3"})]})),listOl:t(h.jsxs(h.Fragment,{children:[h.jsx("path",{d:"M10 6h10M10 12h10M10 18h10"}),h.jsx("path",{d:"M4 5.5 5.5 5v4.5M4 14.5a1.5 1.5 0 1 1 3 0c0 1-3 2-3 3.5h3",strokeWidth:"1.5"})]})),outdent:t(h.jsx("path",{d:"M4 6h16M10 10h10M10 14h10M4 18h16M7 9l-3 3 3 3"})),indent:t(h.jsx("path",{d:"M4 6h16M10 10h10M10 14h10M4 18h16M4 9l3 3-3 3"})),clearFormat:t(h.jsx("path",{d:"M6 5h12M12 5l-1.5 6M9 19h4M4 4l16 16"})),link:t(h.jsx("path",{d:"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1"})),image:t(h.jsxs(h.Fragment,{children:[h.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),h.jsx("circle",{cx:"9",cy:"10",r:"1.5"}),h.jsx("path",{d:"m3 17 5-5 4 4 3-3 6 6"})]})),gallery:t(h.jsxs(h.Fragment,{children:[h.jsx("path",{d:"M7 7V5a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1h-2"}),h.jsx("rect",{x:"3",y:"8",width:"15",height:"12",rx:"1.5"}),h.jsx("path",{d:"m3 17 4-4 3 3 3-3 5 5"})]})),undo:t(h.jsx("path",{d:"M9 14 4 9l5-5M4 9h10a6 6 0 0 1 0 12h-3"})),redo:t(h.jsx("path",{d:"m15 14 5-5-5-5M20 9H10a6 6 0 0 0 0 12h3"})),code:t(h.jsx("path",{d:"m8 7-5 5 5 5M16 7l5 5-5 5"}))};exports.icons=a;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("react/jsx-runtime"),t=M=>h.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",children:M}),a={bold:t(h.jsx("path",{d:"M7 5h6a3.5 3.5 0 0 1 0 7H7zM7 12h7a3.5 3.5 0 0 1 0 7H7z"})),italic:t(h.jsx("path",{d:"M19 4h-9M14 20H5M15 4 9 20"})),underline:t(h.jsx("path",{d:"M7 4v7a5 5 0 0 0 10 0V4M5 20h14"})),strike:t(h.jsx("path",{d:"M16 6a4 4 0 0 0-4-2c-2.5 0-4 1.3-4 3s1.5 2.5 4 3M4 12h16M8 18a4 4 0 0 0 4 2c2.5 0 4-1.3 4-3 0-.9-.4-1.6-1.2-2.1"})),alignLeft:t(h.jsx("path",{d:"M4 6h16M4 10h10M4 14h16M4 18h10"})),alignCenter:t(h.jsx("path",{d:"M4 6h16M7 10h10M4 14h16M7 18h10"})),alignRight:t(h.jsx("path",{d:"M4 6h16M10 10h10M4 14h16M10 18h10"})),alignJustify:t(h.jsx("path",{d:"M4 6h16M4 10h16M4 14h16M4 18h16"})),listUl:t(h.jsxs(h.Fragment,{children:[h.jsx("path",{d:"M9 6h11M9 12h11M9 18h11"}),h.jsx("path",{d:"M4.5 6h.01M4.5 12h.01M4.5 18h.01",strokeWidth:"3"})]})),listOl:t(h.jsxs(h.Fragment,{children:[h.jsx("path",{d:"M10 6h10M10 12h10M10 18h10"}),h.jsx("path",{d:"M4 5.5 5.5 5v4.5M4 14.5a1.5 1.5 0 1 1 3 0c0 1-3 2-3 3.5h3",strokeWidth:"1.5"})]})),outdent:t(h.jsx("path",{d:"M4 6h16M10 10h10M10 14h10M4 18h16M7 9l-3 3 3 3"})),indent:t(h.jsx("path",{d:"M4 6h16M10 10h10M10 14h10M4 18h16M4 9l3 3-3 3"})),clearFormat:t(h.jsx("path",{d:"M6 5h12M12 5l-1.5 6M9 19h4M4 4l16 16"})),link:t(h.jsx("path",{d:"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1"})),image:t(h.jsxs(h.Fragment,{children:[h.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),h.jsx("circle",{cx:"9",cy:"10",r:"1.5"}),h.jsx("path",{d:"m3 17 5-5 4 4 3-3 6 6"})]})),gallery:t(h.jsxs(h.Fragment,{children:[h.jsx("path",{d:"M7 7V5a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1h-2"}),h.jsx("rect",{x:"3",y:"8",width:"15",height:"12",rx:"1.5"}),h.jsx("path",{d:"m3 17 4-4 3 3 3-3 5 5"})]})),table:t(h.jsxs(h.Fragment,{children:[h.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),h.jsx("path",{d:"M3 10h18M3 15h18M9 4v16M15 4v16"})]})),undo:t(h.jsx("path",{d:"M9 14 4 9l5-5M4 9h10a6 6 0 0 1 0 12h-3"})),redo:t(h.jsx("path",{d:"m15 14 5-5-5-5M20 9H10a6 6 0 0 0 0 12h3"})),code:t(h.jsx("path",{d:"m8 7-5 5 5 5M16 7l5 5-5 5"}))};exports.icons=a;
2
2
  //# sourceMappingURL=icons.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"icons.cjs","sources":["../../../../src/components/RichTextEditor/icons.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\n\nconst icon = (paths: ReactNode) => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {paths}\n </svg>\n)\n\nexport const icons = {\n bold: icon(<path d=\"M7 5h6a3.5 3.5 0 0 1 0 7H7zM7 12h7a3.5 3.5 0 0 1 0 7H7z\" />),\n italic: icon(<path d=\"M19 4h-9M14 20H5M15 4 9 20\" />),\n underline: icon(<path d=\"M7 4v7a5 5 0 0 0 10 0V4M5 20h14\" />),\n strike: icon(\n <path d=\"M16 6a4 4 0 0 0-4-2c-2.5 0-4 1.3-4 3s1.5 2.5 4 3M4 12h16M8 18a4 4 0 0 0 4 2c2.5 0 4-1.3 4-3 0-.9-.4-1.6-1.2-2.1\" />,\n ),\n alignLeft: icon(<path d=\"M4 6h16M4 10h10M4 14h16M4 18h10\" />),\n alignCenter: icon(<path d=\"M4 6h16M7 10h10M4 14h16M7 18h10\" />),\n alignRight: icon(<path d=\"M4 6h16M10 10h10M4 14h16M10 18h10\" />),\n alignJustify: icon(<path d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />),\n listUl: icon(\n <>\n <path d=\"M9 6h11M9 12h11M9 18h11\" />\n <path d=\"M4.5 6h.01M4.5 12h.01M4.5 18h.01\" strokeWidth=\"3\" />\n </>,\n ),\n listOl: icon(\n <>\n <path d=\"M10 6h10M10 12h10M10 18h10\" />\n <path d=\"M4 5.5 5.5 5v4.5M4 14.5a1.5 1.5 0 1 1 3 0c0 1-3 2-3 3.5h3\" strokeWidth=\"1.5\" />\n </>,\n ),\n outdent: icon(<path d=\"M4 6h16M10 10h10M10 14h10M4 18h16M7 9l-3 3 3 3\" />),\n indent: icon(<path d=\"M4 6h16M10 10h10M10 14h10M4 18h16M4 9l3 3-3 3\" />),\n clearFormat: icon(<path d=\"M6 5h12M12 5l-1.5 6M9 19h4M4 4l16 16\" />),\n link: icon(\n <path d=\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1\" />,\n ),\n image: icon(\n <>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <circle cx=\"9\" cy=\"10\" r=\"1.5\" />\n <path d=\"m3 17 5-5 4 4 3-3 6 6\" />\n </>,\n ),\n gallery: icon(\n <>\n <path d=\"M7 7V5a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1h-2\" />\n <rect x=\"3\" y=\"8\" width=\"15\" height=\"12\" rx=\"1.5\" />\n <path d=\"m3 17 4-4 3 3 3-3 5 5\" />\n </>,\n ),\n undo: icon(<path d=\"M9 14 4 9l5-5M4 9h10a6 6 0 0 1 0 12h-3\" />),\n redo: icon(<path d=\"m15 14 5-5-5-5M20 9H10a6 6 0 0 0 0 12h3\" />),\n code: icon(<path d=\"m8 7-5 5 5 5M16 7l5 5-5 5\" />),\n}\n"],"names":["icon","paths","jsx","icons","jsxs","Fragment"],"mappings":"qHAEMA,EAAQC,GACZC,EAAAA,IAAC,MAAA,CACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,cAAY,OACZ,UAAU,QAET,SAAAD,CAAA,CACH,EAGWE,EAAQ,CACnB,KAAMH,EAAKE,MAAC,OAAA,CAAK,EAAE,0DAA0D,CAAE,EAC/E,OAAQF,EAAKE,MAAC,OAAA,CAAK,EAAE,6BAA6B,CAAE,EACpD,UAAWF,EAAKE,MAAC,OAAA,CAAK,EAAE,kCAAkC,CAAE,EAC5D,OAAQF,EACNE,EAAAA,IAAC,OAAA,CAAK,EAAE,iHAAA,CAAkH,CAAA,EAE5H,UAAWF,EAAKE,MAAC,OAAA,CAAK,EAAE,kCAAkC,CAAE,EAC5D,YAAaF,EAAKE,MAAC,OAAA,CAAK,EAAE,kCAAkC,CAAE,EAC9D,WAAYF,EAAKE,MAAC,OAAA,CAAK,EAAE,oCAAoC,CAAE,EAC/D,aAAcF,EAAKE,MAAC,OAAA,CAAK,EAAE,kCAAkC,CAAE,EAC/D,OAAQF,EACNI,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,EAAE,yBAAA,CAA0B,EAClCA,EAAAA,IAAC,OAAA,CAAK,EAAE,mCAAmC,YAAY,GAAA,CAAI,CAAA,CAAA,CAC7D,CAAA,EAEF,OAAQF,EACNI,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,EAAE,4BAAA,CAA6B,EACrCA,EAAAA,IAAC,OAAA,CAAK,EAAE,4DAA4D,YAAY,KAAA,CAAM,CAAA,CAAA,CACxF,CAAA,EAEF,QAASF,EAAKE,MAAC,OAAA,CAAK,EAAE,iDAAiD,CAAE,EACzE,OAAQF,EAAKE,MAAC,OAAA,CAAK,EAAE,gDAAgD,CAAE,EACvE,YAAaF,EAAKE,MAAC,OAAA,CAAK,EAAE,uCAAuC,CAAE,EACnE,KAAMF,EACJE,EAAAA,IAAC,OAAA,CAAK,EAAE,oGAAA,CAAqG,CAAA,EAE/G,MAAOF,EACLI,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,OAAO,KAAK,GAAG,GAAA,CAAI,QAC/C,SAAA,CAAO,GAAG,IAAI,GAAG,KAAK,EAAE,MAAM,EAC/BA,EAAAA,IAAC,OAAA,CAAK,EAAE,uBAAA,CAAwB,CAAA,CAAA,CAClC,CAAA,EAEF,QAASF,EACPI,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,EAAE,2DAAA,CAA4D,EACpEA,EAAAA,IAAC,OAAA,CAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,OAAO,KAAK,GAAG,KAAA,CAAM,EAClDA,EAAAA,IAAC,OAAA,CAAK,EAAE,uBAAA,CAAwB,CAAA,CAAA,CAClC,CAAA,EAEF,KAAMF,EAAKE,MAAC,OAAA,CAAK,EAAE,yCAAyC,CAAE,EAC9D,KAAMF,EAAKE,MAAC,OAAA,CAAK,EAAE,0CAA0C,CAAE,EAC/D,KAAMF,EAAKE,EAAAA,IAAC,OAAA,CAAK,EAAE,4BAA4B,CAAE,CACnD"}
1
+ {"version":3,"file":"icons.cjs","sources":["../../../../src/components/RichTextEditor/icons.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\n\nconst icon = (paths: ReactNode) => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {paths}\n </svg>\n)\n\nexport const icons = {\n bold: icon(<path d=\"M7 5h6a3.5 3.5 0 0 1 0 7H7zM7 12h7a3.5 3.5 0 0 1 0 7H7z\" />),\n italic: icon(<path d=\"M19 4h-9M14 20H5M15 4 9 20\" />),\n underline: icon(<path d=\"M7 4v7a5 5 0 0 0 10 0V4M5 20h14\" />),\n strike: icon(\n <path d=\"M16 6a4 4 0 0 0-4-2c-2.5 0-4 1.3-4 3s1.5 2.5 4 3M4 12h16M8 18a4 4 0 0 0 4 2c2.5 0 4-1.3 4-3 0-.9-.4-1.6-1.2-2.1\" />,\n ),\n alignLeft: icon(<path d=\"M4 6h16M4 10h10M4 14h16M4 18h10\" />),\n alignCenter: icon(<path d=\"M4 6h16M7 10h10M4 14h16M7 18h10\" />),\n alignRight: icon(<path d=\"M4 6h16M10 10h10M4 14h16M10 18h10\" />),\n alignJustify: icon(<path d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />),\n listUl: icon(\n <>\n <path d=\"M9 6h11M9 12h11M9 18h11\" />\n <path d=\"M4.5 6h.01M4.5 12h.01M4.5 18h.01\" strokeWidth=\"3\" />\n </>,\n ),\n listOl: icon(\n <>\n <path d=\"M10 6h10M10 12h10M10 18h10\" />\n <path d=\"M4 5.5 5.5 5v4.5M4 14.5a1.5 1.5 0 1 1 3 0c0 1-3 2-3 3.5h3\" strokeWidth=\"1.5\" />\n </>,\n ),\n outdent: icon(<path d=\"M4 6h16M10 10h10M10 14h10M4 18h16M7 9l-3 3 3 3\" />),\n indent: icon(<path d=\"M4 6h16M10 10h10M10 14h10M4 18h16M4 9l3 3-3 3\" />),\n clearFormat: icon(<path d=\"M6 5h12M12 5l-1.5 6M9 19h4M4 4l16 16\" />),\n link: icon(\n <path d=\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1\" />,\n ),\n image: icon(\n <>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <circle cx=\"9\" cy=\"10\" r=\"1.5\" />\n <path d=\"m3 17 5-5 4 4 3-3 6 6\" />\n </>,\n ),\n gallery: icon(\n <>\n <path d=\"M7 7V5a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1h-2\" />\n <rect x=\"3\" y=\"8\" width=\"15\" height=\"12\" rx=\"1.5\" />\n <path d=\"m3 17 4-4 3 3 3-3 5 5\" />\n </>,\n ),\n table: icon(\n <>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" />\n <path d=\"M3 10h18M3 15h18M9 4v16M15 4v16\" />\n </>,\n ),\n undo: icon(<path d=\"M9 14 4 9l5-5M4 9h10a6 6 0 0 1 0 12h-3\" />),\n redo: icon(<path d=\"m15 14 5-5-5-5M20 9H10a6 6 0 0 0 0 12h3\" />),\n code: icon(<path d=\"m8 7-5 5 5 5M16 7l5 5-5 5\" />),\n}\n"],"names":["icon","paths","jsx","icons","jsxs","Fragment"],"mappings":"qHAEMA,EAAQC,GACZC,EAAAA,IAAC,MAAA,CACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,QACf,cAAY,OACZ,UAAU,QAET,SAAAD,CAAA,CACH,EAGWE,EAAQ,CACnB,KAAMH,EAAKE,MAAC,OAAA,CAAK,EAAE,0DAA0D,CAAE,EAC/E,OAAQF,EAAKE,MAAC,OAAA,CAAK,EAAE,6BAA6B,CAAE,EACpD,UAAWF,EAAKE,MAAC,OAAA,CAAK,EAAE,kCAAkC,CAAE,EAC5D,OAAQF,EACNE,EAAAA,IAAC,OAAA,CAAK,EAAE,iHAAA,CAAkH,CAAA,EAE5H,UAAWF,EAAKE,MAAC,OAAA,CAAK,EAAE,kCAAkC,CAAE,EAC5D,YAAaF,EAAKE,MAAC,OAAA,CAAK,EAAE,kCAAkC,CAAE,EAC9D,WAAYF,EAAKE,MAAC,OAAA,CAAK,EAAE,oCAAoC,CAAE,EAC/D,aAAcF,EAAKE,MAAC,OAAA,CAAK,EAAE,kCAAkC,CAAE,EAC/D,OAAQF,EACNI,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,EAAE,yBAAA,CAA0B,EAClCA,EAAAA,IAAC,OAAA,CAAK,EAAE,mCAAmC,YAAY,GAAA,CAAI,CAAA,CAAA,CAC7D,CAAA,EAEF,OAAQF,EACNI,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,EAAE,4BAAA,CAA6B,EACrCA,EAAAA,IAAC,OAAA,CAAK,EAAE,4DAA4D,YAAY,KAAA,CAAM,CAAA,CAAA,CACxF,CAAA,EAEF,QAASF,EAAKE,MAAC,OAAA,CAAK,EAAE,iDAAiD,CAAE,EACzE,OAAQF,EAAKE,MAAC,OAAA,CAAK,EAAE,gDAAgD,CAAE,EACvE,YAAaF,EAAKE,MAAC,OAAA,CAAK,EAAE,uCAAuC,CAAE,EACnE,KAAMF,EACJE,EAAAA,IAAC,OAAA,CAAK,EAAE,oGAAA,CAAqG,CAAA,EAE/G,MAAOF,EACLI,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,OAAO,KAAK,GAAG,GAAA,CAAI,QAC/C,SAAA,CAAO,GAAG,IAAI,GAAG,KAAK,EAAE,MAAM,EAC/BA,EAAAA,IAAC,OAAA,CAAK,EAAE,uBAAA,CAAwB,CAAA,CAAA,CAClC,CAAA,EAEF,QAASF,EACPI,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,EAAE,2DAAA,CAA4D,EACpEA,EAAAA,IAAC,OAAA,CAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,OAAO,KAAK,GAAG,KAAA,CAAM,EAClDA,EAAAA,IAAC,OAAA,CAAK,EAAE,uBAAA,CAAwB,CAAA,CAAA,CAClC,CAAA,EAEF,MAAOF,EACLI,OAAAC,EAAAA,SAAA,CACE,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,EAAE,IAAI,EAAE,IAAI,MAAM,KAAK,OAAO,KAAK,GAAG,GAAA,CAAI,EAChDA,EAAAA,IAAC,OAAA,CAAK,EAAE,iCAAA,CAAkC,CAAA,CAAA,CAC5C,CAAA,EAEF,KAAMF,EAAKE,MAAC,OAAA,CAAK,EAAE,yCAAyC,CAAE,EAC9D,KAAMF,EAAKE,MAAC,OAAA,CAAK,EAAE,0CAA0C,CAAE,EAC/D,KAAMF,EAAKE,EAAAA,IAAC,OAAA,CAAK,EAAE,4BAA4B,CAAE,CACnD"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=new Set(["a","b","strong","i","em","u","s","strike","del","p","div","span","br","ul","ol","li","h1","h2","h3","h4","blockquote","img","sub","sup"]),m={a:["href","target","rel","title","class"],img:["src","alt","title","width","height","class"]},u=new Set(["text-align","font-size"]),f=new Set(["script","style","iframe","object","embed","noscript"]),c=(r,e)=>{const t=Array.from(r).filter(n=>n.charCodeAt(0)>32).join("");return e&&/^data:image\/(png|jpe?g|gif|webp|bmp);/i.test(t)?!0:/^(https?:|mailto:|tel:|\/|#|\.{1,2}\/)/i.test(t)||!/^[a-z][a-z0-9+.-]*:/i.test(t)},b=r=>r.split(";").map(e=>e.split(":").map(t=>t.trim())).filter(([e,t])=>u.has(e?.toLowerCase())&&t&&/^[\w\s.%-]+$/.test(t)).map(([e,t])=>`${e.toLowerCase()}: ${t}`).join("; "),i=r=>{Array.from(r.children).forEach(e=>{const t=e.tagName.toLowerCase();if(f.has(t)){e.remove();return}if(i(e),!l.has(t)){e.replaceWith(...Array.from(e.childNodes));return}const n=m[t]??[];Array.from(e.attributes).forEach(s=>{const o=s.name.toLowerCase();if(o==="style"){const a=b(s.value);a?e.setAttribute("style",a):e.removeAttribute("style")}else o==="class"?(!n.includes("class")||!/^[\w\s-]+$/.test(s.value))&&e.removeAttribute(s.name):n.includes(o)?(o==="href"||o==="src")&&!c(s.value,t==="img")&&e.removeAttribute(s.name):e.removeAttribute(s.name)}),t==="a"&&e.getAttribute("target")==="_blank"&&e.setAttribute("rel","noopener noreferrer")})};function p(r){if(!r)return"";const e=new DOMParser().parseFromString(`<body>${r}</body>`,"text/html");return i(e.body),e.body.innerHTML}exports.sanitizeHtml=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=new Set(["a","b","strong","i","em","u","s","strike","del","p","div","span","br","ul","ol","li","h1","h2","h3","h4","blockquote","img","sub","sup","table","thead","tbody","tfoot","tr","td","th","colgroup","col"]),c={a:["href","target","rel","title","class"],img:["src","alt","title","width","height","class"],table:["border","cellpadding","cellspacing","width","class"],td:["colspan","rowspan"],th:["colspan","rowspan"],col:["span"],colgroup:["span"]},m=new Set(["text-align","font-size","border-collapse","width"]),u=new Set(["script","style","iframe","object","embed","noscript"]),p=(r,e)=>{const t=Array.from(r).filter(a=>a.charCodeAt(0)>32).join("");return e&&/^data:image\/(png|jpe?g|gif|webp|bmp);/i.test(t)?!0:/^(https?:|mailto:|tel:|\/|#|\.{1,2}\/)/i.test(t)||!/^[a-z][a-z0-9+.-]*:/i.test(t)},f=r=>r.split(";").map(e=>e.split(":").map(t=>t.trim())).filter(([e,t])=>m.has(e?.toLowerCase())&&t&&/^[\w\s.%-]+$/.test(t)).map(([e,t])=>`${e.toLowerCase()}: ${t}`).join("; "),i=r=>{Array.from(r.children).forEach(e=>{const t=e.tagName.toLowerCase();if(u.has(t)){e.remove();return}if(i(e),!l.has(t)){e.replaceWith(...Array.from(e.childNodes));return}const a=c[t]??[];Array.from(e.attributes).forEach(s=>{const o=s.name.toLowerCase();if(o==="style"){const n=f(s.value);n?e.setAttribute("style",n):e.removeAttribute("style")}else o==="class"?(!a.includes("class")||!/^[\w\s-]+$/.test(s.value))&&e.removeAttribute(s.name):a.includes(o)?(o==="href"||o==="src")&&!p(s.value,t==="img")&&e.removeAttribute(s.name):e.removeAttribute(s.name)}),t==="a"&&e.getAttribute("target")==="_blank"&&e.setAttribute("rel","noopener noreferrer")})};function b(r){if(!r)return"";const e=new DOMParser().parseFromString(`<body>${r}</body>`,"text/html");return i(e.body),e.body.innerHTML}exports.sanitizeHtml=b;
2
2
  //# sourceMappingURL=sanitize.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.cjs","sources":["../../../../src/components/RichTextEditor/sanitize.ts"],"sourcesContent":["const ALLOWED_TAGS = new Set([\n 'a', 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'del', 'p', 'div', 'span',\n 'br', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'blockquote', 'img', 'sub', 'sup',\n])\n\nconst ALLOWED_ATTRS: Record<string, string[]> = {\n a: ['href', 'target', 'rel', 'title', 'class'],\n img: ['src', 'alt', 'title', 'width', 'height', 'class'],\n}\n\nconst ALLOWED_STYLES = new Set(['text-align', 'font-size'])\nconst DROP_WITH_CONTENT = new Set(['script', 'style', 'iframe', 'object', 'embed', 'noscript'])\n\nconst isSafeUrl = (value: string, allowDataImage: boolean) => {\n const url = Array.from(value)\n .filter((char) => char.charCodeAt(0) > 32)\n .join('')\n if (allowDataImage && /^data:image\\/(png|jpe?g|gif|webp|bmp);/i.test(url)) return true\n return /^(https?:|mailto:|tel:|\\/|#|\\.{1,2}\\/)/i.test(url) || !/^[a-z][a-z0-9+.-]*:/i.test(url)\n}\n\nconst cleanStyle = (value: string) =>\n value\n .split(';')\n .map((rule) => rule.split(':').map((part) => part.trim()))\n .filter(\n ([prop, val]) =>\n ALLOWED_STYLES.has(prop?.toLowerCase()) && val && /^[\\w\\s.%-]+$/.test(val),\n )\n .map(([prop, val]) => `${prop.toLowerCase()}: ${val}`)\n .join('; ')\n\nconst cleanNode = (node: Element) => {\n Array.from(node.children).forEach((child) => {\n const tag = child.tagName.toLowerCase()\n\n if (DROP_WITH_CONTENT.has(tag)) {\n child.remove()\n return\n }\n\n cleanNode(child)\n\n if (!ALLOWED_TAGS.has(tag)) {\n child.replaceWith(...Array.from(child.childNodes))\n return\n }\n\n const allowed = ALLOWED_ATTRS[tag] ?? []\n Array.from(child.attributes).forEach((attr) => {\n const name = attr.name.toLowerCase()\n if (name === 'style') {\n const style = cleanStyle(attr.value)\n if (style) child.setAttribute('style', style)\n else child.removeAttribute('style')\n } else if (name === 'class') {\n if (!allowed.includes('class') || !/^[\\w\\s-]+$/.test(attr.value)) {\n child.removeAttribute(attr.name)\n }\n } else if (!allowed.includes(name)) {\n child.removeAttribute(attr.name)\n } else if (\n (name === 'href' || name === 'src') &&\n !isSafeUrl(attr.value, tag === 'img')\n ) {\n child.removeAttribute(attr.name)\n }\n })\n\n if (tag === 'a' && child.getAttribute('target') === '_blank') {\n child.setAttribute('rel', 'noopener noreferrer')\n }\n })\n}\n\n/** HTML'i izin verilen etiket/özelliklerle sınırlar (script, on* olayları, javascript: vb. temizlenir). */\nexport function sanitizeHtml(html: string): string {\n if (!html) return ''\n const doc = new DOMParser().parseFromString(`<body>${html}</body>`, 'text/html')\n cleanNode(doc.body)\n return doc.body.innerHTML\n}\n"],"names":["ALLOWED_TAGS","ALLOWED_ATTRS","ALLOWED_STYLES","DROP_WITH_CONTENT","isSafeUrl","value","allowDataImage","url","char","cleanStyle","rule","part","prop","val","cleanNode","node","child","tag","allowed","attr","name","style","sanitizeHtml","html","doc"],"mappings":"gFAAA,MAAMA,MAAmB,IAAI,CAC3B,IAAK,IAAK,SAAU,IAAK,KAAM,IAAK,IAAK,SAAU,MAAO,IAAK,MAAO,OACtE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,aAAc,MAAO,MAAO,KAC9E,CAAC,EAEKC,EAA0C,CAC9C,EAAG,CAAC,OAAQ,SAAU,MAAO,QAAS,OAAO,EAC7C,IAAK,CAAC,MAAO,MAAO,QAAS,QAAS,SAAU,OAAO,CACzD,EAEMC,EAAiB,IAAI,IAAI,CAAC,aAAc,WAAW,CAAC,EACpDC,EAAoB,IAAI,IAAI,CAAC,SAAU,QAAS,SAAU,SAAU,QAAS,UAAU,CAAC,EAExFC,EAAY,CAACC,EAAeC,IAA4B,CAC5D,MAAMC,EAAM,MAAM,KAAKF,CAAK,EACzB,OAAQG,GAASA,EAAK,WAAW,CAAC,EAAI,EAAE,EACxC,KAAK,EAAE,EACV,OAAIF,GAAkB,0CAA0C,KAAKC,CAAG,EAAU,GAC3E,0CAA0C,KAAKA,CAAG,GAAK,CAAC,uBAAuB,KAAKA,CAAG,CAChG,EAEME,EAAcJ,GAClBA,EACG,MAAM,GAAG,EACT,IAAKK,GAASA,EAAK,MAAM,GAAG,EAAE,IAAKC,GAASA,EAAK,KAAA,CAAM,CAAC,EACxD,OACC,CAAC,CAACC,EAAMC,CAAG,IACTX,EAAe,IAAIU,GAAM,YAAA,CAAa,GAAKC,GAAO,eAAe,KAAKA,CAAG,CAC7E,EACC,IAAI,CAAC,CAACD,EAAMC,CAAG,IAAM,GAAGD,EAAK,YAAA,CAAa,KAAKC,CAAG,EAAE,EACpD,KAAK,IAAI,EAERC,EAAaC,GAAkB,CACnC,MAAM,KAAKA,EAAK,QAAQ,EAAE,QAASC,GAAU,CAC3C,MAAMC,EAAMD,EAAM,QAAQ,YAAA,EAE1B,GAAIb,EAAkB,IAAIc,CAAG,EAAG,CAC9BD,EAAM,OAAA,EACN,MACF,CAIA,GAFAF,EAAUE,CAAK,EAEX,CAAChB,EAAa,IAAIiB,CAAG,EAAG,CAC1BD,EAAM,YAAY,GAAG,MAAM,KAAKA,EAAM,UAAU,CAAC,EACjD,MACF,CAEA,MAAME,EAAUjB,EAAcgB,CAAG,GAAK,CAAA,EACtC,MAAM,KAAKD,EAAM,UAAU,EAAE,QAASG,GAAS,CAC7C,MAAMC,EAAOD,EAAK,KAAK,YAAA,EACvB,GAAIC,IAAS,QAAS,CACpB,MAAMC,EAAQZ,EAAWU,EAAK,KAAK,EAC/BE,EAAOL,EAAM,aAAa,QAASK,CAAK,EACvCL,EAAM,gBAAgB,OAAO,CACpC,MAAWI,IAAS,SACd,CAACF,EAAQ,SAAS,OAAO,GAAK,CAAC,aAAa,KAAKC,EAAK,KAAK,IAC7DH,EAAM,gBAAgBG,EAAK,IAAI,EAEvBD,EAAQ,SAASE,CAAI,GAG9BA,IAAS,QAAUA,IAAS,QAC7B,CAAChB,EAAUe,EAAK,MAAOF,IAAQ,KAAK,GAEpCD,EAAM,gBAAgBG,EAAK,IAAI,EAL/BH,EAAM,gBAAgBG,EAAK,IAAI,CAOnC,CAAC,EAEGF,IAAQ,KAAOD,EAAM,aAAa,QAAQ,IAAM,UAClDA,EAAM,aAAa,MAAO,qBAAqB,CAEnD,CAAC,CACH,EAGO,SAASM,EAAaC,EAAsB,CACjD,GAAI,CAACA,EAAM,MAAO,GAClB,MAAMC,EAAM,IAAI,UAAA,EAAY,gBAAgB,SAASD,CAAI,UAAW,WAAW,EAC/E,OAAAT,EAAUU,EAAI,IAAI,EACXA,EAAI,KAAK,SAClB"}
1
+ {"version":3,"file":"sanitize.cjs","sources":["../../../../src/components/RichTextEditor/sanitize.ts"],"sourcesContent":["const ALLOWED_TAGS = new Set([\n 'a', 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'del', 'p', 'div', 'span',\n 'br', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'blockquote', 'img', 'sub', 'sup',\n 'table', 'thead', 'tbody', 'tfoot', 'tr', 'td', 'th', 'colgroup', 'col',\n])\n\nconst ALLOWED_ATTRS: Record<string, string[]> = {\n a: ['href', 'target', 'rel', 'title', 'class'],\n img: ['src', 'alt', 'title', 'width', 'height', 'class'],\n table: ['border', 'cellpadding', 'cellspacing', 'width', 'class'],\n td: ['colspan', 'rowspan'],\n th: ['colspan', 'rowspan'],\n col: ['span'],\n colgroup: ['span'],\n}\n\nconst ALLOWED_STYLES = new Set(['text-align', 'font-size', 'border-collapse', 'width'])\nconst DROP_WITH_CONTENT = new Set(['script', 'style', 'iframe', 'object', 'embed', 'noscript'])\n\nconst isSafeUrl = (value: string, allowDataImage: boolean) => {\n const url = Array.from(value)\n .filter((char) => char.charCodeAt(0) > 32)\n .join('')\n if (allowDataImage && /^data:image\\/(png|jpe?g|gif|webp|bmp);/i.test(url)) return true\n return /^(https?:|mailto:|tel:|\\/|#|\\.{1,2}\\/)/i.test(url) || !/^[a-z][a-z0-9+.-]*:/i.test(url)\n}\n\nconst cleanStyle = (value: string) =>\n value\n .split(';')\n .map((rule) => rule.split(':').map((part) => part.trim()))\n .filter(\n ([prop, val]) =>\n ALLOWED_STYLES.has(prop?.toLowerCase()) && val && /^[\\w\\s.%-]+$/.test(val),\n )\n .map(([prop, val]) => `${prop.toLowerCase()}: ${val}`)\n .join('; ')\n\nconst cleanNode = (node: Element) => {\n Array.from(node.children).forEach((child) => {\n const tag = child.tagName.toLowerCase()\n\n if (DROP_WITH_CONTENT.has(tag)) {\n child.remove()\n return\n }\n\n cleanNode(child)\n\n if (!ALLOWED_TAGS.has(tag)) {\n child.replaceWith(...Array.from(child.childNodes))\n return\n }\n\n const allowed = ALLOWED_ATTRS[tag] ?? []\n Array.from(child.attributes).forEach((attr) => {\n const name = attr.name.toLowerCase()\n if (name === 'style') {\n const style = cleanStyle(attr.value)\n if (style) child.setAttribute('style', style)\n else child.removeAttribute('style')\n } else if (name === 'class') {\n if (!allowed.includes('class') || !/^[\\w\\s-]+$/.test(attr.value)) {\n child.removeAttribute(attr.name)\n }\n } else if (!allowed.includes(name)) {\n child.removeAttribute(attr.name)\n } else if (\n (name === 'href' || name === 'src') &&\n !isSafeUrl(attr.value, tag === 'img')\n ) {\n child.removeAttribute(attr.name)\n }\n })\n\n if (tag === 'a' && child.getAttribute('target') === '_blank') {\n child.setAttribute('rel', 'noopener noreferrer')\n }\n })\n}\n\n/** HTML'i izin verilen etiket/özelliklerle sınırlar (script, on* olayları, javascript: vb. temizlenir). */\nexport function sanitizeHtml(html: string): string {\n if (!html) return ''\n const doc = new DOMParser().parseFromString(`<body>${html}</body>`, 'text/html')\n cleanNode(doc.body)\n return doc.body.innerHTML\n}\n"],"names":["ALLOWED_TAGS","ALLOWED_ATTRS","ALLOWED_STYLES","DROP_WITH_CONTENT","isSafeUrl","value","allowDataImage","url","char","cleanStyle","rule","part","prop","val","cleanNode","node","child","tag","allowed","attr","name","style","sanitizeHtml","html","doc"],"mappings":"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"}