@haklex/rich-plugin-block-handle 0.57.0 → 0.59.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"BlockHandlePlugin.d.ts","sourceRoot":"","sources":["../src/BlockHandlePlugin.tsx"],"names":[],"mappings":"AAoDA,OAAO,KAAK,EAAgD,YAAY,EAAE,MAAM,OAAO,CAAC;AAyyBxF,wBAAgB,iBAAiB,IAAI,YAAY,CAGhD"}
1
+ {"version":3,"file":"BlockHandlePlugin.d.ts","sourceRoot":"","sources":["../src/BlockHandlePlugin.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAiC,YAAY,EAAE,MAAM,OAAO,CAAC;AAmtBzE,wBAAgB,iBAAiB,IAAI,YAAY,CAGhD"}
@@ -0,0 +1,12 @@
1
+ import { ReactElement } from 'react';
2
+ interface BlockMenuProps {
3
+ currentType?: string | null;
4
+ onDelete: () => void;
5
+ onDuplicate: () => void;
6
+ onMoveDown: () => void;
7
+ onMoveUp: () => void;
8
+ onTurnInto: (type: string) => void;
9
+ }
10
+ export declare function BlockMenu({ currentType, onDelete, onDuplicate, onMoveDown, onMoveUp, onTurnInto, }: BlockMenuProps): ReactElement;
11
+ export {};
12
+ //# sourceMappingURL=BlockMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockMenu.d.ts","sourceRoot":"","sources":["../src/BlockMenu.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,UAAU,cAAc;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAID,wBAAgB,SAAS,CAAC,EACxB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,UAAU,EACV,QAAQ,EACR,UAAU,GACX,EAAE,cAAc,GAAG,YAAY,CAmD/B"}
@@ -0,0 +1,4 @@
1
+ export declare function $selectionBlockKeys(): string[];
2
+ export declare function $moveBlocks(keys: string[], direction: 'up' | 'down'): boolean;
3
+ export declare function $duplicateBlocks(keys: string[]): boolean;
4
+ //# sourceMappingURL=blockMoves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockMoves.d.ts","sourceRoot":"","sources":["../src/blockMoves.ts"],"names":[],"mappings":"AAOA,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAgB9C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAuB7E;AAaD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAaxD"}
@@ -0,0 +1,4 @@
1
+ import { LexicalEditor, LexicalNode } from 'lexical';
2
+ export declare function $getBlockTypeId(node: LexicalNode | null): string | null;
3
+ export declare function turnBlockInto(editor: LexicalEditor, nodeKey: string, type: string): void;
4
+ //# sourceMappingURL=blockType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockType.d.ts","sourceRoot":"","sources":["../src/blockType.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAsC,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAwB9F,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAavE;AAUD,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA2BxF"}
@@ -0,0 +1,16 @@
1
+ export interface VerticalSpan {
2
+ bottom: number;
3
+ top: number;
4
+ }
5
+ export interface Gap {
6
+ index: number;
7
+ y: number;
8
+ }
9
+ export declare function findGap(blocks: VerticalSpan[], y: number): Gap | null;
10
+ export declare function handleTop(block: {
11
+ lineHeight: number;
12
+ paddingTop: number;
13
+ top: number;
14
+ }, handleHeight: number): number;
15
+ export declare function parseLineHeight(lineHeight: string, fontSize: string): number;
16
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;CACX;AAID,wBAAgB,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAkBrE;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAC9D,YAAY,EAAE,MAAM,GACnB,MAAM,CAER;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAI5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.mjs CHANGED
@@ -1,26 +1,252 @@
1
- import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from "@haklex/rich-editor-ui";
1
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuTrigger, detectPlatform } from "@haklex/rich-editor-ui";
2
2
  import { usePortalTheme } from "@haklex/rich-style-token";
3
- import { $createCodeNode } from "@lexical/code-core";
4
- import { INSERT_CHECK_LIST_COMMAND, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND } from "@lexical/list";
5
3
  import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
6
- import { INSERT_HORIZONTAL_RULE_COMMAND } from "@lexical/react/LexicalHorizontalRuleNode";
7
- import { $createHeadingNode, $createQuoteNode } from "@lexical/rich-text";
8
- import { $setBlocksType } from "@lexical/selection";
9
- import { $createNodeSelection, $createParagraphNode, $createTabNode, $getNearestNodeFromDOMNode, $getNodeByKey, $getRoot, $getSelection, $isElementNode, $isNodeSelection, $isRangeSelection, $isTextNode, $parseSerializedNode, $setSelection, COMMAND_PRIORITY_CRITICAL, COMMAND_PRIORITY_HIGH, COPY_COMMAND, CUT_COMMAND, DELETE_CHARACTER_COMMAND, DRAGOVER_COMMAND, DRAGSTART_COMMAND, DROP_COMMAND, KEY_ARROW_DOWN_COMMAND, KEY_ARROW_UP_COMMAND, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND, KEY_DOWN_COMMAND, KEY_ESCAPE_COMMAND, PASTE_COMMAND, PASTE_TAG, REMOVE_TEXT_COMMAND, SELECT_ALL_COMMAND } from "lexical";
10
- import { ArrowDown, ArrowUp, Code2, Copy, GripVertical, Heading1, Heading2, Heading3, List, ListChecks, ListOrdered, Minus, Plus, TextQuote, Trash2, Type } from "lucide-react";
11
- import { useCallback, useEffect, useRef, useState } from "react";
4
+ import { $createNodeSelection, $createParagraphNode, $createTabNode, $createTextNode, $getNearestNodeFromDOMNode, $getNodeByKey, $getRoot, $getSelection, $isElementNode, $isNodeSelection, $isParagraphNode, $isRangeSelection, $isTextNode, $parseSerializedNode, $setSelection, COMMAND_PRIORITY_CRITICAL, COMMAND_PRIORITY_HIGH, COPY_COMMAND, CUT_COMMAND, DELETE_CHARACTER_COMMAND, DRAGOVER_COMMAND, DRAGSTART_COMMAND, DROP_COMMAND, KEY_ARROW_DOWN_COMMAND, KEY_ARROW_UP_COMMAND, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND, KEY_DOWN_COMMAND, KEY_ESCAPE_COMMAND, PASTE_COMMAND, PASTE_TAG, REMOVE_TEXT_COMMAND, SELECT_ALL_COMMAND } from "lexical";
5
+ import { ArrowDown, ArrowUp, Copy, GripVertical, Plus, Trash2 } from "lucide-react";
6
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
12
7
  import { createPortal } from "react-dom";
8
+ import { TURN_INTO_COMMAND_IDS, getCommandMeta } from "@haklex/rich-editor/command-registry";
9
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
+ import { $createCodeNode } from "@lexical/code-core";
11
+ import { $isListNode, INSERT_CHECK_LIST_COMMAND, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND } from "@lexical/list";
12
+ import { $createHeadingNode, $createQuoteNode, $isHeadingNode, $isQuoteNode } from "@lexical/rich-text";
13
+ import { $setBlocksType } from "@lexical/selection";
13
14
  import { $generateNodesFromDOM } from "@lexical/html";
14
- import { jsx, jsxs } from "react/jsx-runtime";
15
+ //#region src/BlockMenu.tsx
16
+ var TURN_INTO_ITEMS = TURN_INTO_COMMAND_IDS.map((id) => getCommandMeta(id));
17
+ function BlockMenu({ currentType, onDelete, onDuplicate, onMoveDown, onMoveUp, onTurnInto }) {
18
+ const current = currentType ? getCommandMeta(currentType) : void 0;
19
+ const TriggerIcon = (current ?? TURN_INTO_ITEMS[0]).icon;
20
+ return /* @__PURE__ */ jsxs(DropdownMenuContent, {
21
+ align: "start",
22
+ side: "bottom",
23
+ sideOffset: 4,
24
+ children: [
25
+ currentType !== null && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(DropdownMenuSub, { children: [/* @__PURE__ */ jsxs(DropdownMenuSubTrigger, {
26
+ value: current?.title,
27
+ children: [/* @__PURE__ */ jsx(TriggerIcon, {}), "Turn into"]
28
+ }), /* @__PURE__ */ jsx(DropdownMenuContent, {
29
+ align: "start",
30
+ side: "right",
31
+ sideOffset: 4,
32
+ children: /* @__PURE__ */ jsx(DropdownMenuRadioGroup, {
33
+ value: current?.id ?? null,
34
+ children: TURN_INTO_ITEMS.map((item) => /* @__PURE__ */ jsxs(DropdownMenuRadioItem, {
35
+ closeOnClick: true,
36
+ value: item.id,
37
+ onClick: () => onTurnInto(item.id),
38
+ children: [/* @__PURE__ */ jsx(item.icon, {}), item.title]
39
+ }, item.id))
40
+ })
41
+ })] }), /* @__PURE__ */ jsx(DropdownMenuSeparator, {})] }),
42
+ /* @__PURE__ */ jsxs(DropdownMenuItem, {
43
+ shortcut: "Mod+D",
44
+ onClick: onDuplicate,
45
+ children: [/* @__PURE__ */ jsx(Copy, {}), "Duplicate"]
46
+ }),
47
+ /* @__PURE__ */ jsxs(DropdownMenuItem, {
48
+ shortcut: "Mod+Shift+Up",
49
+ onClick: onMoveUp,
50
+ children: [/* @__PURE__ */ jsx(ArrowUp, {}), "Move up"]
51
+ }),
52
+ /* @__PURE__ */ jsxs(DropdownMenuItem, {
53
+ shortcut: "Mod+Shift+Down",
54
+ onClick: onMoveDown,
55
+ children: [/* @__PURE__ */ jsx(ArrowDown, {}), "Move down"]
56
+ }),
57
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
58
+ /* @__PURE__ */ jsxs(DropdownMenuItem, {
59
+ shortcut: "Backspace",
60
+ variant: "destructive",
61
+ onClick: onDelete,
62
+ children: [/* @__PURE__ */ jsx(Trash2, {}), "Delete"]
63
+ })
64
+ ]
65
+ });
66
+ }
67
+ //#endregion
68
+ //#region src/blockMoves.ts
69
+ function $topLevelKey(node) {
70
+ return node.getTopLevelElement()?.getKey() ?? null;
71
+ }
72
+ function $selectionBlockKeys() {
73
+ const selection = $getSelection();
74
+ if (!$isRangeSelection(selection)) return [];
75
+ const touched = /* @__PURE__ */ new Set();
76
+ for (const node of [
77
+ selection.anchor.getNode(),
78
+ selection.focus.getNode(),
79
+ ...selection.getNodes()
80
+ ]) {
81
+ const key = $topLevelKey(node);
82
+ if (key) touched.add(key);
83
+ }
84
+ return $getRoot().getChildren().map((child) => child.getKey()).filter((key) => touched.has(key));
85
+ }
86
+ function $moveBlocks(keys, direction) {
87
+ const keySet = new Set(keys);
88
+ const blocks = $getRoot().getChildren().filter((child) => keySet.has(child.getKey()));
89
+ if (blocks.length === 0) return false;
90
+ const first = blocks[0];
91
+ const last = blocks.at(-1);
92
+ if (direction === "up") {
93
+ const previous = first.getPreviousSibling();
94
+ if (!previous || keySet.has(previous.getKey())) return false;
95
+ previous.remove();
96
+ last.insertAfter(previous);
97
+ return true;
98
+ }
99
+ const next = last.getNextSibling();
100
+ if (!next || keySet.has(next.getKey())) return false;
101
+ next.remove();
102
+ first.insertBefore(next);
103
+ return true;
104
+ }
105
+ function $cloneNode(node) {
106
+ const clone = node.constructor.importJSON(node.exportJSON());
107
+ if ($isElementNode(node) && $isElementNode(clone)) for (const child of node.getChildren()) clone.append($cloneNode(child));
108
+ return clone;
109
+ }
110
+ function $duplicateBlocks(keys) {
111
+ const keySet = new Set(keys);
112
+ const blocks = $getRoot().getChildren().filter((child) => keySet.has(child.getKey()));
113
+ if (blocks.length === 0) return false;
114
+ let insertAfter = blocks.at(-1);
115
+ for (const block of blocks) {
116
+ const clone = $cloneNode(block);
117
+ insertAfter.insertAfter(clone);
118
+ insertAfter = clone;
119
+ }
120
+ return true;
121
+ }
122
+ //#endregion
123
+ //#region src/blockType.ts
124
+ var LIST_COMMANDS = {
125
+ bullet: INSERT_UNORDERED_LIST_COMMAND,
126
+ number: INSERT_ORDERED_LIST_COMMAND,
127
+ check: INSERT_CHECK_LIST_COMMAND
128
+ };
129
+ var ELEMENT_CREATORS = {
130
+ paragraph: () => $createParagraphNode(),
131
+ h1: () => $createHeadingNode("h1"),
132
+ h2: () => $createHeadingNode("h2"),
133
+ h3: () => $createHeadingNode("h3"),
134
+ quote: () => $createQuoteNode()
135
+ };
136
+ function $getBlockTypeId(node) {
137
+ if (!node) return null;
138
+ if ($isParagraphNode(node)) return "paragraph";
139
+ if ($isHeadingNode(node)) {
140
+ const tag = node.getTag();
141
+ return tag === "h1" || tag === "h2" || tag === "h3" ? tag : null;
142
+ }
143
+ if ($isQuoteNode(node)) return "quote";
144
+ if ($isListNode(node)) {
145
+ const listType = node.getListType();
146
+ return listType === "bullet" || listType === "number" || listType === "check" ? listType : null;
147
+ }
148
+ return node.getType() === "code" ? "code" : null;
149
+ }
150
+ function getCodeBlockKlass(editor) {
151
+ return editor._nodes.get("code-block")?.klass ?? null;
152
+ }
153
+ function turnBlockInto(editor, nodeKey, type) {
154
+ const listCommand = LIST_COMMANDS[type];
155
+ if (listCommand) {
156
+ editor.update(() => {
157
+ const node = $getNodeByKey(nodeKey);
158
+ if ($isElementNode(node)) node.selectStart();
159
+ });
160
+ editor.dispatchCommand(listCommand, void 0);
161
+ return;
162
+ }
163
+ editor.update(() => {
164
+ const node = $getNodeByKey(nodeKey);
165
+ if (!$isElementNode(node)) return;
166
+ if (type === "code") {
167
+ const CodeBlock = getCodeBlockKlass(editor);
168
+ if (CodeBlock) {
169
+ node.replace(new CodeBlock(node.getTextContent(), "text"));
170
+ return;
171
+ }
172
+ }
173
+ node.selectStart();
174
+ const selection = $getSelection();
175
+ if (!$isRangeSelection(selection)) return;
176
+ const create = type === "code" ? () => $createCodeNode() : ELEMENT_CREATORS[type];
177
+ if (create) $setBlocksType(selection, create);
178
+ });
179
+ }
180
+ //#endregion
181
+ //#region src/geometry.ts
182
+ var EDGE_ZONE = 12;
183
+ function findGap(blocks, y) {
184
+ if (blocks.length === 0) return null;
185
+ const first = blocks[0];
186
+ const last = blocks.at(-1);
187
+ if (y < first.top) return y >= first.top - EDGE_ZONE ? {
188
+ index: 0,
189
+ y: first.top - EDGE_ZONE / 2
190
+ } : null;
191
+ if (y > last.bottom) return y <= last.bottom + EDGE_ZONE ? {
192
+ index: blocks.length,
193
+ y: last.bottom + EDGE_ZONE / 2
194
+ } : null;
195
+ for (let i = 1; i < blocks.length; i++) {
196
+ const prev = blocks[i - 1];
197
+ const next = blocks[i];
198
+ if (y > prev.bottom && y < next.top) return {
199
+ index: i,
200
+ y: (prev.bottom + next.top) / 2
201
+ };
202
+ }
203
+ return null;
204
+ }
205
+ function handleTop(block, handleHeight) {
206
+ return block.top + block.paddingTop + (block.lineHeight - handleHeight) / 2;
207
+ }
208
+ function parseLineHeight(lineHeight, fontSize) {
209
+ const px = Number.parseFloat(lineHeight);
210
+ if (lineHeight.endsWith("px") && Number.isFinite(px)) return px;
211
+ return Number.parseFloat(fontSize) * 1.2;
212
+ }
213
+ //#endregion
15
214
  //#region src/styles.css.ts
16
215
  var handleContainer = "iihqkc0";
17
216
  var handleContainerVisible = "iihqkc1";
18
- var handleBtn = "iihqkc2";
19
- var draggingBlock = "iihqkc3";
20
- var dragPreview = "iihqkc4";
21
- var blockSelected = "iihqkc6";
22
- var dragCountBadge = "iihqkc7";
23
- var menuItemDestructive = "iihqkc8";
217
+ var grip = "iihqkc2";
218
+ var draggingBlock = "iihqkc5";
219
+ var dragPreview = "iihqkc6";
220
+ var blockSelected = "iihqkc8";
221
+ var dragCountBadge = "iihqkc9";
222
+ //#endregion
223
+ //#region src/useBlockMoveShortcuts.ts
224
+ var DIRECTIONS = {
225
+ ArrowUp: "up",
226
+ ArrowDown: "down"
227
+ };
228
+ function createBlockMoveHandler(editor, getSelectedKeys, isMac) {
229
+ return (event, fromEditor) => {
230
+ if (fromEditor !== editor || event.altKey) return false;
231
+ if (isMac ? !event.metaKey || event.ctrlKey : !event.ctrlKey || event.metaKey) return false;
232
+ const direction = DIRECTIONS[event.key];
233
+ const duplicate = !event.shiftKey && event.key.toLowerCase() === "d";
234
+ if (!duplicate && (!direction || !event.shiftKey)) return false;
235
+ const blockKeys = getSelectedKeys();
236
+ const keys = blockKeys.length > 0 ? blockKeys : $selectionBlockKeys();
237
+ if (keys.length === 0) return false;
238
+ event.preventDefault();
239
+ if (duplicate) $duplicateBlocks(keys);
240
+ else $moveBlocks(keys, direction);
241
+ return true;
242
+ };
243
+ }
244
+ function useBlockMoveShortcuts(editor, getSelectedKeys) {
245
+ useEffect(() => {
246
+ const isMac = detectPlatform(typeof navigator === "undefined" ? void 0 : navigator) === "mac";
247
+ return editor.registerCommand(KEY_DOWN_COMMAND, createBlockMoveHandler(editor, getSelectedKeys, isMac), COMMAND_PRIORITY_CRITICAL);
248
+ }, [editor, getSelectedKeys]);
249
+ }
24
250
  //#endregion
25
251
  //#region src/blockSelectionUtils.ts
26
252
  var PASTEABLE_CLIPBOARD_TYPES = [
@@ -649,62 +875,172 @@ function useBlockSelection(editor) {
649
875
  };
650
876
  }
651
877
  //#endregion
878
+ //#region src/useGapInsert.ts
879
+ var GAP_DELAY = 150;
880
+ var LEAVE_GRACE = 300;
881
+ var GUTTER = 32;
882
+ function rootBlocks(rootElement) {
883
+ return [...rootElement.children].filter((child) => child instanceof HTMLElement);
884
+ }
885
+ function useGapInsert(editor, isBlockTarget) {
886
+ const [gap, setGap] = useState(null);
887
+ const pendingIndexRef = useRef(null);
888
+ const timerRef = useRef(null);
889
+ const leaveTimerRef = useRef(null);
890
+ const hoveringPlusRef = useRef(false);
891
+ const clearTimer = useCallback(() => {
892
+ if (timerRef.current) clearTimeout(timerRef.current);
893
+ timerRef.current = null;
894
+ }, []);
895
+ const clearLeaveTimer = useCallback(() => {
896
+ if (leaveTimerRef.current) clearTimeout(leaveTimerRef.current);
897
+ leaveTimerRef.current = null;
898
+ }, []);
899
+ const dismiss = useCallback(() => {
900
+ clearTimer();
901
+ pendingIndexRef.current = null;
902
+ if (!hoveringPlusRef.current) setGap(null);
903
+ }, [clearTimer]);
904
+ useEffect(() => {
905
+ const rootElement = editor.getRootElement();
906
+ if (!rootElement) return;
907
+ const container = rootElement.closest(".rich-editor") ?? rootElement.parentElement;
908
+ if (!container) return;
909
+ let rafId = null;
910
+ const evaluate = (event) => {
911
+ const target = event.target;
912
+ const rootRect = rootElement.getBoundingClientRect();
913
+ if (!(event.clientX >= rootRect.left - GUTTER && event.clientX <= rootRect.right) || isBlockTarget(target) || target.closest("[role=\"toolbar\"]")) {
914
+ dismiss();
915
+ return;
916
+ }
917
+ const found = findGap(rootBlocks(rootElement).map((block) => block.getBoundingClientRect()), event.clientY);
918
+ if (!found) {
919
+ dismiss();
920
+ return;
921
+ }
922
+ if (pendingIndexRef.current === found.index) return;
923
+ clearTimer();
924
+ pendingIndexRef.current = found.index;
925
+ timerRef.current = setTimeout(() => {
926
+ setGap({
927
+ index: found.index,
928
+ top: found.y + window.scrollY,
929
+ left: rootRect.left + window.scrollX,
930
+ width: rootRect.width
931
+ });
932
+ }, GAP_DELAY);
933
+ };
934
+ const onMouseMove = (event) => {
935
+ clearLeaveTimer();
936
+ if (rafId !== null) return;
937
+ rafId = requestAnimationFrame(() => {
938
+ rafId = null;
939
+ evaluate(event);
940
+ });
941
+ };
942
+ const onMouseLeave = () => {
943
+ clearLeaveTimer();
944
+ leaveTimerRef.current = setTimeout(dismiss, LEAVE_GRACE);
945
+ };
946
+ container.addEventListener("mousemove", onMouseMove);
947
+ container.addEventListener("mouseleave", onMouseLeave);
948
+ window.addEventListener("scroll", dismiss, true);
949
+ return () => {
950
+ if (rafId !== null) cancelAnimationFrame(rafId);
951
+ container.removeEventListener("mousemove", onMouseMove);
952
+ container.removeEventListener("mouseleave", onMouseLeave);
953
+ window.removeEventListener("scroll", dismiss, true);
954
+ clearTimer();
955
+ clearLeaveTimer();
956
+ };
957
+ }, [
958
+ clearLeaveTimer,
959
+ clearTimer,
960
+ dismiss,
961
+ editor,
962
+ isBlockTarget
963
+ ]);
964
+ const onPlusEnter = useCallback(() => {
965
+ hoveringPlusRef.current = true;
966
+ clearTimer();
967
+ clearLeaveTimer();
968
+ }, [clearLeaveTimer, clearTimer]);
969
+ const onPlusLeave = useCallback(() => {
970
+ hoveringPlusRef.current = false;
971
+ dismiss();
972
+ }, [dismiss]);
973
+ return {
974
+ gap,
975
+ insertAtGap: useCallback(() => {
976
+ if (!gap) return;
977
+ const { index } = gap;
978
+ hoveringPlusRef.current = false;
979
+ dismiss();
980
+ setGap(null);
981
+ editor.update(() => {
982
+ const root = $getRoot();
983
+ const paragraph = $createParagraphNode();
984
+ const trigger = $createTextNode("/");
985
+ paragraph.append(trigger);
986
+ const next = root.getChildAtIndex(index);
987
+ if (next) next.insertBefore(paragraph);
988
+ else root.append(paragraph);
989
+ trigger.select(1, 1);
990
+ });
991
+ editor.focus();
992
+ }, [
993
+ dismiss,
994
+ editor,
995
+ gap
996
+ ]),
997
+ onPlusEnter,
998
+ onPlusLeave
999
+ };
1000
+ }
1001
+ var MOVE_TOLERANCE = 8;
1002
+ function useLongPress(onLongPress) {
1003
+ const timerRef = useRef(null);
1004
+ const originRef = useRef(null);
1005
+ const callbackRef = useRef(onLongPress);
1006
+ useEffect(() => {
1007
+ callbackRef.current = onLongPress;
1008
+ }, [onLongPress]);
1009
+ const cancel = useCallback(() => {
1010
+ if (timerRef.current) clearTimeout(timerRef.current);
1011
+ timerRef.current = null;
1012
+ originRef.current = null;
1013
+ }, []);
1014
+ useEffect(() => cancel, [cancel]);
1015
+ return useMemo(() => ({
1016
+ onPointerDown: (event) => {
1017
+ cancel();
1018
+ if (event.pointerType !== "touch") return;
1019
+ originRef.current = {
1020
+ x: event.clientX,
1021
+ y: event.clientY
1022
+ };
1023
+ timerRef.current = setTimeout(() => {
1024
+ timerRef.current = null;
1025
+ originRef.current = null;
1026
+ callbackRef.current();
1027
+ }, 450);
1028
+ },
1029
+ onPointerMove: (event) => {
1030
+ const origin = originRef.current;
1031
+ if (!origin) return;
1032
+ if (Math.hypot(event.clientX - origin.x, event.clientY - origin.y) > MOVE_TOLERANCE) cancel();
1033
+ },
1034
+ onPointerUp: cancel,
1035
+ onPointerCancel: cancel
1036
+ }), [cancel]);
1037
+ }
1038
+ //#endregion
652
1039
  //#region src/BlockHandlePlugin.tsx
653
1040
  var DRAG_DATA_KEY = "application/x-rich-editor-drag";
654
1041
  var HIDE_DELAY = 300;
655
- var HANDLE_OFFSET = 52;
656
- var TURN_INTO_ITEMS = [
657
- {
658
- key: "paragraph",
659
- label: "Text",
660
- icon: Type
661
- },
662
- {
663
- key: "h1",
664
- label: "Heading 1",
665
- icon: Heading1
666
- },
667
- {
668
- key: "h2",
669
- label: "Heading 2",
670
- icon: Heading2
671
- },
672
- {
673
- key: "h3",
674
- label: "Heading 3",
675
- icon: Heading3
676
- },
677
- {
678
- key: "bullet",
679
- label: "Bullet List",
680
- icon: List
681
- },
682
- {
683
- key: "numbered",
684
- label: "Numbered List",
685
- icon: ListOrdered
686
- },
687
- {
688
- key: "todo",
689
- label: "To-do",
690
- icon: ListChecks
691
- },
692
- {
693
- key: "quote",
694
- label: "Quote",
695
- icon: TextQuote
696
- },
697
- {
698
- key: "divider",
699
- label: "Divider",
700
- icon: Minus
701
- },
702
- {
703
- key: "code",
704
- label: "Code",
705
- icon: Code2
706
- }
707
- ];
1042
+ var GUTTER_INSET = 26;
1043
+ var GRIP_HEIGHT = 24;
708
1044
  function getBlockElement(editor, target) {
709
1045
  const rootElement = editor.getRootElement();
710
1046
  if (!rootElement) return null;
@@ -764,13 +1100,6 @@ function toPagePosition(rect) {
764
1100
  left: rect.left + window.scrollX
765
1101
  };
766
1102
  }
767
- function $cloneNode(node) {
768
- const Klass = node.constructor;
769
- const serialized = node.exportJSON();
770
- const clone = Klass.importJSON(serialized);
771
- if ($isElementNode(node) && $isElementNode(clone)) for (const child of node.getChildren()) clone.append($cloneNode(child));
772
- return clone;
773
- }
774
1103
  function BlockHandleInner({ editor }) {
775
1104
  const { className: portalClassName, theme } = usePortalTheme();
776
1105
  const [handle, setHandle] = useState({
@@ -842,6 +1171,7 @@ function BlockHandleInner({ editor }) {
842
1171
  const blockRect = element.getBoundingClientRect();
843
1172
  const rootRect = rootElement.getBoundingClientRect();
844
1173
  const page = toPagePosition(blockRect);
1174
+ const computed = getComputedStyle(element);
845
1175
  let nodeKey = null;
846
1176
  editor.read(() => {
847
1177
  const node = $getNearestNodeFromDOMNode(element);
@@ -849,8 +1179,12 @@ function BlockHandleInner({ editor }) {
849
1179
  });
850
1180
  setHandle({
851
1181
  visible: true,
852
- top: page.top,
853
- left: toPagePosition(rootRect).left - HANDLE_OFFSET,
1182
+ top: handleTop({
1183
+ top: page.top,
1184
+ paddingTop: Number.parseFloat(computed.paddingTop) || 0,
1185
+ lineHeight: parseLineHeight(computed.lineHeight, computed.fontSize)
1186
+ }, GRIP_HEIGHT),
1187
+ left: toPagePosition(rootRect).left - GUTTER_INSET,
854
1188
  nodeKey
855
1189
  });
856
1190
  }, [editor]);
@@ -897,56 +1231,21 @@ function BlockHandleInner({ editor }) {
897
1231
  };
898
1232
  }, [updatePositionFromBlock]);
899
1233
  useEffect(() => editor.registerUpdateListener(() => updatePositionFromBlock()), [editor, updatePositionFromBlock]);
900
- const handleAddBlock = useCallback(() => {
901
- if (!handle.nodeKey) return;
902
- editor.update(() => {
903
- const node = $getNodeByKey(handle.nodeKey);
904
- if (!node) return;
905
- const paragraph = $createParagraphNode();
906
- node.insertAfter(paragraph);
907
- paragraph.selectStart();
908
- });
909
- }, [editor, handle.nodeKey]);
1234
+ useBlockMoveShortcuts(editor, getSelectedKeys);
1235
+ const { gap, insertAtGap, onPlusEnter, onPlusLeave } = useGapInsert(editor, useCallback((target) => getBlockElement(editor, target) !== null, [editor]));
1236
+ useEffect(() => {
1237
+ if (!gap || menuOpenCountRef.current > 0) return;
1238
+ clearHideTimer();
1239
+ activeBlockRef.current = null;
1240
+ setHandle((state) => state.visible ? {
1241
+ ...state,
1242
+ visible: false,
1243
+ nodeKey: null
1244
+ } : state);
1245
+ }, [clearHideTimer, gap]);
910
1246
  const handleTurnInto = useCallback((type) => {
911
- const { nodeKey } = handle;
912
- if (!nodeKey) return;
913
- if ([
914
- "bullet",
915
- "numbered",
916
- "todo",
917
- "divider"
918
- ].includes(type)) {
919
- editor.update(() => {
920
- const node = $getNodeByKey(nodeKey);
921
- if (!node) return;
922
- if ($isElementNode(node)) node.selectStart();
923
- });
924
- const commands = {
925
- bullet: INSERT_UNORDERED_LIST_COMMAND,
926
- numbered: INSERT_ORDERED_LIST_COMMAND,
927
- todo: INSERT_CHECK_LIST_COMMAND,
928
- divider: INSERT_HORIZONTAL_RULE_COMMAND
929
- };
930
- editor.dispatchCommand(commands[type], void 0);
931
- return;
932
- }
933
- editor.update(() => {
934
- const node = $getNodeByKey(nodeKey);
935
- if (!node || !$isElementNode(node)) return;
936
- node.selectStart();
937
- const selection = $getSelection();
938
- if (!$isRangeSelection(selection)) return;
939
- const create = {
940
- paragraph: () => $createParagraphNode(),
941
- h1: () => $createHeadingNode("h1"),
942
- h2: () => $createHeadingNode("h2"),
943
- h3: () => $createHeadingNode("h3"),
944
- quote: () => $createQuoteNode(),
945
- code: () => $createCodeNode()
946
- }[type];
947
- if (create) $setBlocksType(selection, create);
948
- });
949
- }, [editor, handle]);
1247
+ if (handle.nodeKey) turnBlockInto(editor, handle.nodeKey, type);
1248
+ }, [editor, handle.nodeKey]);
950
1249
  const handleDelete = useCallback(() => {
951
1250
  deleteSelectedBlocks(handle.nodeKey);
952
1251
  setHandle((state) => ({
@@ -960,56 +1259,19 @@ function BlockHandleInner({ editor }) {
960
1259
  const keys = selectedKeys.length > 0 ? selectedKeys : handle.nodeKey ? [handle.nodeKey] : [];
961
1260
  if (!keys.length) return;
962
1261
  editor.update(() => {
963
- const children = $getRoot().getChildren();
964
- const keySet = new Set(keys);
965
- const nodesToDuplicate = children.filter((child) => keySet.has(child.getKey()));
966
- if (!nodesToDuplicate.length) return;
967
- let insertAfter = nodesToDuplicate.at(-1);
968
- for (const node of nodesToDuplicate) {
969
- const clone = $cloneNode(node);
970
- insertAfter.insertAfter(clone);
971
- insertAfter = clone;
972
- }
1262
+ $duplicateBlocks(keys);
973
1263
  });
974
1264
  }, [
975
1265
  editor,
976
1266
  getSelectedKeys,
977
1267
  handle.nodeKey
978
1268
  ]);
979
- const handleMoveUp = useCallback(() => {
1269
+ const moveBlocks = useCallback((direction) => {
980
1270
  const selectedKeys = getSelectedKeys();
981
1271
  const keys = selectedKeys.length > 0 ? selectedKeys : handle.nodeKey ? [handle.nodeKey] : [];
982
1272
  if (!keys.length) return;
983
1273
  editor.update(() => {
984
- const children = $getRoot().getChildren();
985
- const keySet = new Set(keys);
986
- const selectedNodes = children.filter((child) => keySet.has(child.getKey()));
987
- if (!selectedNodes.length) return;
988
- const previousSibling = selectedNodes[0].getPreviousSibling();
989
- if (!previousSibling || keySet.has(previousSibling.getKey())) return;
990
- const lastSelected = selectedNodes.at(-1);
991
- previousSibling.remove();
992
- lastSelected.insertAfter(previousSibling);
993
- });
994
- }, [
995
- editor,
996
- getSelectedKeys,
997
- handle.nodeKey
998
- ]);
999
- const handleMoveDown = useCallback(() => {
1000
- const selectedKeys = getSelectedKeys();
1001
- const keys = selectedKeys.length > 0 ? selectedKeys : handle.nodeKey ? [handle.nodeKey] : [];
1002
- if (!keys.length) return;
1003
- editor.update(() => {
1004
- const children = $getRoot().getChildren();
1005
- const keySet = new Set(keys);
1006
- const selectedNodes = children.filter((child) => keySet.has(child.getKey()));
1007
- if (!selectedNodes.length) return;
1008
- const nextSibling = selectedNodes.at(-1).getNextSibling();
1009
- if (!nextSibling || keySet.has(nextSibling.getKey())) return;
1010
- const firstSelected = selectedNodes[0];
1011
- nextSibling.remove();
1012
- firstSelected.insertBefore(nextSibling);
1274
+ $moveBlocks(keys, direction);
1013
1275
  });
1014
1276
  }, [
1015
1277
  editor,
@@ -1093,6 +1355,12 @@ function BlockHandleInner({ editor }) {
1093
1355
  return open;
1094
1356
  });
1095
1357
  }, [onMenuOpenChange]);
1358
+ const gripLongPress = useLongPress(() => {
1359
+ if (!handle.nodeKey) return;
1360
+ selectBlock(handle.nodeKey, false);
1361
+ onGripOpenChange(true);
1362
+ });
1363
+ const currentBlockType = gripMenuOpen && handle.nodeKey ? editor.getEditorState().read(() => $getBlockTypeId($getNodeByKey(handle.nodeKey))) : null;
1096
1364
  const onGripMouseDownCapture = useCallback((event) => {
1097
1365
  dragStartedRef.current = false;
1098
1366
  if (event.button === 0) event.stopPropagation();
@@ -1109,9 +1377,11 @@ function BlockHandleInner({ editor }) {
1109
1377
  const { nodeKey } = handle;
1110
1378
  const { shiftKey } = event;
1111
1379
  editor.focus(() => selectBlock(nodeKey, shiftKey));
1380
+ if (!shiftKey) onGripOpenChange(true);
1112
1381
  }, [
1113
1382
  editor,
1114
1383
  handle.nodeKey,
1384
+ onGripOpenChange,
1115
1385
  selectBlock
1116
1386
  ]);
1117
1387
  const onGripContextMenu = useCallback((event) => {
@@ -1281,73 +1551,68 @@ function BlockHandleInner({ editor }) {
1281
1551
  "data-theme": theme,
1282
1552
  "style": { display: "contents" }
1283
1553
  } : {},
1284
- children: [/* @__PURE__ */ jsxs("div", {
1285
- className: `${handleContainer} ${handle.visible ? handleContainerVisible : ""}`,
1286
- style: {
1287
- top: handle.top,
1288
- left: handle.left
1289
- },
1290
- onMouseEnter: onHandleEnter,
1291
- onMouseLeave: onHandleLeave,
1292
- children: [/* @__PURE__ */ jsx("button", {
1293
- "aria-label": "Add block",
1294
- className: handleBtn,
1295
- onClick: handleAddBlock,
1554
+ children: [
1555
+ /* @__PURE__ */ jsx("div", {
1556
+ className: `${handleContainer} ${handle.visible ? handleContainerVisible : ""}`,
1557
+ style: {
1558
+ top: handle.top,
1559
+ left: handle.left
1560
+ },
1561
+ onMouseEnter: onHandleEnter,
1562
+ onMouseLeave: onHandleLeave,
1563
+ children: /* @__PURE__ */ jsxs(DropdownMenu, {
1564
+ open: gripMenuOpen,
1565
+ onOpenChange: onGripOpenChange,
1566
+ children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
1567
+ draggable: true,
1568
+ "aria-label": "Block actions",
1569
+ className: grip,
1570
+ onClick: onGripClick,
1571
+ onContextMenu: onGripContextMenu,
1572
+ onDragStart: onGripDragStart,
1573
+ onMouseDownCapture: onGripMouseDownCapture,
1574
+ ...gripLongPress,
1575
+ children: /* @__PURE__ */ jsx(GripVertical, { size: 16 })
1576
+ }), /* @__PURE__ */ jsx(BlockMenu, {
1577
+ currentType: currentBlockType,
1578
+ onDelete: handleDelete,
1579
+ onDuplicate: handleDuplicate,
1580
+ onMoveDown: () => moveBlocks("down"),
1581
+ onMoveUp: () => moveBlocks("up"),
1582
+ onTurnInto: handleTurnInto
1583
+ })]
1584
+ })
1585
+ }),
1586
+ gap && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
1587
+ className: "iihqkc3",
1588
+ style: {
1589
+ top: gap.top,
1590
+ left: gap.left,
1591
+ width: gap.width
1592
+ }
1593
+ }), /* @__PURE__ */ jsx("button", {
1594
+ "aria-label": "Insert block",
1595
+ className: "iihqkc4",
1596
+ style: {
1597
+ top: gap.top,
1598
+ left: gap.left - GUTTER_INSET
1599
+ },
1600
+ type: "button",
1601
+ onClick: insertAtGap,
1602
+ onMouseDown: (event) => event.preventDefault(),
1603
+ onMouseEnter: onPlusEnter,
1604
+ onMouseLeave: onPlusLeave,
1296
1605
  children: /* @__PURE__ */ jsx(Plus, { size: 14 })
1297
- }), /* @__PURE__ */ jsxs(DropdownMenu, {
1298
- open: gripMenuOpen,
1299
- onOpenChange: onGripOpenChange,
1300
- children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
1301
- draggable: true,
1302
- "aria-label": "Block actions",
1303
- className: handleBtn,
1304
- onClick: onGripClick,
1305
- onContextMenu: onGripContextMenu,
1306
- onDragStart: onGripDragStart,
1307
- onMouseDownCapture: onGripMouseDownCapture,
1308
- children: /* @__PURE__ */ jsx(GripVertical, { size: 14 })
1309
- }), /* @__PURE__ */ jsxs(DropdownMenuContent, {
1310
- align: "start",
1311
- side: "bottom",
1312
- sideOffset: 4,
1313
- children: [
1314
- /* @__PURE__ */ jsxs(DropdownMenuGroup, { children: [/* @__PURE__ */ jsx(DropdownMenuLabel, { children: "TURN INTO" }), TURN_INTO_ITEMS.map((item) => /* @__PURE__ */ jsxs(DropdownMenuItem, {
1315
- onClick: () => handleTurnInto(item.key),
1316
- children: [/* @__PURE__ */ jsx(item.icon, {}), item.label]
1317
- }, item.key))] }),
1318
- /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
1319
- /* @__PURE__ */ jsxs(DropdownMenuGroup, { children: [
1320
- /* @__PURE__ */ jsx(DropdownMenuLabel, { children: "ACTIONS" }),
1321
- /* @__PURE__ */ jsxs(DropdownMenuItem, {
1322
- onClick: handleDuplicate,
1323
- children: [/* @__PURE__ */ jsx(Copy, {}), "Duplicate"]
1324
- }),
1325
- /* @__PURE__ */ jsxs(DropdownMenuItem, {
1326
- onClick: handleMoveUp,
1327
- children: [/* @__PURE__ */ jsx(ArrowUp, {}), "Move Up"]
1328
- }),
1329
- /* @__PURE__ */ jsxs(DropdownMenuItem, {
1330
- onClick: handleMoveDown,
1331
- children: [/* @__PURE__ */ jsx(ArrowDown, {}), "Move Down"]
1332
- })
1333
- ] }),
1334
- /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
1335
- /* @__PURE__ */ jsxs(DropdownMenuItem, {
1336
- className: menuItemDestructive,
1337
- onClick: handleDelete,
1338
- children: [/* @__PURE__ */ jsx(Trash2, {}), "Delete"]
1339
- })
1340
- ]
1341
- })]
1342
- })]
1343
- }), dropLine.visible && /* @__PURE__ */ jsx("div", {
1344
- className: "iihqkc5",
1345
- style: {
1346
- top: dropLine.top,
1347
- left: dropLine.left,
1348
- width: dropLine.width
1349
- }
1350
- })]
1606
+ })] }),
1607
+ dropLine.visible && /* @__PURE__ */ jsx("div", {
1608
+ className: "iihqkc7",
1609
+ style: {
1610
+ top: dropLine.top,
1611
+ left: dropLine.left,
1612
+ width: dropLine.width
1613
+ }
1614
+ })
1615
+ ]
1351
1616
  });
1352
1617
  }
1353
1618
  function BlockHandlePlugin() {
@@ -1,2 +1,2 @@
1
- :root{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#f5f5f5);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-max-width:700px;--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-flow-paragraph:1.25em;--rc-flow-list:.375em;--rc-flow-block:2em;--rc-flow-heading:2em;--rc-font-family-sans:var(--rc-host-font-family-sans,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-font-family-serif:var(--rc-host-font-family-serif,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-font-family-kai:var(--rc-host-font-family-kai,"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif);--rc-font-mono:var(--rc-host-font-mono,"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, "PingFang SC", "Noto Sans SC", monospace);--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-font-size-code:.8125em;--rc-font-size-caption:.8125em;--rc-line-height:1.75;--rc-line-height-tight:1.35;--rc-line-height-compact:1.6;--rc-line-height-code:1.7;--rc-font-family:var(--rc-host-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}:root.dark,[data-theme=dark]{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1a);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}._1bfi5uc0{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#f5f5f5);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-max-width:700px;--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-flow-paragraph:1.25em;--rc-flow-list:.375em;--rc-flow-block:2em;--rc-flow-heading:2em;--rc-font-family-sans:var(--rc-host-font-family-sans,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-font-family-serif:var(--rc-host-font-family-serif,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-font-family-kai:var(--rc-host-font-family-kai,"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif);--rc-font-mono:var(--rc-host-font-mono,"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, "PingFang SC", "Noto Sans SC", monospace);--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-font-size-code:.8125em;--rc-font-size-caption:.8125em;--rc-line-height:1.75;--rc-line-height-tight:1.35;--rc-line-height-compact:1.6;--rc-line-height-code:1.7;--rc-font-family:var(--rc-host-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}._1bfi5uc1{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#f5f5f5);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-max-width:700px;--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-flow-paragraph:.5em;--rc-flow-list:.375em;--rc-flow-block:2em;--rc-flow-heading:2em;--rc-font-family-sans:var(--rc-host-font-family-sans,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-font-family-serif:var(--rc-host-font-family-serif,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-font-family-kai:var(--rc-host-font-family-kai,"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif);--rc-font-mono:var(--rc-host-font-mono,"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, "PingFang SC", "Noto Sans SC", monospace);--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-font-size-code:.8125em;--rc-font-size-caption:.8125em;--rc-line-height:1.85;--rc-line-height-tight:1.35;--rc-line-height-compact:1.6;--rc-line-height-code:1.7;--rc-font-family:var(--rc-host-font-family,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}._1bfi5uc2{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#fafafa);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-max-width:none;--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-space-xs:2px;--rc-space-sm:4px;--rc-space-md:10px;--rc-space-lg:16px;--rc-space-xl:20px;--rc-flow-paragraph:.6em;--rc-flow-list:.25em;--rc-flow-block:1em;--rc-flow-heading:1em;--rc-font-family-sans:var(--rc-host-font-family-sans,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-font-family-serif:var(--rc-host-font-family-serif,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-font-family-kai:var(--rc-host-font-family-kai,"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif);--rc-font-mono:var(--rc-host-font-mono,"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, "PingFang SC", "Noto Sans SC", monospace);--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:14px;--rc-font-size-small:12px;--rc-font-size-code:.9286em;--rc-font-size-caption:.9286em;--rc-line-height:1.6;--rc-line-height-tight:1.3;--rc-line-height-compact:1.6;--rc-line-height-code:1.7;--rc-font-family:var(--rc-host-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-radius-sm:3px;--rc-radius-md:6px;--rc-radius-lg:12px}._1bfi5uc3{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#fafafa);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-max-width:none;--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-flow-paragraph:.75em;--rc-flow-list:.25em;--rc-flow-block:1em;--rc-flow-heading:1em;--rc-font-family-sans:var(--rc-host-font-family-sans,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-font-family-serif:var(--rc-host-font-family-serif,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-font-family-kai:var(--rc-host-font-family-kai,"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif);--rc-font-mono:var(--rc-host-font-mono,"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, "PingFang SC", "Noto Sans SC", monospace);--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:15px;--rc-font-size-small:13px;--rc-font-size-code:.8667em;--rc-font-size-caption:.8667em;--rc-line-height:1.65;--rc-line-height-tight:1.3;--rc-line-height-compact:1.6;--rc-line-height-code:1.7;--rc-font-family:var(--rc-host-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}.dark ._1bfi5uc0,[data-theme=dark] ._1bfi5uc0,.dark._1bfi5uc0,[data-theme=dark]._1bfi5uc0,.dark ._1bfi5uc1,[data-theme=dark] ._1bfi5uc1,.dark._1bfi5uc1,[data-theme=dark]._1bfi5uc1,.dark ._1bfi5uc2,[data-theme=dark] ._1bfi5uc2,.dark._1bfi5uc2,[data-theme=dark]._1bfi5uc2,.dark ._1bfi5uc3,[data-theme=dark] ._1bfi5uc3,.dark._1bfi5uc3,[data-theme=dark]._1bfi5uc3{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1a);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}.iihqkc0{z-index:30;opacity:0;pointer-events:none;align-items:center;gap:1px;transition:opacity .15s;display:flex;position:absolute}.iihqkc1{opacity:1;pointer-events:auto}.iihqkc2{width:24px;height:24px;color:var(--rc-text-quaternary);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:0;transition:background-color .12s ease-out,color .12s ease-out;display:flex}.iihqkc2:hover{background:var(--rc-fill-secondary);color:var(--rc-text-secondary)}.iihqkc3{opacity:.35}.iihqkc4{z-index:40;pointer-events:none;box-sizing:border-box;opacity:.9;background-color:var(--rc-bg);border-radius:var(--rc-radius-md);box-shadow:var(--rc-shadow-menu);border:none;margin:0;position:fixed;top:-10000px;left:-10000px}.iihqkc5{background:var(--rc-accent);z-index:30;pointer-events:none;border-radius:1px;height:2px;position:absolute}.iihqkc6{box-shadow:0 0 0 2px var(--rc-accent-light);background-color:var(--rc-accent-light);border-radius:var(--rc-radius-sm);transition:box-shadow .12s ease-out,background-color .12s ease-out}.iihqkc7{background-color:var(--rc-accent);min-width:20px;height:20px;color:var(--rc-bg);font-family:var(--rc-font-family-sans);box-shadow:var(--rc-shadow-xs);border-radius:10px;justify-content:center;align-items:center;padding:0 6px;font-size:12px;font-weight:600;display:flex;position:absolute;top:-8px;right:-8px}.iihqkc8{color:var(--rc-alert-caution)}.iihqkc8[data-highlighted]{color:var(--rc-alert-caution);background-color:color-mix(in srgb, var(--rc-alert-caution) 8%, transparent)}.iihqkc8 svg,.iihqkc8[data-highlighted] svg{color:var(--rc-alert-caution)}
1
+ :root{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#f5f5f5);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-max-width:700px;--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-flow-paragraph:1.25em;--rc-flow-list:.375em;--rc-flow-block:2em;--rc-flow-heading:2em;--rc-font-family-sans:var(--rc-host-font-family-sans,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-font-family-serif:var(--rc-host-font-family-serif,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-font-family-kai:var(--rc-host-font-family-kai,"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif);--rc-font-mono:var(--rc-host-font-mono,"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, "PingFang SC", "Noto Sans SC", monospace);--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-font-size-code:.8125em;--rc-font-size-caption:.8125em;--rc-line-height:1.75;--rc-line-height-tight:1.35;--rc-line-height-compact:1.6;--rc-line-height-code:1.7;--rc-font-family:var(--rc-host-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}:root.dark,[data-theme=dark]{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-bg-elevated:var(--rc-host-bg-elevated,#171717);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1f);--rc-scrim:var(--rc-host-scrim,#0000008f);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}._1bfi5uc0{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#f5f5f5);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-max-width:700px;--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-flow-paragraph:1.25em;--rc-flow-list:.375em;--rc-flow-block:2em;--rc-flow-heading:2em;--rc-font-family-sans:var(--rc-host-font-family-sans,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-font-family-serif:var(--rc-host-font-family-serif,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-font-family-kai:var(--rc-host-font-family-kai,"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif);--rc-font-mono:var(--rc-host-font-mono,"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, "PingFang SC", "Noto Sans SC", monospace);--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-font-size-code:.8125em;--rc-font-size-caption:.8125em;--rc-line-height:1.75;--rc-line-height-tight:1.35;--rc-line-height-compact:1.6;--rc-line-height-code:1.7;--rc-font-family:var(--rc-host-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}._1bfi5uc1{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#f5f5f5);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-max-width:700px;--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-flow-paragraph:.5em;--rc-flow-list:.375em;--rc-flow-block:2em;--rc-flow-heading:2em;--rc-font-family-sans:var(--rc-host-font-family-sans,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-font-family-serif:var(--rc-host-font-family-serif,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-font-family-kai:var(--rc-host-font-family-kai,"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif);--rc-font-mono:var(--rc-host-font-mono,"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, "PingFang SC", "Noto Sans SC", monospace);--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:16px;--rc-font-size-small:14px;--rc-font-size-code:.8125em;--rc-font-size-caption:.8125em;--rc-line-height:1.85;--rc-line-height-tight:1.35;--rc-line-height-compact:1.6;--rc-line-height-code:1.7;--rc-font-family:var(--rc-host-font-family,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}._1bfi5uc2{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#fafafa);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-max-width:none;--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-space-xs:2px;--rc-space-sm:4px;--rc-space-md:10px;--rc-space-lg:16px;--rc-space-xl:20px;--rc-flow-paragraph:.6em;--rc-flow-list:.25em;--rc-flow-block:1em;--rc-flow-heading:1em;--rc-font-family-sans:var(--rc-host-font-family-sans,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-font-family-serif:var(--rc-host-font-family-serif,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-font-family-kai:var(--rc-host-font-family-kai,"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif);--rc-font-mono:var(--rc-host-font-mono,"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, "PingFang SC", "Noto Sans SC", monospace);--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:14px;--rc-font-size-small:12px;--rc-font-size-code:.9286em;--rc-font-size-caption:.9286em;--rc-line-height:1.6;--rc-line-height-tight:1.3;--rc-line-height-compact:1.6;--rc-line-height-code:1.7;--rc-font-family:var(--rc-host-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-radius-sm:3px;--rc-radius-md:6px;--rc-radius-lg:12px}._1bfi5uc3{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#fafafa);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-max-width:none;--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-space-xs:4px;--rc-space-sm:8px;--rc-space-md:16px;--rc-space-lg:24px;--rc-space-xl:32px;--rc-flow-paragraph:.75em;--rc-flow-list:.25em;--rc-flow-block:1em;--rc-flow-heading:1em;--rc-font-family-sans:var(--rc-host-font-family-sans,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-font-family-serif:var(--rc-host-font-family-serif,"Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif", "source-han-serif-sc", "Songti SC", STSong, "华文宋体", serif);--rc-font-family-kai:var(--rc-host-font-family-kai,"楷体", KaiTi, STKaiti, "Kaiti SC", "LXGW WenKai", "霞鹜文楷", "Noto Serif CJK SC", serif);--rc-font-mono:var(--rc-host-font-mono,"SF Mono", SFMono-Regular, ui-monospace, "DejaVu Sans Mono", Menlo, Consolas, "PingFang SC", "Noto Sans SC", monospace);--rc-font-size-2xs:.625em;--rc-font-size-xs:.75em;--rc-font-size-sm:.8125em;--rc-font-size-md:.875em;--rc-font-size-lg:1.25em;--rc-font-size-base:15px;--rc-font-size-small:13px;--rc-font-size-code:.8667em;--rc-font-size-caption:.8667em;--rc-line-height:1.65;--rc-line-height-tight:1.3;--rc-line-height-compact:1.6;--rc-line-height-code:1.7;--rc-font-family:var(--rc-host-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Roboto, Helvetica, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji");--rc-radius-sm:4px;--rc-radius-md:8px;--rc-radius-lg:12px}.dark ._1bfi5uc0,[data-theme=dark] ._1bfi5uc0,.dark._1bfi5uc0,[data-theme=dark]._1bfi5uc0,.dark ._1bfi5uc1,[data-theme=dark] ._1bfi5uc1,.dark._1bfi5uc1,[data-theme=dark]._1bfi5uc1,.dark ._1bfi5uc2,[data-theme=dark] ._1bfi5uc2,.dark._1bfi5uc2,[data-theme=dark]._1bfi5uc2,.dark ._1bfi5uc3,[data-theme=dark] ._1bfi5uc3,.dark._1bfi5uc3,[data-theme=dark]._1bfi5uc3{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-bg-elevated:var(--rc-host-bg-elevated,#171717);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1f);--rc-scrim:var(--rc-host-scrim,#0000008f);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}[data-theme=dark] [data-theme=light] ._1bfi5uc0{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#f5f5f5);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f}[data-theme=light] [data-theme=dark] ._1bfi5uc0{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-bg-elevated:var(--rc-host-bg-elevated,#171717);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1f);--rc-scrim:var(--rc-host-scrim,#0000008f);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}[data-theme=light][data-theme]._1bfi5uc0{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#f5f5f5);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f}[data-theme=dark][data-theme]._1bfi5uc0{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-bg-elevated:var(--rc-host-bg-elevated,#171717);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1f);--rc-scrim:var(--rc-host-scrim,#0000008f);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}[data-theme=dark] [data-theme=light] ._1bfi5uc1{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#f5f5f5);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f}[data-theme=light] [data-theme=dark] ._1bfi5uc1{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-bg-elevated:var(--rc-host-bg-elevated,#171717);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1f);--rc-scrim:var(--rc-host-scrim,#0000008f);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}[data-theme=light][data-theme]._1bfi5uc1{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#f5f5f5);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f}[data-theme=dark][data-theme]._1bfi5uc1{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-bg-elevated:var(--rc-host-bg-elevated,#171717);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1f);--rc-scrim:var(--rc-host-scrim,#0000008f);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}[data-theme=dark] [data-theme=light] ._1bfi5uc2{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#fafafa);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f}[data-theme=light] [data-theme=dark] ._1bfi5uc2{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-bg-elevated:var(--rc-host-bg-elevated,#171717);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1f);--rc-scrim:var(--rc-host-scrim,#0000008f);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}[data-theme=light][data-theme]._1bfi5uc2{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#fafafa);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f}[data-theme=dark][data-theme]._1bfi5uc2{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-bg-elevated:var(--rc-host-bg-elevated,#171717);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1f);--rc-scrim:var(--rc-host-scrim,#0000008f);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}[data-theme=dark] [data-theme=light] ._1bfi5uc3{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#fafafa);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f}[data-theme=light] [data-theme=dark] ._1bfi5uc3{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-bg-elevated:var(--rc-host-bg-elevated,#171717);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1f);--rc-scrim:var(--rc-host-scrim,#0000008f);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}[data-theme=light][data-theme]._1bfi5uc3{--rc-text:var(--rc-host-text,#171717);--rc-text-secondary:var(--rc-host-text-secondary,#404040);--rc-text-tertiary:var(--rc-host-text-tertiary,#737373);--rc-text-quaternary:var(--rc-host-text-quaternary,#a3a3a3);--rc-bg:var(--rc-host-bg,#fff);--rc-bg-secondary:var(--rc-host-bg-secondary,#fafafa);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#f5f5f5);--rc-bg-elevated:var(--rc-host-bg-elevated,#fff);--rc-fill:var(--rc-host-fill,#00000012);--rc-fill-secondary:var(--rc-host-fill-secondary,#0000000b);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#00000008);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#00000005);--rc-border:var(--rc-host-border,#e5e5e5);--rc-border-subtle:var(--rc-host-border-subtle,#f0f0f0);--rc-ring:var(--rc-host-ring,#00000014);--rc-scrim:var(--rc-host-scrim,#00000052);--rc-accent:var(--rc-host-accent,#2563eb);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 10%, transparent));--rc-link:var(--rc-host-link,#2563eb);--rc-code-text:var(--rc-host-code-text,#171717);--rc-code-bg:var(--rc-host-code-bg,#f5f5f5);--rc-code-header-bg:var(--rc-host-code-header-bg,#f5f5f5);--rc-hr-border:var(--rc-host-hr-border,#e5e5e5);--rc-quote-border:var(--rc-host-quote-border,#e5e5e5);--rc-quote-bg:var(--rc-host-quote-bg,#fafafa);--rc-alert-info:var(--rc-host-alert-info,#2563eb);--rc-alert-warning:var(--rc-host-alert-warning,#b45309);--rc-alert-tip:var(--rc-host-alert-tip,#15803d);--rc-alert-caution:var(--rc-host-alert-caution,#dc2626);--rc-alert-important:var(--rc-host-alert-important,#7c3aed);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0000000d;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f;--rc-shadow-modal:0 0 0 1px #0000000f, 0 16px 48px -12px #00000040;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 4px 12px #0000000f, 0 12px 32px -8px #0000001f}[data-theme=dark][data-theme]._1bfi5uc3{--rc-text:var(--rc-host-text,#ededed);--rc-text-secondary:var(--rc-host-text-secondary,#c4c4c4);--rc-text-tertiary:var(--rc-host-text-tertiary,#8f8f8f);--rc-text-quaternary:var(--rc-host-text-quaternary,#5c5c5c);--rc-bg:var(--rc-host-bg,#0a0a0a);--rc-bg-secondary:var(--rc-host-bg-secondary,#121212);--rc-bg-tertiary:var(--rc-host-bg-tertiary,#1a1a1a);--rc-bg-elevated:var(--rc-host-bg-elevated,#171717);--rc-fill:var(--rc-host-fill,#ffffff17);--rc-fill-secondary:var(--rc-host-fill-secondary,#ffffff0f);--rc-fill-tertiary:var(--rc-host-fill-tertiary,#ffffff0a);--rc-fill-quaternary:var(--rc-host-fill-quaternary,#ffffff06);--rc-border:var(--rc-host-border,#262626);--rc-border-subtle:var(--rc-host-border-subtle,#1c1c1c);--rc-ring:var(--rc-host-ring,#ffffff1f);--rc-scrim:var(--rc-host-scrim,#0000008f);--rc-accent:var(--rc-host-accent,#60a5fa);--rc-accent-light:var(--rc-host-accent-light,color-mix(in oklab, var(--rc-accent) 16%, transparent));--rc-link:var(--rc-host-link,#60a5fa);--rc-code-text:var(--rc-host-code-text,#ededed);--rc-code-bg:var(--rc-host-code-bg,#1a1a1a);--rc-code-header-bg:var(--rc-host-code-header-bg,#1a1a1a);--rc-hr-border:var(--rc-host-hr-border,#262626);--rc-quote-border:var(--rc-host-quote-border,#262626);--rc-quote-bg:var(--rc-host-quote-bg,#1a1a1a);--rc-alert-info:var(--rc-host-alert-info,#60a5fa);--rc-alert-warning:var(--rc-host-alert-warning,#fbbf24);--rc-alert-tip:var(--rc-host-alert-tip,#4ade80);--rc-alert-caution:var(--rc-host-alert-caution,#f87171);--rc-alert-important:var(--rc-host-alert-important,#a78bfa);--rc-shadow-xs:0 0 0 1px var(--rc-ring), 0 1px 2px #0006;--rc-shadow-top-bar:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009;--rc-shadow-modal:0 0 0 1px #ffffff14, 0 16px 48px -12px #000000b3;--rc-shadow-menu:0 0 0 1px var(--rc-ring), 0 8px 24px #00000080, 0 16px 40px -8px #0009}.iihqkc0{z-index:30;opacity:0;pointer-events:none;align-items:center;transition:opacity .12s;display:flex;position:absolute}.iihqkc1{opacity:1;pointer-events:auto}.iihqkc2{width:20px;height:24px;color:var(--rc-text-quaternary);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;background:0 0;border:none;border-radius:4px;outline:none;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s;display:flex}.iihqkc2:hover{background:var(--rc-fill-secondary);color:var(--rc-text-secondary)}.iihqkc2:focus-visible{box-shadow:0 0 0 1px var(--rc-accent), 0 0 0 3px var(--rc-accent-light)}.iihqkc2[data-popup-open]{background:var(--rc-fill);color:var(--rc-text)}.iihqkc3{z-index:30;border-top:1px solid var(--rc-accent);pointer-events:none;height:0;position:absolute;transform:translateY(-.5px)}.iihqkc4{z-index:31;background-color:var(--rc-bg-elevated);width:20px;height:20px;box-shadow:var(--rc-shadow-xs);color:var(--rc-text-secondary);cursor:pointer;border:none;border-radius:8px;outline:none;justify-content:center;align-items:center;padding:0;transition:color .12s;display:flex;position:absolute;transform:translateY(-50%)}.iihqkc4:hover{color:var(--rc-text)}.iihqkc4:focus-visible{box-shadow:0 0 0 1px var(--rc-accent), 0 0 0 3px var(--rc-accent-light)}.iihqkc5{opacity:.35}.iihqkc6{z-index:40;pointer-events:none;box-sizing:border-box;opacity:.9;background-color:var(--rc-bg-elevated);box-shadow:var(--rc-shadow-menu);border:none;border-radius:8px;margin:0;position:fixed;top:-10000px;left:-10000px}.iihqkc7{border-top:2px solid var(--rc-accent);z-index:30;pointer-events:none;border-radius:1px;height:0;position:absolute;transform:translateY(-1px)}.iihqkc8{box-shadow:0 0 0 2px var(--rc-accent-light);background-color:var(--rc-accent-light);border-radius:4px;transition:box-shadow .12s,background-color .12s}.iihqkc9{box-sizing:border-box;background-color:var(--rc-text);min-width:20px;height:20px;color:var(--rc-bg);font-family:var(--rc-font-family-sans);box-shadow:var(--rc-shadow-xs);border-radius:10px;justify-content:center;align-items:center;padding:0 6px;font-size:12px;font-weight:600;display:flex;position:absolute;top:-8px;right:-8px}
2
2
  /*$vite$:1*/
@@ -1,10 +1,11 @@
1
1
  export declare const handleContainer: string;
2
2
  export declare const handleContainerVisible: string;
3
- export declare const handleBtn: string;
3
+ export declare const grip: string;
4
+ export declare const gapLine: string;
5
+ export declare const gapPlus: string;
4
6
  export declare const draggingBlock: string;
5
7
  export declare const dragPreview: string;
6
8
  export declare const dropIndicator: string;
7
9
  export declare const blockSelected: string;
8
10
  export declare const dragCountBadge: string;
9
- export declare const menuItemDestructive: string;
10
11
  //# sourceMappingURL=styles.css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.css.d.ts","sourceRoot":"","sources":["../src/styles.css.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,eAAe,QAS1B,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAGjC,CAAC;AAGH,eAAO,MAAM,SAAS,QAiBpB,CAAC;AAGH,eAAO,MAAM,aAAa,QAExB,CAAC;AAEH,eAAO,MAAM,WAAW,QAatB,CAAC;AAGH,eAAO,MAAM,aAAa,QAOxB,CAAC;AAGH,eAAO,MAAM,aAAa,QAKxB,CAAC;AAEH,eAAO,MAAM,cAAc,QAiBzB,CAAC;AAGH,eAAO,MAAM,mBAAmB,QAQ9B,CAAC"}
1
+ {"version":3,"file":"styles.css.d.ts","sourceRoot":"","sources":["../src/styles.css.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,QAQ1B,CAAC;AAEH,eAAO,MAAM,sBAAsB,QAGjC,CAAC;AAEH,eAAO,MAAM,IAAI,QA8Bf,CAAC;AAEH,eAAO,MAAM,OAAO,QAOlB,CAAC;AAEH,eAAO,MAAM,OAAO,QAwBlB,CAAC;AAEH,eAAO,MAAM,aAAa,QAExB,CAAC;AAEH,eAAO,MAAM,WAAW,QAatB,CAAC;AAEH,eAAO,MAAM,aAAa,QAQxB,CAAC;AAEH,eAAO,MAAM,aAAa,QAKxB,CAAC;AAEH,eAAO,MAAM,cAAc,QAkBzB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { CommandListener, LexicalEditor } from 'lexical';
2
+ export declare function createBlockMoveHandler(editor: LexicalEditor, getSelectedKeys: () => string[], isMac: boolean): CommandListener<KeyboardEvent>;
3
+ export declare function useBlockMoveShortcuts(editor: LexicalEditor, getSelectedKeys: () => string[]): void;
4
+ //# sourceMappingURL=useBlockMoveShortcuts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBlockMoveShortcuts.d.ts","sourceRoot":"","sources":["../src/useBlockMoveShortcuts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAQ9D,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,aAAa,EACrB,eAAe,EAAE,MAAM,MAAM,EAAE,EAC/B,KAAK,EAAE,OAAO,GACb,eAAe,CAAC,aAAa,CAAC,CAehC;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,MAAM,EAAE,QAU3F"}
@@ -0,0 +1,14 @@
1
+ import { LexicalEditor } from 'lexical';
2
+ export interface GapState {
3
+ index: number;
4
+ left: number;
5
+ top: number;
6
+ width: number;
7
+ }
8
+ export declare function useGapInsert(editor: LexicalEditor, isBlockTarget: (target: HTMLElement) => boolean): {
9
+ gap: GapState | null;
10
+ insertAtGap: () => void;
11
+ onPlusEnter: () => void;
12
+ onPlusLeave: () => void;
13
+ };
14
+ //# sourceMappingURL=useGapInsert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGapInsert.d.ts","sourceRoot":"","sources":["../src/useGapInsert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAU7C,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAQD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO;;;;;EA0HhD"}
@@ -0,0 +1,9 @@
1
+ import { PointerEvent as ReactPointerEvent } from 'react';
2
+ export declare const LONG_PRESS_DELAY = 450;
3
+ export declare function useLongPress(onLongPress: () => void): {
4
+ onPointerDown: (event: ReactPointerEvent) => void;
5
+ onPointerMove: (event: ReactPointerEvent) => void;
6
+ onPointerUp: () => void;
7
+ onPointerCancel: () => void;
8
+ };
9
+ //# sourceMappingURL=useLongPress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLongPress.d.ts","sourceRoot":"","sources":["../src/useLongPress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,IAAI,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAG/D,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAGpC,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,IAAI;2BAmBvB,iBAAiB;2BAUjB,iBAAiB;;;EAY7C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haklex/rich-plugin-block-handle",
3
- "version": "0.57.0",
3
+ "version": "0.59.0",
4
4
  "description": "Block handle plugin with add button and context menu",
5
5
  "repository": {
6
6
  "type": "git",
@@ -42,8 +42,9 @@
42
42
  "vite": "^8.3.4"
43
43
  },
44
44
  "peerDependencies": {
45
- "@haklex/rich-editor-ui": "^0.57.0",
46
- "@haklex/rich-style-token": "^0.57.0",
45
+ "@haklex/rich-editor": "^0.59.0",
46
+ "@haklex/rich-editor-ui": "^0.59.0",
47
+ "@haklex/rich-style-token": "^0.59.0",
47
48
  "@lexical/html": "^0.52.0",
48
49
  "@lexical/list": "^0.52.0",
49
50
  "@lexical/react": "^0.52.0",