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.
- package/dist/cjs/components/RichTextEditor/RichTextEditor.cjs +1 -1
- package/dist/cjs/components/RichTextEditor/RichTextEditor.cjs.map +1 -1
- package/dist/cjs/components/RichTextEditor/icons.cjs +2 -0
- package/dist/cjs/components/RichTextEditor/icons.cjs.map +1 -0
- package/dist/cjs/styles.css +1 -1
- package/dist/components/RichTextEditor/RichTextEditor.d.ts.map +1 -1
- package/dist/components/RichTextEditor/RichTextEditor.js +157 -156
- package/dist/components/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/components/RichTextEditor/icons.d.ts +22 -0
- package/dist/components/RichTextEditor/icons.d.ts.map +1 -0
- package/dist/components/RichTextEditor/icons.js +67 -0
- package/dist/components/RichTextEditor/icons.js.map +1 -0
- package/dist/styles.css +1 -1
- package/package.json +13 -13
|
@@ -1,71 +1,72 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useId as
|
|
3
|
-
import
|
|
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 {
|
|
7
|
-
|
|
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
|
-
],
|
|
14
|
+
], de = [12, 14, 16, 18, 24, 32], me = (r) => new Promise((m, _) => {
|
|
14
15
|
const a = new FileReader();
|
|
15
|
-
a.onload = () =>
|
|
16
|
+
a.onload = () => m(String(a.result)), a.onerror = () => _(a.error), a.readAsDataURL(r);
|
|
16
17
|
});
|
|
17
|
-
function
|
|
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":
|
|
24
|
-
title:
|
|
24
|
+
"aria-label": r,
|
|
25
|
+
title: r,
|
|
25
26
|
"aria-pressed": a,
|
|
26
|
-
disabled:
|
|
27
|
-
onMouseDown: (
|
|
28
|
-
onClick:
|
|
29
|
-
children:
|
|
27
|
+
disabled: _,
|
|
28
|
+
onMouseDown: (x) => x.preventDefault(),
|
|
29
|
+
onClick: m,
|
|
30
|
+
children: L
|
|
30
31
|
}
|
|
31
32
|
);
|
|
32
33
|
}
|
|
33
|
-
function
|
|
34
|
-
value:
|
|
35
|
-
onChange:
|
|
36
|
-
onBlur:
|
|
34
|
+
function ke({
|
|
35
|
+
value: r = "",
|
|
36
|
+
onChange: m,
|
|
37
|
+
onBlur: _,
|
|
37
38
|
label: a,
|
|
38
|
-
placeholder:
|
|
39
|
-
id:
|
|
40
|
-
disabled:
|
|
41
|
-
required:
|
|
42
|
-
fullWidth:
|
|
43
|
-
className:
|
|
44
|
-
minHeight:
|
|
45
|
-
onImageUpload:
|
|
46
|
-
onRequestMedia:
|
|
47
|
-
hint:
|
|
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
|
|
51
|
-
|
|
52
|
-
const e =
|
|
53
|
-
if (!e ||
|
|
54
|
-
const t =
|
|
55
|
-
e.innerHTML !== t && (e.innerHTML = t),
|
|
56
|
-
}, [
|
|
57
|
-
const h =
|
|
58
|
-
const e =
|
|
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"),
|
|
61
|
-
|
|
62
|
-
}, [
|
|
63
|
-
const e = window.getSelection(), t =
|
|
64
|
-
e && e.rangeCount > 0 && t?.contains(e.getRangeAt(0).commonAncestorContainer) && (
|
|
65
|
-
},
|
|
66
|
-
|
|
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 &&
|
|
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
|
-
|
|
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
|
-
},
|
|
90
|
-
|
|
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
|
-
|
|
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
|
-
|
|
100
|
-
},
|
|
101
|
-
const e =
|
|
102
|
-
e && (
|
|
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()) :
|
|
105
|
-
},
|
|
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
|
|
109
|
-
|
|
110
|
-
},
|
|
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,
|
|
113
|
-
},
|
|
114
|
-
if (
|
|
115
|
-
const e =
|
|
116
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
},
|
|
121
|
-
|
|
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:
|
|
126
|
-
onClick: () =>
|
|
127
|
-
children:
|
|
126
|
+
disabled: g,
|
|
127
|
+
onClick: () => S(e, ae),
|
|
128
|
+
children: s
|
|
128
129
|
}
|
|
129
130
|
);
|
|
130
|
-
return /* @__PURE__ */
|
|
131
|
+
return /* @__PURE__ */ c(
|
|
131
132
|
"div",
|
|
132
133
|
{
|
|
133
134
|
className: [
|
|
134
135
|
"inconel-field",
|
|
135
|
-
|
|
136
|
-
|
|
136
|
+
$ ? "inconel-field--full-width" : "",
|
|
137
|
+
K ?? ""
|
|
137
138
|
].join(" "),
|
|
138
139
|
children: [
|
|
139
|
-
a && /* @__PURE__ */
|
|
140
|
+
a && /* @__PURE__ */ c("label", { className: "inconel-field__label", htmlFor: C, children: [
|
|
140
141
|
a,
|
|
141
|
-
|
|
142
|
+
D && /* @__PURE__ */ n("span", { "aria-hidden": "true", children: " *" })
|
|
142
143
|
] }),
|
|
143
|
-
/* @__PURE__ */
|
|
144
|
+
/* @__PURE__ */ c(
|
|
144
145
|
"div",
|
|
145
146
|
{
|
|
146
147
|
className: [
|
|
147
148
|
"inconel-rte",
|
|
148
|
-
|
|
149
|
-
|
|
149
|
+
k ? "inconel-is-invalid" : "",
|
|
150
|
+
p ? "inconel-is-disabled" : ""
|
|
150
151
|
].join(" "),
|
|
151
152
|
children: [
|
|
152
|
-
/* @__PURE__ */
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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__ */
|
|
159
|
+
/* @__PURE__ */ c(
|
|
159
160
|
"select",
|
|
160
161
|
{
|
|
161
162
|
className: "inconel-rte__select",
|
|
162
163
|
"aria-label": "Biçim",
|
|
163
|
-
disabled:
|
|
164
|
+
disabled: g,
|
|
164
165
|
value: "",
|
|
165
166
|
onChange: (e) => {
|
|
166
|
-
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
|
-
|
|
171
|
+
ue.map((e) => /* @__PURE__ */ n("option", { value: e.tag, children: e.label }, e.tag))
|
|
171
172
|
]
|
|
172
173
|
}
|
|
173
174
|
),
|
|
174
|
-
/* @__PURE__ */
|
|
175
|
+
/* @__PURE__ */ c(
|
|
175
176
|
"select",
|
|
176
177
|
{
|
|
177
178
|
className: "inconel-rte__select",
|
|
178
179
|
"aria-label": "Yazı boyutu",
|
|
179
|
-
disabled:
|
|
180
|
+
disabled: g,
|
|
180
181
|
value: "",
|
|
181
182
|
onChange: (e) => {
|
|
182
|
-
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
|
-
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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
|
-
|
|
207
|
+
N,
|
|
207
208
|
{
|
|
208
209
|
label: "Bağlantı ekle",
|
|
209
|
-
disabled:
|
|
210
|
-
active:
|
|
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
|
-
|
|
217
|
+
N,
|
|
217
218
|
{
|
|
218
219
|
label: "Görsel ekle",
|
|
219
|
-
disabled:
|
|
220
|
-
active:
|
|
220
|
+
disabled: g,
|
|
221
|
+
active: u === "image",
|
|
221
222
|
onClick: () => q("image"),
|
|
222
|
-
children:
|
|
223
|
+
children: l.image
|
|
223
224
|
}
|
|
224
225
|
),
|
|
225
|
-
|
|
226
|
-
|
|
226
|
+
z && /* @__PURE__ */ n(
|
|
227
|
+
N,
|
|
227
228
|
{
|
|
228
229
|
label: "Medya galerisi",
|
|
229
|
-
disabled:
|
|
230
|
+
disabled: g,
|
|
230
231
|
onClick: () => {
|
|
231
|
-
|
|
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
|
-
|
|
238
|
-
|
|
238
|
+
i("undo", "Geri al", l.undo),
|
|
239
|
+
i("redo", "Yinele", l.redo),
|
|
239
240
|
/* @__PURE__ */ n(
|
|
240
|
-
|
|
241
|
+
N,
|
|
241
242
|
{
|
|
242
243
|
label: "HTML kaynağı",
|
|
243
|
-
disabled:
|
|
244
|
-
active:
|
|
245
|
-
onClick:
|
|
246
|
-
children:
|
|
244
|
+
disabled: p,
|
|
245
|
+
active: f,
|
|
246
|
+
onClick: le,
|
|
247
|
+
children: l.code
|
|
247
248
|
}
|
|
248
249
|
)
|
|
249
250
|
] }),
|
|
250
|
-
|
|
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":
|
|
257
|
-
placeholder:
|
|
258
|
-
value:
|
|
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(),
|
|
263
|
+
e.key === "Enter" && (e.preventDefault(), W());
|
|
263
264
|
}
|
|
264
265
|
}
|
|
265
266
|
),
|
|
266
|
-
/* @__PURE__ */ n("button", { type: "button", className: "inconel-rte__action", onClick:
|
|
267
|
-
|
|
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:
|
|
277
|
+
onChange: te
|
|
277
278
|
}
|
|
278
279
|
)
|
|
279
280
|
] })
|
|
280
281
|
] }),
|
|
281
|
-
|
|
282
|
+
f ? /* @__PURE__ */ n(
|
|
282
283
|
"textarea",
|
|
283
284
|
{
|
|
284
|
-
id:
|
|
285
|
+
id: C,
|
|
285
286
|
className: "inconel-rte__source",
|
|
286
|
-
style: { minHeight:
|
|
287
|
+
style: { minHeight: j },
|
|
287
288
|
"aria-label": a ?? "HTML kaynağı",
|
|
288
|
-
value:
|
|
289
|
-
disabled:
|
|
289
|
+
value: U,
|
|
290
|
+
disabled: p,
|
|
290
291
|
spellCheck: !1,
|
|
291
|
-
onChange: (e) =>
|
|
292
|
+
onChange: (e) => G(e.target.value)
|
|
292
293
|
}
|
|
293
|
-
) : /* @__PURE__ */
|
|
294
|
-
|
|
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:
|
|
299
|
-
id:
|
|
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":
|
|
305
|
-
"aria-invalid": !!
|
|
306
|
-
"aria-describedby":
|
|
307
|
-
"aria-disabled":
|
|
308
|
-
contentEditable: !
|
|
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:
|
|
311
|
+
style: { minHeight: j },
|
|
311
312
|
onInput: h,
|
|
312
|
-
onPaste:
|
|
313
|
+
onPaste: ne,
|
|
313
314
|
onKeyUp: () => {
|
|
314
|
-
|
|
315
|
+
d(), A();
|
|
315
316
|
},
|
|
316
317
|
onMouseUp: () => {
|
|
317
|
-
|
|
318
|
+
d(), A();
|
|
318
319
|
},
|
|
319
320
|
onBlur: () => {
|
|
320
|
-
|
|
321
|
+
d(), _?.();
|
|
321
322
|
}
|
|
322
323
|
}
|
|
323
324
|
)
|
|
@@ -325,12 +326,12 @@ function be({
|
|
|
325
326
|
]
|
|
326
327
|
}
|
|
327
328
|
),
|
|
328
|
-
/* @__PURE__ */ n(
|
|
329
|
+
/* @__PURE__ */ n(ce, { hint: H, errorMessage: k, hintId: M, errorId: I })
|
|
329
330
|
]
|
|
330
331
|
}
|
|
331
332
|
);
|
|
332
333
|
}
|
|
333
334
|
export {
|
|
334
|
-
|
|
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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"}
|