{"version":3,"file":"use-extensions.cjs","sources":["../../../app/hooks/use-extensions.ts"],"sourcesContent":["import { Extension } from \"@codemirror/state\"\nimport { keymap, ViewUpdate } from \"@codemirror/view\"\nimport { useMemo } from \"react\"\nimport { clipboardHandler, codeEditorTheme, editorKeymap, keyboardHandler, tooltipToBody } from \"../extensions\"\nimport { indentationMarkers } from \"@replit/codemirror-indentation-markers\"\nimport { createFormatExtension } from \"../extensions/format\"\nimport type { CursorPosition } from \"../code-editor\"\nimport { useBaseExtensions } from \"./use-base-extensions\"\n\ntype Props = {\n  customExtensions?: Extension[]\n  lineWrapping?: boolean\n  onChange?: (value: string, viewUpdate: ViewUpdate) => void\n  onCursorChange?: (position: CursorPosition) => void\n  onEditorUpdate: (update: ViewUpdate) => void\n  onFormat?: (formattedCode: string) => void\n  onSelectionChange?: (characterCount: number) => void\n  readonly?: boolean\n  rows?: number\n}\n\nexport function useExtensions(props: Props) {\n  const { readonly, lineWrapping = true, customExtensions = [], rows, onChange, onEditorUpdate, onFormat, onCursorChange, onSelectionChange } = props\n\n  // 使用基础扩展 hook\n  const baseExtensions = useBaseExtensions({\n    readonly,\n    lineWrapping,\n    onChange,\n    onCursorChange,\n    onSelectionChange,\n    onEditorUpdate,\n    theme: codeEditorTheme({\n      isReadOnly: readonly,\n      maxHeight: \"100%\",\n      minHeight: \"20vh\",\n      rows,\n    }),\n    includeKeymap: true,\n  })\n\n  const extensions: Extension[] = useMemo(() => {\n    const allExtensions: Extension[] = [\n      ...baseExtensions,\n      tooltipToBody,\n      clipboardHandler,\n      keyboardHandler, \n    ]\n\n    // 只读模式不需要这些扩展\n    if (!readonly) {\n      allExtensions.push(\n        // 缩进标记\n        indentationMarkers({\n          highlightActiveBlock: true,\n          markerType: \"fullScope\",\n          colors: {\n            activeDark: \"var(--color-code-indentation-marker-active)\",\n            activeLight: \"var(--color-code-indentation-marker-active)\",\n            dark: \"var(--color-code-indentation-marker)\",\n            light: \"var(--color-code-indentation-marker)\",\n          },\n        }),\n        // 编辑器键盘映射\n        keymap.of(editorKeymap),\n      )\n    }\n\n    // 格式化扩展\n    const formatExtension = onFormat ? createFormatExtension(onFormat) : []\n\n    return [...allExtensions, formatExtension, ...customExtensions]\n  }, [baseExtensions, customExtensions, onFormat, readonly])\n\n  return extensions\n}\n"],"names":["useBaseExtensions","codeEditorTheme","useMemo","tooltipToBody","clipboardHandler","keyboardHandler","indentationMarkers","keymap","editorKeymap","createFormatExtension"],"mappings":";;;;;;;;;;;;AAqBO,SAAS,cAAc,OAAc;AAC1C,QAAM,EAAE,UAAU,eAAe,MAAM,mBAAmB,CAAA,GAAI,MAAM,UAAU,gBAAgB,UAAU,gBAAgB,sBAAsB;AAG9I,QAAM,iBAAiBA,kBAAAA,kBAAkB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAOC,MAAAA,gBAAgB;AAAA,MACrB,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,IAAA,CACD;AAAA,IACD,eAAe;AAAA,EAAA,CAChB;AAED,QAAM,aAA0BC,MAAAA,QAAQ,MAAM;AAC5C,UAAM,gBAA6B;AAAA,MACjC,GAAG;AAAA,MACHC,cAAAA;AAAAA,MACAC,iBAAAA;AAAAA,MACAC,gBAAAA;AAAAA,IAAA;AAIF,QAAI,CAAC,UAAU;AACb,oBAAc;AAAA;AAAA,QAEZC,yBAAmB;AAAA,UACjB,sBAAsB;AAAA,UACtB,YAAY;AAAA,UACZ,QAAQ;AAAA,YACN,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,MAAM;AAAA,YACN,OAAO;AAAA,UAAA;AAAA,QACT,CACD;AAAA;AAAA,QAEDC,QAAAA,OAAO,GAAGC,OAAAA,YAAY;AAAA,MAAA;AAAA,IAE1B;AAGA,UAAM,kBAAkB,WAAWC,6BAAsB,QAAQ,IAAI,CAAA;AAErE,WAAO,CAAC,GAAG,eAAe,iBAAiB,GAAG,gBAAgB;AAAA,EAChE,GAAG,CAAC,gBAAgB,kBAAkB,UAAU,QAAQ,CAAC;AAEzD,SAAO;AACT;;"}