inconel 0.1.40 → 0.1.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,71 +1,72 @@
1
- import { jsxs as s, jsx as n } from "react/jsx-runtime";
2
- import { useId as ie, useRef as R, useState as g, useEffect as re, useCallback as oe } from "react";
3
- import se from "../FieldFeedback/FieldFeedback.js";
1
+ import { jsxs as c, jsx as n } from "react/jsx-runtime";
2
+ import { useId as re, useRef as w, useState as y, useEffect as oe, useCallback as se } from "react";
3
+ import ce from "../FieldFeedback/FieldFeedback.js";
4
4
  /* empty css */
5
5
  /* empty css */
6
- import { sanitizeHtml as y } from "./sanitize.js";
7
- const ce = [
6
+ import { icons as l } from "./icons.js";
7
+ import { sanitizeHtml as b } from "./sanitize.js";
8
+ const ue = [
8
9
  { tag: "p", label: "Paragraf" },
9
10
  { tag: "h1", label: "Başlık 1" },
10
11
  { tag: "h2", label: "Başlık 2" },
11
12
  { tag: "h3", label: "Başlık 3" },
12
13
  { tag: "blockquote", label: "Alıntı" }
13
- ], ue = [12, 14, 16, 18, 24, 32], de = (i) => new Promise((d, b) => {
14
+ ], de = [12, 14, 16, 18, 24, 32], me = (r) => new Promise((m, _) => {
14
15
  const a = new FileReader();
15
- a.onload = () => d(String(a.result)), a.onerror = () => b(a.error), a.readAsDataURL(i);
16
+ a.onload = () => m(String(a.result)), a.onerror = () => _(a.error), a.readAsDataURL(r);
16
17
  });
17
- function S({ label: i, onClick: d, disabled: b, active: a, children: N }) {
18
+ function N({ label: r, onClick: m, disabled: _, active: a, children: L }) {
18
19
  return /* @__PURE__ */ n(
19
20
  "button",
20
21
  {
21
22
  type: "button",
22
23
  className: `inconel-rte__btn${a ? " inconel-is-active" : ""}`,
23
- "aria-label": i,
24
- title: i,
24
+ "aria-label": r,
25
+ title: r,
25
26
  "aria-pressed": a,
26
- disabled: b,
27
- onMouseDown: (B) => B.preventDefault(),
28
- onClick: d,
29
- children: N
27
+ disabled: _,
28
+ onMouseDown: (x) => x.preventDefault(),
29
+ onClick: m,
30
+ children: L
30
31
  }
31
32
  );
32
33
  }
33
- function be({
34
- value: i = "",
35
- onChange: d,
36
- onBlur: b,
34
+ function ke({
35
+ value: r = "",
36
+ onChange: m,
37
+ onBlur: _,
37
38
  label: a,
38
- placeholder: N,
39
- id: B,
40
- disabled: f = !1,
41
- required: w,
42
- fullWidth: W = !0,
43
- className: $,
44
- minHeight: x = 200,
45
- onImageUpload: D,
46
- onRequestMedia: E,
47
- hint: z,
48
- errorMessage: _
39
+ placeholder: L,
40
+ id: x,
41
+ disabled: p = !1,
42
+ required: D,
43
+ fullWidth: $ = !0,
44
+ className: K,
45
+ minHeight: j = 200,
46
+ onImageUpload: E,
47
+ onRequestMedia: z,
48
+ hint: H,
49
+ errorMessage: k
49
50
  }) {
50
- const K = ie(), k = B ?? `inconel-rte-${K.replace(/:/g, "")}`, H = `${k}-hint`, I = `${k}-error`, r = R(null), j = R(null), C = R(null), [m, Y] = g(!1), [M, U] = g(""), [c, L] = g(null), [G, P] = g(""), [Z, J] = g({}), [Q, T] = g(!i);
51
- re(() => {
52
- const e = r.current;
53
- if (!e || i === C.current) return;
54
- const t = y(i);
55
- e.innerHTML !== t && (e.innerHTML = t), C.current = i, T(!e.textContent && !e.querySelector("img"));
56
- }, [i, m]);
57
- const h = oe(() => {
58
- const e = r.current;
51
+ const Y = re(), C = x ?? `inconel-rte-${Y.replace(/:/g, "")}`, M = `${C}-hint`, I = `${C}-error`, o = w(null), F = w(null), v = w(null), [f, J] = y(!1), [U, G] = y(""), [u, B] = y(null), [O, P] = y(""), [Z, Q] = y({}), [V, R] = y(!r);
52
+ oe(() => {
53
+ const e = o.current;
54
+ if (!e || r === v.current) return;
55
+ const t = b(r);
56
+ e.innerHTML !== t && (e.innerHTML = t), v.current = r, R(!e.textContent && !e.querySelector("img"));
57
+ }, [r, f]);
58
+ const h = se(() => {
59
+ const e = o.current;
59
60
  if (!e) return;
60
- const t = !!e.textContent || !!e.querySelector("img"), o = t ? y(e.innerHTML) : "";
61
- T(!t), C.current = o, d?.(o);
62
- }, [d]), u = () => {
63
- const e = window.getSelection(), t = r.current;
64
- e && e.rangeCount > 0 && t?.contains(e.getRangeAt(0).commonAncestorContainer) && (j.current = e.getRangeAt(0).cloneRange());
65
- }, F = () => {
66
- r.current?.focus();
61
+ const t = !!e.textContent || !!e.querySelector("img"), s = t ? b(e.innerHTML) : "";
62
+ R(!t), v.current = s, m?.(s);
63
+ }, [m]), d = () => {
64
+ const e = window.getSelection(), t = o.current;
65
+ e && e.rangeCount > 0 && t?.contains(e.getRangeAt(0).commonAncestorContainer) && (F.current = e.getRangeAt(0).cloneRange());
66
+ }, T = () => {
67
+ o.current?.focus();
67
68
  const e = window.getSelection();
68
- e && j.current && (e.removeAllRanges(), e.addRange(j.current));
69
+ e && F.current && (e.removeAllRanges(), e.addRange(F.current));
69
70
  }, A = () => {
70
71
  const e = (t) => {
71
72
  try {
@@ -74,7 +75,7 @@ function be({
74
75
  return !1;
75
76
  }
76
77
  };
77
- J({
78
+ Q({
78
79
  bold: e("bold"),
79
80
  italic: e("italic"),
80
81
  underline: e("underline"),
@@ -86,104 +87,104 @@ function be({
86
87
  insertUnorderedList: e("insertUnorderedList"),
87
88
  insertOrderedList: e("insertOrderedList")
88
89
  });
89
- }, v = (e, t) => {
90
- F(), document.execCommand("styleWithCSS", !1, "true"), document.execCommand(e, !1, t), u(), A(), h();
91
- }, V = (e) => {
92
- F(), document.execCommand("styleWithCSS", !1, "false"), document.execCommand("fontSize", !1, "7"), r.current?.querySelectorAll('font[size="7"]').forEach((t) => {
93
- const o = document.createElement("span");
94
- o.style.fontSize = `${e}px`, o.append(...Array.from(t.childNodes)), t.replaceWith(o);
95
- }), u(), h();
90
+ }, S = (e, t) => {
91
+ T(), document.execCommand("styleWithCSS", !1, "true"), document.execCommand(e, !1, t), d(), A(), h();
96
92
  }, X = (e) => {
97
- F(), document.execCommand("insertHTML", !1, y(e)), u(), h();
93
+ T(), document.execCommand("styleWithCSS", !1, "false"), document.execCommand("fontSize", !1, "7"), o.current?.querySelectorAll('font[size="7"]').forEach((t) => {
94
+ const s = document.createElement("span");
95
+ s.style.fontSize = `${e}px`, s.append(...Array.from(t.childNodes)), t.replaceWith(s);
96
+ }), d(), h();
97
+ }, ee = (e) => {
98
+ T(), document.execCommand("insertHTML", !1, b(e)), d(), h();
98
99
  }, q = (e) => {
99
- u(), P(""), L(c === e ? null : e);
100
- }, O = () => {
101
- const e = G.trim();
102
- e && (c === "link" ? (v("createLink", e), r.current?.querySelectorAll("a").forEach((t) => {
100
+ d(), P(""), B(u === e ? null : e);
101
+ }, W = () => {
102
+ const e = O.trim();
103
+ e && (u === "link" ? (S("createLink", e), o.current?.querySelectorAll("a").forEach((t) => {
103
104
  /^https?:/i.test(t.getAttribute("href") ?? "") && (t.setAttribute("target", "_blank"), t.setAttribute("rel", "noopener noreferrer"));
104
- }), h()) : c === "image" && v("insertImage", e), L(null));
105
- }, ee = async (e) => {
105
+ }), h()) : u === "image" && S("insertImage", e), B(null));
106
+ }, te = async (e) => {
106
107
  const t = e.target.files?.[0];
107
108
  if (e.target.value = "", !t || !t.type.startsWith("image/")) return;
108
- const o = D ? await D(t) : await de(t);
109
- v("insertImage", o), L(null);
110
- }, te = (e) => {
109
+ const s = E ? await E(t) : await me(t);
110
+ S("insertImage", s), B(null);
111
+ }, ne = (e) => {
111
112
  const t = e.clipboardData.getData("text/html");
112
- t && (e.preventDefault(), document.execCommand("insertHTML", !1, y(t)), h());
113
- }, ne = () => {
114
- if (m) {
115
- const e = y(M);
116
- C.current = null, r.current && (r.current.innerHTML = e), C.current = e, T(!e), d?.(e);
113
+ t && (e.preventDefault(), document.execCommand("insertHTML", !1, b(t)), h());
114
+ }, le = () => {
115
+ if (f) {
116
+ const e = b(U);
117
+ v.current = null, o.current && (o.current.innerHTML = e), v.current = e, R(!e), m?.(e);
117
118
  } else
118
- U(y(r.current?.innerHTML ?? ""));
119
- L(null), Y(!m);
120
- }, le = [z && !_ ? H : void 0, _ ? I : void 0].filter(Boolean).join(" ") || void 0, p = f || m, l = (e, t, o, ae) => /* @__PURE__ */ n(
121
- S,
119
+ G(b(o.current?.innerHTML ?? ""));
120
+ B(null), J(!f);
121
+ }, ie = [H && !k ? M : void 0, k ? I : void 0].filter(Boolean).join(" ") || void 0, g = p || f, i = (e, t, s, ae) => /* @__PURE__ */ n(
122
+ N,
122
123
  {
123
124
  label: t,
124
125
  active: Z[e],
125
- disabled: p,
126
- onClick: () => v(e, ae),
127
- children: o
126
+ disabled: g,
127
+ onClick: () => S(e, ae),
128
+ children: s
128
129
  }
129
130
  );
130
- return /* @__PURE__ */ s(
131
+ return /* @__PURE__ */ c(
131
132
  "div",
132
133
  {
133
134
  className: [
134
135
  "inconel-field",
135
- W ? "inconel-field--full-width" : "",
136
- $ ?? ""
136
+ $ ? "inconel-field--full-width" : "",
137
+ K ?? ""
137
138
  ].join(" "),
138
139
  children: [
139
- a && /* @__PURE__ */ s("label", { className: "inconel-field__label", htmlFor: k, children: [
140
+ a && /* @__PURE__ */ c("label", { className: "inconel-field__label", htmlFor: C, children: [
140
141
  a,
141
- w && /* @__PURE__ */ n("span", { "aria-hidden": "true", children: " *" })
142
+ D && /* @__PURE__ */ n("span", { "aria-hidden": "true", children: " *" })
142
143
  ] }),
143
- /* @__PURE__ */ s(
144
+ /* @__PURE__ */ c(
144
145
  "div",
145
146
  {
146
147
  className: [
147
148
  "inconel-rte",
148
- _ ? "inconel-is-invalid" : "",
149
- f ? "inconel-is-disabled" : ""
149
+ k ? "inconel-is-invalid" : "",
150
+ p ? "inconel-is-disabled" : ""
150
151
  ].join(" "),
151
152
  children: [
152
- /* @__PURE__ */ s("div", { className: "inconel-rte__toolbar", role: "toolbar", "aria-label": "Biçimlendirme", children: [
153
- l("bold", "Kalın", /* @__PURE__ */ n("b", { children: "B" })),
154
- l("italic", "İtalik", /* @__PURE__ */ n("i", { children: "I" })),
155
- l("underline", "Altı çizili", /* @__PURE__ */ n("u", { children: "U" })),
156
- l("strikeThrough", "Üstü çizili", /* @__PURE__ */ n("s", { children: "S" })),
153
+ /* @__PURE__ */ c("div", { className: "inconel-rte__toolbar", role: "toolbar", "aria-label": "Biçimlendirme", children: [
154
+ i("bold", "Kalın", l.bold),
155
+ i("italic", "İtalik", l.italic),
156
+ i("underline", "Altı çizili", l.underline),
157
+ i("strikeThrough", "Üstü çizili", l.strike),
157
158
  /* @__PURE__ */ n("span", { className: "inconel-rte__sep" }),
158
- /* @__PURE__ */ s(
159
+ /* @__PURE__ */ c(
159
160
  "select",
160
161
  {
161
162
  className: "inconel-rte__select",
162
163
  "aria-label": "Biçim",
163
- disabled: p,
164
+ disabled: g,
164
165
  value: "",
165
166
  onChange: (e) => {
166
- e.target.value && v("formatBlock", e.target.value);
167
+ e.target.value && S("formatBlock", e.target.value);
167
168
  },
168
169
  children: [
169
170
  /* @__PURE__ */ n("option", { value: "", children: "Biçim" }),
170
- ce.map((e) => /* @__PURE__ */ n("option", { value: e.tag, children: e.label }, e.tag))
171
+ ue.map((e) => /* @__PURE__ */ n("option", { value: e.tag, children: e.label }, e.tag))
171
172
  ]
172
173
  }
173
174
  ),
174
- /* @__PURE__ */ s(
175
+ /* @__PURE__ */ c(
175
176
  "select",
176
177
  {
177
178
  className: "inconel-rte__select",
178
179
  "aria-label": "Yazı boyutu",
179
- disabled: p,
180
+ disabled: g,
180
181
  value: "",
181
182
  onChange: (e) => {
182
- e.target.value && V(Number(e.target.value));
183
+ e.target.value && X(Number(e.target.value));
183
184
  },
184
185
  children: [
185
186
  /* @__PURE__ */ n("option", { value: "", children: "Boyut" }),
186
- ue.map((e) => /* @__PURE__ */ s("option", { value: e, children: [
187
+ de.map((e) => /* @__PURE__ */ c("option", { value: e, children: [
187
188
  e,
188
189
  "px"
189
190
  ] }, e))
@@ -191,80 +192,80 @@ function be({
191
192
  }
192
193
  ),
193
194
  /* @__PURE__ */ n("span", { className: "inconel-rte__sep" }),
194
- l("justifyLeft", "Sola hizala", "⇤"),
195
- l("justifyCenter", "Ortala", "↔"),
196
- l("justifyRight", "Sağa hizala", "⇥"),
197
- l("justifyFull", "İki yana yasla", "☰"),
195
+ i("justifyLeft", "Sola hizala", l.alignLeft),
196
+ i("justifyCenter", "Ortala", l.alignCenter),
197
+ i("justifyRight", "Sağa hizala", l.alignRight),
198
+ i("justifyFull", "İki yana yasla", l.alignJustify),
198
199
  /* @__PURE__ */ n("span", { className: "inconel-rte__sep" }),
199
- l("insertUnorderedList", "Madde işaretli liste", "• ≡"),
200
- l("insertOrderedList", "Numaralı liste", "1.≡"),
201
- l("outdent", "Girintiyi azalt", "⇠"),
202
- l("indent", "Girintiyi artır", "⇢"),
203
- l("removeFormat", "Biçimi temizle", "Tₓ"),
200
+ i("insertUnorderedList", "Madde işaretli liste", l.listUl),
201
+ i("insertOrderedList", "Numaralı liste", l.listOl),
202
+ i("outdent", "Girintiyi azalt", l.outdent),
203
+ i("indent", "Girintiyi artır", l.indent),
204
+ i("removeFormat", "Biçimi temizle", l.clearFormat),
204
205
  /* @__PURE__ */ n("span", { className: "inconel-rte__sep" }),
205
206
  /* @__PURE__ */ n(
206
- S,
207
+ N,
207
208
  {
208
209
  label: "Bağlantı ekle",
209
- disabled: p,
210
- active: c === "link",
210
+ disabled: g,
211
+ active: u === "link",
211
212
  onClick: () => q("link"),
212
- children: "🔗"
213
+ children: l.link
213
214
  }
214
215
  ),
215
216
  /* @__PURE__ */ n(
216
- S,
217
+ N,
217
218
  {
218
219
  label: "Görsel ekle",
219
- disabled: p,
220
- active: c === "image",
220
+ disabled: g,
221
+ active: u === "image",
221
222
  onClick: () => q("image"),
222
- children: "🖼"
223
+ children: l.image
223
224
  }
224
225
  ),
225
- E && /* @__PURE__ */ n(
226
- S,
226
+ z && /* @__PURE__ */ n(
227
+ N,
227
228
  {
228
229
  label: "Medya galerisi",
229
- disabled: p,
230
+ disabled: g,
230
231
  onClick: () => {
231
- u(), E(X);
232
+ d(), z(ee);
232
233
  },
233
- children: "🗂"
234
+ children: l.gallery
234
235
  }
235
236
  ),
236
237
  /* @__PURE__ */ n("span", { className: "inconel-rte__sep" }),
237
- l("undo", "Geri al", "↶"),
238
- l("redo", "Yinele", "↷"),
238
+ i("undo", "Geri al", l.undo),
239
+ i("redo", "Yinele", l.redo),
239
240
  /* @__PURE__ */ n(
240
- S,
241
+ N,
241
242
  {
242
243
  label: "HTML kaynağı",
243
- disabled: f,
244
- active: m,
245
- onClick: ne,
246
- children: "</>"
244
+ disabled: p,
245
+ active: f,
246
+ onClick: le,
247
+ children: l.code
247
248
  }
248
249
  )
249
250
  ] }),
250
- c && !m && /* @__PURE__ */ s("div", { className: "inconel-rte__panel", children: [
251
+ u && !f && /* @__PURE__ */ c("div", { className: "inconel-rte__panel", children: [
251
252
  /* @__PURE__ */ n(
252
253
  "input",
253
254
  {
254
255
  type: "url",
255
256
  className: "inconel-rte__input",
256
- "aria-label": c === "link" ? "Bağlantı adresi" : "Görsel adresi",
257
- placeholder: c === "link" ? "https://…" : "Görsel URL (https://…)",
258
- value: G,
257
+ "aria-label": u === "link" ? "Bağlantı adresi" : "Görsel adresi",
258
+ placeholder: u === "link" ? "https://…" : "Görsel URL (https://…)",
259
+ value: O,
259
260
  autoFocus: !0,
260
261
  onChange: (e) => P(e.target.value),
261
262
  onKeyDown: (e) => {
262
- e.key === "Enter" && (e.preventDefault(), O());
263
+ e.key === "Enter" && (e.preventDefault(), W());
263
264
  }
264
265
  }
265
266
  ),
266
- /* @__PURE__ */ n("button", { type: "button", className: "inconel-rte__action", onClick: O, children: "Ekle" }),
267
- c === "image" && /* @__PURE__ */ s("label", { className: "inconel-rte__action", children: [
267
+ /* @__PURE__ */ n("button", { type: "button", className: "inconel-rte__action", onClick: W, children: "Ekle" }),
268
+ u === "image" && /* @__PURE__ */ c("label", { className: "inconel-rte__action", children: [
268
269
  "Dosya seç",
269
270
  /* @__PURE__ */ n(
270
271
  "input",
@@ -273,51 +274,51 @@ function be({
273
274
  accept: "image/*",
274
275
  hidden: !0,
275
276
  "aria-label": "Görsel dosyası",
276
- onChange: ee
277
+ onChange: te
277
278
  }
278
279
  )
279
280
  ] })
280
281
  ] }),
281
- m ? /* @__PURE__ */ n(
282
+ f ? /* @__PURE__ */ n(
282
283
  "textarea",
283
284
  {
284
- id: k,
285
+ id: C,
285
286
  className: "inconel-rte__source",
286
- style: { minHeight: x },
287
+ style: { minHeight: j },
287
288
  "aria-label": a ?? "HTML kaynağı",
288
- value: M,
289
- disabled: f,
289
+ value: U,
290
+ disabled: p,
290
291
  spellCheck: !1,
291
- onChange: (e) => U(e.target.value)
292
+ onChange: (e) => G(e.target.value)
292
293
  }
293
- ) : /* @__PURE__ */ s("div", { className: "inconel-rte__surface", style: { minHeight: x }, children: [
294
- Q && N && /* @__PURE__ */ n("span", { className: "inconel-rte__placeholder", "aria-hidden": "true", children: N }),
294
+ ) : /* @__PURE__ */ c("div", { className: "inconel-rte__surface", style: { minHeight: j }, children: [
295
+ V && L && /* @__PURE__ */ n("span", { className: "inconel-rte__placeholder", "aria-hidden": "true", children: L }),
295
296
  /* @__PURE__ */ n(
296
297
  "div",
297
298
  {
298
- ref: r,
299
- id: k,
299
+ ref: o,
300
+ id: C,
300
301
  className: "inconel-rte__content",
301
302
  role: "textbox",
302
303
  "aria-multiline": "true",
303
304
  "aria-label": a,
304
- "aria-required": w,
305
- "aria-invalid": !!_,
306
- "aria-describedby": le,
307
- "aria-disabled": f,
308
- contentEditable: !f,
305
+ "aria-required": D,
306
+ "aria-invalid": !!k,
307
+ "aria-describedby": ie,
308
+ "aria-disabled": p,
309
+ contentEditable: !p,
309
310
  suppressContentEditableWarning: !0,
310
- style: { minHeight: x },
311
+ style: { minHeight: j },
311
312
  onInput: h,
312
- onPaste: te,
313
+ onPaste: ne,
313
314
  onKeyUp: () => {
314
- u(), A();
315
+ d(), A();
315
316
  },
316
317
  onMouseUp: () => {
317
- u(), A();
318
+ d(), A();
318
319
  },
319
320
  onBlur: () => {
320
- u(), b?.();
321
+ d(), _?.();
321
322
  }
322
323
  }
323
324
  )
@@ -325,12 +326,12 @@ function be({
325
326
  ]
326
327
  }
327
328
  ),
328
- /* @__PURE__ */ n(se, { hint: z, errorMessage: _, hintId: H, errorId: I })
329
+ /* @__PURE__ */ n(ce, { hint: H, errorMessage: k, hintId: M, errorId: I })
329
330
  ]
330
331
  }
331
332
  );
332
333
  }
333
334
  export {
334
- be as default
335
+ ke as default
335
336
  };
336
337
  //# 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 { sanitizeHtml } from './sanitize'\n\nexport interface RichTextEditorProps extends FieldFeedbackContentProps {\n value?: string\n onChange?: (html: string) => void\n onBlur?: () => void\n label?: string\n placeholder?: string\n id?: string\n disabled?: boolean\n required?: boolean\n fullWidth?: boolean\n className?: string\n /** Editör içerik alanının minimum yüksekliği (px). */\n minHeight?: number\n /** Görsel dosyası seçilince çağrılır; dönen URL görsel olarak eklenir. Verilmezse base64 gömülür. */\n onImageUpload?: (file: File) => Promise<string>\n /**\n * Verilirse araç çubuğuna galeri düğmesi eklenir. Düğmeye basınca çağrılır;\n * uygulama kendi medya kütüphanesini açıp seçilen içeriği `insert(html)` ile ekler.\n */\n onRequestMedia?: (insert: (html: string) => void) => void\n}\n\nconst BLOCKS = [\n { tag: 'p', label: 'Paragraf' },\n { tag: 'h1', label: 'Başlık 1' },\n { tag: 'h2', label: 'Başlık 2' },\n { tag: 'h3', label: 'Başlık 3' },\n { tag: 'blockquote', label: 'Alıntı' },\n]\n\nconst FONT_SIZES = [12, 14, 16, 18, 24, 32]\n\ntype Panel = 'link' | 'image' | null\n\nconst readFileAsDataUrl = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(file)\n })\n\ninterface ToolButtonProps {\n label: string\n onClick: () => void\n disabled?: boolean\n active?: boolean\n children: ReactNode\n}\n\nfunction ToolButton({ label, onClick, disabled, active, children }: ToolButtonProps) {\n return (\n <button\n type=\"button\"\n className={`inconel-rte__btn${active ? ' inconel-is-active' : ''}`}\n aria-label={label}\n title={label}\n aria-pressed={active}\n disabled={disabled}\n onMouseDown={(event) => event.preventDefault()}\n onClick={onClick}\n >\n {children}\n </button>\n )\n}\n\nexport default function RichTextEditor({\n value = '',\n onChange,\n onBlur,\n label,\n placeholder,\n id,\n disabled = false,\n required,\n fullWidth = true,\n className,\n minHeight = 200,\n onImageUpload,\n onRequestMedia,\n hint,\n errorMessage,\n}: RichTextEditorProps) {\n const generatedId = useId()\n const editorId = id ?? `inconel-rte-${generatedId.replace(/:/g, '')}`\n const hintId = `${editorId}-hint`\n const errorId = `${editorId}-error`\n\n const editorRef = useRef<HTMLDivElement>(null)\n const savedRange = useRef<Range | null>(null)\n const lastHtml = useRef<string | null>(null)\n const [sourceMode, setSourceMode] = useState(false)\n const [source, setSource] = useState('')\n const [panel, setPanel] = useState<Panel>(null)\n const [url, setUrl] = useState('')\n const [formats, setFormats] = useState<Record<string, boolean>>({})\n const [empty, setEmpty] = useState(!value)\n\n // Dışarıdan gelen value değişince (kendi çıktımız değilse) içeriği güncelle.\n useEffect(() => {\n const editor = editorRef.current\n if (!editor || value === lastHtml.current) return\n const clean = sanitizeHtml(value)\n if (editor.innerHTML !== clean) editor.innerHTML = clean\n lastHtml.current = value\n setEmpty(!editor.textContent && !editor.querySelector('img'))\n }, [value, sourceMode])\n\n const emit = useCallback(() => {\n const editor = editorRef.current\n if (!editor) return\n const hasContent = Boolean(editor.textContent) || Boolean(editor.querySelector('img'))\n const html = hasContent ? sanitizeHtml(editor.innerHTML) : ''\n setEmpty(!hasContent)\n lastHtml.current = html\n onChange?.(html)\n }, [onChange])\n\n const saveSelection = () => {\n const selection = window.getSelection()\n const editor = editorRef.current\n if (\n selection &&\n selection.rangeCount > 0 &&\n editor?.contains(selection.getRangeAt(0).commonAncestorContainer)\n ) {\n savedRange.current = selection.getRangeAt(0).cloneRange()\n }\n }\n\n const restoreSelection = () => {\n editorRef.current?.focus()\n const selection = window.getSelection()\n if (selection && savedRange.current) {\n selection.removeAllRanges()\n selection.addRange(savedRange.current)\n }\n }\n\n const refreshFormats = () => {\n const query = (command: string) => {\n try {\n return document.queryCommandState(command)\n } catch {\n return false\n }\n }\n setFormats({\n bold: query('bold'),\n italic: query('italic'),\n underline: query('underline'),\n strikeThrough: query('strikeThrough'),\n justifyLeft: query('justifyLeft'),\n justifyCenter: query('justifyCenter'),\n justifyRight: query('justifyRight'),\n justifyFull: query('justifyFull'),\n insertUnorderedList: query('insertUnorderedList'),\n insertOrderedList: query('insertOrderedList'),\n })\n }\n\n const exec = (command: string, arg?: string) => {\n restoreSelection()\n document.execCommand('styleWithCSS', false, 'true')\n document.execCommand(command, false, arg)\n saveSelection()\n refreshFormats()\n emit()\n }\n\n const applyFontSize = (px: number) => {\n restoreSelection()\n document.execCommand('styleWithCSS', false, 'false')\n document.execCommand('fontSize', false, '7')\n editorRef.current?.querySelectorAll('font[size=\"7\"]').forEach((font) => {\n const span = document.createElement('span')\n span.style.fontSize = `${px}px`\n span.append(...Array.from(font.childNodes))\n font.replaceWith(span)\n })\n saveSelection()\n emit()\n }\n\n const insertHtml = (html: string) => {\n restoreSelection()\n document.execCommand('insertHTML', false, sanitizeHtml(html))\n saveSelection()\n emit()\n }\n\n const openPanel = (next: Exclude<Panel, null>) => {\n saveSelection()\n setUrl('')\n setPanel(panel === next ? null : next)\n }\n\n const submitPanel = () => {\n const target = url.trim()\n if (!target) return\n if (panel === 'link') {\n exec('createLink', target)\n editorRef.current?.querySelectorAll('a').forEach((a) => {\n if (/^https?:/i.test(a.getAttribute('href') ?? '')) {\n a.setAttribute('target', '_blank')\n a.setAttribute('rel', 'noopener noreferrer')\n }\n })\n emit()\n } else if (panel === 'image') {\n exec('insertImage', target)\n }\n setPanel(null)\n }\n\n const handleImageFile = async (event: ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0]\n event.target.value = ''\n if (!file || !file.type.startsWith('image/')) return\n const src = onImageUpload ? await onImageUpload(file) : await readFileAsDataUrl(file)\n exec('insertImage', src)\n setPanel(null)\n }\n\n const handlePaste = (event: React.ClipboardEvent<HTMLDivElement>) => {\n const html = event.clipboardData.getData('text/html')\n if (html) {\n event.preventDefault()\n document.execCommand('insertHTML', false, sanitizeHtml(html))\n emit()\n }\n }\n\n const toggleSource = () => {\n if (sourceMode) {\n const clean = sanitizeHtml(source)\n lastHtml.current = null\n if (editorRef.current) editorRef.current.innerHTML = clean\n lastHtml.current = clean\n setEmpty(!clean)\n onChange?.(clean)\n } else {\n setSource(sanitizeHtml(editorRef.current?.innerHTML ?? ''))\n }\n setPanel(null)\n setSourceMode(!sourceMode)\n }\n\n const describedBy =\n [hint && !errorMessage ? hintId : undefined, errorMessage ? errorId : undefined]\n .filter(Boolean)\n .join(' ') || undefined\n const toolsDisabled = disabled || sourceMode\n\n const btn = (\n command: string,\n text: string,\n content: ReactNode,\n arg?: string,\n ) => (\n <ToolButton\n label={text}\n active={formats[command]}\n disabled={toolsDisabled}\n onClick={() => exec(command, arg)}\n >\n {content}\n </ToolButton>\n )\n\n return (\n <div\n className={[\n 'inconel-field',\n fullWidth ? 'inconel-field--full-width' : '',\n className ?? '',\n ].join(' ')}\n >\n {label && (\n <label className=\"inconel-field__label\" htmlFor={editorId}>\n {label}\n {required && <span aria-hidden=\"true\"> *</span>}\n </label>\n )}\n <div\n className={[\n 'inconel-rte',\n errorMessage ? 'inconel-is-invalid' : '',\n disabled ? 'inconel-is-disabled' : '',\n ].join(' ')}\n >\n <div className=\"inconel-rte__toolbar\" role=\"toolbar\" aria-label=\"Biçimlendirme\">\n {btn('bold', 'Kalın', <b>B</b>)}\n {btn('italic', 'İtalik', <i>I</i>)}\n {btn('underline', 'Altı çizili', <u>U</u>)}\n {btn('strikeThrough', 'Üstü çizili', <s>S</s>)}\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', '⇤')}\n {btn('justifyCenter', 'Ortala', '↔')}\n {btn('justifyRight', 'Sağa hizala', '⇥')}\n {btn('justifyFull', 'İki yana yasla', '☰')}\n <span className=\"inconel-rte__sep\" />\n {btn('insertUnorderedList', 'Madde işaretli liste', '• ≡')}\n {btn('insertOrderedList', 'Numaralı liste', '1.≡')}\n {btn('outdent', 'Girintiyi azalt', '⇠')}\n {btn('indent', 'Girintiyi artır', '⇢')}\n {btn('removeFormat', 'Biçimi temizle', 'Tₓ')}\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 🔗\n </ToolButton>\n <ToolButton\n label=\"Görsel ekle\"\n disabled={toolsDisabled}\n active={panel === 'image'}\n onClick={() => openPanel('image')}\n >\n 🖼\n </ToolButton>\n {onRequestMedia && (\n <ToolButton\n label=\"Medya galerisi\"\n disabled={toolsDisabled}\n onClick={() => {\n saveSelection()\n onRequestMedia(insertHtml)\n }}\n >\n 🗂\n </ToolButton>\n )}\n <span className=\"inconel-rte__sep\" />\n {btn('undo', 'Geri al', '↶')}\n {btn('redo', 'Yinele', '↷')}\n <ToolButton\n label=\"HTML kaynağı\"\n disabled={disabled}\n active={sourceMode}\n onClick={toggleSource}\n >\n {'</>'}\n </ToolButton>\n </div>\n\n {panel && !sourceMode && (\n <div className=\"inconel-rte__panel\">\n <input\n type=\"url\"\n className=\"inconel-rte__input\"\n aria-label={panel === 'link' ? 'Bağlantı adresi' : 'Görsel adresi'}\n placeholder={panel === 'link' ? 'https://…' : 'Görsel URL (https://…)'}\n value={url}\n autoFocus\n onChange={(event) => setUrl(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n submitPanel()\n }\n }}\n />\n <button type=\"button\" className=\"inconel-rte__action\" onClick={submitPanel}>\n Ekle\n </button>\n {panel === 'image' && (\n <label className=\"inconel-rte__action\">\n Dosya seç\n <input\n type=\"file\"\n accept=\"image/*\"\n hidden\n aria-label=\"Görsel dosyası\"\n onChange={handleImageFile}\n />\n </label>\n )}\n </div>\n )}\n\n {sourceMode ? (\n <textarea\n id={editorId}\n className=\"inconel-rte__source\"\n style={{ minHeight }}\n aria-label={label ?? 'HTML kaynağı'}\n value={source}\n disabled={disabled}\n spellCheck={false}\n onChange={(event) => setSource(event.target.value)}\n />\n ) : (\n <div className=\"inconel-rte__surface\" style={{ minHeight }}>\n {empty && placeholder && (\n <span className=\"inconel-rte__placeholder\" aria-hidden=\"true\">\n {placeholder}\n </span>\n )}\n <div\n ref={editorRef}\n id={editorId}\n className=\"inconel-rte__content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-label={label}\n aria-required={required}\n aria-invalid={Boolean(errorMessage)}\n aria-describedby={describedBy}\n aria-disabled={disabled}\n contentEditable={!disabled}\n suppressContentEditableWarning\n style={{ minHeight }}\n onInput={emit}\n onPaste={handlePaste}\n onKeyUp={() => {\n saveSelection()\n refreshFormats()\n }}\n onMouseUp={() => {\n saveSelection()\n refreshFormats()\n }}\n onBlur={() => {\n saveSelection()\n onBlur?.()\n }}\n />\n </div>\n )}\n </div>\n <FieldFeedback hint={hint} errorMessage={errorMessage} hintId={hintId} errorId={errorId} />\n </div>\n )\n}\n"],"names":["BLOCKS","FONT_SIZES","readFileAsDataUrl","file","resolve","reject","reader","ToolButton","label","onClick","disabled","active","children","jsx","event","RichTextEditor","value","onChange","onBlur","placeholder","id","required","fullWidth","className","minHeight","onImageUpload","onRequestMedia","hint","errorMessage","generatedId","useId","editorId","hintId","errorId","editorRef","useRef","savedRange","lastHtml","sourceMode","setSourceMode","useState","source","setSource","panel","setPanel","url","setUrl","formats","setFormats","empty","setEmpty","useEffect","editor","clean","sanitizeHtml","emit","useCallback","hasContent","html","saveSelection","selection","restoreSelection","refreshFormats","query","command","exec","arg","applyFontSize","px","font","span","insertHtml","openPanel","next","submitPanel","target","a","handleImageFile","src","handlePaste","toggleSource","describedBy","toolsDisabled","btn","text","content","jsxs","block","size","FieldFeedback"],"mappings":"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"}
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' | null\n\nconst readFileAsDataUrl = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(file)\n })\n\ninterface ToolButtonProps {\n label: string\n onClick: () => void\n disabled?: boolean\n active?: boolean\n children: ReactNode\n}\n\nfunction ToolButton({ label, onClick, disabled, active, children }: ToolButtonProps) {\n return (\n <button\n type=\"button\"\n className={`inconel-rte__btn${active ? ' inconel-is-active' : ''}`}\n aria-label={label}\n title={label}\n aria-pressed={active}\n disabled={disabled}\n onMouseDown={(event) => event.preventDefault()}\n onClick={onClick}\n >\n {children}\n </button>\n )\n}\n\nexport default function RichTextEditor({\n value = '',\n onChange,\n onBlur,\n label,\n placeholder,\n id,\n disabled = false,\n required,\n fullWidth = true,\n className,\n minHeight = 200,\n onImageUpload,\n onRequestMedia,\n hint,\n errorMessage,\n}: RichTextEditorProps) {\n const generatedId = useId()\n const editorId = id ?? `inconel-rte-${generatedId.replace(/:/g, '')}`\n const hintId = `${editorId}-hint`\n const errorId = `${editorId}-error`\n\n const editorRef = useRef<HTMLDivElement>(null)\n const savedRange = useRef<Range | null>(null)\n const lastHtml = useRef<string | null>(null)\n const [sourceMode, setSourceMode] = useState(false)\n const [source, setSource] = useState('')\n const [panel, setPanel] = useState<Panel>(null)\n const [url, setUrl] = useState('')\n const [formats, setFormats] = useState<Record<string, boolean>>({})\n const [empty, setEmpty] = useState(!value)\n\n // Dışarıdan gelen value değişince (kendi çıktımız değilse) içeriği güncelle.\n useEffect(() => {\n const editor = editorRef.current\n if (!editor || value === lastHtml.current) return\n const clean = sanitizeHtml(value)\n if (editor.innerHTML !== clean) editor.innerHTML = clean\n lastHtml.current = value\n setEmpty(!editor.textContent && !editor.querySelector('img'))\n }, [value, sourceMode])\n\n const emit = useCallback(() => {\n const editor = editorRef.current\n if (!editor) return\n const hasContent = Boolean(editor.textContent) || Boolean(editor.querySelector('img'))\n const html = hasContent ? sanitizeHtml(editor.innerHTML) : ''\n setEmpty(!hasContent)\n lastHtml.current = html\n onChange?.(html)\n }, [onChange])\n\n const saveSelection = () => {\n const selection = window.getSelection()\n const editor = editorRef.current\n if (\n selection &&\n selection.rangeCount > 0 &&\n editor?.contains(selection.getRangeAt(0).commonAncestorContainer)\n ) {\n savedRange.current = selection.getRangeAt(0).cloneRange()\n }\n }\n\n const restoreSelection = () => {\n editorRef.current?.focus()\n const selection = window.getSelection()\n if (selection && savedRange.current) {\n selection.removeAllRanges()\n selection.addRange(savedRange.current)\n }\n }\n\n const refreshFormats = () => {\n const query = (command: string) => {\n try {\n return document.queryCommandState(command)\n } catch {\n return false\n }\n }\n setFormats({\n bold: query('bold'),\n italic: query('italic'),\n underline: query('underline'),\n strikeThrough: query('strikeThrough'),\n justifyLeft: query('justifyLeft'),\n justifyCenter: query('justifyCenter'),\n justifyRight: query('justifyRight'),\n justifyFull: query('justifyFull'),\n insertUnorderedList: query('insertUnorderedList'),\n insertOrderedList: query('insertOrderedList'),\n })\n }\n\n const exec = (command: string, arg?: string) => {\n restoreSelection()\n document.execCommand('styleWithCSS', false, 'true')\n document.execCommand(command, false, arg)\n saveSelection()\n refreshFormats()\n emit()\n }\n\n const applyFontSize = (px: number) => {\n restoreSelection()\n document.execCommand('styleWithCSS', false, 'false')\n document.execCommand('fontSize', false, '7')\n editorRef.current?.querySelectorAll('font[size=\"7\"]').forEach((font) => {\n const span = document.createElement('span')\n span.style.fontSize = `${px}px`\n span.append(...Array.from(font.childNodes))\n font.replaceWith(span)\n })\n saveSelection()\n emit()\n }\n\n const insertHtml = (html: string) => {\n restoreSelection()\n document.execCommand('insertHTML', false, sanitizeHtml(html))\n saveSelection()\n emit()\n }\n\n const openPanel = (next: Exclude<Panel, null>) => {\n saveSelection()\n setUrl('')\n setPanel(panel === next ? null : next)\n }\n\n const submitPanel = () => {\n const target = url.trim()\n if (!target) return\n if (panel === 'link') {\n exec('createLink', target)\n editorRef.current?.querySelectorAll('a').forEach((a) => {\n if (/^https?:/i.test(a.getAttribute('href') ?? '')) {\n a.setAttribute('target', '_blank')\n a.setAttribute('rel', 'noopener noreferrer')\n }\n })\n emit()\n } else if (panel === 'image') {\n exec('insertImage', target)\n }\n setPanel(null)\n }\n\n const handleImageFile = async (event: ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0]\n event.target.value = ''\n if (!file || !file.type.startsWith('image/')) return\n const src = onImageUpload ? await onImageUpload(file) : await readFileAsDataUrl(file)\n exec('insertImage', src)\n setPanel(null)\n }\n\n const handlePaste = (event: React.ClipboardEvent<HTMLDivElement>) => {\n const html = event.clipboardData.getData('text/html')\n if (html) {\n event.preventDefault()\n document.execCommand('insertHTML', false, sanitizeHtml(html))\n emit()\n }\n }\n\n const toggleSource = () => {\n if (sourceMode) {\n const clean = sanitizeHtml(source)\n lastHtml.current = null\n if (editorRef.current) editorRef.current.innerHTML = clean\n lastHtml.current = clean\n setEmpty(!clean)\n onChange?.(clean)\n } else {\n setSource(sanitizeHtml(editorRef.current?.innerHTML ?? ''))\n }\n setPanel(null)\n setSourceMode(!sourceMode)\n }\n\n const describedBy =\n [hint && !errorMessage ? hintId : undefined, errorMessage ? errorId : undefined]\n .filter(Boolean)\n .join(' ') || undefined\n const toolsDisabled = disabled || sourceMode\n\n const btn = (\n command: string,\n text: string,\n content: ReactNode,\n arg?: string,\n ) => (\n <ToolButton\n label={text}\n active={formats[command]}\n disabled={toolsDisabled}\n onClick={() => exec(command, arg)}\n >\n {content}\n </ToolButton>\n )\n\n return (\n <div\n className={[\n 'inconel-field',\n fullWidth ? 'inconel-field--full-width' : '',\n className ?? '',\n ].join(' ')}\n >\n {label && (\n <label className=\"inconel-field__label\" htmlFor={editorId}>\n {label}\n {required && <span aria-hidden=\"true\"> *</span>}\n </label>\n )}\n <div\n className={[\n 'inconel-rte',\n errorMessage ? 'inconel-is-invalid' : '',\n disabled ? 'inconel-is-disabled' : '',\n ].join(' ')}\n >\n <div className=\"inconel-rte__toolbar\" role=\"toolbar\" aria-label=\"Biçimlendirme\">\n {btn('bold', 'Kalın', icons.bold)}\n {btn('italic', 'İtalik', icons.italic)}\n {btn('underline', 'Altı çizili', icons.underline)}\n {btn('strikeThrough', 'Üstü çizili', icons.strike)}\n <span className=\"inconel-rte__sep\" />\n <select\n className=\"inconel-rte__select\"\n aria-label=\"Biçim\"\n disabled={toolsDisabled}\n value=\"\"\n onChange={(event) => {\n if (event.target.value) exec('formatBlock', event.target.value)\n }}\n >\n <option value=\"\">Biçim</option>\n {BLOCKS.map((block) => (\n <option key={block.tag} value={block.tag}>\n {block.label}\n </option>\n ))}\n </select>\n <select\n className=\"inconel-rte__select\"\n aria-label=\"Yazı boyutu\"\n disabled={toolsDisabled}\n value=\"\"\n onChange={(event) => {\n if (event.target.value) applyFontSize(Number(event.target.value))\n }}\n >\n <option value=\"\">Boyut</option>\n {FONT_SIZES.map((size) => (\n <option key={size} value={size}>\n {size}px\n </option>\n ))}\n </select>\n <span className=\"inconel-rte__sep\" />\n {btn('justifyLeft', 'Sola hizala', icons.alignLeft)}\n {btn('justifyCenter', 'Ortala', icons.alignCenter)}\n {btn('justifyRight', 'Sağa hizala', icons.alignRight)}\n {btn('justifyFull', 'İki yana yasla', icons.alignJustify)}\n <span className=\"inconel-rte__sep\" />\n {btn('insertUnorderedList', 'Madde işaretli liste', icons.listUl)}\n {btn('insertOrderedList', 'Numaralı liste', icons.listOl)}\n {btn('outdent', 'Girintiyi azalt', icons.outdent)}\n {btn('indent', 'Girintiyi artır', icons.indent)}\n {btn('removeFormat', 'Biçimi temizle', icons.clearFormat)}\n <span className=\"inconel-rte__sep\" />\n <ToolButton\n label=\"Bağlantı ekle\"\n disabled={toolsDisabled}\n active={panel === 'link'}\n onClick={() => openPanel('link')}\n >\n {icons.link}\n </ToolButton>\n <ToolButton\n label=\"Görsel ekle\"\n disabled={toolsDisabled}\n active={panel === 'image'}\n onClick={() => openPanel('image')}\n >\n {icons.image}\n </ToolButton>\n {onRequestMedia && (\n <ToolButton\n label=\"Medya galerisi\"\n disabled={toolsDisabled}\n onClick={() => {\n saveSelection()\n onRequestMedia(insertHtml)\n }}\n >\n {icons.gallery}\n </ToolButton>\n )}\n <span className=\"inconel-rte__sep\" />\n {btn('undo', 'Geri al', icons.undo)}\n {btn('redo', 'Yinele', icons.redo)}\n <ToolButton\n label=\"HTML kaynağı\"\n disabled={disabled}\n active={sourceMode}\n onClick={toggleSource}\n >\n {icons.code}\n </ToolButton>\n </div>\n\n {panel && !sourceMode && (\n <div className=\"inconel-rte__panel\">\n <input\n type=\"url\"\n className=\"inconel-rte__input\"\n aria-label={panel === 'link' ? 'Bağlantı adresi' : 'Görsel adresi'}\n placeholder={panel === 'link' ? 'https://…' : 'Görsel URL (https://…)'}\n value={url}\n autoFocus\n onChange={(event) => setUrl(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n submitPanel()\n }\n }}\n />\n <button type=\"button\" className=\"inconel-rte__action\" onClick={submitPanel}>\n Ekle\n </button>\n {panel === 'image' && (\n <label className=\"inconel-rte__action\">\n Dosya seç\n <input\n type=\"file\"\n accept=\"image/*\"\n hidden\n aria-label=\"Görsel dosyası\"\n onChange={handleImageFile}\n />\n </label>\n )}\n </div>\n )}\n\n {sourceMode ? (\n <textarea\n id={editorId}\n className=\"inconel-rte__source\"\n style={{ minHeight }}\n aria-label={label ?? 'HTML kaynağı'}\n value={source}\n disabled={disabled}\n spellCheck={false}\n onChange={(event) => setSource(event.target.value)}\n />\n ) : (\n <div className=\"inconel-rte__surface\" style={{ minHeight }}>\n {empty && placeholder && (\n <span className=\"inconel-rte__placeholder\" aria-hidden=\"true\">\n {placeholder}\n </span>\n )}\n <div\n ref={editorRef}\n id={editorId}\n className=\"inconel-rte__content\"\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-label={label}\n aria-required={required}\n aria-invalid={Boolean(errorMessage)}\n aria-describedby={describedBy}\n aria-disabled={disabled}\n contentEditable={!disabled}\n suppressContentEditableWarning\n style={{ minHeight }}\n onInput={emit}\n onPaste={handlePaste}\n onKeyUp={() => {\n saveSelection()\n refreshFormats()\n }}\n onMouseUp={() => {\n saveSelection()\n refreshFormats()\n }}\n onBlur={() => {\n saveSelection()\n onBlur?.()\n }}\n />\n </div>\n )}\n </div>\n <FieldFeedback hint={hint} errorMessage={errorMessage} hintId={hintId} errorId={errorId} />\n </div>\n )\n}\n"],"names":["BLOCKS","FONT_SIZES","readFileAsDataUrl","file","resolve","reject","reader","ToolButton","label","onClick","disabled","active","children","jsx","event","RichTextEditor","value","onChange","onBlur","placeholder","id","required","fullWidth","className","minHeight","onImageUpload","onRequestMedia","hint","errorMessage","generatedId","useId","editorId","hintId","errorId","editorRef","useRef","savedRange","lastHtml","sourceMode","setSourceMode","useState","source","setSource","panel","setPanel","url","setUrl","formats","setFormats","empty","setEmpty","useEffect","editor","clean","sanitizeHtml","emit","useCallback","hasContent","html","saveSelection","selection","restoreSelection","refreshFormats","query","command","exec","arg","applyFontSize","px","font","span","insertHtml","openPanel","next","submitPanel","target","a","handleImageFile","src","handlePaste","toggleSource","describedBy","toolsDisabled","btn","text","content","jsxs","icons","block","size","FieldFeedback"],"mappings":"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"}