@4399ywkf/editor 0.4.1 → 0.4.2
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/{DocView-CZV7LGFK.js → DocView-IZ4JBSIA.js} +4 -4
- package/dist/{DocView-CZV7LGFK.js.map → DocView-IZ4JBSIA.js.map} +1 -1
- package/dist/{chunk-2GHNI22G.js → chunk-FQCG2HNJ.js} +77 -3
- package/dist/chunk-FQCG2HNJ.js.map +1 -0
- package/dist/{chunk-T2DZHEJJ.js → chunk-QMYT5WXO.js} +57 -187
- package/dist/chunk-QMYT5WXO.js.map +1 -0
- package/dist/doc.js +2 -2
- package/dist/index.js +1 -1
- package/dist/plugins/ai.d.ts +7 -0
- package/dist/plugins/ai.js +1 -1
- package/dist/style.css +75 -68
- package/package.json +1 -1
- package/dist/chunk-2GHNI22G.js.map +0 -1
- package/dist/chunk-T2DZHEJJ.js.map +0 -1
|
@@ -133,71 +133,28 @@ var SparklesIcon = memo(({ className, ...props }) => {
|
|
|
133
133
|
height: "24",
|
|
134
134
|
className,
|
|
135
135
|
viewBox: "0 0 24 24",
|
|
136
|
-
fill: "
|
|
136
|
+
fill: "none",
|
|
137
137
|
xmlns: "http://www.w3.org/2000/svg",
|
|
138
138
|
...props,
|
|
139
139
|
children: [
|
|
140
140
|
/* @__PURE__ */ jsx(
|
|
141
141
|
"path",
|
|
142
142
|
{
|
|
143
|
-
d: "M12
|
|
144
|
-
|
|
143
|
+
d: "M12 3L13.6392 8.20749C13.8353 8.83063 13.9333 9.14219 14.0982 9.40653C14.2442 9.64066 14.4276 9.84607 14.6402 10.0143C14.8802 10.2042 15.1679 10.3345 15.7434 10.5952L20.5 12L15.7434 13.4048C15.1679 13.6655 14.8802 13.7958 14.6402 13.9857C14.4276 14.1539 14.2442 14.3593 14.0982 14.5935C13.9333 14.8578 13.8353 15.1694 13.6392 15.7925L12 21L10.3608 15.7925C10.1647 15.1694 10.0667 14.8578 9.90182 14.5935C9.75583 14.3593 9.57241 14.1539 9.35983 13.9857C9.11985 13.7958 8.83209 13.6655 8.25659 13.4048L3.5 12L8.25659 10.5952C8.83209 10.3345 9.11985 10.2042 9.35983 10.0143C9.57241 9.84607 9.75583 9.64066 9.90182 9.40653C10.0667 9.14219 10.1647 8.83063 10.3608 8.20749L12 3Z",
|
|
144
|
+
stroke: "currentColor",
|
|
145
|
+
strokeWidth: "1.6",
|
|
146
|
+
strokeLinecap: "round",
|
|
147
|
+
strokeLinejoin: "round"
|
|
145
148
|
}
|
|
146
149
|
),
|
|
147
150
|
/* @__PURE__ */ jsx(
|
|
148
151
|
"path",
|
|
149
152
|
{
|
|
150
|
-
d: "
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
"path",
|
|
156
|
-
{
|
|
157
|
-
d: "M22 11C22.5523 11 23 11.4477 23 12C23 12.5523 22.5523 13 22 13H20C19.4477 13 19 12.5523 19 12C19 11.4477 19.4477 11 20 11H22Z",
|
|
158
|
-
fill: "currentColor"
|
|
159
|
-
}
|
|
160
|
-
),
|
|
161
|
-
/* @__PURE__ */ jsx(
|
|
162
|
-
"path",
|
|
163
|
-
{
|
|
164
|
-
d: "M19.5 19.5L20.9222 18.0778C21.32 17.68 21.32 17.0534 20.9222 16.6556C20.5244 16.2578 19.8978 16.2578 19.5 16.6556L18.0778 18.0778C17.68 18.4756 17.68 19.1022 18.0778 19.5C18.4756 19.8978 19.1022 19.8978 19.5 19.5Z",
|
|
165
|
-
fill: "currentColor"
|
|
166
|
-
}
|
|
167
|
-
),
|
|
168
|
-
/* @__PURE__ */ jsx(
|
|
169
|
-
"path",
|
|
170
|
-
{
|
|
171
|
-
d: "M12 18C12.5523 18 13 18.4477 13 19V21C13 21.5523 12.5523 22 12 22C11.4477 22 11 21.5523 11 21V19C11 18.4477 11.4477 18 12 18Z",
|
|
172
|
-
fill: "currentColor"
|
|
173
|
-
}
|
|
174
|
-
),
|
|
175
|
-
/* @__PURE__ */ jsx(
|
|
176
|
-
"path",
|
|
177
|
-
{
|
|
178
|
-
d: "M4.5 19.5C4.89779 19.8978 4.89779 20.5244 4.5 20.9222C4.10221 21.32 3.47559 21.32 3.0778 20.9222L1.65558 19.5C1.25779 19.1022 1.25779 18.4756 1.65558 18.0778C2.05337 17.68 2.67999 17.68 3.0778 18.0778L4.5 19.5Z",
|
|
179
|
-
fill: "currentColor"
|
|
180
|
-
}
|
|
181
|
-
),
|
|
182
|
-
/* @__PURE__ */ jsx(
|
|
183
|
-
"path",
|
|
184
|
-
{
|
|
185
|
-
d: "M2 12C2.55228 12 3 12.4477 3 13C3 13.5523 2.55228 14 2 14H0C-0.552285 14 -1 13.5523 -1 13C-1 12.4477 -0.552285 12 0 12H2Z",
|
|
186
|
-
fill: "currentColor"
|
|
187
|
-
}
|
|
188
|
-
),
|
|
189
|
-
/* @__PURE__ */ jsx(
|
|
190
|
-
"path",
|
|
191
|
-
{
|
|
192
|
-
d: "M4.5 4.5C4.89779 4.10221 5.52441 4.10221 5.92221 4.5C6.32001 4.89779 6.32001 5.52441 5.92221 5.92221L4.5 7.34442C4.10221 7.74221 3.47559 7.74221 3.0778 7.34442C2.68001 6.94663 2.68001 6.32001 3.0778 5.92221L4.5 4.5Z",
|
|
193
|
-
fill: "currentColor"
|
|
194
|
-
}
|
|
195
|
-
),
|
|
196
|
-
/* @__PURE__ */ jsx(
|
|
197
|
-
"path",
|
|
198
|
-
{
|
|
199
|
-
d: "M12 8C10.3431 8 9 9.34315 9 11C9 12.6569 10.3431 14 12 14C13.6569 14 15 12.6569 15 11C15 9.34315 13.6569 8 12 8Z",
|
|
200
|
-
fill: "currentColor"
|
|
153
|
+
d: "M18.5 3.5L18.9 4.85C19 5.15 19.05 5.3 19.14 5.42C19.21 5.53 19.31 5.63 19.42 5.7C19.54 5.79 19.69 5.84 19.99 5.94L21.34 6.34L19.99 6.74C19.69 6.84 19.54 6.89 19.42 6.98C19.31 7.05 19.21 7.15 19.14 7.26C19.05 7.38 19 7.53 18.9 7.83L18.5 9.18L18.1 7.83C18 7.53 17.95 7.38 17.86 7.26C17.79 7.15 17.69 7.05 17.58 6.98C17.46 6.89 17.31 6.84 17.01 6.74L15.66 6.34L17.01 5.94C17.31 5.84 17.46 5.79 17.58 5.7C17.69 5.63 17.79 5.53 17.86 5.42C17.95 5.3 18 5.15 18.1 4.85L18.5 3.5Z",
|
|
154
|
+
stroke: "currentColor",
|
|
155
|
+
strokeWidth: "1.4",
|
|
156
|
+
strokeLinecap: "round",
|
|
157
|
+
strokeLinejoin: "round"
|
|
201
158
|
}
|
|
202
159
|
)
|
|
203
160
|
]
|
|
@@ -765,80 +722,6 @@ function PopoverContent({
|
|
|
765
722
|
}
|
|
766
723
|
) });
|
|
767
724
|
}
|
|
768
|
-
function Input({ className, type, ...props }) {
|
|
769
|
-
return /* @__PURE__ */ jsx(
|
|
770
|
-
"input",
|
|
771
|
-
{
|
|
772
|
-
type,
|
|
773
|
-
"data-slot": "tiptap-input",
|
|
774
|
-
className: cn("tiptap-input", className),
|
|
775
|
-
...props
|
|
776
|
-
}
|
|
777
|
-
);
|
|
778
|
-
}
|
|
779
|
-
var Card = forwardRef(
|
|
780
|
-
({ className, ...props }, ref) => {
|
|
781
|
-
return /* @__PURE__ */ jsx("div", { ref, className: cn("tiptap-card", className), ...props });
|
|
782
|
-
}
|
|
783
|
-
);
|
|
784
|
-
Card.displayName = "Card";
|
|
785
|
-
var CardHeader = forwardRef(
|
|
786
|
-
({ className, ...props }, ref) => {
|
|
787
|
-
return /* @__PURE__ */ jsx(
|
|
788
|
-
"div",
|
|
789
|
-
{
|
|
790
|
-
ref,
|
|
791
|
-
className: cn("tiptap-card-header", className),
|
|
792
|
-
...props
|
|
793
|
-
}
|
|
794
|
-
);
|
|
795
|
-
}
|
|
796
|
-
);
|
|
797
|
-
CardHeader.displayName = "CardHeader";
|
|
798
|
-
var CardBody = forwardRef(
|
|
799
|
-
({ className, ...props }, ref) => {
|
|
800
|
-
return /* @__PURE__ */ jsx("div", { ref, className: cn("tiptap-card-body", className), ...props });
|
|
801
|
-
}
|
|
802
|
-
);
|
|
803
|
-
CardBody.displayName = "CardBody";
|
|
804
|
-
var CardItemGroup = forwardRef(({ className, orientation = "vertical", ...props }, ref) => {
|
|
805
|
-
return /* @__PURE__ */ jsx(
|
|
806
|
-
"div",
|
|
807
|
-
{
|
|
808
|
-
ref,
|
|
809
|
-
"data-orientation": orientation,
|
|
810
|
-
className: cn("tiptap-card-item-group", className),
|
|
811
|
-
...props
|
|
812
|
-
}
|
|
813
|
-
);
|
|
814
|
-
});
|
|
815
|
-
CardItemGroup.displayName = "CardItemGroup";
|
|
816
|
-
var CardGroupLabel = forwardRef(
|
|
817
|
-
({ className, ...props }, ref) => {
|
|
818
|
-
return /* @__PURE__ */ jsx(
|
|
819
|
-
"div",
|
|
820
|
-
{
|
|
821
|
-
ref,
|
|
822
|
-
className: cn("tiptap-card-group-label", className),
|
|
823
|
-
...props
|
|
824
|
-
}
|
|
825
|
-
);
|
|
826
|
-
}
|
|
827
|
-
);
|
|
828
|
-
CardGroupLabel.displayName = "CardGroupLabel";
|
|
829
|
-
var CardFooter = forwardRef(
|
|
830
|
-
({ className, ...props }, ref) => {
|
|
831
|
-
return /* @__PURE__ */ jsx(
|
|
832
|
-
"div",
|
|
833
|
-
{
|
|
834
|
-
ref,
|
|
835
|
-
className: cn("tiptap-card-footer", className),
|
|
836
|
-
...props
|
|
837
|
-
}
|
|
838
|
-
);
|
|
839
|
-
}
|
|
840
|
-
);
|
|
841
|
-
CardFooter.displayName = "CardFooter";
|
|
842
725
|
var SendIcon = memo(({ className, ...props }) => {
|
|
843
726
|
return /* @__PURE__ */ jsx(
|
|
844
727
|
"svg",
|
|
@@ -847,14 +730,17 @@ var SendIcon = memo(({ className, ...props }) => {
|
|
|
847
730
|
height: "24",
|
|
848
731
|
className,
|
|
849
732
|
viewBox: "0 0 24 24",
|
|
850
|
-
fill: "
|
|
733
|
+
fill: "none",
|
|
851
734
|
xmlns: "http://www.w3.org/2000/svg",
|
|
852
735
|
...props,
|
|
853
736
|
children: /* @__PURE__ */ jsx(
|
|
854
737
|
"path",
|
|
855
738
|
{
|
|
856
|
-
d: "
|
|
857
|
-
|
|
739
|
+
d: "M12 19V5M12 5L6 11M12 5L18 11",
|
|
740
|
+
stroke: "currentColor",
|
|
741
|
+
strokeWidth: "2",
|
|
742
|
+
strokeLinecap: "round",
|
|
743
|
+
strokeLinejoin: "round"
|
|
858
744
|
}
|
|
859
745
|
)
|
|
860
746
|
}
|
|
@@ -874,36 +760,34 @@ function AIDialog({
|
|
|
874
760
|
useEffect(() => {
|
|
875
761
|
inputRef.current?.focus();
|
|
876
762
|
}, []);
|
|
763
|
+
const canSubmit = Boolean(prompt.trim()) && !isLoading;
|
|
877
764
|
const handleSubmit = async () => {
|
|
878
|
-
if (!
|
|
879
|
-
return;
|
|
880
|
-
}
|
|
765
|
+
if (!canSubmit) return;
|
|
881
766
|
setError(null);
|
|
882
767
|
setIsLoading(true);
|
|
883
768
|
try {
|
|
884
769
|
const context = buildContext(prompt);
|
|
885
770
|
if (!context) {
|
|
886
|
-
setError("
|
|
887
|
-
setIsLoading(false);
|
|
771
|
+
setError("没有选中内容");
|
|
888
772
|
return;
|
|
889
773
|
}
|
|
890
774
|
const result = await config.plugin.process(context);
|
|
891
775
|
if (result.error) {
|
|
892
776
|
setError(result.error);
|
|
893
|
-
setIsLoading(false);
|
|
894
777
|
return;
|
|
895
778
|
}
|
|
896
779
|
if (result.result) {
|
|
897
780
|
const { from, to } = editor.state.selection;
|
|
898
|
-
|
|
899
|
-
editor.state.
|
|
900
|
-
|
|
901
|
-
|
|
781
|
+
editor.view.dispatch(
|
|
782
|
+
editor.state.tr.replaceWith(from, to, [
|
|
783
|
+
editor.state.schema.text(result.result)
|
|
784
|
+
])
|
|
785
|
+
);
|
|
902
786
|
}
|
|
903
|
-
onClose();
|
|
904
787
|
setPrompt("");
|
|
788
|
+
onClose();
|
|
905
789
|
} catch (err) {
|
|
906
|
-
setError(err instanceof Error ? err.message : "
|
|
790
|
+
setError(err instanceof Error ? err.message : "出错了");
|
|
907
791
|
} finally {
|
|
908
792
|
setIsLoading(false);
|
|
909
793
|
}
|
|
@@ -911,58 +795,44 @@ function AIDialog({
|
|
|
911
795
|
const handleKeyDown = (e) => {
|
|
912
796
|
if (e.key === "Enter" && !e.shiftKey) {
|
|
913
797
|
e.preventDefault();
|
|
914
|
-
handleSubmit();
|
|
798
|
+
void handleSubmit();
|
|
799
|
+
}
|
|
800
|
+
if (e.key === "Escape") {
|
|
801
|
+
e.preventDefault();
|
|
802
|
+
onClose();
|
|
915
803
|
}
|
|
916
804
|
};
|
|
917
|
-
return /* @__PURE__ */ jsxs(
|
|
918
|
-
/* @__PURE__ */
|
|
919
|
-
/* @__PURE__ */ jsx(
|
|
920
|
-
|
|
921
|
-
] }) }),
|
|
922
|
-
/* @__PURE__ */ jsxs(CardBody, { className: "ai-dialog-body", children: [
|
|
923
|
-
/* @__PURE__ */ jsx("div", { className: "ai-dialog-input-group", children: /* @__PURE__ */ jsx(
|
|
924
|
-
Input,
|
|
805
|
+
return /* @__PURE__ */ jsxs("div", { className: "tiptap-ai-dialog", children: [
|
|
806
|
+
/* @__PURE__ */ jsxs("div", { className: "tiptap-ai-dialog-field", "data-loading": isLoading, children: [
|
|
807
|
+
/* @__PURE__ */ jsx(
|
|
808
|
+
"input",
|
|
925
809
|
{
|
|
926
810
|
ref: inputRef,
|
|
927
811
|
type: "text",
|
|
928
|
-
|
|
812
|
+
className: "tiptap-ai-dialog-input",
|
|
813
|
+
placeholder: "描述你想要的修改",
|
|
929
814
|
value: prompt,
|
|
815
|
+
disabled: isLoading,
|
|
930
816
|
onChange: (e) => {
|
|
931
817
|
setPrompt(e.target.value);
|
|
932
818
|
setError(null);
|
|
933
819
|
},
|
|
934
|
-
onKeyDown: handleKeyDown
|
|
935
|
-
disabled: isLoading,
|
|
936
|
-
className: "ai-dialog-input"
|
|
820
|
+
onKeyDown: handleKeyDown
|
|
937
821
|
}
|
|
938
|
-
)
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
Button,
|
|
953
|
-
{
|
|
954
|
-
type: "button",
|
|
955
|
-
variant: "primary",
|
|
956
|
-
onClick: handleSubmit,
|
|
957
|
-
disabled: isLoading || !prompt.trim(),
|
|
958
|
-
children: [
|
|
959
|
-
isLoading ? "Processing..." : "Send",
|
|
960
|
-
!isLoading && /* @__PURE__ */ jsx(SendIcon, { className: "ai-dialog-button-icon" })
|
|
961
|
-
]
|
|
962
|
-
}
|
|
963
|
-
)
|
|
964
|
-
] })
|
|
965
|
-
] })
|
|
822
|
+
),
|
|
823
|
+
/* @__PURE__ */ jsx(
|
|
824
|
+
"button",
|
|
825
|
+
{
|
|
826
|
+
type: "button",
|
|
827
|
+
className: "tiptap-ai-dialog-submit",
|
|
828
|
+
"aria-label": "发送",
|
|
829
|
+
disabled: !canSubmit,
|
|
830
|
+
onClick: () => void handleSubmit(),
|
|
831
|
+
children: /* @__PURE__ */ jsx(SendIcon, {})
|
|
832
|
+
}
|
|
833
|
+
)
|
|
834
|
+
] }),
|
|
835
|
+
error && /* @__PURE__ */ jsx("div", { className: "tiptap-ai-dialog-error", children: error })
|
|
966
836
|
] });
|
|
967
837
|
}
|
|
968
838
|
var NODE_TYPE_LABELS = {
|
|
@@ -1140,6 +1010,6 @@ var AIButton = forwardRef(
|
|
|
1140
1010
|
);
|
|
1141
1011
|
AIButton.displayName = "AIButton";
|
|
1142
1012
|
|
|
1143
|
-
export { AIButton, AIConfigContext, AIDialog, Button,
|
|
1144
|
-
//# sourceMappingURL=chunk-
|
|
1145
|
-
//# sourceMappingURL=chunk-
|
|
1013
|
+
export { AIButton, AIConfigContext, AIDialog, Button, MAC_SYMBOLS, MAX_FILE_SIZE, Popover, PopoverContent, PopoverTrigger, SR_ONLY, clamp, cn, findNodeAtPosition, findNodePosition, focusNextNode, formatShortcutKey, getAvatar, getElementOverflowPosition, getNodeDisplayName, getSelectedBlockNodes, getSelectedNodesOfType, getSelectionBoundingRect, getUrlParam, handleImageUpload, isAllowedUri, isExtensionAvailable, isMac, isMarkInSchema, isNodeInSchema, isNodeTypeSelected, isSelectionValid, isTextSelectionValid, isValidPosition, parseShortcutKeys, removeEmptyParagraphs, sanitizeUrl, selectCurrentBlockContent, selectionWithinConvertibleTypes, updateNodesAttr, useAIConfig, useAIContext, useTiptapEditor };
|
|
1014
|
+
//# sourceMappingURL=chunk-QMYT5WXO.js.map
|
|
1015
|
+
//# sourceMappingURL=chunk-QMYT5WXO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-tiptap-editor.ts","../src/plugins/ai/use-ai-context.ts","../src/plugins/ai/ai-context.ts","../src/plugins/ai/ai-button-visibility.ts","../src/components/tiptap-icons/sparkles-icon.tsx","../src/components/tiptap-ui-primitive/tooltip/tooltip.tsx","../src/lib/tiptap-utils.ts","../src/components/tiptap-ui-primitive/button/button.tsx","../src/components/tiptap-ui-primitive/popover/popover.tsx","../src/components/tiptap-icons/send-icon.tsx","../src/plugins/ai/ai-dialog.tsx","../src/lib/tiptap-collab-utils.ts","../src/plugins/ai/ai-button.tsx"],"names":["useState","createContext","useContext","jsx","TooltipTrigger","TooltipContent","isMac","jsxs","forwardRef","useMemo","memo","useEffect","NodeSelection","nodeType","CellSelection","useCallback"],"mappings":";;;;;;;;;AAIA,SAAS,oBAAoB,MAAA,EAA+B;AAC1D,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,EAAA,IAAI,CAAC,KAAA,IAAS,EAAE,cAAA,IAAkB,QAAQ,OAAO,IAAA;AACjD,EAAA,OAAO,MAAM,YAAA,IAAgB,IAAA;AAC/B;AAEO,SAAS,gBAAgB,cAAA,EAI9B;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAW,GAAI,gBAAA,EAAiB;AAChD,EAAA,MAAM,aAAa,cAAA,IAAkB,UAAA;AAErC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAwB,IAAI,CAAA;AAEtE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,MACpB,gBAAA,CAAiB,mBAAA,CAAoB,UAAU,CAAC,CAAA;AAElD,IAAA,aAAA,EAAc;AAEd,IAAA,UAAA,CAAW,EAAA,CAAG,UAAU,aAAa,CAAA;AACrC,IAAA,UAAA,CAAW,EAAA,CAAG,mBAAmB,aAAa,CAAA;AAE9C,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,CAAW,GAAA,CAAI,UAAU,aAAa,CAAA;AACtC,MAAA,UAAA,CAAW,GAAA,CAAI,mBAAmB,aAAa,CAAA;AAAA,IACjD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,IAAA,MAAM,aAAA,GAAgB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAEjD,IAAA,aAAA,CAAc,EAAA,CAAG,WAAW,aAAa,CAAA;AACzC,IAAA,OAAO,MAAM;AACX,MAAA,aAAA,CAAc,GAAA,CAAI,WAAW,aAAa,CAAA;AAAA,IAC5C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,cAAc,cAAA,CAAe;AAAA,IACjC,QAAQ,aAAA,IAAiB,UAAA;AAAA,IACzB,SAAS,OAAA,EAAS;AAChB,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAa,MAAA,EAAW,YAAY,MAAA,EAAU;AAAA,MACvE;AAEA,MAAA,OAAO;AAAA,QACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,WAAA,EAAa,QAAQ,MAAA,CAAO,KAAA;AAAA,QAC5B,UAAA,EAAY,QAAQ,MAAA,CAAO;AAAA,OAC7B;AAAA,IACF;AAAA,GACD,CAAA;AAED,EAAA,OAAO,WAAA,IAAe,EAAE,MAAA,EAAQ,IAAA,EAAK;AACvC;AChEA,IAAM,mBAAA,GAAsB,GAAA;AAgC5B,SAAS,uBAAuB,MAAA,EAAoC;AAClE,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAA,CAAO,KAAA,CAAM,SAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,QAAQ,IAAI,CAAA;AAC3C,EAAA,OAAO,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA;AAC3B;AAKA,SAAS,gBAAgB,MAAA,EAAoC;AAC3D,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAA,CAAO,KAAA,CAAM,SAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,QAAQ,IAAI,CAAA;AAE3C,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAM,aAAa,CAAA;AAChD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,gBAAgB,MAAA,EAAwB;AAC/C,EAAA,OAAO,MAAA,CAAO,MAAM,GAAA,CAAI,WAAA;AAC1B;AAEO,SAAS,aAAa,MAAA,EAAuB;AAClD,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,MAAA,KAAyC;AACxC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,OAAO,KAAA,CAAM,SAAA;AAClC,MAAA,MAAM,eAAe,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,WAAA,CAAY,MAAM,EAAE,CAAA;AAE1D,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,MAAM,aAAa,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,WAAA,CAAY,GAAG,IAAI,CAAA;AACvD,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACnC,MAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AAGvC,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,mBAAmB,CAAA;AAC3D,MAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,MAAA,CAAO,MAAM,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,EAAA,GAAK,mBAAmB,CAAA;AAErF,MAAA,MAAM,gBAAgB,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,WAAA,CAAY,cAAc,IAAI,CAAA;AACrE,MAAA,MAAM,gBAAgB,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,WAAA,CAAY,IAAI,YAAY,CAAA;AAEnE,MAAA,OAAO;AAAA,QACL,MAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,IAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,aAAA;AAAA,QACA,aAAA;AAAA,QACA,QAAA,EAAU,uBAAuB,MAAM,CAAA;AAAA,QACvC,mBAAA,EAAqB,gBAAgB,MAAM,CAAA;AAAA,QAC3C,YAAA,EAAc,gBAAgB,MAAM,CAAA;AAAA,QACpC,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,YAAA,EAAa;AACxB;AC9GO,IAAM,eAAA,GAAkB,cAAqC,IAAI;AAEjE,SAAS,WAAA,GAAqC;AACnD,EAAA,OAAO,WAAW,eAAe,CAAA;AACnC;;;ACYO,IAAM,qBAAqB,CAAC;AAAA,EACjC,OAAA;AAAA,EACA,mBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KACE,OAAA,KAAY,sBAAsB,iBAAA,GAAoB,UAAA,CAAA;ACrBjD,IAAM,eAAe,IAAA,CAAK,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,KAAgB;AACtE,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,SAAA;AAAA,MACA,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MACL,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,kqBAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA,SACjB;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,ydAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AAAA,GACF;AAEJ,CAAC,CAAA;AAED,YAAA,CAAa,WAAA,GAAc,cAAA;ACqC3B,SAAS,UAAA,CAAW;AAAA,EAClB,WAAA,GAAc,KAAA;AAAA,EACd,SAAA,GAAY,KAAA;AAAA,EACZ,IAAA,EAAM,cAAA;AAAA,EACN,YAAA,EAAc,iBAAA;AAAA,EACd,KAAA,GAAQ,GAAA;AAAA,EACR,UAAA,GAAa;AACf,CAAA,GAA4C,EAAC,EAAG;AAC9C,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAkB,WAAW,CAAA;AAE7E,EAAA,MAAM,OAAO,cAAA,IAAkB,gBAAA;AAC/B,EAAA,MAAM,UAAU,iBAAA,IAAqB,mBAAA;AAErC,EAAA,MAAM,OAAO,WAAA,CAAY;AAAA,IACvB,SAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA,EAAc,OAAA;AAAA,IACd,oBAAA,EAAsB,UAAA;AAAA,IACtB,UAAA,EAAY;AAAA,MACV,OAAO,CAAC,CAAA;AAAA,MACR,IAAA,CAAK;AAAA,QACH,SAAA,EAAW,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA;AAAA,QACjC,yBAAA,EAA2B,OAAA;AAAA,QAC3B,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,MACD,KAAA,CAAM,EAAE,OAAA,EAAS,CAAA,EAAG;AAAA;AACtB,GACD,CAAA;AAED,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAErB,EAAA,MAAM,KAAA,GAAQ,SAAS,OAAA,EAAS;AAAA,IAC9B,SAAA,EAAW,IAAA;AAAA,IACX,IAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,SAAS,cAAA,IAAkB,IAAA;AAAA,IAC3B,KAAA,EAAO;AAAA,MACL,KAAA,EAAO;AAAA;AACT,GACD,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,SAAS,OAAA,EAAS;AAAA,IAC9B,SAAS,cAAA,IAAkB;AAAA,GAC5B,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,WAAW,OAAO,CAAA;AAClC,EAAA,MAAM,OAAO,OAAA,CAAQ,OAAA,EAAS,EAAE,IAAA,EAAM,WAAW,CAAA;AAEjD,EAAA,MAAM,eAAe,eAAA,CAAgB,CAAC,OAAO,KAAA,EAAO,OAAA,EAAS,IAAI,CAAC,CAAA;AAElE,EAAA,OAAO,OAAA;AAAA,IACL,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAG,YAAA;AAAA,MACH,GAAG;AAAA,KACL,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,OAAA,EAAS,YAAA,EAAc,IAAI;AAAA,GACpC;AACF;AAEA,IAAM,cAAA,GAAiBC,cAA0C,IAAI,CAAA;AAErE,SAAS,iBAAA,GAAoB;AAC3B,EAAA,MAAM,OAAA,GAAUC,WAAW,cAAc,CAAA;AAEzC,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,EAC7E;AAEA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,OAAA,CAAQ,EAAE,QAAA,EAAU,GAAG,OAAM,EAAyB;AACpE,EAAA,MAAM,OAAA,GAAU,WAAW,KAAK,CAAA;AAEhC,EAAA,IAAI,CAAC,MAAM,aAAA,EAAe;AACxB,IAAA,uBACEC,GAAAA,CAAC,cAAA,CAAe,UAAf,EAAwB,KAAA,EAAO,SAC7B,QAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,CAAM,SAAS,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,UAAA,IAAc,CAAA,EAAE;AAAA,MAC9D,WAAW,KAAA,CAAM,OAAA;AAAA,MAEjB,0BAAAA,GAAAA,CAAC,cAAA,CAAe,UAAf,EAAwB,KAAA,EAAO,SAC7B,QAAA,EACH;AAAA;AAAA,GACF;AAEJ;AAEO,IAAM,cAAA,GAAiB,UAAA;AAAA,EAC5B,SAASC,gBAAe,EAAE,QAAA,EAAU,UAAU,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,OAAA,EAAS;AACxE,IAAA,MAAM,UAAU,iBAAA,EAAkB;AAClC,IAAA,MAAM,cAAc,cAAA,CAAe,QAAQ,IACvC,QAAA,CAAS,OAAA,EAAS,EAAE,CAAA,IAAK,EAAA;AAAA;AAAA,MAEtB,SAAiD,KAAA,CAAM;AAAA;AAAA;AAAA,MAEvD,QAAA,CAAiB;AAAA,KAAA,GACpB,MAAA;AACJ,IAAA,MAAM,GAAA,GAAM,aAAa,CAAC,OAAA,CAAQ,KAAK,YAAA,EAAc,OAAA,EAAS,WAAW,CAAC,CAAA;AAE1E,IAAA,IAAI,OAAA,IAAW,cAAA,CAAe,QAAQ,CAAA,EAAG;AACvC,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,oBAAA,EAAsB,OAAA,CAAQ,IAAA,GAAO,MAAA,GAAS;AAAA,OAChD;AAEA,MAAA,OAAO,YAAA;AAAA,QACL,QAAA;AAAA,QACA,QAAQ,iBAAA,CAAkB;AAAA,UACxB,GAAA;AAAA,UACA,GAAG,KAAA;AAAA,UACH,GAAI,OAAO,QAAA,CAAS,UAAU,QAAA,GAAW,QAAA,CAAS,QAAQ,EAAC;AAAA,UAC3D,GAAG;AAAA,SACJ;AAAA,OACH;AAAA,IACF;AAEA,IAAA,uBACED,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,oBAAA,EAAoB,OAAA,CAAQ,IAAA,GAAO,MAAA,GAAS,QAAA;AAAA,QAC3C,GAAG,OAAA,CAAQ,iBAAA,CAAkB,KAAK,CAAA;AAAA,QAElC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF,CAAA;AAEO,IAAM,cAAA,GAAiB,UAAA;AAAA,EAC5B,SAASE,eAAAA,CACP,EAAE,KAAA,EAAO,QAAA,EAAU,MAAA,GAAS,IAAA,EAAM,WAAA,GAAc,EAAC,EAAG,GAAG,KAAA,IACvD,OAAA,EACA;AACA,IAAA,MAAM,UAAU,iBAAA,EAAkB;AAClC,IAAA,MAAM,MAAM,YAAA,CAAa,CAAC,QAAQ,IAAA,CAAK,WAAA,EAAa,OAAO,CAAC,CAAA;AAE5D,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAM,OAAO,IAAA;AAE1B,IAAA,MAAM,0BACJF,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,GAAG,OAAA,CAAQ,cAAA;AAAA,UACX,GAAG;AAAA,SACL;AAAA,QACC,GAAG,OAAA,CAAQ,gBAAA,CAAiB,KAAK,CAAA;AAAA,QAClC,SAAA,EAAU,gBAAA;AAAA,QAET;AAAA;AAAA,KACH;AAGF,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,uBAAOA,GAAAA,CAAC,cAAA,EAAA,EAAgB,GAAG,aAAc,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF,CAAA;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AACtB,cAAA,CAAe,WAAA,GAAc,gBAAA;AAC7B,cAAA,CAAe,WAAA,GAAc,gBAAA;AC/NtB,IAAM,aAAA,GAAgB,IAAI,IAAA,GAAO;AAEjC,IAAM,WAAA,GAAsC;AAAA,EACjD,GAAA,EAAK,GAAA;AAAA,EACL,OAAA,EAAS,GAAA;AAAA,EACT,IAAA,EAAM,GAAA;AAAA,EACN,IAAA,EAAM,GAAA;AAAA,EACN,OAAA,EAAS,GAAA;AAAA,EACT,GAAA,EAAK,GAAA;AAAA,EACL,MAAA,EAAQ,GAAA;AAAA,EACR,KAAA,EAAO,GAAA;AAAA,EACP,SAAA,EAAW,KAAA;AAAA,EACX,MAAA,EAAQ,GAAA;AAAA,EACR,KAAA,EAAO,GAAA;AAAA,EACP,MAAA,EAAQ,GAAA;AAAA,EACR,QAAA,EAAU;AACZ;AAEO,IAAM,OAAA,GAAU;AAAA,EACrB,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,IAAA,EAAM,kBAAA;AAAA,EACN,UAAA,EAAY,QAAA;AAAA,EACZ,WAAA,EAAa;AACf;AAEO,SAAS,MACX,OAAA,EACK;AACR,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACzC;AAMO,SAAS,KAAA,GAAiB;AAC/B,EAAA,OACE,OAAO,cAAc,WAAA,IACrB,SAAA,CAAU,SAAS,WAAA,EAAY,CAAE,SAAS,KAAK,CAAA;AAEnD;AASO,IAAM,iBAAA,GAAoB,CAC/B,GAAA,EACAG,MAAAA,EACA,aAAsB,IAAA,KACnB;AACH,EAAA,IAAIA,MAAAA,EAAO;AACT,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AACjC,IAAA,OAAO,YAAY,QAAQ,CAAA,KAAM,UAAA,GAAa,GAAA,CAAI,aAAY,GAAI,GAAA,CAAA;AAAA,EACpE;AAEA,EAAA,OAAO,UAAA,GAAa,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,aAAY,GAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AACnE;AASO,IAAM,iBAAA,GAAoB,CAAC,KAAA,KAI5B;AACJ,EAAA,MAAM,EAAE,YAAA,EAAc,SAAA,GAAY,GAAA,EAAK,UAAA,GAAa,MAAK,GAAI,KAAA;AAE7D,EAAA,IAAI,CAAC,YAAA,EAAc,OAAO,EAAC;AAE3B,EAAA,OAAO,aACJ,KAAA,CAAM,SAAS,EACf,GAAA,CAAI,CAAC,QAAQ,GAAA,CAAI,IAAA,EAAM,CAAA,CACvB,GAAA,CAAI,CAAC,GAAA,KAAQ,iBAAA,CAAkB,KAAK,KAAA,EAAM,EAAG,UAAU,CAAC,CAAA;AAC7D;AAQO,IAAM,cAAA,GAAiB,CAC5B,QAAA,EACA,MAAA,KACY;AACZ,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,KAAA;AAC5B,EAAA,OAAO,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,KAAM,MAAA;AACpD;AAQO,IAAM,cAAA,GAAiB,CAC5B,QAAA,EACA,MAAA,KACY;AACZ,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,KAAA;AAC5B,EAAA,OAAO,OAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,KAAM,MAAA;AACpD;AAOO,SAAS,cAAc,MAAA,EAAgB;AAC5C,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,MAAA;AACxB,EAAA,MAAM,EAAE,GAAA,EAAK,SAAA,EAAU,GAAI,KAAA;AAE3B,EAAA,MAAM,UAAU,SAAA,CAAU,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,GAAG,IAAI,CAAA;AACzD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAA,CAAK,SAAS,KAAA,CAAM,EAAA,CAAG,aAAa,OAAO,CAAA,CAAE,gBAAgB,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,SAAA;AACzC,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAA,CAAQ,KAAK,yCAAyC,CAAA;AACtD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,OAAA,CAAQ,IAAA;AACxB,EAAA,MAAM,IAAA,GAAO,cAAc,MAAA,EAAO;AAClC,EAAA,IAAI,EAAA,GAAK,KAAA,CAAM,EAAA,CAAG,MAAA,CAAO,KAAK,IAAI,CAAA;AAGlC,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAC,CAAA;AACtC,EAAA,EAAA,GAAK,GAAG,YAAA,CAAa,aAAA,CAAc,KAAK,OAAO,CAAC,EAAE,cAAA,EAAe;AACjE,EAAA,IAAA,CAAK,SAAS,EAAE,CAAA;AAChB,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,gBAAgB,GAAA,EAA+C;AAC7E,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,IAAO,CAAA;AAC3C;AAQO,SAAS,oBAAA,CACd,QACA,cAAA,EACS;AACT,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,GACtC,cAAA,GACA,CAAC,cAAc,CAAA;AAEnB,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA;AAAA,IAAK,CAAC,IAAA,KACxB,MAAA,CAAO,gBAAA,CAAiB,UAAA,CAAW,KAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,KAAS,IAAI;AAAA,GACpE;AAEA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,wBAAA,EAA2B,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,wFAAA;AAAA,KAC7C;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,kBAAA,CAAmB,QAAgB,QAAA,EAAkB;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,OAAO,QAAQ,CAAA;AAC7C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0BAAA,EAA6B,QAAQ,CAAA,CAAE,CAAA;AACpD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAClE,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAUO,SAAS,iBAAiB,KAAA,EAIQ;AACvC,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ,GAAI,KAAA;AAElC,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,KAAA,EAAO,KAAK,OAAO,IAAA;AAG1C,EAAA,MAAM,YAAA,GAAe,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA;AACpD,EAAA,MAAM,WAAA,GAAc,gBAAgB,OAAO,CAAA;AAE3C,EAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,WAAA,EAAa;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI,SAAA,GAA2B,IAAA;AAE/B,IAAA,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,WAAA,CAAY,CAAC,aAAa,GAAA,KAAQ;AAGjD,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,QAAA,GAAW,GAAA;AACX,QAAA,SAAA,GAAY,WAAA;AACZ,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,IAAI,QAAA,KAAa,EAAA,IAAM,SAAA,KAAc,IAAA,EAAM;AACzC,MAAA,OAAO,EAAE,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,SAAA,EAAU;AAAA,IAC1C;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,MAAA,EAAQ,OAAQ,CAAA;AACrD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,EAAE,GAAA,EAAK,OAAA,EAAU,IAAA,EAAM,SAAA,EAAU;AAAA,IAC1C;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AASO,SAAS,mBACd,MAAA,EACA,aAAA,GAA0B,EAAC,EAC3B,qBAA8B,KAAA,EACrB;AACT,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,KAAA,CAAM,WAAW,OAAO,KAAA;AAE/C,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAA,CAAO,KAAA;AAC7B,EAAA,IAAI,SAAA,CAAU,OAAO,OAAO,KAAA;AAG5B,EAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,IAAA,MAAM,eAAe,SAAA,CAAU,IAAA;AAC/B,IAAA,OAAO,eAAe,aAAA,CAAc,QAAA,CAAS,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA;AAAA,EACzE;AAGA,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,MAAM,EAAE,OAAM,GAAI,SAAA;AAClB,IAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,GAAG,KAAA,EAAA,EAAS;AAChD,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AACrC,MAAA,IAAI,aAAA,CAAc,QAAA,CAAS,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AAClD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AASO,SAAS,+BAAA,CACd,MAAA,EACA,KAAA,GAAkB,EAAC,EACV;AACT,EAAA,IAAI,CAAC,MAAA,IAAU,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,KAAA;AAE1C,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,MAAM,EAAE,WAAU,GAAI,KAAA;AACtB,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAK,CAAA;AAE7B,EAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,IAAA;AACvC,IAAA,OAAO,CAAC,CAAC,QAAA,IAAY,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,SAAA,YAAqB,aAAA,IAAiB,SAAA,YAAqB,YAAA,EAAc;AAC3E,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,KAAA,CAAM,IAAI,YAAA,CAAa,SAAA,CAAU,MAAM,SAAA,CAAU,EAAA,EAAI,CAAC,IAAA,KAAS;AAC7D,MAAA,IAAI,IAAA,CAAK,eAAe,CAAC,OAAA,CAAQ,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AACpD,QAAA,KAAA,GAAQ,KAAA;AACR,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AASO,IAAM,iBAAA,GAAoB,OAC/B,IAAA,EACA,UAAA,EACA,WAAA,KACoB;AAEpB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,mCAAA,EAAsC,aAAA,IAAiB,IAAA,GAAO,IAAA,CAAK,CAAA,GAAA;AAAA,KACrE;AAAA,EACF;AAIA,EAAA,KAAA,IAAS,QAAA,GAAW,CAAA,EAAG,QAAA,IAAY,GAAA,EAAK,YAAY,EAAA,EAAI;AACtD,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,IACpC;AACA,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,GAAG,CAAC,CAAA;AACvD,IAAA,UAAA,GAAa,EAAE,UAAU,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,yCAAA;AACT;AAqBA,IAAM,eAAA;AAAA;AAAA,EAEJ;AAAA,CAAA;AAEK,SAAS,YAAA,CACd,KACA,SAAA,EACA;AACA,EAAA,MAAM,gBAAA,GAA6B;AAAA,IACjC,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa;AAC9B,MAAA,MAAM,YAAA,GACJ,OAAO,QAAA,KAAa,QAAA,GAAW,WAAW,QAAA,CAAS,MAAA;AAErD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,gBAAA,CAAiB,KAAK,YAAY,CAAA;AAAA,MACpC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OACE,CAAC,GAAA,IACD,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,CAAE,KAAA;AAAA,IAC/B,IAAI,MAAA;AAAA;AAAA,MAEF,CAAA,OAAA,EAAU,gBAAA,CAAiB,IAAA,CAAK,GAAG,CAAC,CAAA,uCAAA,CAAA;AAAA,MACpC;AAAA;AACF,GACF;AAEJ;AAEO,SAAS,WAAA,CACd,QAAA,EACA,OAAA,EACA,SAAA,EACQ;AACR,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA;AAErC,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,SAAS,CAAA,EAAG;AACrC,MAAA,OAAO,GAAA,CAAI,IAAA;AAAA,IACb;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,GAAA;AACT;AAYO,SAAS,eAAA,CACd,EAAA,EACA,OAAA,EACA,QAAA,EACA,IAAA,EACS;AACT,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,KAAA;AAE5B,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,KAAA,MAAW,EAAE,GAAA,EAAI,IAAK,OAAA,EAAS;AAE7B,IAAA,MAAM,WAAA,GAAc,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AACrC,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,MAAM,SAAA,GAAa,WAAA,CAAY,KAAA,CAC7B,QACF,CAAA;AACA,IAAA,MAAM,eACJ,OAAO,IAAA,KAAS,UAAA,GACX,IAAA,CAA6C,SAAS,CAAA,GACvD,IAAA;AAEN,IAAA,IAAI,cAAc,YAAA,EAAc;AAEhC,IAAA,MAAM,SAAA,GAAqC,EAAE,GAAG,WAAA,CAAY,KAAA,EAAM;AAClE,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAE9B,MAAA,OAAO,UAAU,QAAQ,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,QAAQ,CAAA,GAAI,YAAA;AAAA,IACxB;AAEA,IAAA,EAAA,CAAG,aAAA,CAAc,GAAA,EAAK,MAAA,EAAW,SAAS,CAAA;AAC1C,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AAEA,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,0BAA0B,MAAA,EAAgB;AACxD,EAAA,MAAM,EAAE,SAAA,EAAW,GAAA,EAAI,GAAI,MAAA,CAAO,KAAA;AAElC,EAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AAEtB,EAAA,MAAM,OAAO,SAAA,CAAU,KAAA;AACvB,EAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,QAAA,GAAW,EAAA;AAEf,EAAA,KAAA,IAAS,KAAA,GAAQ,IAAA,CAAK,KAAA,EAAO,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AAChD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAE5B,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,WAAA,CAAY,MAAK,EAAG;AAC3C,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,QAAA,GAAW,GAAA;AACX,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,IAAa,YAAY,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAA,GAAO,QAAA;AACb,IAAA,MAAM,EAAA,GAAK,QAAA,GAAW,SAAA,CAAU,QAAA,GAAW,CAAA;AAE3C,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAC9B,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA;AAC1B,MAAA,MAAM,YAAA,GAAe,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAC,CAAA;AAExD,MAAA,IAAI,YAAA,IAAgB,CAAC,SAAA,CAAU,EAAA,CAAG,YAAY,CAAA,EAAG;AAC/C,QAAA,MAAA,CAAO,KAAK,QAAA,CAAS,MAAA,CAAO,MAAM,EAAA,CAAG,YAAA,CAAa,YAAY,CAAC,CAAA;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AACF;AAQO,SAAS,sBAAA,CACd,WACA,gBAAA,EACe;AACf,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,gBAAgB,CAAA;AAExC,EAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,IAAA,SAAA,CAAU,WAAA,CAAY,CAAC,IAAA,EAAc,GAAA,KAAgB;AACnD,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/B,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA;AAAA,MAC5B;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,GAAA,EAAI,GAAI,SAAA;AAC5B,IAAA,IAAI,QAAQ,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AACvC,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,SAAQ,GAAI,SAAA;AACpB,EAAA,MAAM,IAAA,GAAO,WAAW,OAAO,CAAA;AAE/B,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,WAAW,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACtD,IAAA,IAAI,YAAY,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/C,MAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,UAAU,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAC9C,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,0BAAA;AAAA,IAA2B,OAAA;AAAA,IAAS,CAAC,IAAA,KACtD,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAK,IAAI;AAAA,GAC5B;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,CAAW,MAAM,GAAA,EAAK,UAAA,CAAW,KAAK,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AACrE,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,KAAA,EAAO,GAAG,CAAC,CAAA;AAC3C;AAEO,SAAS,sBAAsB,MAAA,EAA0B;AAC9D,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,MAAA,CAAO,KAAA;AACvB,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,OAAO,KAAA,CAAM,SAAA;AAElC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,EAAA,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,MAAM,GAAA,KAAQ;AACxC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEnB,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;ACrmBO,IAAM,kBAAqD,CAAC;AAAA,EACjE;AACF,CAAA,KAAM;AACJ,EAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEnC,EAAA,uBACEH,GAAAA,CAAC,KAAA,EAAA,EACE,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,qBACnBI,IAAAA,CAAC,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,KAAA,GAAQ,CAAA,oBAAKJ,GAAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,oBACpBA,GAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAI;AAAA,GAAA,EAAA,EAFG,KAGf,CACD,CAAA,EACH,CAAA;AAEJ,CAAA;AAEO,IAAM,MAAA,GAASK,UAAAA;AAAA,EACpB,CACE;AAAA,IACE,SAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA,GAAc,IAAA;AAAA,IACd,YAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,SAAA,GAAYC,OAAAA;AAAA,MAChB,MAAM,iBAAA,CAAkB,EAAE,YAAA,EAAc,CAAA;AAAA,MACxC,CAAC,YAAY;AAAA,KACf;AAEA,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,WAAA,EAAa;AAC5B,MAAA,uBACEN,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,WAAA,EAAU,eAAA;AAAA,UACV,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,SAAS,CAAA;AAAA,UACxC,GAAA;AAAA,UACA,YAAA,EAAY,OAAA;AAAA,UACZ,WAAA,EAAW,IAAA;AAAA,UACV,GAAG,KAAA;AAAA,UAEH;AAAA;AAAA,OACH;AAAA,IAEJ;AAEA,IAAA,uBACEI,IAAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,GAAA,EACd,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,WAAA,EAAU,eAAA;AAAA,UACV,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,SAAS,CAAA;AAAA,UACxC,GAAA;AAAA,UACA,YAAA,EAAY,OAAA;AAAA,UACZ,WAAA,EAAW,IAAA;AAAA,UACV,GAAG,KAAA;AAAA,UAEH;AAAA;AAAA,OACH;AAAA,sBACAI,KAAC,cAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,wBACDJ,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAsB;AAAA,OAAA,EACzC;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;AC5FrB,SAAS,OAAA,CAAQ;AAAA,EACf,GAAG;AACL,CAAA,EAAuD;AACrD,EAAA,uBAAOA,GAAAA,CAAkB,gBAAA,CAAA,IAAA,EAAjB,EAAuB,GAAG,KAAA,EAAO,CAAA;AAC3C;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBAAOA,GAAAA,CAAkB,gBAAA,CAAA,OAAA,EAAjB,EAA0B,GAAG,KAAA,EAAO,CAAA;AAC9C;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,SAAA;AAAA,EACA,KAAA,GAAQ,QAAA;AAAA,EACR,UAAA,GAAa,CAAA;AAAA,EACb,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBACEA,GAAAA,CAAkB,gBAAA,CAAA,MAAA,EAAjB,EACC,QAAA,kBAAAA,GAAAA;AAAA,IAAkB,gBAAA,CAAA,OAAA;AAAA,IAAjB;AAAA,MACC,KAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,gBAAA,EAAkB,SAAS,CAAA;AAAA,MACxC,GAAG;AAAA;AAAA,GACN,EACF,CAAA;AAEJ;AC7BO,IAAM,WAAWO,IAAAA,CAAK,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,KAAgB;AAClE,EAAA,uBACEP,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,SAAA;AAAA,MACA,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MACL,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,+BAAA;AAAA,UACF,MAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAY,GAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,GACF;AAEJ,CAAC,CAAA;AAED,QAAA,CAAS,WAAA,GAAc,UAAA;ACAhB,SAAS,QAAA,CAAS;AAAA,EACvB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,SAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,OAAyB,IAAI,CAAA;AAE9C,EAAAW,UAAU,MAAM;AACd,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAY,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,KAAK,CAAC,SAAA;AAE7C,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,aAAa,MAAM,CAAA;AAEnC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA,CAAO,QAAQ,OAAO,CAAA;AAElD,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AACrB,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAG,GAAI,OAAO,KAAA,CAAM,SAAA;AAClC,QAAA,MAAA,CAAO,IAAA,CAAK,QAAA;AAAA,UACV,MAAA,CAAO,KAAA,CAAM,EAAA,CAAG,WAAA,CAAY,MAAM,EAAA,EAAI;AAAA,YACpC,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAO,MAAM;AAAA,WACvC;AAAA,SACH;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA,OAAA,EAAQ;AAAA,IACV,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,KAAK,CAAA;AAAA,IACrD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA6C;AAClE,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,KAAK,YAAA,EAAa;AAAA,IACpB;AACA,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA;AAEA,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,gBAAc,SAAA,EACpD,QAAA,EAAA;AAAA,sBAAAJ,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAU,wBAAA;AAAA,UACV,WAAA,EAAY,UAAA;AAAA,UACZ,KAAA,EAAO,MAAA;AAAA,UACP,QAAA,EAAU,SAAA;AAAA,UACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AACxB,YAAA,QAAA,CAAS,IAAI,CAAA;AAAA,UACf,CAAA;AAAA,UACA,SAAA,EAAW;AAAA;AAAA,OACb;AAAA,sBAEAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,yBAAA;AAAA,UACV,YAAA,EAAW,IAAA;AAAA,UACX,UAAU,CAAC,SAAA;AAAA,UACX,OAAA,EAAS,MAAM,KAAK,YAAA,EAAa;AAAA,UAEjC,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAS;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,IAEC,yBAASA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAA0B,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAC3D,CAAA;AAEJ;ACxHA,IAAM,gBAAA,GAA2C;AAAA,EAC/C,SAAA,EAAW,MAAA;AAAA,EACX,OAAA,EAAS,SAAA;AAAA,EACT,UAAA,EAAY,YAAA;AAAA,EACZ,QAAA,EAAU,WAAA;AAAA,EACV,SAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAA;AAMO,IAAM,WAAA,GAAc,CAAC,KAAA,KAAiC;AAC3D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,EAAA,OAAO,MAAA,CAAO,IAAI,KAAK,CAAA;AACzB;AAOO,IAAM,kBAAA,GAAqB,CAAC,MAAA,KAAkC;AACnE,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AAEpB,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAA,CAAO,KAAA;AAE7B,EAAA,IAAI,qBAAqBS,aAAAA,EAAe;AACtC,IAAA,MAAMC,SAAAA,GAAW,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAA;AACrC,IAAA,OAAO,gBAAA,CAAiBA,SAAQ,CAAA,IAAKA,SAAAA,CAAS,WAAA,EAAY;AAAA,EAC5D;AAEA,EAAA,IAAI,qBAAqBC,aAAAA,EAAe;AACtC,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,SAAQ,GAAI,SAAA;AACpB,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,IAAA;AACrC,EAAA,OAAO,gBAAA,CAAiB,QAAQ,CAAA,IAAK,QAAA,CAAS,WAAA,EAAY;AAC5D;AAKO,IAAM,qBAAA,GAAwB,CAAC,OAAA,MAA0B;AAAA,EAC9D,GAAG,OAAA;AAAA,EACH,OAAA,EAAS,QAAQ,OAAA,EAAS,MAAA;AAAA,IACxB,CAAC,IAAA,KACC,IAAA,CAAK,IAAA,KAAS,WAAA,IACd,KAAK,OAAA,EAAS,IAAA,CAAK,CAAC,KAAA,KAAU,MAAM,IAAA,EAAM,IAAA,EAAK,IAAK,KAAA,CAAM,SAAS,MAAM;AAAA;AAE/E,CAAA;AAKO,SAAS,0BAAA,CACd,eACA,gBAAA,EACkB;AAClB,EAAA,MAAM,YAAA,GAAe,cAAc,qBAAA,EAAsB;AACzD,EAAA,MAAM,eAAA,GAAkB,iBAAiB,qBAAA,EAAsB;AAE/D,EAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,GAAA,GAAM,eAAA,CAAgB,GAAA;AAC5D,EAAA,MAAM,mBAAA,GAAsB,YAAA,CAAa,MAAA,GAAS,eAAA,CAAgB,MAAA;AAElE,EAAA,IAAI,gBAAA,IAAoB,qBAAqB,OAAO,MAAA;AACpD,EAAA,IAAI,kBAAkB,OAAO,KAAA;AAC7B,EAAA,IAAI,qBAAqB,OAAO,QAAA;AAChC,EAAA,OAAO,MAAA;AACT;AAKO,IAAM,gBAAA,GAAmB,CAC9B,MAAA,EACA,SAAA,EACA,oBAA8B,CAAC,aAAA,EAAe,gBAAgB,CAAA,KAClD;AACZ,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,IAAI,CAAC,SAAA,EAAW,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,SAAA;AAEzC,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,MAAM,EAAE,KAAI,GAAI,KAAA;AAChB,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,EAAA,EAAG,GAAI,SAAA;AAE5B,EAAA,MAAM,gBAAA,GACJ,CAAC,GAAA,CAAI,WAAA,CAAY,MAAM,EAAE,CAAA,CAAE,MAAA,IAAU,eAAA,CAAgB,SAAS,CAAA;AAChE,EAAA,MAAM,WAAA,GACJ,SAAA,CAAU,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAA,IAChC,eAAA,CAAgB,SAAS,CAAA,IAAK,SAAA,CAAU,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA;AAC1D,EAAA,MAAM,cAAA,GACJ,gBAAgB,SAAS,CAAA,IACzB,kBAAkB,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AACrD,EAAA,MAAM,cAAc,SAAA,YAAqBA,aAAAA;AAEzC,EAAA,OACE,CAAC,SACD,CAAC,gBAAA,IACD,CAAC,WAAA,IACD,CAAC,kBACD,CAAC,WAAA;AAEL;AAQO,IAAM,oBAAA,GAAuB,CAAC,MAAA,KAAmC;AACtE,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,MAAM,EAAE,WAAU,GAAI,KAAA;AACtB,EAAA,MAAM,UACJ,eAAA,CAAgB,SAAS,CAAA,IACzB,CAAC,UAAU,KAAA,IACX,CAAC,SAAA,CAAU,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,IAClC,CAAC,gBAAgB,SAAS,CAAA;AAE5B,EAAA,OAAO,OAAA;AACT;AAKO,IAAM,wBAAA,GAA2B,CAAC,MAAA,KAAmC;AAC1E,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,IAAA;AACzB,EAAA,MAAM,EAAE,WAAU,GAAI,KAAA;AACtB,EAAA,MAAM,EAAE,QAAO,GAAI,SAAA;AAEnB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA;AAC/D,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AAE3D,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AACrC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO,KAAK,qBAAA,EAAsB;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAC3C;AAKO,IAAM,SAAA,GAAY,CAAC,IAAA,KAAiB;AACzC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,wBAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,IAAA,CAAM,QAAQ,CAAA,IAAK,IAAA,CAAA;AAC3C,IAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,EAChB;AAEA,EAAA,MAAM,cAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,GAAA,GAAW,GAAA;AACpD,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,iBAAiB,EAAE,CAAA;AAC7C,EAAA,MAAM,WAAW,EAAA,CAAG,QAAA,EAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAC9C,EAAA,OAAO,mBAAmB,QAAQ,CAAA,IAAA,CAAA;AACpC;AClHO,IAAM,QAAA,GAAWN,UAAAA;AAAA,EACtB,CACE;AAAA,IACE,MAAA,EAAQ,cAAA;AAAA,IACR,MAAA,EAAQ,cAAA;AAAA,IACR,mBAAA,GAAsB,IAAA;AAAA,IACtB,OAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,eAAA,CAAgB,cAAc,CAAA;AACjD,IAAA,MAAM,EAAE,YAAA,EAAa,GAAI,YAAA,CAAa,MAAM,CAAA;AAC5C,IAAA,MAAM,gBAAgB,WAAA,EAAY;AAClC,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIR,SAAS,KAAK,CAAA;AAC1C,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAElD,IAAA,MAAM,SAAS,cAAA,IAAkB,aAAA;AACjC,IAAA,MAAM,SAAA,GAAY,QAAQ,OAAA,KAAY,KAAA;AAEtC,IAAAW,UAAU,MAAM;AACd,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,mBAAmB,MAAM;AAC7B,QAAA,aAAA;AAAA,UACE,kBAAA,CAAmB;AAAA,YACjB,OAAA,EAAS,SAAA;AAAA,YACT,iBAAA,EAAmB,iBAAiB,MAAM,CAAA;AAAA,YAC1C,mBAAA;AAAA,YACA,YAAY,MAAA,CAAO;AAAA,WACpB;AAAA,SACH;AAAA,MACF,CAAA;AAEA,MAAA,gBAAA,EAAiB;AACjB,MAAA,MAAA,CAAO,EAAA,CAAG,mBAAmB,gBAAgB,CAAA;AAE7C,MAAA,OAAO,MAAM;AACX,QAAA,MAAA,CAAO,GAAA,CAAI,mBAAmB,gBAAgB,CAAA;AAAA,MAChD,CAAA;AAAA,IACF,CAAA,EAAG,CAAC,MAAA,EAAQ,mBAAA,EAAqB,SAAS,CAAC,CAAA;AAE3C,IAAA,MAAM,gBAAA,GAAmBI,WAAAA;AAAA,MACvB,CAAC,IAAA,KAAkB;AACjB,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MAChB,CAAA;AAAA,MACA;AAAC,KACH;AAEA,IAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,MAClB,CAAC,KAAA,KAA+C;AAC9C,QAAA,OAAA,GAAU,KAAK,CAAA;AACf,QAAA,IAAI,CAAC,MAAM,gBAAA,EAAkB;AAC3B,UAAA,SAAA,CAAU,IAAI,CAAA;AAAA,QAChB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,OAAO;AAAA,KACV;AAEA,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,MAAA,IAAU,CAAC,MAAA,EAAQ;AACrC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,uBACER,IAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,cAAc,gBAAA,EACnC,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAQ,OAAA;AAAA,UACR,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,EAAA;AAAA,UACV,YAAA,EAAW,cAAA;AAAA,UACX,OAAA,EAAQ,cAAA;AAAA,UACR,OAAA,EAAS,WAAA;AAAA,UACR,GAAG,WAAA;AAAA,UAEJ,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,oBAAA,EAAqB;AAAA;AAAA,OAC/C,EACF,CAAA;AAAA,sBAGAA,IAAC,cAAA,EAAA,EAAe,IAAA,EAAK,OAAM,KAAA,EAAM,OAAA,EAAQ,UAAA,EAAY,CAAA,EACnD,QAAA,kBAAAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,MAAA;AAAA,UACA,YAAA;AAAA,UACA,OAAA,EAAS,MAAM,gBAAA,CAAiB,KAAK;AAAA;AAAA,OACvC,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-QMYT5WXO.js","sourcesContent":["import type { Editor } from \"@tiptap/react\"\nimport { useCurrentEditor, useEditorState } from \"@tiptap/react\"\nimport { useEffect, useState } from \"react\"\n\nfunction getActivePageEditor(editor: Editor): Editor | null {\n const storage = editor.storage as unknown as Record<string, unknown>\n const pages = storage.pages as { activeEditor?: Editor | null } | undefined\n if (!pages || !(\"activeEditor\" in pages)) return null\n return pages.activeEditor ?? null\n}\n\nexport function useTiptapEditor(providedEditor?: Editor | null): {\n editor: Editor | null\n editorState?: Editor[\"state\"]\n canCommand?: Editor[\"can\"]\n} {\n const { editor: coreEditor } = useCurrentEditor()\n const mainEditor = providedEditor ?? coreEditor\n\n const [storageEditor, setStorageEditor] = useState<Editor | null>(null)\n\n useEffect(() => {\n if (!mainEditor) {\n setStorageEditor(null)\n return\n }\n\n const updateHandler = () =>\n setStorageEditor(getActivePageEditor(mainEditor))\n\n updateHandler()\n\n mainEditor.on(\"update\", updateHandler)\n mainEditor.on(\"selectionUpdate\", updateHandler)\n\n return () => {\n mainEditor.off(\"update\", updateHandler)\n mainEditor.off(\"selectionUpdate\", updateHandler)\n }\n }, [mainEditor])\n\n useEffect(() => {\n if (!storageEditor) return\n\n const handleDestroy = () => setStorageEditor(null)\n\n storageEditor.on(\"destroy\", handleDestroy)\n return () => {\n storageEditor.off(\"destroy\", handleDestroy)\n }\n }, [storageEditor])\n\n const editorState = useEditorState({\n editor: storageEditor ?? mainEditor,\n selector(context) {\n if (!context.editor) {\n return { editor: null, editorState: undefined, canCommand: undefined }\n }\n\n return {\n editor: context.editor,\n editorState: context.editor.state,\n canCommand: context.editor.can,\n }\n },\n })\n\n return editorState ?? { editor: null }\n}\n","import { useCallback } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\nimport type { AIContextData } from \"./types\"\n\nconst CONTEXT_WINDOW_SIZE = 300\n\n/**\n * Extract text content from a Tiptap node recursively\n */\nfunction extractTextFromNode(node: any): string {\n if (node.isText) {\n return node.text || \"\"\n }\n if (node.content) {\n return node.content.map(extractTextFromNode).join(\"\")\n }\n return \"\"\n}\n\n/**\n * Get text at a specific position in the document\n */\nfunction getTextAtPosition(editor: Editor, pos: number, length: number): string {\n try {\n const { from, to } = editor.state.selection\n const $from = editor.state.doc.resolve(Math.max(1, pos - length))\n const $to = editor.state.doc.resolve(Math.min(editor.state.doc.content.size, pos + length))\n return editor.state.doc.textBetween($from.pos, $to.pos, \"\\n\", \" \")\n } catch {\n return \"\"\n }\n}\n\n/**\n * Get the node type at the current selection\n */\nfunction getNodeTypeAtSelection(editor: Editor): string | undefined {\n const { from } = editor.state.selection\n const $from = editor.state.doc.resolve(from)\n return $from.parent.type.name\n}\n\n/**\n * Get the heading level if the selection is inside a heading\n */\nfunction getHeadingLevel(editor: Editor): number | undefined {\n const { from } = editor.state.selection\n const $from = editor.state.doc.resolve(from)\n\n for (let d = $from.depth; d > 0; d--) {\n const node = $from.node(d)\n const match = node.type.name.match(/heading(\\d)/)\n if (match) {\n return parseInt(match[1], 10)\n }\n }\n\n return undefined\n}\n\n/**\n * Get the full document as text\n */\nfunction getFullDocument(editor: Editor): string {\n return editor.state.doc.textContent\n}\n\nexport function useAIContext(editor: Editor | null) {\n const buildContext = useCallback(\n (prompt: string): AIContextData | null => {\n if (!editor) {\n return null\n }\n\n const { from, to } = editor.state.selection\n const selectedText = editor.state.doc.textBetween(from, to)\n\n if (!selectedText) {\n return null\n }\n\n // Get the line and column number (simplified: count newlines before selection)\n const textBefore = editor.state.doc.textBetween(0, from)\n const lines = textBefore.split(\"\\n\")\n const line = lines.length\n const column = lines[lines.length - 1].length\n\n // Get surrounding context\n const precedingPos = Math.max(1, from - CONTEXT_WINDOW_SIZE)\n const followingPos = Math.min(editor.state.doc.content.size, to + CONTEXT_WINDOW_SIZE)\n\n const precedingText = editor.state.doc.textBetween(precedingPos, from)\n const followingText = editor.state.doc.textBetween(to, followingPos)\n\n return {\n prompt,\n selectedText,\n position: {\n line,\n column,\n },\n precedingText,\n followingText,\n nodeType: getNodeTypeAtSelection(editor),\n currentHeadingLevel: getHeadingLevel(editor),\n fullDocument: getFullDocument(editor),\n documentFormat: \"markdown\",\n }\n },\n [editor]\n )\n\n return { buildContext }\n}\n","import { createContext, useContext } from \"react\"\nimport type { AIPluginConfig } from \"./types\"\n\nexport const AIConfigContext = createContext<AIPluginConfig | null>(null)\n\nexport function useAIConfig(): AIPluginConfig | null {\n return useContext(AIConfigContext)\n}\n","export interface AIButtonVisibilityInput {\n /** 插件配置里的开关(`enabled !== false`)。 */\n enabled: boolean\n /** 「没得用就藏起来」。 */\n hideWhenUnavailable: boolean\n /** 编辑器是否可编辑。 */\n isEditable: boolean\n /** 当前选区是否可以拿去问 AI。 */\n hasValidSelection: boolean\n}\n\n/**\n * AI 按钮该不该渲染。\n *\n * 抽成纯函数不是为了复用,是为了能测 —— 这个判断写在组件里时曾经把\n * `hideWhenUnavailable` 取反用(`!hideWhenUnavailable && hasValidSelection`),\n * 于是工具栏传 `true` 的那条路上按钮**永远**渲染不出来,而构建、类型、\n * 导出检查全是绿的。一个布尔取反,静态手段一个都拦不住。\n */\nexport const shouldShowAIButton = ({\n enabled,\n hideWhenUnavailable,\n isEditable,\n hasValidSelection,\n}: AIButtonVisibilityInput): boolean =>\n enabled && (hideWhenUnavailable ? hasValidSelection : isEditable)\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\nexport const SparklesIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M12 3L13.6392 8.20749C13.8353 8.83063 13.9333 9.14219 14.0982 9.40653C14.2442 9.64066 14.4276 9.84607 14.6402 10.0143C14.8802 10.2042 15.1679 10.3345 15.7434 10.5952L20.5 12L15.7434 13.4048C15.1679 13.6655 14.8802 13.7958 14.6402 13.9857C14.4276 14.1539 14.2442 14.3593 14.0982 14.5935C13.9333 14.8578 13.8353 15.1694 13.6392 15.7925L12 21L10.3608 15.7925C10.1647 15.1694 10.0667 14.8578 9.90182 14.5935C9.75583 14.3593 9.57241 14.1539 9.35983 13.9857C9.11985 13.7958 8.83209 13.6655 8.25659 13.4048L3.5 12L8.25659 10.5952C8.83209 10.3345 9.11985 10.2042 9.35983 10.0143C9.57241 9.84607 9.75583 9.64066 9.90182 9.40653C10.0667 9.14219 10.1647 8.83063 10.3608 8.20749L12 3Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M18.5 3.5L18.9 4.85C19 5.15 19.05 5.3 19.14 5.42C19.21 5.53 19.31 5.63 19.42 5.7C19.54 5.79 19.69 5.84 19.99 5.94L21.34 6.34L19.99 6.74C19.69 6.84 19.54 6.89 19.42 6.98C19.31 7.05 19.21 7.15 19.14 7.26C19.05 7.38 19 7.53 18.9 7.83L18.5 9.18L18.1 7.83C18 7.53 17.95 7.38 17.86 7.26C17.79 7.15 17.69 7.05 17.58 6.98C17.46 6.89 17.31 6.84 17.01 6.74L15.66 6.34L17.01 5.94C17.31 5.84 17.46 5.79 17.58 5.7C17.69 5.63 17.79 5.53 17.86 5.42C17.95 5.3 18 5.15 18.1 4.85L18.5 3.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n})\n\nSparklesIcon.displayName = \"SparklesIcon\"\n","import {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useMemo,\n useState,\n version,\n} from \"react\"\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n useHover,\n useFocus,\n useDismiss,\n useRole,\n useInteractions,\n useMergeRefs,\n FloatingPortal,\n type Placement,\n type UseFloatingReturn,\n type ReferenceType,\n FloatingDelayGroup,\n} from \"@floating-ui/react\"\nimport \"./tooltip.scss\"\n\ninterface TooltipProviderProps {\n children: React.ReactNode\n initialOpen?: boolean\n placement?: Placement\n open?: boolean\n onOpenChange?: (open: boolean) => void\n delay?: number\n closeDelay?: number\n timeout?: number\n useDelayGroup?: boolean\n}\n\ninterface TooltipTriggerProps extends Omit<\n React.HTMLProps<HTMLElement>,\n \"ref\"\n> {\n asChild?: boolean\n children: React.ReactNode\n}\n\ninterface TooltipContentProps extends Omit<\n React.HTMLProps<HTMLDivElement>,\n \"ref\"\n> {\n children?: React.ReactNode\n portal?: boolean\n portalProps?: Omit<React.ComponentProps<typeof FloatingPortal>, \"children\">\n}\n\ninterface TooltipContextValue extends UseFloatingReturn<ReferenceType> {\n open: boolean\n setOpen: (open: boolean) => void\n getReferenceProps: (\n userProps?: React.HTMLProps<HTMLElement>\n ) => Record<string, unknown>\n getFloatingProps: (\n userProps?: React.HTMLProps<HTMLDivElement>\n ) => Record<string, unknown>\n}\n\nfunction useTooltip({\n initialOpen = false,\n placement = \"top\",\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n delay = 600,\n closeDelay = 0,\n}: Omit<TooltipProviderProps, \"children\"> = {}) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState<boolean>(initialOpen)\n\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = setControlledOpen ?? setUncontrolledOpen\n\n const data = useFloating({\n placement,\n open,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(4),\n flip({\n crossAxis: placement.includes(\"-\"),\n fallbackAxisSideDirection: \"start\",\n padding: 4,\n }),\n shift({ padding: 4 }),\n ],\n })\n\n const context = data.context\n\n const hover = useHover(context, {\n mouseOnly: true,\n move: false,\n restMs: delay,\n enabled: controlledOpen == null,\n delay: {\n close: closeDelay,\n },\n })\n const focus = useFocus(context, {\n enabled: controlledOpen == null,\n })\n const dismiss = useDismiss(context)\n const role = useRole(context, { role: \"tooltip\" })\n\n const interactions = useInteractions([hover, focus, dismiss, role])\n\n return useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...data,\n }),\n [open, setOpen, interactions, data]\n )\n}\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null)\n\nfunction useTooltipContext() {\n const context = useContext(TooltipContext)\n\n if (context == null) {\n throw new Error(\"Tooltip components must be wrapped in <TooltipProvider />\")\n }\n\n return context\n}\n\nexport function Tooltip({ children, ...props }: TooltipProviderProps) {\n const tooltip = useTooltip(props)\n\n if (!props.useDelayGroup) {\n return (\n <TooltipContext.Provider value={tooltip}>\n {children}\n </TooltipContext.Provider>\n )\n }\n\n return (\n <FloatingDelayGroup\n delay={{ open: props.delay ?? 0, close: props.closeDelay ?? 0 }}\n timeoutMs={props.timeout}\n >\n <TooltipContext.Provider value={tooltip}>\n {children}\n </TooltipContext.Provider>\n </FloatingDelayGroup>\n )\n}\n\nexport const TooltipTrigger = forwardRef<HTMLElement, TooltipTriggerProps>(\n function TooltipTrigger({ children, asChild = false, ...props }, propRef) {\n const context = useTooltipContext()\n const childrenRef = isValidElement(children)\n ? parseInt(version, 10) >= 19\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (children as { props: { ref?: React.Ref<any> } }).props.ref\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (children as any).ref\n : undefined\n const ref = useMergeRefs([context.refs.setReference, propRef, childrenRef])\n\n if (asChild && isValidElement(children)) {\n const dataAttributes = {\n \"data-tooltip-state\": context.open ? \"open\" : \"closed\",\n }\n\n return cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...(typeof children.props === \"object\" ? children.props : {}),\n ...dataAttributes,\n })\n )\n }\n\n return (\n <button\n ref={ref}\n data-tooltip-state={context.open ? \"open\" : \"closed\"}\n {...context.getReferenceProps(props)}\n >\n {children}\n </button>\n )\n }\n)\n\nexport const TooltipContent = forwardRef<HTMLDivElement, TooltipContentProps>(\n function TooltipContent(\n { style, children, portal = true, portalProps = {}, ...props },\n propRef\n ) {\n const context = useTooltipContext()\n const ref = useMergeRefs([context.refs.setFloating, propRef])\n\n if (!context.open) return null\n\n const content = (\n <div\n ref={ref}\n style={{\n ...context.floatingStyles,\n ...style,\n }}\n {...context.getFloatingProps(props)}\n className=\"tiptap-tooltip\"\n >\n {children}\n </div>\n )\n\n if (portal) {\n return <FloatingPortal {...portalProps}>{content}</FloatingPortal>\n }\n\n return content\n }\n)\n\nTooltip.displayName = \"Tooltip\"\nTooltipTrigger.displayName = \"TooltipTrigger\"\nTooltipContent.displayName = \"TooltipContent\"\n","import type { Node as PMNode } from \"@tiptap/pm/model\"\nimport type { Transaction } from \"@tiptap/pm/state\"\nimport {\n AllSelection,\n NodeSelection,\n Selection,\n TextSelection,\n} from \"@tiptap/pm/state\"\nimport { cellAround, CellSelection } from \"@tiptap/pm/tables\"\nimport {\n findParentNodeClosestToPos,\n type Editor,\n type NodeWithPos,\n} from \"@tiptap/react\"\n\nexport const MAX_FILE_SIZE = 5 * 1024 * 1024 // 5MB\n\nexport const MAC_SYMBOLS: Record<string, string> = {\n mod: \"⌘\",\n command: \"⌘\",\n meta: \"⌘\",\n ctrl: \"⌃\",\n control: \"⌃\",\n alt: \"⌥\",\n option: \"⌥\",\n shift: \"⇧\",\n backspace: \"Del\",\n delete: \"⌦\",\n enter: \"⏎\",\n escape: \"⎋\",\n capslock: \"⇪\",\n} as const\n\nexport const SR_ONLY = {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: 0,\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n borderWidth: 0,\n} as const\n\nexport function cn(\n ...classes: (string | boolean | undefined | null)[]\n): string {\n return classes.filter(Boolean).join(\" \")\n}\n\n/**\n * Determines if the current platform is macOS\n * @returns boolean indicating if the current platform is Mac\n */\nexport function isMac(): boolean {\n return (\n typeof navigator !== \"undefined\" &&\n navigator.platform.toLowerCase().includes(\"mac\")\n )\n}\n\n/**\n * Formats a shortcut key based on the platform (Mac or non-Mac)\n * @param key - The key to format (e.g., \"ctrl\", \"alt\", \"shift\")\n * @param isMac - Boolean indicating if the platform is Mac\n * @param capitalize - Whether to capitalize the key (default: true)\n * @returns Formatted shortcut key symbol\n */\nexport const formatShortcutKey = (\n key: string,\n isMac: boolean,\n capitalize: boolean = true\n) => {\n if (isMac) {\n const lowerKey = key.toLowerCase()\n return MAC_SYMBOLS[lowerKey] || (capitalize ? key.toUpperCase() : key)\n }\n\n return capitalize ? key.charAt(0).toUpperCase() + key.slice(1) : key\n}\n\n/**\n * Parses a shortcut key string into an array of formatted key symbols\n * @param shortcutKeys - The string of shortcut keys (e.g., \"ctrl-alt-shift\")\n * @param delimiter - The delimiter used to split the keys (default: \"-\")\n * @param capitalize - Whether to capitalize the keys (default: true)\n * @returns Array of formatted shortcut key symbols\n */\nexport const parseShortcutKeys = (props: {\n shortcutKeys: string | undefined\n delimiter?: string\n capitalize?: boolean\n}) => {\n const { shortcutKeys, delimiter = \"+\", capitalize = true } = props\n\n if (!shortcutKeys) return []\n\n return shortcutKeys\n .split(delimiter)\n .map((key) => key.trim())\n .map((key) => formatShortcutKey(key, isMac(), capitalize))\n}\n\n/**\n * Checks if a mark exists in the editor schema\n * @param markName - The name of the mark to check\n * @param editor - The editor instance\n * @returns boolean indicating if the mark exists in the schema\n */\nexport const isMarkInSchema = (\n markName: string,\n editor: Editor | null\n): boolean => {\n if (!editor?.schema) return false\n return editor.schema.spec.marks.get(markName) !== undefined\n}\n\n/**\n * Checks if a node exists in the editor schema\n * @param nodeName - The name of the node to check\n * @param editor - The editor instance\n * @returns boolean indicating if the node exists in the schema\n */\nexport const isNodeInSchema = (\n nodeName: string,\n editor: Editor | null\n): boolean => {\n if (!editor?.schema) return false\n return editor.schema.spec.nodes.get(nodeName) !== undefined\n}\n\n/**\n * Moves the focus to the next node in the editor\n * @param editor - The editor instance\n * @returns boolean indicating if the focus was moved\n */\nexport function focusNextNode(editor: Editor) {\n const { state, view } = editor\n const { doc, selection } = state\n\n const nextSel = Selection.findFrom(selection.$to, 1, true)\n if (nextSel) {\n view.dispatch(state.tr.setSelection(nextSel).scrollIntoView())\n return true\n }\n\n const paragraphType = state.schema.nodes.paragraph\n if (!paragraphType) {\n console.warn(\"No paragraph node type found in schema.\")\n return false\n }\n\n const end = doc.content.size\n const para = paragraphType.create()\n let tr = state.tr.insert(end, para)\n\n // Place the selection inside the new paragraph\n const $inside = tr.doc.resolve(end + 1)\n tr = tr.setSelection(TextSelection.near($inside)).scrollIntoView()\n view.dispatch(tr)\n return true\n}\n\n/**\n * Checks if a value is a valid number (not null, undefined, or NaN)\n * @param value - The value to check\n * @returns boolean indicating if the value is a valid number\n */\nexport function isValidPosition(pos: number | null | undefined): pos is number {\n return typeof pos === \"number\" && pos >= 0\n}\n\n/**\n * Checks if one or more extensions are registered in the Tiptap editor.\n * @param editor - The Tiptap editor instance\n * @param extensionNames - A single extension name or an array of names to check\n * @returns True if at least one of the extensions is available, false otherwise\n */\nexport function isExtensionAvailable(\n editor: Editor | null,\n extensionNames: string | string[]\n): boolean {\n if (!editor) return false\n\n const names = Array.isArray(extensionNames)\n ? extensionNames\n : [extensionNames]\n\n const found = names.some((name) =>\n editor.extensionManager.extensions.some((ext) => ext.name === name)\n )\n\n if (!found) {\n console.warn(\n `None of the extensions [${names.join(\", \")}] were found in the editor schema. Ensure they are included in the editor configuration.`\n )\n }\n\n return found\n}\n\n/**\n * Finds a node at the specified position with error handling\n * @param editor The Tiptap editor instance\n * @param position The position in the document to find the node\n * @returns The node at the specified position, or null if not found\n */\nexport function findNodeAtPosition(editor: Editor, position: number) {\n try {\n const node = editor.state.doc.nodeAt(position)\n if (!node) {\n console.warn(`No node found at position ${position}`)\n return null\n }\n return node\n } catch (error) {\n console.error(`Error getting node at position ${position}:`, error)\n return null\n }\n}\n\n/**\n * Finds the position and instance of a node in the document\n * @param props Object containing editor, node (optional), and nodePos (optional)\n * @param props.editor The Tiptap editor instance\n * @param props.node The node to find (optional if nodePos is provided)\n * @param props.nodePos The position of the node to find (optional if node is provided)\n * @returns An object with the position and node, or null if not found\n */\nexport function findNodePosition(props: {\n editor: Editor | null\n node?: PMNode | null\n nodePos?: number | null\n}): { pos: number; node: PMNode } | null {\n const { editor, node, nodePos } = props\n\n if (!editor || !editor.state?.doc) return null\n\n // Zero is valid position\n const hasValidNode = node !== undefined && node !== null\n const hasValidPos = isValidPosition(nodePos)\n\n if (!hasValidNode && !hasValidPos) {\n return null\n }\n\n // First search for the node in the document if we have a node\n if (hasValidNode) {\n let foundPos = -1\n let foundNode: PMNode | null = null\n\n editor.state.doc.descendants((currentNode, pos) => {\n // TODO: Needed?\n // if (currentNode.type && currentNode.type.name === node!.type.name) {\n if (currentNode === node) {\n foundPos = pos\n foundNode = currentNode\n return false\n }\n return true\n })\n\n if (foundPos !== -1 && foundNode !== null) {\n return { pos: foundPos, node: foundNode }\n }\n }\n\n // If we have a valid position, use findNodeAtPosition\n if (hasValidPos) {\n const nodeAtPos = findNodeAtPosition(editor, nodePos!)\n if (nodeAtPos) {\n return { pos: nodePos!, node: nodeAtPos }\n }\n }\n\n return null\n}\n\n/**\n * Determines whether the current selection contains a node whose type matches\n * any of the provided node type names.\n * @param editor Tiptap editor instance\n * @param nodeTypeNames List of node type names to match against\n * @param checkAncestorNodes Whether to check ancestor node types up the depth chain\n */\nexport function isNodeTypeSelected(\n editor: Editor | null,\n nodeTypeNames: string[] = [],\n checkAncestorNodes: boolean = false\n): boolean {\n if (!editor || !editor.state.selection) return false\n\n const { selection } = editor.state\n if (selection.empty) return false\n\n // Direct node selection check\n if (selection instanceof NodeSelection) {\n const selectedNode = selection.node\n return selectedNode ? nodeTypeNames.includes(selectedNode.type.name) : false\n }\n\n // Depth-based ancestor node check\n if (checkAncestorNodes) {\n const { $from } = selection\n for (let depth = $from.depth; depth > 0; depth--) {\n const ancestorNode = $from.node(depth)\n if (nodeTypeNames.includes(ancestorNode.type.name)) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Check whether the current selection is fully within nodes\n * whose type names are in the provided `types` list.\n *\n * - NodeSelection → checks the selected node.\n * - Text/AllSelection → ensures all textblocks within [from, to) are allowed.\n */\nexport function selectionWithinConvertibleTypes(\n editor: Editor,\n types: string[] = []\n): boolean {\n if (!editor || types.length === 0) return false\n\n const { state } = editor\n const { selection } = state\n const allowed = new Set(types)\n\n if (selection instanceof NodeSelection) {\n const nodeType = selection.node?.type?.name\n return !!nodeType && allowed.has(nodeType)\n }\n\n if (selection instanceof TextSelection || selection instanceof AllSelection) {\n let valid = true\n state.doc.nodesBetween(selection.from, selection.to, (node) => {\n if (node.isTextblock && !allowed.has(node.type.name)) {\n valid = false\n return false // stop early\n }\n return valid\n })\n return valid\n }\n\n return false\n}\n\n/**\n * Handles image upload with progress tracking and abort capability\n * @param file The file to upload\n * @param onProgress Optional callback for tracking upload progress\n * @param abortSignal Optional AbortSignal for cancelling the upload\n * @returns Promise resolving to the URL of the uploaded image\n */\nexport const handleImageUpload = async (\n file: File,\n onProgress?: (event: { progress: number }) => void,\n abortSignal?: AbortSignal\n): Promise<string> => {\n // Validate file\n if (!file) {\n throw new Error(\"No file provided\")\n }\n\n if (file.size > MAX_FILE_SIZE) {\n throw new Error(\n `File size exceeds maximum allowed (${MAX_FILE_SIZE / (1024 * 1024)}MB)`\n )\n }\n\n // For demo/testing: Simulate upload progress. In production, replace the following code\n // with your own upload implementation.\n for (let progress = 0; progress <= 100; progress += 10) {\n if (abortSignal?.aborted) {\n throw new Error(\"Upload cancelled\")\n }\n await new Promise((resolve) => setTimeout(resolve, 500))\n onProgress?.({ progress })\n }\n\n return \"/images/tiptap-ui-placeholder-image.jpg\"\n}\n\ntype ProtocolOptions = {\n /**\n * The protocol scheme to be registered.\n * @default '''\n * @example 'ftp'\n * @example 'git'\n */\n scheme: string\n\n /**\n * If enabled, it allows optional slashes after the protocol.\n * @default false\n * @example true\n */\n optionalSlashes?: boolean\n}\n\ntype ProtocolConfig = Array<ProtocolOptions | string>\n\nconst ATTR_WHITESPACE =\n // eslint-disable-next-line no-control-regex\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g\n\nexport function isAllowedUri(\n uri: string | undefined,\n protocols?: ProtocolConfig\n) {\n const allowedProtocols: string[] = [\n \"http\",\n \"https\",\n \"ftp\",\n \"ftps\",\n \"mailto\",\n \"tel\",\n \"callto\",\n \"sms\",\n \"cid\",\n \"xmpp\",\n ]\n\n if (protocols) {\n protocols.forEach((protocol) => {\n const nextProtocol =\n typeof protocol === \"string\" ? protocol : protocol.scheme\n\n if (nextProtocol) {\n allowedProtocols.push(nextProtocol)\n }\n })\n }\n\n return (\n !uri ||\n uri.replace(ATTR_WHITESPACE, \"\").match(\n new RegExp(\n // eslint-disable-next-line no-useless-escape\n `^(?:(?:${allowedProtocols.join(\"|\")}):|[^a-z]|[a-z0-9+.\\-]+(?:[^a-z+.\\-:]|$))`,\n \"i\"\n )\n )\n )\n}\n\nexport function sanitizeUrl(\n inputUrl: string,\n baseUrl: string,\n protocols?: ProtocolConfig\n): string {\n try {\n const url = new URL(inputUrl, baseUrl)\n\n if (isAllowedUri(url.href, protocols)) {\n return url.href\n }\n } catch {\n // If URL creation fails, it's considered invalid\n }\n return \"#\"\n}\n\n/**\n * Update a single attribute on multiple nodes.\n *\n * @param tr - The transaction to mutate\n * @param targets - Array of { node, pos }\n * @param attrName - Attribute key to update\n * @param next - New value OR updater function receiving previous value\n * Pass `undefined` to remove the attribute.\n * @returns true if at least one node was updated, false otherwise\n */\nexport function updateNodesAttr<A extends string = string, V = unknown>(\n tr: Transaction,\n targets: readonly NodeWithPos[],\n attrName: A,\n next: V | ((prev: V | undefined) => V | undefined)\n): boolean {\n if (!targets.length) return false\n\n let changed = false\n\n for (const { pos } of targets) {\n // Always re-read from the transaction's current doc\n const currentNode = tr.doc.nodeAt(pos)\n if (!currentNode) continue\n\n const prevValue = (currentNode.attrs as Record<string, unknown>)[\n attrName\n ] as V | undefined\n const resolvedNext =\n typeof next === \"function\"\n ? (next as (p: V | undefined) => V | undefined)(prevValue)\n : next\n\n if (prevValue === resolvedNext) continue\n\n const nextAttrs: Record<string, unknown> = { ...currentNode.attrs }\n if (resolvedNext === undefined) {\n // Remove the key entirely instead of setting null\n delete nextAttrs[attrName]\n } else {\n nextAttrs[attrName] = resolvedNext\n }\n\n tr.setNodeMarkup(pos, undefined, nextAttrs)\n changed = true\n }\n\n return changed\n}\n\n/**\n * Selects the entire content of the current block node if the selection is empty.\n * If the selection is not empty, it does nothing.\n * @param editor The Tiptap editor instance\n */\nexport function selectCurrentBlockContent(editor: Editor) {\n const { selection, doc } = editor.state\n\n if (!selection.empty) return\n\n const $pos = selection.$from\n let blockNode: PMNode | null = null\n let blockPos = -1\n\n for (let depth = $pos.depth; depth >= 0; depth--) {\n const node = $pos.node(depth)\n const pos = $pos.start(depth)\n\n if (node.isBlock && node.textContent.trim()) {\n blockNode = node\n blockPos = pos\n break\n }\n }\n\n if (blockNode && blockPos >= 0) {\n const from = blockPos\n const to = blockPos + blockNode.nodeSize - 2 // -2 to exclude the closing tag\n\n if (from < to) {\n const $from = doc.resolve(from)\n const $to = doc.resolve(to)\n const newSelection = TextSelection.between($from, $to, 1)\n\n if (newSelection && !selection.eq(newSelection)) {\n editor.view.dispatch(editor.state.tr.setSelection(newSelection))\n }\n }\n }\n}\n\n/**\n * Retrieves all nodes of specified types from the current selection.\n * @param selection The current editor selection\n * @param allowedNodeTypes An array of node type names to look for (e.g., [\"image\", \"table\"])\n * @returns An array of objects containing the node and its position\n */\nexport function getSelectedNodesOfType(\n selection: Selection,\n allowedNodeTypes: string[]\n): NodeWithPos[] {\n const results: NodeWithPos[] = []\n const allowed = new Set(allowedNodeTypes)\n\n if (selection instanceof CellSelection) {\n selection.forEachCell((node: PMNode, pos: number) => {\n if (allowed.has(node.type.name)) {\n results.push({ node, pos })\n }\n })\n return results\n }\n\n if (selection instanceof NodeSelection) {\n const { node, from: pos } = selection\n if (node && allowed.has(node.type.name)) {\n results.push({ node, pos })\n }\n return results\n }\n\n const { $anchor } = selection\n const cell = cellAround($anchor)\n\n if (cell) {\n const cellNode = selection.$anchor.doc.nodeAt(cell.pos)\n if (cellNode && allowed.has(cellNode.type.name)) {\n results.push({ node: cellNode, pos: cell.pos })\n return results\n }\n }\n\n // Fallback: find parent nodes of allowed types\n const parentNode = findParentNodeClosestToPos($anchor, (node) =>\n allowed.has(node.type.name)\n )\n\n if (parentNode) {\n results.push({ node: parentNode.node, pos: parentNode.pos })\n }\n\n return results\n}\n\n/**\n * Clamps a value between min and max bounds\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, max))\n}\n\nexport function getSelectedBlockNodes(editor: Editor): PMNode[] {\n const { doc } = editor.state\n const { from, to } = editor.state.selection\n\n const blocks: PMNode[] = []\n const seen = new Set<number>()\n\n doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isBlock) return\n\n if (!seen.has(pos)) {\n seen.add(pos)\n blocks.push(node)\n }\n\n return false\n })\n\n return blocks\n}\n","import { forwardRef, Fragment, useMemo } from \"react\"\n\n// --- Tiptap UI Primitive ---\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../tooltip\"\n\n// --- Lib ---\nimport { cn, parseShortcutKeys } from \"../../../lib/tiptap-utils\"\n\nimport \"./button-colors.scss\"\nimport \"./button.scss\"\n\nexport type ButtonVariant = \"ghost\" | \"primary\"\nexport type ButtonSize = \"small\" | \"default\" | \"large\"\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n showTooltip?: boolean\n tooltip?: React.ReactNode\n shortcutKeys?: string\n variant?: ButtonVariant\n size?: ButtonSize\n}\n\nexport const ShortcutDisplay: React.FC<{ shortcuts: string[] }> = ({\n shortcuts,\n}) => {\n if (shortcuts.length === 0) return null\n\n return (\n <div>\n {shortcuts.map((key, index) => (\n <Fragment key={index}>\n {index > 0 && <kbd>+</kbd>}\n <kbd>{key}</kbd>\n </Fragment>\n ))}\n </div>\n )\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n children,\n tooltip,\n showTooltip = true,\n shortcutKeys,\n variant,\n size,\n ...props\n },\n ref\n ) => {\n const shortcuts = useMemo<string[]>(\n () => parseShortcutKeys({ shortcutKeys }),\n [shortcutKeys]\n )\n\n if (!tooltip || !showTooltip) {\n return (\n <button\n data-slot=\"tiptap-button\"\n className={cn(\"tiptap-button\", className)}\n ref={ref}\n data-style={variant}\n data-size={size}\n {...props}\n >\n {children}\n </button>\n )\n }\n\n return (\n <Tooltip delay={200}>\n <TooltipTrigger\n data-slot=\"tiptap-button\"\n className={cn(\"tiptap-button\", className)}\n ref={ref}\n data-style={variant}\n data-size={size}\n {...props}\n >\n {children}\n </TooltipTrigger>\n <TooltipContent>\n {tooltip}\n <ShortcutDisplay shortcuts={shortcuts} />\n </TooltipContent>\n </Tooltip>\n )\n }\n)\n\nButton.displayName = \"Button\"\n\nexport default Button\n","\"use client\"\n\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\nimport { cn } from \"../../../lib/tiptap-utils\"\nimport \"./popover.scss\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align={align}\n sideOffset={sideOffset}\n className={cn(\"tiptap-popover\", className)}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport { Popover, PopoverTrigger, PopoverContent }\n","import { memo } from \"react\"\n\ntype SvgProps = React.ComponentPropsWithoutRef<\"svg\">\n\n/** 向上的箭头 —— 提交态用,和聊天输入框那颗圆形发送键同义。 */\nexport const SendIcon = memo(({ className, ...props }: SvgProps) => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M12 19V5M12 5L6 11M12 5L18 11\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n})\n\nSendIcon.displayName = \"SendIcon\"\n","\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Types ---\nimport type { AIContextData, AIPluginConfig } from \"./types\"\n\n// --- Icons ---\nimport { SendIcon } from \"../../components/tiptap-icons/send-icon\"\n\nimport \"./ai-dialog.scss\"\n\nexport interface AIDialogProps {\n editor: Editor\n config: AIPluginConfig\n buildContext: (prompt: string) => AIContextData | null\n onClose: () => void\n}\n\n/**\n * 一行输入 + 一颗提交键。\n *\n * 刻意不做成带标题栏和按钮行的卡片:它浮在正文上方紧贴选区,任何一行多余的\n * 装饰都会把用户正在读的那段文字挡掉。同类产品(ChatGPT canvas / Notion AI)\n * 也都收敛成单行胶囊。\n */\nexport function AIDialog({\n editor,\n config,\n buildContext,\n onClose,\n}: AIDialogProps) {\n const [prompt, setPrompt] = useState(\"\")\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n const canSubmit = Boolean(prompt.trim()) && !isLoading\n\n const handleSubmit = async () => {\n if (!canSubmit) return\n\n setError(null)\n setIsLoading(true)\n\n try {\n const context = buildContext(prompt)\n\n if (!context) {\n setError(\"没有选中内容\")\n return\n }\n\n const result = await config.plugin.process(context)\n\n if (result.error) {\n setError(result.error)\n return\n }\n\n // 插件自己落盘时不返回文本 —— 这里再替换一次会把它的改动冲掉。\n if (result.result) {\n const { from, to } = editor.state.selection\n editor.view.dispatch(\n editor.state.tr.replaceWith(from, to, [\n editor.state.schema.text(result.result),\n ])\n )\n }\n\n setPrompt(\"\")\n onClose()\n } catch (err) {\n setError(err instanceof Error ? err.message : \"出错了\")\n } finally {\n setIsLoading(false)\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault()\n void handleSubmit()\n }\n if (e.key === \"Escape\") {\n e.preventDefault()\n onClose()\n }\n }\n\n return (\n <div className=\"tiptap-ai-dialog\">\n <div className=\"tiptap-ai-dialog-field\" data-loading={isLoading}>\n <input\n ref={inputRef}\n type=\"text\"\n className=\"tiptap-ai-dialog-input\"\n placeholder=\"描述你想要的修改\"\n value={prompt}\n disabled={isLoading}\n onChange={(e) => {\n setPrompt(e.target.value)\n setError(null)\n }}\n onKeyDown={handleKeyDown}\n />\n\n <button\n type=\"button\"\n className=\"tiptap-ai-dialog-submit\"\n aria-label=\"发送\"\n disabled={!canSubmit}\n onClick={() => void handleSubmit()}\n >\n <SendIcon />\n </button>\n </div>\n\n {error && <div className=\"tiptap-ai-dialog-error\">{error}</div>}\n </div>\n )\n}\n","import { NodeSelection, type Selection } from \"@tiptap/pm/state\"\nimport { CellSelection } from \"@tiptap/pm/tables\"\nimport type { JSONContent, Editor } from \"@tiptap/react\"\nimport { isTextSelection, isNodeSelection, posToDOMRect } from \"@tiptap/react\"\n\n\nconst NODE_TYPE_LABELS: Record<string, string> = {\n paragraph: \"Text\",\n heading: \"Heading\",\n blockquote: \"Blockquote\",\n listItem: \"List Item\",\n codeBlock: \"Code Block\",\n table: \"Table\",\n tocNode: \"Table of contents\",\n}\nexport type OverflowPosition = \"none\" | \"top\" | \"bottom\" | \"both\"\n\n/**\n * Utility function to get URL parameters\n */\nexport const getUrlParam = (param: string): string | null => {\n if (typeof window === \"undefined\") return null\n const params = new URLSearchParams(window.location.search)\n return params.get(param)\n}\n\n/**\n * Returns a display name for the current node in the editor\n * @param editor The Tiptap editor instance\n * @returns The display name of the current node\n */\nexport const getNodeDisplayName = (editor: Editor | null): string => {\n if (!editor) return \"Node\"\n\n const { selection } = editor.state\n\n if (selection instanceof NodeSelection) {\n const nodeType = selection.node.type.name\n return NODE_TYPE_LABELS[nodeType] || nodeType.toLowerCase()\n }\n\n if (selection instanceof CellSelection) {\n return \"Table\"\n }\n\n const { $anchor } = selection\n const nodeType = $anchor.parent.type.name\n return NODE_TYPE_LABELS[nodeType] || nodeType.toLowerCase()\n}\n\n/**\n * Removes empty paragraph nodes from content\n */\nexport const removeEmptyParagraphs = (content: JSONContent) => ({\n ...content,\n content: content.content?.filter(\n (node) =>\n node.type !== \"paragraph\" ||\n node.content?.some((child) => child.text?.trim() || child.type !== \"text\")\n ),\n})\n\n/**\n * Determines how a target element overflows relative to a container element\n */\nexport function getElementOverflowPosition(\n targetElement: Element,\n containerElement: HTMLElement\n): OverflowPosition {\n const targetBounds = targetElement.getBoundingClientRect()\n const containerBounds = containerElement.getBoundingClientRect()\n\n const isOverflowingTop = targetBounds.top < containerBounds.top\n const isOverflowingBottom = targetBounds.bottom > containerBounds.bottom\n\n if (isOverflowingTop && isOverflowingBottom) return \"both\"\n if (isOverflowingTop) return \"top\"\n if (isOverflowingBottom) return \"bottom\"\n return \"none\"\n}\n\n/**\n * Checks if the current selection is valid for a given editor\n */\nexport const isSelectionValid = (\n editor: Editor | null,\n selection?: Selection,\n excludedNodeTypes: string[] = [\"imageUpload\", \"horizontalRule\"]\n): boolean => {\n if (!editor) return false\n if (!selection) selection = editor.state.selection\n\n const { state } = editor\n const { doc } = state\n const { empty, from, to } = selection\n\n const isEmptyTextBlock =\n !doc.textBetween(from, to).length && isTextSelection(selection)\n const isCodeBlock =\n selection.$from.parent.type.spec.code ||\n (isNodeSelection(selection) && selection.node.type.spec.code)\n const isExcludedNode =\n isNodeSelection(selection) &&\n excludedNodeTypes.includes(selection.node.type.name)\n const isTableCell = selection instanceof CellSelection\n\n return (\n !empty &&\n !isEmptyTextBlock &&\n !isCodeBlock &&\n !isExcludedNode &&\n !isTableCell\n )\n}\n\n/**\n * Checks if the current text selection is valid for editing\n * - Not empty\n * - Not a code block\n * - Not a node selection\n */\nexport const isTextSelectionValid = (editor: Editor | null): boolean => {\n if (!editor) return false\n const { state } = editor\n const { selection } = state\n const isValid =\n isTextSelection(selection) &&\n !selection.empty &&\n !selection.$from.parent.type.spec.code &&\n !isNodeSelection(selection)\n\n return isValid\n}\n\n/**\n * Gets the bounding rect of the current selection in the editor.\n */\nexport const getSelectionBoundingRect = (editor: Editor): DOMRect | null => {\n const { state } = editor.view\n const { selection } = state\n const { ranges } = selection\n\n const from = Math.min(...ranges.map((range) => range.$from.pos))\n const to = Math.max(...ranges.map((range) => range.$to.pos))\n\n if (isNodeSelection(selection)) {\n const node = editor.view.nodeDOM(from) as HTMLElement\n if (node) {\n return node.getBoundingClientRect()\n }\n }\n\n return posToDOMRect(editor.view, from, to)\n}\n\n/**\n * Generates a deterministic avatar URL from a user name\n */\nexport const getAvatar = (name: string) => {\n if (!name) {\n return \"/avatars/memoji_01.png\"\n }\n\n let hash = 0\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash)\n hash = hash & hash\n }\n\n const randomFraction = (Math.abs(hash) % 1000000) / 1000000\n const id = 1 + Math.floor(randomFraction * 20)\n const idString = id.toString().padStart(2, \"0\")\n return `/avatars/memoji_${idString}.png`\n}\n\n\n","\"use client\"\n\nimport { forwardRef, useCallback, useEffect, useState } from \"react\"\nimport type { Editor } from \"@tiptap/react\"\n\n// --- Hooks ---\nimport { useTiptapEditor } from \"../../hooks/use-tiptap-editor\"\nimport { useAIContext } from \"./use-ai-context\"\nimport { useAIConfig } from \"./ai-context\"\nimport { shouldShowAIButton } from \"./ai-button-visibility\"\n\n// --- Types ---\nimport type { AIPluginConfig } from \"./types\"\n\n// --- Icons ---\nimport { SparklesIcon } from \"../../components/tiptap-icons/sparkles-icon\"\n\n// --- UI Primitives ---\nimport type { ButtonProps } from \"../../components/tiptap-ui-primitive/button\"\nimport { Button } from \"../../components/tiptap-ui-primitive/button\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../../components/tiptap-ui-primitive/popover\"\n\n// --- AI Dialog ---\nimport { AIDialog } from \"./ai-dialog\"\nimport { isSelectionValid } from \"../../lib/tiptap-collab-utils\"\n\nexport interface AIButtonProps extends Omit<ButtonProps, \"type\"> {\n /**\n * The Tiptap editor instance\n */\n editor?: Editor | null\n\n /**\n * AI plugin configuration (optional, will use context if not provided)\n */\n config?: AIPluginConfig\n\n /**\n * Whether to hide the button when no valid selection\n * @default true\n */\n hideWhenUnavailable?: boolean\n}\n\n/**\n * AI Button component for triggering the AI processing dialog\n *\n * Usage:\n * ```tsx\n * <AIButton\n * config={{ plugin: new MyAIPlugin() }}\n * hideWhenUnavailable\n * />\n * ```\n */\nexport const AIButton = forwardRef<HTMLButtonElement, AIButtonProps>(\n (\n {\n editor: providedEditor,\n config: providedConfig,\n hideWhenUnavailable = true,\n onClick,\n ...buttonProps\n },\n ref\n ) => {\n const { editor } = useTiptapEditor(providedEditor)\n const { buildContext } = useAIContext(editor)\n const contextConfig = useAIConfig()\n const [isOpen, setIsOpen] = useState(false)\n const [shouldShow, setShouldShow] = useState(false)\n\n const config = providedConfig || contextConfig\n const isEnabled = config?.enabled !== false\n\n useEffect(() => {\n if (!editor) {\n setShouldShow(false)\n return\n }\n\n const updateVisibility = () => {\n setShouldShow(\n shouldShowAIButton({\n enabled: isEnabled,\n hasValidSelection: isSelectionValid(editor),\n hideWhenUnavailable,\n isEditable: editor.isEditable,\n })\n )\n }\n\n updateVisibility()\n editor.on(\"selectionUpdate\", updateVisibility)\n\n return () => {\n editor.off(\"selectionUpdate\", updateVisibility)\n }\n }, [editor, hideWhenUnavailable, isEnabled])\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n setIsOpen(open)\n },\n []\n )\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event)\n if (!event.defaultPrevented) {\n setIsOpen(true)\n }\n },\n [onClick]\n )\n\n if (!shouldShow || !editor || !config) {\n return null\n }\n\n return (\n <Popover open={isOpen} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <Button\n ref={ref}\n type=\"button\"\n variant=\"ghost\"\n role=\"button\"\n tabIndex={-1}\n aria-label=\"AI Assistant\"\n tooltip=\"AI Assistant\"\n onClick={handleClick}\n {...buttonProps}\n >\n <SparklesIcon className=\"tiptap-button-icon\" />\n </Button>\n </PopoverTrigger>\n\n {/* 不用 asChild:AIDialog 不转发 ref,Radix 量不到尺寸会定位错位 */}\n <PopoverContent side=\"top\" align=\"start\" sideOffset={4}>\n <AIDialog\n editor={editor}\n config={config}\n buildContext={buildContext}\n onClose={() => handleOpenChange(false)}\n />\n </PopoverContent>\n </Popover>\n )\n }\n)\n\nAIButton.displayName = \"AIButton\"\n"]}
|
package/dist/doc.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { ArticleViewer, Audio, CollabContext, CollabProvider, Column, Columns, DEFAULT_MAX_FILE_SIZES, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EditorConfigProvider, EditorContentArea, FileAttachment, FloatingElement, HIDE_FLOATING_META, LoadingSpinner, MediaUploadButton, MediaUploadPlaceholder, NotionEditor, NotionEditorContent, EditorProvider as NotionEditorInner, PasteDropMedia, Separator, Spacer, Toolbar, ToolbarGroup, ToolbarSeparator, UiState, UserContext, UserProvider, Video, defaultUiState, detectMediaKind, findSelectionPosition, hasContentAbove, markHideFloatingOnNext, pickFile, resolveMaxSize, runMediaUpload, selectNodeAndHideFloating, useCollab, useCollaboration, useComposedRef, useCursorVisibility, useEditorConfig, useElementRect, useFloatingElement, useFloatingToolbarVisibility, useIsBreakpoint, useIsomorphicLayoutEffect, useMenuNavigation, useOnClickOutside, useThrottledCallback, useUiEditorState, use_ui_editor_state_default as useUiEditorStateDefault, useUnmount, useUser, useWindowSize } from './chunk-
|
|
2
|
-
export { Button, MAC_SYMBOLS, MAX_FILE_SIZE, Popover, PopoverContent, PopoverTrigger, SR_ONLY, clamp, cn, findNodeAtPosition, findNodePosition, focusNextNode, formatShortcutKey, getAvatar, getElementOverflowPosition, getNodeDisplayName, getSelectedBlockNodes, getSelectedNodesOfType, getSelectionBoundingRect, getUrlParam, handleImageUpload, isAllowedUri, isExtensionAvailable, isMac, isMarkInSchema, isNodeInSchema, isNodeTypeSelected, isSelectionValid, isTextSelectionValid, isValidPosition, parseShortcutKeys, removeEmptyParagraphs, sanitizeUrl, selectCurrentBlockContent, selectionWithinConvertibleTypes, updateNodesAttr, useTiptapEditor } from './chunk-
|
|
1
|
+
export { ArticleViewer, Audio, CollabContext, CollabProvider, Column, Columns, DEFAULT_MAX_FILE_SIZES, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EditorConfigProvider, EditorContentArea, FileAttachment, FloatingElement, HIDE_FLOATING_META, LoadingSpinner, MediaUploadButton, MediaUploadPlaceholder, NotionEditor, NotionEditorContent, EditorProvider as NotionEditorInner, PasteDropMedia, Separator, Spacer, Toolbar, ToolbarGroup, ToolbarSeparator, UiState, UserContext, UserProvider, Video, defaultUiState, detectMediaKind, findSelectionPosition, hasContentAbove, markHideFloatingOnNext, pickFile, resolveMaxSize, runMediaUpload, selectNodeAndHideFloating, useCollab, useCollaboration, useComposedRef, useCursorVisibility, useEditorConfig, useElementRect, useFloatingElement, useFloatingToolbarVisibility, useIsBreakpoint, useIsomorphicLayoutEffect, useMenuNavigation, useOnClickOutside, useThrottledCallback, useUiEditorState, use_ui_editor_state_default as useUiEditorStateDefault, useUnmount, useUser, useWindowSize } from './chunk-FQCG2HNJ.js';
|
|
2
|
+
export { Button, MAC_SYMBOLS, MAX_FILE_SIZE, Popover, PopoverContent, PopoverTrigger, SR_ONLY, clamp, cn, findNodeAtPosition, findNodePosition, focusNextNode, formatShortcutKey, getAvatar, getElementOverflowPosition, getNodeDisplayName, getSelectedBlockNodes, getSelectedNodesOfType, getSelectionBoundingRect, getUrlParam, handleImageUpload, isAllowedUri, isExtensionAvailable, isMac, isMarkInSchema, isNodeInSchema, isNodeTypeSelected, isSelectionValid, isTextSelectionValid, isValidPosition, parseShortcutKeys, removeEmptyParagraphs, sanitizeUrl, selectCurrentBlockContent, selectionWithinConvertibleTypes, updateNodesAttr, useTiptapEditor } from './chunk-QMYT5WXO.js';
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
|
|
5
5
|
function useScrolling(target, options = {}) {
|
package/dist/index.js
CHANGED
|
@@ -29,7 +29,7 @@ registerFormat({
|
|
|
29
29
|
importExtensions: [".docx", ".md", ".html"],
|
|
30
30
|
exportFormats: ["docx", "html", "json", "markdown"]
|
|
31
31
|
},
|
|
32
|
-
load: () => import('./DocView-
|
|
32
|
+
load: () => import('./DocView-IZ4JBSIA.js')
|
|
33
33
|
});
|
|
34
34
|
registerFormat({
|
|
35
35
|
format: "sheet",
|
package/dist/plugins/ai.d.ts
CHANGED
|
@@ -115,6 +115,13 @@ interface AIDialogProps {
|
|
|
115
115
|
buildContext: (prompt: string) => AIContextData | null;
|
|
116
116
|
onClose: () => void;
|
|
117
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* 一行输入 + 一颗提交键。
|
|
120
|
+
*
|
|
121
|
+
* 刻意不做成带标题栏和按钮行的卡片:它浮在正文上方紧贴选区,任何一行多余的
|
|
122
|
+
* 装饰都会把用户正在读的那段文字挡掉。同类产品(ChatGPT canvas / Notion AI)
|
|
123
|
+
* 也都收敛成单行胶囊。
|
|
124
|
+
*/
|
|
118
125
|
declare function AIDialog({ editor, config, buildContext, onClose, }: AIDialogProps): react.JSX.Element;
|
|
119
126
|
|
|
120
127
|
declare function useAIContext(editor: Editor | null): {
|
package/dist/plugins/ai.js
CHANGED