tinacms 0.0.0-c5dad82-20241009225242 → 0.0.0-c72bb45-20241118014046
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/types.d.ts +3 -0
- package/dist/cache/node-cache.d.ts +1 -0
- package/dist/client.js +18 -16
- package/dist/client.mjs +1 -1
- package/dist/index.js +1287 -1010
- package/dist/index.mjs +1262 -984
- package/dist/{node-cache-7fa2452c.mjs → node-cache-4c336858.mjs} +18 -11
- package/dist/rich-text/index.d.ts +3 -0
- package/dist/rich-text/index.js +3 -1
- package/dist/rich-text/index.mjs +3 -1
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/fixed-toolbar-buttons.d.ts +0 -4
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/icons.d.ts +2 -0
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-element.d.ts +11 -0
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/mermaid-toolbar-button.d.ts +20 -0
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/components/plate-ui/text-area.d.ts +5 -0
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/custom/mermaid-plugin.d.ts +2 -0
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/code-block/index.d.ts +4 -2
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/plugins/ui/components.d.ts +10 -0
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/toolbar/toolbar-overrides.d.ts +7 -3
- package/dist/toolkit/fields/plugins/mdx-field-plugin/plate/toolbar/toolbar-provider.d.ts +1 -1
- package/dist/toolkit/fields/plugins/wrap-field-with-meta.d.ts +8 -0
- package/package.json +29 -25
- 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,
|
|
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 {
|
|
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 {
|
|
15
|
-
import {
|
|
16
|
-
import
|
|
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,
|
|
19
|
-
import
|
|
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 {
|
|
22
|
-
import
|
|
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
|
-
|
|
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-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
5693
|
-
|
|
5694
|
-
|
|
5695
|
-
|
|
5696
|
-
|
|
5697
|
-
|
|
5698
|
-
|
|
5699
|
-
|
|
5700
|
-
|
|
5701
|
-
|
|
5702
|
-
|
|
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
|
-
|
|
5705
|
-
|
|
5706
|
-
|
|
5707
|
-
|
|
5708
|
-
|
|
5709
|
-
|
|
5710
|
-
|
|
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.
|
|
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-
|
|
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-
|
|
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
|
|
14054
|
-
|
|
14055
|
-
|
|
14056
|
-
|
|
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
|
-
|
|
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: "
|
|
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
|
|
14282
|
-
const
|
|
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
|
-
|
|
14455
|
+
e.preventDefault();
|
|
14456
|
+
e.stopPropagation();
|
|
14285
14457
|
};
|
|
14286
14458
|
return {
|
|
14287
14459
|
props: {
|
|
14460
|
+
onClick,
|
|
14288
14461
|
onMouseDown,
|
|
14289
|
-
pressed:
|
|
14462
|
+
pressed: state.pressed
|
|
14290
14463
|
}
|
|
14291
14464
|
};
|
|
14292
14465
|
};
|
|
14293
|
-
const
|
|
14294
|
-
const
|
|
14295
|
-
|
|
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:
|
|
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
|
-
|
|
14553
|
-
|
|
14554
|
-
|
|
14555
|
-
|
|
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
|
|
14774
|
+
const userInTable = helpers.isNodeActive(editorState, ELEMENT_TABLE);
|
|
14560
14775
|
if (userInTable) {
|
|
14561
|
-
|
|
14562
|
-
(item) => !unsupportedItemsInTable.has(item.label)
|
|
14563
|
-
);
|
|
14776
|
+
items2 = items2.filter((item) => !unsupportedItemsInTable.has(item.label));
|
|
14564
14777
|
}
|
|
14565
|
-
|
|
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,
|
|
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 = ({
|
|
32260
|
-
|
|
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
|
};
|