@ryuzaki13/react-foundation-ui 1.0.11 → 1.0.13

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.
@@ -0,0 +1,1479 @@
1
+ import { n as e } from "./button-CC0Jdx1j.js";
2
+ import { r as t } from "./grid-ByIIytjh.js";
3
+ import { n } from "./input-CZLUUggm.js";
4
+ import { i as r, n as i, r as a } from "./modal-C0j0hEIt.js";
5
+ import { t as o } from "./check-box-BowNqqd3.js";
6
+ import { n as s } from "./radio-group-B9XjkcOy.js";
7
+ import { a as c, i as l, n as u, r as d, t as f } from "./types-CxXyru6U.js";
8
+ import { useCallback as p, useEffect as m, useEffectEvent as h, useMemo as g, useRef as _, useState as v } from "react";
9
+ import { cn as y } from "@ryuzaki13/react-foundation-lib/utils";
10
+ import { isSafe as b, validateUrl as x } from "@ryuzaki13/react-foundation-lib/validators";
11
+ import { formatPhone as S } from "@ryuzaki13/react-foundation-lib/formatters";
12
+ import { AlignCenter as C, AlignJustify as w, AlignLeft as T, AlignRight as E, AtSign as D, BookType as O, BrushCleaning as ee, Clock as te, ExternalLink as ne, Languages as re, Link as ie, MessageSquareQuote as ae, Phone as oe, PictureInPicture as se, Redo as ce, Shredder as le, Undo as ue } from "lucide-react";
13
+ import { Fragment as k, jsx as A, jsxs as j } from "react/jsx-runtime";
14
+ import { $generateHtmlFromNodes as de, $generateNodesFromDOM as fe } from "@lexical/html";
15
+ import { $isListItemNode as pe, $isListNode as M, INSERT_ORDERED_LIST_COMMAND as me, INSERT_UNORDERED_LIST_COMMAND as he, ListItemNode as ge, ListNode as _e, REMOVE_LIST_COMMAND as N } from "@lexical/list";
16
+ import { LexicalComposer as ve } from "@lexical/react/LexicalComposer";
17
+ import { ContentEditable as ye } from "@lexical/react/LexicalContentEditable";
18
+ import { LexicalErrorBoundary as be } from "@lexical/react/LexicalErrorBoundary";
19
+ import { HistoryPlugin as xe } from "@lexical/react/LexicalHistoryPlugin";
20
+ import { ListPlugin as Se } from "@lexical/react/LexicalListPlugin";
21
+ import { OnChangePlugin as Ce } from "@lexical/react/LexicalOnChangePlugin";
22
+ import { RichTextPlugin as we } from "@lexical/react/LexicalRichTextPlugin";
23
+ import { $createHeadingNode as Te, $createQuoteNode as Ee, $isHeadingNode as De, $isQuoteNode as Oe, HeadingNode as ke, QuoteNode as Ae } from "@lexical/rich-text";
24
+ import { useLexicalComposerContext as P } from "@lexical/react/LexicalComposerContext";
25
+ import { $applyNodeReplacement as F, $createParagraphNode as I, $createTextNode as L, $getRoot as je, $getSelection as R, $isRangeSelection as z, ElementNode as Me, FORMAT_ELEMENT_COMMAND as Ne, FORMAT_TEXT_COMMAND as Pe, REDO_COMMAND as Fe, UNDO_COMMAND as Ie } from "lexical";
26
+ import { $isLinkNode as B, LinkNode as Le } from "@lexical/link";
27
+ import { $setBlocksType as V } from "@lexical/selection";
28
+ import { $findMatchingParent as Re } from "@lexical/utils";
29
+ var H = {
30
+ toolbar: "shIOqq",
31
+ groupControls: "YM-4Dq"
32
+ };
33
+ //#endregion
34
+ //#region src/text-editor/toolbar/ToolbarControl.tsx
35
+ function U({ isActive: t, disabled: n, style: r, title: i, icon: a, onClick: o }) {
36
+ return /* @__PURE__ */ A(e, {
37
+ title: i,
38
+ disabled: n,
39
+ appearance: "outline",
40
+ tone: t ? "info" : void 0,
41
+ onMouseDown: (e) => {
42
+ e.preventDefault(), o?.(r || "");
43
+ },
44
+ icon: a
45
+ });
46
+ }
47
+ //#endregion
48
+ //#region src/text-editor/toolbar/AlignmentControls.tsx
49
+ function W({ onAlignmentChange: e, activeAlignment: t }) {
50
+ return /* @__PURE__ */ j("div", {
51
+ className: H.groupControls,
52
+ children: [
53
+ /* @__PURE__ */ A(U, {
54
+ title: "По левому краю",
55
+ icon: /* @__PURE__ */ A(T, {}),
56
+ isActive: t === "left",
57
+ onClick: () => e("left")
58
+ }),
59
+ /* @__PURE__ */ A(U, {
60
+ title: "По центру",
61
+ icon: /* @__PURE__ */ A(C, {}),
62
+ isActive: t === "center",
63
+ onClick: () => e("center")
64
+ }),
65
+ /* @__PURE__ */ A(U, {
66
+ title: "По правому краю",
67
+ icon: /* @__PURE__ */ A(E, {}),
68
+ isActive: t === "right",
69
+ onClick: () => e("right")
70
+ }),
71
+ /* @__PURE__ */ A(U, {
72
+ title: "По ширине",
73
+ icon: /* @__PURE__ */ A(w, {}),
74
+ isActive: t === "justify",
75
+ onClick: () => e("justify")
76
+ })
77
+ ]
78
+ });
79
+ }
80
+ //#endregion
81
+ //#region src/text-editor/toolbar/HistoryControls.tsx
82
+ function ze({ onUndo: e, onRedo: t }) {
83
+ return /* @__PURE__ */ j("div", {
84
+ className: H.groupControls,
85
+ children: [/* @__PURE__ */ A(U, {
86
+ title: "Отменить последнее действие",
87
+ icon: /* @__PURE__ */ A(ue, {}),
88
+ onClick: e
89
+ }), /* @__PURE__ */ A(U, {
90
+ title: "Повторить предыдущее действие",
91
+ icon: /* @__PURE__ */ A(ce, {}),
92
+ onClick: t
93
+ })]
94
+ });
95
+ }
96
+ //#endregion
97
+ //#region src/text-editor/toolbar/LinkButtons.tsx
98
+ function Be({ disabled: e, onClick: t }) {
99
+ return /* @__PURE__ */ j("div", {
100
+ className: H.groupControls,
101
+ children: [
102
+ /* @__PURE__ */ A(U, {
103
+ title: "Добавить ссылку на статью",
104
+ icon: /* @__PURE__ */ A(ie, {}),
105
+ onClick: () => t(f.LOCAL_LINK)
106
+ }),
107
+ /* @__PURE__ */ A(U, {
108
+ title: "Добавить ссылку",
109
+ disabled: e,
110
+ icon: /* @__PURE__ */ A(ne, {}),
111
+ onClick: () => t(f.LINK)
112
+ }),
113
+ /* @__PURE__ */ A(U, {
114
+ title: "Добавить телефон",
115
+ disabled: e,
116
+ icon: /* @__PURE__ */ A(oe, {}),
117
+ onClick: () => t(f.PHONE)
118
+ }),
119
+ /* @__PURE__ */ A(U, {
120
+ title: "Добавить email",
121
+ disabled: e,
122
+ icon: /* @__PURE__ */ A(D, {}),
123
+ onClick: () => t(f.EMAIL)
124
+ })
125
+ ]
126
+ });
127
+ }
128
+ //#endregion
129
+ //#region src/text-editor/toolbar/TagButtons.tsx
130
+ function Ve({ onClick: e }) {
131
+ return /* @__PURE__ */ j("div", {
132
+ className: H.groupControls,
133
+ children: [
134
+ /* @__PURE__ */ A(U, {
135
+ title: "Вставить Аббревиатуру",
136
+ icon: /* @__PURE__ */ A(O, {}),
137
+ onClick: () => e(u.abbr)
138
+ }),
139
+ /* @__PURE__ */ A(U, {
140
+ title: "Вставить Код языка",
141
+ icon: /* @__PURE__ */ A(re, {}),
142
+ onClick: () => e(u.lang)
143
+ }),
144
+ /* @__PURE__ */ A(U, {
145
+ title: "Вставить Дату/время",
146
+ icon: /* @__PURE__ */ A(te, {}),
147
+ onClick: () => e(u.time)
148
+ }),
149
+ /* @__PURE__ */ A(U, {
150
+ title: "Вставить Ссылку на источник",
151
+ icon: /* @__PURE__ */ A(ae, {}),
152
+ onClick: () => e(u.cite)
153
+ }),
154
+ /* @__PURE__ */ A(U, {
155
+ title: "Вставить Удалённый фрагмент",
156
+ icon: /* @__PURE__ */ A(le, {}),
157
+ onClick: () => e(u.del)
158
+ }),
159
+ /* @__PURE__ */ A(U, {
160
+ title: "Вставить Добавленный фрагмент",
161
+ icon: /* @__PURE__ */ A(se, {}),
162
+ onClick: () => e(u.ins)
163
+ })
164
+ ]
165
+ });
166
+ }
167
+ //#endregion
168
+ //#region src/text-editor/toolbar/TextEditorToolbarLexical.tsx
169
+ function He({ toolbarComponents: e, state: t, onBlockStyleToggle: n, onInlineStyleToggle: r, onAlignmentChange: i, onLinkClick: a, onTagClick: o, onUndo: s, onRedo: c, onCleanTag: u }) {
170
+ let f = {
171
+ history: !0,
172
+ ...e || {}
173
+ };
174
+ return /* @__PURE__ */ j("div", {
175
+ className: H.toolbar,
176
+ children: [
177
+ f.blocks && /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ A("div", {
178
+ className: H.groupControls,
179
+ children: d.map((e) => /* @__PURE__ */ A(U, {
180
+ isActive: e.style === t.blockType,
181
+ style: e.style,
182
+ title: e.label,
183
+ icon: e.icon,
184
+ onClick: n
185
+ }, e.style))
186
+ }), /* @__PURE__ */ A("hr", {})] }),
187
+ f.inline && /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ A("div", {
188
+ className: H.groupControls,
189
+ children: l.map((e) => /* @__PURE__ */ A(U, {
190
+ isActive: !!t.activeInlineStyles[e.style],
191
+ title: e.label,
192
+ style: e.style,
193
+ icon: e.icon,
194
+ disabled: t.isTextUnselected,
195
+ onClick: r
196
+ }, e.style))
197
+ }), /* @__PURE__ */ A("hr", {})] }),
198
+ f.alignment && /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ A(W, {
199
+ activeAlignment: t.activeAlignment,
200
+ onAlignmentChange: i
201
+ }), /* @__PURE__ */ A("hr", {})] }),
202
+ f.links && /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ A(Be, {
203
+ disabled: t.isTextUnselected,
204
+ onClick: a
205
+ }), /* @__PURE__ */ A("hr", {})] }),
206
+ f.tags && /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ A(Ve, { onClick: o }), /* @__PURE__ */ A("hr", {})] }),
207
+ f.history && /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ A(ze, {
208
+ onUndo: s,
209
+ onRedo: c
210
+ }), /* @__PURE__ */ A("hr", {})] }),
211
+ /* @__PURE__ */ A(U, {
212
+ disabled: t.isTextUnselected,
213
+ title: "Очистить выбранный тег",
214
+ icon: /* @__PURE__ */ A(ee, {}),
215
+ onClick: u
216
+ })
217
+ ]
218
+ });
219
+ }
220
+ //#endregion
221
+ //#region src/text-editor/lexical/plugins/InitialHtmlPlugin.tsx
222
+ function Ue({ initialHTML: e, shouldSkip: t }) {
223
+ let [n] = P(), r = _(!1);
224
+ return m(() => {
225
+ t || !e || r.current || typeof window > "u" || (r.current = !0, n.update(() => {
226
+ let t = je(), r = new DOMParser().parseFromString(e, "text/html"), i = fe(n, r);
227
+ if (t.clear(), i.length === 0) {
228
+ t.append(I());
229
+ return;
230
+ }
231
+ t.append(...i);
232
+ }));
233
+ }, [
234
+ n,
235
+ e,
236
+ t
237
+ ]), null;
238
+ }
239
+ //#endregion
240
+ //#region src/text-editor/model/textEditorTypes.ts
241
+ var G = {
242
+ blockType: "unstyled",
243
+ isTextUnselected: !0,
244
+ activeInlineStyles: {
245
+ BOLD: !1,
246
+ ITALIC: !1,
247
+ UNDERLINE: !1,
248
+ STRIKETHROUGH: !1,
249
+ HIGHLIGHT: !1,
250
+ CODE: !1
251
+ },
252
+ activeAlignment: null
253
+ }, We = (e) => {
254
+ switch (e) {
255
+ case "h3": return "header-three";
256
+ case "h4": return "header-four";
257
+ case "h5": return "header-five";
258
+ case "h6": return "header-six";
259
+ default: return "unstyled";
260
+ }
261
+ }, Ge = (e) => {
262
+ switch (e) {
263
+ case "header-three": return "h3";
264
+ case "header-four": return "h4";
265
+ case "header-five": return "h5";
266
+ case "header-six": return "h6";
267
+ default: return null;
268
+ }
269
+ }, Ke = (e) => {
270
+ switch (e) {
271
+ case "BOLD": return "bold";
272
+ case "ITALIC": return "italic";
273
+ case "UNDERLINE": return "underline";
274
+ case "STRIKETHROUGH": return "strikethrough";
275
+ case "HIGHLIGHT": return "highlight";
276
+ case "CODE": return "code";
277
+ default: return null;
278
+ }
279
+ }, qe = () => {
280
+ let e = R();
281
+ if (!z(e)) return "unstyled";
282
+ let t = e.anchor.getNode().getTopLevelElementOrThrow();
283
+ if (pe(t)) {
284
+ let e = t.getParent();
285
+ if (M(e)) return e.getListType() === "bullet" ? "unordered-list-item" : "ordered-list-item";
286
+ }
287
+ return M(t) ? t.getListType() === "bullet" ? "unordered-list-item" : "ordered-list-item" : De(t) ? We(t.getTag()) : Oe(t) ? "blockquote" : t.getType() === "paragraph" ? "unstyled" : t.getType();
288
+ }, Je = () => {
289
+ let e = R();
290
+ if (!z(e)) return null;
291
+ let t = e.anchor.getNode().getTopLevelElementOrThrow().getFormatType();
292
+ switch (t) {
293
+ case "left":
294
+ case "center":
295
+ case "right":
296
+ case "justify": return t;
297
+ default: return null;
298
+ }
299
+ }, Ye = () => {
300
+ let e = R();
301
+ return z(e) ? {
302
+ blockType: qe(),
303
+ isTextUnselected: e.isCollapsed(),
304
+ activeInlineStyles: {
305
+ BOLD: e.hasFormat("bold"),
306
+ ITALIC: e.hasFormat("italic"),
307
+ UNDERLINE: e.hasFormat("underline"),
308
+ STRIKETHROUGH: e.hasFormat("strikethrough"),
309
+ HIGHLIGHT: e.hasFormat("highlight"),
310
+ CODE: e.hasFormat("code")
311
+ },
312
+ activeAlignment: Je()
313
+ } : G;
314
+ };
315
+ //#endregion
316
+ //#region src/text-editor/lexical/plugins/SelectionStatePlugin.tsx
317
+ function Xe({ onEditorReady: e, onStateChange: t }) {
318
+ let [n] = P();
319
+ return m(() => (e(n), n.registerUpdateListener(({ editorState: e }) => {
320
+ e.read(() => {
321
+ t(Ye());
322
+ });
323
+ })), [
324
+ n,
325
+ e,
326
+ t
327
+ ]), null;
328
+ }
329
+ //#endregion
330
+ //#region src/text-editor/lib/serialization/createLexicalRaw.ts
331
+ var Ze = (e) => ({
332
+ format: "lexical",
333
+ version: 1,
334
+ editorState: e.toJSON()
335
+ }), K = (e) => {
336
+ let t = 0, n = e;
337
+ for (; n;) t += 1, n = n.getParent();
338
+ return t;
339
+ }, Qe = (e) => {
340
+ if (!(e instanceof HTMLAnchorElement)) return { node: null };
341
+ let t = e.textContent;
342
+ return (t === null || t === "") && e.children.length === 0 ? { node: null } : { node: J(e.getAttribute("href") || "", {
343
+ rel: e.getAttribute("rel"),
344
+ target: e.getAttribute("target"),
345
+ title: e.getAttribute("title"),
346
+ ariaLabel: e.getAttribute("aria-label"),
347
+ qrCode: e.getAttribute("data-qr-code") === "true",
348
+ add: null,
349
+ text: t
350
+ }) };
351
+ }, q = class e extends Le {
352
+ __ariaLabel;
353
+ __qrCode;
354
+ __add;
355
+ __text;
356
+ static getType() {
357
+ return "accessible-link";
358
+ }
359
+ static clone(t) {
360
+ return new e(t.__url, {
361
+ rel: t.__rel,
362
+ target: t.__target,
363
+ title: t.__title,
364
+ ariaLabel: t.__ariaLabel,
365
+ qrCode: t.__qrCode,
366
+ add: t.__add,
367
+ text: t.__text
368
+ }, t.__key);
369
+ }
370
+ constructor(e = "", t = {}, n) {
371
+ super(e, t, n);
372
+ let { ariaLabel: r = null, qrCode: i = !1, add: a = null, text: o = null } = t;
373
+ this.__ariaLabel = r, this.__qrCode = i, this.__add = a, this.__text = o;
374
+ }
375
+ static importDOM() {
376
+ return { a: () => ({
377
+ conversion: Qe,
378
+ priority: 2
379
+ }) };
380
+ }
381
+ static importJSON(e) {
382
+ return J().updateFromJSON(e);
383
+ }
384
+ updateFromJSON(e) {
385
+ return super.updateFromJSON(e).setAriaLabel(e.ariaLabel || null).setQrCode(!!e.qrCode).setAdd(e.add || null).setText(e.text || null);
386
+ }
387
+ exportJSON() {
388
+ return {
389
+ ...super.exportJSON(),
390
+ type: "accessible-link",
391
+ version: 1,
392
+ ariaLabel: this.getAriaLabel(),
393
+ qrCode: this.getQrCode(),
394
+ add: this.getAdd(),
395
+ text: this.getText()
396
+ };
397
+ }
398
+ createDOM(e) {
399
+ let t = super.createDOM(e);
400
+ return this.applyAccessibleAttributes(null, t), t;
401
+ }
402
+ updateDOM(e, t, n) {
403
+ let r = super.updateDOM(e, t, n);
404
+ return this.applyAccessibleAttributes(e, t), r;
405
+ }
406
+ applyAccessibleAttributes(e, t) {
407
+ t instanceof HTMLAnchorElement && ((!e || e.__ariaLabel !== this.__ariaLabel) && (this.__ariaLabel ? t.setAttribute("aria-label", this.__ariaLabel) : t.removeAttribute("aria-label")), (!e || e.__qrCode !== this.__qrCode) && t.setAttribute("data-qr-code", this.__qrCode ? "true" : "false"));
408
+ }
409
+ insertNewAfter(e, t = !0) {
410
+ let n = J(this.__url, {
411
+ rel: this.__rel,
412
+ target: this.__target,
413
+ title: this.__title,
414
+ ariaLabel: this.__ariaLabel,
415
+ qrCode: this.__qrCode,
416
+ add: this.__add,
417
+ text: this.__text
418
+ });
419
+ return this.insertAfter(n, t), n;
420
+ }
421
+ getAriaLabel() {
422
+ return this.getLatest().__ariaLabel;
423
+ }
424
+ setAriaLabel(e) {
425
+ let t = this.getWritable();
426
+ return t.__ariaLabel = e, this;
427
+ }
428
+ getQrCode() {
429
+ return this.getLatest().__qrCode;
430
+ }
431
+ setQrCode(e) {
432
+ let t = this.getWritable();
433
+ return t.__qrCode = e, this;
434
+ }
435
+ getAdd() {
436
+ return this.getLatest().__add;
437
+ }
438
+ setAdd(e) {
439
+ let t = this.getWritable();
440
+ return t.__add = e, this;
441
+ }
442
+ getText() {
443
+ return this.getLatest().__text;
444
+ }
445
+ setText(e) {
446
+ let t = this.getWritable();
447
+ return t.__text = e, this;
448
+ }
449
+ }, J = (e = "", t) => F(new q(e, t)), Y = (e) => e instanceof q, $e = (e) => {
450
+ let t = {};
451
+ return Array.from(e.attributes).forEach((e) => {
452
+ e.name !== "class" && (t[e.name] = e.value);
453
+ }), t;
454
+ }, X = (e) => {
455
+ if (!(e instanceof HTMLElement)) return { node: null };
456
+ let t = e.tagName.toLowerCase();
457
+ if (![
458
+ "abbr",
459
+ "span",
460
+ "time",
461
+ "cite",
462
+ "del",
463
+ "ins"
464
+ ].includes(t)) return { node: null };
465
+ let n = e.textContent;
466
+ return (n === null || n === "") && e.children.length === 0 ? { node: null } : { node: Q(t, $e(e), n) };
467
+ }, Z = class e extends Me {
468
+ __tag;
469
+ __attributes;
470
+ __text;
471
+ static getType() {
472
+ return "semantic-tag";
473
+ }
474
+ static clone(t) {
475
+ return new e(t.__tag, t.__attributes, t.__text, t.__key);
476
+ }
477
+ constructor(e = "span", t = {}, n = null, r) {
478
+ super(r), this.__tag = e, this.__attributes = t, this.__text = n;
479
+ }
480
+ static importDOM() {
481
+ return {
482
+ abbr: () => ({
483
+ conversion: X,
484
+ priority: 2
485
+ }),
486
+ span: () => ({
487
+ conversion: X,
488
+ priority: 2
489
+ }),
490
+ time: () => ({
491
+ conversion: X,
492
+ priority: 2
493
+ }),
494
+ cite: () => ({
495
+ conversion: X,
496
+ priority: 2
497
+ }),
498
+ del: () => ({
499
+ conversion: X,
500
+ priority: 2
501
+ }),
502
+ ins: () => ({
503
+ conversion: X,
504
+ priority: 2
505
+ })
506
+ };
507
+ }
508
+ static importJSON(e) {
509
+ return Q(e.tag, e.attributes, e.text).updateFromJSON(e);
510
+ }
511
+ updateFromJSON(e) {
512
+ return super.updateFromJSON(e).setTag(e.tag).setAttributes(e.attributes || {}).setText(e.text || null);
513
+ }
514
+ exportJSON() {
515
+ return {
516
+ ...super.exportJSON(),
517
+ type: "semantic-tag",
518
+ version: 1,
519
+ tag: this.getTag(),
520
+ attributes: this.getAttributes(),
521
+ text: this.getText()
522
+ };
523
+ }
524
+ createDOM(e) {
525
+ let t = document.createElement(this.__tag);
526
+ return this.applyEditorAttributes(t), t;
527
+ }
528
+ updateDOM(e, t) {
529
+ return e.__tag === this.__tag ? (this.applyEditorAttributes(t), !1) : !0;
530
+ }
531
+ exportDOM() {
532
+ let e = document.createElement(this.__tag);
533
+ return Object.entries(this.__attributes).forEach(([t, n]) => {
534
+ e.setAttribute(t, n);
535
+ }), { element: e };
536
+ }
537
+ applyEditorAttributes(e) {
538
+ e.classList.add("custom-tag-highlight"), Array.from(e.attributes).forEach((t) => {
539
+ t.name !== "class" && e.removeAttribute(t.name);
540
+ }), Object.entries(this.__attributes).forEach(([t, n]) => {
541
+ e.setAttribute(t, n);
542
+ });
543
+ }
544
+ insertNewAfter(e, t = !0) {
545
+ let n = Q(this.__tag, this.__attributes, this.__text);
546
+ return this.insertAfter(n, t), n;
547
+ }
548
+ canInsertTextBefore() {
549
+ return !1;
550
+ }
551
+ canInsertTextAfter() {
552
+ return !1;
553
+ }
554
+ canBeEmpty() {
555
+ return !1;
556
+ }
557
+ isInline() {
558
+ return !0;
559
+ }
560
+ getTag() {
561
+ return this.getLatest().__tag;
562
+ }
563
+ setTag(e) {
564
+ let t = this.getWritable();
565
+ return t.__tag = e, this;
566
+ }
567
+ getAttributes() {
568
+ return this.getLatest().__attributes;
569
+ }
570
+ setAttributes(e) {
571
+ let t = this.getWritable();
572
+ return t.__attributes = e, this;
573
+ }
574
+ getText() {
575
+ return this.getLatest().__text;
576
+ }
577
+ setText(e) {
578
+ let t = this.getWritable();
579
+ return t.__text = e, this;
580
+ }
581
+ }, Q = (e, t = {}, n = null) => F(new Z(e, t, n)), et = (e) => e instanceof Z;
582
+ //#endregion
583
+ //#region src/text-editor/model/hooks/useTextEditorLexicalActions.ts
584
+ function tt({ editor: e, toolbarState: t, hasLocalLinkDialog: n, onOpenLinkDialog: r, onOpenTagDialog: i }) {
585
+ let a = p((n) => {
586
+ if (e) {
587
+ if (n === "unordered-list-item") {
588
+ if (t.blockType === "unordered-list-item") {
589
+ e.dispatchCommand(N, void 0);
590
+ return;
591
+ }
592
+ e.dispatchCommand(he, void 0);
593
+ return;
594
+ }
595
+ if (n === "ordered-list-item") {
596
+ if (t.blockType === "ordered-list-item") {
597
+ e.dispatchCommand(N, void 0);
598
+ return;
599
+ }
600
+ e.dispatchCommand(me, void 0);
601
+ return;
602
+ }
603
+ e.update(() => {
604
+ let e = R();
605
+ if (!z(e)) return;
606
+ if (n === "unstyled" || n === "paragraph") {
607
+ V(e, () => I());
608
+ return;
609
+ }
610
+ if (n === "blockquote") {
611
+ V(e, () => Ee());
612
+ return;
613
+ }
614
+ let t = Ge(n);
615
+ t && V(e, () => Te(t));
616
+ });
617
+ }
618
+ }, [e, t.blockType]), o = p((t) => {
619
+ if (!e) return;
620
+ let n = Ke(t);
621
+ n && e.dispatchCommand(Pe, n);
622
+ }, [e]), s = p((t) => {
623
+ e && e.dispatchCommand(Ne, t);
624
+ }, [e]), c = p(() => {
625
+ e && e.dispatchCommand(Ie, void 0);
626
+ }, [e]), l = p(() => {
627
+ e && e.dispatchCommand(Fe, void 0);
628
+ }, [e]), u = p(() => {
629
+ if (!e) return "";
630
+ let t = "";
631
+ return e.getEditorState().read(() => {
632
+ let e = R();
633
+ z(e) && (t = e.getTextContent());
634
+ }), t;
635
+ }, [e]), d = p((t) => {
636
+ e && (e.update(() => {
637
+ let e = R();
638
+ if (!z(e)) return;
639
+ let n = e.getTextContent(), r = t.text.length > 0 ? t.text : n;
640
+ if (!r.trim()) return;
641
+ let i = J(t.url, {
642
+ target: "_blank",
643
+ rel: "noopener noreferrer",
644
+ ariaLabel: t.ariaLabel || n || r,
645
+ qrCode: t.qrCode,
646
+ add: t.add || null,
647
+ text: r
648
+ }), a = L(r);
649
+ i.append(a), e.insertNodes([i]);
650
+ }), requestAnimationFrame(() => {
651
+ e.focus();
652
+ }));
653
+ }, [e]), m = p((e, t, n, r, i) => {
654
+ d({
655
+ url: e,
656
+ text: t,
657
+ add: n,
658
+ ariaLabel: r,
659
+ qrCode: i
660
+ });
661
+ }, [d]), h = p((e, t) => {
662
+ d({
663
+ url: e,
664
+ text: t,
665
+ add: "",
666
+ ariaLabel: "Внутренняя ссылка на статью: " + t,
667
+ qrCode: !1
668
+ });
669
+ }, [d]), g = p(() => {
670
+ if (!e) return "";
671
+ let t = "";
672
+ return e.getEditorState().read(() => {
673
+ let e = R();
674
+ if (!z(e)) {
675
+ t = "";
676
+ return;
677
+ }
678
+ let n = e.getTextContent(), r = Re(e.anchor.getNode(), (e) => Y(e) || B(e));
679
+ if (Y(r)) {
680
+ t = {
681
+ url: r.getURL(),
682
+ ariaLabel: r.getAriaLabel() || "",
683
+ text: r.getText() || n,
684
+ add: r.getAdd() || "",
685
+ qrCode: r.getQrCode()
686
+ };
687
+ return;
688
+ }
689
+ if (B(r)) {
690
+ t = {
691
+ url: r.getURL(),
692
+ ariaLabel: "",
693
+ text: n,
694
+ add: "",
695
+ qrCode: !1
696
+ };
697
+ return;
698
+ }
699
+ t = n;
700
+ }), t;
701
+ }, [e]), _ = p((e) => {
702
+ e === f.LOCAL_LINK && !n || r(e);
703
+ }, [n, r]), v = p((t, n, r) => {
704
+ e && (e.update(() => {
705
+ let e = R();
706
+ if (!z(e)) return;
707
+ let i = e.getTextContent().trim(), a = n || i || r.title || r["aria-label"] || Object.values(r).join(" ") || t;
708
+ if (!a.trim()) return;
709
+ let o = Q(t, r, a);
710
+ o.append(L(a)), e.insertNodes([o]);
711
+ }), requestAnimationFrame(() => {
712
+ e.focus();
713
+ }));
714
+ }, [e]);
715
+ return {
716
+ handleAddLink: m,
717
+ handleAddLocalLink: h,
718
+ handleAlignmentChange: s,
719
+ handleBlockStyleToggle: a,
720
+ handleCleanSemanticTag: p(() => {
721
+ e && e.update(() => {
722
+ let e = R();
723
+ if (!z(e) || e.isCollapsed()) return;
724
+ let t = e.getNodes(), n = /* @__PURE__ */ new Set();
725
+ t.forEach((e) => {
726
+ let t = e;
727
+ for (; t;) et(t) && n.add(t), t = t.getParent();
728
+ }), Array.from(n).sort((e, t) => K(t) - K(e)).forEach((e) => {
729
+ e.isAttached() && (e.getChildren().forEach((t) => e.insertBefore(t)), e.remove());
730
+ });
731
+ });
732
+ }, [e]),
733
+ handleInlineStyleToggle: o,
734
+ handleLinkClick: _,
735
+ handleRedo: l,
736
+ handleTagClick: p((e) => {
737
+ i(e);
738
+ }, [i]),
739
+ handleUndo: c,
740
+ getCurrentSelectionText: u,
741
+ getSelectedLinkState: g,
742
+ insertSemanticTagAtSelection: v
743
+ };
744
+ }
745
+ var $ = {
746
+ textEditor: "_75LW3N",
747
+ textEditorContent: "PLiHsN",
748
+ focused: "m-jmCu",
749
+ wrapper: "_4NWAs0"
750
+ };
751
+ //#endregion
752
+ //#region src/text-editor/EmailDialog.tsx
753
+ function nt({ isOpen: t, onClose: o, onConfirm: s, initialState: c }) {
754
+ let [l, u] = v(""), [d, f] = v(""), [p, h] = v(null), [g] = v(() => b(c) && typeof c == "string" ? {
755
+ text: "",
756
+ add: "",
757
+ ariaLabel: "",
758
+ url: c
759
+ } : c);
760
+ m(() => {
761
+ t && b(g) && (u(g.url ?? ""), f(g.ariaLabel ?? ""));
762
+ }, [t, g]);
763
+ let _ = (e) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e) ? !0 : (h("Некорректный email адрес"), !1), x = (e) => {
764
+ if (e.preventDefault(), _(l)) {
765
+ if (!d) {
766
+ h("Добавьте описание для email");
767
+ return;
768
+ }
769
+ s(`mailto:${l}`, "", "", d, !1), S();
770
+ }
771
+ }, S = () => {
772
+ u(""), f(""), h(null), o();
773
+ };
774
+ return /* @__PURE__ */ j(i, {
775
+ isOpen: t,
776
+ onClose: S,
777
+ title: "Ссылка на email",
778
+ size: "md",
779
+ children: [/* @__PURE__ */ A(a, { children: /* @__PURE__ */ j("div", {
780
+ className: y("flexColumn", "gapMd"),
781
+ children: [
782
+ /* @__PURE__ */ A(n, {
783
+ label: "Email адрес",
784
+ value: l,
785
+ onChange: u,
786
+ placeholder: "some_email@mail.ru"
787
+ }),
788
+ p && /* @__PURE__ */ j("div", {
789
+ className: "textColorDanger",
790
+ children: [
791
+ /* @__PURE__ */ A("strong", { children: "Ошибка ввода:" }),
792
+ " ",
793
+ /* @__PURE__ */ A("span", {
794
+ className: "fontItalic",
795
+ children: p
796
+ })
797
+ ]
798
+ }),
799
+ /* @__PURE__ */ A(n, {
800
+ label: "Текст для экранных читалок",
801
+ value: d,
802
+ onChange: f,
803
+ placeholder: "Электронная почта руководителя городской думмы"
804
+ })
805
+ ]
806
+ }) }), /* @__PURE__ */ j(r, { children: [/* @__PURE__ */ A(e, {
807
+ appearance: "outline",
808
+ tone: "error",
809
+ onClick: S,
810
+ children: "Отмена"
811
+ }), /* @__PURE__ */ A(e, {
812
+ appearance: "outline",
813
+ tone: "success",
814
+ onClick: x,
815
+ disabled: !l || !d,
816
+ children: "Подтвердить"
817
+ })] })]
818
+ });
819
+ }
820
+ //#endregion
821
+ //#region src/text-editor/LinkDialog.tsx
822
+ function rt({ isOpen: s, onClose: c, onConfirm: l, initialState: u }) {
823
+ let [d, f] = v(""), [p, h] = v(""), [g, _] = v(null), [y, S] = v(!1), [C] = v(() => b(u) && typeof u == "string" ? {
824
+ text: "",
825
+ add: "",
826
+ ariaLabel: "",
827
+ url: u
828
+ } : u);
829
+ m(() => {
830
+ s && b(C) && (f(C.url ?? ""), h(C.ariaLabel ?? ""));
831
+ }, [s, C]);
832
+ let w = (e) => {
833
+ f(e), g && _(null);
834
+ }, T = (e) => {
835
+ e.preventDefault();
836
+ let t = x(d);
837
+ if (!t.isValid) {
838
+ _(t.error);
839
+ return;
840
+ }
841
+ if (!p) {
842
+ _("добавьте описание для ссылки");
843
+ return;
844
+ }
845
+ l(d.startsWith("http") ? d : `https://${d}`, "", "", p, y), E();
846
+ }, E = () => {
847
+ f(""), h(""), _(null), c();
848
+ };
849
+ return /* @__PURE__ */ j(i, {
850
+ isOpen: s,
851
+ onClose: E,
852
+ title: "Ссылка на внешний url",
853
+ size: "md",
854
+ children: [/* @__PURE__ */ A(a, { children: /* @__PURE__ */ j(t, {
855
+ gap: "md",
856
+ children: [
857
+ /* @__PURE__ */ A(n, {
858
+ label: "Полный URL адрес",
859
+ value: d,
860
+ onChange: w,
861
+ placeholder: "https://somesite.ru"
862
+ }),
863
+ g && /* @__PURE__ */ j("div", {
864
+ className: "textColorDanger",
865
+ children: [
866
+ /* @__PURE__ */ A("strong", { children: "Ошибка ввода:" }),
867
+ " ",
868
+ /* @__PURE__ */ A("span", {
869
+ className: "fontItalic",
870
+ children: g
871
+ })
872
+ ]
873
+ }),
874
+ /* @__PURE__ */ A(n, {
875
+ label: "Текст для экранных читалок",
876
+ value: p,
877
+ onChange: h,
878
+ placeholder: "Ссылка на официальный сайт городской думмы"
879
+ }),
880
+ /* @__PURE__ */ A(o, {
881
+ title: "Показать кнопку для генерации QR кода ссылки",
882
+ value: y,
883
+ onChange: S
884
+ })
885
+ ]
886
+ }) }), /* @__PURE__ */ j(r, { children: [/* @__PURE__ */ A(e, {
887
+ appearance: "outline",
888
+ tone: "error",
889
+ onClick: E,
890
+ children: "Отмена"
891
+ }), /* @__PURE__ */ A(e, {
892
+ appearance: "outline",
893
+ tone: "success",
894
+ onClick: T,
895
+ disabled: !d || !p,
896
+ children: "Подтвердить"
897
+ })] })]
898
+ });
899
+ }
900
+ //#endregion
901
+ //#region src/text-editor/PhoneDialog.tsx
902
+ function it({ isOpen: o, onClose: s, onConfirm: c, initialState: l }) {
903
+ let [u, d] = v(""), [f, p] = v(""), [h, g] = v(""), [_, x] = v(null), [C] = v(() => b(l) && typeof l == "string" ? {
904
+ text: "",
905
+ add: "",
906
+ ariaLabel: "",
907
+ url: l
908
+ } : l);
909
+ m(() => {
910
+ o && b(C) && (d((C.url ?? "").replace(/\D/g, "").slice(0, 11).replace(/^7/, "")), C.add ? p((C.add ?? "").replace(/\D/g, "")) : p((C.url ?? "").replace(/\D/g, "").slice(11)), g(C.ariaLabel ?? ""));
911
+ }, [o, C]);
912
+ let w = (e) => {
913
+ e = e.replace(/\D/g, ""), e.length <= 10 ? (d(e), x(null)) : x("нельзя ввести более 10 цифр");
914
+ }, T = (e) => e.length === 10 ? !0 : (x("номер телефона должен содержать 10 цифр"), !1), E = (e) => {
915
+ if (e.preventDefault(), !T(u)) return;
916
+ if (!h) {
917
+ x("добавьте описание для телефона");
918
+ return;
919
+ }
920
+ let t = S(u);
921
+ c(`tel:${`+7${u}`}`, f ? `${t} доб. ${f}` : t, f, h, !1), D();
922
+ }, D = () => {
923
+ d(""), g(""), x(null), s();
924
+ };
925
+ return /* @__PURE__ */ j(i, {
926
+ isOpen: o,
927
+ onClose: D,
928
+ title: "Ссылка на телефон",
929
+ size: "md",
930
+ children: [/* @__PURE__ */ A(a, { children: /* @__PURE__ */ j(t, {
931
+ gap: "md",
932
+ children: [
933
+ /* @__PURE__ */ j("div", {
934
+ className: y("flex", "alignItemsEnd", "gapSm"),
935
+ children: [/* @__PURE__ */ A(n, {
936
+ label: "Номер телефона без 7-ки",
937
+ description: "Вводится только номер (10) цифр без каких-либо дополнительных символов. Ссылка будет привязана к текущему выделенному фрагменту текста. Поэтому текст самой ссылки можно оформить грамотно, например: +7 (3522) 12-34-56 доб. 100",
938
+ value: u,
939
+ onChange: w,
940
+ placeholder: "3522123456",
941
+ className: "flex1"
942
+ }), /* @__PURE__ */ A(n, {
943
+ label: "Добавочный номер",
944
+ value: f,
945
+ onChange: p,
946
+ placeholder: "100"
947
+ })]
948
+ }),
949
+ _ && /* @__PURE__ */ j("div", {
950
+ className: "textColorDanger",
951
+ children: [
952
+ /* @__PURE__ */ A("strong", { children: "Ошибка ввода:" }),
953
+ " ",
954
+ /* @__PURE__ */ A("span", {
955
+ className: "fontItalic",
956
+ children: _
957
+ })
958
+ ]
959
+ }),
960
+ /* @__PURE__ */ A(n, {
961
+ label: "Текст для экранных читалок",
962
+ description: "Обязательное поле для организации доступности ссылки для лиц с ОВЗ, использующих скринридеры",
963
+ value: h,
964
+ onChange: g,
965
+ placeholder: "Контактный телефон директора"
966
+ })
967
+ ]
968
+ }) }), /* @__PURE__ */ j(r, { children: [/* @__PURE__ */ A(e, {
969
+ appearance: "solid",
970
+ tone: "error",
971
+ onClick: D,
972
+ children: "Отмена"
973
+ }), /* @__PURE__ */ A(e, {
974
+ appearance: "solid",
975
+ tone: "success",
976
+ onClick: E,
977
+ disabled: !u || !h,
978
+ children: "Подтвердить"
979
+ })] })]
980
+ });
981
+ }
982
+ //#endregion
983
+ //#region src/text-editor/SemanticDialog.tsx
984
+ function at({ isOpen: o, onClose: s, onConfirm: c, config: l, initialText: u = "", initialState: d = {} }) {
985
+ let [f, p] = v(u), [h, g] = v({}), [_, y] = v({}), [b, x] = v(!1);
986
+ m(() => {
987
+ if (o && !b) {
988
+ let e = l.fields.reduce((e, t) => (e[t.name] = d[t.name] ?? "", e), {});
989
+ g(e), y({}), x(!0);
990
+ } else !o && b && x(!1);
991
+ }, [
992
+ o,
993
+ l.fields,
994
+ d,
995
+ b
996
+ ]);
997
+ let S = (e, t) => {
998
+ g((n) => ({
999
+ ...n,
1000
+ [e]: t
1001
+ })), y((t) => ({
1002
+ ...t,
1003
+ [e]: null
1004
+ }));
1005
+ }, C = () => {
1006
+ let e = {}, t = !0;
1007
+ f.trim() || (e.text = "Обязательное поле", t = !1);
1008
+ for (let n of l.fields) {
1009
+ let r = h[n.name]?.trim();
1010
+ if (n.required && !r) e[n.name] = "Обязательное поле", t = !1;
1011
+ else if (n.validate) {
1012
+ let i = n.validate(r);
1013
+ i && (e[n.name] = i, t = !1);
1014
+ }
1015
+ }
1016
+ return y(e), t;
1017
+ };
1018
+ return /* @__PURE__ */ j(i, {
1019
+ isOpen: o,
1020
+ onClose: s,
1021
+ title: `Вставка <${l.tagName}>`,
1022
+ size: "md",
1023
+ children: [/* @__PURE__ */ A(a, { children: /* @__PURE__ */ j(t, {
1024
+ gap: "md",
1025
+ children: [
1026
+ /* @__PURE__ */ j("div", { children: [
1027
+ l.description,
1028
+ ".",
1029
+ /* @__PURE__ */ A("br", {})
1030
+ ] }),
1031
+ /* @__PURE__ */ j("div", { children: [
1032
+ /* @__PURE__ */ A("strong", { children: "Пример:" }),
1033
+ " ",
1034
+ l.example
1035
+ ] }),
1036
+ /* @__PURE__ */ A(n, {
1037
+ label: l.title,
1038
+ description: `Данный текст будет вставлен в редактор и обёрнуть в специальный семантический тег ${l.tagName}`,
1039
+ value: f,
1040
+ onChange: p,
1041
+ error: _.text ?? void 0,
1042
+ required: !0
1043
+ }),
1044
+ l.fields.map((e) => /* @__PURE__ */ A(n, {
1045
+ label: e.label,
1046
+ description: e.description,
1047
+ placeholder: e.placeholder,
1048
+ value: h[e.name] ?? "",
1049
+ onChange: (t) => S(e.name, t),
1050
+ error: _[e.name] ?? void 0,
1051
+ required: e.required
1052
+ }, e.name))
1053
+ ]
1054
+ }) }), /* @__PURE__ */ j(r, { children: [/* @__PURE__ */ A(e, {
1055
+ appearance: "solid",
1056
+ tone: "error",
1057
+ onClick: s,
1058
+ children: "Отмена"
1059
+ }), /* @__PURE__ */ A(e, {
1060
+ appearance: "solid",
1061
+ tone: "success",
1062
+ onClick: () => {
1063
+ C() && (c(l.tagName, f.trim(), h), s());
1064
+ },
1065
+ children: "Подтвердить"
1066
+ })] })]
1067
+ });
1068
+ }
1069
+ //#endregion
1070
+ //#region src/text-editor/semanticTagConfigs.tsx
1071
+ var ot = {
1072
+ [u.abbr]: {
1073
+ tagName: "abbr",
1074
+ title: "Аббревиатура",
1075
+ description: "Обозначает аббревиатуры и сокращения, при наведении покажет расшифровку",
1076
+ example: /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ A("abbr", {
1077
+ title: "Национальное управление по аэронавтике и исследованию космического пространства",
1078
+ children: "НАСА"
1079
+ }), /* @__PURE__ */ A("div", {
1080
+ className: "marginTopMd",
1081
+ children: /* @__PURE__ */ A("code", { children: "<abbr title=\"Национальное управление по аэронавтике и исследованию космического пространства\">НАСА</abbr>" })
1082
+ })] }),
1083
+ fields: [{
1084
+ name: "title",
1085
+ label: "Расшифровка",
1086
+ description: "Появится как подсказка и будет прочитана скринридером",
1087
+ placeholder: "например: HyperText Markup Language",
1088
+ required: !0
1089
+ }]
1090
+ },
1091
+ [u.lang]: {
1092
+ tagName: "span",
1093
+ title: "Текст на другом языке",
1094
+ description: "Указывает язык фрагмента текста, если он отличается от основного языка страницы, скринридер прочитает это слово с французским произношением",
1095
+ example: /* @__PURE__ */ j(k, { children: [
1096
+ /* @__PURE__ */ A("span", {
1097
+ lang: "fr",
1098
+ children: "Bonjour!"
1099
+ }),
1100
+ " — сказал турист.",
1101
+ /* @__PURE__ */ A("div", {
1102
+ className: "marginTopMd",
1103
+ children: /* @__PURE__ */ A("code", { children: "<span lang=\"fr\">Bonjour!</span> — сказал турист." })
1104
+ })
1105
+ ] }),
1106
+ fields: [{
1107
+ name: "lang",
1108
+ label: "Код языка",
1109
+ placeholder: "en, fr, ru",
1110
+ required: !0,
1111
+ validate: (e) => /^[a-z]{2,3}(-[A-Z]{2})?$/.test(e) ? null : "Неверный код языка (например, en или en-US)"
1112
+ }]
1113
+ },
1114
+ [u.time]: {
1115
+ tagName: "time",
1116
+ title: "Дата/время",
1117
+ description: "",
1118
+ example: "",
1119
+ fields: [{
1120
+ name: "datetime",
1121
+ label: "Дата/время (machine-readable)",
1122
+ description: "Формат ISO 8601: 2025-05-18, 14:30, 2025-05-18T14:30",
1123
+ placeholder: "например: 2025-05-18T14:30",
1124
+ required: !0
1125
+ }]
1126
+ },
1127
+ [u.cite]: {
1128
+ tagName: "cite",
1129
+ title: "Цитата источника",
1130
+ description: "Обозначает название книги, статьи, фильма или другого произведения, на которое вы ссылаетесь",
1131
+ example: /* @__PURE__ */ j(k, { children: [
1132
+ "По словам Эйнштейна: ",
1133
+ /* @__PURE__ */ A("cite", { children: "«Воображение важнее знания»" }),
1134
+ ".",
1135
+ /* @__PURE__ */ A("div", {
1136
+ className: "marginTopMd",
1137
+ children: /* @__PURE__ */ A("code", { children: "По словам Эйнштейна: <cite>«Воображение важнее знания»</cite>." })
1138
+ })
1139
+ ] }),
1140
+ fields: [{
1141
+ name: "title",
1142
+ label: "Название источника",
1143
+ description: "Будет отображаться как подсказка",
1144
+ placeholder: "например: Википедия",
1145
+ required: !1
1146
+ }]
1147
+ },
1148
+ [u.del]: {
1149
+ tagName: "del",
1150
+ title: "Изменения в тексте",
1151
+ description: "Удаленный фрагмент",
1152
+ example: /* @__PURE__ */ j(k, { children: [
1153
+ "Проект сдачи: ",
1154
+ /* @__PURE__ */ A("del", { children: "1 июня" }),
1155
+ " ",
1156
+ /* @__PURE__ */ A("ins", { children: "15 июня" }),
1157
+ /* @__PURE__ */ A("div", {
1158
+ className: "marginTopMd",
1159
+ children: /* @__PURE__ */ A("code", { children: "Проект сдачи: <del>1 июня</del> <ins>15 июня</ins>" })
1160
+ })
1161
+ ] }),
1162
+ fields: [{
1163
+ name: "datetime",
1164
+ label: "Когда был удалён",
1165
+ description: "Формат ISO 8601: 2025-05-18T14:30",
1166
+ placeholder: "например: 2025-05-18T14:30",
1167
+ required: !1
1168
+ }, {
1169
+ name: "cite",
1170
+ label: "Источник/обоснование",
1171
+ description: "Ссылка на объяснение причины",
1172
+ placeholder: "например: https://example.com/edit-log",
1173
+ required: !1
1174
+ }]
1175
+ },
1176
+ [u.ins]: {
1177
+ tagName: "ins",
1178
+ title: "Изменения в тексте",
1179
+ description: "Новый добавленный текст",
1180
+ example: /* @__PURE__ */ j(k, { children: [
1181
+ "Проект сдачи: ",
1182
+ /* @__PURE__ */ A("del", { children: "1 июня" }),
1183
+ " ",
1184
+ /* @__PURE__ */ A("ins", { children: "15 июня" }),
1185
+ /* @__PURE__ */ A("div", {
1186
+ className: "marginTopMd",
1187
+ children: /* @__PURE__ */ A("code", { children: "Проект сдачи: <del>1 июня</del> <ins>15 июня</ins>" })
1188
+ })
1189
+ ] }),
1190
+ fields: [{
1191
+ name: "datetime",
1192
+ label: "Когда был добавлен",
1193
+ description: "Формат ISO 8601: 2025-05-18T14:30",
1194
+ placeholder: "например: 2025-05-18T14:30",
1195
+ required: !1
1196
+ }, {
1197
+ name: "cite",
1198
+ label: "Источник/обоснование",
1199
+ description: "Ссылка на объяснение причины",
1200
+ placeholder: "например: https://example.com/edit-log",
1201
+ required: !1
1202
+ }]
1203
+ }
1204
+ };
1205
+ //#endregion
1206
+ //#region src/text-editor/TimeDialog.tsx
1207
+ function st({ isOpen: o, onClose: c, onConfirm: l, initialState: u }) {
1208
+ let [d, f] = v("date"), [p, g] = v(""), [_, y] = v(""), [b, x] = v({}), S = h((e) => {
1209
+ f(e?.mode ?? "date"), g(e?.from ?? ""), y(e?.to ?? ""), x({});
1210
+ });
1211
+ m(() => {
1212
+ o && S(u);
1213
+ }, [o, u]);
1214
+ let C = () => {
1215
+ let e = {}, t = (e) => /^\d{4}-\d{2}-\d{2}$/.test(e), n = (e) => /^\d{2}:\d{2}$/.test(e), r = (e) => /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/.test(e), i = (e, i, a) => {
1216
+ if (!i) return `${e} обязательно`;
1217
+ if (a === "date" && !t(i)) return "Неверный формат даты (ГГГГ-ММ-ДД)";
1218
+ if (a === "time" && !n(i)) return "Неверный формат времени (ЧЧ:ММ)";
1219
+ if (a === "datetime" && !r(i)) return "Неверный формат даты и времени (ГГГГ-ММ-ДДTЧЧ:ММ)";
1220
+ };
1221
+ switch (d) {
1222
+ case "date":
1223
+ e.from = i("Дата", p, "date");
1224
+ break;
1225
+ case "time":
1226
+ e.from = i("Время", p, "time");
1227
+ break;
1228
+ case "datetime":
1229
+ e.from = i("Дата и время", p, "datetime");
1230
+ break;
1231
+ case "range-time":
1232
+ e.from = i("Время начала", p, "time"), e.to = i("Время окончания", _, "time");
1233
+ break;
1234
+ case "range-date":
1235
+ e.from = i("Дата начала", p, "date"), e.to = i("Дата окончания", _, "date");
1236
+ break;
1237
+ case "range-datetime":
1238
+ e.from = i("Начало", p, "datetime"), e.to = i("Окончание", _, "datetime");
1239
+ break;
1240
+ }
1241
+ return x(e), Object.values(e).every((e) => !e);
1242
+ };
1243
+ return /* @__PURE__ */ j(i, {
1244
+ isOpen: o,
1245
+ onClose: c,
1246
+ title: "Вставка <time>",
1247
+ size: "md",
1248
+ children: [/* @__PURE__ */ A(a, { children: /* @__PURE__ */ j(t, {
1249
+ gap: "md",
1250
+ children: [/* @__PURE__ */ j(s, {
1251
+ label: "Тип значения",
1252
+ value: d,
1253
+ onChange: f,
1254
+ children: [
1255
+ /* @__PURE__ */ A(s.Option, {
1256
+ label: "Дата",
1257
+ value: "date"
1258
+ }),
1259
+ /* @__PURE__ */ A(s.Option, {
1260
+ label: "Дата и время",
1261
+ value: "datetime"
1262
+ }),
1263
+ /* @__PURE__ */ A(s.Option, {
1264
+ label: "Время",
1265
+ value: "time"
1266
+ }),
1267
+ /* @__PURE__ */ A(s.Option, {
1268
+ label: "Диапазон дат",
1269
+ value: "range-date"
1270
+ }),
1271
+ /* @__PURE__ */ A(s.Option, {
1272
+ label: "Диапазон времени",
1273
+ value: "range-time"
1274
+ }),
1275
+ /* @__PURE__ */ A(s.Option, {
1276
+ label: "Диапазон даты и времени",
1277
+ value: "range-datetime"
1278
+ })
1279
+ ]
1280
+ }), /* @__PURE__ */ A(t, {
1281
+ gap: "md",
1282
+ children: (() => {
1283
+ switch (d) {
1284
+ case "date":
1285
+ case "datetime":
1286
+ case "time": return /* @__PURE__ */ A(n, {
1287
+ label: "Значение",
1288
+ placeholder: d === "time" ? "09:00" : d === "date" ? "2025-05-18" : "2025-05-18T09:00",
1289
+ value: p,
1290
+ onChange: g,
1291
+ error: b.from
1292
+ });
1293
+ case "range-time":
1294
+ case "range-date":
1295
+ case "range-datetime": return /* @__PURE__ */ j(k, { children: [/* @__PURE__ */ A(n, {
1296
+ label: "С",
1297
+ placeholder: d.includes("time") ? "09:00" : d.includes("date") ? "2025-05-18" : "2025-05-18T09:00",
1298
+ value: p,
1299
+ onChange: g,
1300
+ error: b.from
1301
+ }), /* @__PURE__ */ A(n, {
1302
+ label: "По",
1303
+ placeholder: d.includes("time") ? "17:00" : d.includes("date") ? "2025-05-22" : "2025-05-22T17:00",
1304
+ value: _,
1305
+ onChange: g,
1306
+ error: b.to
1307
+ })] });
1308
+ }
1309
+ })()
1310
+ })]
1311
+ }) }), /* @__PURE__ */ j(r, { children: [/* @__PURE__ */ A(e, {
1312
+ appearance: "solid",
1313
+ tone: "error",
1314
+ onClick: c,
1315
+ children: "Отмена"
1316
+ }), /* @__PURE__ */ A(e, {
1317
+ appearance: "solid",
1318
+ tone: "success",
1319
+ onClick: () => {
1320
+ if (!C()) return;
1321
+ let e = _ ? `${p}/${_}` : p;
1322
+ l("time", e, { datetime: e }), c();
1323
+ },
1324
+ children: "Подтвердить"
1325
+ })] })]
1326
+ });
1327
+ }
1328
+ //#endregion
1329
+ //#region src/text-editor/TextEditorDialogs.tsx
1330
+ function ct({ linkTypeDialog: e, tagTypeDialog: t, localLinkDialogComponent: n, onCloseLinkDialog: r, onCloseTagDialog: i, onAddLink: a, onAddLocalLink: o, onInsertSemanticTag: s, getCurrentSelectionText: c, getSelectedLinkState: l }) {
1331
+ let d = n;
1332
+ return /* @__PURE__ */ j(k, { children: [e && /* @__PURE__ */ j(k, { children: [
1333
+ d && /* @__PURE__ */ A(d, {
1334
+ isOpen: e === f.LOCAL_LINK,
1335
+ onClose: r,
1336
+ onConfirm: o
1337
+ }),
1338
+ /* @__PURE__ */ A(rt, {
1339
+ isOpen: e === f.LINK,
1340
+ initialState: l(),
1341
+ onClose: r,
1342
+ onConfirm: a
1343
+ }),
1344
+ /* @__PURE__ */ A(it, {
1345
+ isOpen: e === f.PHONE,
1346
+ initialState: l(),
1347
+ onClose: r,
1348
+ onConfirm: a
1349
+ }),
1350
+ /* @__PURE__ */ A(nt, {
1351
+ isOpen: e === f.EMAIL,
1352
+ initialState: l(),
1353
+ onClose: r,
1354
+ onConfirm: a
1355
+ })
1356
+ ] }), t && (t === u.time ? /* @__PURE__ */ A(st, {
1357
+ isOpen: !0,
1358
+ onClose: i,
1359
+ onConfirm: s
1360
+ }) : /* @__PURE__ */ A(at, {
1361
+ isOpen: !0,
1362
+ onClose: i,
1363
+ onConfirm: s,
1364
+ config: ot[t],
1365
+ initialText: c()
1366
+ }))] });
1367
+ }
1368
+ //#endregion
1369
+ //#region src/text-editor/TextEditorLexicalClient.tsx
1370
+ function lt({ initialData: e, onChange: t, toolbarComponents: n, businessAdapters: r }) {
1371
+ let i = r?.LocalLinkDialogComponent, [a, o] = v(!1), [s, l] = v(G), [u, d] = v(null), [f, m] = v(null), [h, _] = v(null), b = c(e?.raw) ? e.raw : null, x = !!b, S = g(() => {
1372
+ if (b) return JSON.stringify(b.editorState);
1373
+ }, [b]), C = p((e) => {
1374
+ console.error("Ошибка редактора Lexical", e);
1375
+ }, []), w = p((e, n) => {
1376
+ let r = "";
1377
+ e.read(() => {
1378
+ r = de(n, null);
1379
+ }), t({
1380
+ raw: Ze(e),
1381
+ html: r
1382
+ });
1383
+ }, [t]), T = p((e) => {
1384
+ m(e);
1385
+ }, []), E = p((e) => {
1386
+ _(e);
1387
+ }, []), D = tt({
1388
+ editor: u,
1389
+ toolbarState: s,
1390
+ hasLocalLinkDialog: !!i,
1391
+ onOpenLinkDialog: T,
1392
+ onOpenTagDialog: E
1393
+ }), O = g(() => ({
1394
+ namespace: "KtkTextEditorLexical",
1395
+ onError: C,
1396
+ theme: {
1397
+ paragraph: "paragraph",
1398
+ text: {
1399
+ code: "lexicalTextCode",
1400
+ highlight: "lexicalTextHighlight",
1401
+ underline: "lexicalTextUnderline",
1402
+ strikethrough: "lexicalTextStrikethrough"
1403
+ }
1404
+ },
1405
+ nodes: [
1406
+ ke,
1407
+ Ae,
1408
+ _e,
1409
+ ge,
1410
+ q,
1411
+ Z
1412
+ ],
1413
+ editorState: S
1414
+ }), [C, S]);
1415
+ return /* @__PURE__ */ j("div", {
1416
+ className: $.textEditor,
1417
+ children: [/* @__PURE__ */ A("div", {
1418
+ className: y($.textEditorContent, { [$.focused]: a }),
1419
+ children: /* @__PURE__ */ j(ve, {
1420
+ initialConfig: O,
1421
+ children: [
1422
+ /* @__PURE__ */ A(He, {
1423
+ toolbarComponents: n,
1424
+ state: s,
1425
+ onBlockStyleToggle: D.handleBlockStyleToggle,
1426
+ onInlineStyleToggle: D.handleInlineStyleToggle,
1427
+ onAlignmentChange: D.handleAlignmentChange,
1428
+ onLinkClick: D.handleLinkClick,
1429
+ onTagClick: D.handleTagClick,
1430
+ onUndo: D.handleUndo,
1431
+ onRedo: D.handleRedo,
1432
+ onCleanTag: D.handleCleanSemanticTag
1433
+ }),
1434
+ /* @__PURE__ */ A(we, {
1435
+ contentEditable: /* @__PURE__ */ A(ye, {
1436
+ className: "lexicalEditorContentEditable",
1437
+ onFocus: () => o(!0),
1438
+ onBlur: () => o(!1)
1439
+ }),
1440
+ placeholder: /* @__PURE__ */ A("div", {
1441
+ className: "lexicalEditorPlaceholder",
1442
+ children: "Введите текст..."
1443
+ }),
1444
+ ErrorBoundary: be
1445
+ }),
1446
+ /* @__PURE__ */ A(xe, {}),
1447
+ /* @__PURE__ */ A(Se, {}),
1448
+ /* @__PURE__ */ A(Xe, {
1449
+ onEditorReady: d,
1450
+ onStateChange: l
1451
+ }),
1452
+ /* @__PURE__ */ A(Ue, {
1453
+ initialHTML: e?.html,
1454
+ shouldSkip: x
1455
+ }),
1456
+ /* @__PURE__ */ A(Ce, {
1457
+ onChange: w,
1458
+ ignoreSelectionChange: !0
1459
+ })
1460
+ ]
1461
+ })
1462
+ }), /* @__PURE__ */ A(ct, {
1463
+ linkTypeDialog: f,
1464
+ tagTypeDialog: h,
1465
+ localLinkDialogComponent: i,
1466
+ onCloseLinkDialog: () => m(null),
1467
+ onCloseTagDialog: () => _(null),
1468
+ onAddLink: D.handleAddLink,
1469
+ onAddLocalLink: D.handleAddLocalLink,
1470
+ onInsertSemanticTag: D.insertSemanticTagAtSelection,
1471
+ getCurrentSelectionText: D.getCurrentSelectionText,
1472
+ getSelectedLinkState: D.getSelectedLinkState
1473
+ })]
1474
+ });
1475
+ }
1476
+ //#endregion
1477
+ export { lt as TextEditorLexicalClient };
1478
+
1479
+ //# sourceMappingURL=TextEditorLexicalClient-CxOJuwOC.js.map