tinacms 0.0.0-c5dad82-20241009225242 → 0.0.0-c72bb45-20241118014035

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 (23) hide show
  1. package/dist/admin/types.d.ts +3 -0
  2. package/dist/cache/node-cache.d.ts +1 -0
  3. package/dist/client.js +18 -16
  4. package/dist/client.mjs +1 -1
  5. package/dist/index.js +1287 -1010
  6. package/dist/index.mjs +1262 -984
  7. package/dist/{node-cache-7fa2452c.mjs → node-cache-4c336858.mjs} +18 -11
  8. package/dist/rich-text/index.d.ts +3 -0
  9. package/dist/rich-text/index.js +3 -1
  10. package/dist/rich-text/index.mjs +3 -1
  11. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/fixed-toolbar-buttons.d.ts +0 -4
  12. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/icons.d.ts +2 -0
  13. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-element.d.ts +11 -0
  14. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-toolbar-button.d.ts +20 -0
  15. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/text-area.d.ts +5 -0
  16. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/custom/mermaid-plugin.d.ts +2 -0
  17. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/code-block/index.d.ts +4 -2
  18. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/components.d.ts +10 -0
  19. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/toolbar/toolbar-overrides.d.ts +7 -3
  20. package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/toolbar/toolbar-provider.d.ts +1 -1
  21. package/dist/toolkit/fields/plugins/wrap-field-with-meta.d.ts +8 -0
  22. package/package.json +29 -25
  23. package/dist/__vite-browser-external-d06ac358.mjs +0 -4
package/dist/index.mjs CHANGED
@@ -6,28 +6,29 @@ var __publicField = (obj, key, value) => {
6
6
  };
7
7
  import { z } from "zod";
8
8
  import * as React from "react";
9
- import React__default, { useState, useCallback, createContext, forwardRef, useContext, useEffect, useMemo, startTransition, useRef, createElement, Component } from "react";
9
+ import React__default, { useState, useCallback, useEffect, useRef, createContext, forwardRef, useContext, useMemo, startTransition, createElement, Component } from "react";
10
10
  import { createPortal, findDOMNode } from "react-dom";
11
+ import { withRef, cn as cn$1, withVariants, withProps, withCn, createPrimitiveElement } from "@udecode/cn";
11
12
  import { toggleList, ELEMENT_UL, ELEMENT_OL, ELEMENT_H1 as ELEMENT_H1$1, ELEMENT_H2 as ELEMENT_H2$1, ELEMENT_H3 as ELEMENT_H3$1, ELEMENT_H4, ELEMENT_H5, ELEMENT_H6, ELEMENT_PARAGRAPH, ELEMENT_BLOCKQUOTE, ELEMENT_CODE_BLOCK, ELEMENT_CODE_LINE, ELEMENT_CODE_SYNTAX, ELEMENT_LI, ELEMENT_LINK, MARK_CODE, MARK_UNDERLINE, MARK_STRIKETHROUGH, MARK_ITALIC, MARK_BOLD, ELEMENT_HR, ELEMENT_TABLE, ELEMENT_TR, ELEMENT_TD, ELEMENT_TH, unwrapList, ELEMENT_TODO_LI, createTrailingBlockPlugin, createAutoformatPlugin, createExitBreakPlugin, KEYS_HEADING, createResetNodePlugin, createHeadingPlugin, createParagraphPlugin, createBlockquotePlugin, createBoldPlugin, createItalicPlugin, createUnderlinePlugin, createCodePlugin, createListPlugin, createIndentListPlugin, createHorizontalRulePlugin, createNodeIdPlugin, createTablePlugin, getListItemEntry, useListToolbarButtonState, useListToolbarButton } from "@udecode/plate";
12
- import { useSelected, useReadOnly, ReactEditor } from "slate-react";
13
+ import { PlateElement, isCollapsed, findNodePath, getPointAfter, insertNodes, ELEMENT_DEFAULT, focusEditor, getPointBefore, setNodes, isElement, PlateLeaf, createPluginFactory, useComposedRef, useEditorRef, createPointRef, insertText, moveSelection, toggleNodeType, useElement, useRemoveNodeButton, useEditorSelector, isSelectionExpanded, withHOC, normalizeEditor, getBlockAbove, queryNode, getParentNode, isType, someNode, isSelectionAtBlockStart, setElements, insertNode, getPluginType, isBlock, isBlockAboveEmpty, findNode, PlateContent, getNodeEntries, useEditorState, collapseSelection, useMarkToolbarButtonState, useMarkToolbarButton, insertEmptyElement, usePlateSelectors, useEventEditorSelectors, PortalBody, useFormInputProps, createPlugins, Plate } from "@udecode/plate-common";
13
14
  import { ELEMENT_SLASH_INPUT, createSlashPlugin } from "@udecode/plate-slash-command";
14
- import { cn as cn$1, withRef, withVariants, withCn, withProps, createPrimitiveElement } from "@udecode/cn";
15
- import { useComposedRef, useEditorRef, findNodePath, getPointBefore, createPointRef, insertText, moveSelection, PlateElement, toggleNodeType, PlateLeaf, isCollapsed, getPointAfter, insertNodes, ELEMENT_DEFAULT, focusEditor, setNodes, isElement, useElement, useRemoveNodeButton, useEditorSelector, isSelectionExpanded, withHOC, createPluginFactory, normalizeEditor, getBlockAbove, queryNode, getParentNode, isType, someNode, isSelectionAtBlockStart, setElements, insertNode, getPluginType, isBlock, isBlockAboveEmpty, findNode, PlateContent, useMarkToolbarButtonState, useMarkToolbarButton, useEditorState, getNodeEntries, collapseSelection, usePlateSelectors, useEventEditorSelectors, PortalBody, useFormInputProps, createPlugins, Plate } from "@udecode/plate-common";
16
- import { ELEMENT_H1, ELEMENT_H2, ELEMENT_H3, ELEMENT_H4 as ELEMENT_H4$1, ELEMENT_H5 as ELEMENT_H5$1, ELEMENT_H6 as ELEMENT_H6$1 } from "@udecode/plate-heading";
15
+ import { useSelected, useReadOnly, ReactEditor } from "slate-react";
16
+ import { useCodeBlockElementState, useCodeSyntaxLeaf, ELEMENT_CODE_BLOCK as ELEMENT_CODE_BLOCK$1 } from "@udecode/plate-code-block";
17
+ import MonacoEditor, { loader, useMonaco } from "@monaco-editor/react";
18
+ import { Combobox, ComboboxInput, ComboboxButton, Transition, ComboboxOptions, ComboboxOption, Popover as Popover$3, PopoverButton, PopoverPanel, TransitionChild, Disclosure, DisclosureButton, DisclosurePanel, Menu, MenuButton, MenuItems, MenuItem } from "@headlessui/react";
17
19
  import { cva } from "class-variance-authority";
18
- import { Plus, AlignCenter as AlignCenter$1, AlignJustify, AlignLeft as AlignLeft$1, AlignRight as AlignRight$1, ChevronDown, PaintBucket, Quote, Check, ChevronRight, ChevronsUpDown, X, FileCode, Baseline, RectangleVertical, Combine, Ungroup, MessageSquare, MessageSquarePlus, Trash, GripVertical, Edit2, Smile, ExternalLink, Heading1, Heading2, Heading3, Heading4, Heading5, Heading6, Indent, Keyboard, WrapText, Minus, MoreHorizontal, Outdent, Pilcrow, RotateCcw, RectangleHorizontal, Search, Settings, Strikethrough, Subscript, Superscript, Table, Text, Underline, Link2Off, Eye, Moon, SunMedium, Twitter } from "lucide-react";
19
- import { useComboboxContext, Combobox, useComboboxStore, ComboboxProvider, Portal, ComboboxPopover, ComboboxItem } from "@ariakit/react";
20
+ import { Eye, SquarePen, Plus, AlignCenter as AlignCenter$1, AlignJustify, AlignLeft as AlignLeft$1, AlignRight as AlignRight$1, ChevronDown, PaintBucket, Quote, Check, ChevronRight, ChevronsUpDown, X, FileCode, Baseline, RectangleVertical, Combine, Ungroup, MessageSquare, MessageSquarePlus, Trash, GripVertical, Edit2, Smile, ExternalLink, Heading1, Heading2, Heading3, Heading4, Heading5, Heading6, Indent, Keyboard, WrapText, Minus, MoreHorizontal, Outdent, Pilcrow, RotateCcw, RectangleHorizontal, Search, Settings, Strikethrough, Subscript, Superscript, Table, Text, Underline, Link2Off, Moon, SunMedium, Twitter } from "lucide-react";
21
+ import mermaid from "mermaid";
22
+ import { ELEMENT_H1, ELEMENT_H2, ELEMENT_H3, ELEMENT_H4 as ELEMENT_H4$1, ELEMENT_H5 as ELEMENT_H5$1, ELEMENT_H6 as ELEMENT_H6$1 } from "@udecode/plate-heading";
23
+ import { useComboboxContext, Combobox as Combobox$1, useComboboxStore, ComboboxProvider, Portal, ComboboxPopover, ComboboxItem } from "@ariakit/react";
20
24
  import { useHTMLInputCursorState, useComboboxInput, filterWords } from "@udecode/plate-combobox";
21
- import { useCodeSyntaxLeaf, useCodeBlockElementState, ELEMENT_CODE_BLOCK as ELEMENT_CODE_BLOCK$1 } from "@udecode/plate-code-block";
22
- import MonacoEditor, { loader, useMonaco } from "@monaco-editor/react";
23
- import { Combobox as Combobox$1, ComboboxInput, ComboboxButton, Transition, ComboboxOptions, ComboboxOption, Popover as Popover$3, PopoverButton, PopoverPanel, TransitionChild, Disclosure, DisclosureButton, DisclosurePanel, Menu, MenuButton, MenuItems, MenuItem } from "@headlessui/react";
25
+ import { useTableCellElementState, useTableCellElement, useTableCellElementResizableState, useTableCellElementResizable, useTableBordersDropdownMenuContentState, useTableMergeState, TableProvider, useTableElementState, useTableElement, mergeTableCells, unmergeTableCells, ELEMENT_TABLE as ELEMENT_TABLE$1, getTableColumnCount, insertTable, deleteTable, insertTableColumn, deleteColumn, insertTableRow, deleteRow } from "@udecode/plate-table";
26
+ import { ResizeHandle as ResizeHandle$1 } from "@udecode/plate-resizable";
24
27
  import * as PopoverPrimitive from "@radix-ui/react-popover";
25
28
  import { PopoverAnchor } from "@radix-ui/react-popover";
26
- import { useTableBordersDropdownMenuContentState, useTableMergeState, TableProvider, useTableElementState, useTableElement, mergeTableCells, unmergeTableCells, useTableCellElementState, useTableCellElement, useTableCellElementResizableState, useTableCellElementResizable, ELEMENT_TABLE as ELEMENT_TABLE$1, getTableColumnCount, insertTable, deleteTable, insertTableColumn, deleteColumn, insertTableRow, deleteRow } from "@udecode/plate-table";
27
29
  import { Slot } from "@radix-ui/react-slot";
28
30
  import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
29
31
  import * as SeparatorPrimitive from "@radix-ui/react-separator";
30
- import { ResizeHandle as ResizeHandle$1 } from "@udecode/plate-resizable";
31
32
  import arrayMutators from "final-form-arrays";
32
33
  import setFieldData from "final-form-set-field-data";
33
34
  import { FORM_ERROR, createForm, getIn } from "final-form";
@@ -800,6 +801,22 @@ function wrapFieldsWithMeta(Field2) {
800
801
  );
801
802
  };
802
803
  }
804
+ function wrapFieldWithNoHeader(Field2) {
805
+ return (props) => {
806
+ return /* @__PURE__ */ React.createElement(
807
+ FieldMeta,
808
+ {
809
+ name: props.input.name,
810
+ label: false,
811
+ description: "",
812
+ error: props.meta.error,
813
+ index: props.index,
814
+ tinaForm: props.tinaForm
815
+ },
816
+ /* @__PURE__ */ React.createElement(Field2, { ...props })
817
+ );
818
+ };
819
+ }
803
820
  function wrapFieldWithError(Field2) {
804
821
  return (props) => {
805
822
  return /* @__PURE__ */ React.createElement(
@@ -876,9 +893,9 @@ const FieldDescription = ({
876
893
  "span",
877
894
  {
878
895
  className: `block font-sans text-xs italic font-light text-gray-400 pt-0.5 whitespace-normal m-0 ${className}`,
879
- ...props
880
- },
881
- children
896
+ ...props,
897
+ dangerouslySetInnerHTML: { __html: children }
898
+ }
882
899
  );
883
900
  };
884
901
  const FieldError = ({
@@ -908,6 +925,20 @@ const useEditorContext = () => {
908
925
  const useTemplates = () => {
909
926
  return React__default.useContext(EditorContext);
910
927
  };
928
+ const BlockquoteElement = withRef(
929
+ ({ children, className, ...props }, ref) => {
930
+ return /* @__PURE__ */ React__default.createElement(
931
+ PlateElement,
932
+ {
933
+ asChild: true,
934
+ className: cn$1("my-1 border-l-2 pl-6 italic", className),
935
+ ref,
936
+ ...props
937
+ },
938
+ /* @__PURE__ */ React__default.createElement("blockquote", null, children)
939
+ );
940
+ }
941
+ );
911
942
  function classNames$1(...classes) {
912
943
  return classes.filter(Boolean).join(" ");
913
944
  }
@@ -917,6 +948,503 @@ const uuid = () => {
917
948
  (c) => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
918
949
  );
919
950
  };
951
+ function ChevronDownIcon(props, svgRef) {
952
+ return /* @__PURE__ */ React.createElement("svg", Object.assign({
953
+ xmlns: "http://www.w3.org/2000/svg",
954
+ viewBox: "0 0 20 20",
955
+ fill: "currentColor",
956
+ "aria-hidden": "true",
957
+ ref: svgRef
958
+ }, props), /* @__PURE__ */ React.createElement("path", {
959
+ fillRule: "evenodd",
960
+ d: "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z",
961
+ clipRule: "evenodd"
962
+ }));
963
+ }
964
+ const ForwardRef = React.forwardRef(ChevronDownIcon);
965
+ const ChevronDownIcon$1 = ForwardRef;
966
+ const Autocomplete = ({
967
+ value,
968
+ onChange,
969
+ defaultQuery,
970
+ items: items2
971
+ }) => {
972
+ const [query, setQuery] = React__default.useState(defaultQuery ?? "");
973
+ const filteredItems = React__default.useMemo(() => {
974
+ try {
975
+ const reFilter = new RegExp(query, "i");
976
+ const _items = items2.filter((item) => reFilter.test(item.label));
977
+ if (_items.length === 0)
978
+ return items2;
979
+ return _items;
980
+ } catch (err) {
981
+ return items2;
982
+ }
983
+ }, [items2, query]);
984
+ return /* @__PURE__ */ React__default.createElement(
985
+ Combobox,
986
+ {
987
+ value,
988
+ onChange,
989
+ as: "div",
990
+ className: "relative inline-block text-left z-20"
991
+ },
992
+ /* @__PURE__ */ React__default.createElement("div", { className: "mt-1" }, /* @__PURE__ */ React__default.createElement("div", { className: "relative w-full cursor-default overflow-hidden rounded-lg bg-white text-left shadow-md sm:text-sm" }, /* @__PURE__ */ React__default.createElement(
993
+ ComboboxInput,
994
+ {
995
+ className: "w-full border-none py-2 pl-3 pr-10 text-sm leading-5 text-gray-900 focus:ring-0 focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75 focus-visible:ring-offset-2 focus-visible:ring-offset-teal-300",
996
+ displayValue: (item) => (item == null ? void 0 : item.label) ?? "Plain Text",
997
+ onChange: (event) => setQuery(event.target.value),
998
+ onClick: (ev) => ev.stopPropagation()
999
+ }
1000
+ ), /* @__PURE__ */ React__default.createElement(ComboboxButton, { className: "absolute inset-y-0 right-0 flex items-center pr-2" }, /* @__PURE__ */ React__default.createElement(
1001
+ ChevronDownIcon$1,
1002
+ {
1003
+ className: "h-5 w-5 text-gray-400",
1004
+ "aria-hidden": "true"
1005
+ }
1006
+ )))),
1007
+ /* @__PURE__ */ React__default.createElement(
1008
+ Transition,
1009
+ {
1010
+ enter: "transition ease-out duration-100",
1011
+ enterFrom: "transform opacity-0 scale-95",
1012
+ enterTo: "transform opacity-100 scale-100",
1013
+ leave: "transition ease-in duration-75",
1014
+ leaveFrom: "transform opacity-100 scale-100",
1015
+ leaveTo: "transform opacity-0 scale-95"
1016
+ },
1017
+ /* @__PURE__ */ React__default.createElement(ComboboxOptions, { className: "origin-top-right absolute right-0 mt-1 w-full max-h-[300px] overflow-y-auto rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none" }, filteredItems.map((item) => /* @__PURE__ */ React__default.createElement(ComboboxOption, { key: item.key, value: item }, ({ focus }) => /* @__PURE__ */ React__default.createElement(
1018
+ "button",
1019
+ {
1020
+ className: classNames$1(
1021
+ focus ? "bg-gray-100 text-gray-900" : "text-gray-700",
1022
+ "block px-4 py-2 text-xs w-full text-right"
1023
+ )
1024
+ },
1025
+ item.render(item)
1026
+ ))))
1027
+ )
1028
+ );
1029
+ };
1030
+ loader.config({
1031
+ paths: { vs: "https://cdn.jsdelivr.net/npm/monaco-editor@0.31.1/min/vs" }
1032
+ });
1033
+ let retryCount = 0;
1034
+ const retryFocus = (ref) => {
1035
+ if (ref.current) {
1036
+ ref.current.focus();
1037
+ } else {
1038
+ if (retryCount < 30) {
1039
+ setTimeout(() => {
1040
+ retryCount = retryCount + 1;
1041
+ retryFocus(ref);
1042
+ }, 100);
1043
+ }
1044
+ }
1045
+ };
1046
+ const MINIMUM_HEIGHT = 75;
1047
+ const CodeBlock = ({
1048
+ attributes,
1049
+ editor,
1050
+ element,
1051
+ language: restrictLanguage,
1052
+ onChangeCallback,
1053
+ defaultValue,
1054
+ ...props
1055
+ }) => {
1056
+ const [navigateAway, setNavigateAway] = React__default.useState(null);
1057
+ const monaco = useMonaco();
1058
+ const monacoEditorRef = React__default.useRef(null);
1059
+ const selected = useSelected();
1060
+ const [height, setHeight] = React__default.useState(MINIMUM_HEIGHT);
1061
+ React__default.useEffect(() => {
1062
+ if (selected && isCollapsed(editor.selection)) {
1063
+ retryFocus(monacoEditorRef);
1064
+ }
1065
+ }, [selected, monacoEditorRef.current]);
1066
+ const value = element.value || "";
1067
+ if (typeof value !== "string") {
1068
+ throw new Error("Element must be of type string for code block");
1069
+ }
1070
+ const language = restrictLanguage || element.lang;
1071
+ const id = React__default.useMemo(() => uuid(), []);
1072
+ const languages = React__default.useMemo(() => {
1073
+ const defaultLangSet = { "": "plain text" };
1074
+ if (!monaco)
1075
+ return defaultLangSet;
1076
+ return monaco.languages.getLanguages().reduce((ac, cv) => {
1077
+ if (cv.id === "plaintext")
1078
+ return ac;
1079
+ return { ...ac, [cv.id]: cv.id };
1080
+ }, defaultLangSet);
1081
+ }, [monaco]);
1082
+ React__default.useEffect(() => {
1083
+ if (monaco) {
1084
+ monaco.languages.typescript.typescriptDefaults.setEagerModelSync(true);
1085
+ monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
1086
+ // disable errors
1087
+ noSemanticValidation: true,
1088
+ noSyntaxValidation: true
1089
+ });
1090
+ }
1091
+ }, [monaco]);
1092
+ const items2 = Object.entries(languages).map(([key, label]) => ({
1093
+ key,
1094
+ label,
1095
+ render: (item) => item.label
1096
+ }));
1097
+ const currentItem = React__default.useMemo(() => {
1098
+ return items2.find((item) => item.key === language) ?? {
1099
+ key: "",
1100
+ label: "Plain Text"
1101
+ };
1102
+ }, [items2, language]);
1103
+ React__default.useEffect(() => {
1104
+ if (navigateAway) {
1105
+ setNavigateAway(null);
1106
+ switch (navigateAway) {
1107
+ case "remove":
1108
+ {
1109
+ focusEditor(editor);
1110
+ setNodes(
1111
+ editor,
1112
+ {
1113
+ type: "p",
1114
+ children: [{ text: "" }],
1115
+ lang: void 0,
1116
+ value: void 0
1117
+ },
1118
+ {
1119
+ match: (n) => {
1120
+ if (isElement(n) && n.type === element.type) {
1121
+ return true;
1122
+ }
1123
+ }
1124
+ }
1125
+ );
1126
+ }
1127
+ break;
1128
+ case "insertNext":
1129
+ {
1130
+ insertNodes(
1131
+ editor,
1132
+ [
1133
+ {
1134
+ type: ELEMENT_DEFAULT,
1135
+ children: [{ text: "" }],
1136
+ lang: void 0,
1137
+ value: void 0
1138
+ }
1139
+ ],
1140
+ { select: true }
1141
+ );
1142
+ focusEditor(editor);
1143
+ }
1144
+ break;
1145
+ case "up":
1146
+ {
1147
+ const path = findNodePath(editor, element);
1148
+ if (!path) {
1149
+ return;
1150
+ }
1151
+ const previousNodePath = getPointBefore(editor, path);
1152
+ if (!previousNodePath) {
1153
+ focusEditor(editor);
1154
+ insertNodes(
1155
+ editor,
1156
+ [
1157
+ {
1158
+ type: ELEMENT_DEFAULT,
1159
+ children: [{ text: "" }],
1160
+ lang: void 0,
1161
+ value: void 0
1162
+ }
1163
+ ],
1164
+ // Insert a new node at the current path, resulting in the code_block
1165
+ // moving down one block
1166
+ { at: path, select: true }
1167
+ );
1168
+ return;
1169
+ }
1170
+ focusEditor(editor, previousNodePath);
1171
+ }
1172
+ break;
1173
+ case "down": {
1174
+ const path = findNodePath(editor, element);
1175
+ if (!path) {
1176
+ return;
1177
+ }
1178
+ const nextNodePath = getPointAfter(editor, path);
1179
+ if (!nextNodePath) {
1180
+ insertNodes(
1181
+ editor,
1182
+ [
1183
+ {
1184
+ type: ELEMENT_DEFAULT,
1185
+ children: [{ text: "" }],
1186
+ lang: void 0,
1187
+ value: void 0
1188
+ }
1189
+ ],
1190
+ { select: true }
1191
+ );
1192
+ focusEditor(editor);
1193
+ } else {
1194
+ focusEditor(editor, nextNodePath);
1195
+ }
1196
+ break;
1197
+ }
1198
+ }
1199
+ }
1200
+ }, [navigateAway]);
1201
+ function handleEditorDidMount(monacoEditor, monaco2) {
1202
+ monacoEditorRef.current = monacoEditor;
1203
+ monacoEditor.onDidContentSizeChange(() => {
1204
+ setHeight(
1205
+ monacoEditor.getContentHeight() > MINIMUM_HEIGHT ? monacoEditor.getContentHeight() : MINIMUM_HEIGHT
1206
+ );
1207
+ monacoEditor.layout();
1208
+ });
1209
+ setNodes(editor, { value: defaultValue, lang: language });
1210
+ monacoEditor.addCommand(monaco2.KeyMod.Shift | monaco2.KeyCode.Enter, () => {
1211
+ if (monacoEditor.hasTextFocus()) {
1212
+ setNavigateAway("insertNext");
1213
+ }
1214
+ });
1215
+ monacoEditor.onKeyDown((l) => {
1216
+ if (l.code === "ArrowUp") {
1217
+ const selection = monacoEditor.getSelection();
1218
+ if (selection.endLineNumber === 1 && selection.startLineNumber === 1) {
1219
+ setNavigateAway("up");
1220
+ }
1221
+ }
1222
+ if (l.code === "ArrowDown") {
1223
+ const selection = monacoEditor.getSelection();
1224
+ const totalLines = monacoEditor.getModel().getLineCount();
1225
+ if (selection.endLineNumber === totalLines && selection.startLineNumber === totalLines) {
1226
+ setNavigateAway("down");
1227
+ }
1228
+ }
1229
+ if (l.code === "Backspace") {
1230
+ const selection = monacoEditor.getSelection();
1231
+ if (selection.endColumn === 1 && selection.endLineNumber === 1 && selection.positionColumn === 1 && selection.positionLineNumber === 1 && selection.selectionStartColumn === 1 && selection.selectionStartLineNumber === 1 && selection.startColumn === 1 && selection.startLineNumber === 1) {
1232
+ setNavigateAway("remove");
1233
+ }
1234
+ }
1235
+ });
1236
+ }
1237
+ return /* @__PURE__ */ React__default.createElement(
1238
+ "div",
1239
+ {
1240
+ ...attributes,
1241
+ className: "relative mb-2 mt-0.5 rounded-lg shadow-md p-2 border-gray-200 border"
1242
+ },
1243
+ /* @__PURE__ */ React__default.createElement("style", null, `.monaco-editor .editor-widget {
1244
+ display: none !important;
1245
+ visibility: hidden !important;
1246
+ }`),
1247
+ props.children,
1248
+ /* @__PURE__ */ React__default.createElement("div", { contentEditable: false }, !restrictLanguage && /* @__PURE__ */ React__default.createElement("div", { className: "flex justify-between pb-2" }, /* @__PURE__ */ React__default.createElement("div", null), /* @__PURE__ */ React__default.createElement(
1249
+ Autocomplete,
1250
+ {
1251
+ items: items2,
1252
+ value: currentItem,
1253
+ defaultQuery: "plaintext",
1254
+ onChange: (item) => setNodes(editor, { lang: item.key })
1255
+ }
1256
+ )), /* @__PURE__ */ React__default.createElement("div", { style: { height: `${height}px` } }, /* @__PURE__ */ React__default.createElement(
1257
+ MonacoEditor,
1258
+ {
1259
+ path: id,
1260
+ onMount: handleEditorDidMount,
1261
+ options: {
1262
+ scrollBeyondLastLine: false,
1263
+ // automaticLayout: true,
1264
+ tabSize: 2,
1265
+ disableLayerHinting: true,
1266
+ accessibilitySupport: "off",
1267
+ codeLens: false,
1268
+ wordWrap: "on",
1269
+ minimap: {
1270
+ enabled: false
1271
+ },
1272
+ fontSize: 14,
1273
+ lineHeight: 2,
1274
+ formatOnPaste: true,
1275
+ lineNumbers: "off",
1276
+ formatOnType: true,
1277
+ fixedOverflowWidgets: true,
1278
+ // Takes too much horizontal space for iframe
1279
+ folding: false,
1280
+ renderLineHighlight: "none",
1281
+ scrollbar: {
1282
+ verticalScrollbarSize: 1,
1283
+ horizontalScrollbarSize: 1,
1284
+ // https://github.com/microsoft/monaco-editor/issues/2007#issuecomment-644425664
1285
+ alwaysConsumeMouseWheel: false
1286
+ }
1287
+ },
1288
+ language: String(language),
1289
+ value: String(element.value),
1290
+ onChange: (value2) => {
1291
+ onChangeCallback == null ? void 0 : onChangeCallback(value2);
1292
+ setNodes(editor, { value: value2, lang: language });
1293
+ }
1294
+ }
1295
+ )))
1296
+ );
1297
+ };
1298
+ const CodeBlockElement = withRef(
1299
+ ({ className, ...props }, ref) => {
1300
+ const { element } = props;
1301
+ const state = useCodeBlockElementState({ element });
1302
+ return /* @__PURE__ */ React__default.createElement(
1303
+ PlateElement,
1304
+ {
1305
+ className: cn$1("relative py-1", state.className, className),
1306
+ ref,
1307
+ ...props
1308
+ },
1309
+ /* @__PURE__ */ React__default.createElement(CodeBlock, { ...props })
1310
+ );
1311
+ }
1312
+ );
1313
+ const CodeLeaf = withRef(
1314
+ ({ children, className, ...props }, ref) => {
1315
+ return /* @__PURE__ */ React__default.createElement(
1316
+ PlateLeaf,
1317
+ {
1318
+ asChild: true,
1319
+ className: cn$1(
1320
+ "whitespace-pre-wrap rounded-md bg-muted px-[0.3em] py-[0.2em] font-mono text-sm",
1321
+ className
1322
+ ),
1323
+ ref,
1324
+ ...props
1325
+ },
1326
+ /* @__PURE__ */ React__default.createElement("code", null, children)
1327
+ );
1328
+ }
1329
+ );
1330
+ const CodeLineElement = withRef((props, ref) => /* @__PURE__ */ React__default.createElement(PlateElement, { ref, ...props }));
1331
+ const CodeSyntaxLeaf = withRef(
1332
+ ({ children, ...props }, ref) => {
1333
+ const { leaf } = props;
1334
+ const { tokenProps } = useCodeSyntaxLeaf({ leaf });
1335
+ return /* @__PURE__ */ React__default.createElement(PlateLeaf, { ref, ...props }, /* @__PURE__ */ React__default.createElement("span", { ...tokenProps }, children));
1336
+ }
1337
+ );
1338
+ const listVariants = cva("m-0 ps-6", {
1339
+ variants: {
1340
+ variant: {
1341
+ ol: "list-decimal",
1342
+ ul: "list-disc [&_ul]:list-[circle] [&_ul_ul]:list-[square]"
1343
+ }
1344
+ }
1345
+ });
1346
+ const ListElementVariants = withVariants(PlateElement, listVariants, [
1347
+ "variant"
1348
+ ]);
1349
+ const ListElement = withRef(
1350
+ ({ children, variant = "ul", ...props }, ref) => {
1351
+ const Component2 = variant;
1352
+ return /* @__PURE__ */ React__default.createElement(ListElementVariants, { asChild: true, ref, variant, ...props }, /* @__PURE__ */ React__default.createElement(Component2, null, children));
1353
+ }
1354
+ );
1355
+ const ELEMENT_MERMAID = "mermaid";
1356
+ const createMermaidPlugin = createPluginFactory({
1357
+ isElement: true,
1358
+ isVoid: true,
1359
+ isInline: false,
1360
+ key: ELEMENT_MERMAID
1361
+ });
1362
+ const MermaidElementWithRef = ({ config }) => {
1363
+ const mermaidRef = useRef(null);
1364
+ useEffect(() => {
1365
+ if (mermaidRef.current) {
1366
+ mermaid.initialize({ startOnLoad: true });
1367
+ mermaid.init();
1368
+ }
1369
+ }, [config]);
1370
+ return /* @__PURE__ */ React__default.createElement("div", { contentEditable: false, className: "border-border border-b" }, /* @__PURE__ */ React__default.createElement("div", { ref: mermaidRef }, /* @__PURE__ */ React__default.createElement("pre", { className: "mermaid not-tina-prose" }, config)));
1371
+ };
1372
+ const Bubble = ({ children }) => {
1373
+ return /* @__PURE__ */ React__default.createElement("div", { className: "bg-blue-600 rounded-full p-2 transition-transform duration-200 ease-in-out hover:scale-110" }, children);
1374
+ };
1375
+ const ErrorMsg = ({ error }) => {
1376
+ if (error) {
1377
+ return /* @__PURE__ */ React__default.createElement(
1378
+ "div",
1379
+ {
1380
+ contentEditable: false,
1381
+ className: "font-mono bg-red-600 text-white p-2 rounded-md cursor-default"
1382
+ },
1383
+ error
1384
+ );
1385
+ }
1386
+ return null;
1387
+ };
1388
+ const DEFAULT_MERMAID_CONFIG = `%% This won't render without implementing a rendering engine (e.g. mermaid on npm)
1389
+ flowchart TD
1390
+ id1(this is an example flow diagram)
1391
+ --> id2(modify me to see changes!)
1392
+ id2
1393
+ --> id3(Click the top button to preview the changes)
1394
+ --> id4(Learn about mermaid diagrams - mermaid.js.org)`;
1395
+ const MermaidElement = withRef(
1396
+ ({ children, nodeProps, element, ...props }, ref) => {
1397
+ const [mermaidConfig, setMermaidConfig] = useState(
1398
+ element.value || DEFAULT_MERMAID_CONFIG
1399
+ );
1400
+ const [isEditing, setIsEditing] = useState(
1401
+ mermaidConfig === DEFAULT_MERMAID_CONFIG || false
1402
+ );
1403
+ const [mermaidError, setMermaidError] = useState(null);
1404
+ const node = {
1405
+ type: ELEMENT_MERMAID,
1406
+ value: mermaidConfig,
1407
+ children: [{ type: "text", text: "" }]
1408
+ };
1409
+ useEffect(() => {
1410
+ if (mermaid.parse(mermaidConfig)) {
1411
+ setMermaidError(null);
1412
+ }
1413
+ }, [mermaidConfig]);
1414
+ mermaid.parseError = (err) => {
1415
+ setMermaidError(
1416
+ String(err.message) || "An error occurred while parsing the diagram."
1417
+ );
1418
+ };
1419
+ return /* @__PURE__ */ React__default.createElement(PlateElement, { element, ref, ...props }, /* @__PURE__ */ React__default.createElement("div", { className: "relative group" }, /* @__PURE__ */ React__default.createElement("div", { className: "absolute top-2 right-2 z-10 space-y-2 opacity-0 group-hover:opacity-100 transition-opacity duration-200 ease-in-out" }, /* @__PURE__ */ React__default.createElement(Bubble, null, isEditing ? /* @__PURE__ */ React__default.createElement(
1420
+ Eye,
1421
+ {
1422
+ className: "w-5 h-5 fill-white cursor-pointer",
1423
+ onClick: () => {
1424
+ setIsEditing(!isEditing);
1425
+ }
1426
+ }
1427
+ ) : /* @__PURE__ */ React__default.createElement(
1428
+ SquarePen,
1429
+ {
1430
+ className: "w-5 h-5 fill-white cursor-pointer",
1431
+ onClick: () => {
1432
+ setIsEditing(!isEditing);
1433
+ }
1434
+ }
1435
+ ))), isEditing ? /* @__PURE__ */ React__default.createElement(
1436
+ CodeBlock,
1437
+ {
1438
+ children: "",
1439
+ language: "yaml",
1440
+ ...props,
1441
+ element: node,
1442
+ defaultValue: mermaidConfig,
1443
+ onChangeCallback: (value) => setMermaidConfig(value)
1444
+ }
1445
+ ) : /* @__PURE__ */ React__default.createElement(MermaidElementWithRef, { config: mermaidConfig })), children, /* @__PURE__ */ React__default.createElement(ErrorMsg, { error: mermaidError }));
1446
+ }
1447
+ );
920
1448
  const RawMarkdown = () => {
921
1449
  return /* @__PURE__ */ React__default.createElement(
922
1450
  "svg",
@@ -935,6 +1463,29 @@ const RawMarkdown = () => {
935
1463
  /* @__PURE__ */ React__default.createElement("path", { d: "M22.27 19.385H1.73A1.73 1.73 0 010 17.655V6.345a1.73 1.73 0 011.73-1.73h20.54A1.73 1.73 0 0124 6.345v11.308a1.73 1.73 0 01-1.73 1.731zM5.769 15.923v-4.5l2.308 2.885 2.307-2.885v4.5h2.308V8.078h-2.308l-2.307 2.885-2.308-2.885H3.46v7.847zM21.232 12h-2.309V8.077h-2.307V12h-2.308l3.461 4.039z" })
936
1464
  );
937
1465
  };
1466
+ const MermaidIcon = () => /* @__PURE__ */ React__default.createElement(
1467
+ "svg",
1468
+ {
1469
+ width: "100%",
1470
+ height: "100%",
1471
+ viewBox: "0 0 491 491",
1472
+ version: "1.1",
1473
+ xmlns: "http://www.w3.org/2000/svg",
1474
+ fillRule: "evenodd",
1475
+ clipRule: "evenodd",
1476
+ strokeLinejoin: "round",
1477
+ strokeMiterlimit: 2
1478
+ },
1479
+ /* @__PURE__ */ React__default.createElement("path", { d: "M490.16,84.61C490.16,37.912 452.248,0 405.55,0L84.61,0C37.912,0 0,37.912 0,84.61L0,405.55C0,452.248 37.912,490.16 84.61,490.16L405.55,490.16C452.248,490.16 490.16,452.248 490.16,405.55L490.16,84.61Z" }),
1480
+ /* @__PURE__ */ React__default.createElement(
1481
+ "path",
1482
+ {
1483
+ d: "M407.48,111.18C335.587,108.103 269.573,152.338 245.08,220C220.587,152.338 154.573,108.103 82.68,111.18C80.285,168.229 107.577,222.632 154.74,254.82C178.908,271.419 193.35,298.951 193.27,328.27L193.27,379.13L296.9,379.13L296.9,328.27C296.816,298.953 311.255,271.42 335.42,254.82C382.596,222.644 409.892,168.233 407.48,111.18Z",
1484
+ fill: "white",
1485
+ fillRule: "nonzero"
1486
+ }
1487
+ )
1488
+ );
938
1489
  const borderAll = (props) => /* @__PURE__ */ React__default.createElement(
939
1490
  "svg",
940
1491
  {
@@ -1175,6 +1726,7 @@ const Icons = {
1175
1726
  clear: X,
1176
1727
  close: X,
1177
1728
  // code: Code2,
1729
+ paint: PaintBucket,
1178
1730
  codeblock: FileCode,
1179
1731
  color: Baseline,
1180
1732
  column: RectangleVertical,
@@ -1200,6 +1752,7 @@ const Icons = {
1200
1752
  lineHeight: WrapText,
1201
1753
  // link: Link2,
1202
1754
  minus: Minus,
1755
+ mermaid: MermaidIcon,
1203
1756
  more: MoreHorizontal,
1204
1757
  // ol: ListOrdered,
1205
1758
  outdent: Outdent,
@@ -1610,7 +2163,7 @@ const InlineComboboxInput = forwardRef(({ className, ...props }, propRef) => {
1610
2163
  },
1611
2164
  value || "​"
1612
2165
  ), /* @__PURE__ */ React__default.createElement(
1613
- Combobox,
2166
+ Combobox$1,
1614
2167
  {
1615
2168
  autoSelect: true,
1616
2169
  className: cn$1(
@@ -1770,782 +2323,6 @@ const SlashInputElement = withRef(
1770
2323
  );
1771
2324
  }
1772
2325
  );
1773
- const listVariants = cva("m-0 ps-6", {
1774
- variants: {
1775
- variant: {
1776
- ol: "list-decimal",
1777
- ul: "list-disc [&_ul]:list-[circle] [&_ul_ul]:list-[square]"
1778
- }
1779
- }
1780
- });
1781
- const ListElementVariants = withVariants(PlateElement, listVariants, [
1782
- "variant"
1783
- ]);
1784
- const ListElement = withRef(
1785
- ({ children, variant = "ul", ...props }, ref) => {
1786
- const Component2 = variant;
1787
- return /* @__PURE__ */ React__default.createElement(ListElementVariants, { asChild: true, ref, variant, ...props }, /* @__PURE__ */ React__default.createElement(Component2, null, children));
1788
- }
1789
- );
1790
- const BlockquoteElement = withRef(
1791
- ({ children, className, ...props }, ref) => {
1792
- return /* @__PURE__ */ React__default.createElement(
1793
- PlateElement,
1794
- {
1795
- asChild: true,
1796
- className: cn$1("my-1 border-l-2 pl-6 italic", className),
1797
- ref,
1798
- ...props
1799
- },
1800
- /* @__PURE__ */ React__default.createElement("blockquote", null, children)
1801
- );
1802
- }
1803
- );
1804
- const CodeLeaf = withRef(
1805
- ({ children, className, ...props }, ref) => {
1806
- return /* @__PURE__ */ React__default.createElement(
1807
- PlateLeaf,
1808
- {
1809
- asChild: true,
1810
- className: cn$1(
1811
- "whitespace-pre-wrap rounded-md bg-muted px-[0.3em] py-[0.2em] font-mono text-sm",
1812
- className
1813
- ),
1814
- ref,
1815
- ...props
1816
- },
1817
- /* @__PURE__ */ React__default.createElement("code", null, children)
1818
- );
1819
- }
1820
- );
1821
- const CodeLineElement = withRef((props, ref) => /* @__PURE__ */ React__default.createElement(PlateElement, { ref, ...props }));
1822
- const CodeSyntaxLeaf = withRef(
1823
- ({ children, ...props }, ref) => {
1824
- const { leaf } = props;
1825
- const { tokenProps } = useCodeSyntaxLeaf({ leaf });
1826
- return /* @__PURE__ */ React__default.createElement(PlateLeaf, { ref, ...props }, /* @__PURE__ */ React__default.createElement("span", { ...tokenProps }, children));
1827
- }
1828
- );
1829
- function ChevronDownIcon(props, svgRef) {
1830
- return /* @__PURE__ */ React.createElement("svg", Object.assign({
1831
- xmlns: "http://www.w3.org/2000/svg",
1832
- viewBox: "0 0 20 20",
1833
- fill: "currentColor",
1834
- "aria-hidden": "true",
1835
- ref: svgRef
1836
- }, props), /* @__PURE__ */ React.createElement("path", {
1837
- fillRule: "evenodd",
1838
- d: "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z",
1839
- clipRule: "evenodd"
1840
- }));
1841
- }
1842
- const ForwardRef = React.forwardRef(ChevronDownIcon);
1843
- const ChevronDownIcon$1 = ForwardRef;
1844
- const Autocomplete = ({
1845
- value,
1846
- onChange,
1847
- defaultQuery,
1848
- items: items2
1849
- }) => {
1850
- const [query, setQuery] = React__default.useState(defaultQuery ?? "");
1851
- const filteredItems = React__default.useMemo(() => {
1852
- try {
1853
- const reFilter = new RegExp(query, "i");
1854
- const _items = items2.filter((item) => reFilter.test(item.label));
1855
- if (_items.length === 0)
1856
- return items2;
1857
- return _items;
1858
- } catch (err) {
1859
- return items2;
1860
- }
1861
- }, [items2, query]);
1862
- return /* @__PURE__ */ React__default.createElement(
1863
- Combobox$1,
1864
- {
1865
- value,
1866
- onChange,
1867
- as: "div",
1868
- className: "relative inline-block text-left z-20"
1869
- },
1870
- /* @__PURE__ */ React__default.createElement("div", { className: "mt-1" }, /* @__PURE__ */ React__default.createElement("div", { className: "relative w-full cursor-default overflow-hidden rounded-lg bg-white text-left shadow-md sm:text-sm" }, /* @__PURE__ */ React__default.createElement(
1871
- ComboboxInput,
1872
- {
1873
- className: "w-full border-none py-2 pl-3 pr-10 text-sm leading-5 text-gray-900 focus:ring-0 focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75 focus-visible:ring-offset-2 focus-visible:ring-offset-teal-300",
1874
- displayValue: (item) => (item == null ? void 0 : item.label) ?? "Plain Text",
1875
- onChange: (event) => setQuery(event.target.value),
1876
- onClick: (ev) => ev.stopPropagation()
1877
- }
1878
- ), /* @__PURE__ */ React__default.createElement(ComboboxButton, { className: "absolute inset-y-0 right-0 flex items-center pr-2" }, /* @__PURE__ */ React__default.createElement(
1879
- ChevronDownIcon$1,
1880
- {
1881
- className: "h-5 w-5 text-gray-400",
1882
- "aria-hidden": "true"
1883
- }
1884
- )))),
1885
- /* @__PURE__ */ React__default.createElement(
1886
- Transition,
1887
- {
1888
- enter: "transition ease-out duration-100",
1889
- enterFrom: "transform opacity-0 scale-95",
1890
- enterTo: "transform opacity-100 scale-100",
1891
- leave: "transition ease-in duration-75",
1892
- leaveFrom: "transform opacity-100 scale-100",
1893
- leaveTo: "transform opacity-0 scale-95"
1894
- },
1895
- /* @__PURE__ */ React__default.createElement(ComboboxOptions, { className: "origin-top-right absolute right-0 mt-1 w-full max-h-[300px] overflow-y-auto rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none" }, filteredItems.map((item) => /* @__PURE__ */ React__default.createElement(ComboboxOption, { key: item.key, value: item }, ({ focus }) => /* @__PURE__ */ React__default.createElement(
1896
- "button",
1897
- {
1898
- className: classNames$1(
1899
- focus ? "bg-gray-100 text-gray-900" : "text-gray-700",
1900
- "block px-4 py-2 text-xs w-full text-right"
1901
- )
1902
- },
1903
- item.render(item)
1904
- ))))
1905
- )
1906
- );
1907
- };
1908
- loader.config({
1909
- paths: { vs: "https://cdn.jsdelivr.net/npm/monaco-editor@0.31.1/min/vs" }
1910
- });
1911
- let retryCount = 0;
1912
- const retryFocus = (ref) => {
1913
- if (ref.current) {
1914
- ref.current.focus();
1915
- } else {
1916
- if (retryCount < 30) {
1917
- setTimeout(() => {
1918
- retryCount = retryCount + 1;
1919
- retryFocus(ref);
1920
- }, 100);
1921
- }
1922
- }
1923
- };
1924
- const CodeBlock = ({
1925
- attributes,
1926
- editor,
1927
- element,
1928
- language: restrictLanguage,
1929
- ...props
1930
- }) => {
1931
- const [navigateAway, setNavigateAway] = React__default.useState(null);
1932
- const monaco = useMonaco();
1933
- const monacoEditorRef = React__default.useRef(null);
1934
- const selected = useSelected();
1935
- const [height, setHeight] = React__default.useState(28);
1936
- React__default.useEffect(() => {
1937
- if (selected && isCollapsed(editor.selection)) {
1938
- retryFocus(monacoEditorRef);
1939
- }
1940
- }, [selected, monacoEditorRef.current]);
1941
- const value = element.value || "";
1942
- if (typeof value !== "string") {
1943
- throw new Error("Element must be of type string for code block");
1944
- }
1945
- const language = restrictLanguage || element.lang;
1946
- const id = React__default.useMemo(() => uuid(), []);
1947
- const languages = React__default.useMemo(() => {
1948
- const defaultLangSet = { "": "plain text" };
1949
- if (!monaco)
1950
- return defaultLangSet;
1951
- return monaco.languages.getLanguages().reduce((ac, cv) => {
1952
- if (cv.id === "plaintext")
1953
- return ac;
1954
- return { ...ac, [cv.id]: cv.id };
1955
- }, defaultLangSet);
1956
- }, [monaco]);
1957
- React__default.useEffect(() => {
1958
- if (monaco) {
1959
- monaco.languages.typescript.typescriptDefaults.setEagerModelSync(true);
1960
- monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
1961
- // disable errors
1962
- noSemanticValidation: true,
1963
- noSyntaxValidation: true
1964
- });
1965
- }
1966
- }, [monaco]);
1967
- const items2 = Object.entries(languages).map(([key, label]) => ({
1968
- key,
1969
- label,
1970
- render: (item) => item.label
1971
- }));
1972
- const currentItem = React__default.useMemo(() => {
1973
- return items2.find((item) => item.key === language) ?? {
1974
- key: "",
1975
- label: "Plain Text"
1976
- };
1977
- }, [items2, language]);
1978
- React__default.useEffect(() => {
1979
- if (navigateAway) {
1980
- setNavigateAway(null);
1981
- switch (navigateAway) {
1982
- case "remove":
1983
- {
1984
- focusEditor(editor);
1985
- setNodes(
1986
- editor,
1987
- {
1988
- type: "p",
1989
- children: [{ text: "" }],
1990
- lang: void 0,
1991
- value: void 0
1992
- },
1993
- {
1994
- match: (n) => {
1995
- if (isElement(n) && n.type === element.type) {
1996
- return true;
1997
- }
1998
- }
1999
- }
2000
- );
2001
- }
2002
- break;
2003
- case "insertNext":
2004
- {
2005
- insertNodes(
2006
- editor,
2007
- [
2008
- {
2009
- type: ELEMENT_DEFAULT,
2010
- children: [{ text: "" }],
2011
- lang: void 0,
2012
- value: void 0
2013
- }
2014
- ],
2015
- { select: true }
2016
- );
2017
- focusEditor(editor);
2018
- }
2019
- break;
2020
- case "up":
2021
- {
2022
- const path = findNodePath(editor, element);
2023
- if (!path) {
2024
- return;
2025
- }
2026
- const previousNodePath = getPointBefore(editor, path);
2027
- if (!previousNodePath) {
2028
- focusEditor(editor);
2029
- insertNodes(
2030
- editor,
2031
- [
2032
- {
2033
- type: ELEMENT_DEFAULT,
2034
- children: [{ text: "" }],
2035
- lang: void 0,
2036
- value: void 0
2037
- }
2038
- ],
2039
- // Insert a new node at the current path, resulting in the code_block
2040
- // moving down one block
2041
- { at: path, select: true }
2042
- );
2043
- return;
2044
- }
2045
- focusEditor(editor, previousNodePath);
2046
- }
2047
- break;
2048
- case "down": {
2049
- const path = findNodePath(editor, element);
2050
- if (!path) {
2051
- return;
2052
- }
2053
- const nextNodePath = getPointAfter(editor, path);
2054
- if (!nextNodePath) {
2055
- insertNodes(
2056
- editor,
2057
- [
2058
- {
2059
- type: ELEMENT_DEFAULT,
2060
- children: [{ text: "" }],
2061
- lang: void 0,
2062
- value: void 0
2063
- }
2064
- ],
2065
- { select: true }
2066
- );
2067
- focusEditor(editor);
2068
- } else {
2069
- focusEditor(editor, nextNodePath);
2070
- }
2071
- break;
2072
- }
2073
- }
2074
- }
2075
- }, [navigateAway]);
2076
- function handleEditorDidMount(monacoEditor, monaco2) {
2077
- monacoEditorRef.current = monacoEditor;
2078
- monacoEditor.onDidContentSizeChange(() => {
2079
- setHeight(monacoEditor.getContentHeight());
2080
- monacoEditor.layout();
2081
- });
2082
- monacoEditor.addCommand(monaco2.KeyMod.Shift | monaco2.KeyCode.Enter, () => {
2083
- if (monacoEditor.hasTextFocus()) {
2084
- setNavigateAway("insertNext");
2085
- }
2086
- });
2087
- monacoEditor.onKeyDown((l) => {
2088
- if (l.code === "ArrowUp") {
2089
- const selection = monacoEditor.getSelection();
2090
- if (selection.endLineNumber === 1 && selection.startLineNumber === 1) {
2091
- setNavigateAway("up");
2092
- }
2093
- }
2094
- if (l.code === "ArrowDown") {
2095
- const selection = monacoEditor.getSelection();
2096
- const totalLines = monacoEditor.getModel().getLineCount();
2097
- if (selection.endLineNumber === totalLines && selection.startLineNumber === totalLines) {
2098
- setNavigateAway("down");
2099
- }
2100
- }
2101
- if (l.code === "Backspace") {
2102
- const selection = monacoEditor.getSelection();
2103
- if (selection.endColumn === 1 && selection.endLineNumber === 1 && selection.positionColumn === 1 && selection.positionLineNumber === 1 && selection.selectionStartColumn === 1 && selection.selectionStartLineNumber === 1 && selection.startColumn === 1 && selection.startLineNumber === 1) {
2104
- setNavigateAway("remove");
2105
- }
2106
- }
2107
- });
2108
- }
2109
- return /* @__PURE__ */ React__default.createElement(
2110
- "div",
2111
- {
2112
- ...attributes,
2113
- className: "relative mb-2 mt-0.5 rounded-lg shadow-md p-2 border-gray-200 border"
2114
- },
2115
- /* @__PURE__ */ React__default.createElement("style", null, `.monaco-editor .editor-widget {
2116
- display: none !important;
2117
- visibility: hidden !important;
2118
- }`),
2119
- props.children,
2120
- /* @__PURE__ */ React__default.createElement("div", { contentEditable: false }, !restrictLanguage && /* @__PURE__ */ React__default.createElement("div", { className: "flex justify-between pb-2" }, /* @__PURE__ */ React__default.createElement("div", null), /* @__PURE__ */ React__default.createElement(
2121
- Autocomplete,
2122
- {
2123
- items: items2,
2124
- value: currentItem,
2125
- defaultQuery: "plaintext",
2126
- onChange: (item) => setNodes(editor, { lang: item.key })
2127
- }
2128
- )), /* @__PURE__ */ React__default.createElement("div", { style: { height: `${height}px` } }, /* @__PURE__ */ React__default.createElement(
2129
- MonacoEditor,
2130
- {
2131
- path: id,
2132
- onMount: handleEditorDidMount,
2133
- options: {
2134
- scrollBeyondLastLine: false,
2135
- // automaticLayout: true,
2136
- tabSize: 2,
2137
- disableLayerHinting: true,
2138
- accessibilitySupport: "off",
2139
- codeLens: false,
2140
- wordWrap: "on",
2141
- minimap: {
2142
- enabled: false
2143
- },
2144
- fontSize: 14,
2145
- lineHeight: 2,
2146
- formatOnPaste: true,
2147
- lineNumbers: "off",
2148
- formatOnType: true,
2149
- fixedOverflowWidgets: true,
2150
- // Takes too much horizontal space for iframe
2151
- folding: false,
2152
- renderLineHighlight: "none",
2153
- scrollbar: {
2154
- verticalScrollbarSize: 1,
2155
- horizontalScrollbarSize: 1,
2156
- // https://github.com/microsoft/monaco-editor/issues/2007#issuecomment-644425664
2157
- alwaysConsumeMouseWheel: false
2158
- }
2159
- },
2160
- language: String(language),
2161
- value: String(element.value),
2162
- onChange: (value2) => {
2163
- setNodes(editor, { value: value2, lang: language });
2164
- }
2165
- }
2166
- )))
2167
- );
2168
- };
2169
- const CodeBlockElement = withRef(
2170
- ({ className, ...props }, ref) => {
2171
- const { element } = props;
2172
- const state = useCodeBlockElementState({ element });
2173
- return /* @__PURE__ */ React__default.createElement(
2174
- PlateElement,
2175
- {
2176
- className: cn$1("relative py-1", state.className, className),
2177
- ref,
2178
- ...props
2179
- },
2180
- /* @__PURE__ */ React__default.createElement(CodeBlock, { ...props })
2181
- );
2182
- }
2183
- );
2184
- const buttonVariants$1 = cva(
2185
- "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
2186
- {
2187
- defaultVariants: {
2188
- size: "default",
2189
- variant: "default"
2190
- },
2191
- variants: {
2192
- isMenu: {
2193
- true: "h-auto w-full cursor-pointer justify-start"
2194
- },
2195
- size: {
2196
- default: "h-10 px-4 py-2",
2197
- icon: "size-10",
2198
- lg: "h-11 rounded-md px-8",
2199
- none: "",
2200
- sm: "h-9 rounded-md px-3",
2201
- sms: "size-9 rounded-md px-0",
2202
- xs: "h-8 rounded-md px-3"
2203
- },
2204
- variant: {
2205
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
2206
- destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
2207
- ghost: "hover:bg-accent hover:text-accent-foreground",
2208
- inlineLink: "text-base text-primary underline underline-offset-4",
2209
- link: "text-primary underline-offset-4 hover:underline",
2210
- outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
2211
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80"
2212
- }
2213
- }
2214
- }
2215
- );
2216
- const Button$2 = withRef(({ asChild = false, className, isMenu, size, variant, ...props }, ref) => {
2217
- const Comp = asChild ? Slot : "button";
2218
- return /* @__PURE__ */ React.createElement(
2219
- Comp,
2220
- {
2221
- className: cn$1(buttonVariants$1({ className, isMenu, size, variant })),
2222
- ref,
2223
- ...props
2224
- }
2225
- );
2226
- });
2227
- const DropdownMenu = DropdownMenuPrimitive.Root;
2228
- const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
2229
- const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
2230
- const DropdownMenuSub = DropdownMenuPrimitive.Sub;
2231
- const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
2232
- const DropdownMenuSubTrigger = withRef(({ children, className, inset, ...props }, ref) => /* @__PURE__ */ React__default.createElement(
2233
- DropdownMenuPrimitive.SubTrigger,
2234
- {
2235
- className: cn$1(
2236
- "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",
2237
- "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
2238
- inset && "pl-8",
2239
- className
2240
- ),
2241
- ref,
2242
- ...props
2243
- },
2244
- children,
2245
- /* @__PURE__ */ React__default.createElement(Icons.chevronRight, { className: "ml-auto size-4" })
2246
- ));
2247
- const DropdownMenuSubContent = withCn(
2248
- DropdownMenuPrimitive.SubContent,
2249
- "z-[99999] min-w-32 overflow-hidden rounded-md border bg-white p-1 text-black shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2"
2250
- );
2251
- const DropdownMenuContentVariants = withProps(DropdownMenuPrimitive.Content, {
2252
- className: cn$1(
2253
- "z-[99999] min-w-32 overflow-hidden rounded-md border bg-white p-1 text-black shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2"
2254
- ),
2255
- sideOffset: 4
2256
- });
2257
- const DropdownMenuContent = withRef(({ ...props }, ref) => /* @__PURE__ */ React__default.createElement(DropdownMenuPrimitive.Portal, null, /* @__PURE__ */ React__default.createElement(DropdownMenuContentVariants, { ref, ...props })));
2258
- const menuItemVariants = cva(
2259
- cn$1(
2260
- "relative flex h-9 cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors",
2261
- "focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
2262
- ),
2263
- {
2264
- variants: {
2265
- inset: {
2266
- true: "pl-8"
2267
- }
2268
- }
2269
- }
2270
- );
2271
- const DropdownMenuItem = withVariants(
2272
- DropdownMenuPrimitive.Item,
2273
- menuItemVariants,
2274
- ["inset"]
2275
- );
2276
- const DropdownMenuCheckboxItem = withRef(({ children, className, ...props }, ref) => /* @__PURE__ */ React__default.createElement(
2277
- DropdownMenuPrimitive.CheckboxItem,
2278
- {
2279
- className: cn$1(
2280
- "relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
2281
- "cursor-pointer",
2282
- className
2283
- ),
2284
- ref,
2285
- ...props
2286
- },
2287
- /* @__PURE__ */ React__default.createElement("span", { className: "absolute left-2 flex size-3.5 items-center justify-center" }, /* @__PURE__ */ React__default.createElement(DropdownMenuPrimitive.ItemIndicator, null, /* @__PURE__ */ React__default.createElement(Icons.check, { className: "size-4" }))),
2288
- children
2289
- ));
2290
- const DropdownMenuRadioItem = withRef(({ children, className, hideIcon, ...props }, ref) => /* @__PURE__ */ React__default.createElement(
2291
- DropdownMenuPrimitive.RadioItem,
2292
- {
2293
- className: cn$1(
2294
- "relative flex select-none items-center rounded-sm pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
2295
- "h-9 cursor-pointer px-2 data-[state=checked]:bg-accent data-[state=checked]:text-accent-foreground",
2296
- className
2297
- ),
2298
- ref,
2299
- ...props
2300
- },
2301
- !hideIcon && /* @__PURE__ */ React__default.createElement("span", { className: "absolute right-2 flex size-3.5 items-center justify-center" }, /* @__PURE__ */ React__default.createElement(DropdownMenuPrimitive.ItemIndicator, null, /* @__PURE__ */ React__default.createElement(Icons.check, { className: "size-4" }))),
2302
- children
2303
- ));
2304
- const dropdownMenuLabelVariants = cva(
2305
- cn$1("select-none px-2 py-1.5 text-sm font-semibold"),
2306
- {
2307
- variants: {
2308
- inset: {
2309
- true: "pl-8"
2310
- }
2311
- }
2312
- }
2313
- );
2314
- const DropdownMenuLabel = withVariants(
2315
- DropdownMenuPrimitive.Label,
2316
- dropdownMenuLabelVariants,
2317
- ["inset"]
2318
- );
2319
- const DropdownMenuSeparator = withCn(
2320
- DropdownMenuPrimitive.Separator,
2321
- "-mx-1 my-1 h-px bg-muted"
2322
- );
2323
- withCn(
2324
- createPrimitiveElement("span"),
2325
- "ml-auto text-xs tracking-widest opacity-60"
2326
- );
2327
- const useOpenState = () => {
2328
- const [open2, setOpen] = useState(false);
2329
- const onOpenChange = useCallback(
2330
- (_value = !open2) => {
2331
- setOpen(_value);
2332
- },
2333
- [open2]
2334
- );
2335
- return {
2336
- onOpenChange,
2337
- open: open2
2338
- };
2339
- };
2340
- const Popover$2 = PopoverPrimitive.Root;
2341
- const popoverVariants = cva(
2342
- "w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 print:hidden"
2343
- );
2344
- const PopoverContent$1 = withRef(
2345
- ({ align = "center", className, sideOffset = 4, style, ...props }, ref) => /* @__PURE__ */ React.createElement(PopoverPrimitive.Portal, null, /* @__PURE__ */ React.createElement(
2346
- PopoverPrimitive.Content,
2347
- {
2348
- align,
2349
- className: cn$1(popoverVariants(), className),
2350
- ref,
2351
- sideOffset,
2352
- style: { zIndex: 1e3, ...style },
2353
- ...props
2354
- }
2355
- ))
2356
- );
2357
- const separatorVariants = cva("shrink-0 bg-border", {
2358
- defaultVariants: {
2359
- orientation: "horizontal"
2360
- },
2361
- variants: {
2362
- orientation: {
2363
- horizontal: "h-px w-full",
2364
- vertical: "h-full w-px"
2365
- }
2366
- }
2367
- });
2368
- const Separator = withVariants(
2369
- withProps(SeparatorPrimitive.Root, {
2370
- decorative: true,
2371
- orientation: "horizontal"
2372
- }),
2373
- separatorVariants
2374
- );
2375
- const TableBordersDropdownMenuContent = withRef((props, ref) => {
2376
- const {
2377
- getOnSelectTableBorder,
2378
- hasBottomBorder,
2379
- hasLeftBorder,
2380
- hasNoBorders,
2381
- hasOuterBorders,
2382
- hasRightBorder,
2383
- hasTopBorder
2384
- } = useTableBordersDropdownMenuContentState();
2385
- return /* @__PURE__ */ React__default.createElement(
2386
- DropdownMenuContent,
2387
- {
2388
- align: "start",
2389
- className: cn$1("min-w-[220px]"),
2390
- ref,
2391
- side: "right",
2392
- sideOffset: 0,
2393
- ...props
2394
- },
2395
- /* @__PURE__ */ React__default.createElement(
2396
- DropdownMenuCheckboxItem,
2397
- {
2398
- checked: hasBottomBorder,
2399
- onCheckedChange: getOnSelectTableBorder("bottom")
2400
- },
2401
- /* @__PURE__ */ React__default.createElement(Icons.borderBottom, { className: iconVariants({ size: "sm" }) }),
2402
- /* @__PURE__ */ React__default.createElement("div", null, "Bottom Border")
2403
- ),
2404
- /* @__PURE__ */ React__default.createElement(
2405
- DropdownMenuCheckboxItem,
2406
- {
2407
- checked: hasTopBorder,
2408
- onCheckedChange: getOnSelectTableBorder("top")
2409
- },
2410
- /* @__PURE__ */ React__default.createElement(Icons.borderTop, { className: iconVariants({ size: "sm" }) }),
2411
- /* @__PURE__ */ React__default.createElement("div", null, "Top Border")
2412
- ),
2413
- /* @__PURE__ */ React__default.createElement(
2414
- DropdownMenuCheckboxItem,
2415
- {
2416
- checked: hasLeftBorder,
2417
- onCheckedChange: getOnSelectTableBorder("left")
2418
- },
2419
- /* @__PURE__ */ React__default.createElement(Icons.borderLeft, { className: iconVariants({ size: "sm" }) }),
2420
- /* @__PURE__ */ React__default.createElement("div", null, "Left Border")
2421
- ),
2422
- /* @__PURE__ */ React__default.createElement(
2423
- DropdownMenuCheckboxItem,
2424
- {
2425
- checked: hasRightBorder,
2426
- onCheckedChange: getOnSelectTableBorder("right")
2427
- },
2428
- /* @__PURE__ */ React__default.createElement(Icons.borderRight, { className: iconVariants({ size: "sm" }) }),
2429
- /* @__PURE__ */ React__default.createElement("div", null, "Right Border")
2430
- ),
2431
- /* @__PURE__ */ React__default.createElement(Separator, null),
2432
- /* @__PURE__ */ React__default.createElement(
2433
- DropdownMenuCheckboxItem,
2434
- {
2435
- checked: hasNoBorders,
2436
- onCheckedChange: getOnSelectTableBorder("none")
2437
- },
2438
- /* @__PURE__ */ React__default.createElement(Icons.borderNone, { className: iconVariants({ size: "sm" }) }),
2439
- /* @__PURE__ */ React__default.createElement("div", null, "No Border")
2440
- ),
2441
- /* @__PURE__ */ React__default.createElement(
2442
- DropdownMenuCheckboxItem,
2443
- {
2444
- checked: hasOuterBorders,
2445
- onCheckedChange: getOnSelectTableBorder("outer")
2446
- },
2447
- /* @__PURE__ */ React__default.createElement(Icons.borderAll, { className: iconVariants({ size: "sm" }) }),
2448
- /* @__PURE__ */ React__default.createElement("div", null, "Outside Borders")
2449
- )
2450
- );
2451
- });
2452
- const TableFloatingToolbar = withRef(
2453
- ({ children, ...props }, ref) => {
2454
- const element = useElement();
2455
- const { props: buttonProps } = useRemoveNodeButton({ element });
2456
- const selectionCollapsed = useEditorSelector(
2457
- (editor2) => !isSelectionExpanded(editor2),
2458
- []
2459
- );
2460
- const readOnly = useReadOnly();
2461
- const selected = useSelected();
2462
- const editor = useEditorRef();
2463
- const collapsed = !readOnly && selected && selectionCollapsed;
2464
- const open2 = !readOnly && selected;
2465
- const { canMerge, canUnmerge } = useTableMergeState();
2466
- const mergeContent = canMerge && /* @__PURE__ */ React__default.createElement(
2467
- Button$2,
2468
- {
2469
- contentEditable: false,
2470
- isMenu: true,
2471
- onClick: () => mergeTableCells(editor),
2472
- variant: "ghost"
2473
- },
2474
- /* @__PURE__ */ React__default.createElement(Icons.combine, { className: "mr-2 size-4" }),
2475
- "Merge"
2476
- );
2477
- const unmergeButton = canUnmerge && /* @__PURE__ */ React__default.createElement(
2478
- Button$2,
2479
- {
2480
- contentEditable: false,
2481
- isMenu: true,
2482
- onClick: () => unmergeTableCells(editor),
2483
- variant: "ghost"
2484
- },
2485
- /* @__PURE__ */ React__default.createElement(Icons.ungroup, { className: "mr-2 size-4" }),
2486
- "Unmerge"
2487
- );
2488
- const bordersContent = collapsed && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(DropdownMenu, { modal: false }, /* @__PURE__ */ React__default.createElement(DropdownMenuTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(Button$2, { isMenu: true, variant: "ghost" }, /* @__PURE__ */ React__default.createElement(Icons.borderAll, { className: "mr-2 size-4" }), "Borders")), /* @__PURE__ */ React__default.createElement(DropdownMenuPortal, null, /* @__PURE__ */ React__default.createElement(TableBordersDropdownMenuContent, null))), /* @__PURE__ */ React__default.createElement(Button$2, { contentEditable: false, isMenu: true, variant: "ghost", ...buttonProps }, /* @__PURE__ */ React__default.createElement(Icons.delete, { className: "mr-2 size-4" }), "Delete"));
2489
- return /* @__PURE__ */ React__default.createElement(Popover$2, { modal: false, open: open2 }, /* @__PURE__ */ React__default.createElement(PopoverAnchor, { asChild: true }, children), (canMerge || canUnmerge || collapsed) && /* @__PURE__ */ React__default.createElement(
2490
- PopoverContent$1,
2491
- {
2492
- className: cn$1(
2493
- popoverVariants(),
2494
- "flex w-[220px] flex-col gap-1 p-1"
2495
- ),
2496
- onOpenAutoFocus: (e) => e.preventDefault(),
2497
- ref,
2498
- ...props
2499
- },
2500
- unmergeButton,
2501
- mergeContent,
2502
- bordersContent
2503
- ));
2504
- }
2505
- );
2506
- const TableElement = withHOC(
2507
- TableProvider,
2508
- withRef(({ children, className, ...props }, ref) => {
2509
- const { colSizes, isSelectingCell, marginLeft, minColumnWidth } = useTableElementState();
2510
- const { colGroupProps, props: tableProps } = useTableElement();
2511
- return /* @__PURE__ */ React__default.createElement(TableFloatingToolbar, null, /* @__PURE__ */ React__default.createElement("div", { style: { paddingLeft: marginLeft } }, /* @__PURE__ */ React__default.createElement(
2512
- PlateElement,
2513
- {
2514
- asChild: true,
2515
- className: cn$1(
2516
- "my-4 ml-px mr-0 table h-px w-full table-fixed border-collapse",
2517
- isSelectingCell && "[&_*::selection]:bg-none",
2518
- className
2519
- ),
2520
- ref,
2521
- ...tableProps,
2522
- ...props
2523
- },
2524
- /* @__PURE__ */ React__default.createElement("table", null, /* @__PURE__ */ React__default.createElement("colgroup", { ...colGroupProps }, colSizes.map((width, index) => /* @__PURE__ */ React__default.createElement(
2525
- "col",
2526
- {
2527
- key: index,
2528
- style: {
2529
- minWidth: minColumnWidth,
2530
- width: width || void 0
2531
- }
2532
- }
2533
- ))), /* @__PURE__ */ React__default.createElement("tbody", { className: "min-w-full" }, children))
2534
- )));
2535
- })
2536
- );
2537
- const TableRowElement = withRef(({ children, hideBorder, ...props }, ref) => {
2538
- return /* @__PURE__ */ React__default.createElement(
2539
- PlateElement,
2540
- {
2541
- asChild: true,
2542
- className: cn$1("h-full", hideBorder && "border-none"),
2543
- ref,
2544
- ...props
2545
- },
2546
- /* @__PURE__ */ React__default.createElement("tr", null, children)
2547
- );
2548
- });
2549
2326
  const TableCellElement = withRef(({ children, className, hideBorder, isHeader, style, ...props }, ref) => {
2550
2327
  var _a, _b, _c, _d;
2551
2328
  const { element } = props;
@@ -2657,6 +2434,371 @@ TableCellElement.displayName = "TableCellElement";
2657
2434
  const TableCellHeaderElement = withProps(TableCellElement, {
2658
2435
  isHeader: true
2659
2436
  });
2437
+ const buttonVariants$1 = cva(
2438
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
2439
+ {
2440
+ defaultVariants: {
2441
+ size: "default",
2442
+ variant: "default"
2443
+ },
2444
+ variants: {
2445
+ isMenu: {
2446
+ true: "h-auto w-full cursor-pointer justify-start"
2447
+ },
2448
+ size: {
2449
+ default: "h-10 px-4 py-2",
2450
+ icon: "size-10",
2451
+ lg: "h-11 rounded-md px-8",
2452
+ none: "",
2453
+ sm: "h-9 rounded-md px-3",
2454
+ sms: "size-9 rounded-md px-0",
2455
+ xs: "h-8 rounded-md px-3"
2456
+ },
2457
+ variant: {
2458
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
2459
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
2460
+ ghost: "hover:bg-accent hover:text-accent-foreground",
2461
+ inlineLink: "text-base text-primary underline underline-offset-4",
2462
+ link: "text-primary underline-offset-4 hover:underline",
2463
+ outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
2464
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80"
2465
+ }
2466
+ }
2467
+ }
2468
+ );
2469
+ const Button$2 = withRef(({ asChild = false, className, isMenu, size, variant, ...props }, ref) => {
2470
+ const Comp = asChild ? Slot : "button";
2471
+ return /* @__PURE__ */ React.createElement(
2472
+ Comp,
2473
+ {
2474
+ className: cn$1(buttonVariants$1({ className, isMenu, size, variant })),
2475
+ ref,
2476
+ ...props
2477
+ }
2478
+ );
2479
+ });
2480
+ const DropdownMenu = DropdownMenuPrimitive.Root;
2481
+ const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
2482
+ const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
2483
+ const DropdownMenuSub = DropdownMenuPrimitive.Sub;
2484
+ const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
2485
+ const DropdownMenuSubTrigger = withRef(({ children, className, inset, ...props }, ref) => /* @__PURE__ */ React__default.createElement(
2486
+ DropdownMenuPrimitive.SubTrigger,
2487
+ {
2488
+ className: cn$1(
2489
+ "flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",
2490
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
2491
+ inset && "pl-8",
2492
+ className
2493
+ ),
2494
+ ref,
2495
+ ...props
2496
+ },
2497
+ children,
2498
+ /* @__PURE__ */ React__default.createElement(Icons.chevronRight, { className: "ml-auto size-4" })
2499
+ ));
2500
+ const DropdownMenuSubContent = withCn(
2501
+ DropdownMenuPrimitive.SubContent,
2502
+ "z-[99999] min-w-32 overflow-hidden rounded-md border bg-white p-1 text-black shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2"
2503
+ );
2504
+ const DropdownMenuContentVariants = withProps(DropdownMenuPrimitive.Content, {
2505
+ className: cn$1(
2506
+ "z-[99999] min-w-32 overflow-hidden rounded-md border bg-white p-1 text-black shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2"
2507
+ ),
2508
+ sideOffset: 4
2509
+ });
2510
+ const DropdownMenuContent = withRef(({ ...props }, ref) => /* @__PURE__ */ React__default.createElement(DropdownMenuPrimitive.Portal, null, /* @__PURE__ */ React__default.createElement(DropdownMenuContentVariants, { ref, ...props })));
2511
+ const menuItemVariants = cva(
2512
+ cn$1(
2513
+ "relative flex h-9 cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors",
2514
+ "focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
2515
+ ),
2516
+ {
2517
+ variants: {
2518
+ inset: {
2519
+ true: "pl-8"
2520
+ }
2521
+ }
2522
+ }
2523
+ );
2524
+ const DropdownMenuItem = withVariants(
2525
+ DropdownMenuPrimitive.Item,
2526
+ menuItemVariants,
2527
+ ["inset"]
2528
+ );
2529
+ const DropdownMenuCheckboxItem = withRef(({ children, className, ...props }, ref) => /* @__PURE__ */ React__default.createElement(
2530
+ DropdownMenuPrimitive.CheckboxItem,
2531
+ {
2532
+ className: cn$1(
2533
+ "relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
2534
+ "cursor-pointer",
2535
+ className
2536
+ ),
2537
+ ref,
2538
+ ...props
2539
+ },
2540
+ /* @__PURE__ */ React__default.createElement("span", { className: "absolute left-2 flex size-3.5 items-center justify-center" }, /* @__PURE__ */ React__default.createElement(DropdownMenuPrimitive.ItemIndicator, null, /* @__PURE__ */ React__default.createElement(Icons.check, { className: "size-4" }))),
2541
+ children
2542
+ ));
2543
+ const DropdownMenuRadioItem = withRef(({ children, className, hideIcon, ...props }, ref) => /* @__PURE__ */ React__default.createElement(
2544
+ DropdownMenuPrimitive.RadioItem,
2545
+ {
2546
+ className: cn$1(
2547
+ "relative flex select-none items-center rounded-sm pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
2548
+ "h-9 cursor-pointer px-2 data-[state=checked]:bg-accent data-[state=checked]:text-accent-foreground",
2549
+ className
2550
+ ),
2551
+ ref,
2552
+ ...props
2553
+ },
2554
+ !hideIcon && /* @__PURE__ */ React__default.createElement("span", { className: "absolute right-2 flex size-3.5 items-center justify-center" }, /* @__PURE__ */ React__default.createElement(DropdownMenuPrimitive.ItemIndicator, null, /* @__PURE__ */ React__default.createElement(Icons.check, { className: "size-4" }))),
2555
+ children
2556
+ ));
2557
+ const dropdownMenuLabelVariants = cva(
2558
+ cn$1("select-none px-2 py-1.5 text-sm font-semibold"),
2559
+ {
2560
+ variants: {
2561
+ inset: {
2562
+ true: "pl-8"
2563
+ }
2564
+ }
2565
+ }
2566
+ );
2567
+ const DropdownMenuLabel = withVariants(
2568
+ DropdownMenuPrimitive.Label,
2569
+ dropdownMenuLabelVariants,
2570
+ ["inset"]
2571
+ );
2572
+ const DropdownMenuSeparator = withCn(
2573
+ DropdownMenuPrimitive.Separator,
2574
+ "-mx-1 my-1 h-px bg-muted"
2575
+ );
2576
+ withCn(
2577
+ createPrimitiveElement("span"),
2578
+ "ml-auto text-xs tracking-widest opacity-60"
2579
+ );
2580
+ const useOpenState = () => {
2581
+ const [open2, setOpen] = useState(false);
2582
+ const onOpenChange = useCallback(
2583
+ (_value = !open2) => {
2584
+ setOpen(_value);
2585
+ },
2586
+ [open2]
2587
+ );
2588
+ return {
2589
+ onOpenChange,
2590
+ open: open2
2591
+ };
2592
+ };
2593
+ const Popover$2 = PopoverPrimitive.Root;
2594
+ const popoverVariants = cva(
2595
+ "w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 print:hidden"
2596
+ );
2597
+ const PopoverContent$1 = withRef(
2598
+ ({ align = "center", className, sideOffset = 4, style, ...props }, ref) => /* @__PURE__ */ React.createElement(PopoverPrimitive.Portal, null, /* @__PURE__ */ React.createElement(
2599
+ PopoverPrimitive.Content,
2600
+ {
2601
+ align,
2602
+ className: cn$1(popoverVariants(), className),
2603
+ ref,
2604
+ sideOffset,
2605
+ style: { zIndex: 1e3, ...style },
2606
+ ...props
2607
+ }
2608
+ ))
2609
+ );
2610
+ const separatorVariants = cva("shrink-0 bg-border", {
2611
+ defaultVariants: {
2612
+ orientation: "horizontal"
2613
+ },
2614
+ variants: {
2615
+ orientation: {
2616
+ horizontal: "h-px w-full",
2617
+ vertical: "h-full w-px"
2618
+ }
2619
+ }
2620
+ });
2621
+ const Separator = withVariants(
2622
+ withProps(SeparatorPrimitive.Root, {
2623
+ decorative: true,
2624
+ orientation: "horizontal"
2625
+ }),
2626
+ separatorVariants
2627
+ );
2628
+ const TableBordersDropdownMenuContent = withRef((props, ref) => {
2629
+ const {
2630
+ getOnSelectTableBorder,
2631
+ hasBottomBorder,
2632
+ hasLeftBorder,
2633
+ hasNoBorders,
2634
+ hasOuterBorders,
2635
+ hasRightBorder,
2636
+ hasTopBorder
2637
+ } = useTableBordersDropdownMenuContentState();
2638
+ return /* @__PURE__ */ React__default.createElement(
2639
+ DropdownMenuContent,
2640
+ {
2641
+ align: "start",
2642
+ className: cn$1("min-w-[220px]"),
2643
+ ref,
2644
+ side: "right",
2645
+ sideOffset: 0,
2646
+ ...props
2647
+ },
2648
+ /* @__PURE__ */ React__default.createElement(
2649
+ DropdownMenuCheckboxItem,
2650
+ {
2651
+ checked: hasBottomBorder,
2652
+ onCheckedChange: getOnSelectTableBorder("bottom")
2653
+ },
2654
+ /* @__PURE__ */ React__default.createElement(Icons.borderBottom, { className: iconVariants({ size: "sm" }) }),
2655
+ /* @__PURE__ */ React__default.createElement("div", null, "Bottom Border")
2656
+ ),
2657
+ /* @__PURE__ */ React__default.createElement(
2658
+ DropdownMenuCheckboxItem,
2659
+ {
2660
+ checked: hasTopBorder,
2661
+ onCheckedChange: getOnSelectTableBorder("top")
2662
+ },
2663
+ /* @__PURE__ */ React__default.createElement(Icons.borderTop, { className: iconVariants({ size: "sm" }) }),
2664
+ /* @__PURE__ */ React__default.createElement("div", null, "Top Border")
2665
+ ),
2666
+ /* @__PURE__ */ React__default.createElement(
2667
+ DropdownMenuCheckboxItem,
2668
+ {
2669
+ checked: hasLeftBorder,
2670
+ onCheckedChange: getOnSelectTableBorder("left")
2671
+ },
2672
+ /* @__PURE__ */ React__default.createElement(Icons.borderLeft, { className: iconVariants({ size: "sm" }) }),
2673
+ /* @__PURE__ */ React__default.createElement("div", null, "Left Border")
2674
+ ),
2675
+ /* @__PURE__ */ React__default.createElement(
2676
+ DropdownMenuCheckboxItem,
2677
+ {
2678
+ checked: hasRightBorder,
2679
+ onCheckedChange: getOnSelectTableBorder("right")
2680
+ },
2681
+ /* @__PURE__ */ React__default.createElement(Icons.borderRight, { className: iconVariants({ size: "sm" }) }),
2682
+ /* @__PURE__ */ React__default.createElement("div", null, "Right Border")
2683
+ ),
2684
+ /* @__PURE__ */ React__default.createElement(Separator, null),
2685
+ /* @__PURE__ */ React__default.createElement(
2686
+ DropdownMenuCheckboxItem,
2687
+ {
2688
+ checked: hasNoBorders,
2689
+ onCheckedChange: getOnSelectTableBorder("none")
2690
+ },
2691
+ /* @__PURE__ */ React__default.createElement(Icons.borderNone, { className: iconVariants({ size: "sm" }) }),
2692
+ /* @__PURE__ */ React__default.createElement("div", null, "No Border")
2693
+ ),
2694
+ /* @__PURE__ */ React__default.createElement(
2695
+ DropdownMenuCheckboxItem,
2696
+ {
2697
+ checked: hasOuterBorders,
2698
+ onCheckedChange: getOnSelectTableBorder("outer")
2699
+ },
2700
+ /* @__PURE__ */ React__default.createElement(Icons.borderAll, { className: iconVariants({ size: "sm" }) }),
2701
+ /* @__PURE__ */ React__default.createElement("div", null, "Outside Borders")
2702
+ )
2703
+ );
2704
+ });
2705
+ const TableFloatingToolbar = withRef(
2706
+ ({ children, ...props }, ref) => {
2707
+ const element = useElement();
2708
+ const { props: buttonProps } = useRemoveNodeButton({ element });
2709
+ const selectionCollapsed = useEditorSelector(
2710
+ (editor2) => !isSelectionExpanded(editor2),
2711
+ []
2712
+ );
2713
+ const readOnly = useReadOnly();
2714
+ const selected = useSelected();
2715
+ const editor = useEditorRef();
2716
+ const collapsed = !readOnly && selected && selectionCollapsed;
2717
+ const open2 = !readOnly && selected;
2718
+ const { canMerge, canUnmerge } = useTableMergeState();
2719
+ const mergeContent = canMerge && /* @__PURE__ */ React__default.createElement(
2720
+ Button$2,
2721
+ {
2722
+ contentEditable: false,
2723
+ isMenu: true,
2724
+ onClick: () => mergeTableCells(editor),
2725
+ variant: "ghost"
2726
+ },
2727
+ /* @__PURE__ */ React__default.createElement(Icons.combine, { className: "mr-2 size-4" }),
2728
+ "Merge"
2729
+ );
2730
+ const unmergeButton = canUnmerge && /* @__PURE__ */ React__default.createElement(
2731
+ Button$2,
2732
+ {
2733
+ contentEditable: false,
2734
+ isMenu: true,
2735
+ onClick: () => unmergeTableCells(editor),
2736
+ variant: "ghost"
2737
+ },
2738
+ /* @__PURE__ */ React__default.createElement(Icons.ungroup, { className: "mr-2 size-4" }),
2739
+ "Unmerge"
2740
+ );
2741
+ const bordersContent = collapsed && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(DropdownMenu, { modal: false }, /* @__PURE__ */ React__default.createElement(DropdownMenuTrigger, { asChild: true }, /* @__PURE__ */ React__default.createElement(Button$2, { isMenu: true, variant: "ghost" }, /* @__PURE__ */ React__default.createElement(Icons.borderAll, { className: "mr-2 size-4" }), "Borders")), /* @__PURE__ */ React__default.createElement(DropdownMenuPortal, null, /* @__PURE__ */ React__default.createElement(TableBordersDropdownMenuContent, null))), /* @__PURE__ */ React__default.createElement(Button$2, { contentEditable: false, isMenu: true, variant: "ghost", ...buttonProps }, /* @__PURE__ */ React__default.createElement(Icons.delete, { className: "mr-2 size-4" }), "Delete"));
2742
+ return /* @__PURE__ */ React__default.createElement(Popover$2, { modal: false, open: open2 }, /* @__PURE__ */ React__default.createElement(PopoverAnchor, { asChild: true }, children), (canMerge || canUnmerge || collapsed) && /* @__PURE__ */ React__default.createElement(
2743
+ PopoverContent$1,
2744
+ {
2745
+ className: cn$1(
2746
+ popoverVariants(),
2747
+ "flex w-[220px] flex-col gap-1 p-1"
2748
+ ),
2749
+ onOpenAutoFocus: (e) => e.preventDefault(),
2750
+ ref,
2751
+ ...props
2752
+ },
2753
+ unmergeButton,
2754
+ mergeContent,
2755
+ bordersContent
2756
+ ));
2757
+ }
2758
+ );
2759
+ const TableElement = withHOC(
2760
+ TableProvider,
2761
+ withRef(({ children, className, ...props }, ref) => {
2762
+ const { colSizes, isSelectingCell, marginLeft, minColumnWidth } = useTableElementState();
2763
+ const { colGroupProps, props: tableProps } = useTableElement();
2764
+ return /* @__PURE__ */ React__default.createElement(TableFloatingToolbar, null, /* @__PURE__ */ React__default.createElement("div", { style: { paddingLeft: marginLeft } }, /* @__PURE__ */ React__default.createElement(
2765
+ PlateElement,
2766
+ {
2767
+ asChild: true,
2768
+ className: cn$1(
2769
+ "my-4 ml-px mr-0 table h-px w-full table-fixed border-collapse",
2770
+ isSelectingCell && "[&_*::selection]:bg-none",
2771
+ className
2772
+ ),
2773
+ ref,
2774
+ ...tableProps,
2775
+ ...props
2776
+ },
2777
+ /* @__PURE__ */ React__default.createElement("table", null, /* @__PURE__ */ React__default.createElement("colgroup", { ...colGroupProps }, colSizes.map((width, index) => /* @__PURE__ */ React__default.createElement(
2778
+ "col",
2779
+ {
2780
+ key: index,
2781
+ style: {
2782
+ minWidth: minColumnWidth,
2783
+ width: width || void 0
2784
+ }
2785
+ }
2786
+ ))), /* @__PURE__ */ React__default.createElement("tbody", { className: "min-w-full" }, children))
2787
+ )));
2788
+ })
2789
+ );
2790
+ const TableRowElement = withRef(({ children, hideBorder, ...props }, ref) => {
2791
+ return /* @__PURE__ */ React__default.createElement(
2792
+ PlateElement,
2793
+ {
2794
+ asChild: true,
2795
+ className: cn$1("h-full", hideBorder && "border-none"),
2796
+ ref,
2797
+ ...props
2798
+ },
2799
+ /* @__PURE__ */ React__default.createElement("tr", null, children)
2800
+ );
2801
+ });
2660
2802
  const blockClasses = "mt-0.5";
2661
2803
  const headerClasses = "font-normal";
2662
2804
  const Components = () => {
@@ -2762,6 +2904,7 @@ const Components = () => {
2762
2904
  }
2763
2905
  )
2764
2906
  ),
2907
+ [ELEMENT_MERMAID]: MermaidElement,
2765
2908
  [ELEMENT_BLOCKQUOTE]: BlockquoteElement,
2766
2909
  [ELEMENT_CODE_BLOCK]: CodeBlockElement,
2767
2910
  [ELEMENT_CODE_LINE]: CodeLineElement,
@@ -3256,7 +3399,9 @@ class Form {
3256
3399
  {
3257
3400
  type: "string",
3258
3401
  label: "Caption",
3259
- name: [templateName.replace(/\.props$/, ""), "caption"].join("."),
3402
+ name: [templateName.replace(/\.props$/, ""), "caption"].join(
3403
+ "."
3404
+ ),
3260
3405
  component: "text"
3261
3406
  }
3262
3407
  ]
@@ -3574,7 +3719,7 @@ const Button$1 = ({
3574
3719
  };
3575
3720
  const sizeClasses = {
3576
3721
  small: `text-xs h-8 px-3`,
3577
- medium: `text-sm h-10 px-4`,
3722
+ medium: `text-sm h-10 px-8`,
3578
3723
  custom: ``
3579
3724
  };
3580
3725
  return /* @__PURE__ */ React.createElement(
@@ -5608,10 +5753,11 @@ const ItemDeleteButton = ({ onClick, disabled = false }) => {
5608
5753
  return /* @__PURE__ */ React__default.createElement(
5609
5754
  "button",
5610
5755
  {
5611
- className: `w-8 px-1 py-2.5 flex items-center justify-center hover:bg-gray-50 text-gray-200 hover:text-red-500 ${disabled && "pointer-events-none opacity-30 cursor-not-allowed"}`,
5756
+ type: "button",
5757
+ className: `w-8 px-1 py-2.5 flex items-center justify-center text-gray-200 hover:opacity-100 opacity-30 hover:bg-gray-50 ${disabled && "pointer-events-none opacity-30 cursor-not-allowed"}`,
5612
5758
  onClick
5613
5759
  },
5614
- /* @__PURE__ */ React__default.createElement(TrashIcon, { className: "fill-current transition-colors ease-out duration-100" })
5760
+ /* @__PURE__ */ React__default.createElement(TrashIcon, { className: "h-5 w-auto fill-current text-red-500 transition-colors duration-150 ease-out" })
5615
5761
  );
5616
5762
  };
5617
5763
  const DragHandle = ({ isDragging }) => {
@@ -5689,27 +5835,35 @@ const BlockSelector = ({
5689
5835
  ))))
5690
5836
  ))));
5691
5837
  };
5692
- const Group = wrapFieldWithError(({ tinaForm, field }) => {
5693
- const cms = useCMS$1();
5694
- React.useState(false);
5695
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
5696
- Header,
5697
- {
5698
- onClick: () => {
5699
- const state = tinaForm.finalForm.getState();
5700
- if (state.invalid === true) {
5701
- cms.alerts.error("Cannot navigate away from an invalid form.");
5702
- return;
5838
+ const Group = wrapFieldWithNoHeader(
5839
+ ({ tinaForm, field }) => {
5840
+ const cms = useCMS$1();
5841
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
5842
+ Header,
5843
+ {
5844
+ onClick: () => {
5845
+ const state = tinaForm.finalForm.getState();
5846
+ if (state.invalid === true) {
5847
+ cms.alerts.error("Cannot navigate away from an invalid form.");
5848
+ return;
5849
+ }
5850
+ cms.dispatch({
5851
+ type: "forms:set-active-field-name",
5852
+ value: { formId: tinaForm.id, fieldName: field.name }
5853
+ });
5703
5854
  }
5704
- cms.dispatch({
5705
- type: "forms:set-active-field-name",
5706
- value: { formId: tinaForm.id, fieldName: field.name }
5707
- });
5708
- }
5709
- },
5710
- field.label || field.name
5711
- ));
5712
- });
5855
+ },
5856
+ field.label || field.name,
5857
+ field.description && /* @__PURE__ */ React.createElement(
5858
+ "span",
5859
+ {
5860
+ className: `block font-sans text-xs italic font-light text-gray-400 pt-0.5 whitespace-normal m-0`,
5861
+ dangerouslySetInnerHTML: { __html: field.description }
5862
+ }
5863
+ )
5864
+ ));
5865
+ }
5866
+ );
5713
5867
  const Header = ({ onClick, children }) => {
5714
5868
  return /* @__PURE__ */ React.createElement("div", { className: "pt-1 mb-5" }, /* @__PURE__ */ React.createElement(
5715
5869
  "button",
@@ -10206,7 +10360,7 @@ const SyncStatus = ({ cms, setEventsOpen }) => {
10206
10360
  "Event Log"
10207
10361
  ));
10208
10362
  };
10209
- const version = "2.2.9";
10363
+ const version = "2.4.0";
10210
10364
  const Nav = ({
10211
10365
  isLocalMode,
10212
10366
  className = "",
@@ -12737,15 +12891,14 @@ const FormBuilder = ({
12737
12891
  fields: fieldGroup.fields
12738
12892
  }
12739
12893
  ) : /* @__PURE__ */ React.createElement(NoFieldsPlaceholder, null)
12740
- )), !hideFooter && /* @__PURE__ */ React.createElement("div", { className: "relative flex-none w-full h-16 px-6 bg-white border-t border-gray-100 flex items-center justify-center" }, /* @__PURE__ */ React.createElement("div", { className: "flex-1 w-full flex justify-between gap-4 items-center max-w-form" }, tinaForm.reset && /* @__PURE__ */ React.createElement(
12894
+ )), !hideFooter && /* @__PURE__ */ React.createElement("div", { className: "relative flex-none w-full h-16 px-12 bg-white border-t border-gray-100 flex items-center justify-end" }, /* @__PURE__ */ React.createElement("div", { className: "flex-1 w-full justify-end gap-2 flex items-center max-w-form" }, tinaForm.reset && /* @__PURE__ */ React.createElement(
12741
12895
  ResetForm,
12742
12896
  {
12743
12897
  pristine,
12744
12898
  reset: async () => {
12745
12899
  finalForm.reset();
12746
12900
  await tinaForm.reset();
12747
- },
12748
- style: { flexGrow: 1 }
12901
+ }
12749
12902
  },
12750
12903
  tinaForm.buttons.reset
12751
12904
  ), /* @__PURE__ */ React.createElement(
@@ -12754,8 +12907,7 @@ const FormBuilder = ({
12754
12907
  onClick: safeHandleSubmit,
12755
12908
  disabled: !canSubmit,
12756
12909
  busy: submitting,
12757
- variant: "primary",
12758
- style: { flexGrow: 3 }
12910
+ variant: "primary"
12759
12911
  },
12760
12912
  submitting && /* @__PURE__ */ React.createElement(LoadingDots, null),
12761
12913
  !submitting && tinaForm.buttons.save
@@ -13725,6 +13877,7 @@ const unsupportedItemsInTable = /* @__PURE__ */ new Set([
13725
13877
  "Unordered List",
13726
13878
  "Ordered List",
13727
13879
  "Quote",
13880
+ "Mermaid",
13728
13881
  "Heading 1",
13729
13882
  "Heading 2",
13730
13883
  "Heading 3",
@@ -13924,7 +14077,7 @@ const TooltipContent = withCn(
13924
14077
  withProps(TooltipPrimitive.Content, {
13925
14078
  sideOffset: 4
13926
14079
  }),
13927
- "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md"
14080
+ "z-[9999] overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md"
13928
14081
  );
13929
14082
  function withTooltip(Component2) {
13930
14083
  return React__default.forwardRef(function ExtendComponent({ tooltip, tooltipContentProps, tooltipProps, ...props }, ref) {
@@ -14050,30 +14203,42 @@ const FixedToolbar = withCn(
14050
14203
  Toolbar,
14051
14204
  "p-1 sticky left-0 top-0 z-50 w-full justify-between overflow-x-auto border border-border bg-background"
14052
14205
  );
14053
- const MarkToolbarButton = withRef(({ clear, nodeType, ...rest }, ref) => {
14054
- const state = useMarkToolbarButtonState({ clear, nodeType });
14055
- const { props } = useMarkToolbarButton(state);
14056
- return /* @__PURE__ */ React__default.createElement(ToolbarButton, { ref, ...props, ...rest });
14057
- });
14058
- const IndentListToolbarButton = withRef(({ nodeType = ELEMENT_UL }, ref) => {
14059
- const editor = useEditorState();
14060
- const state = useListToolbarButtonState({ nodeType });
14061
- const { props } = useListToolbarButton(state);
14062
- return /* @__PURE__ */ React__default.createElement(
14063
- ToolbarButton,
14064
- {
14065
- ref,
14066
- tooltip: nodeType === ELEMENT_UL ? "Bulleted List" : "Numbered List",
14067
- ...props,
14068
- onClick: (e) => {
14069
- e.preventDefault();
14070
- e.stopPropagation();
14071
- toggleList(editor, { type: nodeType });
14206
+ const useResize = (ref, callback) => {
14207
+ React__default.useEffect(() => {
14208
+ const resizeObserver = new ResizeObserver((entries) => {
14209
+ for (const entry of entries) {
14210
+ callback(entry);
14072
14211
  }
14073
- },
14074
- nodeType === ELEMENT_UL ? /* @__PURE__ */ React__default.createElement(Icons.ul, null) : /* @__PURE__ */ React__default.createElement(Icons.ol, null)
14075
- );
14076
- });
14212
+ });
14213
+ if (ref.current) {
14214
+ resizeObserver.observe(ref.current);
14215
+ }
14216
+ return () => resizeObserver.disconnect();
14217
+ }, [ref.current]);
14218
+ };
14219
+ const STANDARD_ICON_WIDTH = 32;
14220
+ const HEADING_ICON_WITH_TEXT = 127;
14221
+ const HEADING_ICON_ONLY = 58;
14222
+ const EMBED_ICON_WIDTH = 78;
14223
+ const CONTAINER_MD_BREAKPOINT = 448;
14224
+ const FLOAT_BUTTON_WIDTH = 25;
14225
+ const HEADING_LABEL = "Headings";
14226
+ const ToolbarContext = createContext(void 0);
14227
+ const ToolbarProvider = ({
14228
+ tinaForm,
14229
+ templates,
14230
+ overrides,
14231
+ children
14232
+ }) => {
14233
+ return /* @__PURE__ */ React__default.createElement(ToolbarContext.Provider, { value: { tinaForm, templates, overrides } }, children);
14234
+ };
14235
+ const useToolbarContext = () => {
14236
+ const context = useContext(ToolbarContext);
14237
+ if (!context) {
14238
+ throw new Error("useToolbarContext must be used within a ToolbarProvider");
14239
+ }
14240
+ return context;
14241
+ };
14077
14242
  const items$1 = [
14078
14243
  {
14079
14244
  description: "Paragraph",
@@ -14152,7 +14317,7 @@ function HeadingsMenu(props) {
14152
14317
  tooltip: "Headings"
14153
14318
  },
14154
14319
  /* @__PURE__ */ React__default.createElement(SelectedItemIcon, { className: "size-5" }),
14155
- /* @__PURE__ */ React__default.createElement("span", { className: "hidden 2xl:flex" }, selectedItemLabel)
14320
+ /* @__PURE__ */ React__default.createElement("span", { className: "@md/toolbar:flex hidden" }, selectedItemLabel)
14156
14321
  )), /* @__PURE__ */ React__default.createElement(DropdownMenuContent, { align: "start", className: "min-w-0" }, /* @__PURE__ */ React__default.createElement(
14157
14322
  DropdownMenuRadioGroup,
14158
14323
  {
@@ -14181,42 +14346,6 @@ function HeadingsMenu(props) {
14181
14346
  ))
14182
14347
  )));
14183
14348
  }
14184
- const LinkToolbarButton = withRef((rest, ref) => {
14185
- const state = useLinkToolbarButtonState();
14186
- const { props } = useLinkToolbarButton(state);
14187
- return /* @__PURE__ */ React__default.createElement(ToolbarButton, { ref, tooltip: "Link", ...props, ...rest }, /* @__PURE__ */ React__default.createElement(Icons.link, null));
14188
- });
14189
- const useBlockQuoteToolbarButtonState = () => {
14190
- const editor = useEditorState();
14191
- const isBlockActive = () => helpers.isNodeActive(editor, ELEMENT_BLOCKQUOTE$1);
14192
- return {
14193
- pressed: isBlockActive()
14194
- };
14195
- };
14196
- const useBlockQuoteToolbarButton = (state) => {
14197
- const editor = useEditorState();
14198
- const onClick = () => {
14199
- toggleNodeType(editor, {
14200
- activeType: ELEMENT_BLOCKQUOTE$1
14201
- });
14202
- };
14203
- const onMouseDown = (e) => {
14204
- e.preventDefault();
14205
- e.stopPropagation();
14206
- };
14207
- return {
14208
- props: {
14209
- onClick,
14210
- onMouseDown,
14211
- pressed: state.pressed
14212
- }
14213
- };
14214
- };
14215
- const QuoteToolbarButton = withRef(({ clear, ...rest }, ref) => {
14216
- const state = useBlockQuoteToolbarButtonState();
14217
- const { props } = useBlockQuoteToolbarButton(state);
14218
- return /* @__PURE__ */ React__default.createElement(ToolbarButton, { ref, tooltip: "Link", ...rest, ...props }, /* @__PURE__ */ React__default.createElement(Icons.quote, null));
14219
- });
14220
14349
  const useCodeBlockToolbarButtonState = () => {
14221
14350
  const editor = useEditorState();
14222
14351
  const isBlockActive = () => helpers.isNodeActive(editor, ELEMENT_CODE_BLOCK$1);
@@ -14278,100 +14407,67 @@ const ImageToolbarButton = withRef(({ clear, ...rest }, ref) => {
14278
14407
  const { props } = useImageToolbarButton(state);
14279
14408
  return /* @__PURE__ */ React__default.createElement(ToolbarButton, { ref, tooltip: "Link", ...rest, ...props }, /* @__PURE__ */ React__default.createElement(Icons.image, null));
14280
14409
  });
14281
- const useRawMarkdownToolbarButton = () => {
14282
- const { setRawMode } = useEditorContext();
14410
+ const IndentListToolbarButton = withRef(({ nodeType = ELEMENT_UL }, ref) => {
14411
+ const editor = useEditorState();
14412
+ const state = useListToolbarButtonState({ nodeType });
14413
+ const { props } = useListToolbarButton(state);
14414
+ return /* @__PURE__ */ React__default.createElement(
14415
+ ToolbarButton,
14416
+ {
14417
+ ref,
14418
+ tooltip: nodeType === ELEMENT_UL ? "Bulleted List" : "Numbered List",
14419
+ ...props,
14420
+ onClick: (e) => {
14421
+ e.preventDefault();
14422
+ e.stopPropagation();
14423
+ toggleList(editor, { type: nodeType });
14424
+ }
14425
+ },
14426
+ nodeType === ELEMENT_UL ? /* @__PURE__ */ React__default.createElement(Icons.ul, null) : /* @__PURE__ */ React__default.createElement(Icons.ol, null)
14427
+ );
14428
+ });
14429
+ const LinkToolbarButton = withRef((rest, ref) => {
14430
+ const state = useLinkToolbarButtonState();
14431
+ const { props } = useLinkToolbarButton(state);
14432
+ return /* @__PURE__ */ React__default.createElement(ToolbarButton, { ref, tooltip: "Link", ...props, ...rest }, /* @__PURE__ */ React__default.createElement(Icons.link, null));
14433
+ });
14434
+ const MarkToolbarButton = withRef(({ clear, nodeType, ...rest }, ref) => {
14435
+ const state = useMarkToolbarButtonState({ clear, nodeType });
14436
+ const { props } = useMarkToolbarButton(state);
14437
+ return /* @__PURE__ */ React__default.createElement(ToolbarButton, { ref, ...props, ...rest });
14438
+ });
14439
+ const useMermaidToolbarButtonState = () => {
14440
+ const editor = useEditorState();
14441
+ const isBlockActive = () => helpers.isNodeActive(editor, ELEMENT_MERMAID);
14442
+ return {
14443
+ pressed: isBlockActive()
14444
+ };
14445
+ };
14446
+ const useMermaidToolbarButton = (state) => {
14447
+ const editor = useEditorState();
14448
+ const onClick = () => {
14449
+ insertEmptyElement(editor, ELEMENT_MERMAID, {
14450
+ nextBlock: true,
14451
+ select: true
14452
+ });
14453
+ };
14283
14454
  const onMouseDown = (e) => {
14284
- setRawMode(true);
14455
+ e.preventDefault();
14456
+ e.stopPropagation();
14285
14457
  };
14286
14458
  return {
14287
14459
  props: {
14460
+ onClick,
14288
14461
  onMouseDown,
14289
- pressed: false
14462
+ pressed: state.pressed
14290
14463
  }
14291
14464
  };
14292
14465
  };
14293
- const RawMarkdownToolbarButton = withRef(({ clear, ...rest }, ref) => {
14294
- const { props } = useRawMarkdownToolbarButton();
14295
- return /* @__PURE__ */ React__default.createElement(ToolbarButton, { ref, tooltip: "Link", ...rest, ...props }, /* @__PURE__ */ React__default.createElement(Icons.raw, null));
14466
+ const MermaidToolbarButton = withRef(({ clear, ...rest }, ref) => {
14467
+ const state = useMermaidToolbarButtonState();
14468
+ const { props } = useMermaidToolbarButton(state);
14469
+ return /* @__PURE__ */ React__default.createElement(ToolbarButton, { ref, tooltip: "Mermaid", ...rest, ...props }, /* @__PURE__ */ React__default.createElement(Icons.mermaid, null));
14296
14470
  });
14297
- const ToolbarContext = createContext(void 0);
14298
- const ToolbarProvider = ({
14299
- tinaForm,
14300
- templates,
14301
- overrides,
14302
- children
14303
- }) => {
14304
- return /* @__PURE__ */ React__default.createElement(ToolbarContext.Provider, { value: { tinaForm, templates, overrides } }, children);
14305
- };
14306
- const useToolbarContext = () => {
14307
- const context = useContext(ToolbarContext);
14308
- if (!context) {
14309
- throw new Error("useToolbarContext must be used within a ToolbarProvider");
14310
- }
14311
- return context;
14312
- };
14313
- function TemplatesToolbarButton() {
14314
- const { templates } = useToolbarContext();
14315
- const showEmbed = templates.length > 0;
14316
- const editor = useEditorState();
14317
- if (!showEmbed) {
14318
- return null;
14319
- }
14320
- return /* @__PURE__ */ React__default.createElement(EmbedButton, { templates, editor });
14321
- }
14322
- const EmbedButton = ({ editor, templates }) => {
14323
- const [open2, setOpen] = useState(false);
14324
- const [filteredTemplates, setFilteredTemplates] = useState(templates);
14325
- const filterChange = (e) => {
14326
- const filterText = e.target.value.toLowerCase();
14327
- setFilteredTemplates(
14328
- templates.filter(
14329
- (template) => template.name.toLowerCase().includes(filterText)
14330
- )
14331
- );
14332
- };
14333
- return /* @__PURE__ */ React__default.createElement(DropdownMenu, { open: open2, onOpenChange: setOpen }, /* @__PURE__ */ React__default.createElement(DropdownMenuTrigger, { className: "inline-flex items-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg:not([data-icon])]:size-5 h-9 px-2 bg-transparent hover:bg-muted hover:text-muted-foreground aria-checked:bg-accent aria-checked:text-accent-foreground my-1 justify-between pr-1" }, /* @__PURE__ */ React__default.createElement("span", { className: "flex" }, "Embed"), /* @__PURE__ */ React__default.createElement(
14334
- PlusIcon,
14335
- {
14336
- className: `origin-center transition-all ease-out duration-150 ${open2 ? "rotate-45" : ""}`
14337
- }
14338
- )), /* @__PURE__ */ React__default.createElement(DropdownMenuContent, { className: "max-h-48 overflow-y-auto" }, templates.length > 10 && /* @__PURE__ */ React__default.createElement(
14339
- "input",
14340
- {
14341
- type: "text",
14342
- placeholder: "Filter templates...",
14343
- className: "w-full p-2 border border-gray-300 rounded-md",
14344
- onChange: filterChange
14345
- }
14346
- ), /* @__PURE__ */ React__default.createElement(DropdownMenuSeparator, null), filteredTemplates.map((template) => /* @__PURE__ */ React__default.createElement(
14347
- DropdownMenuItem,
14348
- {
14349
- key: template.name,
14350
- onMouseDown: (e) => {
14351
- e.preventDefault();
14352
- close();
14353
- insertMDX(editor, template);
14354
- },
14355
- className: ""
14356
- },
14357
- template.label || template.name
14358
- ))));
14359
- };
14360
- const ICON_WIDTH = 32;
14361
- const EMBED_ICON_WIDTH = 78;
14362
- const useResize = (ref, callback) => {
14363
- React__default.useEffect(() => {
14364
- const resizeObserver = new ResizeObserver((entries) => {
14365
- for (const entry of entries) {
14366
- callback(entry);
14367
- }
14368
- });
14369
- if (ref.current) {
14370
- resizeObserver.observe(ref.current);
14371
- }
14372
- return () => resizeObserver.disconnect();
14373
- }, [ref.current]);
14374
- };
14375
14471
  function OverflowMenu({
14376
14472
  children,
14377
14473
  ...props
@@ -14381,6 +14477,7 @@ function OverflowMenu({
14381
14477
  ToolbarButton,
14382
14478
  {
14383
14479
  showArrow: false,
14480
+ "data-testid": "rich-text-editor-overflow-menu-button",
14384
14481
  className: "lg:min-w-[130px]",
14385
14482
  isDropdown: true,
14386
14483
  pressed: openState.open,
@@ -14389,6 +14486,63 @@ function OverflowMenu({
14389
14486
  /* @__PURE__ */ React__default.createElement(Icons.overflow, { className: "size-5" })
14390
14487
  )), /* @__PURE__ */ React__default.createElement(DropdownMenuContent, { align: "start", className: "min-w-0 flex flex-grow" }, children));
14391
14488
  }
14489
+ const useBlockQuoteToolbarButtonState = () => {
14490
+ const editor = useEditorState();
14491
+ const isBlockActive = () => helpers.isNodeActive(editor, ELEMENT_BLOCKQUOTE$1);
14492
+ return {
14493
+ pressed: isBlockActive()
14494
+ };
14495
+ };
14496
+ const useBlockQuoteToolbarButton = (state) => {
14497
+ const editor = useEditorState();
14498
+ const onClick = () => {
14499
+ toggleNodeType(editor, {
14500
+ activeType: ELEMENT_BLOCKQUOTE$1
14501
+ });
14502
+ };
14503
+ const onMouseDown = (e) => {
14504
+ e.preventDefault();
14505
+ e.stopPropagation();
14506
+ };
14507
+ return {
14508
+ props: {
14509
+ onClick,
14510
+ onMouseDown,
14511
+ pressed: state.pressed
14512
+ }
14513
+ };
14514
+ };
14515
+ const QuoteToolbarButton = withRef(({ clear, ...rest }, ref) => {
14516
+ const state = useBlockQuoteToolbarButtonState();
14517
+ const { props } = useBlockQuoteToolbarButton(state);
14518
+ return /* @__PURE__ */ React__default.createElement(ToolbarButton, { ref, tooltip: "Link", ...rest, ...props }, /* @__PURE__ */ React__default.createElement(Icons.quote, null));
14519
+ });
14520
+ const useRawMarkdownToolbarButton = () => {
14521
+ const { setRawMode } = useEditorContext();
14522
+ const onMouseDown = (e) => {
14523
+ setRawMode(true);
14524
+ };
14525
+ return {
14526
+ props: {
14527
+ onMouseDown,
14528
+ pressed: false
14529
+ }
14530
+ };
14531
+ };
14532
+ const RawMarkdownToolbarButton = withRef(({ clear, ...rest }, ref) => {
14533
+ const { props } = useRawMarkdownToolbarButton();
14534
+ return /* @__PURE__ */ React__default.createElement(
14535
+ ToolbarButton,
14536
+ {
14537
+ ref,
14538
+ tooltip: "Link",
14539
+ ...rest,
14540
+ ...props,
14541
+ "data-testid": "markdown-button"
14542
+ },
14543
+ /* @__PURE__ */ React__default.createElement(Icons.raw, null)
14544
+ );
14545
+ });
14392
14546
  function TableDropdownMenu(props) {
14393
14547
  const tableSelected = useEditorSelector(
14394
14548
  (editor2) => someNode(editor2, { match: { type: ELEMENT_TABLE$1 } }),
@@ -14491,78 +14645,156 @@ function TableDropdownMenu(props) {
14491
14645
  )))
14492
14646
  ));
14493
14647
  }
14648
+ function TemplatesToolbarButton() {
14649
+ const { templates } = useToolbarContext();
14650
+ const editor = useEditorState();
14651
+ return /* @__PURE__ */ React__default.createElement(EmbedButton, { templates, editor });
14652
+ }
14653
+ const EmbedButton = ({ editor, templates }) => {
14654
+ const [open2, setOpen] = useState(false);
14655
+ const [filteredTemplates, setFilteredTemplates] = useState(templates);
14656
+ const filterChange = (e) => {
14657
+ const filterText = e.target.value.toLowerCase();
14658
+ setFilteredTemplates(
14659
+ templates.filter(
14660
+ (template) => template.name.toLowerCase().includes(filterText)
14661
+ )
14662
+ );
14663
+ };
14664
+ return /* @__PURE__ */ React__default.createElement(DropdownMenu, { open: open2, onOpenChange: setOpen }, /* @__PURE__ */ React__default.createElement(DropdownMenuTrigger, { className: "inline-flex items-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg:not([data-icon])]:size-5 h-9 px-2 bg-transparent hover:bg-muted hover:text-muted-foreground aria-checked:bg-accent aria-checked:text-accent-foreground my-1 justify-between pr-1" }, /* @__PURE__ */ React__default.createElement("span", { className: "flex" }, "Embed"), /* @__PURE__ */ React__default.createElement(
14665
+ PlusIcon,
14666
+ {
14667
+ className: `origin-center transition-all ease-out duration-150 ${open2 ? "rotate-45" : ""}`
14668
+ }
14669
+ )), /* @__PURE__ */ React__default.createElement(DropdownMenuContent, { className: "max-h-48 overflow-y-auto" }, templates.length > 10 && /* @__PURE__ */ React__default.createElement(
14670
+ "input",
14671
+ {
14672
+ type: "text",
14673
+ placeholder: "Filter templates...",
14674
+ className: "w-full p-2 border border-gray-300 rounded-md",
14675
+ onChange: filterChange
14676
+ }
14677
+ ), /* @__PURE__ */ React__default.createElement(DropdownMenuSeparator, null), filteredTemplates.map((template) => /* @__PURE__ */ React__default.createElement(
14678
+ DropdownMenuItem,
14679
+ {
14680
+ key: template.name,
14681
+ onMouseDown: (e) => {
14682
+ e.preventDefault();
14683
+ close();
14684
+ insertMDX(editor, template);
14685
+ },
14686
+ className: ""
14687
+ },
14688
+ template.label || template.name
14689
+ ))));
14690
+ };
14494
14691
  const toolbarItems = {
14495
14692
  heading: {
14496
- label: "Headings",
14693
+ label: HEADING_LABEL,
14694
+ width: (paragraphIconExists) => paragraphIconExists ? HEADING_ICON_WITH_TEXT : HEADING_ICON_ONLY,
14695
+ // Dynamically handle width based on paragraph icon
14497
14696
  Component: /* @__PURE__ */ React__default.createElement(ToolbarGroup, { noSeparator: true }, /* @__PURE__ */ React__default.createElement(HeadingsMenu, null))
14498
14697
  },
14499
14698
  link: {
14500
14699
  label: "Link",
14700
+ width: () => STANDARD_ICON_WIDTH,
14501
14701
  Component: /* @__PURE__ */ React__default.createElement(LinkToolbarButton, null)
14502
14702
  },
14503
14703
  image: {
14504
14704
  label: "Image",
14705
+ width: () => STANDARD_ICON_WIDTH,
14505
14706
  Component: /* @__PURE__ */ React__default.createElement(ImageToolbarButton, null)
14506
14707
  },
14507
14708
  quote: {
14508
14709
  label: "Quote",
14710
+ width: () => STANDARD_ICON_WIDTH,
14509
14711
  Component: /* @__PURE__ */ React__default.createElement(QuoteToolbarButton, { tooltip: "Quote Quote (⌘+⇧+.)" })
14510
14712
  },
14511
14713
  ul: {
14512
14714
  label: "Unordered List",
14715
+ width: () => STANDARD_ICON_WIDTH,
14513
14716
  Component: /* @__PURE__ */ React__default.createElement(IndentListToolbarButton, { nodeType: ELEMENT_UL })
14514
14717
  },
14515
14718
  ol: {
14516
14719
  label: "Ordered List",
14720
+ width: () => STANDARD_ICON_WIDTH,
14517
14721
  Component: /* @__PURE__ */ React__default.createElement(IndentListToolbarButton, { nodeType: ELEMENT_OL })
14518
14722
  },
14519
14723
  bold: {
14520
14724
  label: "Bold",
14725
+ width: () => STANDARD_ICON_WIDTH,
14521
14726
  Component: /* @__PURE__ */ React__default.createElement(MarkToolbarButton, { tooltip: "Bold (⌘+B)", nodeType: MARK_BOLD }, /* @__PURE__ */ React__default.createElement(Icons.bold, null))
14522
14727
  },
14523
14728
  italic: {
14524
14729
  label: "Italic",
14730
+ width: () => STANDARD_ICON_WIDTH,
14525
14731
  Component: /* @__PURE__ */ React__default.createElement(MarkToolbarButton, { tooltip: "Italic (⌘+I)", nodeType: MARK_ITALIC }, /* @__PURE__ */ React__default.createElement(Icons.italic, null))
14526
14732
  },
14527
14733
  code: {
14528
14734
  label: "Code",
14735
+ width: () => STANDARD_ICON_WIDTH,
14529
14736
  Component: /* @__PURE__ */ React__default.createElement(MarkToolbarButton, { tooltip: "Code (⌘+E)", nodeType: MARK_CODE }, /* @__PURE__ */ React__default.createElement(Icons.code, null))
14530
14737
  },
14531
14738
  codeBlock: {
14532
14739
  label: "Code Block",
14740
+ width: () => STANDARD_ICON_WIDTH,
14533
14741
  Component: /* @__PURE__ */ React__default.createElement(CodeBlockToolbarButton, null)
14534
14742
  },
14743
+ mermaid: {
14744
+ label: "Mermaid",
14745
+ width: () => STANDARD_ICON_WIDTH,
14746
+ Component: /* @__PURE__ */ React__default.createElement(MermaidToolbarButton, null)
14747
+ },
14535
14748
  table: {
14536
14749
  label: "Table",
14750
+ width: () => STANDARD_ICON_WIDTH,
14537
14751
  Component: /* @__PURE__ */ React__default.createElement(TableDropdownMenu, null)
14538
14752
  },
14539
14753
  raw: {
14540
14754
  label: "Raw Markdown",
14755
+ width: () => STANDARD_ICON_WIDTH,
14541
14756
  Component: /* @__PURE__ */ React__default.createElement(RawMarkdownToolbarButton, null)
14542
14757
  },
14543
14758
  embed: {
14544
14759
  label: "Templates",
14760
+ width: () => EMBED_ICON_WIDTH,
14545
14761
  Component: /* @__PURE__ */ React__default.createElement(TemplatesToolbarButton, null)
14546
14762
  }
14547
14763
  };
14548
14764
  function FixedToolbarButtons() {
14549
14765
  const toolbarRef = React__default.useRef(null);
14550
14766
  const [itemsShown, setItemsShown] = React__default.useState(11);
14551
- const { overrides } = useToolbarContext();
14552
- useResize(toolbarRef, (entry) => {
14553
- const width = entry.target.getBoundingClientRect().width;
14554
- const itemsShown2 = (width - EMBED_ICON_WIDTH) / ICON_WIDTH;
14555
- setItemsShown(Math.floor(itemsShown2));
14556
- });
14557
- let toolbarItemsArray = overrides === void 0 ? Object.values(toolbarItems) : overrides.map((item) => toolbarItems[item]).filter((item) => item !== void 0);
14767
+ const { overrides, templates } = useToolbarContext();
14768
+ const showEmbedButton = templates.length > 0;
14769
+ let items2 = overrides === void 0 ? Object.values(toolbarItems) : overrides.map((item) => toolbarItems[item]).filter((item) => item !== void 0);
14770
+ if (!showEmbedButton) {
14771
+ items2 = items2.filter((item) => item.label !== toolbarItems.embed.label);
14772
+ }
14558
14773
  const editorState = useEditorState();
14559
- const userInTable = helpers.isNodeActive(editorState, ELEMENT_TABLE$1);
14774
+ const userInTable = helpers.isNodeActive(editorState, ELEMENT_TABLE);
14560
14775
  if (userInTable) {
14561
- toolbarItemsArray = toolbarItemsArray.filter(
14562
- (item) => !unsupportedItemsInTable.has(item.label)
14563
- );
14776
+ items2 = items2.filter((item) => !unsupportedItemsInTable.has(item.label));
14564
14777
  }
14565
- return /* @__PURE__ */ React__default.createElement("div", { className: "w-full overflow-hidden", ref: toolbarRef }, /* @__PURE__ */ React__default.createElement(
14778
+ useResize(toolbarRef, (entry) => {
14779
+ const width = entry.target.getBoundingClientRect().width;
14780
+ const headingButton = items2.find((item) => item.label === HEADING_LABEL);
14781
+ const headingWidth = headingButton ? headingButton.width(width > CONTAINER_MD_BREAKPOINT) : 0;
14782
+ const availableWidth = width - headingWidth - FLOAT_BUTTON_WIDTH;
14783
+ const { itemFitCount } = items2.reduce(
14784
+ (acc, item) => {
14785
+ if (item.label !== HEADING_LABEL && acc.totalItemsWidth + item.width() <= availableWidth) {
14786
+ return {
14787
+ totalItemsWidth: acc.totalItemsWidth + item.width(),
14788
+ itemFitCount: acc.itemFitCount + 1
14789
+ };
14790
+ }
14791
+ return acc;
14792
+ },
14793
+ { totalItemsWidth: 0, itemFitCount: 1 }
14794
+ );
14795
+ setItemsShown(itemFitCount);
14796
+ });
14797
+ return /* @__PURE__ */ React__default.createElement("div", { className: "w-full overflow-hidden @container/toolbar", ref: toolbarRef }, /* @__PURE__ */ React__default.createElement(
14566
14798
  "div",
14567
14799
  {
14568
14800
  className: "flex",
@@ -14570,7 +14802,7 @@ function FixedToolbarButtons() {
14570
14802
  transform: "translateX(calc(-1px))"
14571
14803
  }
14572
14804
  },
14573
- /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, toolbarItemsArray.slice(0, itemsShown).map((item, _) => /* @__PURE__ */ React__default.createElement(React__default.Fragment, { key: item.label }, item.Component)), toolbarItemsArray.length > itemsShown && /* @__PURE__ */ React__default.createElement(OverflowMenu, null, toolbarItemsArray.slice(itemsShown).flatMap((c) => /* @__PURE__ */ React__default.createElement(React__default.Fragment, { key: c.label }, c.Component))))
14805
+ /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, items2.slice(0, itemsShown).map((item) => /* @__PURE__ */ React__default.createElement(React__default.Fragment, { key: item.label }, item.Component)), items2.length > itemsShown && /* @__PURE__ */ React__default.createElement(OverflowMenu, null, items2.slice(itemsShown).flatMap((c) => /* @__PURE__ */ React__default.createElement(React__default.Fragment, { key: c.label }, c.Component))))
14574
14806
  ));
14575
14807
  }
14576
14808
  const FloatingToolbar = withRef(({ children, state, ...props }, componentRef) => {
@@ -14900,6 +15132,7 @@ const RichEditor = (props) => {
14900
15132
  createMdxBlockPlugin(),
14901
15133
  createMdxInlinePlugin(),
14902
15134
  createImgPlugin(),
15135
+ createMermaidPlugin(),
14903
15136
  createInvalidMarkdownPlugin(),
14904
15137
  createLinkPlugin({
14905
15138
  options: {
@@ -29907,6 +30140,7 @@ class TinaAdminApi {
29907
30140
  relativePath
29908
30141
  filename
29909
30142
  extension
30143
+ hasReferences
29910
30144
  }
29911
30145
  }
29912
30146
  }
@@ -29998,6 +30232,9 @@ class TinaAdminApi {
29998
30232
  document(collection:$collection, relativePath:$relativePath) {
29999
30233
  ... on Document {
30000
30234
  _values
30235
+ _sys {
30236
+ hasReferences
30237
+ }
30001
30238
  }
30002
30239
  }
30003
30240
  }`;
@@ -31724,6 +31961,23 @@ const CollectionListPage = () => {
31724
31961
  DeleteModal,
31725
31962
  {
31726
31963
  filename: vars.relativePath,
31964
+ checkRefsFunc: async () => {
31965
+ var _a2, _b2;
31966
+ try {
31967
+ const doc = await admin.fetchDocument(
31968
+ collection.name,
31969
+ vars.relativePath,
31970
+ true
31971
+ );
31972
+ return (_b2 = (_a2 = doc == null ? void 0 : doc.document) == null ? void 0 : _a2._sys) == null ? void 0 : _b2.hasReferences;
31973
+ } catch (error) {
31974
+ cms.alerts.error(
31975
+ "Document was not found, ask a developer for help or check the console for an error message"
31976
+ );
31977
+ console.error(error);
31978
+ throw error;
31979
+ }
31980
+ },
31727
31981
  deleteFunc: async () => {
31728
31982
  try {
31729
31983
  await admin.deleteDocument(vars);
@@ -31732,6 +31986,12 @@ const CollectionListPage = () => {
31732
31986
  );
31733
31987
  reFetchCollection();
31734
31988
  } catch (error) {
31989
+ if (error.message.indexOf("has references")) {
31990
+ cms.alerts.error(
31991
+ error.message.split("\n ").filter(Boolean)[1]
31992
+ );
31993
+ return;
31994
+ }
31735
31995
  cms.alerts.warn(
31736
31996
  "Document was not deleted, ask a developer for help or check the console for an error message"
31737
31997
  );
@@ -31783,6 +32043,12 @@ const CollectionListPage = () => {
31783
32043
  cms.alerts.info("Document was successfully renamed");
31784
32044
  reFetchCollection();
31785
32045
  } catch (error) {
32046
+ if (error.message.indexOf("has references")) {
32047
+ cms.alerts.error(
32048
+ error.message.split("\n ").filter(Boolean)[1]
32049
+ );
32050
+ return;
32051
+ }
31786
32052
  cms.alerts.warn(
31787
32053
  "Document was not renamed, ask a developer for help or check the console for an error message"
31788
32054
  );
@@ -32256,8 +32522,19 @@ const Breadcrumb = ({ folder, navigate, collectionName }) => {
32256
32522
  const NoDocumentsPlaceholder = () => {
32257
32523
  return /* @__PURE__ */ React__default.createElement("div", { className: "text-center px-5 py-3 flex flex-col items-center justify-center shadow border border-gray-100 bg-gray-50 border-b border-gray-200 w-full max-w-full rounded-lg" }, /* @__PURE__ */ React__default.createElement("p", { className: "text-base italic font-medium text-gray-300" }, "No documents found."));
32258
32524
  };
32259
- const DeleteModal = ({ close: close2, deleteFunc, filename }) => {
32260
- return /* @__PURE__ */ React__default.createElement(Modal, null, /* @__PURE__ */ React__default.createElement(PopupModal, null, /* @__PURE__ */ React__default.createElement(ModalHeader, { close: close2 }, "Delete ", filename), /* @__PURE__ */ React__default.createElement(ModalBody, { padded: true }, /* @__PURE__ */ React__default.createElement("p", null, `Are you sure you want to delete ${filename}?`)), /* @__PURE__ */ React__default.createElement(ModalActions, null, /* @__PURE__ */ React__default.createElement(Button$1, { style: { flexGrow: 2 }, onClick: close2 }, "Cancel"), /* @__PURE__ */ React__default.createElement(
32525
+ const DeleteModal = ({
32526
+ close: close2,
32527
+ deleteFunc,
32528
+ checkRefsFunc,
32529
+ filename
32530
+ }) => {
32531
+ const [hasRefs, setHasRefs] = React__default.useState();
32532
+ useEffect(() => {
32533
+ checkRefsFunc().then((result) => {
32534
+ setHasRefs(result);
32535
+ });
32536
+ }, [filename, checkRefsFunc]);
32537
+ return /* @__PURE__ */ React__default.createElement(Modal, null, /* @__PURE__ */ React__default.createElement(PopupModal, null, /* @__PURE__ */ React__default.createElement(ModalHeader, { close: close2 }, "Delete ", filename), /* @__PURE__ */ React__default.createElement(ModalBody, { padded: true }, /* @__PURE__ */ React__default.createElement("p", null, `Are you sure you want to delete ${filename}?${hasRefs ? " References to this document will also be deleted." : ""}`)), /* @__PURE__ */ React__default.createElement(ModalActions, null, /* @__PURE__ */ React__default.createElement(Button$1, { style: { flexGrow: 2 }, onClick: close2 }, "Cancel"), /* @__PURE__ */ React__default.createElement(
32261
32538
  Button$1,
32262
32539
  {
32263
32540
  style: { flexGrow: 3 },
@@ -33619,5 +33896,6 @@ export {
33619
33896
  useScreenPlugin,
33620
33897
  useTinaAuthRedirect,
33621
33898
  wrapFieldWithError,
33899
+ wrapFieldWithNoHeader,
33622
33900
  wrapFieldsWithMeta
33623
33901
  };