@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.
Files changed (116) hide show
  1. package/MIGRATION.md +67 -0
  2. package/README.md +10 -0
  3. package/dist/EncounterMdyEditor-3SQY4MK2.js +286 -0
  4. package/dist/EncounterMdyEditor-3SQY4MK2.js.map +1 -0
  5. package/dist/EncounterMdyEditor-73PTTIRY.cjs +288 -0
  6. package/dist/EncounterMdyEditor-73PTTIRY.cjs.map +1 -0
  7. package/dist/chunk-25MPUVTM.js +339 -0
  8. package/dist/chunk-25MPUVTM.js.map +1 -0
  9. package/dist/{chunk-2VISTX7O.js → chunk-3NOVISM6.js} +3 -3
  10. package/dist/{chunk-2VISTX7O.js.map → chunk-3NOVISM6.js.map} +1 -1
  11. package/dist/{chunk-6GKIISNZ.cjs → chunk-3Y3ZCDNF.cjs} +176 -63
  12. package/dist/chunk-3Y3ZCDNF.cjs.map +1 -0
  13. package/dist/{chunk-AK4LHJPC.js → chunk-4JXO5JTE.js} +84 -3
  14. package/dist/chunk-4JXO5JTE.js.map +1 -0
  15. package/dist/chunk-4NB4WOGU.cjs +666 -0
  16. package/dist/chunk-4NB4WOGU.cjs.map +1 -0
  17. package/dist/{chunk-434L5RYF.js → chunk-4P27Y52M.js} +3 -3
  18. package/dist/{chunk-434L5RYF.js.map → chunk-4P27Y52M.js.map} +1 -1
  19. package/dist/{chunk-PRA2V5BP.cjs → chunk-5KGYTNOA.cjs} +7 -7
  20. package/dist/{chunk-PRA2V5BP.cjs.map → chunk-5KGYTNOA.cjs.map} +1 -1
  21. package/dist/chunk-5LNLB2XT.js +634 -0
  22. package/dist/chunk-5LNLB2XT.js.map +1 -0
  23. package/dist/chunk-5YOT4DVH.js +31 -0
  24. package/dist/chunk-5YOT4DVH.js.map +1 -0
  25. package/dist/chunk-7HFZL5V5.js +2425 -0
  26. package/dist/chunk-7HFZL5V5.js.map +1 -0
  27. package/dist/{chunk-XZNHS7YQ.cjs → chunk-7XC6E4BT.cjs} +3 -3
  28. package/dist/{chunk-XZNHS7YQ.cjs.map → chunk-7XC6E4BT.cjs.map} +1 -1
  29. package/dist/{chunk-JM4YFLO4.js → chunk-AIJYZP7M.js} +3 -3
  30. package/dist/{chunk-JM4YFLO4.js.map → chunk-AIJYZP7M.js.map} +1 -1
  31. package/dist/chunk-BBLEGF5L.js +66 -0
  32. package/dist/chunk-BBLEGF5L.js.map +1 -0
  33. package/dist/{chunk-MBDT2MGR.js → chunk-BIQIE3VW.js} +4 -4
  34. package/dist/{chunk-MBDT2MGR.js.map → chunk-BIQIE3VW.js.map} +1 -1
  35. package/dist/chunk-FSLI5IKP.cjs +54 -0
  36. package/dist/chunk-FSLI5IKP.cjs.map +1 -0
  37. package/dist/chunk-GADJASST.js +3 -0
  38. package/dist/chunk-GADJASST.js.map +1 -0
  39. package/dist/chunk-IXUIOR4K.cjs +2457 -0
  40. package/dist/chunk-IXUIOR4K.cjs.map +1 -0
  41. package/dist/chunk-K2BY7YPJ.cjs +4 -0
  42. package/dist/chunk-K2BY7YPJ.cjs.map +1 -0
  43. package/dist/{chunk-H3P7POFC.cjs → chunk-MA3Y6AYA.cjs} +3 -3
  44. package/dist/{chunk-H3P7POFC.cjs.map → chunk-MA3Y6AYA.cjs.map} +1 -1
  45. package/dist/chunk-QO4A6U73.cjs +342 -0
  46. package/dist/chunk-QO4A6U73.cjs.map +1 -0
  47. package/dist/{chunk-43QBEF6N.js → chunk-QR7B6UPR.js} +176 -63
  48. package/dist/chunk-QR7B6UPR.js.map +1 -0
  49. package/dist/chunk-SMPLM6K3.js +4107 -0
  50. package/dist/chunk-SMPLM6K3.js.map +1 -0
  51. package/dist/chunk-SV6YGK4U.cjs +88 -0
  52. package/dist/chunk-SV6YGK4U.cjs.map +1 -0
  53. package/dist/{chunk-MQ5WJ3NO.js → chunk-UDUYZDTA.js} +14 -72
  54. package/dist/chunk-UDUYZDTA.js.map +1 -0
  55. package/dist/{chunk-ZLBNYCYT.cjs → chunk-XPVQI3MM.cjs} +84 -3
  56. package/dist/chunk-XPVQI3MM.cjs.map +1 -0
  57. package/dist/{chunk-AQUHEKXL.cjs → chunk-XQHDQ64G.cjs} +4 -4
  58. package/dist/{chunk-AQUHEKXL.cjs.map → chunk-XQHDQ64G.cjs.map} +1 -1
  59. package/dist/chunk-Z2OOJGHL.cjs +4155 -0
  60. package/dist/chunk-Z2OOJGHL.cjs.map +1 -0
  61. package/dist/{chunk-QKW2QCGI.cjs → chunk-ZK2R6UGF.cjs} +13 -72
  62. package/dist/chunk-ZK2R6UGF.cjs.map +1 -0
  63. package/dist/components/ActionPlan/index.cjs +4 -4
  64. package/dist/components/ActionPlan/index.js +2 -2
  65. package/dist/components/AlertDialog/index.d.cts +1 -1
  66. package/dist/components/AlertDialog/index.d.ts +1 -1
  67. package/dist/components/EmailEditor/index.cjs +13 -12
  68. package/dist/components/EmailEditor/index.js +4 -3
  69. package/dist/components/MediaEditor/index.cjs +7 -7
  70. package/dist/components/MediaEditor/index.js +2 -2
  71. package/dist/components/RichTextEditor/index.cjs +5 -4
  72. package/dist/components/RichTextEditor/index.d.cts +34 -0
  73. package/dist/components/RichTextEditor/index.d.ts +34 -0
  74. package/dist/components/RichTextEditor/index.js +2 -1
  75. package/dist/components/SuperChat/index.cjs +10 -9
  76. package/dist/components/SuperChat/index.cjs.map +1 -1
  77. package/dist/components/SuperChat/index.js +2 -1
  78. package/dist/components/SuperChat/index.js.map +1 -1
  79. package/dist/components/Textarea/index.cjs +6 -5
  80. package/dist/components/Textarea/index.js +3 -2
  81. package/dist/esheet.cjs +4237 -25
  82. package/dist/esheet.cjs.map +1 -1
  83. package/dist/esheet.d.cts +753 -6
  84. package/dist/esheet.d.ts +753 -6
  85. package/dist/esheet.js +4099 -21
  86. package/dist/esheet.js.map +1 -1
  87. package/dist/index.cjs +204 -3072
  88. package/dist/index.cjs.map +1 -1
  89. package/dist/index.d.cts +71 -9
  90. package/dist/index.d.ts +71 -9
  91. package/dist/index.js +38 -2968
  92. package/dist/index.js.map +1 -1
  93. package/dist/kerebron.cjs +7 -268
  94. package/dist/kerebron.cjs.map +1 -1
  95. package/dist/kerebron.d.cts +7 -1
  96. package/dist/kerebron.d.ts +7 -1
  97. package/dist/kerebron.js +6 -270
  98. package/dist/kerebron.js.map +1 -1
  99. package/dist/model-WFFZRQMY.js +18 -0
  100. package/dist/model-WFFZRQMY.js.map +1 -0
  101. package/dist/model-Y7WRIGGA.cjs +79 -0
  102. package/dist/model-Y7WRIGGA.cjs.map +1 -0
  103. package/dist/styles.css +1 -1
  104. package/dist/tailwind-preset.cjs +4 -4
  105. package/dist/tailwind-preset.js +1 -1
  106. package/package.json +30 -9
  107. package/dist/chunk-43QBEF6N.js.map +0 -1
  108. package/dist/chunk-6GKIISNZ.cjs.map +0 -1
  109. package/dist/chunk-AK4LHJPC.js.map +0 -1
  110. package/dist/chunk-MQ5WJ3NO.js.map +0 -1
  111. package/dist/chunk-QKW2QCGI.cjs.map +0 -1
  112. package/dist/chunk-SFSBYC46.js +0 -1596
  113. package/dist/chunk-SFSBYC46.js.map +0 -1
  114. package/dist/chunk-ZIJMLRI3.cjs +0 -1633
  115. package/dist/chunk-ZIJMLRI3.cjs.map +0 -1
  116. 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 && group.macros.map((macro) => /* @__PURE__ */ jsxRuntime.jsxs(
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(defaultMacrosOpen);
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
- const replaceRange = selectCollectedToken(collected);
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
- hasMacros && macrosOpen && "md:min-h-[400px]",
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
- MacroLibrary,
1584
+ hasMacros && /* @__PURE__ */ jsxRuntime.jsx(chunkIEY3ZJIT_cjs.AnimatedPresence, { children: macrosOpen && /* @__PURE__ */ jsxRuntime.jsx(
1585
+ chunkIEY3ZJIT_cjs.Animated,
1489
1586
  {
1490
- id: macroPanelId,
1491
- groups: macros,
1492
- onSelect: insertMacro,
1493
- targetLabel: ariaLabel ?? placeholder,
1494
- onClose: () => {
1495
- setMacrosOpen(false);
1496
- focusRestoringSelection();
1497
- },
1498
- onCreateMacro,
1499
- labels: macroLabels,
1500
- className: "border-border max-h-72 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"
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-6GKIISNZ.cjs.map
1516
- //# sourceMappingURL=chunk-6GKIISNZ.cjs.map
1628
+ //# sourceMappingURL=chunk-3Y3ZCDNF.cjs.map
1629
+ //# sourceMappingURL=chunk-3Y3ZCDNF.cjs.map