inconel 0.1.42 → 0.1.43
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.
- package/dist/cjs/components/RichTextEditor/RichTextEditor.cjs +1 -1
- package/dist/cjs/components/RichTextEditor/RichTextEditor.cjs.map +1 -1
- package/dist/components/RichTextEditor/RichTextEditor.d.ts +4 -1
- package/dist/components/RichTextEditor/RichTextEditor.d.ts.map +1 -1
- package/dist/components/RichTextEditor/RichTextEditor.js +249 -248
- package/dist/components/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/components/RichTextEditor/index.d.ts +1 -1
- package/dist/components/RichTextEditor/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
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;
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("react/jsx-runtime"),i=require("react"),je=require("../FieldFeedback/FieldFeedback.cjs");;/* empty css */;/* empty css */const a=require("./icons.cjs"),x=require("./sanitize.cjs"),Se=[{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ı"}],_e=[12,14,16,18,24,32],Ce=new Set(["justifyLeft","justifyCenter","justifyRight","justifyFull"]),ve=m=>new Promise((b,j)=>{const s=new FileReader;s.onload=()=>b(String(s.result)),s.onerror=()=>j(s.error),s.readAsDataURL(m)});function R({label:m,onClick:b,disabled:j,active:s,children:L}){return n.jsx("button",{type:"button",className:`inconel-rte__btn${s?" inconel-is-active":""}`,"aria-label":m,title:m,"aria-pressed":s,disabled:j,onMouseDown:E=>E.preventDefault(),onClick:b,children:L})}function Ne({value:m="",onChange:b,onBlur:j,label:s,placeholder:L,id:E,disabled:h=!1,required:q,fullWidth:ee=!0,className:te,minHeight:B=200,onImageUpload:I,onRequestMedia:O,excludeTools:ne=[],hint:U,errorMessage:S}){const le=i.useId(),_=E??`inconel-rte-${le.replace(/:/g,"")}`,P=`${_}-hint`,G=`${_}-error`,d=i.useRef(null),F=i.useRef(null),C=i.useRef(null),[f,ae]=i.useState(!1),[$,W]=i.useState(""),[u,v]=i.useState(null),[K,J]=i.useState(""),[ie,oe]=i.useState({}),[re,z]=i.useState(!m),[se,Y]=i.useState(!1),[p,Z]=i.useState({rows:3,cols:3});i.useEffect(()=>{const e=d.current;if(!e||m===C.current)return;const t=x.sanitizeHtml(m);e.innerHTML!==t&&(e.innerHTML=t),C.current=m,z(!e.textContent&&!e.querySelector("img"))},[m,f]);const g=i.useCallback(()=>{const e=d.current;if(!e)return;const t=!!e.textContent||!!e.querySelector("img"),l=t?x.sanitizeHtml(e.innerHTML):"";z(!t),C.current=l,b?.(l)},[b]),y=()=>{const e=window.getSelection(),t=d.current;e&&e.rangeCount>0&&t?.contains(e.getRangeAt(0).commonAncestorContainer)&&(F.current=e.getRangeAt(0).cloneRange())},T=()=>{d.current?.focus();const e=window.getSelection();e&&F.current&&(e.removeAllRanges(),e.addRange(F.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},A=()=>{Y(!!Q());const e=t=>{try{return document.queryCommandState(t)}catch{return!1}};oe({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")})},N=(e,t)=>{T(),document.execCommand("styleWithCSS",!1,Ce.has(e)?"true":"false"),document.execCommand(e,!1,t),y(),A(),g()},ce=e=>{T(),document.execCommand("styleWithCSS",!1,"false"),document.execCommand("fontSize",!1,"7"),d.current?.querySelectorAll('font[size="7"]').forEach(t=>{const l=document.createElement("span");l.style.fontSize=`${e}px`,l.append(...Array.from(t.childNodes)),t.replaceWith(l)}),y(),g()},de=e=>{T();const t=Q(),l=t?.parentElement,r=t?.closest("table");if(!t||!l||!r)return;const D=t.cellIndex,X=c=>{const k=document.createElement(c.tagName);return k.innerHTML="<br>",k};if(e==="addRow"){const c=document.createElement("tr");Array.from(l.cells).forEach(k=>c.append(X(k.tagName==="TH"?document.createElement("td"):k))),l.parentElement?.tagName==="THEAD"?(r.tBodies[0]??r.appendChild(document.createElement("tbody"))).prepend(c):l.after(c)}else e==="delRow"?(l.remove(),r.rows.length||r.remove()):e==="addCol"?Array.from(r.rows).forEach(c=>c.cells[D]?.after(X(c.cells[D]))):e==="delCol"?(Array.from(r.rows).forEach(c=>c.cells[D]?.remove()),Array.from(r.rows).some(c=>c.cells.length)||r.remove()):r.remove();Y(!1),g()},ue=()=>{const e=Math.min(Math.max(p.rows,1),20),t=Math.min(Math.max(p.cols,1),10),r=`<tr>${"<td><br></td>".repeat(t)}</tr>`.repeat(e);V(`<table border="1" width="100%" cellspacing="0" cellpadding="6"><tbody>${r}</tbody></table><p><br></p>`),v(null)},V=e=>{T(),document.execCommand("insertHTML",!1,x.sanitizeHtml(e)),y(),g()},me=e=>{y(),J(""),v(u===e?null:e)},M=()=>{if(u==="table"){ue();return}const e=K.trim();e&&(u==="link"?(N("createLink",e),d.current?.querySelectorAll("a").forEach(t=>{/^https?:/i.test(t.getAttribute("href")??"")&&(t.setAttribute("target","_blank"),t.setAttribute("rel","noopener noreferrer"))}),g()):u==="image"&&N("insertImage",e),v(null))},fe=async e=>{const t=e.target.files?.[0];if(e.target.value="",!t||!t.type.startsWith("image/"))return;const l=I?await I(t):await ve(t);N("insertImage",l),v(null)},ye=e=>{const t=e.clipboardData.getData("text/html");t&&(e.preventDefault(),document.execCommand("insertHTML",!1,x.sanitizeHtml(t)),g())},be=()=>{if(f){const e=x.sanitizeHtml($);C.current=null,d.current&&(d.current.innerHTML=e),C.current=e,z(!e),b?.(e)}else W(x.sanitizeHtml(d.current?.innerHTML??""));v(null),ae(!f)},he=[U&&!S?P:void 0,S?G:void 0].filter(Boolean).join(" ")||void 0,w=h||f,o=(e,t,l,r)=>n.jsx(R,{label:t,active:ie[e],disabled:w,onClick:()=>N(e,r),children:l}),ge=n.jsxs("select",{className:"inconel-rte__select","aria-label":"Biçim",disabled:w,value:"",onChange:e=>{e.target.value&&N("formatBlock",e.target.value)},children:[n.jsx("option",{value:"",children:"Biçim"}),Se.map(e=>n.jsx("option",{value:e.tag,children:e.label},e.tag))]}),pe=n.jsxs("select",{className:"inconel-rte__select","aria-label":"Yazı boyutu",disabled:w,value:"",onChange:e=>{e.target.value&&ce(Number(e.target.value))},children:[n.jsx("option",{value:"",children:"Boyut"}),_e.map(e=>n.jsxs("option",{value:e,children:[e,"px"]},e))]}),H=(e,t,l)=>n.jsx(R,{label:e,disabled:w,active:u===t,onClick:()=>me(t),children:l}),ke=new Set(ne),xe=[[{key:"bold",node:o("bold","Kalın",a.icons.bold)},{key:"italic",node:o("italic","İtalik",a.icons.italic)},{key:"underline",node:o("underline","Altı çizili",a.icons.underline)},{key:"strikethrough",node:o("strikeThrough","Üstü çizili",a.icons.strike)}],[{key:"blockFormat",node:ge},{key:"fontSize",node:pe}],[{key:"alignLeft",node:o("justifyLeft","Sola hizala",a.icons.alignLeft)},{key:"alignCenter",node:o("justifyCenter","Ortala",a.icons.alignCenter)},{key:"alignRight",node:o("justifyRight","Sağa hizala",a.icons.alignRight)},{key:"alignJustify",node:o("justifyFull","İki yana yasla",a.icons.alignJustify)}],[{key:"unorderedList",node:o("insertUnorderedList","Madde işaretli liste",a.icons.listUl)},{key:"orderedList",node:o("insertOrderedList","Numaralı liste",a.icons.listOl)},{key:"outdent",node:o("outdent","Girintiyi azalt",a.icons.outdent)},{key:"indent",node:o("indent","Girintiyi artır",a.icons.indent)},{key:"clearFormat",node:o("removeFormat","Biçimi temizle",a.icons.clearFormat)}],[{key:"link",node:H("Bağlantı ekle","link",a.icons.link)},{key:"table",node:H("Tablo ekle","table",a.icons.table)},{key:"image",node:H("Görsel ekle","image",a.icons.image)},...O?[{key:"media",node:n.jsx(R,{label:"Medya galerisi",disabled:w,onClick:()=>{y(),O(V)},children:a.icons.gallery})}]:[]],[{key:"undo",node:o("undo","Geri al",a.icons.undo)},{key:"redo",node:o("redo","Yinele",a.icons.redo)},{key:"source",node:n.jsx(R,{label:"HTML kaynağı",disabled:h,active:f,onClick:be,children:a.icons.code})}]].map(e=>e.filter(t=>!ke.has(t.key))).filter(e=>e.length>0);return n.jsxs("div",{className:["inconel-field",ee?"inconel-field--full-width":"",te??""].join(" "),children:[s&&n.jsxs("label",{className:"inconel-field__label",htmlFor:_,children:[s,q&&n.jsx("span",{"aria-hidden":"true",children:" *"})]}),n.jsxs("div",{className:["inconel-rte",S?"inconel-is-invalid":"",h?"inconel-is-disabled":""].join(" "),children:[n.jsx("div",{className:"inconel-rte__toolbar",role:"toolbar","aria-label":"Biçimlendirme",children:xe.map((e,t)=>n.jsxs(i.Fragment,{children:[t>0&&n.jsx("span",{className:"inconel-rte__sep"}),e.map(l=>n.jsx(i.Fragment,{children:l.node},l.key))]},t))}),u==="table"&&!f&&n.jsxs("div",{className:"inconel-rte__panel",children:[n.jsxs("label",{className:"inconel-rte__field",children:["Satır",n.jsx("input",{type:"number",min:1,max:20,className:"inconel-rte__input inconel-rte__input--num",value:p.rows,onChange:e=>Z({...p,rows:Number(e.target.value)})})]}),n.jsxs("label",{className:"inconel-rte__field",children:["Sütun",n.jsx("input",{type:"number",min:1,max:10,className:"inconel-rte__input inconel-rte__input--num",value:p.cols,onChange:e=>Z({...p,cols:Number(e.target.value)})})]}),n.jsx("button",{type:"button",className:"inconel-rte__action",onClick:M,children:"Tablo ekle"})]}),se&&!f&&!h&&n.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,t])=>n.jsx("button",{type:"button",className:"inconel-rte__action",onMouseDown:l=>l.preventDefault(),onClick:()=>de(e),children:t},e))}),u&&u!=="table"&&!f&&n.jsxs("div",{className:"inconel-rte__panel",children:[n.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:K,autoFocus:!0,onChange:e=>J(e.target.value),onKeyDown:e=>{e.key==="Enter"&&(e.preventDefault(),M())}}),n.jsx("button",{type:"button",className:"inconel-rte__action",onClick:M,children:"Ekle"}),u==="image"&&n.jsxs("label",{className:"inconel-rte__action",children:["Dosya seç",n.jsx("input",{type:"file",accept:"image/*",hidden:!0,"aria-label":"Görsel dosyası",onChange:fe})]})]}),f?n.jsx("textarea",{id:_,className:"inconel-rte__source",style:{minHeight:B},"aria-label":s??"HTML kaynağı",value:$,disabled:h,spellCheck:!1,onChange:e=>W(e.target.value)}):n.jsxs("div",{className:"inconel-rte__surface",style:{minHeight:B},children:[re&&L&&n.jsx("span",{className:"inconel-rte__placeholder","aria-hidden":"true",children:L}),n.jsx("div",{ref:d,id:_,className:"inconel-rte__content",role:"textbox","aria-multiline":"true","aria-label":s,"aria-required":q,"aria-invalid":!!S,"aria-describedby":he,"aria-disabled":h,contentEditable:!h,suppressContentEditableWarning:!0,style:{minHeight:B},onInput:g,onPaste:ye,onKeyUp:()=>{y(),A()},onMouseUp:()=>{y(),A()},onBlur:()=>{y(),j?.()}})]})]}),n.jsx(je.default,{hint:U,errorMessage:S,hintId:P,errorId:G})]})}exports.default=Ne;
|
|
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' | '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
|
+
{"version":3,"file":"RichTextEditor.cjs","sources":["../../../../src/components/RichTextEditor/RichTextEditor.tsx"],"sourcesContent":["import {\n Fragment,\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 type RichTextTool =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strikethrough'\n | 'blockFormat'\n | 'fontSize'\n | 'alignLeft'\n | 'alignCenter'\n | 'alignRight'\n | 'alignJustify'\n | 'unorderedList'\n | 'orderedList'\n | 'outdent'\n | 'indent'\n | 'clearFormat'\n | 'link'\n | 'table'\n | 'image'\n | 'media'\n | 'undo'\n | 'redo'\n | 'source'\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 /** Araç çubuğundan çıkarılacak araçlar, ör. `['table', 'source', 'fontSize']`. */\n excludeTools?: RichTextTool[]\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 excludeTools = [],\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 const blockSelect = (\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 )\n\n const fontSizeSelect = (\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 )\n\n const panelButton = (label: string, target: Exclude<Panel, null>, content: ReactNode) => (\n <ToolButton\n label={label}\n disabled={toolsDisabled}\n active={panel === target}\n onClick={() => openPanel(target)}\n >\n {content}\n </ToolButton>\n )\n\n // Her grup bir ayraçla ayrılır; `excludeTools` ile çıkarılan araçlar ve boş kalan gruplar gösterilmez.\n const excluded = new Set(excludeTools)\n const groups = (\n [\n [\n { key: 'bold', node: btn('bold', 'Kalın', icons.bold) },\n { key: 'italic', node: btn('italic', 'İtalik', icons.italic) },\n { key: 'underline', node: btn('underline', 'Altı çizili', icons.underline) },\n { key: 'strikethrough', node: btn('strikeThrough', 'Üstü çizili', icons.strike) },\n ],\n [\n { key: 'blockFormat', node: blockSelect },\n { key: 'fontSize', node: fontSizeSelect },\n ],\n [\n { key: 'alignLeft', node: btn('justifyLeft', 'Sola hizala', icons.alignLeft) },\n { key: 'alignCenter', node: btn('justifyCenter', 'Ortala', icons.alignCenter) },\n { key: 'alignRight', node: btn('justifyRight', 'Sağa hizala', icons.alignRight) },\n { key: 'alignJustify', node: btn('justifyFull', 'İki yana yasla', icons.alignJustify) },\n ],\n [\n { key: 'unorderedList', node: btn('insertUnorderedList', 'Madde işaretli liste', icons.listUl) },\n { key: 'orderedList', node: btn('insertOrderedList', 'Numaralı liste', icons.listOl) },\n { key: 'outdent', node: btn('outdent', 'Girintiyi azalt', icons.outdent) },\n { key: 'indent', node: btn('indent', 'Girintiyi artır', icons.indent) },\n { key: 'clearFormat', node: btn('removeFormat', 'Biçimi temizle', icons.clearFormat) },\n ],\n [\n { key: 'link', node: panelButton('Bağlantı ekle', 'link', icons.link) },\n { key: 'table', node: panelButton('Tablo ekle', 'table', icons.table) },\n { key: 'image', node: panelButton('Görsel ekle', 'image', icons.image) },\n ...(onRequestMedia\n ? [\n {\n key: 'media',\n node: (\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 },\n ]\n : []),\n ],\n [\n { key: 'undo', node: btn('undo', 'Geri al', icons.undo) },\n { key: 'redo', node: btn('redo', 'Yinele', icons.redo) },\n {\n key: 'source',\n node: (\n <ToolButton\n label=\"HTML kaynağı\"\n disabled={disabled}\n active={sourceMode}\n onClick={toggleSource}\n >\n {icons.code}\n </ToolButton>\n ),\n },\n ],\n ] as { key: RichTextTool; node: ReactNode }[][]\n )\n .map((group) => group.filter((item) => !excluded.has(item.key)))\n .filter((group) => group.length > 0)\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 {groups.map((group, index) => (\n <Fragment key={index}>\n {index > 0 && <span className=\"inconel-rte__sep\" />}\n {group.map((item) => (\n <Fragment key={item.key}>{item.node}</Fragment>\n ))}\n </Fragment>\n ))}\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","excludeTools","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","blockSelect","jsxs","block","fontSizeSelect","size","panelButton","excluded","groups","icons","group","item","Fragment","FieldFeedback"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { FieldFeedbackContentProps } from '../FieldFeedback/FieldFeedback';
|
|
2
|
+
export type RichTextTool = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'blockFormat' | 'fontSize' | 'alignLeft' | 'alignCenter' | 'alignRight' | 'alignJustify' | 'unorderedList' | 'orderedList' | 'outdent' | 'indent' | 'clearFormat' | 'link' | 'table' | 'image' | 'media' | 'undo' | 'redo' | 'source';
|
|
2
3
|
export interface RichTextEditorProps extends FieldFeedbackContentProps {
|
|
3
4
|
value?: string;
|
|
4
5
|
onChange?: (html: string) => void;
|
|
@@ -19,6 +20,8 @@ export interface RichTextEditorProps extends FieldFeedbackContentProps {
|
|
|
19
20
|
* uygulama kendi medya kütüphanesini açıp seçilen içeriği `insert(html)` ile ekler.
|
|
20
21
|
*/
|
|
21
22
|
onRequestMedia?: (insert: (html: string) => void) => void;
|
|
23
|
+
/** Araç çubuğundan çıkarılacak araçlar, ör. `['table', 'source', 'fontSize']`. */
|
|
24
|
+
excludeTools?: RichTextTool[];
|
|
22
25
|
}
|
|
23
|
-
export default function RichTextEditor({ value, onChange, onBlur, label, placeholder, id, disabled, required, fullWidth, className, minHeight, onImageUpload, onRequestMedia, hint, errorMessage, }: RichTextEditorProps): import("react").JSX.Element;
|
|
26
|
+
export default function RichTextEditor({ value, onChange, onBlur, label, placeholder, id, disabled, required, fullWidth, className, minHeight, onImageUpload, onRequestMedia, excludeTools, hint, errorMessage, }: RichTextEditorProps): import("react").JSX.Element;
|
|
24
27
|
//# sourceMappingURL=RichTextEditor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichTextEditor.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextEditor.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RichTextEditor.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextEditor.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,qBAAqB,CAAA;AAC5B,OAAO,cAAc,CAAA;AAIrB,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,QAAQ,GACR,WAAW,GACX,eAAe,GACf,aAAa,GACb,UAAU,GACV,WAAW,GACX,aAAa,GACb,YAAY,GACZ,cAAc,GACd,eAAe,GACf,aAAa,GACb,SAAS,GACT,QAAQ,GACR,aAAa,GACb,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,QAAQ,CAAA;AAEZ,MAAM,WAAW,mBAAoB,SAAQ,yBAAyB;IACpE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qGAAqG;IACrG,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC/C;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAA;IACzD,kFAAkF;IAClF,YAAY,CAAC,EAAE,YAAY,EAAE,CAAA;CAC9B;AAiDD,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,KAAU,EACV,QAAQ,EACR,MAAM,EACN,KAAK,EACL,WAAW,EACX,EAAE,EACF,QAAgB,EAChB,QAAQ,EACR,SAAgB,EAChB,SAAS,EACT,SAAe,EACf,aAAa,EACb,cAAc,EACd,YAAiB,EACjB,IAAI,EACJ,YAAY,GACb,EAAE,mBAAmB,+BAmiBrB"}
|
|
@@ -1,75 +1,76 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useId as
|
|
3
|
-
import
|
|
1
|
+
import { jsxs as s, jsx as l } from "react/jsx-runtime";
|
|
2
|
+
import { useId as Ne, useRef as O, useState as h, useEffect as we, useCallback as Le, Fragment as ne } from "react";
|
|
3
|
+
import Te from "../FieldFeedback/FieldFeedback.js";
|
|
4
4
|
/* empty css */
|
|
5
5
|
/* empty css */
|
|
6
6
|
import { icons as a } from "./icons.js";
|
|
7
|
-
import { sanitizeHtml as
|
|
8
|
-
const
|
|
7
|
+
import { sanitizeHtml as C } from "./sanitize.js";
|
|
8
|
+
const xe = [
|
|
9
9
|
{ tag: "p", label: "Paragraf" },
|
|
10
10
|
{ tag: "h1", label: "Başlık 1" },
|
|
11
11
|
{ tag: "h2", label: "Başlık 2" },
|
|
12
12
|
{ tag: "h3", label: "Başlık 3" },
|
|
13
13
|
{ tag: "blockquote", label: "Alıntı" }
|
|
14
|
-
],
|
|
15
|
-
const
|
|
16
|
-
|
|
14
|
+
], Ee = [12, 14, 16, 18, 24, 32], Be = /* @__PURE__ */ new Set(["justifyLeft", "justifyCenter", "justifyRight", "justifyFull"]), Re = (m) => new Promise((b, S) => {
|
|
15
|
+
const i = new FileReader();
|
|
16
|
+
i.onload = () => b(String(i.result)), i.onerror = () => S(i.error), i.readAsDataURL(m);
|
|
17
17
|
});
|
|
18
|
-
function
|
|
19
|
-
return /* @__PURE__ */
|
|
18
|
+
function R({ label: m, onClick: b, disabled: S, active: i, children: E }) {
|
|
19
|
+
return /* @__PURE__ */ l(
|
|
20
20
|
"button",
|
|
21
21
|
{
|
|
22
22
|
type: "button",
|
|
23
|
-
className: `inconel-rte__btn${
|
|
23
|
+
className: `inconel-rte__btn${i ? " inconel-is-active" : ""}`,
|
|
24
24
|
"aria-label": m,
|
|
25
25
|
title: m,
|
|
26
|
-
"aria-pressed":
|
|
26
|
+
"aria-pressed": i,
|
|
27
27
|
disabled: S,
|
|
28
|
-
onMouseDown: (
|
|
29
|
-
onClick:
|
|
30
|
-
children:
|
|
28
|
+
onMouseDown: (j) => j.preventDefault(),
|
|
29
|
+
onClick: b,
|
|
30
|
+
children: E
|
|
31
31
|
}
|
|
32
32
|
);
|
|
33
33
|
}
|
|
34
|
-
function
|
|
34
|
+
function Ie({
|
|
35
35
|
value: m = "",
|
|
36
|
-
onChange:
|
|
36
|
+
onChange: b,
|
|
37
37
|
onBlur: S,
|
|
38
|
-
label:
|
|
39
|
-
placeholder:
|
|
40
|
-
id:
|
|
41
|
-
disabled:
|
|
38
|
+
label: i,
|
|
39
|
+
placeholder: E,
|
|
40
|
+
id: j,
|
|
41
|
+
disabled: p = !1,
|
|
42
42
|
required: U,
|
|
43
|
-
fullWidth:
|
|
44
|
-
className:
|
|
43
|
+
fullWidth: le = !0,
|
|
44
|
+
className: ae,
|
|
45
45
|
minHeight: A = 200,
|
|
46
46
|
onImageUpload: G,
|
|
47
47
|
onRequestMedia: P,
|
|
48
|
+
excludeTools: re = [],
|
|
48
49
|
hint: $,
|
|
49
|
-
errorMessage:
|
|
50
|
+
errorMessage: v
|
|
50
51
|
}) {
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
const e =
|
|
54
|
-
if (!e || m ===
|
|
55
|
-
const t =
|
|
56
|
-
e.innerHTML !== t && (e.innerHTML = t),
|
|
52
|
+
const oe = Ne(), N = j ?? `inconel-rte-${oe.replace(/:/g, "")}`, q = `${N}-hint`, W = `${N}-error`, d = O(null), F = O(null), w = O(null), [f, ie] = h(!1), [K, J] = h(""), [u, L] = h(null), [Y, Z] = h(""), [se, ce] = h({}), [de, M] = h(!m), [ue, Q] = h(!1), [k, V] = h({ rows: 3, cols: 3 });
|
|
53
|
+
we(() => {
|
|
54
|
+
const e = d.current;
|
|
55
|
+
if (!e || m === w.current) return;
|
|
56
|
+
const t = C(m);
|
|
57
|
+
e.innerHTML !== t && (e.innerHTML = t), w.current = m, M(!e.textContent && !e.querySelector("img"));
|
|
57
58
|
}, [m, f]);
|
|
58
|
-
const g =
|
|
59
|
-
const e =
|
|
59
|
+
const g = Le(() => {
|
|
60
|
+
const e = d.current;
|
|
60
61
|
if (!e) return;
|
|
61
|
-
const t = !!e.textContent || !!e.querySelector("img"),
|
|
62
|
-
|
|
63
|
-
}, [
|
|
64
|
-
const e = window.getSelection(), t =
|
|
65
|
-
e && e.rangeCount > 0 && t?.contains(e.getRangeAt(0).commonAncestorContainer) && (
|
|
62
|
+
const t = !!e.textContent || !!e.querySelector("img"), n = t ? C(e.innerHTML) : "";
|
|
63
|
+
M(!t), w.current = n, b?.(n);
|
|
64
|
+
}, [b]), y = () => {
|
|
65
|
+
const e = window.getSelection(), t = d.current;
|
|
66
|
+
e && e.rangeCount > 0 && t?.contains(e.getRangeAt(0).commonAncestorContainer) && (F.current = e.getRangeAt(0).cloneRange());
|
|
66
67
|
}, B = () => {
|
|
67
|
-
|
|
68
|
+
d.current?.focus();
|
|
68
69
|
const e = window.getSelection();
|
|
69
|
-
e &&
|
|
70
|
+
e && F.current && (e.removeAllRanges(), e.addRange(F.current));
|
|
70
71
|
}, X = () => {
|
|
71
|
-
const e = window.getSelection()?.anchorNode,
|
|
72
|
-
return
|
|
72
|
+
const e = window.getSelection()?.anchorNode, n = (e instanceof Element ? e : e?.parentElement)?.closest("td, th") ?? null;
|
|
73
|
+
return n && d.current?.contains(n) ? n : null;
|
|
73
74
|
}, D = () => {
|
|
74
75
|
Q(!!X());
|
|
75
76
|
const e = (t) => {
|
|
@@ -79,7 +80,7 @@ function Re({
|
|
|
79
80
|
return !1;
|
|
80
81
|
}
|
|
81
82
|
};
|
|
82
|
-
|
|
83
|
+
ce({
|
|
83
84
|
bold: e("bold"),
|
|
84
85
|
italic: e("italic"),
|
|
85
86
|
underline: e("underline"),
|
|
@@ -91,256 +92,256 @@ function Re({
|
|
|
91
92
|
insertUnorderedList: e("insertUnorderedList"),
|
|
92
93
|
insertOrderedList: e("insertOrderedList")
|
|
93
94
|
});
|
|
94
|
-
},
|
|
95
|
-
B(), document.execCommand("styleWithCSS", !1,
|
|
96
|
-
},
|
|
97
|
-
B(), document.execCommand("styleWithCSS", !1, "false"), document.execCommand("fontSize", !1, "7"),
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
}),
|
|
101
|
-
},
|
|
95
|
+
}, T = (e, t) => {
|
|
96
|
+
B(), document.execCommand("styleWithCSS", !1, Be.has(e) ? "true" : "false"), document.execCommand(e, !1, t), y(), D(), g();
|
|
97
|
+
}, me = (e) => {
|
|
98
|
+
B(), document.execCommand("styleWithCSS", !1, "false"), document.execCommand("fontSize", !1, "7"), d.current?.querySelectorAll('font[size="7"]').forEach((t) => {
|
|
99
|
+
const n = document.createElement("span");
|
|
100
|
+
n.style.fontSize = `${e}px`, n.append(...Array.from(t.childNodes)), t.replaceWith(n);
|
|
101
|
+
}), y(), g();
|
|
102
|
+
}, fe = (e) => {
|
|
102
103
|
B();
|
|
103
|
-
const t = X(),
|
|
104
|
-
if (!t || !
|
|
105
|
-
const I = t.cellIndex, te = (
|
|
106
|
-
const
|
|
107
|
-
return
|
|
104
|
+
const t = X(), n = t?.parentElement, o = t?.closest("table");
|
|
105
|
+
if (!t || !n || !o) return;
|
|
106
|
+
const I = t.cellIndex, te = (c) => {
|
|
107
|
+
const _ = document.createElement(c.tagName);
|
|
108
|
+
return _.innerHTML = "<br>", _;
|
|
108
109
|
};
|
|
109
110
|
if (e === "addRow") {
|
|
110
|
-
const
|
|
111
|
-
Array.from(
|
|
112
|
-
} else e === "delRow" ? (
|
|
111
|
+
const c = document.createElement("tr");
|
|
112
|
+
Array.from(n.cells).forEach((_) => c.append(te(_.tagName === "TH" ? document.createElement("td") : _))), n.parentElement?.tagName === "THEAD" ? (o.tBodies[0] ?? o.appendChild(document.createElement("tbody"))).prepend(c) : n.after(c);
|
|
113
|
+
} else e === "delRow" ? (n.remove(), o.rows.length || o.remove()) : e === "addCol" ? Array.from(o.rows).forEach((c) => c.cells[I]?.after(te(c.cells[I]))) : e === "delCol" ? (Array.from(o.rows).forEach((c) => c.cells[I]?.remove()), Array.from(o.rows).some((c) => c.cells.length) || o.remove()) : o.remove();
|
|
113
114
|
Q(!1), g();
|
|
114
|
-
},
|
|
115
|
-
const e = Math.min(Math.max(
|
|
115
|
+
}, ye = () => {
|
|
116
|
+
const e = Math.min(Math.max(k.rows, 1), 20), t = Math.min(Math.max(k.cols, 1), 10), o = `<tr>${"<td><br></td>".repeat(t)}</tr>`.repeat(e);
|
|
116
117
|
ee(
|
|
117
|
-
`<table border="1" width="100%" cellspacing="0" cellpadding="6"><tbody>${
|
|
118
|
-
),
|
|
118
|
+
`<table border="1" width="100%" cellspacing="0" cellpadding="6"><tbody>${o}</tbody></table><p><br></p>`
|
|
119
|
+
), L(null);
|
|
119
120
|
}, ee = (e) => {
|
|
120
|
-
B(), document.execCommand("insertHTML", !1,
|
|
121
|
-
},
|
|
122
|
-
|
|
121
|
+
B(), document.execCommand("insertHTML", !1, C(e)), y(), g();
|
|
122
|
+
}, he = (e) => {
|
|
123
|
+
y(), Z(""), L(u === e ? null : e);
|
|
123
124
|
}, z = () => {
|
|
124
|
-
if (
|
|
125
|
-
|
|
125
|
+
if (u === "table") {
|
|
126
|
+
ye();
|
|
126
127
|
return;
|
|
127
128
|
}
|
|
128
|
-
const e =
|
|
129
|
-
e && (
|
|
129
|
+
const e = Y.trim();
|
|
130
|
+
e && (u === "link" ? (T("createLink", e), d.current?.querySelectorAll("a").forEach((t) => {
|
|
130
131
|
/^https?:/i.test(t.getAttribute("href") ?? "") && (t.setAttribute("target", "_blank"), t.setAttribute("rel", "noopener noreferrer"));
|
|
131
|
-
}), g()) :
|
|
132
|
-
},
|
|
132
|
+
}), g()) : u === "image" && T("insertImage", e), L(null));
|
|
133
|
+
}, be = async (e) => {
|
|
133
134
|
const t = e.target.files?.[0];
|
|
134
135
|
if (e.target.value = "", !t || !t.type.startsWith("image/")) return;
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
},
|
|
136
|
+
const n = G ? await G(t) : await Re(t);
|
|
137
|
+
T("insertImage", n), L(null);
|
|
138
|
+
}, pe = (e) => {
|
|
138
139
|
const t = e.clipboardData.getData("text/html");
|
|
139
|
-
t && (e.preventDefault(), document.execCommand("insertHTML", !1,
|
|
140
|
-
},
|
|
140
|
+
t && (e.preventDefault(), document.execCommand("insertHTML", !1, C(t)), g());
|
|
141
|
+
}, ge = () => {
|
|
141
142
|
if (f) {
|
|
142
|
-
const e =
|
|
143
|
-
|
|
143
|
+
const e = C(K);
|
|
144
|
+
w.current = null, d.current && (d.current.innerHTML = e), w.current = e, M(!e), b?.(e);
|
|
144
145
|
} else
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
},
|
|
148
|
-
|
|
146
|
+
J(C(d.current?.innerHTML ?? ""));
|
|
147
|
+
L(null), ie(!f);
|
|
148
|
+
}, ke = [$ && !v ? q : void 0, v ? W : void 0].filter(Boolean).join(" ") || void 0, x = p || f, r = (e, t, n, o) => /* @__PURE__ */ l(
|
|
149
|
+
R,
|
|
149
150
|
{
|
|
150
151
|
label: t,
|
|
151
|
-
active:
|
|
152
|
-
disabled:
|
|
153
|
-
onClick: () =>
|
|
154
|
-
children:
|
|
152
|
+
active: se[e],
|
|
153
|
+
disabled: x,
|
|
154
|
+
onClick: () => T(e, o),
|
|
155
|
+
children: n
|
|
155
156
|
}
|
|
156
|
-
)
|
|
157
|
-
|
|
157
|
+
), _e = /* @__PURE__ */ s(
|
|
158
|
+
"select",
|
|
159
|
+
{
|
|
160
|
+
className: "inconel-rte__select",
|
|
161
|
+
"aria-label": "Biçim",
|
|
162
|
+
disabled: x,
|
|
163
|
+
value: "",
|
|
164
|
+
onChange: (e) => {
|
|
165
|
+
e.target.value && T("formatBlock", e.target.value);
|
|
166
|
+
},
|
|
167
|
+
children: [
|
|
168
|
+
/* @__PURE__ */ l("option", { value: "", children: "Biçim" }),
|
|
169
|
+
xe.map((e) => /* @__PURE__ */ l("option", { value: e.tag, children: e.label }, e.tag))
|
|
170
|
+
]
|
|
171
|
+
}
|
|
172
|
+
), Ce = /* @__PURE__ */ s(
|
|
173
|
+
"select",
|
|
174
|
+
{
|
|
175
|
+
className: "inconel-rte__select",
|
|
176
|
+
"aria-label": "Yazı boyutu",
|
|
177
|
+
disabled: x,
|
|
178
|
+
value: "",
|
|
179
|
+
onChange: (e) => {
|
|
180
|
+
e.target.value && me(Number(e.target.value));
|
|
181
|
+
},
|
|
182
|
+
children: [
|
|
183
|
+
/* @__PURE__ */ l("option", { value: "", children: "Boyut" }),
|
|
184
|
+
Ee.map((e) => /* @__PURE__ */ s("option", { value: e, children: [
|
|
185
|
+
e,
|
|
186
|
+
"px"
|
|
187
|
+
] }, e))
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
), H = (e, t, n) => /* @__PURE__ */ l(
|
|
191
|
+
R,
|
|
192
|
+
{
|
|
193
|
+
label: e,
|
|
194
|
+
disabled: x,
|
|
195
|
+
active: u === t,
|
|
196
|
+
onClick: () => he(t),
|
|
197
|
+
children: n
|
|
198
|
+
}
|
|
199
|
+
), Se = new Set(re), ve = [
|
|
200
|
+
[
|
|
201
|
+
{ key: "bold", node: r("bold", "Kalın", a.bold) },
|
|
202
|
+
{ key: "italic", node: r("italic", "İtalik", a.italic) },
|
|
203
|
+
{ key: "underline", node: r("underline", "Altı çizili", a.underline) },
|
|
204
|
+
{ key: "strikethrough", node: r("strikeThrough", "Üstü çizili", a.strike) }
|
|
205
|
+
],
|
|
206
|
+
[
|
|
207
|
+
{ key: "blockFormat", node: _e },
|
|
208
|
+
{ key: "fontSize", node: Ce }
|
|
209
|
+
],
|
|
210
|
+
[
|
|
211
|
+
{ key: "alignLeft", node: r("justifyLeft", "Sola hizala", a.alignLeft) },
|
|
212
|
+
{ key: "alignCenter", node: r("justifyCenter", "Ortala", a.alignCenter) },
|
|
213
|
+
{ key: "alignRight", node: r("justifyRight", "Sağa hizala", a.alignRight) },
|
|
214
|
+
{ key: "alignJustify", node: r("justifyFull", "İki yana yasla", a.alignJustify) }
|
|
215
|
+
],
|
|
216
|
+
[
|
|
217
|
+
{ key: "unorderedList", node: r("insertUnorderedList", "Madde işaretli liste", a.listUl) },
|
|
218
|
+
{ key: "orderedList", node: r("insertOrderedList", "Numaralı liste", a.listOl) },
|
|
219
|
+
{ key: "outdent", node: r("outdent", "Girintiyi azalt", a.outdent) },
|
|
220
|
+
{ key: "indent", node: r("indent", "Girintiyi artır", a.indent) },
|
|
221
|
+
{ key: "clearFormat", node: r("removeFormat", "Biçimi temizle", a.clearFormat) }
|
|
222
|
+
],
|
|
223
|
+
[
|
|
224
|
+
{ key: "link", node: H("Bağlantı ekle", "link", a.link) },
|
|
225
|
+
{ key: "table", node: H("Tablo ekle", "table", a.table) },
|
|
226
|
+
{ key: "image", node: H("Görsel ekle", "image", a.image) },
|
|
227
|
+
...P ? [
|
|
228
|
+
{
|
|
229
|
+
key: "media",
|
|
230
|
+
node: /* @__PURE__ */ l(
|
|
231
|
+
R,
|
|
232
|
+
{
|
|
233
|
+
label: "Medya galerisi",
|
|
234
|
+
disabled: x,
|
|
235
|
+
onClick: () => {
|
|
236
|
+
y(), P(ee);
|
|
237
|
+
},
|
|
238
|
+
children: a.gallery
|
|
239
|
+
}
|
|
240
|
+
)
|
|
241
|
+
}
|
|
242
|
+
] : []
|
|
243
|
+
],
|
|
244
|
+
[
|
|
245
|
+
{ key: "undo", node: r("undo", "Geri al", a.undo) },
|
|
246
|
+
{ key: "redo", node: r("redo", "Yinele", a.redo) },
|
|
247
|
+
{
|
|
248
|
+
key: "source",
|
|
249
|
+
node: /* @__PURE__ */ l(
|
|
250
|
+
R,
|
|
251
|
+
{
|
|
252
|
+
label: "HTML kaynağı",
|
|
253
|
+
disabled: p,
|
|
254
|
+
active: f,
|
|
255
|
+
onClick: ge,
|
|
256
|
+
children: a.code
|
|
257
|
+
}
|
|
258
|
+
)
|
|
259
|
+
}
|
|
260
|
+
]
|
|
261
|
+
].map((e) => e.filter((t) => !Se.has(t.key))).filter((e) => e.length > 0);
|
|
262
|
+
return /* @__PURE__ */ s(
|
|
158
263
|
"div",
|
|
159
264
|
{
|
|
160
265
|
className: [
|
|
161
266
|
"inconel-field",
|
|
162
|
-
|
|
163
|
-
|
|
267
|
+
le ? "inconel-field--full-width" : "",
|
|
268
|
+
ae ?? ""
|
|
164
269
|
].join(" "),
|
|
165
270
|
children: [
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
U && /* @__PURE__ */
|
|
271
|
+
i && /* @__PURE__ */ s("label", { className: "inconel-field__label", htmlFor: N, children: [
|
|
272
|
+
i,
|
|
273
|
+
U && /* @__PURE__ */ l("span", { "aria-hidden": "true", children: " *" })
|
|
169
274
|
] }),
|
|
170
|
-
/* @__PURE__ */
|
|
275
|
+
/* @__PURE__ */ s(
|
|
171
276
|
"div",
|
|
172
277
|
{
|
|
173
278
|
className: [
|
|
174
279
|
"inconel-rte",
|
|
175
|
-
|
|
176
|
-
|
|
280
|
+
v ? "inconel-is-invalid" : "",
|
|
281
|
+
p ? "inconel-is-disabled" : ""
|
|
177
282
|
].join(" "),
|
|
178
283
|
children: [
|
|
179
|
-
/* @__PURE__ */
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
/* @__PURE__ */
|
|
185
|
-
/* @__PURE__ */ c(
|
|
186
|
-
"select",
|
|
187
|
-
{
|
|
188
|
-
className: "inconel-rte__select",
|
|
189
|
-
"aria-label": "Biçim",
|
|
190
|
-
disabled: _,
|
|
191
|
-
value: "",
|
|
192
|
-
onChange: (e) => {
|
|
193
|
-
e.target.value && E("formatBlock", e.target.value);
|
|
194
|
-
},
|
|
195
|
-
children: [
|
|
196
|
-
/* @__PURE__ */ n("option", { value: "", children: "Biçim" }),
|
|
197
|
-
ke.map((e) => /* @__PURE__ */ n("option", { value: e.tag, children: e.label }, e.tag))
|
|
198
|
-
]
|
|
199
|
-
}
|
|
200
|
-
),
|
|
201
|
-
/* @__PURE__ */ c(
|
|
202
|
-
"select",
|
|
203
|
-
{
|
|
204
|
-
className: "inconel-rte__select",
|
|
205
|
-
"aria-label": "Yazı boyutu",
|
|
206
|
-
disabled: _,
|
|
207
|
-
value: "",
|
|
208
|
-
onChange: (e) => {
|
|
209
|
-
e.target.value && de(Number(e.target.value));
|
|
210
|
-
},
|
|
211
|
-
children: [
|
|
212
|
-
/* @__PURE__ */ n("option", { value: "", children: "Boyut" }),
|
|
213
|
-
ve.map((e) => /* @__PURE__ */ c("option", { value: e, children: [
|
|
214
|
-
e,
|
|
215
|
-
"px"
|
|
216
|
-
] }, e))
|
|
217
|
-
]
|
|
218
|
-
}
|
|
219
|
-
),
|
|
220
|
-
/* @__PURE__ */ n("span", { className: "inconel-rte__sep" }),
|
|
221
|
-
r("justifyLeft", "Sola hizala", a.alignLeft),
|
|
222
|
-
r("justifyCenter", "Ortala", a.alignCenter),
|
|
223
|
-
r("justifyRight", "Sağa hizala", a.alignRight),
|
|
224
|
-
r("justifyFull", "İki yana yasla", a.alignJustify),
|
|
225
|
-
/* @__PURE__ */ n("span", { className: "inconel-rte__sep" }),
|
|
226
|
-
r("insertUnorderedList", "Madde işaretli liste", a.listUl),
|
|
227
|
-
r("insertOrderedList", "Numaralı liste", a.listOl),
|
|
228
|
-
r("outdent", "Girintiyi azalt", a.outdent),
|
|
229
|
-
r("indent", "Girintiyi artır", a.indent),
|
|
230
|
-
r("removeFormat", "Biçimi temizle", a.clearFormat),
|
|
231
|
-
/* @__PURE__ */ n("span", { className: "inconel-rte__sep" }),
|
|
232
|
-
/* @__PURE__ */ n(
|
|
233
|
-
N,
|
|
234
|
-
{
|
|
235
|
-
label: "Bağlantı ekle",
|
|
236
|
-
disabled: _,
|
|
237
|
-
active: s === "link",
|
|
238
|
-
onClick: () => H("link"),
|
|
239
|
-
children: a.link
|
|
240
|
-
}
|
|
241
|
-
),
|
|
242
|
-
/* @__PURE__ */ n(
|
|
243
|
-
N,
|
|
244
|
-
{
|
|
245
|
-
label: "Tablo ekle",
|
|
246
|
-
disabled: _,
|
|
247
|
-
active: s === "table",
|
|
248
|
-
onClick: () => H("table"),
|
|
249
|
-
children: a.table
|
|
250
|
-
}
|
|
251
|
-
),
|
|
252
|
-
/* @__PURE__ */ n(
|
|
253
|
-
N,
|
|
254
|
-
{
|
|
255
|
-
label: "Görsel ekle",
|
|
256
|
-
disabled: _,
|
|
257
|
-
active: s === "image",
|
|
258
|
-
onClick: () => H("image"),
|
|
259
|
-
children: a.image
|
|
260
|
-
}
|
|
261
|
-
),
|
|
262
|
-
P && /* @__PURE__ */ n(
|
|
263
|
-
N,
|
|
264
|
-
{
|
|
265
|
-
label: "Medya galerisi",
|
|
266
|
-
disabled: _,
|
|
267
|
-
onClick: () => {
|
|
268
|
-
b(), P(ee);
|
|
269
|
-
},
|
|
270
|
-
children: a.gallery
|
|
271
|
-
}
|
|
272
|
-
),
|
|
273
|
-
/* @__PURE__ */ n("span", { className: "inconel-rte__sep" }),
|
|
274
|
-
r("undo", "Geri al", a.undo),
|
|
275
|
-
r("redo", "Yinele", a.redo),
|
|
276
|
-
/* @__PURE__ */ n(
|
|
277
|
-
N,
|
|
278
|
-
{
|
|
279
|
-
label: "HTML kaynağı",
|
|
280
|
-
disabled: y,
|
|
281
|
-
active: f,
|
|
282
|
-
onClick: pe,
|
|
283
|
-
children: a.code
|
|
284
|
-
}
|
|
285
|
-
)
|
|
286
|
-
] }),
|
|
287
|
-
s === "table" && !f && /* @__PURE__ */ c("div", { className: "inconel-rte__panel", children: [
|
|
288
|
-
/* @__PURE__ */ c("label", { className: "inconel-rte__field", children: [
|
|
284
|
+
/* @__PURE__ */ l("div", { className: "inconel-rte__toolbar", role: "toolbar", "aria-label": "Biçimlendirme", children: ve.map((e, t) => /* @__PURE__ */ s(ne, { children: [
|
|
285
|
+
t > 0 && /* @__PURE__ */ l("span", { className: "inconel-rte__sep" }),
|
|
286
|
+
e.map((n) => /* @__PURE__ */ l(ne, { children: n.node }, n.key))
|
|
287
|
+
] }, t)) }),
|
|
288
|
+
u === "table" && !f && /* @__PURE__ */ s("div", { className: "inconel-rte__panel", children: [
|
|
289
|
+
/* @__PURE__ */ s("label", { className: "inconel-rte__field", children: [
|
|
289
290
|
"Satır",
|
|
290
|
-
/* @__PURE__ */
|
|
291
|
+
/* @__PURE__ */ l(
|
|
291
292
|
"input",
|
|
292
293
|
{
|
|
293
294
|
type: "number",
|
|
294
295
|
min: 1,
|
|
295
296
|
max: 20,
|
|
296
297
|
className: "inconel-rte__input inconel-rte__input--num",
|
|
297
|
-
value:
|
|
298
|
-
onChange: (e) => V({ ...
|
|
298
|
+
value: k.rows,
|
|
299
|
+
onChange: (e) => V({ ...k, rows: Number(e.target.value) })
|
|
299
300
|
}
|
|
300
301
|
)
|
|
301
302
|
] }),
|
|
302
|
-
/* @__PURE__ */
|
|
303
|
+
/* @__PURE__ */ s("label", { className: "inconel-rte__field", children: [
|
|
303
304
|
"Sütun",
|
|
304
|
-
/* @__PURE__ */
|
|
305
|
+
/* @__PURE__ */ l(
|
|
305
306
|
"input",
|
|
306
307
|
{
|
|
307
308
|
type: "number",
|
|
308
309
|
min: 1,
|
|
309
310
|
max: 10,
|
|
310
311
|
className: "inconel-rte__input inconel-rte__input--num",
|
|
311
|
-
value:
|
|
312
|
-
onChange: (e) => V({ ...
|
|
312
|
+
value: k.cols,
|
|
313
|
+
onChange: (e) => V({ ...k, cols: Number(e.target.value) })
|
|
313
314
|
}
|
|
314
315
|
)
|
|
315
316
|
] }),
|
|
316
|
-
/* @__PURE__ */
|
|
317
|
+
/* @__PURE__ */ l("button", { type: "button", className: "inconel-rte__action", onClick: z, children: "Tablo ekle" })
|
|
317
318
|
] }),
|
|
318
|
-
|
|
319
|
+
ue && !f && !p && /* @__PURE__ */ l("div", { className: "inconel-rte__panel", role: "toolbar", "aria-label": "Tablo", children: [
|
|
319
320
|
["addRow", "Satır ekle"],
|
|
320
321
|
["delRow", "Satırı sil"],
|
|
321
322
|
["addCol", "Sütun ekle"],
|
|
322
323
|
["delCol", "Sütunu sil"],
|
|
323
324
|
["delTable", "Tabloyu sil"]
|
|
324
|
-
].map(([e, t]) => /* @__PURE__ */
|
|
325
|
+
].map(([e, t]) => /* @__PURE__ */ l(
|
|
325
326
|
"button",
|
|
326
327
|
{
|
|
327
328
|
type: "button",
|
|
328
329
|
className: "inconel-rte__action",
|
|
329
|
-
onMouseDown: (
|
|
330
|
-
onClick: () =>
|
|
330
|
+
onMouseDown: (n) => n.preventDefault(),
|
|
331
|
+
onClick: () => fe(e),
|
|
331
332
|
children: t
|
|
332
333
|
},
|
|
333
334
|
e
|
|
334
335
|
)) }),
|
|
335
|
-
|
|
336
|
-
/* @__PURE__ */
|
|
336
|
+
u && u !== "table" && !f && /* @__PURE__ */ s("div", { className: "inconel-rte__panel", children: [
|
|
337
|
+
/* @__PURE__ */ l(
|
|
337
338
|
"input",
|
|
338
339
|
{
|
|
339
340
|
type: "url",
|
|
340
341
|
className: "inconel-rte__input",
|
|
341
|
-
"aria-label":
|
|
342
|
-
placeholder:
|
|
343
|
-
value:
|
|
342
|
+
"aria-label": u === "link" ? "Bağlantı adresi" : "Görsel adresi",
|
|
343
|
+
placeholder: u === "link" ? "https://…" : "Görsel URL (https://…)",
|
|
344
|
+
value: Y,
|
|
344
345
|
autoFocus: !0,
|
|
345
346
|
onChange: (e) => Z(e.target.value),
|
|
346
347
|
onKeyDown: (e) => {
|
|
@@ -348,61 +349,61 @@ function Re({
|
|
|
348
349
|
}
|
|
349
350
|
}
|
|
350
351
|
),
|
|
351
|
-
/* @__PURE__ */
|
|
352
|
-
|
|
352
|
+
/* @__PURE__ */ l("button", { type: "button", className: "inconel-rte__action", onClick: z, children: "Ekle" }),
|
|
353
|
+
u === "image" && /* @__PURE__ */ s("label", { className: "inconel-rte__action", children: [
|
|
353
354
|
"Dosya seç",
|
|
354
|
-
/* @__PURE__ */
|
|
355
|
+
/* @__PURE__ */ l(
|
|
355
356
|
"input",
|
|
356
357
|
{
|
|
357
358
|
type: "file",
|
|
358
359
|
accept: "image/*",
|
|
359
360
|
hidden: !0,
|
|
360
361
|
"aria-label": "Görsel dosyası",
|
|
361
|
-
onChange:
|
|
362
|
+
onChange: be
|
|
362
363
|
}
|
|
363
364
|
)
|
|
364
365
|
] })
|
|
365
366
|
] }),
|
|
366
|
-
f ? /* @__PURE__ */
|
|
367
|
+
f ? /* @__PURE__ */ l(
|
|
367
368
|
"textarea",
|
|
368
369
|
{
|
|
369
|
-
id:
|
|
370
|
+
id: N,
|
|
370
371
|
className: "inconel-rte__source",
|
|
371
372
|
style: { minHeight: A },
|
|
372
|
-
"aria-label":
|
|
373
|
+
"aria-label": i ?? "HTML kaynağı",
|
|
373
374
|
value: K,
|
|
374
|
-
disabled:
|
|
375
|
+
disabled: p,
|
|
375
376
|
spellCheck: !1,
|
|
376
|
-
onChange: (e) =>
|
|
377
|
+
onChange: (e) => J(e.target.value)
|
|
377
378
|
}
|
|
378
|
-
) : /* @__PURE__ */
|
|
379
|
-
|
|
380
|
-
/* @__PURE__ */
|
|
379
|
+
) : /* @__PURE__ */ s("div", { className: "inconel-rte__surface", style: { minHeight: A }, children: [
|
|
380
|
+
de && E && /* @__PURE__ */ l("span", { className: "inconel-rte__placeholder", "aria-hidden": "true", children: E }),
|
|
381
|
+
/* @__PURE__ */ l(
|
|
381
382
|
"div",
|
|
382
383
|
{
|
|
383
|
-
ref:
|
|
384
|
-
id:
|
|
384
|
+
ref: d,
|
|
385
|
+
id: N,
|
|
385
386
|
className: "inconel-rte__content",
|
|
386
387
|
role: "textbox",
|
|
387
388
|
"aria-multiline": "true",
|
|
388
|
-
"aria-label":
|
|
389
|
+
"aria-label": i,
|
|
389
390
|
"aria-required": U,
|
|
390
|
-
"aria-invalid": !!
|
|
391
|
-
"aria-describedby":
|
|
392
|
-
"aria-disabled":
|
|
393
|
-
contentEditable: !
|
|
391
|
+
"aria-invalid": !!v,
|
|
392
|
+
"aria-describedby": ke,
|
|
393
|
+
"aria-disabled": p,
|
|
394
|
+
contentEditable: !p,
|
|
394
395
|
suppressContentEditableWarning: !0,
|
|
395
396
|
style: { minHeight: A },
|
|
396
397
|
onInput: g,
|
|
397
|
-
onPaste:
|
|
398
|
+
onPaste: pe,
|
|
398
399
|
onKeyUp: () => {
|
|
399
|
-
|
|
400
|
+
y(), D();
|
|
400
401
|
},
|
|
401
402
|
onMouseUp: () => {
|
|
402
|
-
|
|
403
|
+
y(), D();
|
|
403
404
|
},
|
|
404
405
|
onBlur: () => {
|
|
405
|
-
|
|
406
|
+
y(), S?.();
|
|
406
407
|
}
|
|
407
408
|
}
|
|
408
409
|
)
|
|
@@ -410,12 +411,12 @@ function Re({
|
|
|
410
411
|
]
|
|
411
412
|
}
|
|
412
413
|
),
|
|
413
|
-
/* @__PURE__ */
|
|
414
|
+
/* @__PURE__ */ l(Te, { hint: $, errorMessage: v, hintId: q, errorId: W })
|
|
414
415
|
]
|
|
415
416
|
}
|
|
416
417
|
);
|
|
417
418
|
}
|
|
418
419
|
export {
|
|
419
|
-
|
|
420
|
+
Ie as default
|
|
420
421
|
};
|
|
421
422
|
//# sourceMappingURL=RichTextEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichTextEditor.js","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
|
+
{"version":3,"file":"RichTextEditor.js","sources":["../../../src/components/RichTextEditor/RichTextEditor.tsx"],"sourcesContent":["import {\n Fragment,\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 type RichTextTool =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strikethrough'\n | 'blockFormat'\n | 'fontSize'\n | 'alignLeft'\n | 'alignCenter'\n | 'alignRight'\n | 'alignJustify'\n | 'unorderedList'\n | 'orderedList'\n | 'outdent'\n | 'indent'\n | 'clearFormat'\n | 'link'\n | 'table'\n | 'image'\n | 'media'\n | 'undo'\n | 'redo'\n | 'source'\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 /** Araç çubuğundan çıkarılacak araçlar, ör. `['table', 'source', 'fontSize']`. */\n excludeTools?: RichTextTool[]\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 excludeTools = [],\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 const blockSelect = (\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 )\n\n const fontSizeSelect = (\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 )\n\n const panelButton = (label: string, target: Exclude<Panel, null>, content: ReactNode) => (\n <ToolButton\n label={label}\n disabled={toolsDisabled}\n active={panel === target}\n onClick={() => openPanel(target)}\n >\n {content}\n </ToolButton>\n )\n\n // Her grup bir ayraçla ayrılır; `excludeTools` ile çıkarılan araçlar ve boş kalan gruplar gösterilmez.\n const excluded = new Set(excludeTools)\n const groups = (\n [\n [\n { key: 'bold', node: btn('bold', 'Kalın', icons.bold) },\n { key: 'italic', node: btn('italic', 'İtalik', icons.italic) },\n { key: 'underline', node: btn('underline', 'Altı çizili', icons.underline) },\n { key: 'strikethrough', node: btn('strikeThrough', 'Üstü çizili', icons.strike) },\n ],\n [\n { key: 'blockFormat', node: blockSelect },\n { key: 'fontSize', node: fontSizeSelect },\n ],\n [\n { key: 'alignLeft', node: btn('justifyLeft', 'Sola hizala', icons.alignLeft) },\n { key: 'alignCenter', node: btn('justifyCenter', 'Ortala', icons.alignCenter) },\n { key: 'alignRight', node: btn('justifyRight', 'Sağa hizala', icons.alignRight) },\n { key: 'alignJustify', node: btn('justifyFull', 'İki yana yasla', icons.alignJustify) },\n ],\n [\n { key: 'unorderedList', node: btn('insertUnorderedList', 'Madde işaretli liste', icons.listUl) },\n { key: 'orderedList', node: btn('insertOrderedList', 'Numaralı liste', icons.listOl) },\n { key: 'outdent', node: btn('outdent', 'Girintiyi azalt', icons.outdent) },\n { key: 'indent', node: btn('indent', 'Girintiyi artır', icons.indent) },\n { key: 'clearFormat', node: btn('removeFormat', 'Biçimi temizle', icons.clearFormat) },\n ],\n [\n { key: 'link', node: panelButton('Bağlantı ekle', 'link', icons.link) },\n { key: 'table', node: panelButton('Tablo ekle', 'table', icons.table) },\n { key: 'image', node: panelButton('Görsel ekle', 'image', icons.image) },\n ...(onRequestMedia\n ? [\n {\n key: 'media',\n node: (\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 },\n ]\n : []),\n ],\n [\n { key: 'undo', node: btn('undo', 'Geri al', icons.undo) },\n { key: 'redo', node: btn('redo', 'Yinele', icons.redo) },\n {\n key: 'source',\n node: (\n <ToolButton\n label=\"HTML kaynağı\"\n disabled={disabled}\n active={sourceMode}\n onClick={toggleSource}\n >\n {icons.code}\n </ToolButton>\n ),\n },\n ],\n ] as { key: RichTextTool; node: ReactNode }[][]\n )\n .map((group) => group.filter((item) => !excluded.has(item.key)))\n .filter((group) => group.length > 0)\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 {groups.map((group, index) => (\n <Fragment key={index}>\n {index > 0 && <span className=\"inconel-rte__sep\" />}\n {group.map((item) => (\n <Fragment key={item.key}>{item.node}</Fragment>\n ))}\n </Fragment>\n ))}\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","excludeTools","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","blockSelect","jsxs","block","fontSizeSelect","size","panelButton","excluded","groups","icons","group","item","Fragment","FieldFeedback"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { default as RichTextEditor } from './RichTextEditor';
|
|
2
|
-
export type { RichTextEditorProps } from './RichTextEditor';
|
|
2
|
+
export type { RichTextEditorProps, RichTextTool } from './RichTextEditor';
|
|
3
3
|
export { sanitizeHtml } from './sanitize';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5D,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5D,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA"}
|