dishui 0.0.108 → 0.0.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/dist/.release-verified.json +3 -2
  2. package/dist/components/Accordion/index.js.map +1 -1
  3. package/dist/components/Avatar/index.js.map +1 -1
  4. package/dist/components/Badge/index.js.map +1 -1
  5. package/dist/components/Button/index.js.map +1 -1
  6. package/dist/components/ButtonMenu/index.js.map +1 -1
  7. package/dist/components/Card/Metric2.js.map +1 -1
  8. package/dist/components/Card/Ticket2.js.map +1 -1
  9. package/dist/components/Card/index.js.map +1 -1
  10. package/dist/components/Chart/Chart.js.map +1 -1
  11. package/dist/components/Checkbox/index.js.map +1 -1
  12. package/dist/components/ChoicePicker/index.js.map +1 -1
  13. package/dist/components/Column/index.js.map +1 -1
  14. package/dist/components/ConfirmDialog/index.js.map +1 -1
  15. package/dist/components/DateTimeInput/index.js.map +1 -1
  16. package/dist/components/Demo/index.js.map +1 -1
  17. package/dist/components/Demo/source.js.map +1 -1
  18. package/dist/components/Divider/index.js.map +1 -1
  19. package/dist/components/EmptyState/index.js.map +1 -1
  20. package/dist/components/Field/index.js.map +1 -1
  21. package/dist/components/FileUploader/DropZone.js.map +1 -1
  22. package/dist/components/FileUploader/FileItem.js.map +1 -1
  23. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  24. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  25. package/dist/components/GroupButton/index.js.map +1 -1
  26. package/dist/components/GroupedTable/index.js.map +1 -1
  27. package/dist/components/Icon/index.js.map +1 -1
  28. package/dist/components/Image/index.js.map +1 -1
  29. package/dist/components/Input/index.js.map +1 -1
  30. package/dist/components/Label/index.js.map +1 -1
  31. package/dist/components/Layout/index.js.map +1 -1
  32. package/dist/components/LayoutSuite/DashboardSuite.js.map +1 -1
  33. package/dist/components/LayoutSuite/index.js.map +1 -1
  34. package/dist/components/List/index.js.map +1 -1
  35. package/dist/components/Markdown/Markdown.js.map +1 -1
  36. package/dist/components/Markdown/codeThemes.js.map +1 -1
  37. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  38. package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
  39. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  40. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  41. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  42. package/dist/components/Modal/focusScope.js.map +1 -1
  43. package/dist/components/Modal/index.js.map +1 -1
  44. package/dist/components/MultipleChoice/index.js.map +1 -1
  45. package/dist/components/NavigationList/index.js.map +1 -1
  46. package/dist/components/Page/Float2.js.map +1 -1
  47. package/dist/components/Page/index.js.map +1 -1
  48. package/dist/components/Page/resize2.js.map +1 -1
  49. package/dist/components/PageHeader/index.js.map +1 -1
  50. package/dist/components/PagePanel/index.js.map +1 -1
  51. package/dist/components/ProtectedRoute/index.js.map +1 -1
  52. package/dist/components/Resizable/ResizeGrip.js.map +1 -1
  53. package/dist/components/Resizable/index.js.map +1 -1
  54. package/dist/components/Resizable/useResize.js.map +1 -1
  55. package/dist/components/Row/index.js.map +1 -1
  56. package/dist/components/Section/index.js.map +1 -1
  57. package/dist/components/Select/index.js.map +1 -1
  58. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  59. package/dist/components/Skeleton/index.js.map +1 -1
  60. package/dist/components/Slider/index.js.map +1 -1
  61. package/dist/components/Switch/index.js.map +1 -1
  62. package/dist/components/Tab/index.js.map +1 -1
  63. package/dist/components/Table/index.js.map +1 -1
  64. package/dist/components/Tabs/index.js.map +1 -1
  65. package/dist/components/Tabs/tabNavigation.js.map +1 -1
  66. package/dist/components/Text/index.js.map +1 -1
  67. package/dist/components/Textarea/index.js.map +1 -1
  68. package/dist/components/Tooltip/index.js.map +1 -1
  69. package/dist/components/Tree/Tree.js.map +1 -1
  70. package/dist/components/ai/AgentChat/index.js.map +1 -1
  71. package/dist/components/ai/AgentRunCard/index.js.map +1 -1
  72. package/dist/components/ai/AgentScreen/index.js.map +1 -1
  73. package/dist/components/ai/ApprovalCard/index.js.map +1 -1
  74. package/dist/components/ai/CodeView/index.js.map +1 -1
  75. package/dist/components/ai/CommandSearch/index.js.map +1 -1
  76. package/dist/components/ai/ContextCards/index.js.map +1 -1
  77. package/dist/components/ai/DiffTable/index.js.map +1 -1
  78. package/dist/components/ai/FilterTable/index.js.map +1 -1
  79. package/dist/components/ai/FineTuneCard/index.js.map +1 -1
  80. package/dist/components/ai/InsightCards/index.js.map +1 -1
  81. package/dist/components/ai/IssueCard/index.js.map +1 -1
  82. package/dist/components/ai/LoadingState/index.js.map +1 -1
  83. package/dist/components/ai/PromptBar/index.js.map +1 -1
  84. package/dist/components/ai/RecommendationCard/index.js.map +1 -1
  85. package/dist/components/ai/RecordsTable/index.js.map +1 -1
  86. package/dist/components/ai/SelectionActions/index.js.map +1 -1
  87. package/dist/components/ai/StateFlow/index.js.map +1 -1
  88. package/dist/components/ai/StreamingText/index.js.map +1 -1
  89. package/dist/components/ai/TaskRows/index.js.map +1 -1
  90. package/dist/components/ai/Thinking/index.js.map +1 -1
  91. package/dist/components/ai/ToolChips/index.js.map +1 -1
  92. package/dist/components/ai/shared.js.map +1 -1
  93. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  94. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  95. package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
  96. package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
  97. package/dist/components/pro/Calendar/Calendar.js +165 -160
  98. package/dist/components/pro/Calendar/Calendar.js.map +1 -1
  99. package/dist/components/pro/Calendar/hooks/useCalendarDrag.js.map +1 -1
  100. package/dist/components/pro/Calendar/hooks/useCalendarState.js +31 -31
  101. package/dist/components/pro/Calendar/hooks/useCalendarState.js.map +1 -1
  102. package/dist/components/pro/Calendar/utils.js.map +1 -1
  103. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  104. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  105. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
  106. package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
  107. package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
  108. package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
  109. package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
  110. package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
  111. package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
  112. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  113. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +65 -59
  114. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  115. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  116. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  117. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  118. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  119. package/dist/components/pro/CodeEditor/utils.js.map +1 -1
  120. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  121. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  122. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  123. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  124. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  125. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  126. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  127. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  128. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  129. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  130. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  131. package/dist/components/pro/DataTable/extension.js.map +1 -1
  132. package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
  133. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  134. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  135. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  136. package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
  137. package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
  138. package/dist/components/pro/DataTable/useDataTableModel.js +119 -104
  139. package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -1
  140. package/dist/components/pro/DataTable/utils.js.map +1 -1
  141. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  142. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  143. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  144. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  145. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  146. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  147. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  148. package/dist/components/pro/Flow/Flow.js.map +1 -1
  149. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  150. package/dist/components/pro/Flow/archify/build.js.map +1 -1
  151. package/dist/components/pro/Flow/archify/convert.js.map +1 -1
  152. package/dist/components/pro/Flow/archify/palette.js.map +1 -1
  153. package/dist/components/pro/Flow/archify/presets.js.map +1 -1
  154. package/dist/components/pro/Flow/archify/spec.js.map +1 -1
  155. package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
  156. package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
  157. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
  158. package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
  159. package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
  160. package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
  161. package/dist/components/pro/Flow/constants.js.map +1 -1
  162. package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
  163. package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
  164. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  165. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  166. package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
  167. package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
  168. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
  169. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  170. package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
  171. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  172. package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
  173. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  174. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  175. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
  176. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  177. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  178. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  179. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  180. package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
  181. package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
  182. package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
  183. package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
  184. package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
  185. package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
  186. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  187. package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
  188. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  189. package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
  190. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  191. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  192. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  193. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  194. package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
  195. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  196. package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
  197. package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
  198. package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
  199. package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -1
  200. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  201. package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -1
  202. package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
  203. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  204. package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
  205. package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
  206. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  207. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  208. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  209. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  210. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  211. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  212. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  213. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  214. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  215. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  216. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  217. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  218. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  219. package/dist/components/pro/Flow/types.js.map +1 -1
  220. package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
  221. package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
  222. package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
  223. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  224. package/dist/components/pro/Gantt/Gantt.js.map +1 -1
  225. package/dist/components/pro/Gantt/hooks/useGanttDrag.js.map +1 -1
  226. package/dist/components/pro/Gantt/hooks/useGanttState.js +79 -71
  227. package/dist/components/pro/Gantt/hooks/useGanttState.js.map +1 -1
  228. package/dist/components/pro/Gantt/utils.js.map +1 -1
  229. package/dist/components/pro/Kanban/Kanban.js.map +1 -1
  230. package/dist/components/pro/Kanban/Swimlanes.js.map +1 -1
  231. package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -1
  232. package/dist/components/pro/Kanban/utils.js.map +1 -1
  233. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  234. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  235. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  236. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  237. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  238. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  239. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  240. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  241. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  242. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  243. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  244. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  245. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  246. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  247. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  248. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  249. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
  250. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  251. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  252. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  253. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  254. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  255. package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
  256. package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
  257. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  258. package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
  259. package/dist/components/pro/Sprite/Molly/animations.js +52 -0
  260. package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
  261. package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
  262. package/dist/components/pro/Sprite/Molly/events.js +46 -0
  263. package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
  264. package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
  265. package/dist/components/pro/Sprite/Molly/index.js +12 -0
  266. package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
  267. package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
  268. package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
  269. package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
  270. package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
  271. package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
  272. package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
  273. package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
  274. package/dist/components/pro/Sprite/Molly/model.js +614 -0
  275. package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
  276. package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
  277. package/dist/components/pro/Sprite/Molly/rig.js +102 -0
  278. package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
  279. package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
  280. package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
  281. package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
  282. package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
  283. package/dist/components/pro/Sprite/Ruby/events.js +46 -0
  284. package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
  285. package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
  286. package/dist/components/pro/Sprite/Ruby/index.js +12 -0
  287. package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
  288. package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
  289. package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
  290. package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
  291. package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
  292. package/dist/components/pro/Sprite/Ruby/model.js +605 -0
  293. package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
  294. package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
  295. package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
  296. package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
  297. package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
  298. package/dist/components/pro/Sprite/Sprite2.js +224 -0
  299. package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
  300. package/dist/components/pro/Sprite/actions.d.ts +3 -0
  301. package/dist/components/pro/Sprite/actions.js +16 -0
  302. package/dist/components/pro/Sprite/actions.js.map +1 -0
  303. package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
  304. package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
  305. package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
  306. package/dist/components/pro/Sprite/index.d.ts +4 -0
  307. package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
  308. package/dist/components/pro/Sprite/shared/animation.js +39 -0
  309. package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
  310. package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
  311. package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
  312. package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
  313. package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
  314. package/dist/components/pro/Sprite/shared/events.js +21 -0
  315. package/dist/components/pro/Sprite/shared/events.js.map +1 -0
  316. package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
  317. package/dist/components/pro/Sprite/shared/face.js +33 -0
  318. package/dist/components/pro/Sprite/shared/face.js.map +1 -0
  319. package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
  320. package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
  321. package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
  322. package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
  323. package/dist/components/pro/Sprite/shared/gait.js +19 -0
  324. package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
  325. package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
  326. package/dist/components/pro/Sprite/shared/geometry.js +59 -0
  327. package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
  328. package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
  329. package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
  330. package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
  331. package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
  332. package/dist/components/pro/Sprite/shared/playback.js +74 -0
  333. package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
  334. package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
  335. package/dist/components/pro/Sprite/shared/rig.js +48 -0
  336. package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
  337. package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
  338. package/dist/components/pro/Sprite/shared/scene.js +21 -0
  339. package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
  340. package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
  341. package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
  342. package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
  343. package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
  344. package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
  345. package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
  346. package/dist/components/pro/Sprite/types.d.ts +40 -0
  347. package/dist/contexts/AppContext.js.map +1 -1
  348. package/dist/contexts/authentication.js.map +1 -1
  349. package/dist/data-table.js +3 -3
  350. package/dist/data-table.js.map +1 -1
  351. package/dist/dishui.css +1 -1
  352. package/dist/hooks/useClickOutside.js.map +1 -1
  353. package/dist/hooks/useContainerElement.js.map +1 -1
  354. package/dist/hooks/useControllableState.js.map +1 -1
  355. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  356. package/dist/hooks/useDebounce.js.map +1 -1
  357. package/dist/hooks/useDraggable.js.map +1 -1
  358. package/dist/hooks/useTableColumns.js.map +1 -1
  359. package/dist/hooks/useTableData.js.map +1 -1
  360. package/dist/index-nostyled.d.ts +2 -0
  361. package/dist/index.d.ts +2 -0
  362. package/dist/index.js +116 -115
  363. package/dist/layouts/MainLayout.js.map +1 -1
  364. package/dist/layouts/Navbar.js.map +1 -1
  365. package/dist/layouts/Sidebar.js.map +1 -1
  366. package/dist/layouts/headbar/Headbar.js.map +1 -1
  367. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  368. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  369. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  370. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  371. package/dist/sprite.js +2 -0
  372. package/dist/styles/themeStyles.js.map +1 -1
  373. package/dist/utils/cn.js.map +1 -1
  374. package/dist/utils/flexLayout.js.map +1 -1
  375. package/dist/utils/i18n.js.map +1 -1
  376. package/dist/utils/menu.js.map +1 -1
  377. package/dist/utils/rehype-code-meta.js.map +1 -1
  378. package/dist/utils/remark-code-meta.js.map +1 -1
  379. package/dist/utils/routerBuilder.js.map +1 -1
  380. package/dist/utils/safeStorage.js.map +1 -1
  381. package/dist/utils/selection.js +29 -20
  382. package/dist/utils/selection.js.map +1 -1
  383. package/dist/utils/themes.js.map +1 -1
  384. package/package.json +15 -11
@@ -1 +1 @@
1
- {"version":3,"file":"FootnotePanel.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/panels/FootnotePanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { FootnoteInfo } from '../editors/markdownExtensions';\nimport { EditorTheme } from '../types';\n\nexport interface FootnotePanelProps {\n footnotes: FootnoteInfo[];\n onFootnoteClick: (line: number) => void;\n onJumpToDefinition?: (id: string, line: number) => void;\n onJumpToReference?: (id: string, line: number) => void;\n className?: string;\n theme?: EditorTheme;\n}\n\nconst FootnotePanel: React.FC<FootnotePanelProps> = ({\n footnotes,\n onFootnoteClick,\n onJumpToDefinition,\n onJumpToReference,\n className = '',\n theme = 'light',\n}) => {\n const [filter, setFilter] = useState('');\n\n // 过滤脚注\n const filteredFootnotes = footnotes.filter((footnote) =>\n footnote.id.toLowerCase().includes(filter.toLowerCase())\n );\n\n // 分类脚注\n const defined = filteredFootnotes.filter((f) => f.definitionLine);\n const undefinedFootnotes = filteredFootnotes.filter((f) => !f.definitionLine);\n\n return (\n <div className={`footnote-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n {/* 标题 */}\n <div className=\"footnote-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\"\n />\n </svg>\n <span className=\"font-semibold\">脚注</span>\n <span className=\"text-xs opacity-60 ml-auto\">({footnotes.length})</span>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"搜索脚注...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 脚注列表 */}\n <div className=\"footnote-content max-h-96 overflow-y-auto\">\n {filteredFootnotes.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? '未找到匹配的脚注' : '暂无脚注'}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {/* 已定义的脚注 */}\n {defined.length > 0 && (\n <div>\n <div className=\"text-xs font-semibold opacity-70 mb-1 px-2\">已定义</div>\n {defined.map((footnote) => (\n <div\n key={footnote.id}\n className=\"footnote-item bg-base-200 rounded p-2 mb-1 hover:bg-base-300 cursor-pointer transition-colors\"\n >\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"font-mono text-sm font-semibold text-primary\">\n [^{footnote.id}]\n </span>\n <div className=\"flex gap-1\">\n {footnote.definitionLine && (\n <button\n className=\"btn btn-xs btn-ghost tooltip tooltip-left\"\n data-tip=\"跳转到定义\"\n onClick={() => {\n onFootnoteClick(footnote.definitionLine!);\n if (onJumpToDefinition) {\n onJumpToDefinition(footnote.id, footnote.definitionLine!);\n }\n }}\n title=\"跳转到定义\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n <div className=\"text-xs opacity-70 mb-2\">\n {footnote.definitionLine && `定义: 第 ${footnote.definitionLine} 行`}\n {footnote.referenceLines && footnote.referenceLines.length > 0 && (\n <div className=\"mt-1\">\n 引用 ({footnote.referenceLines.length}): \n {footnote.referenceLines.map((refLine, idx) => (\n <button\n key={idx}\n className=\"btn btn-xs btn-ghost ml-1 text-info\"\n onClick={() => {\n onFootnoteClick(refLine);\n if (onJumpToReference) {\n onJumpToReference(footnote.id, refLine);\n }\n }}\n title={`跳转到第 ${refLine} 行`}\n >\n L{refLine}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* 未定义的脚注 */}\n {undefinedFootnotes.length > 0 && (\n <div>\n <div className=\"text-xs font-semibold opacity-70 mb-1 px-2 text-warning\">\n 未定义\n </div>\n {undefinedFootnotes.map((footnote) => (\n <div\n key={footnote.id}\n className=\"footnote-item bg-warning/10 border border-warning/30 rounded p-2 mb-1 hover:bg-warning/20 cursor-pointer transition-colors\"\n >\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"font-mono text-sm font-semibold text-warning\">\n [^{footnote.id}]\n </span>\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => onFootnoteClick(footnote.line)}\n title=\"跳转到引用\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 7l5 5m0 0l-5 5m5-5H6\"\n />\n </svg>\n </button>\n </div>\n <div className=\"text-xs opacity-70\">\n 引用: 第 {footnote.line} 行 | ⚠️ 缺少定义\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FootnotePanel;\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"FootnotePanel.js","names":["FootnotePanel","filter","setFilter","useState","filteredFootnotes","footnotes","footnote","defined","f","undefinedFootnotes","className","onFootnoteClick","onJumpToDefinition","refLine","onJumpToReference","idx"],"sources":["../../../../../src/components/pro/CodeEditor/panels/FootnotePanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { FootnoteInfo } from '../editors/markdownExtensions';\nimport { EditorTheme } from '../types';\n\nexport interface FootnotePanelProps {\n footnotes: FootnoteInfo[];\n onFootnoteClick: (line: number) => void;\n onJumpToDefinition?: (id: string, line: number) => void;\n onJumpToReference?: (id: string, line: number) => void;\n className?: string;\n theme?: EditorTheme;\n}\n\nconst FootnotePanel: React.FC<FootnotePanelProps> = ({\n footnotes,\n onFootnoteClick,\n onJumpToDefinition,\n onJumpToReference,\n className = '',\n theme = 'light',\n}) => {\n const [filter, setFilter] = useState('');\n\n // 过滤脚注\n const filteredFootnotes = footnotes.filter((footnote) =>\n footnote.id.toLowerCase().includes(filter.toLowerCase())\n );\n\n // 分类脚注\n const defined = filteredFootnotes.filter((f) => f.definitionLine);\n const undefinedFootnotes = filteredFootnotes.filter((f) => !f.definitionLine);\n\n return (\n <div className={`footnote-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n {/* 标题 */}\n <div className=\"footnote-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\"\n />\n </svg>\n <span className=\"font-semibold\">脚注</span>\n <span className=\"text-xs opacity-60 ml-auto\">({footnotes.length})</span>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"搜索脚注...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 脚注列表 */}\n <div className=\"footnote-content max-h-96 overflow-y-auto\">\n {filteredFootnotes.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? '未找到匹配的脚注' : '暂无脚注'}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {/* 已定义的脚注 */}\n {defined.length > 0 && (\n <div>\n <div className=\"text-xs font-semibold opacity-70 mb-1 px-2\">已定义</div>\n {defined.map((footnote) => (\n <div\n key={footnote.id}\n className=\"footnote-item bg-base-200 rounded p-2 mb-1 hover:bg-base-300 cursor-pointer transition-colors\"\n >\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"font-mono text-sm font-semibold text-primary\">\n [^{footnote.id}]\n </span>\n <div className=\"flex gap-1\">\n {footnote.definitionLine && (\n <button\n className=\"btn btn-xs btn-ghost tooltip tooltip-left\"\n data-tip=\"跳转到定义\"\n onClick={() => {\n onFootnoteClick(footnote.definitionLine!);\n if (onJumpToDefinition) {\n onJumpToDefinition(footnote.id, footnote.definitionLine!);\n }\n }}\n title=\"跳转到定义\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n <div className=\"text-xs opacity-70 mb-2\">\n {footnote.definitionLine && `定义: 第 ${footnote.definitionLine} 行`}\n {footnote.referenceLines && footnote.referenceLines.length > 0 && (\n <div className=\"mt-1\">\n 引用 ({footnote.referenceLines.length}): \n {footnote.referenceLines.map((refLine, idx) => (\n <button\n key={idx}\n className=\"btn btn-xs btn-ghost ml-1 text-info\"\n onClick={() => {\n onFootnoteClick(refLine);\n if (onJumpToReference) {\n onJumpToReference(footnote.id, refLine);\n }\n }}\n title={`跳转到第 ${refLine} 行`}\n >\n L{refLine}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* 未定义的脚注 */}\n {undefinedFootnotes.length > 0 && (\n <div>\n <div className=\"text-xs font-semibold opacity-70 mb-1 px-2 text-warning\">\n 未定义\n </div>\n {undefinedFootnotes.map((footnote) => (\n <div\n key={footnote.id}\n className=\"footnote-item bg-warning/10 border border-warning/30 rounded p-2 mb-1 hover:bg-warning/20 cursor-pointer transition-colors\"\n >\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"font-mono text-sm font-semibold text-warning\">\n [^{footnote.id}]\n </span>\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => onFootnoteClick(footnote.line)}\n title=\"跳转到引用\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 7l5 5m0 0l-5 5m5-5H6\"\n />\n </svg>\n </button>\n </div>\n <div className=\"text-xs opacity-70\">\n 引用: 第 {footnote.line} 行 | ⚠️ 缺少定义\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FootnotePanel;\n\n"],"mappings":"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"}
@@ -1,66 +1,72 @@
1
- import { useState as e } from "react";
2
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
1
+ import { useEffect as e, useState as t } from "react";
2
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
3
  //#region src/components/pro/CodeEditor/panels/HistoryPanel.tsx
4
- var r = ({ history: r, currentIndex: i, onRestore: a, onClear: o, className: s = "", height: c, maxHeight: l = "600px" }) => {
5
- let [u, d] = e(null), f = (e) => {
6
- let t = (/* @__PURE__ */ new Date()).getTime() - e.getTime(), n = Math.floor(t / 1e3), r = Math.floor(n / 60), i = Math.floor(r / 60), a = Math.floor(i / 24);
4
+ var i = ({ history: i, currentIndex: a, onRestore: o, onClear: s, className: c = "", height: l, maxHeight: u = "600px" }) => {
5
+ let [d, f] = t(null), [p, m] = t(() => Date.now());
6
+ e(() => {
7
+ if (i.length === 0) return;
8
+ let e = setInterval(() => m(Date.now()), 1e3);
9
+ return () => clearInterval(e);
10
+ }, [i.length]);
11
+ let h = (e) => {
12
+ let t = p - e.getTime(), n = Math.floor(t / 1e3), r = Math.floor(n / 60), i = Math.floor(r / 60), a = Math.floor(i / 24);
7
13
  return a > 0 ? `${a}d ago` : i > 0 ? `${i}h ago` : r > 0 ? `${r}m ago` : `${n}s ago`;
8
- }, p = (e) => e.toLocaleTimeString("en-US", {
14
+ }, g = (e) => e.toLocaleTimeString("en-US", {
9
15
  hour: "2-digit",
10
16
  minute: "2-digit",
11
17
  second: "2-digit"
12
- }), m = (e) => {
13
- d(u === e ? null : e);
14
- }, h = (e, t = 50) => {
18
+ }), _ = (e) => {
19
+ f(d === e ? null : e);
20
+ }, v = (e, t = 50) => {
15
21
  let n = e.split("\n")[0];
16
22
  return n.length > t ? n.substring(0, t) + "..." : n;
17
23
  };
18
- return /* @__PURE__ */ n("div", {
19
- className: `history-panel bg-base-100 border border-base-300 rounded-lg p-2 ${s}`,
24
+ return /* @__PURE__ */ r("div", {
25
+ className: `history-panel bg-base-100 border border-base-300 rounded-lg p-2 ${c}`,
20
26
  children: [
21
- /* @__PURE__ */ n("div", {
27
+ /* @__PURE__ */ r("div", {
22
28
  className: "history-header mb-2",
23
- children: [/* @__PURE__ */ n("div", {
29
+ children: [/* @__PURE__ */ r("div", {
24
30
  className: "flex items-center gap-2 px-2 py-1 mb-3 border-b border-base-300",
25
31
  children: [
26
- /* @__PURE__ */ t("svg", {
32
+ /* @__PURE__ */ n("svg", {
27
33
  className: "w-5 h-5",
28
34
  fill: "none",
29
35
  viewBox: "0 0 24 24",
30
36
  stroke: "currentColor",
31
- children: /* @__PURE__ */ t("path", {
37
+ children: /* @__PURE__ */ n("path", {
32
38
  strokeLinecap: "round",
33
39
  strokeLinejoin: "round",
34
40
  strokeWidth: 2,
35
41
  d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
36
42
  })
37
43
  }),
38
- /* @__PURE__ */ t("span", {
44
+ /* @__PURE__ */ n("span", {
39
45
  className: "font-semibold",
40
46
  children: "History"
41
47
  }),
42
- /* @__PURE__ */ n("span", {
48
+ /* @__PURE__ */ r("span", {
43
49
  className: "text-xs opacity-60 ml-auto",
44
50
  children: [
45
51
  "(",
46
- r.length,
52
+ i.length,
47
53
  ")"
48
54
  ]
49
55
  })
50
56
  ]
51
- }), /* @__PURE__ */ t("div", {
57
+ }), /* @__PURE__ */ n("div", {
52
58
  className: "flex gap-2 mb-2",
53
- children: /* @__PURE__ */ n("button", {
59
+ children: /* @__PURE__ */ r("button", {
54
60
  className: "btn btn-xs btn-ghost flex-1",
55
- onClick: o,
56
- disabled: r.length === 0,
61
+ onClick: s,
62
+ disabled: i.length === 0,
57
63
  title: "Clear history",
58
- children: [/* @__PURE__ */ t("svg", {
64
+ children: [/* @__PURE__ */ n("svg", {
59
65
  className: "w-4 h-4",
60
66
  fill: "none",
61
67
  viewBox: "0 0 24 24",
62
68
  stroke: "currentColor",
63
- children: /* @__PURE__ */ t("path", {
69
+ children: /* @__PURE__ */ n("path", {
64
70
  strokeLinecap: "round",
65
71
  strokeLinejoin: "round",
66
72
  strokeWidth: 2,
@@ -70,70 +76,70 @@ var r = ({ history: r, currentIndex: i, onRestore: a, onClear: o, className: s =
70
76
  })
71
77
  })]
72
78
  }),
73
- /* @__PURE__ */ t("div", {
79
+ /* @__PURE__ */ n("div", {
74
80
  className: "history-content overflow-y-auto",
75
81
  style: {
76
- height: c,
77
- maxHeight: c ? void 0 : l
82
+ height: l,
83
+ maxHeight: l ? void 0 : u
78
84
  },
79
- children: r.length === 0 ? /* @__PURE__ */ t("div", {
85
+ children: i.length === 0 ? /* @__PURE__ */ n("div", {
80
86
  className: "text-center text-sm opacity-60 py-4",
81
87
  children: "No history yet"
82
- }) : /* @__PURE__ */ t("div", {
88
+ }) : /* @__PURE__ */ n("div", {
83
89
  className: "space-y-1",
84
- children: [...r].reverse().map((e, o) => {
85
- let s = r.length - 1 - o, c = u === e.id, l = s === i, d = e.content.split("\n").length, g = s + 1;
86
- return /* @__PURE__ */ n("div", {
90
+ children: [...i].reverse().map((e, t) => {
91
+ let s = i.length - 1 - t, c = d === e.id, l = s === a, u = e.content.split("\n").length, f = s + 1;
92
+ return /* @__PURE__ */ r("div", {
87
93
  className: `history-item border rounded p-2 cursor-pointer transition-colors ${l ? "border-primary bg-primary/10" : "border-base-300 hover:bg-base-200"}`,
88
- children: [/* @__PURE__ */ n("div", {
94
+ children: [/* @__PURE__ */ r("div", {
89
95
  className: "flex items-start gap-2",
90
- onClick: () => m(e.id),
91
- children: [/* @__PURE__ */ n("div", {
96
+ onClick: () => _(e.id),
97
+ children: [/* @__PURE__ */ r("div", {
92
98
  className: "flex-1 min-w-0",
93
99
  children: [
94
- /* @__PURE__ */ n("div", {
100
+ /* @__PURE__ */ r("div", {
95
101
  className: "flex items-center gap-2 mb-1",
96
102
  children: [
97
- /* @__PURE__ */ n("span", {
103
+ /* @__PURE__ */ r("span", {
98
104
  className: "font-mono text-xs font-bold",
99
- children: ["#", g]
105
+ children: ["#", f]
100
106
  }),
101
- l && /* @__PURE__ */ t("span", {
107
+ l && /* @__PURE__ */ n("span", {
102
108
  className: "badge badge-primary badge-xs",
103
109
  children: "Current"
104
110
  }),
105
- /* @__PURE__ */ t("span", {
111
+ /* @__PURE__ */ n("span", {
106
112
  className: "text-xs opacity-60 ml-auto",
107
- children: f(e.timestamp)
113
+ children: h(e.timestamp)
108
114
  })
109
115
  ]
110
116
  }),
111
- e.description && /* @__PURE__ */ t("div", {
117
+ e.description && /* @__PURE__ */ n("div", {
112
118
  className: "text-sm mb-1",
113
119
  children: e.description
114
120
  }),
115
- /* @__PURE__ */ t("div", {
121
+ /* @__PURE__ */ n("div", {
116
122
  className: "text-xs font-mono opacity-70 truncate",
117
- children: h(e.content)
123
+ children: v(e.content)
118
124
  }),
119
- /* @__PURE__ */ n("div", {
125
+ /* @__PURE__ */ r("div", {
120
126
  className: "text-xs opacity-50 mt-1",
121
127
  children: [
122
- p(e.timestamp),
128
+ g(e.timestamp),
123
129
  " • ",
124
- d,
130
+ u,
125
131
  " lines"
126
132
  ]
127
133
  })
128
134
  ]
129
- }), /* @__PURE__ */ t("button", {
135
+ }), /* @__PURE__ */ n("button", {
130
136
  className: `btn btn-xs btn-ghost transition-transform ${c ? "rotate-180" : ""}`,
131
- children: /* @__PURE__ */ t("svg", {
137
+ children: /* @__PURE__ */ n("svg", {
132
138
  className: "w-4 h-4",
133
139
  fill: "none",
134
140
  viewBox: "0 0 24 24",
135
141
  stroke: "currentColor",
136
- children: /* @__PURE__ */ t("path", {
142
+ children: /* @__PURE__ */ n("path", {
137
143
  strokeLinecap: "round",
138
144
  strokeLinejoin: "round",
139
145
  strokeWidth: 2,
@@ -141,26 +147,26 @@ var r = ({ history: r, currentIndex: i, onRestore: a, onClear: o, className: s =
141
147
  })
142
148
  })
143
149
  })]
144
- }), c && /* @__PURE__ */ n("div", {
150
+ }), c && /* @__PURE__ */ r("div", {
145
151
  className: "mt-2 pt-2 border-t border-base-300",
146
- children: [/* @__PURE__ */ t("div", {
152
+ children: [/* @__PURE__ */ n("div", {
147
153
  className: "bg-base-200 rounded p-2 mb-2 max-h-32 overflow-y-auto",
148
- children: /* @__PURE__ */ t("pre", {
154
+ children: /* @__PURE__ */ n("pre", {
149
155
  className: "text-xs font-mono whitespace-pre-wrap break-words",
150
156
  children: e.content
151
157
  })
152
- }), /* @__PURE__ */ n("button", {
158
+ }), /* @__PURE__ */ r("button", {
153
159
  className: "btn btn-xs btn-primary w-full",
154
160
  onClick: (e) => {
155
- e.stopPropagation(), a(s);
161
+ e.stopPropagation(), o(s);
156
162
  },
157
163
  disabled: l,
158
- children: [/* @__PURE__ */ t("svg", {
164
+ children: [/* @__PURE__ */ n("svg", {
159
165
  className: "w-4 h-4 mr-1",
160
166
  fill: "none",
161
167
  viewBox: "0 0 24 24",
162
168
  stroke: "currentColor",
163
- children: /* @__PURE__ */ t("path", {
169
+ children: /* @__PURE__ */ n("path", {
164
170
  strokeLinecap: "round",
165
171
  strokeLinejoin: "round",
166
172
  strokeWidth: 2,
@@ -173,11 +179,11 @@ var r = ({ history: r, currentIndex: i, onRestore: a, onClear: o, className: s =
173
179
  })
174
180
  })
175
181
  }),
176
- /* @__PURE__ */ t("style", { children: "\n .history-panel .history-item {\n transition: all 0.2s ease;\n }\n\n .history-panel .history-item:hover {\n transform: translateX(2px);\n }\n " })
182
+ /* @__PURE__ */ n("style", { children: "\n .history-panel .history-item {\n transition: all 0.2s ease;\n }\n\n .history-panel .history-item:hover {\n transform: translateX(2px);\n }\n " })
177
183
  ]
178
184
  });
179
185
  };
180
186
  //#endregion
181
- export { r as default };
187
+ export { i as default };
182
188
 
183
189
  //# sourceMappingURL=HistoryPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HistoryPanel.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/panels/HistoryPanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\n\nexport interface HistoryEntry {\n id: string;\n timestamp: Date;\n content: string;\n description?: string;\n}\n\nexport interface HistoryPanelProps {\n history: HistoryEntry[];\n currentIndex: number;\n onRestore: (index: number) => void;\n onClear?: () => void;\n className?: string;\n height?: string;\n maxHeight?: string;\n}\n\nconst HistoryPanel: React.FC<HistoryPanelProps> = ({\n history,\n currentIndex,\n onRestore,\n onClear,\n className = '',\n height,\n maxHeight = '600px',\n}) => {\n const [expandedEntry, setExpandedEntry] = useState<string | null>(null);\n\n const formatTimestamp = (date: Date) => {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) {\n return `${days}d ago`;\n } else if (hours > 0) {\n return `${hours}h ago`;\n } else if (minutes > 0) {\n return `${minutes}m ago`;\n } else {\n return `${seconds}s ago`;\n }\n };\n\n const formatTime = (date: Date) => {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n const toggleExpand = (id: string) => {\n setExpandedEntry(expandedEntry === id ? null : id);\n };\n\n const getContentPreview = (content: string, maxLength: number = 50) => {\n const firstLine = content.split('\\n')[0];\n if (firstLine.length > maxLength) {\n return firstLine.substring(0, maxLength) + '...';\n }\n return firstLine;\n };\n\n return (\n <div className={`history-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"history-header mb-2\">\n <div className=\"flex items-center gap-2 px-2 py-1 mb-3 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span className=\"font-semibold\">History</span>\n <span className=\"text-xs opacity-60 ml-auto\">({history.length})</span>\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-2 mb-2\">\n <button\n className=\"btn btn-xs btn-ghost flex-1\"\n onClick={onClear}\n disabled={history.length === 0}\n title=\"Clear history\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n Clear\n </button>\n </div>\n </div>\n\n <div\n className=\"history-content overflow-y-auto\"\n style={{\n height: height,\n maxHeight: !height ? maxHeight : undefined\n }}\n >\n {history.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n No history yet\n </div>\n ) : (\n <div className=\"space-y-1\">\n {[...history].reverse().map((entry, reverseIndex) => {\n const index = history.length - 1 - reverseIndex;\n const isExpanded = expandedEntry === entry.id;\n const isCurrent = index === currentIndex;\n const lineCount = entry.content.split('\\n').length;\n const versionNumber = index + 1;\n\n return (\n <div\n key={entry.id}\n className={`history-item border rounded p-2 cursor-pointer transition-colors ${isCurrent\n ? 'border-primary bg-primary/10'\n : 'border-base-300 hover:bg-base-200'\n }`}\n >\n <div\n className=\"flex items-start gap-2\"\n onClick={() => toggleExpand(entry.id)}\n >\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"font-mono text-xs font-bold\">\n #{versionNumber}\n </span>\n {isCurrent && (\n <span className=\"badge badge-primary badge-xs\">Current</span>\n )}\n <span className=\"text-xs opacity-60 ml-auto\">\n {formatTimestamp(entry.timestamp)}\n </span>\n </div>\n\n {entry.description && (\n <div className=\"text-sm mb-1\">{entry.description}</div>\n )}\n\n <div className=\"text-xs font-mono opacity-70 truncate\">\n {getContentPreview(entry.content)}\n </div>\n\n <div className=\"text-xs opacity-50 mt-1\">\n {formatTime(entry.timestamp)} • {lineCount} lines\n </div>\n </div>\n\n <button\n className={`btn btn-xs btn-ghost transition-transform ${isExpanded ? 'rotate-180' : ''\n }`}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n </div>\n\n {isExpanded && (\n <div className=\"mt-2 pt-2 border-t border-base-300\">\n <div className=\"bg-base-200 rounded p-2 mb-2 max-h-32 overflow-y-auto\">\n <pre className=\"text-xs font-mono whitespace-pre-wrap break-words\">\n {entry.content}\n </pre>\n </div>\n\n <button\n className=\"btn btn-xs btn-primary w-full\"\n onClick={(e) => {\n e.stopPropagation();\n onRestore(index);\n }}\n disabled={isCurrent}\n >\n <svg\n className=\"w-4 h-4 mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n Restore this version\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n <style>{`\n .history-panel .history-item {\n transition: all 0.2s ease;\n }\n\n .history-panel .history-item:hover {\n transform: translateX(2px);\n }\n `}</style>\n </div>\n );\n};\n\nexport default HistoryPanel;\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"HistoryPanel.js","names":["HistoryPanel","expandedEntry","setExpandedEntry","useState","now","setNow","history","timer","formatTimestamp","diff","date","seconds","minutes","hours","days","formatTime","toggleExpand","id","getContentPreview","firstLine","content","maxLength","className","onClear","height","maxHeight","index","reverseIndex","isExpanded","entry","isCurrent","currentIndex","lineCount","versionNumber","onRestore"],"sources":["../../../../../src/components/pro/CodeEditor/panels/HistoryPanel.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\n\nexport interface HistoryEntry {\n id: string;\n timestamp: Date;\n content: string;\n description?: string;\n}\n\nexport interface HistoryPanelProps {\n history: HistoryEntry[];\n currentIndex: number;\n onRestore: (index: number) => void;\n onClear?: () => void;\n className?: string;\n height?: string;\n maxHeight?: string;\n}\n\nconst HistoryPanel: React.FC<HistoryPanelProps> = ({\n history,\n currentIndex,\n onRestore,\n onClear,\n className = '',\n height,\n maxHeight = '600px',\n}) => {\n const [expandedEntry, setExpandedEntry] = useState<string | null>(null);\n const [now, setNow] = useState(() => Date.now());\n\n useEffect(() => {\n if (history.length === 0) return;\n const timer = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(timer);\n }, [history.length]);\n\n const formatTimestamp = (date: Date) => {\n const diff = now - date.getTime();\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) {\n return `${days}d ago`;\n } else if (hours > 0) {\n return `${hours}h ago`;\n } else if (minutes > 0) {\n return `${minutes}m ago`;\n } else {\n return `${seconds}s ago`;\n }\n };\n\n const formatTime = (date: Date) => {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n const toggleExpand = (id: string) => {\n setExpandedEntry(expandedEntry === id ? null : id);\n };\n\n const getContentPreview = (content: string, maxLength: number = 50) => {\n const firstLine = content.split('\\n')[0];\n if (firstLine.length > maxLength) {\n return firstLine.substring(0, maxLength) + '...';\n }\n return firstLine;\n };\n\n return (\n <div className={`history-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"history-header mb-2\">\n <div className=\"flex items-center gap-2 px-2 py-1 mb-3 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span className=\"font-semibold\">History</span>\n <span className=\"text-xs opacity-60 ml-auto\">({history.length})</span>\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-2 mb-2\">\n <button\n className=\"btn btn-xs btn-ghost flex-1\"\n onClick={onClear}\n disabled={history.length === 0}\n title=\"Clear history\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n Clear\n </button>\n </div>\n </div>\n\n <div\n className=\"history-content overflow-y-auto\"\n style={{\n height: height,\n maxHeight: !height ? maxHeight : undefined\n }}\n >\n {history.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n No history yet\n </div>\n ) : (\n <div className=\"space-y-1\">\n {[...history].reverse().map((entry, reverseIndex) => {\n const index = history.length - 1 - reverseIndex;\n const isExpanded = expandedEntry === entry.id;\n const isCurrent = index === currentIndex;\n const lineCount = entry.content.split('\\n').length;\n const versionNumber = index + 1;\n\n return (\n <div\n key={entry.id}\n className={`history-item border rounded p-2 cursor-pointer transition-colors ${isCurrent\n ? 'border-primary bg-primary/10'\n : 'border-base-300 hover:bg-base-200'\n }`}\n >\n <div\n className=\"flex items-start gap-2\"\n onClick={() => toggleExpand(entry.id)}\n >\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"font-mono text-xs font-bold\">\n #{versionNumber}\n </span>\n {isCurrent && (\n <span className=\"badge badge-primary badge-xs\">Current</span>\n )}\n <span className=\"text-xs opacity-60 ml-auto\">\n {formatTimestamp(entry.timestamp)}\n </span>\n </div>\n\n {entry.description && (\n <div className=\"text-sm mb-1\">{entry.description}</div>\n )}\n\n <div className=\"text-xs font-mono opacity-70 truncate\">\n {getContentPreview(entry.content)}\n </div>\n\n <div className=\"text-xs opacity-50 mt-1\">\n {formatTime(entry.timestamp)} • {lineCount} lines\n </div>\n </div>\n\n <button\n className={`btn btn-xs btn-ghost transition-transform ${isExpanded ? 'rotate-180' : ''\n }`}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n </div>\n\n {isExpanded && (\n <div className=\"mt-2 pt-2 border-t border-base-300\">\n <div className=\"bg-base-200 rounded p-2 mb-2 max-h-32 overflow-y-auto\">\n <pre className=\"text-xs font-mono whitespace-pre-wrap break-words\">\n {entry.content}\n </pre>\n </div>\n\n <button\n className=\"btn btn-xs btn-primary w-full\"\n onClick={(e) => {\n e.stopPropagation();\n onRestore(index);\n }}\n disabled={isCurrent}\n >\n <svg\n className=\"w-4 h-4 mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n Restore this version\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n <style>{`\n .history-panel .history-item {\n transition: all 0.2s ease;\n }\n\n .history-panel .history-item:hover {\n transform: translateX(2px);\n }\n `}</style>\n </div>\n );\n};\n\nexport default HistoryPanel;\n\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"OutlinePanel.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/panels/OutlinePanel.tsx"],"sourcesContent":["import React from 'react';\nimport { OutlineItem } from '../types';\n\nexport interface OutlinePanelProps {\n outline: OutlineItem[];\n onItemClick: (line: number) => void;\n className?: string;\n}\n\nconst OutlinePanel: React.FC<OutlinePanelProps> = ({ outline, onItemClick, className = '' }) => {\n const getIcon = (type: OutlineItem['type']) => {\n switch (type) {\n case 'function':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n );\n case 'class':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10\" />\n </svg>\n );\n case 'method':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n );\n case 'variable':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z\" />\n </svg>\n );\n case 'interface':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 5a1 1 0 011-1h4a1 1 0 011 1v7a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM14 5a1 1 0 011-1h4a1 1 0 011 1v7a1 1 0 01-1 1h-4a1 1 0 01-1-1V5z\" />\n </svg>\n );\n case 'type':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n );\n default:\n return null;\n }\n };\n\n const renderOutlineItem = (item: OutlineItem, depth: number = 0) => {\n return (\n <div key={`${item.name}-${item.line}`}>\n <div\n className=\"outline-item flex items-center gap-2 px-2 py-1 hover:bg-base-200 cursor-pointer rounded\"\n style={{ paddingLeft: `${depth * 16 + 8}px` }}\n onClick={() => onItemClick(item.line)}\n >\n <span className=\"text-primary\">{getIcon(item.type)}</span>\n <span className=\"text-sm truncate flex-1\">{item.name}</span>\n <span className=\"text-xs opacity-60\">{item.line}</span>\n </div>\n {item.children && item.children.length > 0 && (\n <div className=\"outline-children\">\n {item.children.map((child) => renderOutlineItem(child, depth + 1))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className={`outline-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"outline-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h7\" />\n </svg>\n <span className=\"font-semibold\">大纲</span>\n </div>\n <div className=\"outline-content max-h-96 overflow-y-auto\">\n {outline.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">暂无大纲</div>\n ) : (\n outline.map((item) => renderOutlineItem(item))\n )}\n </div>\n </div>\n );\n};\n\nexport default OutlinePanel;\n\n"],"mappings":";;;AASA,IAAM,KAA6C,EAAE,YAAS,gBAAa,eAAY,SAAS;CAC9F,IAAM,KAAW,MAA8B;EAC7C,QAAQ,GAAR;GACE,KAAK,YACH,OACE,kBAAC,OAAD;IAAK,WAAU;IAAU,MAAK;IAAO,SAAQ;IAAY,QAAO;IAC9D,UAAA,kBAAC,QAAD;KAAM,eAAc;KAAQ,gBAAe;KAAQ,aAAa;KAAG,GAAE;IAAyC,CAAA;GAC3G,CAAA;GAET,KAAK,SACH,OACE,kBAAC,OAAD;IAAK,WAAU;IAAU,MAAK;IAAO,SAAQ;IAAY,QAAO;IAC9D,UAAA,kBAAC,QAAD;KAAM,eAAc;KAAQ,gBAAe;KAAQ,aAAa;KAAG,GAAE;IAA0J,CAAA;GAC5N,CAAA;GAET,KAAK,UACH,OACE,kBAAC,OAAD;IAAK,WAAU;IAAU,MAAK;IAAO,SAAQ;IAAY,QAAO;IAC9D,UAAA,kBAAC,QAAD;KAAM,eAAc;KAAQ,gBAAe;KAAQ,aAAa;KAAG,GAAE;IAAwF,CAAA;GAC1J,CAAA;GAET,KAAK,YACH,OACE,kBAAC,OAAD;IAAK,WAAU;IAAU,MAAK;IAAO,SAAQ;IAAY,QAAO;IAC9D,UAAA,kBAAC,QAAD;KAAM,eAAc;KAAQ,gBAAe;KAAQ,aAAa;KAAG,GAAE;IAAgI,CAAA;GAClM,CAAA;GAET,KAAK,aACH,OACE,kBAAC,OAAD;IAAK,WAAU;IAAU,MAAK;IAAO,SAAQ;IAAY,QAAO;IAC9D,UAAA,kBAAC,QAAD;KAAM,eAAc;KAAQ,gBAAe;KAAQ,aAAa;KAAG,GAAE;IAAoI,CAAA;GACtM,CAAA;GAET,KAAK,QACH,OACE,kBAAC,OAAD;IAAK,WAAU;IAAU,MAAK;IAAO,SAAQ;IAAY,QAAO;IAC9D,UAAA,kBAAC,QAAD;KAAM,eAAc;KAAQ,gBAAe;KAAQ,aAAa;KAAG,GAAE;IAAwH,CAAA;GAC1L,CAAA;GAET,SACE,OAAO;EACX;CACF,GAEM,KAAqB,GAAmB,IAAgB,MAE1D,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;EACE,WAAU;EACV,OAAO,EAAE,aAAa,GAAG,IAAQ,KAAK,EAAE,IAAI;EAC5C,eAAe,EAAY,EAAK,IAAI;EAHtC,UAAA;GAKE,kBAAC,QAAD;IAAM,WAAU;IAAgB,UAAA,EAAQ,EAAK,IAAI;GAAQ,CAAA;GACzD,kBAAC,QAAD;IAAM,WAAU;IAA2B,UAAA,EAAK;GAAW,CAAA;GAC3D,kBAAC,QAAD;IAAM,WAAU;IAAsB,UAAA,EAAK;GAAW,CAAA;EACnD;CACJ,CAAA,GAAA,EAAK,YAAY,EAAK,SAAS,SAAS,KACvC,kBAAC,OAAD;EAAK,WAAU;EACZ,UAAA,EAAK,SAAS,KAAK,MAAU,EAAkB,GAAO,IAAQ,CAAC,CAAC;CAC9D,CAAA,CAEJ,EAAA,GAfK,GAAG,EAAK,KAAK,GAAG,EAAK,MAe1B;CAIT,OACE,kBAAC,OAAD;EAAK,WAAW,mEAAmE;EAAnF,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;IAAU,MAAK;IAAO,SAAQ;IAAY,QAAO;IAC9D,UAAA,kBAAC,QAAD;KAAM,eAAc;KAAQ,gBAAe;KAAQ,aAAa;KAAG,GAAE;IAA0B,CAAA;GAC5F,CAAA,GACL,kBAAC,QAAD;IAAM,WAAU;IAAgB,UAAA;GAAQ,CAAA,CACrC;EACL,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAU;GACZ,UAAA,EAAQ,WAAW,IAClB,kBAAC,OAAD;IAAK,WAAU;IAAsC,UAAA;GAAS,CAAA,IAE9D,EAAQ,KAAK,MAAS,EAAkB,CAAI,CAAC;EAE5C,CAAA,CACF;;AAET"}
1
+ {"version":3,"file":"OutlinePanel.js","names":["OutlinePanel","getIcon","type","renderOutlineItem","depth","onItemClick","item","child","className","outline"],"sources":["../../../../../src/components/pro/CodeEditor/panels/OutlinePanel.tsx"],"sourcesContent":["import React from 'react';\nimport { OutlineItem } from '../types';\n\nexport interface OutlinePanelProps {\n outline: OutlineItem[];\n onItemClick: (line: number) => void;\n className?: string;\n}\n\nconst OutlinePanel: React.FC<OutlinePanelProps> = ({ outline, onItemClick, className = '' }) => {\n const getIcon = (type: OutlineItem['type']) => {\n switch (type) {\n case 'function':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n );\n case 'class':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10\" />\n </svg>\n );\n case 'method':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n );\n case 'variable':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z\" />\n </svg>\n );\n case 'interface':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 5a1 1 0 011-1h4a1 1 0 011 1v7a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM14 5a1 1 0 011-1h4a1 1 0 011 1v7a1 1 0 01-1 1h-4a1 1 0 01-1-1V5z\" />\n </svg>\n );\n case 'type':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n );\n default:\n return null;\n }\n };\n\n const renderOutlineItem = (item: OutlineItem, depth: number = 0) => {\n return (\n <div key={`${item.name}-${item.line}`}>\n <div\n className=\"outline-item flex items-center gap-2 px-2 py-1 hover:bg-base-200 cursor-pointer rounded\"\n style={{ paddingLeft: `${depth * 16 + 8}px` }}\n onClick={() => onItemClick(item.line)}\n >\n <span className=\"text-primary\">{getIcon(item.type)}</span>\n <span className=\"text-sm truncate flex-1\">{item.name}</span>\n <span className=\"text-xs opacity-60\">{item.line}</span>\n </div>\n {item.children && item.children.length > 0 && (\n <div className=\"outline-children\">\n {item.children.map((child) => renderOutlineItem(child, depth + 1))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className={`outline-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"outline-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h7\" />\n </svg>\n <span className=\"font-semibold\">大纲</span>\n </div>\n <div className=\"outline-content max-h-96 overflow-y-auto\">\n {outline.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">暂无大纲</div>\n ) : (\n outline.map((item) => renderOutlineItem(item))\n )}\n </div>\n </div>\n );\n};\n\nexport default OutlinePanel;\n\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TableOfContentsPanel.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/panels/TableOfContentsPanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { MarkdownSection } from '../editors/markdownExtensions';\nimport { EditorTheme } from '../types';\n\nexport interface TableOfContentsPanelProps {\n sections: MarkdownSection[];\n onSectionClick: (line: number) => void;\n currentLine?: number;\n className?: string;\n theme?: EditorTheme;\n}\n\nconst TableOfContentsPanel: React.FC<TableOfContentsPanelProps> = ({\n sections,\n onSectionClick,\n currentLine = 1,\n className = '',\n theme = 'light',\n}) => {\n const [filter, setFilter] = useState('');\n const [expandedSections, setExpandedSections] = useState<Set<string>>(new Set());\n\n // 过滤章节\n const filteredSections = sections.filter((section) =>\n section.title.toLowerCase().includes(filter.toLowerCase())\n );\n\n // 构建层级结构\n const buildHierarchy = (sections: MarkdownSection[]) => {\n const root: Array<MarkdownSection & { children?: MarkdownSection[] }> = [];\n const stack: Array<MarkdownSection & { children?: MarkdownSection[] }> = [];\n\n for (const section of sections) {\n const node = { ...section, children: [] };\n\n // 找到合适的父节点\n while (stack.length > 0 && stack[stack.length - 1].level >= section.level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n root.push(node);\n } else {\n const parent = stack[stack.length - 1];\n if (!parent.children) parent.children = [];\n parent.children.push(node);\n }\n\n stack.push(node);\n }\n\n return root;\n };\n\n const hierarchy = buildHierarchy(filteredSections);\n\n // 切换展开/折叠\n const toggleExpand = (id: string) => {\n const newExpanded = new Set(expandedSections);\n if (newExpanded.has(id)) {\n newExpanded.delete(id);\n } else {\n newExpanded.add(id);\n }\n setExpandedSections(newExpanded);\n };\n\n // 获取章节图标\n const getSectionIcon = (level: number) => {\n const icons = [\n // H1\n <svg key=\"h1\" className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>,\n // H2\n <svg key=\"h2\" className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>,\n // H3\n <svg key=\"h3\" className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H4\n <svg key=\"h4\" className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H5\n <svg key=\"h5\" className=\"w-2 h-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H6\n <svg key=\"h6\" className=\"w-2 h-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n ];\n return icons[level - 1] || icons[0];\n };\n\n // 渲染章节项\n const renderSection = (\n section: MarkdownSection & { children?: MarkdownSection[] },\n depth: number = 0\n ) => {\n const hasChildren = section.children && section.children.length > 0;\n const isExpanded = expandedSections.has(section.id);\n const isActive = currentLine >= section.line && \n (sections.find(s => s.line > section.line && s.level <= section.level)?.line || Infinity) > currentLine;\n\n const levelColors = [\n 'text-primary',\n 'text-secondary',\n 'text-accent',\n 'text-info',\n 'text-success',\n 'text-warning',\n ];\n const colorClass = levelColors[(section.level - 1) % levelColors.length];\n\n return (\n <div key={section.id}>\n <div\n className={`toc-item flex items-center gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors ${\n isActive ? 'bg-primary/20 font-semibold' : 'hover:bg-base-200'\n }`}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSectionClick(section.line)}\n >\n {hasChildren && (\n <button\n className=\"btn btn-xs btn-ghost btn-circle\"\n onClick={(e) => {\n e.stopPropagation();\n toggleExpand(section.id);\n }}\n >\n {isExpanded ? (\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </button>\n )}\n {!hasChildren && <span className=\"w-6\"></span>}\n <span className={colorClass}>{getSectionIcon(section.level)}</span>\n <span className=\"text-sm truncate flex-1\" title={section.title}>\n {section.title}\n </span>\n <span className=\"text-xs opacity-60\">{section.line}</span>\n </div>\n\n {hasChildren && (isExpanded || !hasChildren) && (\n <div className=\"toc-children\">\n {section.children!.map((child) => renderSection(child, depth + 1))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className={`toc-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n {/* 标题 */}\n <div className=\"toc-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"\n />\n </svg>\n <span className=\"font-semibold\">目录</span>\n <span className=\"text-xs opacity-60 ml-auto\">({sections.length})</span>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"搜索章节...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 操作按钮 */}\n <div className=\"flex gap-1 mb-2\">\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => {\n const allIds = new Set(sections.map((s) => s.id));\n setExpandedSections(allIds);\n }}\n >\n 全部展开\n </button>\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => setExpandedSections(new Set())}\n >\n 全部折叠\n </button>\n </div>\n\n {/* 章节列表 */}\n <div className=\"toc-content max-h-[600px] overflow-y-auto\">\n {filteredSections.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? '未找到匹配的章节' : '暂无章节'}\n </div>\n ) : (\n hierarchy.map((section) => renderSection(section))\n )}\n </div>\n\n <style>{`\n .toc-item {\n user-select: none;\n }\n .toc-children {\n margin-top: 2px;\n }\n .toc-panel {\n position: relative;\n z-index: 1;\n }\n .toc-item button {\n z-index: 2;\n }\n `}</style>\n </div>\n );\n};\n\nexport default TableOfContentsPanel;\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"TableOfContentsPanel.js","names":["TableOfContentsPanel","filter","setFilter","useState","expandedSections","setExpandedSections","filteredSections","sections","section","hierarchy","root","stack","node","parent","toggleExpand","newExpanded","id","getSectionIcon","icons","level","renderSection","hasChildren","isExpanded","isActive","currentLine","s","levelColors","colorClass","depth","onSectionClick","e","child","className","allIds"],"sources":["../../../../../src/components/pro/CodeEditor/panels/TableOfContentsPanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { MarkdownSection } from '../editors/markdownExtensions';\nimport { EditorTheme } from '../types';\n\nexport interface TableOfContentsPanelProps {\n sections: MarkdownSection[];\n onSectionClick: (line: number) => void;\n currentLine?: number;\n className?: string;\n theme?: EditorTheme;\n}\n\nconst TableOfContentsPanel: React.FC<TableOfContentsPanelProps> = ({\n sections,\n onSectionClick,\n currentLine = 1,\n className = '',\n theme = 'light',\n}) => {\n const [filter, setFilter] = useState('');\n const [expandedSections, setExpandedSections] = useState<Set<string>>(new Set());\n\n // 过滤章节\n const filteredSections = sections.filter((section) =>\n section.title.toLowerCase().includes(filter.toLowerCase())\n );\n\n // 构建层级结构\n const buildHierarchy = (sections: MarkdownSection[]) => {\n const root: Array<MarkdownSection & { children?: MarkdownSection[] }> = [];\n const stack: Array<MarkdownSection & { children?: MarkdownSection[] }> = [];\n\n for (const section of sections) {\n const node = { ...section, children: [] };\n\n // 找到合适的父节点\n while (stack.length > 0 && stack[stack.length - 1].level >= section.level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n root.push(node);\n } else {\n const parent = stack[stack.length - 1];\n if (!parent.children) parent.children = [];\n parent.children.push(node);\n }\n\n stack.push(node);\n }\n\n return root;\n };\n\n const hierarchy = buildHierarchy(filteredSections);\n\n // 切换展开/折叠\n const toggleExpand = (id: string) => {\n const newExpanded = new Set(expandedSections);\n if (newExpanded.has(id)) {\n newExpanded.delete(id);\n } else {\n newExpanded.add(id);\n }\n setExpandedSections(newExpanded);\n };\n\n // 获取章节图标\n const getSectionIcon = (level: number) => {\n const icons = [\n // H1\n <svg key=\"h1\" className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>,\n // H2\n <svg key=\"h2\" className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>,\n // H3\n <svg key=\"h3\" className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H4\n <svg key=\"h4\" className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H5\n <svg key=\"h5\" className=\"w-2 h-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H6\n <svg key=\"h6\" className=\"w-2 h-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n ];\n return icons[level - 1] || icons[0];\n };\n\n // 渲染章节项\n const renderSection = (\n section: MarkdownSection & { children?: MarkdownSection[] },\n depth: number = 0\n ) => {\n const hasChildren = section.children && section.children.length > 0;\n const isExpanded = expandedSections.has(section.id);\n const isActive = currentLine >= section.line && \n (sections.find(s => s.line > section.line && s.level <= section.level)?.line || Infinity) > currentLine;\n\n const levelColors = [\n 'text-primary',\n 'text-secondary',\n 'text-accent',\n 'text-info',\n 'text-success',\n 'text-warning',\n ];\n const colorClass = levelColors[(section.level - 1) % levelColors.length];\n\n return (\n <div key={section.id}>\n <div\n className={`toc-item flex items-center gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors ${\n isActive ? 'bg-primary/20 font-semibold' : 'hover:bg-base-200'\n }`}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSectionClick(section.line)}\n >\n {hasChildren && (\n <button\n className=\"btn btn-xs btn-ghost btn-circle\"\n onClick={(e) => {\n e.stopPropagation();\n toggleExpand(section.id);\n }}\n >\n {isExpanded ? (\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </button>\n )}\n {!hasChildren && <span className=\"w-6\"></span>}\n <span className={colorClass}>{getSectionIcon(section.level)}</span>\n <span className=\"text-sm truncate flex-1\" title={section.title}>\n {section.title}\n </span>\n <span className=\"text-xs opacity-60\">{section.line}</span>\n </div>\n\n {hasChildren && (isExpanded || !hasChildren) && (\n <div className=\"toc-children\">\n {section.children!.map((child) => renderSection(child, depth + 1))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className={`toc-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n {/* 标题 */}\n <div className=\"toc-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"\n />\n </svg>\n <span className=\"font-semibold\">目录</span>\n <span className=\"text-xs opacity-60 ml-auto\">({sections.length})</span>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"搜索章节...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 操作按钮 */}\n <div className=\"flex gap-1 mb-2\">\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => {\n const allIds = new Set(sections.map((s) => s.id));\n setExpandedSections(allIds);\n }}\n >\n 全部展开\n </button>\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => setExpandedSections(new Set())}\n >\n 全部折叠\n </button>\n </div>\n\n {/* 章节列表 */}\n <div className=\"toc-content max-h-[600px] overflow-y-auto\">\n {filteredSections.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? '未找到匹配的章节' : '暂无章节'}\n </div>\n ) : (\n hierarchy.map((section) => renderSection(section))\n )}\n </div>\n\n <style>{`\n .toc-item {\n user-select: none;\n }\n .toc-children {\n margin-top: 2px;\n }\n .toc-panel {\n position: relative;\n z-index: 1;\n }\n .toc-item button {\n z-index: 2;\n }\n `}</style>\n </div>\n );\n};\n\nexport default TableOfContentsPanel;\n\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"VariablePanel.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/panels/VariablePanel.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react';\nimport { VariableInfo } from '../types';\n\nexport interface VariablePanelProps {\n variables: VariableInfo[];\n onVariableClick: (line: number) => void;\n className?: string;\n height?: string;\n maxHeight?: string;\n}\n\ntype VariableType = 'all' | 'class' | 'function' | 'variable' | 'constant' | 'interface' | 'type' | 'method';\n\nconst VariablePanel: React.FC<VariablePanelProps> = ({ \n variables, \n onVariableClick, \n className = '',\n height,\n maxHeight = '600px',\n}) => {\n const [filter, setFilter] = useState('');\n const [sortBy, setSortBy] = useState<'name' | 'line' | 'type'>('line');\n const [selectedType, setSelectedType] = useState<VariableType>('all');\n\n // 统计各类型数量\n const typeCounts = useMemo(() => {\n const counts: Record<string, number> = {\n all: variables.length,\n class: 0,\n function: 0,\n variable: 0,\n constant: 0,\n interface: 0,\n type: 0,\n method: 0,\n };\n \n variables.forEach((v) => {\n if (v.type && counts[v.type] !== undefined) {\n counts[v.type]++;\n }\n });\n \n return counts;\n }, [variables]);\n\n const filteredVariables = useMemo(() => {\n return variables\n .filter((v) => {\n // 类型过滤\n if (selectedType !== 'all' && v.type !== selectedType) {\n return false;\n }\n // 名称过滤\n return v.name.toLowerCase().includes(filter.toLowerCase());\n })\n .sort((a, b) => {\n switch (sortBy) {\n case 'name':\n return a.name.localeCompare(b.name);\n case 'line':\n return a.line - b.line;\n case 'type':\n return (a.type || '').localeCompare(b.type || '');\n default:\n return 0;\n }\n });\n }, [variables, filter, sortBy, selectedType]);\n\n const getTypeColor = (type?: string) => {\n switch (type) {\n case 'function':\n case 'method':\n return 'text-primary';\n case 'class':\n return 'text-secondary';\n case 'variable':\n return 'text-accent';\n case 'constant':\n return 'text-warning';\n case 'interface':\n case 'type':\n return 'text-info';\n default:\n return 'text-base-content';\n }\n };\n\n const getTypeIcon = (type?: string) => {\n switch (type) {\n case 'function':\n return 'ƒ';\n case 'method':\n return 'ⓜ';\n case 'class':\n return 'C';\n case 'variable':\n return 'v';\n case 'constant':\n return 'K';\n case 'interface':\n return 'I';\n case 'type':\n return 'T';\n default:\n return '?';\n }\n };\n\n const typeButtons: Array<{ type: VariableType; label: string }> = [\n { type: 'all', label: 'All' },\n { type: 'class', label: 'Classes' },\n { type: 'function', label: 'Functions' },\n { type: 'variable', label: 'Variables' },\n { type: 'constant', label: 'Constants' },\n { type: 'interface', label: 'Interfaces' },\n { type: 'type', label: 'Types' },\n { type: 'method', label: 'Methods' },\n ];\n\n return (\n <div className={`variable-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"variable-header mb-2\">\n <div className=\"flex items-center gap-2 px-2 py-1 mb-3 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z\" />\n </svg>\n <span className=\"font-semibold\">Symbols</span>\n <span className=\"text-xs opacity-60 ml-auto\">({filteredVariables.length})</span>\n </div>\n\n {/* 类型过滤按钮 - 单行横向滚动 */}\n <div className=\"mb-2 overflow-x-auto\">\n <div className=\"flex gap-1 min-w-max pb-1\">\n {typeButtons.map(({ type, label }) => {\n const count = typeCounts[type];\n if (type !== 'all' && count === 0) return null;\n return (\n <button\n key={type}\n className={`btn btn-xs whitespace-nowrap flex-shrink-0 ${selectedType === type ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSelectedType(type)}\n >\n {label}\n {count > 0 && <span className=\"ml-1 text-xs opacity-70\">({count})</span>}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"Search symbols...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 排序选项 */}\n <div className=\"flex gap-1\">\n <button\n className={`btn btn-xs ${sortBy === 'line' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('line')}\n >\n Line\n </button>\n <button\n className={`btn btn-xs ${sortBy === 'name' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('name')}\n >\n Name\n </button>\n <button\n className={`btn btn-xs ${sortBy === 'type' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('type')}\n >\n Type\n </button>\n </div>\n </div>\n\n <div \n className=\"variable-content overflow-y-auto\"\n style={{ \n height: height, \n maxHeight: !height ? maxHeight : undefined \n }}\n >\n {filteredVariables.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? 'No matching symbols' : 'No symbols'}\n </div>\n ) : (\n <div className=\"space-y-1\">\n {filteredVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${variable.line}-${index}`}\n className=\"variable-item flex items-center gap-2 px-2 py-1 hover:bg-base-200 cursor-pointer rounded transition-colors\"\n onClick={() => onVariableClick(variable.line)}\n title={`${variable.type}: ${variable.name} (line ${variable.line})`}\n >\n <span className={`font-mono font-bold text-xs ${getTypeColor(variable.type)}`}>\n {getTypeIcon(variable.type)}\n </span>\n <span className=\"text-sm truncate flex-1 font-mono\">{variable.name}</span>\n <span className=\"text-xs opacity-60\">{variable.line}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <style>{`\n .variable-panel .overflow-x-auto {\n scrollbar-width: thin;\n scrollbar-color: oklch(var(--bc) / 0.2) transparent;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar {\n height: 4px;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-thumb {\n background: oklch(var(--bc) / 0.2);\n border-radius: 2px;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-thumb:hover {\n background: oklch(var(--bc) / 0.3);\n }\n `}</style>\n </div>\n );\n};\n\nexport default VariablePanel;\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"VariablePanel.js","names":["VariablePanel","filter","setFilter","useState","sortBy","setSortBy","selectedType","setSelectedType","typeCounts","useMemo","counts","variables","v","filteredVariables","a","b","getTypeColor","type","getTypeIcon","className","count","label","height","maxHeight","onVariableClick","variable","index"],"sources":["../../../../../src/components/pro/CodeEditor/panels/VariablePanel.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react';\nimport { VariableInfo } from '../types';\n\nexport interface VariablePanelProps {\n variables: VariableInfo[];\n onVariableClick: (line: number) => void;\n className?: string;\n height?: string;\n maxHeight?: string;\n}\n\ntype VariableType = 'all' | 'class' | 'function' | 'variable' | 'constant' | 'interface' | 'type' | 'method';\n\nconst VariablePanel: React.FC<VariablePanelProps> = ({ \n variables, \n onVariableClick, \n className = '',\n height,\n maxHeight = '600px',\n}) => {\n const [filter, setFilter] = useState('');\n const [sortBy, setSortBy] = useState<'name' | 'line' | 'type'>('line');\n const [selectedType, setSelectedType] = useState<VariableType>('all');\n\n // 统计各类型数量\n const typeCounts = useMemo(() => {\n const counts: Record<string, number> = {\n all: variables.length,\n class: 0,\n function: 0,\n variable: 0,\n constant: 0,\n interface: 0,\n type: 0,\n method: 0,\n };\n \n variables.forEach((v) => {\n if (v.type && counts[v.type] !== undefined) {\n counts[v.type]++;\n }\n });\n \n return counts;\n }, [variables]);\n\n const filteredVariables = useMemo(() => {\n return variables\n .filter((v) => {\n // 类型过滤\n if (selectedType !== 'all' && v.type !== selectedType) {\n return false;\n }\n // 名称过滤\n return v.name.toLowerCase().includes(filter.toLowerCase());\n })\n .sort((a, b) => {\n switch (sortBy) {\n case 'name':\n return a.name.localeCompare(b.name);\n case 'line':\n return a.line - b.line;\n case 'type':\n return (a.type || '').localeCompare(b.type || '');\n default:\n return 0;\n }\n });\n }, [variables, filter, sortBy, selectedType]);\n\n const getTypeColor = (type?: string) => {\n switch (type) {\n case 'function':\n case 'method':\n return 'text-primary';\n case 'class':\n return 'text-secondary';\n case 'variable':\n return 'text-accent';\n case 'constant':\n return 'text-warning';\n case 'interface':\n case 'type':\n return 'text-info';\n default:\n return 'text-base-content';\n }\n };\n\n const getTypeIcon = (type?: string) => {\n switch (type) {\n case 'function':\n return 'ƒ';\n case 'method':\n return 'ⓜ';\n case 'class':\n return 'C';\n case 'variable':\n return 'v';\n case 'constant':\n return 'K';\n case 'interface':\n return 'I';\n case 'type':\n return 'T';\n default:\n return '?';\n }\n };\n\n const typeButtons: Array<{ type: VariableType; label: string }> = [\n { type: 'all', label: 'All' },\n { type: 'class', label: 'Classes' },\n { type: 'function', label: 'Functions' },\n { type: 'variable', label: 'Variables' },\n { type: 'constant', label: 'Constants' },\n { type: 'interface', label: 'Interfaces' },\n { type: 'type', label: 'Types' },\n { type: 'method', label: 'Methods' },\n ];\n\n return (\n <div className={`variable-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"variable-header mb-2\">\n <div className=\"flex items-center gap-2 px-2 py-1 mb-3 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z\" />\n </svg>\n <span className=\"font-semibold\">Symbols</span>\n <span className=\"text-xs opacity-60 ml-auto\">({filteredVariables.length})</span>\n </div>\n\n {/* 类型过滤按钮 - 单行横向滚动 */}\n <div className=\"mb-2 overflow-x-auto\">\n <div className=\"flex gap-1 min-w-max pb-1\">\n {typeButtons.map(({ type, label }) => {\n const count = typeCounts[type];\n if (type !== 'all' && count === 0) return null;\n return (\n <button\n key={type}\n className={`btn btn-xs whitespace-nowrap flex-shrink-0 ${selectedType === type ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSelectedType(type)}\n >\n {label}\n {count > 0 && <span className=\"ml-1 text-xs opacity-70\">({count})</span>}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"Search symbols...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 排序选项 */}\n <div className=\"flex gap-1\">\n <button\n className={`btn btn-xs ${sortBy === 'line' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('line')}\n >\n Line\n </button>\n <button\n className={`btn btn-xs ${sortBy === 'name' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('name')}\n >\n Name\n </button>\n <button\n className={`btn btn-xs ${sortBy === 'type' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('type')}\n >\n Type\n </button>\n </div>\n </div>\n\n <div \n className=\"variable-content overflow-y-auto\"\n style={{ \n height: height, \n maxHeight: !height ? maxHeight : undefined \n }}\n >\n {filteredVariables.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? 'No matching symbols' : 'No symbols'}\n </div>\n ) : (\n <div className=\"space-y-1\">\n {filteredVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${variable.line}-${index}`}\n className=\"variable-item flex items-center gap-2 px-2 py-1 hover:bg-base-200 cursor-pointer rounded transition-colors\"\n onClick={() => onVariableClick(variable.line)}\n title={`${variable.type}: ${variable.name} (line ${variable.line})`}\n >\n <span className={`font-mono font-bold text-xs ${getTypeColor(variable.type)}`}>\n {getTypeIcon(variable.type)}\n </span>\n <span className=\"text-sm truncate flex-1 font-mono\">{variable.name}</span>\n <span className=\"text-xs opacity-60\">{variable.line}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <style>{`\n .variable-panel .overflow-x-auto {\n scrollbar-width: thin;\n scrollbar-color: oklch(var(--bc) / 0.2) transparent;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar {\n height: 4px;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-thumb {\n background: oklch(var(--bc) / 0.2);\n border-radius: 2px;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-thumb:hover {\n background: oklch(var(--bc) / 0.3);\n }\n `}</style>\n </div>\n );\n};\n\nexport default VariablePanel;\n\n"],"mappings":"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"}