@mieweb/ui 0.11.0-dev.29 → 0.11.0-dev.30
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/MIGRATION.md +67 -0
- package/README.md +10 -0
- package/dist/EncounterMdyEditor-3SQY4MK2.js +286 -0
- package/dist/EncounterMdyEditor-3SQY4MK2.js.map +1 -0
- package/dist/EncounterMdyEditor-73PTTIRY.cjs +288 -0
- package/dist/EncounterMdyEditor-73PTTIRY.cjs.map +1 -0
- package/dist/chunk-25MPUVTM.js +339 -0
- package/dist/chunk-25MPUVTM.js.map +1 -0
- package/dist/{chunk-2VISTX7O.js → chunk-3NOVISM6.js} +3 -3
- package/dist/{chunk-2VISTX7O.js.map → chunk-3NOVISM6.js.map} +1 -1
- package/dist/{chunk-6GKIISNZ.cjs → chunk-3Y3ZCDNF.cjs} +176 -63
- package/dist/chunk-3Y3ZCDNF.cjs.map +1 -0
- package/dist/{chunk-AK4LHJPC.js → chunk-4JXO5JTE.js} +84 -3
- package/dist/chunk-4JXO5JTE.js.map +1 -0
- package/dist/chunk-4NB4WOGU.cjs +666 -0
- package/dist/chunk-4NB4WOGU.cjs.map +1 -0
- package/dist/{chunk-434L5RYF.js → chunk-4P27Y52M.js} +3 -3
- package/dist/{chunk-434L5RYF.js.map → chunk-4P27Y52M.js.map} +1 -1
- package/dist/{chunk-PRA2V5BP.cjs → chunk-5KGYTNOA.cjs} +7 -7
- package/dist/{chunk-PRA2V5BP.cjs.map → chunk-5KGYTNOA.cjs.map} +1 -1
- package/dist/chunk-5LNLB2XT.js +634 -0
- package/dist/chunk-5LNLB2XT.js.map +1 -0
- package/dist/chunk-5YOT4DVH.js +31 -0
- package/dist/chunk-5YOT4DVH.js.map +1 -0
- package/dist/chunk-7HFZL5V5.js +2425 -0
- package/dist/chunk-7HFZL5V5.js.map +1 -0
- package/dist/{chunk-XZNHS7YQ.cjs → chunk-7XC6E4BT.cjs} +3 -3
- package/dist/{chunk-XZNHS7YQ.cjs.map → chunk-7XC6E4BT.cjs.map} +1 -1
- package/dist/{chunk-JM4YFLO4.js → chunk-AIJYZP7M.js} +3 -3
- package/dist/{chunk-JM4YFLO4.js.map → chunk-AIJYZP7M.js.map} +1 -1
- package/dist/chunk-BBLEGF5L.js +66 -0
- package/dist/chunk-BBLEGF5L.js.map +1 -0
- package/dist/{chunk-MBDT2MGR.js → chunk-BIQIE3VW.js} +4 -4
- package/dist/{chunk-MBDT2MGR.js.map → chunk-BIQIE3VW.js.map} +1 -1
- package/dist/chunk-FSLI5IKP.cjs +54 -0
- package/dist/chunk-FSLI5IKP.cjs.map +1 -0
- package/dist/chunk-GADJASST.js +3 -0
- package/dist/chunk-GADJASST.js.map +1 -0
- package/dist/chunk-IXUIOR4K.cjs +2457 -0
- package/dist/chunk-IXUIOR4K.cjs.map +1 -0
- package/dist/chunk-K2BY7YPJ.cjs +4 -0
- package/dist/chunk-K2BY7YPJ.cjs.map +1 -0
- package/dist/{chunk-H3P7POFC.cjs → chunk-MA3Y6AYA.cjs} +3 -3
- package/dist/{chunk-H3P7POFC.cjs.map → chunk-MA3Y6AYA.cjs.map} +1 -1
- package/dist/chunk-QO4A6U73.cjs +342 -0
- package/dist/chunk-QO4A6U73.cjs.map +1 -0
- package/dist/{chunk-43QBEF6N.js → chunk-QR7B6UPR.js} +176 -63
- package/dist/chunk-QR7B6UPR.js.map +1 -0
- package/dist/chunk-SMPLM6K3.js +4107 -0
- package/dist/chunk-SMPLM6K3.js.map +1 -0
- package/dist/chunk-SV6YGK4U.cjs +88 -0
- package/dist/chunk-SV6YGK4U.cjs.map +1 -0
- package/dist/{chunk-MQ5WJ3NO.js → chunk-UDUYZDTA.js} +14 -72
- package/dist/chunk-UDUYZDTA.js.map +1 -0
- package/dist/{chunk-ZLBNYCYT.cjs → chunk-XPVQI3MM.cjs} +84 -3
- package/dist/chunk-XPVQI3MM.cjs.map +1 -0
- package/dist/{chunk-AQUHEKXL.cjs → chunk-XQHDQ64G.cjs} +4 -4
- package/dist/{chunk-AQUHEKXL.cjs.map → chunk-XQHDQ64G.cjs.map} +1 -1
- package/dist/chunk-Z2OOJGHL.cjs +4155 -0
- package/dist/chunk-Z2OOJGHL.cjs.map +1 -0
- package/dist/{chunk-QKW2QCGI.cjs → chunk-ZK2R6UGF.cjs} +13 -72
- package/dist/chunk-ZK2R6UGF.cjs.map +1 -0
- package/dist/components/ActionPlan/index.cjs +4 -4
- package/dist/components/ActionPlan/index.js +2 -2
- package/dist/components/AlertDialog/index.d.cts +1 -1
- package/dist/components/AlertDialog/index.d.ts +1 -1
- package/dist/components/EmailEditor/index.cjs +13 -12
- package/dist/components/EmailEditor/index.js +4 -3
- package/dist/components/MediaEditor/index.cjs +7 -7
- package/dist/components/MediaEditor/index.js +2 -2
- package/dist/components/RichTextEditor/index.cjs +5 -4
- package/dist/components/RichTextEditor/index.d.cts +34 -0
- package/dist/components/RichTextEditor/index.d.ts +34 -0
- package/dist/components/RichTextEditor/index.js +2 -1
- package/dist/components/SuperChat/index.cjs +10 -9
- package/dist/components/SuperChat/index.cjs.map +1 -1
- package/dist/components/SuperChat/index.js +2 -1
- package/dist/components/SuperChat/index.js.map +1 -1
- package/dist/components/Textarea/index.cjs +6 -5
- package/dist/components/Textarea/index.js +3 -2
- package/dist/esheet.cjs +4237 -25
- package/dist/esheet.cjs.map +1 -1
- package/dist/esheet.d.cts +753 -6
- package/dist/esheet.d.ts +753 -6
- package/dist/esheet.js +4099 -21
- package/dist/esheet.js.map +1 -1
- package/dist/index.cjs +204 -3072
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +71 -9
- package/dist/index.d.ts +71 -9
- package/dist/index.js +38 -2968
- package/dist/index.js.map +1 -1
- package/dist/kerebron.cjs +7 -268
- package/dist/kerebron.cjs.map +1 -1
- package/dist/kerebron.d.cts +7 -1
- package/dist/kerebron.d.ts +7 -1
- package/dist/kerebron.js +6 -270
- package/dist/kerebron.js.map +1 -1
- package/dist/model-WFFZRQMY.js +18 -0
- package/dist/model-WFFZRQMY.js.map +1 -0
- package/dist/model-Y7WRIGGA.cjs +79 -0
- package/dist/model-Y7WRIGGA.cjs.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/package.json +30 -9
- package/dist/chunk-43QBEF6N.js.map +0 -1
- package/dist/chunk-6GKIISNZ.cjs.map +0 -1
- package/dist/chunk-AK4LHJPC.js.map +0 -1
- package/dist/chunk-MQ5WJ3NO.js.map +0 -1
- package/dist/chunk-QKW2QCGI.cjs.map +0 -1
- package/dist/chunk-SFSBYC46.js +0 -1596
- package/dist/chunk-SFSBYC46.js.map +0 -1
- package/dist/chunk-ZIJMLRI3.cjs +0 -1633
- package/dist/chunk-ZIJMLRI3.cjs.map +0 -1
- package/dist/chunk-ZLBNYCYT.cjs.map +0 -1
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var chunkFSLI5IKP_cjs = require('./chunk-FSLI5IKP.cjs');
|
|
3
4
|
var chunkYP5T6NZD_cjs = require('./chunk-YP5T6NZD.cjs');
|
|
4
5
|
var chunkPINIBEIU_cjs = require('./chunk-PINIBEIU.cjs');
|
|
5
6
|
var chunkZ5S5JEJD_cjs = require('./chunk-Z5S5JEJD.cjs');
|
|
6
7
|
var chunkC7RVKV25_cjs = require('./chunk-C7RVKV25.cjs');
|
|
7
8
|
var chunkL7L5S2HO_cjs = require('./chunk-L7L5S2HO.cjs');
|
|
8
9
|
var chunkANMX7YDL_cjs = require('./chunk-ANMX7YDL.cjs');
|
|
10
|
+
var chunkIEY3ZJIT_cjs = require('./chunk-IEY3ZJIT.cjs');
|
|
9
11
|
var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
|
|
10
12
|
var React2 = require('react');
|
|
11
13
|
var lucideReact = require('lucide-react');
|
|
@@ -41,8 +43,10 @@ var DEFAULT_LABELS = {
|
|
|
41
43
|
empty: "No macros available",
|
|
42
44
|
emptyHint: "The application has not provided a macro list.",
|
|
43
45
|
noResults: "No macros match",
|
|
44
|
-
clearSearch: "Clear search"
|
|
46
|
+
clearSearch: "Clear search",
|
|
47
|
+
showMore: "Show {count} more"
|
|
45
48
|
};
|
|
49
|
+
var PREVIEW_COUNT = 4;
|
|
46
50
|
function matchesQuery(macro, query) {
|
|
47
51
|
const q = query.toLowerCase();
|
|
48
52
|
return macro.label.toLowerCase().includes(q) || (macro.shortcut ?? "").toLowerCase().includes(q) || (macro.keywords ?? []).some((k) => k.toLowerCase().includes(q)) || macro.content.toLowerCase().includes(q);
|
|
@@ -64,6 +68,7 @@ var MacroLibrary = React2__namespace.forwardRef(
|
|
|
64
68
|
onClose,
|
|
65
69
|
onCreateMacro,
|
|
66
70
|
autoFocusSearch = false,
|
|
71
|
+
compact = false,
|
|
67
72
|
className,
|
|
68
73
|
labels: labelOverrides
|
|
69
74
|
}, ref) {
|
|
@@ -72,6 +77,7 @@ var MacroLibrary = React2__namespace.forwardRef(
|
|
|
72
77
|
const [collapsed, setCollapsed] = React2__namespace.useState(
|
|
73
78
|
{}
|
|
74
79
|
);
|
|
80
|
+
const [expanded, setExpanded] = React2__namespace.useState({});
|
|
75
81
|
const listRef = React2__namespace.useRef(null);
|
|
76
82
|
const searchRef = React2__namespace.useRef(null);
|
|
77
83
|
const panelId = React2__namespace.useId();
|
|
@@ -134,6 +140,18 @@ var MacroLibrary = React2__namespace.forwardRef(
|
|
|
134
140
|
moveFocus(-1);
|
|
135
141
|
}
|
|
136
142
|
};
|
|
143
|
+
const expandGroup = (groupId) => {
|
|
144
|
+
setExpanded((prev) => ({ ...prev, [groupId]: true }));
|
|
145
|
+
requestAnimationFrame(() => {
|
|
146
|
+
const groupEl = Array.from(
|
|
147
|
+
listRef.current?.querySelectorAll(
|
|
148
|
+
'[data-slot="macro-library-group"]'
|
|
149
|
+
) ?? []
|
|
150
|
+
).find((el) => el.dataset.groupId === groupId);
|
|
151
|
+
const rows = groupEl?.querySelectorAll("[data-macro-row]");
|
|
152
|
+
rows?.[PREVIEW_COUNT]?.focus();
|
|
153
|
+
});
|
|
154
|
+
};
|
|
137
155
|
return (
|
|
138
156
|
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- keydown only delegates Escape-to-close from focusable children
|
|
139
157
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -147,7 +165,7 @@ var MacroLibrary = React2__namespace.forwardRef(
|
|
|
147
165
|
className: chunkS5RVSXDV_cjs.cn("bg-muted/20 flex min-h-0 flex-col", className),
|
|
148
166
|
onKeyDown: handlePanelKeyDown,
|
|
149
167
|
children: [
|
|
150
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
168
|
+
!compact && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
151
169
|
"div",
|
|
152
170
|
{
|
|
153
171
|
"data-slot": "macro-library-header",
|
|
@@ -174,7 +192,7 @@ var MacroLibrary = React2__namespace.forwardRef(
|
|
|
174
192
|
}
|
|
175
193
|
),
|
|
176
194
|
hasMacros ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
177
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-3 pt-2", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
|
|
195
|
+
!compact && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-3 pt-2", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
|
|
178
196
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
179
197
|
chunkL7L5S2HO_cjs.Search,
|
|
180
198
|
{
|
|
@@ -233,14 +251,17 @@ var MacroLibrary = React2__namespace.forwardRef(
|
|
|
233
251
|
visibleGroups.map((group) => {
|
|
234
252
|
const isPrevious = group.kind === "previous";
|
|
235
253
|
const isCollapsed = !searching && collapsed[group.id] === true;
|
|
254
|
+
const isPreview = !searching && expanded[group.id] !== true && group.macros.length > PREVIEW_COUNT;
|
|
255
|
+
const visibleMacros = isPreview ? group.macros.slice(0, PREVIEW_COUNT) : group.macros;
|
|
236
256
|
const GroupIcon = isPrevious ? chunkL7L5S2HO_cjs.History : chunkL7L5S2HO_cjs.BookOpen;
|
|
237
257
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
238
258
|
"div",
|
|
239
259
|
{
|
|
240
260
|
"data-slot": "macro-library-group",
|
|
261
|
+
"data-group-id": group.id,
|
|
241
262
|
"data-kind": group.kind ?? "library",
|
|
242
263
|
children: [
|
|
243
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
264
|
+
(!compact || isPrevious) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
244
265
|
"button",
|
|
245
266
|
{
|
|
246
267
|
type: "button",
|
|
@@ -273,7 +294,7 @@ var MacroLibrary = React2__namespace.forwardRef(
|
|
|
273
294
|
]
|
|
274
295
|
}
|
|
275
296
|
),
|
|
276
|
-
!isCollapsed &&
|
|
297
|
+
!isCollapsed && visibleMacros.map((macro) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
277
298
|
"button",
|
|
278
299
|
{
|
|
279
300
|
type: "button",
|
|
@@ -298,7 +319,31 @@ var MacroLibrary = React2__namespace.forwardRef(
|
|
|
298
319
|
]
|
|
299
320
|
},
|
|
300
321
|
macro.id
|
|
301
|
-
))
|
|
322
|
+
)),
|
|
323
|
+
!isCollapsed && isPreview && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
324
|
+
"button",
|
|
325
|
+
{
|
|
326
|
+
type: "button",
|
|
327
|
+
"data-macro-row": true,
|
|
328
|
+
"data-slot": "macro-library-show-more",
|
|
329
|
+
className: "focus-visible:ring-ring text-muted-foreground hover:bg-muted/60 hover:text-primary flex w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-start text-xs font-medium focus-visible:ring-2 focus-visible:outline-none",
|
|
330
|
+
onClick: () => expandGroup(group.id),
|
|
331
|
+
onKeyDown: handleRowKeyDown,
|
|
332
|
+
children: [
|
|
333
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
334
|
+
chunkL7L5S2HO_cjs.ChevronDown,
|
|
335
|
+
{
|
|
336
|
+
"aria-hidden": "true",
|
|
337
|
+
className: "h-3 w-3"
|
|
338
|
+
}
|
|
339
|
+
),
|
|
340
|
+
labels.showMore.replace(
|
|
341
|
+
"{count}",
|
|
342
|
+
String(group.macros.length - PREVIEW_COUNT)
|
|
343
|
+
)
|
|
344
|
+
]
|
|
345
|
+
}
|
|
346
|
+
)
|
|
302
347
|
]
|
|
303
348
|
},
|
|
304
349
|
group.id
|
|
@@ -476,6 +521,9 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
476
521
|
sanitizeHtml,
|
|
477
522
|
macros,
|
|
478
523
|
defaultMacrosOpen = false,
|
|
524
|
+
macrosOnFocus = false,
|
|
525
|
+
compactMacros = false,
|
|
526
|
+
onMacroInsert,
|
|
479
527
|
macroLabels,
|
|
480
528
|
onCreateMacro,
|
|
481
529
|
toolbar,
|
|
@@ -495,6 +543,7 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
495
543
|
"aria-invalid": ariaInvalid,
|
|
496
544
|
"aria-required": ariaRequired
|
|
497
545
|
}, ref) => {
|
|
546
|
+
const m = chunkFSLI5IKP_cjs.useMessages();
|
|
498
547
|
const inert = disabled || readOnly;
|
|
499
548
|
const editorRef = React2__namespace.useRef(null);
|
|
500
549
|
const [isListening, setIsListening] = React2__namespace.useState(false);
|
|
@@ -502,11 +551,14 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
502
551
|
const recognitionRef = React2__namespace.useRef(null);
|
|
503
552
|
const isListeningRef = React2__namespace.useRef(false);
|
|
504
553
|
const shouldRestartRef = React2__namespace.useRef(false);
|
|
505
|
-
const [macrosOpen, setMacrosOpen] = React2__namespace.useState(
|
|
554
|
+
const [macrosOpen, setMacrosOpen] = React2__namespace.useState(
|
|
555
|
+
defaultMacrosOpen && !macrosOnFocus
|
|
556
|
+
);
|
|
506
557
|
const savedRangeRef = React2__namespace.useRef(null);
|
|
507
558
|
const macroPanelId = React2__namespace.useId();
|
|
508
559
|
const hasVariables = Boolean(variableGroups && variableGroups.length > 0);
|
|
509
560
|
const hasMacros = Boolean(macros);
|
|
561
|
+
const macrosResting = hasMacros && macrosOnFocus && !macrosOpen;
|
|
510
562
|
const hasMacroEntries = Boolean(
|
|
511
563
|
macros?.some((group) => group.macros.length > 0)
|
|
512
564
|
);
|
|
@@ -587,7 +639,17 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
587
639
|
}, [inert]);
|
|
588
640
|
React2__namespace.useEffect(() => {
|
|
589
641
|
if (editorRef.current && editorRef.current.innerHTML !== value) {
|
|
642
|
+
const hadFocus = document.activeElement === editorRef.current;
|
|
590
643
|
editorRef.current.innerHTML = value;
|
|
644
|
+
if (hadFocus) {
|
|
645
|
+
const range = document.createRange();
|
|
646
|
+
range.selectNodeContents(editorRef.current);
|
|
647
|
+
range.collapse(false);
|
|
648
|
+
const selection = window.getSelection();
|
|
649
|
+
selection?.removeAllRanges();
|
|
650
|
+
selection?.addRange(range);
|
|
651
|
+
savedRangeRef.current = range.cloneRange();
|
|
652
|
+
}
|
|
591
653
|
reconcileGutterWithContent();
|
|
592
654
|
}
|
|
593
655
|
}, [value, reconcileGutterWithContent]);
|
|
@@ -691,6 +753,7 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
691
753
|
};
|
|
692
754
|
const insertMacro = (macro) => {
|
|
693
755
|
if (inert || !editorRef.current) return;
|
|
756
|
+
if (onMacroInsert?.(macro) === true) return;
|
|
694
757
|
focusRestoringSelection();
|
|
695
758
|
insertTextAtSelection(macro.content);
|
|
696
759
|
};
|
|
@@ -769,6 +832,21 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
769
832
|
collected.selection.addRange(replaceRange);
|
|
770
833
|
return replaceRange;
|
|
771
834
|
};
|
|
835
|
+
const deleteSelectedRange = (replaceRange) => {
|
|
836
|
+
let deleted = false;
|
|
837
|
+
try {
|
|
838
|
+
deleted = document.execCommand("delete", false);
|
|
839
|
+
} catch {
|
|
840
|
+
deleted = false;
|
|
841
|
+
}
|
|
842
|
+
if (!deleted) {
|
|
843
|
+
replaceRange.deleteContents();
|
|
844
|
+
replaceRange.collapse(true);
|
|
845
|
+
const selection = window.getSelection();
|
|
846
|
+
selection?.removeAllRanges();
|
|
847
|
+
selection?.addRange(replaceRange);
|
|
848
|
+
}
|
|
849
|
+
};
|
|
772
850
|
const expandTypedShortcut = (event) => {
|
|
773
851
|
if (!macros) return;
|
|
774
852
|
const collected = collectTokenBeforeCaret();
|
|
@@ -777,6 +855,14 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
777
855
|
const macro = macros.flatMap((group) => group.macros).find((candidate) => candidate.shortcut?.toLowerCase() === lowered);
|
|
778
856
|
if (!macro) return;
|
|
779
857
|
event.preventDefault();
|
|
858
|
+
if (onMacroInsert) {
|
|
859
|
+
deleteSelectedRange(selectCollectedToken(collected));
|
|
860
|
+
saveSelection();
|
|
861
|
+
updateContent();
|
|
862
|
+
if (onMacroInsert(macro) === true) return;
|
|
863
|
+
insertTextAtSelection(macro.content);
|
|
864
|
+
return;
|
|
865
|
+
}
|
|
780
866
|
selectCollectedToken(collected);
|
|
781
867
|
insertTextAtSelection(macro.content);
|
|
782
868
|
};
|
|
@@ -786,19 +872,7 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
786
872
|
if (!Object.hasOwn(MARKDOWN_BLOCK_RULES, collected.token)) return false;
|
|
787
873
|
const rule = MARKDOWN_BLOCK_RULES[collected.token];
|
|
788
874
|
event.preventDefault();
|
|
789
|
-
|
|
790
|
-
let deleted = false;
|
|
791
|
-
try {
|
|
792
|
-
deleted = document.execCommand("delete", false);
|
|
793
|
-
} catch {
|
|
794
|
-
deleted = false;
|
|
795
|
-
}
|
|
796
|
-
if (!deleted) {
|
|
797
|
-
replaceRange.deleteContents();
|
|
798
|
-
replaceRange.collapse(true);
|
|
799
|
-
collected.selection.removeAllRanges();
|
|
800
|
-
collected.selection.addRange(replaceRange);
|
|
801
|
-
}
|
|
875
|
+
deleteSelectedRange(selectCollectedToken(collected));
|
|
802
876
|
try {
|
|
803
877
|
document.execCommand(rule.command, false, rule.value);
|
|
804
878
|
} catch {
|
|
@@ -1052,6 +1126,21 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1052
1126
|
{
|
|
1053
1127
|
"data-slot": "rich-text-editor",
|
|
1054
1128
|
"data-chromeless": chromeless || void 0,
|
|
1129
|
+
onFocus: hasMacros && macrosOnFocus ? () => setMacrosOpen(true) : void 0,
|
|
1130
|
+
onBlur: hasMacros && macrosOnFocus ? (event) => {
|
|
1131
|
+
const related = event.relatedTarget;
|
|
1132
|
+
if (related && event.currentTarget.contains(related)) return;
|
|
1133
|
+
let menu = related?.closest('[role="menu"]');
|
|
1134
|
+
while (menu && menu.id) {
|
|
1135
|
+
const trigger = document.querySelector(
|
|
1136
|
+
`[aria-controls="${globalThis.CSS.escape(menu.id)}"]`
|
|
1137
|
+
);
|
|
1138
|
+
if (!trigger) break;
|
|
1139
|
+
if (event.currentTarget.contains(trigger)) return;
|
|
1140
|
+
menu = trigger.closest('[role="menu"]');
|
|
1141
|
+
}
|
|
1142
|
+
setMacrosOpen(false);
|
|
1143
|
+
} : void 0,
|
|
1055
1144
|
className: chunkS5RVSXDV_cjs.cn(
|
|
1056
1145
|
"bg-background flex flex-col",
|
|
1057
1146
|
!chromeless && "border-border overflow-hidden rounded-lg border",
|
|
@@ -1073,8 +1162,8 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1073
1162
|
onClick: () => execCommand("bold"),
|
|
1074
1163
|
disabled,
|
|
1075
1164
|
className: iconButtonClass,
|
|
1076
|
-
"aria-label": "Bold",
|
|
1077
|
-
title: "Bold",
|
|
1165
|
+
"aria-label": m("Bold"),
|
|
1166
|
+
title: m("Bold"),
|
|
1078
1167
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bold, { className: "h-4 w-4" })
|
|
1079
1168
|
}
|
|
1080
1169
|
),
|
|
@@ -1087,8 +1176,8 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1087
1176
|
onClick: () => execCommand("italic"),
|
|
1088
1177
|
disabled,
|
|
1089
1178
|
className: iconButtonClass,
|
|
1090
|
-
"aria-label": "Italic",
|
|
1091
|
-
title: "Italic",
|
|
1179
|
+
"aria-label": m("Italic"),
|
|
1180
|
+
title: m("Italic"),
|
|
1092
1181
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Italic, { className: "h-4 w-4" })
|
|
1093
1182
|
}
|
|
1094
1183
|
),
|
|
@@ -1101,8 +1190,8 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1101
1190
|
onClick: () => execCommand("underline"),
|
|
1102
1191
|
disabled,
|
|
1103
1192
|
className: iconButtonClass,
|
|
1104
|
-
"aria-label": "Underline",
|
|
1105
|
-
title: "Underline",
|
|
1193
|
+
"aria-label": m("Underline"),
|
|
1194
|
+
title: m("Underline"),
|
|
1106
1195
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Underline, { className: "h-4 w-4" })
|
|
1107
1196
|
}
|
|
1108
1197
|
),
|
|
@@ -1116,8 +1205,8 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1116
1205
|
onClick: () => execCommand("insertUnorderedList"),
|
|
1117
1206
|
disabled,
|
|
1118
1207
|
className: iconButtonClass,
|
|
1119
|
-
"aria-label": "Bullet list",
|
|
1120
|
-
title: "Bullet list",
|
|
1208
|
+
"aria-label": m("Bullet list"),
|
|
1209
|
+
title: m("Bullet list"),
|
|
1121
1210
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.List, { className: "h-4 w-4" })
|
|
1122
1211
|
}
|
|
1123
1212
|
),
|
|
@@ -1130,8 +1219,8 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1130
1219
|
onClick: () => execCommand("insertOrderedList"),
|
|
1131
1220
|
disabled,
|
|
1132
1221
|
className: iconButtonClass,
|
|
1133
|
-
"aria-label": "Numbered list",
|
|
1134
|
-
title: "Numbered list",
|
|
1222
|
+
"aria-label": m("Numbered list"),
|
|
1223
|
+
title: m("Numbered list"),
|
|
1135
1224
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ListOrdered, { className: "h-4 w-4" })
|
|
1136
1225
|
}
|
|
1137
1226
|
),
|
|
@@ -1145,8 +1234,8 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1145
1234
|
onClick: () => execCommand("justifyLeft"),
|
|
1146
1235
|
disabled,
|
|
1147
1236
|
className: iconButtonClass,
|
|
1148
|
-
"aria-label": "Align left",
|
|
1149
|
-
title: "Align left",
|
|
1237
|
+
"aria-label": m("Align left"),
|
|
1238
|
+
title: m("Align left"),
|
|
1150
1239
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlignLeft, { className: "h-4 w-4" })
|
|
1151
1240
|
}
|
|
1152
1241
|
),
|
|
@@ -1159,8 +1248,8 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1159
1248
|
onClick: () => execCommand("justifyCenter"),
|
|
1160
1249
|
disabled,
|
|
1161
1250
|
className: iconButtonClass,
|
|
1162
|
-
"aria-label": "Align center",
|
|
1163
|
-
title: "Align center",
|
|
1251
|
+
"aria-label": m("Align center"),
|
|
1252
|
+
title: m("Align center"),
|
|
1164
1253
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlignCenter, { className: "h-4 w-4" })
|
|
1165
1254
|
}
|
|
1166
1255
|
),
|
|
@@ -1173,8 +1262,8 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1173
1262
|
onClick: () => execCommand("justifyRight"),
|
|
1174
1263
|
disabled,
|
|
1175
1264
|
className: iconButtonClass,
|
|
1176
|
-
"aria-label": "Align right",
|
|
1177
|
-
title: "Align right",
|
|
1265
|
+
"aria-label": m("Align right"),
|
|
1266
|
+
title: m("Align right"),
|
|
1178
1267
|
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlignRight, { className: "h-4 w-4" })
|
|
1179
1268
|
}
|
|
1180
1269
|
),
|
|
@@ -1197,10 +1286,10 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1197
1286
|
size: "sm",
|
|
1198
1287
|
className: "h-8 gap-1 px-2",
|
|
1199
1288
|
disabled,
|
|
1200
|
-
title: "Insert variable",
|
|
1289
|
+
title: m("Insert variable"),
|
|
1201
1290
|
children: [
|
|
1202
1291
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Braces, { className: "h-4 w-4" }),
|
|
1203
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ms-1 text-xs", children: "Variables" })
|
|
1292
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ms-1 text-xs", children: m("Variables") })
|
|
1204
1293
|
]
|
|
1205
1294
|
}
|
|
1206
1295
|
),
|
|
@@ -1228,10 +1317,10 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1228
1317
|
onClick: handleConvertToMustache,
|
|
1229
1318
|
disabled,
|
|
1230
1319
|
className: "h-8 gap-1 px-2",
|
|
1231
|
-
title: "Convert <<field>> to {{field}}",
|
|
1320
|
+
title: m("Convert <<field>> to {{field}}"),
|
|
1232
1321
|
children: [
|
|
1233
1322
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Replace, { className: "h-4 w-4" }),
|
|
1234
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ms-1 text-xs", children: "<< >> to {{ }}" })
|
|
1323
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ms-1 text-xs", children: m("<< >> to {{ }}") })
|
|
1235
1324
|
]
|
|
1236
1325
|
}
|
|
1237
1326
|
)
|
|
@@ -1250,10 +1339,10 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1250
1339
|
"h-8 gap-1 px-2",
|
|
1251
1340
|
isListening && "animate-pulse"
|
|
1252
1341
|
),
|
|
1253
|
-
title: !speechSupported ? "Speech recognition not supported in this browser" : isListening ? "Stop dictation" : "Start dictation",
|
|
1342
|
+
title: !speechSupported ? m("Speech recognition not supported in this browser") : isListening ? m("Stop dictation") : m("Start dictation"),
|
|
1254
1343
|
children: [
|
|
1255
1344
|
isListening ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MicOff, { className: "h-4 w-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mic, { className: "h-4 w-4" }),
|
|
1256
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ms-1 text-xs", children: isListening ? "Stop" : "Dictate" })
|
|
1345
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ms-1 text-xs", children: isListening ? m("Stop") : m("Dictate") })
|
|
1257
1346
|
]
|
|
1258
1347
|
}
|
|
1259
1348
|
)
|
|
@@ -1294,7 +1383,7 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1294
1383
|
),
|
|
1295
1384
|
onMouseMove: blockMenu && !disabled ? handleGutterMouseMove : void 0,
|
|
1296
1385
|
children: [
|
|
1297
|
-
blockMenu && !inert && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1386
|
+
blockMenu && !inert && !macrosResting && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1298
1387
|
"div",
|
|
1299
1388
|
{
|
|
1300
1389
|
"data-slot": "rich-text-editor-block-gutter",
|
|
@@ -1359,6 +1448,7 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1359
1448
|
if (blockTargetRangeRef.current) {
|
|
1360
1449
|
savedRangeRef.current = blockTargetRangeRef.current;
|
|
1361
1450
|
}
|
|
1451
|
+
focusRestoringSelection();
|
|
1362
1452
|
insertMacro(macro);
|
|
1363
1453
|
},
|
|
1364
1454
|
children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [
|
|
@@ -1423,7 +1513,7 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1423
1513
|
// native textarea clips its own) instead of wrapping out
|
|
1424
1514
|
// of the one-row field.
|
|
1425
1515
|
chromeless ? "end-0 truncate px-3 py-[7px] text-base" : "p-4",
|
|
1426
|
-
blockMenu && "ps-10",
|
|
1516
|
+
blockMenu && !macrosResting && "ps-10",
|
|
1427
1517
|
// Keep the placeholder's font in step with the editable
|
|
1428
1518
|
// when the host restyles it (e.g. Textarea's `size`).
|
|
1429
1519
|
editorClassName
|
|
@@ -1472,8 +1562,15 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1472
1562
|
"[&_ul]:my-2 [&_ul]:list-disc [&_ul]:ps-6",
|
|
1473
1563
|
"[&_ol]:my-2 [&_ol]:list-decimal [&_ol]:ps-6",
|
|
1474
1564
|
"[&_blockquote]:border-border [&_blockquote]:text-muted-foreground [&_blockquote]:my-2 [&_blockquote]:border-s-4 [&_blockquote]:ps-3",
|
|
1475
|
-
blockMenu && "ps-10",
|
|
1476
|
-
|
|
1565
|
+
blockMenu && !macrosResting && "ps-10",
|
|
1566
|
+
// Tall enough for the docked panel's search plus a few rows
|
|
1567
|
+
// without forcing the host form to scroll; the compact panel
|
|
1568
|
+
// is just rows, so it needs far less.
|
|
1569
|
+
hasMacros && macrosOpen && (compactMacros ? "md:min-h-[140px]" : "md:min-h-[250px]"),
|
|
1570
|
+
// Focus mode grows the field from one row on focus (and, with
|
|
1571
|
+
// the block gutter, indents it) — ease the jump instead of
|
|
1572
|
+
// snapping.
|
|
1573
|
+
hasMacros && macrosOnFocus && "transition-[min-height,padding] duration-200 ease-out motion-reduce:transition-none",
|
|
1477
1574
|
disabled && "bg-muted/20 cursor-not-allowed text-neutral-700 dark:text-neutral-300",
|
|
1478
1575
|
editorClassName
|
|
1479
1576
|
),
|
|
@@ -1484,22 +1581,38 @@ var RichTextEditor = React2__namespace.forwardRef(
|
|
|
1484
1581
|
]
|
|
1485
1582
|
}
|
|
1486
1583
|
),
|
|
1487
|
-
hasMacros && macrosOpen && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1488
|
-
|
|
1584
|
+
hasMacros && /* @__PURE__ */ jsxRuntime.jsx(chunkIEY3ZJIT_cjs.AnimatedPresence, { children: macrosOpen && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1585
|
+
chunkIEY3ZJIT_cjs.Animated,
|
|
1489
1586
|
{
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1587
|
+
preset: "menu",
|
|
1588
|
+
mode: "presence",
|
|
1589
|
+
custom: typeof document !== "undefined" && document.dir === "rtl" ? "left" : "right",
|
|
1590
|
+
fallbackClassName: "animate-fade-in",
|
|
1591
|
+
className: "border-border flex max-h-72 flex-col border-t md:absolute md:inset-y-0 md:end-0 md:max-h-none md:w-72 md:border-s md:border-t-0",
|
|
1592
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1593
|
+
MacroLibrary,
|
|
1594
|
+
{
|
|
1595
|
+
id: macroPanelId,
|
|
1596
|
+
groups: macros,
|
|
1597
|
+
onSelect: insertMacro,
|
|
1598
|
+
targetLabel: ariaLabel ?? placeholder,
|
|
1599
|
+
onClose: (
|
|
1600
|
+
// Focus mode: visibility follows focus; a close that
|
|
1601
|
+
// refocuses the editor would just reopen the panel.
|
|
1602
|
+
macrosOnFocus ? void 0 : () => {
|
|
1603
|
+
setMacrosOpen(false);
|
|
1604
|
+
focusRestoringSelection();
|
|
1605
|
+
}
|
|
1606
|
+
),
|
|
1607
|
+
onCreateMacro,
|
|
1608
|
+
labels: macroLabels,
|
|
1609
|
+
compact: compactMacros,
|
|
1610
|
+
className: "min-h-0 flex-1"
|
|
1611
|
+
}
|
|
1612
|
+
)
|
|
1613
|
+
},
|
|
1614
|
+
"macro-panel"
|
|
1615
|
+
) })
|
|
1503
1616
|
] })
|
|
1504
1617
|
]
|
|
1505
1618
|
}
|
|
@@ -1512,5 +1625,5 @@ exports.MacroLibrary = MacroLibrary;
|
|
|
1512
1625
|
exports.RichTextEditor = RichTextEditor;
|
|
1513
1626
|
exports.convertAngleBracketsToMustache = convertAngleBracketsToMustache;
|
|
1514
1627
|
exports.processDictation = processDictation;
|
|
1515
|
-
//# sourceMappingURL=chunk-
|
|
1516
|
-
//# sourceMappingURL=chunk-
|
|
1628
|
+
//# sourceMappingURL=chunk-3Y3ZCDNF.cjs.map
|
|
1629
|
+
//# sourceMappingURL=chunk-3Y3ZCDNF.cjs.map
|