dishui 0.0.106 → 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 (388) 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.d.ts +1 -0
  234. package/dist/components/pro/RichTextEditor/AIRewrite.js +109 -88
  235. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  236. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  237. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  238. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  239. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  240. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  241. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  242. package/dist/components/pro/RichTextEditor/RichTextEditor.js +133 -132
  243. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  244. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  245. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  246. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  247. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  248. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  249. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  250. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  251. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  252. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
  253. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  254. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  255. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  256. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  257. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  258. package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
  259. package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
  260. package/dist/components/pro/RichTextEditor/types.d.ts +2 -0
  261. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  262. package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
  263. package/dist/components/pro/Sprite/Molly/animations.js +52 -0
  264. package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
  265. package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
  266. package/dist/components/pro/Sprite/Molly/events.js +46 -0
  267. package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
  268. package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
  269. package/dist/components/pro/Sprite/Molly/index.js +12 -0
  270. package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
  271. package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
  272. package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
  273. package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
  274. package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
  275. package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
  276. package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
  277. package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
  278. package/dist/components/pro/Sprite/Molly/model.js +614 -0
  279. package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
  280. package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
  281. package/dist/components/pro/Sprite/Molly/rig.js +102 -0
  282. package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
  283. package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
  284. package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
  285. package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
  286. package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
  287. package/dist/components/pro/Sprite/Ruby/events.js +46 -0
  288. package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
  289. package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
  290. package/dist/components/pro/Sprite/Ruby/index.js +12 -0
  291. package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
  292. package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
  293. package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
  294. package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
  295. package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
  296. package/dist/components/pro/Sprite/Ruby/model.js +605 -0
  297. package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
  298. package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
  299. package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
  300. package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
  301. package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
  302. package/dist/components/pro/Sprite/Sprite2.js +224 -0
  303. package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
  304. package/dist/components/pro/Sprite/actions.d.ts +3 -0
  305. package/dist/components/pro/Sprite/actions.js +16 -0
  306. package/dist/components/pro/Sprite/actions.js.map +1 -0
  307. package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
  308. package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
  309. package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
  310. package/dist/components/pro/Sprite/index.d.ts +4 -0
  311. package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
  312. package/dist/components/pro/Sprite/shared/animation.js +39 -0
  313. package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
  314. package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
  315. package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
  316. package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
  317. package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
  318. package/dist/components/pro/Sprite/shared/events.js +21 -0
  319. package/dist/components/pro/Sprite/shared/events.js.map +1 -0
  320. package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
  321. package/dist/components/pro/Sprite/shared/face.js +33 -0
  322. package/dist/components/pro/Sprite/shared/face.js.map +1 -0
  323. package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
  324. package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
  325. package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
  326. package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
  327. package/dist/components/pro/Sprite/shared/gait.js +19 -0
  328. package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
  329. package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
  330. package/dist/components/pro/Sprite/shared/geometry.js +59 -0
  331. package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
  332. package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
  333. package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
  334. package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
  335. package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
  336. package/dist/components/pro/Sprite/shared/playback.js +74 -0
  337. package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
  338. package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
  339. package/dist/components/pro/Sprite/shared/rig.js +48 -0
  340. package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
  341. package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
  342. package/dist/components/pro/Sprite/shared/scene.js +21 -0
  343. package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
  344. package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
  345. package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
  346. package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
  347. package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
  348. package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
  349. package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
  350. package/dist/components/pro/Sprite/types.d.ts +40 -0
  351. package/dist/contexts/AppContext.js.map +1 -1
  352. package/dist/contexts/authentication.js.map +1 -1
  353. package/dist/data-table.js +3 -3
  354. package/dist/data-table.js.map +1 -1
  355. package/dist/dishui.css +1 -1
  356. package/dist/hooks/useClickOutside.js.map +1 -1
  357. package/dist/hooks/useContainerElement.js.map +1 -1
  358. package/dist/hooks/useControllableState.js.map +1 -1
  359. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  360. package/dist/hooks/useDebounce.js.map +1 -1
  361. package/dist/hooks/useDraggable.js.map +1 -1
  362. package/dist/hooks/useTableColumns.js.map +1 -1
  363. package/dist/hooks/useTableData.js.map +1 -1
  364. package/dist/index-nostyled.d.ts +2 -0
  365. package/dist/index.d.ts +2 -0
  366. package/dist/index.js +116 -115
  367. package/dist/layouts/MainLayout.js.map +1 -1
  368. package/dist/layouts/Navbar.js.map +1 -1
  369. package/dist/layouts/Sidebar.js.map +1 -1
  370. package/dist/layouts/headbar/Headbar.js.map +1 -1
  371. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  372. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  373. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  374. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  375. package/dist/sprite.js +2 -0
  376. package/dist/styles/themeStyles.js.map +1 -1
  377. package/dist/utils/cn.js.map +1 -1
  378. package/dist/utils/flexLayout.js.map +1 -1
  379. package/dist/utils/i18n.js.map +1 -1
  380. package/dist/utils/menu.js.map +1 -1
  381. package/dist/utils/rehype-code-meta.js.map +1 -1
  382. package/dist/utils/remark-code-meta.js.map +1 -1
  383. package/dist/utils/routerBuilder.js.map +1 -1
  384. package/dist/utils/safeStorage.js.map +1 -1
  385. package/dist/utils/selection.js +29 -20
  386. package/dist/utils/selection.js.map +1 -1
  387. package/dist/utils/themes.js.map +1 -1
  388. package/package.json +15 -11
@@ -1 +1 @@
1
- {"version":3,"file":"InspectorPanel.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/InspectorPanel.tsx"],"sourcesContent":["import React, { useMemo, useRef, useState } from 'react';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\nimport Checkbox from '../../../Checkbox';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useFlowAI } from '../context/FlowAIContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { EDGE_LINE_STYLE_OPTIONS, EDGE_MARKER_OPTIONS, BORDER_STYLE_OPTIONS, EDGE_TYPE_OPTIONS, DEFAULT_NODE_DATA } from '../constants';\nimport { generateId } from '../nodes/nodeUtils';\nimport { getAllSvgIcons, getSvgIcon, getSvgIconsByCategory, SVG_ICON_CATEGORIES, buildSvgMarkup, type SvgIconCategory } from '../nodes/svgIcons';\nimport { BORDER_SIDE_NAMES, BORDER_SIDE_TYPES, hasBorderSideOverrides, type BorderSideName } from '../nodes/shapes';\nimport { FLOW_NODE_TYPES, type FlowNode, type FlowEdge, type FlowLine, type FlowShapeType, type FlowBorderSideOverride, type FlowAIConfig } from '../types';\nimport { THEME_SYNC_TOKEN, COMMON_COLORS, isThemeToken, themeTokenCssVar, resolveThemeColor, type ThemeColorFieldKind } from '../utils/themeColor';\nimport { DataInspectorSection } from './DataInspectorSection';\nimport { ExpandableTextarea } from './ExpandableTextarea';\nimport {\n ARCHIFY_COMPONENT_ORDER,\n ARCHIFY_COMPONENT_LABELS,\n COMPONENT_STYLES,\n archifyStylePatch,\n} from '../archify';\n\n/**\n * Standalone panel (legacy). Prefer using InspectorPanelContent inside a FlowPanelGroup.\n */\nexport default function InspectorPanel() {\n const { showInspector } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('left', 240);\n\n if (!showInspector) return null;\n\n return (\n <div className=\"flow-inspector\" data-flow-panel style={{ ...panelStyle, width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--left\" {...resizeHandleProps} />\n <div\n className=\"flow-panel-drag-handle\"\n {...handleProps}\n style={{ fontSize: 11, fontWeight: 600, marginBottom: 8, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em', cursor: 'grab' }}\n >\n Inspector\n </div>\n <div className=\"flow-inspector-content\">\n <InspectorPanelContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function InspectorPanelContent() {\n const { currentCanvas, selection, setSelection, setDoc, currentCanvasId } = useFlowContext();\n const { aiConfig, hasSharedConfig } = useFlowAI();\n\n const selectedNodes = useMemo(\n () => currentCanvas.nodes.filter(n => selection.nodeIds.has(n.id)),\n [currentCanvas.nodes, selection.nodeIds],\n );\n const selectedEdges = useMemo(\n () => currentCanvas.edges.filter(e => selection.edgeIds.has(e.id)),\n [currentCanvas.edges, selection.edgeIds],\n );\n const selectedLines = useMemo(\n () => currentCanvas.lines.filter(l => selection.lineIds.has(l.id)),\n [currentCanvas.lines, selection.lineIds],\n );\n\n const hasSelection = selectedNodes.length > 0 || selectedEdges.length > 0 || selectedLines.length > 0;\n const singleIsGroup = selectedNodes.length === 1 && (selectedNodes[0].type === 'flowGroup' || selectedNodes[0].type === 'geometryGroup' || selectedNodes[0].data.isGroup);\n\n const totalSelected = selectedNodes.length + selectedLines.length;\n\n const handleGroup = (type: 'flowGroup' | 'geometryGroup' = 'flowGroup') => {\n if (totalSelected < 2) return;\n const PAD = 20;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const n of selectedNodes) {\n minX = Math.min(minX, n.position.x);\n minY = Math.min(minY, n.position.y);\n maxX = Math.max(maxX, n.position.x + n.width);\n maxY = Math.max(maxY, n.position.y + n.height);\n }\n for (const l of selectedLines) {\n for (const p of l.points) {\n minX = Math.min(minX, p.x); minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y);\n }\n }\n const isGeo = type === 'geometryGroup';\n const groupId = generateId('group');\n const groupNode: FlowNode = {\n id: groupId,\n type,\n position: { x: minX - PAD, y: minY - PAD },\n width: maxX - minX + PAD * 2,\n height: maxY - minY + PAD * 2,\n data: {\n ...DEFAULT_NODE_DATA,\n label: isGeo ? 'Geo Group' : 'Group',\n fill: isGeo ? '#fefce8' : '#f0f9ff',\n stroke: '#9ca3af', strokeWidth: 1.5,\n borderStyle: isGeo ? 'dashed' : 'dotted',\n isGroup: true,\n },\n };\n const nIds = selection.nodeIds;\n const lIds = selection.lineIds;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: isGeo\n ? [groupNode, ...canvas.nodes]\n : [groupNode, ...canvas.nodes.map(n => nIds.has(n.id) ? { ...n, parentId: groupId } : n)],\n lines: isGeo\n ? canvas.lines\n : canvas.lines.map(l => lIds.has(l.id) ? { ...l, parentId: groupId } : l),\n }},\n };\n });\n setSelection({ nodeIds: new Set([groupId]), edgeIds: new Set(), lineIds: new Set() });\n };\n\n const handleUngroup = () => {\n const groupIds = new Set<string>();\n const childNodeIds = new Set<string>();\n const childLineIds = new Set<string>();\n for (const n of selectedNodes) {\n if (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup) groupIds.add(n.id);\n }\n if (groupIds.size === 0) return;\n for (const n of currentCanvas.nodes) {\n if (n.parentId && groupIds.has(n.parentId)) childNodeIds.add(n.id);\n }\n for (const l of currentCanvas.lines) {\n if (l.parentId && groupIds.has(l.parentId)) childLineIds.add(l.id);\n }\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes\n .filter(n => !groupIds.has(n.id))\n .map(n => childNodeIds.has(n.id) ? { ...n, parentId: undefined } : n),\n lines: canvas.lines\n .map(l => childLineIds.has(l.id) ? { ...l, parentId: undefined } : l),\n }},\n };\n });\n setSelection({ nodeIds: childNodeIds, edgeIds: new Set(), lineIds: childLineIds });\n };\n\n const changeNodeZIndex = (mode: 'front' | 'back' | 'up' | 'down') => {\n const ids = selection.nodeIds;\n if (ids.size === 0) return;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const allZ = canvas.nodes.map(n => n.zIndex ?? 0);\n const maxZ = allZ.length > 0 ? Math.max(...allZ) : 0;\n const minZ = allZ.length > 0 ? Math.min(...allZ) : 0;\n const nodes = canvas.nodes.map(n => {\n if (!ids.has(n.id)) return n;\n const z = n.zIndex ?? 0;\n let newZ = z;\n if (mode === 'front') newZ = maxZ + 1;\n else if (mode === 'back') newZ = minZ - 1;\n else if (mode === 'up') newZ = z + 1;\n else if (mode === 'down') newZ = z - 1;\n return { ...n, zIndex: newZ };\n });\n return { ...prev, canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, nodes } } };\n });\n };\n\n const changeLineZIndex = (mode: 'front' | 'back' | 'up' | 'down') => {\n const ids = selection.lineIds;\n if (ids.size === 0) return;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const allZ = canvas.lines.map(l => l.zIndex ?? 0);\n const maxZ = allZ.length > 0 ? Math.max(...allZ) : 0;\n const minZ = allZ.length > 0 ? Math.min(...allZ) : 0;\n const lines = canvas.lines.map(l => {\n if (!ids.has(l.id)) return l;\n const z = l.zIndex ?? 0;\n let newZ = z;\n if (mode === 'front') newZ = maxZ + 1;\n else if (mode === 'back') newZ = minZ - 1;\n else if (mode === 'up') newZ = z + 1;\n else if (mode === 'down') newZ = z - 1;\n return { ...l, zIndex: newZ };\n });\n return { ...prev, canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, lines } } };\n });\n };\n\n const updateNodeData = (nodeId: string, key: string, value: any) => {\n updateNodeDataBatch(nodeId, { [key]: value });\n };\n\n const updateNodeDataBatch = (nodeId: string, values: Record<string, any>) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(n =>\n n.id === nodeId ? { ...n, data: { ...n.data, ...values } } : n,\n ),\n },\n },\n };\n });\n };\n\n const updateNodeDimension = (nodeId: string, key: 'width' | 'height', value: number) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(n =>\n n.id === nodeId ? { ...n, [key]: value } : n,\n ),\n },\n },\n };\n });\n };\n\n const updateEdgeData = (edgeId: string, key: string, value: any) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n edges: canvas.edges.map(e =>\n e.id === edgeId ? { ...e, data: { ...e.data, [key]: value } } : e,\n ),\n },\n },\n };\n });\n };\n\n const updateNodeType = (nodeId: string, type: FlowShapeType) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(node => node.id === nodeId ? { ...node, type } : node),\n },\n },\n };\n });\n };\n\n const updateEdgeType = (edgeId: string, type: string) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n edges: canvas.edges.map(e =>\n e.id === edgeId ? { ...e, type: type as any } : e,\n ),\n },\n },\n };\n });\n };\n\n const updateLineData = (lineId: string, key: string, value: any) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n lines: canvas.lines.map(l =>\n l.id === lineId ? { ...l, [key]: value } : l,\n ),\n },\n },\n };\n });\n };\n\n return (\n <>\n {!hasSelection && (\n <div style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 40%, transparent)', textAlign: 'center', padding: '20px 0' }}>\n Select an element to inspect\n </div>\n )}\n\n {selectedNodes.length === 1 && (\n <NodeInspector\n node={selectedNodes[0]}\n isGroup={singleIsGroup}\n onUpdateData={updateNodeData}\n onUpdateDataBatch={updateNodeDataBatch}\n onUpdateDimension={updateNodeDimension}\n onUpdateType={updateNodeType}\n globalAIConfig={aiConfig}\n useSharedAIConfig={hasSharedConfig}\n />\n )}\n {totalSelected > 1 && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Selection</div>\n <div style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', marginBottom: 8 }}>\n {selectedNodes.length > 0 && `${selectedNodes.length} node${selectedNodes.length > 1 ? 's' : ''}`}\n {selectedNodes.length > 0 && selectedLines.length > 0 && ', '}\n {selectedLines.length > 0 && `${selectedLines.length} line${selectedLines.length > 1 ? 's' : ''}`}\n {' selected'}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, width: '100%' }}>\n <Button size=\"xs\" onClick={() => handleGroup('flowGroup')} block>\n Group (⌘G)\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => handleGroup('geometryGroup')} block>\n Geo Group (⌘⌥G)\n </Button>\n </div>\n </div>\n )}\n {singleIsGroup && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">\n {selectedNodes[0].type === 'geometryGroup' ? 'Geometry Group' : 'Group'}\n </div>\n <div style={{ fontSize: 11, color: 'color-mix(in oklch, var(--color-base-content) 45%, transparent)', marginBottom: 6 }}>\n {selectedNodes[0].type === 'geometryGroup'\n ? 'Auto-binds spatially contained nodes'\n : 'Explicit membership via add/remove'}\n </div>\n <Button size=\"xs\" variant=\"ghost\" onClick={handleUngroup} block>\n Ungroup (⌘⇧G)\n </Button>\n </div>\n )}\n\n {selectedNodes.length > 0 && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Layer</div>\n <div style={{ display: 'flex', gap: 4 }}>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('front')}>\n <span title=\"Bring to Front (⌘⇧↑)\">⤒</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('up')}>\n <span title=\"Bring Forward (⌘↑)\">↑</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('down')}>\n <span title=\"Send Backward (⌘↓)\">↓</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('back')}>\n <span title=\"Send to Back (⌘⇧↓)\">⤓</span>\n </Button>\n </div>\n </div>\n )}\n\n {selectedEdges.length === 1 && (\n <EdgeInspector\n edge={selectedEdges[0]}\n onUpdateData={updateEdgeData}\n onUpdateType={updateEdgeType}\n />\n )}\n\n {selectedLines.length === 1 && (\n <>\n <LineInspector\n line={selectedLines[0]}\n onUpdateData={updateLineData}\n />\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Layer</div>\n <div style={{ display: 'flex', gap: 4 }}>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('front')}>\n <span title=\"Bring to Front\">⤒</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('up')}>\n <span title=\"Bring Forward\">↑</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('down')}>\n <span title=\"Send Backward\">↓</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('back')}>\n <span title=\"Send to Back\">⤓</span>\n </Button>\n </div>\n </div>\n </>\n )}\n </>\n );\n}\n\n/**\n * A color field for Flow node/edge styling. Layout (left → right):\n * 1. Theme-sync swatch — follows the active theme (per-field role), the\n * default choice for new shapes.\n * 2. Common colors — 黑白赤橙黄绿青蓝紫粉.\n * 3. Custom picker — arbitrary color from the OS color dialog.\n * (Optional) Transparent — for fill/stroke.\n * Every swatch shows a descriptive tooltip on hover.\n */\nfunction ThemeColorField({\n value,\n onChange,\n kind,\n allowTransparent,\n customFallback = '#ffffff',\n}: {\n value: string | undefined;\n onChange: (value: string) => void;\n kind: ThemeColorFieldKind;\n allowTransparent?: boolean;\n customFallback?: string;\n}) {\n const syncToken = THEME_SYNC_TOKEN[kind];\n const syncCssVar = themeTokenCssVar(syncToken) ?? 'var(--color-base-content)';\n\n const rawValue = value ?? '';\n const lowerValue = rawValue.toLowerCase();\n const valueIsToken = isThemeToken(rawValue);\n const isTransparent = rawValue === 'transparent';\n const isCommon = COMMON_COLORS.some((c) => c.value.toLowerCase() === lowerValue);\n const isSync = rawValue === syncToken;\n const isCustom = !!rawValue && !valueIsToken && !isTransparent && !isCommon;\n const pickerValue = isCustom ? rawValue : customFallback;\n\n return (\n <div className=\"flow-color-field\">\n {/* 1. 主题同步色 */}\n <button\n type=\"button\"\n title=\"跟随主题切换\"\n aria-label=\"跟随主题切换\"\n className={`flow-color-swatch flow-color-swatch--sync${isSync ? ' is-active' : ''}`}\n style={{ background: syncCssVar }}\n onClick={() => onChange(syncToken)}\n />\n\n <span className=\"flow-color-divider\" />\n\n {/* 2. 常用颜色 */}\n {COMMON_COLORS.map((c) => (\n <button\n key={c.value}\n type=\"button\"\n title={c.label}\n aria-label={c.label}\n className={`flow-color-swatch${!valueIsToken && !isTransparent && lowerValue === c.value.toLowerCase() ? ' is-active' : ''}`}\n style={{ background: c.value }}\n onClick={() => onChange(c.value)}\n />\n ))}\n\n <span className=\"flow-color-divider\" />\n\n {/* 3. 自定义取色 */}\n <label\n className={`flow-color-swatch flow-color-swatch--custom${isCustom ? ' is-active' : ''}`}\n title=\"自定义颜色\"\n style={isCustom ? { background: rawValue } : undefined}\n >\n <input\n type=\"color\"\n value={pickerValue}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n\n {/* 可选:透明 */}\n {allowTransparent && (\n <button\n type=\"button\"\n title=\"透明\"\n aria-label=\"透明\"\n className={`flow-color-swatch flow-color-swatch--transparent${isTransparent ? ' is-active' : ''}`}\n onClick={() => onChange('transparent')}\n />\n )}\n </div>\n );\n}\n\n/** Data-URL preview of a registry icon for picker thumbnails. */\nfunction titleIconThumbUrl(id: string): string {\n const def = getSvgIcon(id);\n const brand = resolveThemeColor(def?.brandColor, '') || '#475569';\n const markup = buildSvgMarkup(id, brand);\n return markup ? `data:image/svg+xml;utf8,${encodeURIComponent(markup)}` : '';\n}\n\n/** Configure the optional glyph rendered beside a shape node's title text:\n * pick from the built-in registry, then side / size / color. */\nfunction TitleIconSection({\n node,\n onUpdateData,\n}: {\n node: FlowNode;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n const [cat, setCat] = useState<SvgIconCategory>('lang');\n const icons = useMemo(() => getSvgIconsByCategory(cat), [cat]);\n const current = node.data.titleIcon ?? '';\n const side = node.data.titleIconSide ?? 'left';\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Title Icon</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Icon</Label>\n <div style={{ display: 'flex', gap: 4, alignItems: 'center', flex: 1, minWidth: 0 }}>\n <Select\n options={SVG_ICON_CATEGORIES.map(c => ({ value: c.id, label: c.label }))}\n value={cat}\n onChange={(v) => setCat(v as SvgIconCategory)}\n style={{ fontSize: 12, flex: 1, minWidth: 0 }}\n />\n <Button\n size=\"xs\"\n variant={current ? 'ghost' : 'primary'}\n square\n onClick={() => onUpdateData(node.id, 'titleIcon', undefined)}\n >\n <span title=\"移除标题图标\">✕</span>\n </Button>\n </div>\n </div>\n {current && !icons.some(ic => ic.id === current) && (\n <div style={{ fontSize: 10, opacity: 0.55, marginBottom: 4 }}>\n 当前图标在其他分类\n </div>\n )}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(22px, 1fr))',\n gap: 3,\n maxHeight: 92,\n overflowY: 'auto',\n padding: 3,\n border: '1px solid color-mix(in oklch, var(--color-base-content) 14%, transparent)',\n borderRadius: 6,\n marginBottom: 6,\n }}\n >\n {icons.map((ic) => {\n const url = titleIconThumbUrl(ic.id);\n const active = current === ic.id;\n return (\n <button\n key={ic.id}\n type=\"button\"\n title={ic.label}\n aria-label={ic.label}\n onClick={() => onUpdateData(node.id, 'titleIcon', ic.id)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 22,\n height: 22,\n borderRadius: 4,\n cursor: 'pointer',\n padding: 0,\n border: active ? '1.5px solid var(--color-primary)' : '1px solid transparent',\n background: active ? 'color-mix(in oklch, var(--color-primary) 12%, transparent)' : 'transparent',\n }}\n >\n {url && <img src={url} width={16} height={16} alt=\"\" style={{ objectFit: 'contain' }} />}\n </button>\n );\n })}\n </div>\n {current && (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Side</Label>\n <Select\n options={[\n { value: 'left', label: 'left' },\n { value: 'right', label: 'right' },\n ]}\n value={side}\n onChange={(v) => onUpdateData(node.id, 'titleIconSide', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Size</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.titleIconSize ?? Math.max(8, Math.round(node.data.fontSize * 1.15)))}\n onChange={(e) => onUpdateData(node.id, 'titleIconSize', Math.max(8, Number(e.target.value) || 8))}\n />\n <span className=\"flow-inspector-suffix\" style={{ fontSize: 10, opacity: 0.5 }}>px</span>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <ThemeColorField\n value={node.data.titleIconColor\n ?? getSvgIcon(current)?.brandColor\n ?? node.data.labelColor\n ?? node.data.color}\n kind=\"stroke\"\n customFallback=\"#334155\"\n onChange={(v) => onUpdateData(node.id, 'titleIconColor', v)}\n />\n </div>\n </>\n )}\n </div>\n );\n}\n\nfunction NodeInspector({\n node,\n isGroup,\n onUpdateData,\n onUpdateDataBatch,\n onUpdateDimension,\n onUpdateType,\n globalAIConfig,\n useSharedAIConfig,\n}: {\n node: FlowNode;\n isGroup?: boolean;\n onUpdateData: (id: string, key: string, value: any) => void;\n onUpdateDataBatch: (id: string, values: Record<string, any>) => void;\n onUpdateDimension: (id: string, key: 'width' | 'height', value: number) => void;\n onUpdateType: (id: string, type: FlowShapeType) => void;\n globalAIConfig: FlowAIConfig;\n useSharedAIConfig: boolean;\n}) {\n return (\n <>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Node</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Input\n size=\"xs\"\n value={node.data.label}\n onChange={(e) => onUpdateData(node.id, 'label', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <Select\n options={FLOW_NODE_TYPES.map(type => ({ value: type, label: type }))}\n value={node.type}\n onChange={(value) => onUpdateType(node.id, value as FlowShapeType)}\n style={{ fontSize: 12 }}\n />\n </div>\n </div>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Size</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">W</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(Math.round(node.width * 100) / 100)}\n onChange={(e) => onUpdateDimension(node.id, 'width', Number(e.target.value) || node.width)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">H</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(Math.round(node.height * 100) / 100)}\n onChange={(e) => onUpdateDimension(node.id, 'height', Number(e.target.value) || node.height)}\n />\n </div>\n </div>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Style</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Fill</Label>\n <ThemeColorField\n value={node.data.fill}\n kind=\"fill\"\n allowTransparent\n customFallback=\"#ffffff\"\n onChange={(v) => onUpdateData(node.id, 'fill', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Stroke</Label>\n <ThemeColorField\n value={node.data.stroke}\n kind=\"stroke\"\n allowTransparent\n customFallback=\"#000000\"\n onChange={(v) => onUpdateData(node.id, 'stroke', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Font</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.fontSize)}\n onChange={(e) => onUpdateData(node.id, 'fontSize', Number(e.target.value) || 14)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <ThemeColorField\n value={node.data.color}\n kind=\"text\"\n customFallback=\"#111827\"\n onChange={(v) => onUpdateData(node.id, 'color', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Font Color</Label>\n <ThemeColorField\n value={node.data.labelColor ?? node.data.color}\n kind=\"text\"\n customFallback=\"#111827\"\n onChange={(v) => onUpdateData(node.id, 'labelColor', v)}\n />\n </div>\n {node.type !== 'shapeSvg' && node.type !== 'mediaNode' && (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Text Pos</Label>\n <Select\n options={[\n { value: 'center', label: 'center' },\n { value: 'top', label: 'top' },\n { value: 'bottom', label: 'bottom' },\n { value: 'left', label: 'left' },\n { value: 'right', label: 'right' },\n { value: 'top-left', label: 'top-left' },\n { value: 'top-right', label: 'top-right' },\n { value: 'bottom-left', label: 'bottom-left' },\n { value: 'bottom-right', label: 'bottom-right' },\n ]}\n value={node.data.textPlacement ?? ((isGroup || node.type === 'animAnchor') ? 'top' : 'center')}\n onChange={(v) => onUpdateData(node.id, 'textPlacement', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Text Off X</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetX ?? 0)}\n onChange={(e) => onUpdateData(node.id, 'labelOffsetX', Number(e.target.value) || 0)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Text Off Y</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetY ?? 0)}\n onChange={(e) => onUpdateData(node.id, 'labelOffsetY', Number(e.target.value) || 0)}\n />\n </div>\n </>\n )}\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Border</Label>\n <Select\n options={[{ value: 'none', label: 'none' }, ...BORDER_STYLE_OPTIONS.map(s => ({ value: s, label: s }))]}\n value={node.data.borderStyle ?? (isGroup ? (node.type === 'geometryGroup' ? 'dashed' : 'dotted') : 'solid')}\n onChange={(v) => onUpdateData(node.id, 'borderStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n {BORDER_SIDE_TYPES.has(node.type) && (() => {\n const sides = node.data.borderSides ?? {};\n const updateSide = (name: BorderSideName, patch: Partial<FlowBorderSideOverride>) => {\n onUpdateData(node.id, 'borderSides', {\n ...node.data.borderSides,\n [name]: { ...node.data.borderSides?.[name], ...patch },\n });\n };\n const sideLabels: Record<BorderSideName, string> = { top: 'Top', right: 'Right', bottom: 'Bottom', left: 'Left' };\n return (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Sides</Label>\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, flex: 1 }}>\n <span style={{ fontSize: 10, opacity: 0.55 }}>上下左右独立边框</span>\n {hasBorderSideOverrides(node.data, node.type) && (\n <span title=\"恢复与 Border 设置一致\" style={{ display: 'inline-flex' }}>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={() => onUpdateData(node.id, 'borderSides', undefined)}\n >\n 重置\n </Button>\n </span>\n )}\n </div>\n </div>\n {BORDER_SIDE_NAMES.map((name) => {\n const override = sides[name];\n return (\n <div key={name} style={{ display: 'flex', alignItems: 'center', gap: 4, marginBottom: 4 }}>\n <span\n title={`独立设置${sideLabels[name]}边`}\n style={{ fontSize: 10, width: 40, flexShrink: 0, opacity: override ? 0.95 : 0.6 }}\n >\n {sideLabels[name]}\n </span>\n <span title={`显示/隐藏 ${sideLabels[name]} 边`} style={{ display: 'inline-flex' }}>\n <Checkbox\n size=\"sm\"\n checked={override?.visible ?? true}\n onChange={(v) => updateSide(name, { visible: v })}\n />\n </span>\n <ThemeColorField\n value={override?.color ?? node.data.stroke}\n kind=\"stroke\"\n customFallback=\"#334155\"\n onChange={(v) => updateSide(name, { color: v })}\n />\n <span title={`${sideLabels[name]} 粗细`} style={{ display: 'inline-flex', width: 52 }}>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(override?.width ?? node.data.strokeWidth)}\n onChange={(e) => updateSide(name, { width: Math.max(0, Number(e.target.value) || 0) })}\n />\n </span>\n </div>\n );\n })}\n </>\n );\n })()}\n {node.type === 'shapeSvg' && (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Icon</Label>\n <Select\n options={getAllSvgIcons().map(icon => ({ value: icon.id, label: icon.label }))}\n value={node.data.svgId ?? ''}\n placeholder=\"选择图标\"\n onChange={(value) => {\n const icon = getSvgIcon(String(value));\n onUpdateDataBatch(node.id, {\n svgId: value,\n ...(icon?.brandColor ? { color: icon.brandColor } : {}),\n ...(!node.data.label || node.data.label === 'Text' ? { label: icon?.label ?? String(value) } : {}),\n });\n }}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Box</Label>\n <Checkbox\n size=\"sm\"\n checked={node.data.iconBox ?? false}\n onChange={(v) => onUpdateData(node.id, 'iconBox', v)}\n label=\"显示边框\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Select\n options={[\n { value: 'top', label: 'top' },\n { value: 'middle', label: 'middle' },\n { value: 'bottom', label: 'bottom' },\n { value: 'left', label: 'left' },\n { value: 'right', label: 'right' },\n ]}\n value={node.data.labelPlacement === ('above' as any)\n ? 'top'\n : node.data.labelPlacement === ('center' as any)\n ? 'middle'\n : node.data.labelPlacement === ('below' as any)\n ? 'bottom'\n : (node.data.labelPlacement ?? 'bottom')}\n onChange={(v) => onUpdateData(node.id, 'labelPlacement', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Offset X</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetX ?? 0)}\n onChange={(event) => onUpdateData(node.id, 'labelOffsetX', Number(event.target.value) || 0)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Offset Y</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetY ?? 0)}\n onChange={(event) => onUpdateData(node.id, 'labelOffsetY', Number(event.target.value) || 0)}\n />\n </div>\n </>\n )}\n\n </div>\n {node.type === 'mediaNode' && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Palette (Archify)</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Palette</Label>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {ARCHIFY_COMPONENT_ORDER.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n title={ARCHIFY_COMPONENT_LABELS[kind]}\n aria-label={ARCHIFY_COMPONENT_LABELS[kind]}\n onClick={() => onUpdateDataBatch(node.id, archifyStylePatch(kind))}\n style={{\n width: 18,\n height: 18,\n borderRadius: 4,\n cursor: 'pointer',\n background: COMPONENT_STYLES[kind].fill,\n border: `1.5px solid ${COMPONENT_STYLES[kind].stroke}`,\n }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n {node.type !== 'mediaNode' && node.type !== 'shapeSvg' && (\n <TitleIconSection node={node} onUpdateData={onUpdateData} />\n )}\n {node.type !== 'mediaNode' && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Card (Archify)</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Subtitle</Label>\n <Input\n size=\"xs\"\n value={node.data.sublabel ?? ''}\n placeholder=\"secondary line\"\n onChange={(e) => onUpdateData(node.id, 'sublabel', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Sub Color</Label>\n <ThemeColorField\n value={node.data.sublabelColor ?? '#94a3b8'}\n kind=\"text\"\n customFallback=\"#94a3b8\"\n onChange={(v) => onUpdateData(node.id, 'sublabelColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Tag</Label>\n <Input\n size=\"xs\"\n value={node.data.tag ?? ''}\n placeholder=\"corner pill\"\n onChange={(e) => onUpdateData(node.id, 'tag', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Tag Color</Label>\n <ThemeColorField\n value={node.data.tagColor ?? node.data.stroke}\n kind=\"stroke\"\n customFallback=\"#334155\"\n onChange={(v) => onUpdateData(node.id, 'tagColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Tag Pos</Label>\n <Select\n options={[\n { value: 'top-left', label: 'top-left' },\n { value: 'top-right', label: 'top-right' },\n { value: 'bottom-left', label: 'bottom-left' },\n { value: 'bottom-right', label: 'bottom-right' },\n ]}\n value={node.data.tagPlacement ?? 'top-right'}\n onChange={(v) => onUpdateData(node.id, 'tagPlacement', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Palette</Label>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {ARCHIFY_COMPONENT_ORDER.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n title={ARCHIFY_COMPONENT_LABELS[kind]}\n aria-label={ARCHIFY_COMPONENT_LABELS[kind]}\n onClick={() => onUpdateDataBatch(node.id, archifyStylePatch(kind))}\n style={{\n width: 18,\n height: 18,\n borderRadius: 4,\n cursor: 'pointer',\n background: COMPONENT_STYLES[kind].fill,\n border: `1.5px solid ${COMPONENT_STYLES[kind].stroke}`,\n }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n {node.type === 'mediaNode' && (\n <MediaInspectorSection node={node} onUpdateData={onUpdateData} globalAIConfig={globalAIConfig} useSharedAIConfig={useSharedAIConfig} />\n )}\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Transform</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Rotate</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.rotation ?? 0)}\n onChange={(e) => onUpdateData(node.id, 'rotation', Number(e.target.value) || 0)}\n />\n <span className=\"flow-inspector-suffix\" style={{ fontSize: 10, opacity: 0.5 }}>°</span>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Flip</Label>\n <Button\n size=\"xs\"\n variant={node.data.flipX ? 'primary' : 'ghost'}\n onClick={() => onUpdateData(node.id, 'flipX', !node.data.flipX)}\n square\n >\n <span title=\"Flip Horizontal\">↔</span>\n </Button>\n <Button\n size=\"xs\"\n variant={node.data.flipY ? 'primary' : 'ghost'}\n onClick={() => onUpdateData(node.id, 'flipY', !node.data.flipY)}\n square\n >\n <span title=\"Flip Vertical\">↕</span>\n </Button>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Quick</Label>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => onUpdateData(node.id, 'rotation', ((node.data.rotation ?? 0) + 90) % 360)}>\n +90°\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => onUpdateData(node.id, 'rotation', ((node.data.rotation ?? 0) - 90 + 360) % 360)}>\n −90°\n </Button>\n </div>\n </div>\n </>\n );\n}\n\nfunction MediaInspectorSection({\n node,\n onUpdateData,\n globalAIConfig,\n useSharedAIConfig,\n}: {\n node: FlowNode;\n onUpdateData: (id: string, key: string, value: any) => void;\n globalAIConfig: FlowAIConfig;\n useSharedAIConfig: boolean;\n}) {\n const kind = node.data.mediaKind ?? 'markdown';\n const ai = useSharedAIConfig ? globalAIConfig : node.data.aiConfig;\n const modelFileInputRef = useRef<HTMLInputElement>(null);\n\n const updateAI = (key: string, value: any) => {\n onUpdateData(node.id, 'aiConfig', {\n gateway: '', protocol: 'openai', model: '',\n ...ai,\n [key]: value,\n });\n };\n\n const contentLabels: Record<string, string> = {\n markdown: 'Markdown 源码',\n html: 'HTML 源码',\n mermaid: 'Mermaid 图表',\n math: 'LaTeX 公式',\n };\n\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Media · {kind}</div>\n {kind === 'data' ? (\n <DataInspectorSection node={node} onUpdateData={onUpdateData} />\n ) : kind === 'model3d' ? (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">格式</Label>\n <Select\n options={[\n { value: 'stl', label: 'STL' },\n { value: 'obj', label: 'OBJ' },\n { value: '3mf', label: '3MF' },\n ]}\n value={node.data.modelFormat ?? 'stl'}\n onChange={value => onUpdateData(node.id, 'modelFormat', value)}\n />\n </div>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <Label size=\"xs\" className=\"flow-inspector-label\">模型链接</Label>\n <Input\n size=\"xs\"\n value={node.data.mediaContent ?? ''}\n placeholder=\"https://example.com/model.stl\"\n onChange={event => onUpdateData(node.id, 'mediaContent', event.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">本地模型</Label>\n <input\n ref={modelFileInputRef}\n type=\"file\"\n accept=\".stl,.obj,.3mf,model/stl,model/obj,model/3mf,application/vnd.ms-package.3dmanufacturing-3dmodel+xml\"\n hidden\n onChange={event => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (!file) return;\n if (file.size > 10 * 1024 * 1024) {\n window.alert('本地模型不能超过 10 MiB,请改用模型链接。');\n return;\n }\n const extension = file.name.split('.').pop()?.toLowerCase();\n if (extension !== 'stl' && extension !== 'obj' && extension !== '3mf') {\n window.alert('仅支持 STL、OBJ 和 3MF 模型。');\n return;\n }\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result !== 'string') return;\n onUpdateData(node.id, 'modelFormat', extension);\n onUpdateData(node.id, 'mediaContent', reader.result);\n };\n reader.onerror = () => window.alert('读取本地模型失败。');\n reader.readAsDataURL(file);\n }}\n />\n <Button size=\"xs\" variant=\"neutral\" onClick={() => modelFileInputRef.current?.click()}>\n 选择文件\n </Button>\n {node.data.mediaContent?.startsWith('data:') && (\n <span className=\"flow-inspector-file-status\">已嵌入</span>\n )}\n </div>\n <div className=\"flow-inspector-help\">支持 STL、OBJ、3MF;本地文件将以 Base64 嵌入文档,最大 10 MiB。选中节点后可在内部拖拽旋转、滚轮缩放。</div>\n </>\n ) : kind === 'image' ? (\n <>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <Label size=\"xs\" className=\"flow-inspector-label\">图片链接</Label>\n <Input\n size=\"xs\"\n value={node.data.mediaContent ?? ''}\n placeholder=\"https://example.com/image.png\"\n onChange={(event) => onUpdateData(node.id, 'mediaContent', event.target.value)}\n />\n </div>\n <div className=\"flow-inspector-help\">支持 HTTP(S) 链接;选中图片节点后可直接粘贴图片并保存为 Base64。</div>\n </>\n ) : kind !== 'ai' ? (\n <ExpandableTextarea\n label={contentLabels[kind] ?? '内容'}\n value={node.data.mediaContent ?? ''}\n onChange={(value) => onUpdateData(node.id, 'mediaContent', value)}\n rows={8}\n />\n ) : useSharedAIConfig ? (\n <div className=\"flow-inspector-help\">\n 此节点自动使用统一 AI 配置{globalAIConfig.model ? `(${globalAIConfig.model})` : ''},请通过 Flow 顶部的 AI 配置入口修改。\n </div>\n ) : (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">协议</Label>\n <Select\n options={[\n { value: 'openai', label: 'OpenAI 兼容' },\n { value: 'anthropic', label: 'Anthropic 兼容' },\n ]}\n value={ai?.protocol ?? 'openai'}\n onChange={(v) => updateAI('protocol', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">接口地址</Label>\n <Input\n size=\"xs\"\n value={ai?.gateway ?? ''}\n placeholder=\"https://api.openai.com/v1/chat/completions\"\n onChange={(e) => updateAI('gateway', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">模型</Label>\n <Input\n size=\"xs\"\n value={ai?.model ?? ''}\n placeholder=\"gpt-4o-mini\"\n onChange={(e) => updateAI('model', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">API Key</Label>\n <Input\n size=\"xs\"\n type=\"password\"\n value={ai?.apiKey ?? ''}\n placeholder=\"sk-...\"\n onChange={(e) => updateAI('apiKey', e.target.value)}\n />\n </div>\n <ExpandableTextarea\n label=\"System Prompt\"\n value={ai?.systemPrompt ?? ''}\n onChange={(value) => updateAI('systemPrompt', value)}\n rows={3}\n />\n <div style={{ fontSize: 10, color: 'color-mix(in oklch, var(--color-base-content) 45%, transparent)', marginTop: 4 }}>\n 密钥会随文档 JSON 一同导出,请谨慎分享。\n </div>\n </>\n )}\n </div>\n );\n}\n\nfunction EdgeInspector({\n edge,\n onUpdateData,\n onUpdateType,\n}: {\n edge: FlowEdge;\n onUpdateData: (id: string, key: string, value: any) => void;\n onUpdateType: (id: string, type: string) => void;\n}) {\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Edge</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <Select\n options={EDGE_TYPE_OPTIONS.map(t => ({ value: t, label: t }))}\n value={edge.type}\n onChange={(v) => onUpdateType(edge.id, v as string)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <ThemeColorField\n value={edge.data.strokeColor}\n kind=\"line\"\n customFallback=\"#374151\"\n onChange={(v) => onUpdateData(edge.id, 'strokeColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Width</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(edge.data.strokeWidth ?? 2)}\n onChange={(e) => onUpdateData(edge.id, 'strokeWidth', Number(e.target.value) || 2)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Animation</Label>\n <Checkbox\n size=\"sm\"\n checked={edge.data.animated ?? false}\n onChange={(value) => onUpdateData(edge.id, 'animated', value)}\n label=\"预览时播放\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Line</Label>\n <Select\n options={EDGE_LINE_STYLE_OPTIONS.map(s => ({ value: s, label: s }))}\n value={edge.data.lineStyle ?? 'solid'}\n onChange={(v) => onUpdateData(edge.id, 'lineStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Start</Label>\n <Select\n options={EDGE_MARKER_OPTIONS.map(m => ({ value: m, label: m }))}\n value={edge.data.markerStart ?? 'none'}\n onChange={(v) => onUpdateData(edge.id, 'markerStart', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">End</Label>\n <Select\n options={EDGE_MARKER_OPTIONS.map(m => ({ value: m, label: m }))}\n value={edge.data.markerEnd ?? 'none'}\n onChange={(v) => onUpdateData(edge.id, 'markerEnd', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Input\n size=\"xs\"\n value={edge.data.labelText ?? ''}\n onChange={(e) => onUpdateData(edge.id, 'labelText', e.target.value)}\n placeholder=\"Edge label\"\n />\n </div>\n </div>\n );\n}\n\nfunction LineInspector({\n line,\n onUpdateData,\n}: {\n line: FlowLine;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Line</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <span style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 60%, transparent)' }}>{line.type}</span>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <ThemeColorField\n value={line.strokeColor}\n kind=\"line\"\n customFallback=\"#374151\"\n onChange={(v) => onUpdateData(line.id, 'strokeColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Width</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(line.strokeWidth)}\n onChange={(e) => onUpdateData(line.id, 'strokeWidth', Number(e.target.value) || 2)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Style</Label>\n <Select\n options={EDGE_LINE_STYLE_OPTIONS.map(s => ({ value: s, label: s }))}\n value={line.lineStyle}\n onChange={(v) => onUpdateData(line.id, 'lineStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InspectorPanel.js","names":["_Fragment","Button","ButtonWithCompounds","Input","Label","Checkbox","Select","InspectorPanel","useFlowUI","useDraggablePanel","useResizablePanel","showInspector","panelStyle","panelWidth","resizeHandleProps","handleProps","InspectorPanelContent","useFlowContext","useFlowAI","selectedNodes","useMemo","currentCanvas","selection","n","selectedEdges","selectedLines","l","hasSelection","singleIsGroup","totalSelected","handleGroup","minX","minY","maxX","maxY","p","isGeo","type","groupId","generateId","groupNode","DEFAULT_NODE_DATA","nIds","lIds","setDoc","canvas","prev","currentCanvasId","setSelection","handleUngroup","groupIds","childNodeIds","childLineIds","changeNodeZIndex","ids","allZ","maxZ","minZ","nodes","z","newZ","mode","changeLineZIndex","lines","updateNodeData","nodeId","key","value","updateNodeDataBatch","values","Fragment","NodeInspector","node","aiConfig","hasSharedConfig","EdgeInspector","e","edgeId","LineInspector","lineId","ThemeColorField","syncToken","THEME_SYNC_TOKEN","kind","syncCssVar","themeTokenCssVar","rawValue","lowerValue","valueIsToken","isThemeToken","isTransparent","isCommon","COMMON_COLORS","c","isSync","isCustom","pickerValue","customFallback","onChange","allowTransparent","titleIconThumbUrl","def","getSvgIcon","id","brand","resolveThemeColor","markup","buildSvgMarkup","TitleIconSection","cat","setCat","useState","icons","getSvgIconsByCategory","current","side","SVG_ICON_CATEGORIES","v","onUpdateData","ic","url","active","FLOW_NODE_TYPES","onUpdateType","onUpdateDimension","isGroup","BORDER_STYLE_OPTIONS","s","BORDER_SIDE_TYPES","sides","updateSide","name","patch","sideLabels","hasBorderSideOverrides","BORDER_SIDE_NAMES","override","getAllSvgIcons","icon","event","ARCHIFY_COMPONENT_ORDER","ARCHIFY_COMPONENT_LABELS","onUpdateDataBatch","archifyStylePatch","COMPONENT_STYLES","MediaInspectorSection","ai","useSharedAIConfig","globalAIConfig","modelFileInputRef","useRef","updateAI","DataInspectorSection","file","extension","reader","ExpandableTextarea","EDGE_TYPE_OPTIONS","t","edge","EDGE_LINE_STYLE_OPTIONS","EDGE_MARKER_OPTIONS","m","line"],"sources":["../../../../../src/components/pro/Flow/panels/InspectorPanel.tsx"],"sourcesContent":["import React, { useMemo, useRef, useState } from 'react';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Button from '../../../Button';\nimport Label from '../../../Label';\nimport Checkbox from '../../../Checkbox';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useFlowAI } from '../context/FlowAIContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { EDGE_LINE_STYLE_OPTIONS, EDGE_MARKER_OPTIONS, BORDER_STYLE_OPTIONS, EDGE_TYPE_OPTIONS, DEFAULT_NODE_DATA } from '../constants';\nimport { generateId } from '../nodes/nodeUtils';\nimport { getAllSvgIcons, getSvgIcon, getSvgIconsByCategory, SVG_ICON_CATEGORIES, buildSvgMarkup, type SvgIconCategory } from '../nodes/svgIcons';\nimport { BORDER_SIDE_NAMES, BORDER_SIDE_TYPES, hasBorderSideOverrides, type BorderSideName } from '../nodes/shapes';\nimport { FLOW_NODE_TYPES, type FlowNode, type FlowEdge, type FlowLine, type FlowShapeType, type FlowBorderSideOverride, type FlowAIConfig } from '../types';\nimport { THEME_SYNC_TOKEN, COMMON_COLORS, isThemeToken, themeTokenCssVar, resolveThemeColor, type ThemeColorFieldKind } from '../utils/themeColor';\nimport { DataInspectorSection } from './DataInspectorSection';\nimport { ExpandableTextarea } from './ExpandableTextarea';\nimport {\n ARCHIFY_COMPONENT_ORDER,\n ARCHIFY_COMPONENT_LABELS,\n COMPONENT_STYLES,\n archifyStylePatch,\n} from '../archify';\n\n/**\n * Standalone panel (legacy). Prefer using InspectorPanelContent inside a FlowPanelGroup.\n */\nexport default function InspectorPanel() {\n const { showInspector } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('left', 240);\n\n if (!showInspector) return null;\n\n return (\n <div className=\"flow-inspector\" data-flow-panel style={{ ...panelStyle, width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--left\" {...resizeHandleProps} />\n <div\n className=\"flow-panel-drag-handle\"\n {...handleProps}\n style={{ fontSize: 11, fontWeight: 600, marginBottom: 8, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em', cursor: 'grab' }}\n >\n Inspector\n </div>\n <div className=\"flow-inspector-content\">\n <InspectorPanelContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function InspectorPanelContent() {\n const { currentCanvas, selection, setSelection, setDoc, currentCanvasId } = useFlowContext();\n const { aiConfig, hasSharedConfig } = useFlowAI();\n\n const selectedNodes = useMemo(\n () => currentCanvas.nodes.filter(n => selection.nodeIds.has(n.id)),\n [currentCanvas.nodes, selection.nodeIds],\n );\n const selectedEdges = useMemo(\n () => currentCanvas.edges.filter(e => selection.edgeIds.has(e.id)),\n [currentCanvas.edges, selection.edgeIds],\n );\n const selectedLines = useMemo(\n () => currentCanvas.lines.filter(l => selection.lineIds.has(l.id)),\n [currentCanvas.lines, selection.lineIds],\n );\n\n const hasSelection = selectedNodes.length > 0 || selectedEdges.length > 0 || selectedLines.length > 0;\n const singleIsGroup = selectedNodes.length === 1 && (selectedNodes[0].type === 'flowGroup' || selectedNodes[0].type === 'geometryGroup' || selectedNodes[0].data.isGroup);\n\n const totalSelected = selectedNodes.length + selectedLines.length;\n\n const handleGroup = (type: 'flowGroup' | 'geometryGroup' = 'flowGroup') => {\n if (totalSelected < 2) return;\n const PAD = 20;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const n of selectedNodes) {\n minX = Math.min(minX, n.position.x);\n minY = Math.min(minY, n.position.y);\n maxX = Math.max(maxX, n.position.x + n.width);\n maxY = Math.max(maxY, n.position.y + n.height);\n }\n for (const l of selectedLines) {\n for (const p of l.points) {\n minX = Math.min(minX, p.x); minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y);\n }\n }\n const isGeo = type === 'geometryGroup';\n const groupId = generateId('group');\n const groupNode: FlowNode = {\n id: groupId,\n type,\n position: { x: minX - PAD, y: minY - PAD },\n width: maxX - minX + PAD * 2,\n height: maxY - minY + PAD * 2,\n data: {\n ...DEFAULT_NODE_DATA,\n label: isGeo ? 'Geo Group' : 'Group',\n fill: isGeo ? '#fefce8' : '#f0f9ff',\n stroke: '#9ca3af', strokeWidth: 1.5,\n borderStyle: isGeo ? 'dashed' : 'dotted',\n isGroup: true,\n },\n };\n const nIds = selection.nodeIds;\n const lIds = selection.lineIds;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: isGeo\n ? [groupNode, ...canvas.nodes]\n : [groupNode, ...canvas.nodes.map(n => nIds.has(n.id) ? { ...n, parentId: groupId } : n)],\n lines: isGeo\n ? canvas.lines\n : canvas.lines.map(l => lIds.has(l.id) ? { ...l, parentId: groupId } : l),\n }},\n };\n });\n setSelection({ nodeIds: new Set([groupId]), edgeIds: new Set(), lineIds: new Set() });\n };\n\n const handleUngroup = () => {\n const groupIds = new Set<string>();\n const childNodeIds = new Set<string>();\n const childLineIds = new Set<string>();\n for (const n of selectedNodes) {\n if (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup) groupIds.add(n.id);\n }\n if (groupIds.size === 0) return;\n for (const n of currentCanvas.nodes) {\n if (n.parentId && groupIds.has(n.parentId)) childNodeIds.add(n.id);\n }\n for (const l of currentCanvas.lines) {\n if (l.parentId && groupIds.has(l.parentId)) childLineIds.add(l.id);\n }\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: { ...prev.canvases, [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes\n .filter(n => !groupIds.has(n.id))\n .map(n => childNodeIds.has(n.id) ? { ...n, parentId: undefined } : n),\n lines: canvas.lines\n .map(l => childLineIds.has(l.id) ? { ...l, parentId: undefined } : l),\n }},\n };\n });\n setSelection({ nodeIds: childNodeIds, edgeIds: new Set(), lineIds: childLineIds });\n };\n\n const changeNodeZIndex = (mode: 'front' | 'back' | 'up' | 'down') => {\n const ids = selection.nodeIds;\n if (ids.size === 0) return;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const allZ = canvas.nodes.map(n => n.zIndex ?? 0);\n const maxZ = allZ.length > 0 ? Math.max(...allZ) : 0;\n const minZ = allZ.length > 0 ? Math.min(...allZ) : 0;\n const nodes = canvas.nodes.map(n => {\n if (!ids.has(n.id)) return n;\n const z = n.zIndex ?? 0;\n let newZ = z;\n if (mode === 'front') newZ = maxZ + 1;\n else if (mode === 'back') newZ = minZ - 1;\n else if (mode === 'up') newZ = z + 1;\n else if (mode === 'down') newZ = z - 1;\n return { ...n, zIndex: newZ };\n });\n return { ...prev, canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, nodes } } };\n });\n };\n\n const changeLineZIndex = (mode: 'front' | 'back' | 'up' | 'down') => {\n const ids = selection.lineIds;\n if (ids.size === 0) return;\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n const allZ = canvas.lines.map(l => l.zIndex ?? 0);\n const maxZ = allZ.length > 0 ? Math.max(...allZ) : 0;\n const minZ = allZ.length > 0 ? Math.min(...allZ) : 0;\n const lines = canvas.lines.map(l => {\n if (!ids.has(l.id)) return l;\n const z = l.zIndex ?? 0;\n let newZ = z;\n if (mode === 'front') newZ = maxZ + 1;\n else if (mode === 'back') newZ = minZ - 1;\n else if (mode === 'up') newZ = z + 1;\n else if (mode === 'down') newZ = z - 1;\n return { ...l, zIndex: newZ };\n });\n return { ...prev, canvases: { ...prev.canvases, [currentCanvasId]: { ...canvas, lines } } };\n });\n };\n\n const updateNodeData = (nodeId: string, key: string, value: any) => {\n updateNodeDataBatch(nodeId, { [key]: value });\n };\n\n const updateNodeDataBatch = (nodeId: string, values: Record<string, any>) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(n =>\n n.id === nodeId ? { ...n, data: { ...n.data, ...values } } : n,\n ),\n },\n },\n };\n });\n };\n\n const updateNodeDimension = (nodeId: string, key: 'width' | 'height', value: number) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(n =>\n n.id === nodeId ? { ...n, [key]: value } : n,\n ),\n },\n },\n };\n });\n };\n\n const updateEdgeData = (edgeId: string, key: string, value: any) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n edges: canvas.edges.map(e =>\n e.id === edgeId ? { ...e, data: { ...e.data, [key]: value } } : e,\n ),\n },\n },\n };\n });\n };\n\n const updateNodeType = (nodeId: string, type: FlowShapeType) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n nodes: canvas.nodes.map(node => node.id === nodeId ? { ...node, type } : node),\n },\n },\n };\n });\n };\n\n const updateEdgeType = (edgeId: string, type: string) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n edges: canvas.edges.map(e =>\n e.id === edgeId ? { ...e, type: type as any } : e,\n ),\n },\n },\n };\n });\n };\n\n const updateLineData = (lineId: string, key: string, value: any) => {\n setDoc(prev => {\n const canvas = prev.canvases[currentCanvasId];\n if (!canvas) return prev;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [currentCanvasId]: {\n ...canvas,\n lines: canvas.lines.map(l =>\n l.id === lineId ? { ...l, [key]: value } : l,\n ),\n },\n },\n };\n });\n };\n\n return (\n <>\n {!hasSelection && (\n <div style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 40%, transparent)', textAlign: 'center', padding: '20px 0' }}>\n Select an element to inspect\n </div>\n )}\n\n {selectedNodes.length === 1 && (\n <NodeInspector\n node={selectedNodes[0]}\n isGroup={singleIsGroup}\n onUpdateData={updateNodeData}\n onUpdateDataBatch={updateNodeDataBatch}\n onUpdateDimension={updateNodeDimension}\n onUpdateType={updateNodeType}\n globalAIConfig={aiConfig}\n useSharedAIConfig={hasSharedConfig}\n />\n )}\n {totalSelected > 1 && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Selection</div>\n <div style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', marginBottom: 8 }}>\n {selectedNodes.length > 0 && `${selectedNodes.length} node${selectedNodes.length > 1 ? 's' : ''}`}\n {selectedNodes.length > 0 && selectedLines.length > 0 && ', '}\n {selectedLines.length > 0 && `${selectedLines.length} line${selectedLines.length > 1 ? 's' : ''}`}\n {' selected'}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, width: '100%' }}>\n <Button size=\"xs\" onClick={() => handleGroup('flowGroup')} block>\n Group (⌘G)\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => handleGroup('geometryGroup')} block>\n Geo Group (⌘⌥G)\n </Button>\n </div>\n </div>\n )}\n {singleIsGroup && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">\n {selectedNodes[0].type === 'geometryGroup' ? 'Geometry Group' : 'Group'}\n </div>\n <div style={{ fontSize: 11, color: 'color-mix(in oklch, var(--color-base-content) 45%, transparent)', marginBottom: 6 }}>\n {selectedNodes[0].type === 'geometryGroup'\n ? 'Auto-binds spatially contained nodes'\n : 'Explicit membership via add/remove'}\n </div>\n <Button size=\"xs\" variant=\"ghost\" onClick={handleUngroup} block>\n Ungroup (⌘⇧G)\n </Button>\n </div>\n )}\n\n {selectedNodes.length > 0 && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Layer</div>\n <div style={{ display: 'flex', gap: 4 }}>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('front')}>\n <span title=\"Bring to Front (⌘⇧↑)\">⤒</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('up')}>\n <span title=\"Bring Forward (⌘↑)\">↑</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('down')}>\n <span title=\"Send Backward (⌘↓)\">↓</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeNodeZIndex('back')}>\n <span title=\"Send to Back (⌘⇧↓)\">⤓</span>\n </Button>\n </div>\n </div>\n )}\n\n {selectedEdges.length === 1 && (\n <EdgeInspector\n edge={selectedEdges[0]}\n onUpdateData={updateEdgeData}\n onUpdateType={updateEdgeType}\n />\n )}\n\n {selectedLines.length === 1 && (\n <>\n <LineInspector\n line={selectedLines[0]}\n onUpdateData={updateLineData}\n />\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Layer</div>\n <div style={{ display: 'flex', gap: 4 }}>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('front')}>\n <span title=\"Bring to Front\">⤒</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('up')}>\n <span title=\"Bring Forward\">↑</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('down')}>\n <span title=\"Send Backward\">↓</span>\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => changeLineZIndex('back')}>\n <span title=\"Send to Back\">⤓</span>\n </Button>\n </div>\n </div>\n </>\n )}\n </>\n );\n}\n\n/**\n * A color field for Flow node/edge styling. Layout (left → right):\n * 1. Theme-sync swatch — follows the active theme (per-field role), the\n * default choice for new shapes.\n * 2. Common colors — 黑白赤橙黄绿青蓝紫粉.\n * 3. Custom picker — arbitrary color from the OS color dialog.\n * (Optional) Transparent — for fill/stroke.\n * Every swatch shows a descriptive tooltip on hover.\n */\nfunction ThemeColorField({\n value,\n onChange,\n kind,\n allowTransparent,\n customFallback = '#ffffff',\n}: {\n value: string | undefined;\n onChange: (value: string) => void;\n kind: ThemeColorFieldKind;\n allowTransparent?: boolean;\n customFallback?: string;\n}) {\n const syncToken = THEME_SYNC_TOKEN[kind];\n const syncCssVar = themeTokenCssVar(syncToken) ?? 'var(--color-base-content)';\n\n const rawValue = value ?? '';\n const lowerValue = rawValue.toLowerCase();\n const valueIsToken = isThemeToken(rawValue);\n const isTransparent = rawValue === 'transparent';\n const isCommon = COMMON_COLORS.some((c) => c.value.toLowerCase() === lowerValue);\n const isSync = rawValue === syncToken;\n const isCustom = !!rawValue && !valueIsToken && !isTransparent && !isCommon;\n const pickerValue = isCustom ? rawValue : customFallback;\n\n return (\n <div className=\"flow-color-field\">\n {/* 1. 主题同步色 */}\n <button\n type=\"button\"\n title=\"跟随主题切换\"\n aria-label=\"跟随主题切换\"\n className={`flow-color-swatch flow-color-swatch--sync${isSync ? ' is-active' : ''}`}\n style={{ background: syncCssVar }}\n onClick={() => onChange(syncToken)}\n />\n\n <span className=\"flow-color-divider\" />\n\n {/* 2. 常用颜色 */}\n {COMMON_COLORS.map((c) => (\n <button\n key={c.value}\n type=\"button\"\n title={c.label}\n aria-label={c.label}\n className={`flow-color-swatch${!valueIsToken && !isTransparent && lowerValue === c.value.toLowerCase() ? ' is-active' : ''}`}\n style={{ background: c.value }}\n onClick={() => onChange(c.value)}\n />\n ))}\n\n <span className=\"flow-color-divider\" />\n\n {/* 3. 自定义取色 */}\n <label\n className={`flow-color-swatch flow-color-swatch--custom${isCustom ? ' is-active' : ''}`}\n title=\"自定义颜色\"\n style={isCustom ? { background: rawValue } : undefined}\n >\n <input\n type=\"color\"\n value={pickerValue}\n onChange={(e) => onChange(e.target.value)}\n />\n </label>\n\n {/* 可选:透明 */}\n {allowTransparent && (\n <button\n type=\"button\"\n title=\"透明\"\n aria-label=\"透明\"\n className={`flow-color-swatch flow-color-swatch--transparent${isTransparent ? ' is-active' : ''}`}\n onClick={() => onChange('transparent')}\n />\n )}\n </div>\n );\n}\n\n/** Data-URL preview of a registry icon for picker thumbnails. */\nfunction titleIconThumbUrl(id: string): string {\n const def = getSvgIcon(id);\n const brand = resolveThemeColor(def?.brandColor, '') || '#475569';\n const markup = buildSvgMarkup(id, brand);\n return markup ? `data:image/svg+xml;utf8,${encodeURIComponent(markup)}` : '';\n}\n\n/** Configure the optional glyph rendered beside a shape node's title text:\n * pick from the built-in registry, then side / size / color. */\nfunction TitleIconSection({\n node,\n onUpdateData,\n}: {\n node: FlowNode;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n const [cat, setCat] = useState<SvgIconCategory>('lang');\n const icons = useMemo(() => getSvgIconsByCategory(cat), [cat]);\n const current = node.data.titleIcon ?? '';\n const side = node.data.titleIconSide ?? 'left';\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Title Icon</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Icon</Label>\n <div style={{ display: 'flex', gap: 4, alignItems: 'center', flex: 1, minWidth: 0 }}>\n <Select\n options={SVG_ICON_CATEGORIES.map(c => ({ value: c.id, label: c.label }))}\n value={cat}\n onChange={(v) => setCat(v as SvgIconCategory)}\n style={{ fontSize: 12, flex: 1, minWidth: 0 }}\n />\n <Button\n size=\"xs\"\n variant={current ? 'ghost' : 'primary'}\n square\n onClick={() => onUpdateData(node.id, 'titleIcon', undefined)}\n >\n <span title=\"移除标题图标\">✕</span>\n </Button>\n </div>\n </div>\n {current && !icons.some(ic => ic.id === current) && (\n <div style={{ fontSize: 10, opacity: 0.55, marginBottom: 4 }}>\n 当前图标在其他分类\n </div>\n )}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(22px, 1fr))',\n gap: 3,\n maxHeight: 92,\n overflowY: 'auto',\n padding: 3,\n border: '1px solid color-mix(in oklch, var(--color-base-content) 14%, transparent)',\n borderRadius: 6,\n marginBottom: 6,\n }}\n >\n {icons.map((ic) => {\n const url = titleIconThumbUrl(ic.id);\n const active = current === ic.id;\n return (\n <button\n key={ic.id}\n type=\"button\"\n title={ic.label}\n aria-label={ic.label}\n onClick={() => onUpdateData(node.id, 'titleIcon', ic.id)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 22,\n height: 22,\n borderRadius: 4,\n cursor: 'pointer',\n padding: 0,\n border: active ? '1.5px solid var(--color-primary)' : '1px solid transparent',\n background: active ? 'color-mix(in oklch, var(--color-primary) 12%, transparent)' : 'transparent',\n }}\n >\n {url && <img src={url} width={16} height={16} alt=\"\" style={{ objectFit: 'contain' }} />}\n </button>\n );\n })}\n </div>\n {current && (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Side</Label>\n <Select\n options={[\n { value: 'left', label: 'left' },\n { value: 'right', label: 'right' },\n ]}\n value={side}\n onChange={(v) => onUpdateData(node.id, 'titleIconSide', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Size</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.titleIconSize ?? Math.max(8, Math.round(node.data.fontSize * 1.15)))}\n onChange={(e) => onUpdateData(node.id, 'titleIconSize', Math.max(8, Number(e.target.value) || 8))}\n />\n <span className=\"flow-inspector-suffix\" style={{ fontSize: 10, opacity: 0.5 }}>px</span>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <ThemeColorField\n value={node.data.titleIconColor\n ?? getSvgIcon(current)?.brandColor\n ?? node.data.labelColor\n ?? node.data.color}\n kind=\"stroke\"\n customFallback=\"#334155\"\n onChange={(v) => onUpdateData(node.id, 'titleIconColor', v)}\n />\n </div>\n </>\n )}\n </div>\n );\n}\n\nfunction NodeInspector({\n node,\n isGroup,\n onUpdateData,\n onUpdateDataBatch,\n onUpdateDimension,\n onUpdateType,\n globalAIConfig,\n useSharedAIConfig,\n}: {\n node: FlowNode;\n isGroup?: boolean;\n onUpdateData: (id: string, key: string, value: any) => void;\n onUpdateDataBatch: (id: string, values: Record<string, any>) => void;\n onUpdateDimension: (id: string, key: 'width' | 'height', value: number) => void;\n onUpdateType: (id: string, type: FlowShapeType) => void;\n globalAIConfig: FlowAIConfig;\n useSharedAIConfig: boolean;\n}) {\n return (\n <>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Node</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Input\n size=\"xs\"\n value={node.data.label}\n onChange={(e) => onUpdateData(node.id, 'label', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <Select\n options={FLOW_NODE_TYPES.map(type => ({ value: type, label: type }))}\n value={node.type}\n onChange={(value) => onUpdateType(node.id, value as FlowShapeType)}\n style={{ fontSize: 12 }}\n />\n </div>\n </div>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Size</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">W</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(Math.round(node.width * 100) / 100)}\n onChange={(e) => onUpdateDimension(node.id, 'width', Number(e.target.value) || node.width)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">H</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(Math.round(node.height * 100) / 100)}\n onChange={(e) => onUpdateDimension(node.id, 'height', Number(e.target.value) || node.height)}\n />\n </div>\n </div>\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Style</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Fill</Label>\n <ThemeColorField\n value={node.data.fill}\n kind=\"fill\"\n allowTransparent\n customFallback=\"#ffffff\"\n onChange={(v) => onUpdateData(node.id, 'fill', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Stroke</Label>\n <ThemeColorField\n value={node.data.stroke}\n kind=\"stroke\"\n allowTransparent\n customFallback=\"#000000\"\n onChange={(v) => onUpdateData(node.id, 'stroke', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Font</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.fontSize)}\n onChange={(e) => onUpdateData(node.id, 'fontSize', Number(e.target.value) || 14)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <ThemeColorField\n value={node.data.color}\n kind=\"text\"\n customFallback=\"#111827\"\n onChange={(v) => onUpdateData(node.id, 'color', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Font Color</Label>\n <ThemeColorField\n value={node.data.labelColor ?? node.data.color}\n kind=\"text\"\n customFallback=\"#111827\"\n onChange={(v) => onUpdateData(node.id, 'labelColor', v)}\n />\n </div>\n {node.type !== 'shapeSvg' && node.type !== 'mediaNode' && (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Text Pos</Label>\n <Select\n options={[\n { value: 'center', label: 'center' },\n { value: 'top', label: 'top' },\n { value: 'bottom', label: 'bottom' },\n { value: 'left', label: 'left' },\n { value: 'right', label: 'right' },\n { value: 'top-left', label: 'top-left' },\n { value: 'top-right', label: 'top-right' },\n { value: 'bottom-left', label: 'bottom-left' },\n { value: 'bottom-right', label: 'bottom-right' },\n ]}\n value={node.data.textPlacement ?? ((isGroup || node.type === 'animAnchor') ? 'top' : 'center')}\n onChange={(v) => onUpdateData(node.id, 'textPlacement', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Text Off X</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetX ?? 0)}\n onChange={(e) => onUpdateData(node.id, 'labelOffsetX', Number(e.target.value) || 0)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Text Off Y</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetY ?? 0)}\n onChange={(e) => onUpdateData(node.id, 'labelOffsetY', Number(e.target.value) || 0)}\n />\n </div>\n </>\n )}\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Border</Label>\n <Select\n options={[{ value: 'none', label: 'none' }, ...BORDER_STYLE_OPTIONS.map(s => ({ value: s, label: s }))]}\n value={node.data.borderStyle ?? (isGroup ? (node.type === 'geometryGroup' ? 'dashed' : 'dotted') : 'solid')}\n onChange={(v) => onUpdateData(node.id, 'borderStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n {BORDER_SIDE_TYPES.has(node.type) && (() => {\n const sides = node.data.borderSides ?? {};\n const updateSide = (name: BorderSideName, patch: Partial<FlowBorderSideOverride>) => {\n onUpdateData(node.id, 'borderSides', {\n ...node.data.borderSides,\n [name]: { ...node.data.borderSides?.[name], ...patch },\n });\n };\n const sideLabels: Record<BorderSideName, string> = { top: 'Top', right: 'Right', bottom: 'Bottom', left: 'Left' };\n return (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Sides</Label>\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, flex: 1 }}>\n <span style={{ fontSize: 10, opacity: 0.55 }}>上下左右独立边框</span>\n {hasBorderSideOverrides(node.data, node.type) && (\n <span title=\"恢复与 Border 设置一致\" style={{ display: 'inline-flex' }}>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={() => onUpdateData(node.id, 'borderSides', undefined)}\n >\n 重置\n </Button>\n </span>\n )}\n </div>\n </div>\n {BORDER_SIDE_NAMES.map((name) => {\n const override = sides[name];\n return (\n <div key={name} style={{ display: 'flex', alignItems: 'center', gap: 4, marginBottom: 4 }}>\n <span\n title={`独立设置${sideLabels[name]}边`}\n style={{ fontSize: 10, width: 40, flexShrink: 0, opacity: override ? 0.95 : 0.6 }}\n >\n {sideLabels[name]}\n </span>\n <span title={`显示/隐藏 ${sideLabels[name]} 边`} style={{ display: 'inline-flex' }}>\n <Checkbox\n size=\"sm\"\n checked={override?.visible ?? true}\n onChange={(v) => updateSide(name, { visible: v })}\n />\n </span>\n <ThemeColorField\n value={override?.color ?? node.data.stroke}\n kind=\"stroke\"\n customFallback=\"#334155\"\n onChange={(v) => updateSide(name, { color: v })}\n />\n <span title={`${sideLabels[name]} 粗细`} style={{ display: 'inline-flex', width: 52 }}>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(override?.width ?? node.data.strokeWidth)}\n onChange={(e) => updateSide(name, { width: Math.max(0, Number(e.target.value) || 0) })}\n />\n </span>\n </div>\n );\n })}\n </>\n );\n })()}\n {node.type === 'shapeSvg' && (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Icon</Label>\n <Select\n options={getAllSvgIcons().map(icon => ({ value: icon.id, label: icon.label }))}\n value={node.data.svgId ?? ''}\n placeholder=\"选择图标\"\n onChange={(value) => {\n const icon = getSvgIcon(String(value));\n onUpdateDataBatch(node.id, {\n svgId: value,\n ...(icon?.brandColor ? { color: icon.brandColor } : {}),\n ...(!node.data.label || node.data.label === 'Text' ? { label: icon?.label ?? String(value) } : {}),\n });\n }}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Box</Label>\n <Checkbox\n size=\"sm\"\n checked={node.data.iconBox ?? false}\n onChange={(v) => onUpdateData(node.id, 'iconBox', v)}\n label=\"显示边框\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Select\n options={[\n { value: 'top', label: 'top' },\n { value: 'middle', label: 'middle' },\n { value: 'bottom', label: 'bottom' },\n { value: 'left', label: 'left' },\n { value: 'right', label: 'right' },\n ]}\n value={node.data.labelPlacement === ('above' as any)\n ? 'top'\n : node.data.labelPlacement === ('center' as any)\n ? 'middle'\n : node.data.labelPlacement === ('below' as any)\n ? 'bottom'\n : (node.data.labelPlacement ?? 'bottom')}\n onChange={(v) => onUpdateData(node.id, 'labelPlacement', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Offset X</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetX ?? 0)}\n onChange={(event) => onUpdateData(node.id, 'labelOffsetX', Number(event.target.value) || 0)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Offset Y</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.labelOffsetY ?? 0)}\n onChange={(event) => onUpdateData(node.id, 'labelOffsetY', Number(event.target.value) || 0)}\n />\n </div>\n </>\n )}\n\n </div>\n {node.type === 'mediaNode' && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Palette (Archify)</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Palette</Label>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {ARCHIFY_COMPONENT_ORDER.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n title={ARCHIFY_COMPONENT_LABELS[kind]}\n aria-label={ARCHIFY_COMPONENT_LABELS[kind]}\n onClick={() => onUpdateDataBatch(node.id, archifyStylePatch(kind))}\n style={{\n width: 18,\n height: 18,\n borderRadius: 4,\n cursor: 'pointer',\n background: COMPONENT_STYLES[kind].fill,\n border: `1.5px solid ${COMPONENT_STYLES[kind].stroke}`,\n }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n {node.type !== 'mediaNode' && node.type !== 'shapeSvg' && (\n <TitleIconSection node={node} onUpdateData={onUpdateData} />\n )}\n {node.type !== 'mediaNode' && (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Card (Archify)</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Subtitle</Label>\n <Input\n size=\"xs\"\n value={node.data.sublabel ?? ''}\n placeholder=\"secondary line\"\n onChange={(e) => onUpdateData(node.id, 'sublabel', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Sub Color</Label>\n <ThemeColorField\n value={node.data.sublabelColor ?? '#94a3b8'}\n kind=\"text\"\n customFallback=\"#94a3b8\"\n onChange={(v) => onUpdateData(node.id, 'sublabelColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Tag</Label>\n <Input\n size=\"xs\"\n value={node.data.tag ?? ''}\n placeholder=\"corner pill\"\n onChange={(e) => onUpdateData(node.id, 'tag', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Tag Color</Label>\n <ThemeColorField\n value={node.data.tagColor ?? node.data.stroke}\n kind=\"stroke\"\n customFallback=\"#334155\"\n onChange={(v) => onUpdateData(node.id, 'tagColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Tag Pos</Label>\n <Select\n options={[\n { value: 'top-left', label: 'top-left' },\n { value: 'top-right', label: 'top-right' },\n { value: 'bottom-left', label: 'bottom-left' },\n { value: 'bottom-right', label: 'bottom-right' },\n ]}\n value={node.data.tagPlacement ?? 'top-right'}\n onChange={(v) => onUpdateData(node.id, 'tagPlacement', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Palette</Label>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {ARCHIFY_COMPONENT_ORDER.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n title={ARCHIFY_COMPONENT_LABELS[kind]}\n aria-label={ARCHIFY_COMPONENT_LABELS[kind]}\n onClick={() => onUpdateDataBatch(node.id, archifyStylePatch(kind))}\n style={{\n width: 18,\n height: 18,\n borderRadius: 4,\n cursor: 'pointer',\n background: COMPONENT_STYLES[kind].fill,\n border: `1.5px solid ${COMPONENT_STYLES[kind].stroke}`,\n }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n {node.type === 'mediaNode' && (\n <MediaInspectorSection node={node} onUpdateData={onUpdateData} globalAIConfig={globalAIConfig} useSharedAIConfig={useSharedAIConfig} />\n )}\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Transform</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Rotate</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(node.data.rotation ?? 0)}\n onChange={(e) => onUpdateData(node.id, 'rotation', Number(e.target.value) || 0)}\n />\n <span className=\"flow-inspector-suffix\" style={{ fontSize: 10, opacity: 0.5 }}>°</span>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Flip</Label>\n <Button\n size=\"xs\"\n variant={node.data.flipX ? 'primary' : 'ghost'}\n onClick={() => onUpdateData(node.id, 'flipX', !node.data.flipX)}\n square\n >\n <span title=\"Flip Horizontal\">↔</span>\n </Button>\n <Button\n size=\"xs\"\n variant={node.data.flipY ? 'primary' : 'ghost'}\n onClick={() => onUpdateData(node.id, 'flipY', !node.data.flipY)}\n square\n >\n <span title=\"Flip Vertical\">↕</span>\n </Button>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Quick</Label>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => onUpdateData(node.id, 'rotation', ((node.data.rotation ?? 0) + 90) % 360)}>\n +90°\n </Button>\n <Button size=\"xs\" variant=\"ghost\" onClick={() => onUpdateData(node.id, 'rotation', ((node.data.rotation ?? 0) - 90 + 360) % 360)}>\n −90°\n </Button>\n </div>\n </div>\n </>\n );\n}\n\nfunction MediaInspectorSection({\n node,\n onUpdateData,\n globalAIConfig,\n useSharedAIConfig,\n}: {\n node: FlowNode;\n onUpdateData: (id: string, key: string, value: any) => void;\n globalAIConfig: FlowAIConfig;\n useSharedAIConfig: boolean;\n}) {\n const kind = node.data.mediaKind ?? 'markdown';\n const ai = useSharedAIConfig ? globalAIConfig : node.data.aiConfig;\n const modelFileInputRef = useRef<HTMLInputElement>(null);\n\n const updateAI = (key: string, value: any) => {\n onUpdateData(node.id, 'aiConfig', {\n gateway: '', protocol: 'openai', model: '',\n ...ai,\n [key]: value,\n });\n };\n\n const contentLabels: Record<string, string> = {\n markdown: 'Markdown 源码',\n html: 'HTML 源码',\n mermaid: 'Mermaid 图表',\n math: 'LaTeX 公式',\n };\n\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Media · {kind}</div>\n {kind === 'data' ? (\n <DataInspectorSection node={node} onUpdateData={onUpdateData} />\n ) : kind === 'model3d' ? (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">格式</Label>\n <Select\n options={[\n { value: 'stl', label: 'STL' },\n { value: 'obj', label: 'OBJ' },\n { value: '3mf', label: '3MF' },\n ]}\n value={node.data.modelFormat ?? 'stl'}\n onChange={value => onUpdateData(node.id, 'modelFormat', value)}\n />\n </div>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <Label size=\"xs\" className=\"flow-inspector-label\">模型链接</Label>\n <Input\n size=\"xs\"\n value={node.data.mediaContent ?? ''}\n placeholder=\"https://example.com/model.stl\"\n onChange={event => onUpdateData(node.id, 'mediaContent', event.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">本地模型</Label>\n <input\n ref={modelFileInputRef}\n type=\"file\"\n accept=\".stl,.obj,.3mf,model/stl,model/obj,model/3mf,application/vnd.ms-package.3dmanufacturing-3dmodel+xml\"\n hidden\n onChange={event => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (!file) return;\n if (file.size > 10 * 1024 * 1024) {\n window.alert('本地模型不能超过 10 MiB,请改用模型链接。');\n return;\n }\n const extension = file.name.split('.').pop()?.toLowerCase();\n if (extension !== 'stl' && extension !== 'obj' && extension !== '3mf') {\n window.alert('仅支持 STL、OBJ 和 3MF 模型。');\n return;\n }\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result !== 'string') return;\n onUpdateData(node.id, 'modelFormat', extension);\n onUpdateData(node.id, 'mediaContent', reader.result);\n };\n reader.onerror = () => window.alert('读取本地模型失败。');\n reader.readAsDataURL(file);\n }}\n />\n <Button size=\"xs\" variant=\"neutral\" onClick={() => modelFileInputRef.current?.click()}>\n 选择文件\n </Button>\n {node.data.mediaContent?.startsWith('data:') && (\n <span className=\"flow-inspector-file-status\">已嵌入</span>\n )}\n </div>\n <div className=\"flow-inspector-help\">支持 STL、OBJ、3MF;本地文件将以 Base64 嵌入文档,最大 10 MiB。选中节点后可在内部拖拽旋转、滚轮缩放。</div>\n </>\n ) : kind === 'image' ? (\n <>\n <div className=\"flow-inspector-row flow-inspector-multiline\">\n <Label size=\"xs\" className=\"flow-inspector-label\">图片链接</Label>\n <Input\n size=\"xs\"\n value={node.data.mediaContent ?? ''}\n placeholder=\"https://example.com/image.png\"\n onChange={(event) => onUpdateData(node.id, 'mediaContent', event.target.value)}\n />\n </div>\n <div className=\"flow-inspector-help\">支持 HTTP(S) 链接;选中图片节点后可直接粘贴图片并保存为 Base64。</div>\n </>\n ) : kind !== 'ai' ? (\n <ExpandableTextarea\n label={contentLabels[kind] ?? '内容'}\n value={node.data.mediaContent ?? ''}\n onChange={(value) => onUpdateData(node.id, 'mediaContent', value)}\n rows={8}\n />\n ) : useSharedAIConfig ? (\n <div className=\"flow-inspector-help\">\n 此节点自动使用统一 AI 配置{globalAIConfig.model ? `(${globalAIConfig.model})` : ''},请通过 Flow 顶部的 AI 配置入口修改。\n </div>\n ) : (\n <>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">协议</Label>\n <Select\n options={[\n { value: 'openai', label: 'OpenAI 兼容' },\n { value: 'anthropic', label: 'Anthropic 兼容' },\n ]}\n value={ai?.protocol ?? 'openai'}\n onChange={(v) => updateAI('protocol', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">接口地址</Label>\n <Input\n size=\"xs\"\n value={ai?.gateway ?? ''}\n placeholder=\"https://api.openai.com/v1/chat/completions\"\n onChange={(e) => updateAI('gateway', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">模型</Label>\n <Input\n size=\"xs\"\n value={ai?.model ?? ''}\n placeholder=\"gpt-4o-mini\"\n onChange={(e) => updateAI('model', e.target.value)}\n />\n </div>\n <div className=\"flow-inspector-row\" style={{ flexDirection: 'column', alignItems: 'stretch', gap: 4 }}>\n <Label size=\"xs\" className=\"flow-inspector-label\">API Key</Label>\n <Input\n size=\"xs\"\n type=\"password\"\n value={ai?.apiKey ?? ''}\n placeholder=\"sk-...\"\n onChange={(e) => updateAI('apiKey', e.target.value)}\n />\n </div>\n <ExpandableTextarea\n label=\"System Prompt\"\n value={ai?.systemPrompt ?? ''}\n onChange={(value) => updateAI('systemPrompt', value)}\n rows={3}\n />\n <div style={{ fontSize: 10, color: 'color-mix(in oklch, var(--color-base-content) 45%, transparent)', marginTop: 4 }}>\n 密钥会随文档 JSON 一同导出,请谨慎分享。\n </div>\n </>\n )}\n </div>\n );\n}\n\nfunction EdgeInspector({\n edge,\n onUpdateData,\n onUpdateType,\n}: {\n edge: FlowEdge;\n onUpdateData: (id: string, key: string, value: any) => void;\n onUpdateType: (id: string, type: string) => void;\n}) {\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Edge</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <Select\n options={EDGE_TYPE_OPTIONS.map(t => ({ value: t, label: t }))}\n value={edge.type}\n onChange={(v) => onUpdateType(edge.id, v as string)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <ThemeColorField\n value={edge.data.strokeColor}\n kind=\"line\"\n customFallback=\"#374151\"\n onChange={(v) => onUpdateData(edge.id, 'strokeColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Width</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(edge.data.strokeWidth ?? 2)}\n onChange={(e) => onUpdateData(edge.id, 'strokeWidth', Number(e.target.value) || 2)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Animation</Label>\n <Checkbox\n size=\"sm\"\n checked={edge.data.animated ?? false}\n onChange={(value) => onUpdateData(edge.id, 'animated', value)}\n label=\"预览时播放\"\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Line</Label>\n <Select\n options={EDGE_LINE_STYLE_OPTIONS.map(s => ({ value: s, label: s }))}\n value={edge.data.lineStyle ?? 'solid'}\n onChange={(v) => onUpdateData(edge.id, 'lineStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Start</Label>\n <Select\n options={EDGE_MARKER_OPTIONS.map(m => ({ value: m, label: m }))}\n value={edge.data.markerStart ?? 'none'}\n onChange={(v) => onUpdateData(edge.id, 'markerStart', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">End</Label>\n <Select\n options={EDGE_MARKER_OPTIONS.map(m => ({ value: m, label: m }))}\n value={edge.data.markerEnd ?? 'none'}\n onChange={(v) => onUpdateData(edge.id, 'markerEnd', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Label</Label>\n <Input\n size=\"xs\"\n value={edge.data.labelText ?? ''}\n onChange={(e) => onUpdateData(edge.id, 'labelText', e.target.value)}\n placeholder=\"Edge label\"\n />\n </div>\n </div>\n );\n}\n\nfunction LineInspector({\n line,\n onUpdateData,\n}: {\n line: FlowLine;\n onUpdateData: (id: string, key: string, value: any) => void;\n}) {\n return (\n <div className=\"flow-inspector-section\">\n <div className=\"flow-inspector-section-title\">Line</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Type</Label>\n <span style={{ fontSize: 12, color: 'color-mix(in oklch, var(--color-base-content) 60%, transparent)' }}>{line.type}</span>\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Color</Label>\n <ThemeColorField\n value={line.strokeColor}\n kind=\"line\"\n customFallback=\"#374151\"\n onChange={(v) => onUpdateData(line.id, 'strokeColor', v)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Width</Label>\n <Input\n size=\"xs\"\n type=\"number\"\n value={String(line.strokeWidth)}\n onChange={(e) => onUpdateData(line.id, 'strokeWidth', Number(e.target.value) || 2)}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">Style</Label>\n <Select\n options={EDGE_LINE_STYLE_OPTIONS.map(s => ({ value: s, label: s }))}\n value={line.lineStyle}\n onChange={(v) => onUpdateData(line.id, 'lineStyle', v)}\n style={{ fontSize: 12 }}\n />\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAwBO,IAAiB;CACvC,IAAM,EAAE,qBAAkBC,EAAU,GAC9B,EAAE,eAAY,mBAAgBC,EAAkB,GAChD,EAAE,eAAY,yBAAsBC,EAAkB,QAAQ,GAAG;CAIvE,OAFKC,IAGH,kBAAC,OAAD;EAAK,WAAU;EAAiB,mBAAA;EAAgB,OAAO;GAAE,GAAGC;GAAY,OAAOC;EAAW;EAA1F,UAAA;GACE,kBAAC,OAAD;IAAK,WAAU;IAA0D,GAAIC;GAAoB,CAAA;GACjG,kBAAC,OAAD;IACE,WAAU;IACV,GAAIC;IACJ,OAAO;KAAE,UAAU;KAAI,YAAY;KAAK,cAAc;KAAG,OAAO;KAAmE,eAAe;KAAa,eAAe;KAAU,QAAQ;IAAO;IACxM,UAAA;GAEI,CAAA;GACL,kBAAC,OAAD;IAAK,WAAU;IACb,UAAA,kBAACC,GAAD,CAAwB,CAAA;GACrB,CAAA;EACF;MAfoB;AAiB7B;AAGA,SAAgBA,IAAwB;CACtC,IAAM,EAAE,kBAAe,cAAW,iBAAc,WAAQ,uBAAoBC,EAAe,GACrF,EAAE,aAAU,uBAAoBC,EAAU,GAE1CC,IAAgBC,QACdC,EAAc,MAAM,QAAO,MAAKC,EAAU,QAAQ,IAAIC,EAAE,EAAE,CAAC,GACjE,CAACF,EAAc,OAAOC,EAAU,OAAO,CACzC,GACME,IAAgBJ,QACdC,EAAc,MAAM,QAAO,MAAKC,EAAU,QAAQ,IAAI,EAAE,EAAE,CAAC,GACjE,CAACD,EAAc,OAAOC,EAAU,OAAO,CACzC,GACMG,IAAgBL,QACdC,EAAc,MAAM,QAAO,MAAKC,EAAU,QAAQ,IAAII,EAAE,EAAE,CAAC,GACjE,CAACL,EAAc,OAAOC,EAAU,OAAO,CACzC,GAEMK,IAAeR,EAAc,SAAS,KAAKK,EAAc,SAAS,KAAKC,EAAc,SAAS,GAC9FG,IAAgBT,EAAc,WAAW,MAAMA,EAAc,EAAE,CAAC,SAAS,eAAeA,EAAc,EAAE,CAAC,SAAS,mBAAmBA,EAAc,EAAE,CAAC,KAAK,UAE3JU,IAAgBV,EAAc,SAASM,EAAc,QAErDK,KAAe,IAAsC,gBAAgB;EACzE,IAAID,IAAgB,GAAG;EACvB,IACIE,IAAO,UAAUC,IAAO,UAAUC,IAAO,WAAWC,IAAO;EAC/D,KAAK,IAAMX,KAAKJ,GAId,AAHA,IAAO,KAAK,IAAIY,GAAMR,EAAE,SAAS,CAAC,GAClC,IAAO,KAAK,IAAIS,GAAMT,EAAE,SAAS,CAAC,GAClC,IAAO,KAAK,IAAIU,GAAMV,EAAE,SAAS,IAAIA,EAAE,KAAK,GAC5C,IAAO,KAAK,IAAIW,GAAMX,EAAE,SAAS,IAAIA,EAAE,MAAM;EAE/C,KAAK,IAAMG,KAAKD,GACd,KAAK,IAAMU,KAAKT,EAAE,QAEY,AAD5B,IAAO,KAAK,IAAIK,GAAMI,EAAE,CAAC,GAAG,IAAO,KAAK,IAAIH,GAAMG,EAAE,CAAC,GACrD,IAAO,KAAK,IAAIF,GAAME,EAAE,CAAC,GAAG,IAAO,KAAK,IAAID,GAAMC,EAAE,CAAC;EAGzD,IAAMC,IAAQC,MAAS,iBACjBC,IAAUC,EAAW,OAAO,GAC5BC,IAAsB;GAC1B,IAAIF;GACJ;GACA,UAAU;IAAE,GAAGP,IAAO;IAAK,GAAGC,IAAO;GAAI;GACzC,OAAOC,IAAOF,IAAO;GACrB,QAAQG,IAAOF,IAAO;GACtB,MAAM;IACJ,GAAGS;IACH,OAAOL,IAAQ,cAAc;IAC7B,MAAMA,IAAQ,YAAY;IAC1B,QAAQ;IAAW,aAAa;IAChC,aAAaA,IAAQ,WAAW;IAChC,SAAS;GACX;EACF,GACMM,IAAOpB,EAAU,SACjBqB,IAAOrB,EAAU;EAiBvB,AAhBAsB,GAAO,MAAQ;GACb,IAAMC,IAASC,EAAK,SAASC;GAE7B,OADKF,IACE;IACL,GAAGC;IACH,UAAU;KAAE,GAAGA,EAAK;MAAWC,IAAkB;MAC/C,GAAGF;MACH,OAAOT,IACH,CAACI,GAAW,GAAGK,EAAO,KAAK,IAC3B,CAACL,GAAW,GAAGK,EAAO,MAAM,KAAI,MAAKH,EAAK,IAAInB,EAAE,EAAE,IAAI;OAAE,GAAGA;OAAG,UAAUe;MAAQ,IAAIf,CAAC,CAAC;MAC1F,OAAOa,IACHS,EAAO,QACPA,EAAO,MAAM,KAAI,MAAKF,EAAK,IAAIjB,EAAE,EAAE,IAAI;OAAE,GAAGA;OAAG,UAAUY;MAAQ,IAAIZ,CAAC;KAC5E;IAAC;GACH,IAZoBoB;EAatB,CAAC,GACDE,EAAa;GAAE,yBAAS,IAAI,IAAI,CAACV,CAAO,CAAC;GAAG,yBAAS,IAAI,IAAI;GAAG,yBAAS,IAAI,IAAI;EAAE,CAAC;CACtF,GAEMW,UAAsB;EAC1B,IAAMC,oBAAW,IAAI,IAAY,GAC3BC,oBAAe,IAAI,IAAY,GAC/BC,oBAAe,IAAI,IAAY;EACrC,KAAK,IAAM7B,KAAKJ,GACd,CAAII,EAAE,SAAS,eAAeA,EAAE,SAAS,mBAAmBA,EAAE,KAAK,YAAS2B,EAAS,IAAI3B,EAAE,EAAE;EAE/F,IAAI2B,EAAS,SAAS,GACtB;QAAK,IAAM3B,KAAKF,EAAc,OAC5B,AAAIE,EAAE,YAAY2B,EAAS,IAAI3B,EAAE,QAAQ,KAAG4B,EAAa,IAAI5B,EAAE,EAAE;GAEnE,KAAK,IAAMG,KAAKL,EAAc,OAC5B,AAAIK,EAAE,YAAYwB,EAAS,IAAIxB,EAAE,QAAQ,KAAG0B,EAAa,IAAI1B,EAAE,EAAE;GAiBnE,AAfAkB,GAAO,MAAQ;IACb,IAAMC,IAASC,EAAK,SAASC;IAE7B,OADKF,IACE;KACL,GAAGC;KACH,UAAU;MAAE,GAAGA,EAAK;OAAWC,IAAkB;OAC/C,GAAGF;OACH,OAAOA,EAAO,MACX,QAAO,MAAK,CAACK,EAAS,IAAI3B,EAAE,EAAE,CAAC,CAAC,CAChC,KAAI,MAAK4B,EAAa,IAAI5B,EAAE,EAAE,IAAI;QAAE,GAAGA;QAAG,UAAU,KAAA;OAAU,IAAIA,CAAC;OACtE,OAAOsB,EAAO,MACX,KAAI,MAAKO,EAAa,IAAI1B,EAAE,EAAE,IAAI;QAAE,GAAGA;QAAG,UAAU,KAAA;OAAU,IAAIA,CAAC;MACxE;KAAC;IACH,IAXoBoB;GAYtB,CAAC,GACDE,EAAa;IAAE,SAASG;IAAc,yBAAS,IAAI,IAAI;IAAG,SAASC;GAAa,CAAC;EApBd;CAqBrE,GAEMC,KAAoB,MAA2C;EACnE,IAAMC,IAAMhC,EAAU;EACtB,AAAIgC,EAAI,SAAS,KACjBV,GAAO,MAAQ;GACb,IAAMC,IAASC,EAAK,SAASC;GAC7B,IAAI,CAACF,GAAQ,OAAOC;GACpB,IAAMS,IAAOV,EAAO,MAAM,KAAI,MAAKtB,EAAE,UAAU,CAAC,GAC1CiC,IAAOD,EAAK,SAAS,IAAI,KAAK,IAAI,GAAGA,CAAI,IAAI,GAC7CE,IAAOF,EAAK,SAAS,IAAI,KAAK,IAAI,GAAGA,CAAI,IAAI,GAC7CG,IAAQb,EAAO,MAAM,KAAI,MAAK;IAClC,IAAI,CAACS,EAAI,IAAI,EAAE,EAAE,GAAG,OAAO;IAC3B,IAAMK,IAAI,EAAE,UAAU,GAClBC,IAAOD;IAKX,OAJIE,MAAS,UAAS,IAAOL,IAAO,IAC3BK,MAAS,SAAQ,IAAOJ,IAAO,IAC/BI,MAAS,OAAM,IAAOF,IAAI,IAC1BE,MAAS,WAAQ,IAAOF,IAAI,IAC9B;KAAE,GAAG;KAAG,QAAQC;IAAK;GAC9B,CAAC;GACD,OAAO;IAAE,GAAGd;IAAM,UAAU;KAAE,GAAGA,EAAK;MAAWC,IAAkB;MAAE,GAAGF;MAAQ;KAAM;IAAE;GAAE;EAC5F,CAAC;CACH,GAEMiB,KAAoB,MAA2C;EACnE,IAAMR,IAAMhC,EAAU;EACtB,AAAIgC,EAAI,SAAS,KACjBV,GAAO,MAAQ;GACb,IAAMC,IAASC,EAAK,SAASC;GAC7B,IAAI,CAACF,GAAQ,OAAOC;GACpB,IAAMS,IAAOV,EAAO,MAAM,KAAI,MAAKnB,EAAE,UAAU,CAAC,GAC1C8B,IAAOD,EAAK,SAAS,IAAI,KAAK,IAAI,GAAGA,CAAI,IAAI,GAC7CE,IAAOF,EAAK,SAAS,IAAI,KAAK,IAAI,GAAGA,CAAI,IAAI,GAC7CQ,IAAQlB,EAAO,MAAM,KAAI,MAAK;IAClC,IAAI,CAACS,EAAI,IAAI5B,EAAE,EAAE,GAAG,OAAOA;IAC3B,IAAMiC,IAAIjC,EAAE,UAAU,GAClBkC,IAAOD;IAKX,OAJIE,MAAS,UAAS,IAAOL,IAAO,IAC3BK,MAAS,SAAQ,IAAOJ,IAAO,IAC/BI,MAAS,OAAM,IAAOF,IAAI,IAC1BE,MAAS,WAAQ,IAAOF,IAAI,IAC9B;KAAE,GAAGjC;KAAG,QAAQkC;IAAK;GAC9B,CAAC;GACD,OAAO;IAAE,GAAGd;IAAM,UAAU;KAAE,GAAGA,EAAK;MAAWC,IAAkB;MAAE,GAAGF;MAAQ;KAAM;IAAE;GAAE;EAC5F,CAAC;CACH,GAEMmB,KAAkB,GAAgB,GAAa,MAAe;EAClE,EAAoBC,GAAQ,GAAGC,IAAMC,EAAM,CAAC;CAC9C,GAEMC,KAAuB,GAAgB,MAAgC;EAC3E,GAAO,MAAQ;GACb,IAAMvB,IAASC,EAAK,SAASC;GAE7B,OADKF,IACE;IACL,GAAGC;IACH,UAAU;KACR,GAAGA,EAAK;MACPC,IAAkB;MACjB,GAAGF;MACH,OAAOA,EAAO,MAAM,KAAI,MACtB,EAAE,OAAOoB,IAAS;OAAE,GAAG;OAAG,MAAM;QAAE,GAAG,EAAE;QAAM,GAAGI;OAAO;MAAE,IAAI,CAC/D;KACF;IACF;GACF,IAZoBvB;EAatB,CAAC;CACH;CA+FA,OACE,kBAAA9C,GAAA,EAAA,UAAA;EACG,CAAC2B,KACA,kBAAC,OAAD;GAAK,OAAO;IAAE,UAAU;IAAI,OAAO;IAAmE,WAAW;IAAU,SAAS;GAAS;GAAG,UAAA;EAE3I,CAAA;EAGNR,EAAc,WAAW,KACxB,kBAACoD,GAAD;GACE,MAAMpD,EAAc;GACpB,SAASS;GACT,cAAcoC;GACd,mBAAmBI;GACnB,oBA3GqB,GAAgB,GAAyB,MAAkB;IACtF,GAAO,MAAQ;KACb,IAAMvB,IAASC,EAAK,SAASC;KAE7B,OADKF,IACE;MACL,GAAGC;MACH,UAAU;OACR,GAAGA,EAAK;QACPC,IAAkB;QACjB,GAAGF;QACH,OAAOA,EAAO,MAAM,KAAI,MACtBtB,EAAE,OAAO0C,IAAS;SAAE,GAAG1C;UAAI2C,IAAMC;QAAM,IAAI5C,CAC7C;OACF;MACF;KACF,IAZoBuB;IAatB,CAAC;GACH;GA2FQ,eAtEgB,GAAgB,MAAwB;IAC9D,GAAO,MAAQ;KACb,IAAMD,IAASC,EAAK,SAASC;KAE7B,OADKF,IACE;MACL,GAAGC;MACH,UAAU;OACR,GAAGA,EAAK;QACPC,IAAkB;QACjB,GAAGF;QACH,OAAOA,EAAO,MAAM,KAAI,MAAQ2B,EAAK,OAAOP,IAAS;SAAE,GAAGO;SAAM;QAAK,IAAIA,CAAI;OAC/E;MACF;KACF,IAVoB1B;IAWtB,CAAC;GACH;GAwDQ,gBAAgB2B;GAChB,mBAAmBC;EACpB,CAAA;EAEF7C,IAAgB,KACf,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAA+B,UAAA;IAAc,CAAA;IAC5D,kBAAC,OAAD;KAAK,OAAO;MAAE,UAAU;MAAI,OAAO;MAAmE,cAAc;KAAE;KAAtH,UAAA;MACGV,EAAc,SAAS,KAAK,GAAGA,EAAc,OAAO,OAAOA,EAAc,SAAS,IAAI,MAAM;MAC5FA,EAAc,SAAS,KAAKM,EAAc,SAAS,KAAK;MACxDA,EAAc,SAAS,KAAK,GAAGA,EAAc,OAAO,OAAOA,EAAc,SAAS,IAAI,MAAM;MAC5F;KACE;;IACL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,eAAe;MAAU,KAAK;MAAG,OAAO;KAAO;KAA9E,UAAA,CACE,kBAACxB,GAAD;MAAQ,MAAK;MAAK,eAAe6B,EAAY,WAAW;MAAG,OAAA;MAAM,UAAA;KAEzD,CAAA,GACR,kBAAC7B,GAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,eAAe6B,EAAY,eAAe;MAAG,OAAA;MAAM,UAAA;KAE7E,CAAA,CACL;;GACF;;EAENF,KACC,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KACZ,UAAAT,EAAc,EAAE,CAAC,SAAS,kBAAkB,mBAAmB;IAC7D,CAAA;IACL,kBAAC,OAAD;KAAK,OAAO;MAAE,UAAU;MAAI,OAAO;MAAmE,cAAc;KAAE;KACnH,UAAAA,EAAc,EAAE,CAAC,SAAS,kBACvB,yCACA;IACD,CAAA;IACL,kBAAClB,GAAD;KAAQ,MAAK;KAAK,SAAQ;KAAQ,SAASgD;KAAe,OAAA;KAAM,UAAA;IAExD,CAAA;GACL;;EAGN9B,EAAc,SAAS,KACtB,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;IAA+B,UAAA;GAAU,CAAA,GACxD,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,KAAK;IAAE;IAAtC,UAAA;KACE,kBAAClB,GAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,eAAeoD,EAAiB,OAAO;MACvE,UAAA,kBAAC,QAAD;OAAM,OAAM;OAAuB,UAAA;MAAO,CAAA;KACpC,CAAA;KACR,kBAACpD,GAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,eAAeoD,EAAiB,IAAI;MACpE,UAAA,kBAAC,QAAD;OAAM,OAAM;OAAqB,UAAA;MAAO,CAAA;KAClC,CAAA;KACR,kBAACpD,GAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,eAAeoD,EAAiB,MAAM;MACtE,UAAA,kBAAC,QAAD;OAAM,OAAM;OAAqB,UAAA;MAAO,CAAA;KAClC,CAAA;KACR,kBAACpD,GAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,eAAeoD,EAAiB,MAAM;MACtE,UAAA,kBAAC,QAAD;OAAM,OAAM;OAAqB,UAAA;MAAO,CAAA;KAClC,CAAA;IACL;GACF,CAAA,CAAA;;EAGN7B,EAAc,WAAW,KACxB,kBAACmD,GAAD;GACE,MAAMnD,EAAc;GACpB,eAxJgB,GAAgB,GAAa,MAAe;IAClE,GAAO,MAAQ;KACb,IAAMqB,IAASC,EAAK,SAASC;KAE7B,OADKF,IACE;MACL,GAAGC;MACH,UAAU;OACR,GAAGA,EAAK;QACPC,IAAkB;QACjB,GAAGF;QACH,OAAOA,EAAO,MAAM,KAAI,MACtB+B,EAAE,OAAOC,IAAS;SAAE,GAAGD;SAAG,MAAM;UAAE,GAAGA,EAAE;WAAOV,IAAMC;SAAM;QAAE,IAAIS,CAClE;OACF;MACF;KACF,IAZoB9B;IAatB,CAAC;GACH;GAwIQ,eArHgB,GAAgB,MAAiB;IACvD,GAAO,MAAQ;KACb,IAAMD,IAASC,EAAK,SAASC;KAE7B,OADKF,IACE;MACL,GAAGC;MACH,UAAU;OACR,GAAGA,EAAK;QACPC,IAAkB;QACjB,GAAGF;QACH,OAAOA,EAAO,MAAM,KAAI,MACtB+B,EAAE,OAAOC,IAAS;SAAE,GAAGD;SAAS;QAAY,IAAIA,CAClD;OACF;MACF;KACF,IAZoB9B;IAatB,CAAC;GACH;EAqGO,CAAA;EAGFrB,EAAc,WAAW,KACxB,kBAAAzB,GAAA,EAAA,UAAA,CACE,kBAAC8E,GAAD;GACE,MAAMrD,EAAc;GACpB,eA1Gc,GAAgB,GAAa,MAAe;IAClE,GAAO,MAAQ;KACb,IAAMoB,IAASC,EAAK,SAASC;KAE7B,OADKF,IACE;MACL,GAAGC;MACH,UAAU;OACR,GAAGA,EAAK;QACPC,IAAkB;QACjB,GAAGF;QACH,OAAOA,EAAO,MAAM,KAAI,MACtBnB,EAAE,OAAOqD,IAAS;SAAE,GAAGrD;UAAIwC,IAAMC;QAAM,IAAIzC,CAC7C;OACF;MACF;KACF,IAZoBoB;IAatB,CAAC;GACH;EA0FS,CAAA,GACD,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;IAA+B,UAAA;GAAU,CAAA,GACxD,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,KAAK;IAAE;IAAtC,UAAA;KACE,kBAAC7C,GAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,eAAe6D,EAAiB,OAAO;MACvE,UAAA,kBAAC,QAAD;OAAM,OAAM;OAAiB,UAAA;MAAO,CAAA;KAC9B,CAAA;KACR,kBAAC7D,GAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,eAAe6D,EAAiB,IAAI;MACpE,UAAA,kBAAC,QAAD;OAAM,OAAM;OAAgB,UAAA;MAAO,CAAA;KAC7B,CAAA;KACR,kBAAC7D,GAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,eAAe6D,EAAiB,MAAM;MACtE,UAAA,kBAAC,QAAD;OAAM,OAAM;OAAgB,UAAA;MAAO,CAAA;KAC7B,CAAA;KACR,kBAAC7D,GAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,eAAe6D,EAAiB,MAAM;MACtE,UAAA,kBAAC,QAAD;OAAM,OAAM;OAAe,UAAA;MAAO,CAAA;KAC5B,CAAA;IACL;GACF,CAAA,CAAA;EACL,CAAA,CAAA,EAAA,CAAA;CAEJ,EAAA,CAAA;AAEN;AAWA,SAASkB,EAAgB,EACvB,UACA,aACA,SACA,qBACA,oBAAiB,aAOhB;CACD,IAAMC,IAAYC,EAAiBC,IAC7BC,IAAaC,EAAiBJ,CAAS,KAAK,6BAE5CK,IAAWnB,KAAS,IACpBoB,IAAaD,EAAS,YAAY,GAClCE,IAAeC,EAAaH,CAAQ,GACpCI,IAAgBJ,MAAa,eAC7BK,IAAWC,EAAc,MAAM,MAAMC,EAAE,MAAM,YAAY,MAAMN,CAAU,GACzEO,IAASR,MAAaL,GACtBc,IAAW,CAAC,CAACT,KAAY,CAACE,KAAgB,CAACE,KAAiB,CAACC,GAC7DK,IAAcD,IAAWT,IAAWW;CAE1C,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GAEE,kBAAC,UAAD;IACE,MAAK;IACL,OAAM;IACN,cAAW;IACX,WAAW,4CAA4CH,IAAS,eAAe;IAC/E,OAAO,EAAE,YAAYV,EAAW;IAChC,eAAec,EAASjB,CAAS;GAClC,CAAA;GAED,kBAAC,QAAD,EAAM,WAAU,qBAAsB,CAAA;GAGrCW,EAAc,KAAK,MAClB,kBAAC,UAAD;IAEE,MAAK;IACL,OAAOC,EAAE;IACT,cAAYA,EAAE;IACd,WAAW,oBAAoB,CAACL,KAAgB,CAACE,KAAiBH,MAAeM,EAAE,MAAM,YAAY,IAAI,eAAe;IACxH,OAAO,EAAE,YAAYA,EAAE,MAAM;IAC7B,eAAeK,EAASL,EAAE,KAAK;GAChC,GAPMA,EAAE,KAOR,CACF;GAED,kBAAC,QAAD,EAAM,WAAU,qBAAsB,CAAA;GAGtC,kBAAC,SAAD;IACE,WAAW,8CAA8CE,IAAW,eAAe;IACnF,OAAM;IACN,OAAOA,IAAW,EAAE,YAAYT,EAAS,IAAI,KAAA;IAE7C,UAAA,kBAAC,SAAD;KACE,MAAK;KACL,OAAOU;KACP,WAAW,MAAME,EAAS,EAAE,OAAO,KAAK;IACzC,CAAA;GACI,CAAA;GAGNC,KACC,kBAAC,UAAD;IACE,MAAK;IACL,OAAM;IACN,cAAW;IACX,WAAW,mDAAmDT,IAAgB,eAAe;IAC7F,eAAeQ,EAAS,aAAa;GACtC,CAAA;EAEA;;AAET;AAGA,SAASE,EAAkB,GAAoB;CAC7C,IAAMC,IAAMC,EAAWC,CAAE,GACnBC,IAAQC,EAAkBJ,GAAK,YAAY,EAAE,KAAK,WAClDK,IAASC,EAAeJ,GAAIC,CAAK;CACvC,OAAOE,IAAS,2BAA2B,mBAAmBA,CAAM,MAAM;AAC5E;AAIA,SAASE,EAAiB,EACxB,SACA,mBAIC;CACD,IAAM,CAACC,GAAKC,KAAUC,EAA0B,MAAM,GAChDC,IAAQ5F,QAAc6F,EAAsBJ,CAAG,GAAG,CAACA,CAAG,CAAC,GACvDK,IAAU1C,EAAK,KAAK,aAAa,IACjC2C,IAAO3C,EAAK,KAAK,iBAAiB;CACxC,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,kBAAC,OAAD;IAAK,WAAU;IAA+B,UAAA;GAAe,CAAA;GAC7D,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACpE,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAW,CAAA,GAC7D,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,KAAK;MAAG,YAAY;MAAU,MAAM;MAAG,UAAU;KAAE;KAAlF,UAAA,CACE,kBAACE,GAAD;MACE,SAAS8G,EAAoB,KAAI,OAAM;OAAE,OAAOvB,EAAE;OAAI,OAAOA,EAAE;MAAM,EAAE;MACvE,OAAOgB;MACP,WAAW,MAAMC,EAAOO,CAAoB;MAC5C,OAAO;OAAE,UAAU;OAAI,MAAM;OAAG,UAAU;MAAE;KAC7C,CAAA,GACD,kBAACpH,GAAD;MACE,MAAK;MACL,SAASiH,IAAU,UAAU;MAC7B,QAAA;MACA,eAAeI,EAAa9C,EAAK,IAAI,aAAa,KAAA,CAAS;MAE3D,UAAA,kBAAC,QAAD;OAAM,OAAM;OAAS,UAAA;MAAO,CAAA;KACtB,CAAA,CACL;IACF,CAAA,CAAA;;GACJ0C,KAAW,CAACF,EAAM,MAAK,MAAMO,EAAG,OAAOL,CAAO,KAC7C,kBAAC,OAAD;IAAK,OAAO;KAAE,UAAU;KAAI,SAAS;KAAM,cAAc;IAAE;IAAG,UAAA;GAEzD,CAAA;GAEP,kBAAC,OAAD;IACE,OAAO;KACL,SAAS;KACT,qBAAqB;KACrB,KAAK;KACL,WAAW;KACX,WAAW;KACX,SAAS;KACT,QAAQ;KACR,cAAc;KACd,cAAc;IAChB;IAEC,UAAAF,EAAM,KAAK,MAAO;KACjB,IAAMQ,IAAMpB,EAAkBmB,EAAG,EAAE,GAC7BE,IAASP,MAAYK,EAAG;KAC9B,OACE,kBAAC,UAAD;MAEE,MAAK;MACL,OAAOA,EAAG;MACV,cAAYA,EAAG;MACf,eAAeD,EAAa9C,EAAK,IAAI,aAAa+C,EAAG,EAAE;MACvD,OAAO;OACL,SAAS;OACT,YAAY;OACZ,gBAAgB;OAChB,OAAO;OACP,QAAQ;OACR,cAAc;OACd,QAAQ;OACR,SAAS;OACT,QAAQE,IAAS,qCAAqC;OACtD,YAAYA,IAAS,+DAA+D;MACtF;MAEC,UAAAD,KAAO,kBAAC,OAAD;OAAK,KAAKA;OAAK,OAAO;OAAI,QAAQ;OAAI,KAAI;OAAG,OAAO,EAAE,WAAW,UAAU;MAAI,CAAA;KACjF,GAnBDD,EAAG,EAmBF;IAEZ,CAAC;GACE,CAAA;GACJL,KACC,kBAAAlH,GAAA,EAAA,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACI,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAW,CAAA,GAC7D,kBAACE,GAAD;MACE,SAAS,CACP;OAAE,OAAO;OAAQ,OAAO;MAAO,GAC/B;OAAE,OAAO;OAAS,OAAO;MAAQ,CACnC;MACA,OAAO6G;MACP,WAAW,MAAMG,EAAa9C,EAAK,IAAI,iBAAiB6C,CAAC;MACzD,OAAO,EAAE,UAAU,GAAG;KACvB,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,kBAACjH,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAW,CAAA;MAC7D,kBAACD,GAAD;OACE,MAAK;OACL,MAAK;OACL,OAAO,OAAOqE,EAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,KAAK,MAAMA,EAAK,KAAK,WAAW,IAAI,CAAC,CAAC;OAC3F,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,iBAAiB,KAAK,IAAI,GAAG,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC,CAAC;MACjG,CAAA;MACD,kBAAC,QAAD;OAAM,WAAU;OAAwB,OAAO;QAAE,UAAU;QAAI,SAAS;OAAI;OAAG,UAAA;MAAQ,CAAA;KACpF;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACpE,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAY,CAAA,GAC9D,kBAAC4E,GAAD;MACE,OAAOR,EAAK,KAAK,kBACZ8B,EAAWY,CAAO,CAAC,EAAE,cACrB1C,EAAK,KAAK,cACVA,EAAK,KAAK;MACf,MAAK;MACL,gBAAe;MACf,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,kBAAkB6C,CAAC;KAC3D,CAAA,CACE;;GACL,EAAA,CAAA;EAED;;AAET;AAEA,SAAS9C,EAAc,EACrB,SACA,YACA,iBACA,sBACA,sBACA,iBACA,mBACA,wBAUC;CACD,OACE,kBAAAvE,GAAA,EAAA,UAAA;EACE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAA+B,UAAA;IAAS,CAAA;IACvD,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACI,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAY,CAAA,GAC9D,kBAACD,GAAD;MACE,MAAK;MACL,OAAOqE,EAAK,KAAK;MACjB,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,SAAS,EAAE,OAAO,KAAK;KAC/D,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACpE,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAW,CAAA,GAC7D,kBAACE,GAAD;MACE,SAASoH,EAAgB,KAAI,OAAS;OAAE,OAAOrF;OAAM,OAAOA;MAAK,EAAE;MACnE,OAAOmC,EAAK;MACZ,WAAW,MAAUmD,EAAanD,EAAK,IAAIL,CAAsB;MACjE,OAAO,EAAE,UAAU,GAAG;KACvB,CAAA,CACE;;GACF;;EACL,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAA+B,UAAA;IAAS,CAAA;IACvD,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC/D,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAQ,CAAA,GAC1D,kBAACD,GAAD;MACE,MAAK;MACL,MAAK;MACL,OAAO,OAAO,KAAK,MAAMqE,EAAK,QAAQ,GAAG,IAAI,GAAG;MAChD,WAAW,MAAMoD,EAAkBpD,EAAK,IAAI,SAAS,OAAO,EAAE,OAAO,KAAK,KAAKA,EAAK,KAAK;KAC1F,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACpE,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAQ,CAAA,GAC1D,kBAACD,GAAD;MACE,MAAK;MACL,MAAK;MACL,OAAO,OAAO,KAAK,MAAMqE,EAAK,SAAS,GAAG,IAAI,GAAG;MACjD,WAAW,MAAMoD,EAAkBpD,EAAK,IAAI,UAAU,OAAO,EAAE,OAAO,KAAK,KAAKA,EAAK,MAAM;KAC5F,CAAA,CACE;;GACF;;EACL,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAA+B,UAAA;IAAU,CAAA;IACxD,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACpE,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAW,CAAA,GAC7D,kBAAC4E,GAAD;MACE,OAAOR,EAAK,KAAK;MACjB,MAAK;MACL,kBAAA;MACA,gBAAe;MACf,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,QAAQ6C,CAAC;KACjD,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACjH,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAa,CAAA,GAC/D,kBAAC4E,GAAD;MACE,OAAOR,EAAK,KAAK;MACjB,MAAK;MACL,kBAAA;MACA,gBAAe;MACf,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,UAAU6C,CAAC;KACnD,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACjH,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAW,CAAA,GAC7D,kBAACD,GAAD;MACE,MAAK;MACL,MAAK;MACL,OAAO,OAAOqE,EAAK,KAAK,QAAQ;MAChC,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,YAAY,OAAO,EAAE,OAAO,KAAK,KAAK,EAAE;KAChF,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACpE,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAY,CAAA,GAC9D,kBAAC4E,GAAD;MACE,OAAOR,EAAK,KAAK;MACjB,MAAK;MACL,gBAAe;MACf,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,SAAS6C,CAAC;KAClD,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACjH,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAiB,CAAA,GACnE,kBAAC4E,GAAD;MACE,OAAOR,EAAK,KAAK,cAAcA,EAAK,KAAK;MACzC,MAAK;MACL,gBAAe;MACf,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,cAAc6C,CAAC;KACvD,CAAA,CACE;;IACJ7C,EAAK,SAAS,cAAcA,EAAK,SAAS,eACzC,kBAAAxE,GAAA,EAAA,UAAA;KACE,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAACI,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAe,CAAA,GACjE,kBAACE,GAAD;OACE,SAAS;QACP;SAAE,OAAO;SAAU,OAAO;QAAS;QACnC;SAAE,OAAO;SAAO,OAAO;QAAM;QAC7B;SAAE,OAAO;SAAU,OAAO;QAAS;QACnC;SAAE,OAAO;SAAQ,OAAO;QAAO;QAC/B;SAAE,OAAO;SAAS,OAAO;QAAQ;QACjC;SAAE,OAAO;SAAY,OAAO;QAAW;QACvC;SAAE,OAAO;SAAa,OAAO;QAAY;QACzC;SAAE,OAAO;SAAe,OAAO;QAAc;QAC7C;SAAE,OAAO;SAAgB,OAAO;QAAe;OACjD;OACA,OAAOkE,EAAK,KAAK,kBAAmBqD,KAAWrD,EAAK,SAAS,eAAgB,QAAQ;OACrF,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,iBAAiB6C,CAAC;OACzD,OAAO,EAAE,UAAU,GAAG;MACvB,CAAA,CACE;;KACL,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAACjH,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAiB,CAAA,GACnE,kBAACD,GAAD;OACE,MAAK;OACL,MAAK;OACL,OAAO,OAAOqE,EAAK,KAAK,gBAAgB,CAAC;OACzC,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,gBAAgB,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC;MACnF,CAAA,CACE;;KACL,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAACpE,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAiB,CAAA,GACnE,kBAACD,GAAD;OACE,MAAK;OACL,MAAK;OACL,OAAO,OAAOqE,EAAK,KAAK,gBAAgB,CAAC;OACzC,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,gBAAgB,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC;MACnF,CAAA,CACE;;IACL,EAAA,CAAA;IAEJ,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACpE,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAa,CAAA,GAC/D,kBAACE,GAAD;MACE,SAAS,CAAC;OAAE,OAAO;OAAQ,OAAO;MAAO,GAAG,GAAGwH,EAAqB,KAAI,OAAM;OAAE,OAAOC;OAAG,OAAOA;MAAE,EAAE,CAAC;MACtG,OAAOvD,EAAK,KAAK,gBAAgBqD,IAAWrD,EAAK,SAAS,kBAAkB,WAAW,WAAY;MACnG,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,eAAe6C,CAAC;MACvD,OAAO,EAAE,UAAU,GAAG;KACvB,CAAA,CACE;;IACJW,EAAkB,IAAIxD,EAAK,IAAI,YAAY;KAC1C,IAAMyD,IAAQzD,EAAK,KAAK,eAAe,CAAC,GAClC0D,KAAc,GAAsB,MAA2C;MACnF,EAAa1D,EAAK,IAAI,eAAe;OACnC,GAAGA,EAAK,KAAK;QACZ2D,IAAO;QAAE,GAAG3D,EAAK,KAAK,cAAc2D;QAAO,GAAGC;OAAM;MACvD,CAAC;KACH,GACMC,IAA6C;MAAE,KAAK;MAAO,OAAO;MAAS,QAAQ;MAAU,MAAM;KAAO;KAChH,OACE,kBAAArI,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAACI,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAY,CAAA,GAC9D,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;QAAG,MAAM;OAAE;OAArE,UAAA,CACE,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAI,SAAS;QAAK;QAAG,UAAA;OAAc,CAAA,GAC3DkI,EAAuB9D,EAAK,MAAMA,EAAK,IAAI,KAC1C,kBAAC,QAAD;QAAM,OAAM;QAAkB,OAAO,EAAE,SAAS,cAAc;QAC5D,UAAA,kBAACvE,GAAD;SACE,MAAK;SACL,SAAQ;SACR,eAAeqH,EAAa9C,EAAK,IAAI,eAAe,KAAA,CAAS;SAC9D,UAAA;QAEO,CAAA;OACJ,CAAA,CAEL;MACF,CAAA,CAAA;KACJ,CAAA,GAAA+D,EAAkB,KAAK,MAAS;MAC/B,IAAMC,IAAWP,EAAME;MACvB,OACE,kBAAC,OAAD;OAAgB,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;QAAG,cAAc;OAAE;OAAxF,UAAA;QACE,kBAAC,QAAD;SACE,OAAO,OAAOE,EAAWF,GAAM;SAC/B,OAAO;UAAE,UAAU;UAAI,OAAO;UAAI,YAAY;UAAG,SAASK,IAAW,MAAO;SAAI;SAE/E,UAAAH,EAAWF;QACR,CAAA;QACN,kBAAC,QAAD;SAAM,OAAO,SAASE,EAAWF,GAAM;SAAK,OAAO,EAAE,SAAS,cAAc;SAC1E,UAAA,kBAAC9H,GAAD;UACE,MAAK;UACL,SAASmI,GAAU,WAAW;UAC9B,WAAW,MAAMN,EAAWC,GAAM,EAAE,SAASd,EAAE,CAAC;SACjD,CAAA;QACG,CAAA;QACN,kBAACrC,GAAD;SACE,OAAOwD,GAAU,SAAShE,EAAK,KAAK;SACpC,MAAK;SACL,gBAAe;SACf,WAAW,MAAM0D,EAAWC,GAAM,EAAE,OAAOd,EAAE,CAAC;QAC/C,CAAA;QACD,kBAAC,QAAD;SAAM,OAAO,GAAGgB,EAAWF,GAAM;SAAM,OAAO;UAAE,SAAS;UAAe,OAAO;SAAG;SAChF,UAAA,kBAAChI,GAAD;UACE,MAAK;UACL,MAAK;UACL,OAAO,OAAOqI,GAAU,SAAShE,EAAK,KAAK,WAAW;UACtD,WAAW,MAAM0D,EAAWC,GAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAOvD,EAAE,OAAO,KAAK,KAAK,CAAC,EAAE,CAAC;SACtF,CAAA;QACG,CAAA;OACH;MA5BK,GAAAuD,CA4BL;KAET,CAAC,CACD,EAAA,CAAA;IAEN,EAAA,CAAG;IACF3D,EAAK,SAAS,cACb,kBAAAxE,GAAA,EAAA,UAAA;KACE,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAACI,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAW,CAAA,GAC7D,kBAACE,GAAD;OACE,SAASmI,EAAe,CAAC,CAAC,KAAI,OAAS;QAAE,OAAOC,EAAK;QAAI,OAAOA,EAAK;OAAM,EAAE;OAC7E,OAAOlE,EAAK,KAAK,SAAS;OAC1B,aAAY;OACZ,WAAW,MAAU;QACnB,IAAMkE,IAAOpC,EAAW,OAAOnC,CAAK,CAAC;QACrC,EAAkBK,EAAK,IAAI;SACzB,OAAOL;SACP,GAAIuE,GAAM,aAAa,EAAE,OAAOA,EAAK,WAAW,IAAI,CAAC;SACrD,GAAI,CAAClE,EAAK,KAAK,SAASA,EAAK,KAAK,UAAU,SAAS,EAAE,OAAOkE,GAAM,SAAS,OAAOvE,CAAK,EAAE,IAAI,CAAC;QAClG,CAAC;OACH;OACA,OAAO,EAAE,UAAU,GAAG;MACvB,CAAA,CACE;;KACL,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAAC/D,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAU,CAAA,GAC5D,kBAACC,GAAD;OACE,MAAK;OACL,SAASmE,EAAK,KAAK,WAAW;OAC9B,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,WAAW6C,CAAC;OACnD,OAAM;MACP,CAAA,CACE;;KACL,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAACjH,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAY,CAAA,GAC9D,kBAACE,GAAD;OACE,SAAS;QACP;SAAE,OAAO;SAAO,OAAO;QAAM;QAC7B;SAAE,OAAO;SAAU,OAAO;QAAS;QACnC;SAAE,OAAO;SAAU,OAAO;QAAS;QACnC;SAAE,OAAO;SAAQ,OAAO;QAAO;QAC/B;SAAE,OAAO;SAAS,OAAO;QAAQ;OACnC;OACA,OAAOkE,EAAK,KAAK,mBAAoB,UACjC,QACAA,EAAK,KAAK,mBAAoB,WAC5B,WACAA,EAAK,KAAK,mBAAoB,UAC5B,WACCA,EAAK,KAAK,kBAAkB;OACrC,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,kBAAkB6C,CAAC;OAC1D,OAAO,EAAE,UAAU,GAAG;MACvB,CAAA,CACE;;KACL,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAACjH,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAe,CAAA,GACjE,kBAACD,GAAD;OACE,MAAK;OACL,MAAK;OACL,OAAO,OAAOqE,EAAK,KAAK,gBAAgB,CAAC;OACzC,WAAW,MAAU8C,EAAa9C,EAAK,IAAI,gBAAgB,OAAOmE,EAAM,OAAO,KAAK,KAAK,CAAC;MAC3F,CAAA,CACE;;KACL,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAACvI,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAe,CAAA,GACjE,kBAACD,GAAD;OACE,MAAK;OACL,MAAK;OACL,OAAO,OAAOqE,EAAK,KAAK,gBAAgB,CAAC;OACzC,WAAW,MAAU8C,EAAa9C,EAAK,IAAI,gBAAgB,OAAOmE,EAAM,OAAO,KAAK,KAAK,CAAC;MAC3F,CAAA,CACE;;IACL,EAAA,CAAA;GAGD;;EACJnE,EAAK,SAAS,eACb,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;IAA+B,UAAA;GAAsB,CAAA,GACpE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACpE,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAc,CAAA,GAChE,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,UAAU;MAAQ,KAAK;KAAE;KACrD,UAAAwI,EAAwB,KAAK,MAC5B,kBAAC,UAAD;MAEE,MAAK;MACL,OAAOC,EAAyB1D;MAChC,cAAY0D,EAAyB1D;MACrC,eAAe2D,EAAkBtE,EAAK,IAAIuE,EAAkB5D,CAAI,CAAC;MACjE,OAAO;OACL,OAAO;OACP,QAAQ;OACR,cAAc;OACd,QAAQ;OACR,YAAY6D,EAAiB7D,EAAK,CAAC;OACnC,QAAQ,eAAe6D,EAAiB7D,EAAK,CAAC;MAChD;KACD,GAbMA,CAaN,CACF;IACE,CAAA,CACF;GACF,CAAA,CAAA;;EAENX,EAAK,SAAS,eAAeA,EAAK,SAAS,cAC1C,kBAACoC,GAAD;GAAwB;GAAoB;EAAe,CAAA;EAE5DpC,EAAK,SAAS,eACb,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAA+B,UAAA;IAAmB,CAAA;IACjE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACpE,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAe,CAAA,GACjE,kBAACD,GAAD;MACE,MAAK;MACL,OAAOqE,EAAK,KAAK,YAAY;MAC7B,aAAY;MACZ,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,YAAY,EAAE,OAAO,KAAK;KAClE,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACpE,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAgB,CAAA,GAClE,kBAAC4E,GAAD;MACE,OAAOR,EAAK,KAAK,iBAAiB;MAClC,MAAK;MACL,gBAAe;MACf,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,iBAAiB6C,CAAC;KAC1D,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACjH,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAU,CAAA,GAC5D,kBAACD,GAAD;MACE,MAAK;MACL,OAAOqE,EAAK,KAAK,OAAO;MACxB,aAAY;MACZ,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,OAAO,EAAE,OAAO,KAAK;KAC7D,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACpE,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAgB,CAAA,GAClE,kBAAC4E,GAAD;MACE,OAAOR,EAAK,KAAK,YAAYA,EAAK,KAAK;MACvC,MAAK;MACL,gBAAe;MACf,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,YAAY6C,CAAC;KACrD,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACjH,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAc,CAAA,GAChE,kBAACE,GAAD;MACE,SAAS;OACP;QAAE,OAAO;QAAY,OAAO;OAAW;OACvC;QAAE,OAAO;QAAa,OAAO;OAAY;OACzC;QAAE,OAAO;QAAe,OAAO;OAAc;OAC7C;QAAE,OAAO;QAAgB,OAAO;OAAe;MACjD;MACA,OAAOkE,EAAK,KAAK,gBAAgB;MACjC,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,gBAAgB6C,CAAC;MACxD,OAAO,EAAE,UAAU,GAAG;KACvB,CAAA,CACE;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAACjH,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAc,CAAA,GAChE,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,UAAU;OAAQ,KAAK;MAAE;MACrD,UAAAwI,EAAwB,KAAK,MAC5B,kBAAC,UAAD;OAEE,MAAK;OACL,OAAOC,EAAyB1D;OAChC,cAAY0D,EAAyB1D;OACrC,eAAe2D,EAAkBtE,EAAK,IAAIuE,EAAkB5D,CAAI,CAAC;OACjE,OAAO;QACL,OAAO;QACP,QAAQ;QACR,cAAc;QACd,QAAQ;QACR,YAAY6D,EAAiB7D,EAAK,CAAC;QACnC,QAAQ,eAAe6D,EAAiB7D,EAAK,CAAC;OAChD;MACD,GAbMA,CAaN,CACF;KACE,CAAA,CACF;;GACF;;EAENX,EAAK,SAAS,eACb,kBAACyE,GAAD;GAA6B;GAAoB;GAA8B;GAAmC;EAAoB,CAAA;EAExI,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAA+B,UAAA;IAAc,CAAA;IAC5D,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,kBAAC7I,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAa,CAAA;MAC/D,kBAACD,GAAD;OACE,MAAK;OACL,MAAK;OACL,OAAO,OAAOqE,EAAK,KAAK,YAAY,CAAC;OACrC,WAAW,MAAM8C,EAAa9C,EAAK,IAAI,YAAY,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC;MAC/E,CAAA;MACD,kBAAC,QAAD;OAAM,WAAU;OAAwB,OAAO;QAAE,UAAU;QAAI,SAAS;OAAI;OAAG,UAAA;MAAO,CAAA;KACnF;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,kBAACpE,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAW,CAAA;MAC7D,kBAACH,GAAD;OACE,MAAK;OACL,SAASuE,EAAK,KAAK,QAAQ,YAAY;OACvC,eAAe8C,EAAa9C,EAAK,IAAI,SAAS,CAACA,EAAK,KAAK,KAAK;OAC9D,QAAA;OAEA,UAAA,kBAAC,QAAD;QAAM,OAAM;QAAkB,UAAA;OAAO,CAAA;MAC/B,CAAA;MACR,kBAACvE,GAAD;OACE,MAAK;OACL,SAASuE,EAAK,KAAK,QAAQ,YAAY;OACvC,eAAe8C,EAAa9C,EAAK,IAAI,SAAS,CAACA,EAAK,KAAK,KAAK;OAC9D,QAAA;OAEA,UAAA,kBAAC,QAAD;QAAM,OAAM;QAAgB,UAAA;OAAO,CAAA;MAC7B,CAAA;KACL;;IACL,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACE,kBAACpE,GAAD;OAAO,MAAK;OAAK,WAAU;OAAuB,UAAA;MAAY,CAAA;MAC9D,kBAACH,GAAD;OAAQ,MAAK;OAAK,SAAQ;OAAQ,eAAeqH,EAAa9C,EAAK,IAAI,cAAcA,EAAK,KAAK,YAAY,KAAK,MAAM,GAAG;OAAG,UAAA;MAEpH,CAAA;MACR,kBAACvE,GAAD;OAAQ,MAAK;OAAK,SAAQ;OAAQ,eAAeqH,EAAa9C,EAAK,IAAI,cAAcA,EAAK,KAAK,YAAY,KAAK,KAAK,OAAO,GAAG;OAAG,UAAA;MAE1H,CAAA;KACL;;GACF;;CACL,EAAA,CAAA;AAEN;AAEA,SAASyE,EAAsB,EAC7B,SACA,iBACA,mBACA,wBAMC;CACD,IAAM9D,IAAOX,EAAK,KAAK,aAAa,YAC9B0E,IAAKC,IAAoBC,IAAiB5E,EAAK,KAAK,UACpD6E,IAAoBC,EAAyB,IAAI,GAEjDC,KAAY,GAAa,MAAe;EAC5C,EAAa/E,EAAK,IAAI,YAAY;GAChC,SAAS;GAAI,UAAU;GAAU,OAAO;GACxC,GAAG0E;IACFhF,IAAMC;EACT,CAAC;CACH;CASA,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CAA8C,YAASgB,CAAU;EAChE,CAAA,GAAAA,MAAS,SACR,kBAACqE,GAAD;GAA4B;GAAoB;EAAe,CAAA,IAC7DrE,MAAS,YACX,kBAAAnF,GAAA,EAAA,UAAA;GACE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACI,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAS,CAAA,GAC3D,kBAACE,GAAD;KACE,SAAS;MACP;OAAE,OAAO;OAAO,OAAO;MAAM;MAC7B;OAAE,OAAO;OAAO,OAAO;MAAM;MAC7B;OAAE,OAAO;OAAO,OAAO;MAAM;KAC/B;KACA,OAAOkE,EAAK,KAAK,eAAe;KAChC,WAAU,MAAS8C,EAAa9C,EAAK,IAAI,eAAeL,CAAK;IAC9D,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC/D,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAW,CAAA,GAC7D,kBAACD,GAAD;KACE,MAAK;KACL,OAAOqE,EAAK,KAAK,gBAAgB;KACjC,aAAY;KACZ,WAAU,MAAS8C,EAAa9C,EAAK,IAAI,gBAAgBmE,EAAM,OAAO,KAAK;IAC5E,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,kBAACvI,GAAD;MAAO,MAAK;MAAK,WAAU;MAAuB,UAAA;KAAW,CAAA;KAC7D,kBAAC,SAAD;MACE,KAAKiJ;MACL,MAAK;MACL,QAAO;MACP,QAAA;MACA,WAAU,MAAS;OACjB,IAAMI,IAAOd,EAAM,OAAO,QAAQ;OAElC,IADA,EAAM,OAAO,QAAQ,IACjB,CAACc,GAAM;OACX,IAAIA,EAAK,OAAO,UAAkB;QAChC,OAAO,MAAM,0BAA0B;QACvC;OACF;OACA,IAAMC,IAAYD,EAAK,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,YAAY;OAC1D,IAAIC,MAAc,SAASA,MAAc,SAASA,MAAc,OAAO;QACrE,OAAO,MAAM,uBAAuB;QACpC;OACF;OACA,IAAMC,IAAS,IAAI,WAAW;OAO9B,AANA,EAAO,eAAe;QACpB,AAAI,OAAOA,EAAO,UAAW,aAC7BrC,EAAa9C,EAAK,IAAI,eAAekF,CAAS,GAC9CpC,EAAa9C,EAAK,IAAI,gBAAgBmF,EAAO,MAAM;OACrD,GACA,EAAO,gBAAgB,OAAO,MAAM,WAAW,GAC/CA,EAAO,cAAcF,CAAI;MAC3B;KACD,CAAA;KACD,kBAACxJ,GAAD;MAAQ,MAAK;MAAK,SAAQ;MAAU,eAAeoJ,EAAkB,SAAS,MAAM;MAAG,UAAA;KAE/E,CAAA;KACP7E,EAAK,KAAK,cAAc,WAAW,OAAO,KACzC,kBAAC,QAAD;MAAM,WAAU;MAA6B,UAAA;KAAS,CAAA;IAErD;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAsB,UAAA;GAAoE,CAAA;EACzG,EAAA,CAAA,IACAW,MAAS,UACX,kBAAAnF,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAACI,GAAD;IAAO,MAAK;IAAK,WAAU;IAAuB,UAAA;GAAW,CAAA,GAC7D,kBAACD,GAAD;IACE,MAAK;IACL,OAAOqE,EAAK,KAAK,gBAAgB;IACjC,aAAY;IACZ,WAAW,MAAU8C,EAAa9C,EAAK,IAAI,gBAAgBmE,EAAM,OAAO,KAAK;GAC9E,CAAA,CACE;EACL,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAU;GAAsB,UAAA;EAA6C,CAAA,CAClF,EAAA,CAAA,IACAxD,MAAS,OAOTgE,IACF,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IAAqC;IACnBC,EAAe,QAAQ,IAAIA,EAAe,MAAM,KAAK;IAAG;GACrE;EAEL,CAAA,IAAA,kBAAApJ,GAAA,EAAA,UAAA;GACE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACI,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAS,CAAA,GAC3D,kBAACE,GAAD;KACE,SAAS,CACP;MAAE,OAAO;MAAU,OAAO;KAAY,GACtC;MAAE,OAAO;MAAa,OAAO;KAAe,CAC9C;KACA,OAAO4I,GAAI,YAAY;KACvB,WAAW,MAAMK,EAAS,YAAYlC,CAAC;KACvC,OAAO,EAAE,UAAU,GAAG;IACvB,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAqB,OAAO;KAAE,eAAe;KAAU,YAAY;KAAW,KAAK;IAAE;IAApG,UAAA,CACE,kBAACjH,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAW,CAAA,GAC7D,kBAACD,GAAD;KACE,MAAK;KACL,OAAO+I,GAAI,WAAW;KACtB,aAAY;KACZ,WAAW,MAAMK,EAAS,WAAW,EAAE,OAAO,KAAK;IACpD,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAqB,OAAO;KAAE,eAAe;KAAU,YAAY;KAAW,KAAK;IAAE;IAApG,UAAA,CACE,kBAACnJ,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAS,CAAA,GAC3D,kBAACD,GAAD;KACE,MAAK;KACL,OAAO+I,GAAI,SAAS;KACpB,aAAY;KACZ,WAAW,MAAMK,EAAS,SAAS,EAAE,OAAO,KAAK;IAClD,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAqB,OAAO;KAAE,eAAe;KAAU,YAAY;KAAW,KAAK;IAAE;IAApG,UAAA,CACE,kBAACnJ,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAc,CAAA,GAChE,kBAACD,GAAD;KACE,MAAK;KACL,MAAK;KACL,OAAO+I,GAAI,UAAU;KACrB,aAAY;KACZ,WAAW,MAAMK,EAAS,UAAU,EAAE,OAAO,KAAK;IACnD,CAAA,CACE;;GACL,kBAACK,GAAD;IACE,OAAM;IACN,OAAOV,GAAI,gBAAgB;IAC3B,WAAW,MAAUK,EAAS,gBAAgBpF,CAAK;IACnD,MAAM;GACP,CAAA;GACD,kBAAC,OAAD;IAAK,OAAO;KAAE,UAAU;KAAI,OAAO;KAAmE,WAAW;IAAE;IAAG,UAAA;GAEjH,CAAA;EACL,EAAA,CAAA,IA7DF,kBAACyF,GAAD;GACE,OAAO;IAxFb,UAAU;IACV,MAAM;IACN,SAAS;IACT,MAAM;GAqFO,EAAczE,MAAS;GAC9B,OAAOX,EAAK,KAAK,gBAAgB;GACjC,WAAW,MAAU8C,EAAa9C,EAAK,IAAI,gBAAgBL,CAAK;GAChE,MAAM;EACP,CAAA,CA0DA;;AAET;AAEA,SAASQ,EAAc,EACrB,SACA,iBACA,mBAKC;CACD,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,kBAAC,OAAD;IAAK,WAAU;IAA+B,UAAA;GAAS,CAAA;GACvD,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACvE,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAW,CAAA,GAC7D,kBAACE,GAAD;KACE,SAASuJ,EAAkB,KAAI,OAAM;MAAE,OAAOC;MAAG,OAAOA;KAAE,EAAE;KAC5D,OAAOC,EAAK;KACZ,WAAW,MAAMpC,EAAaoC,EAAK,IAAI1C,CAAW;KAClD,OAAO,EAAE,UAAU,GAAG;IACvB,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACjH,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAY,CAAA,GAC9D,kBAAC4E,GAAD;KACE,OAAO+E,EAAK,KAAK;KACjB,MAAK;KACL,gBAAe;KACf,WAAW,MAAMzC,EAAayC,EAAK,IAAI,eAAe1C,CAAC;IACxD,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACjH,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAY,CAAA,GAC9D,kBAACD,GAAD;KACE,MAAK;KACL,MAAK;KACL,OAAO,OAAO4J,EAAK,KAAK,eAAe,CAAC;KACxC,WAAW,MAAMzC,EAAayC,EAAK,IAAI,eAAe,OAAOnF,EAAE,OAAO,KAAK,KAAK,CAAC;IAClF,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACxE,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAgB,CAAA,GAClE,kBAACC,GAAD;KACE,MAAK;KACL,SAAS0J,EAAK,KAAK,YAAY;KAC/B,WAAW,MAAUzC,EAAayC,EAAK,IAAI,YAAY5F,CAAK;KAC5D,OAAM;IACP,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC/D,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAW,CAAA,GAC7D,kBAACE,GAAD;KACE,SAAS0J,EAAwB,KAAI,OAAM;MAAE,OAAOjC;MAAG,OAAOA;KAAE,EAAE;KAClE,OAAOgC,EAAK,KAAK,aAAa;KAC9B,WAAW,MAAMzC,EAAayC,EAAK,IAAI,aAAa1C,CAAC;KACrD,OAAO,EAAE,UAAU,GAAG;IACvB,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACjH,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAY,CAAA,GAC9D,kBAACE,GAAD;KACE,SAAS2J,EAAoB,KAAI,OAAM;MAAE,OAAOC;MAAG,OAAOA;KAAE,EAAE;KAC9D,OAAOH,EAAK,KAAK,eAAe;KAChC,WAAW,MAAMzC,EAAayC,EAAK,IAAI,eAAe1C,CAAC;KACvD,OAAO,EAAE,UAAU,GAAG;IACvB,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACjH,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAU,CAAA,GAC5D,kBAACE,GAAD;KACE,SAAS2J,EAAoB,KAAI,OAAM;MAAE,OAAOC;MAAG,OAAOA;KAAE,EAAE;KAC9D,OAAOH,EAAK,KAAK,aAAa;KAC9B,WAAW,MAAMzC,EAAayC,EAAK,IAAI,aAAa1C,CAAC;KACrD,OAAO,EAAE,UAAU,GAAG;IACvB,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACjH,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAY,CAAA,GAC9D,kBAACD,GAAD;KACE,MAAK;KACL,OAAO4J,EAAK,KAAK,aAAa;KAC9B,WAAW,MAAMzC,EAAayC,EAAK,IAAI,aAAanF,EAAE,OAAO,KAAK;KAClE,aAAY;IACb,CAAA,CACE;;EACF;;AAET;AAEA,SAASE,EAAc,EACrB,SACA,mBAIC;CACD,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,kBAAC,OAAD;IAAK,WAAU;IAA+B,UAAA;GAAS,CAAA;GACvD,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC1E,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAW,CAAA,GAC7D,kBAAC,QAAD;KAAM,OAAO;MAAE,UAAU;MAAI,OAAO;KAAkE;KAAI,UAAA+J,EAAK;IAAW,CAAA,CACvH;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC/J,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAY,CAAA,GAC9D,kBAAC4E,GAAD;KACE,OAAOmF,EAAK;KACZ,MAAK;KACL,gBAAe;KACf,WAAW,MAAM7C,EAAa6C,EAAK,IAAI,eAAe9C,CAAC;IACxD,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACjH,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAY,CAAA,GAC9D,kBAACD,GAAD;KACE,MAAK;KACL,MAAK;KACL,OAAO,OAAOgK,EAAK,WAAW;KAC9B,WAAW,MAAM7C,EAAa6C,EAAK,IAAI,eAAe,OAAOvF,EAAE,OAAO,KAAK,KAAK,CAAC;IAClF,CAAA,CACE;;GACL,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAACxE,GAAD;KAAO,MAAK;KAAK,WAAU;KAAuB,UAAA;IAAY,CAAA,GAC9D,kBAACE,GAAD;KACE,SAAS0J,EAAwB,KAAI,OAAM;MAAE,OAAOjC;MAAG,OAAOA;KAAE,EAAE;KAClE,OAAOoC,EAAK;KACZ,WAAW,MAAM7C,EAAa6C,EAAK,IAAI,aAAa9C,CAAC;KACrD,OAAO,EAAE,UAAU,GAAG;IACvB,CAAA,CACE;;EACF;;AAET"}
@@ -1 +1 @@
1
- {"version":3,"file":"OutlinePanel.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/OutlinePanel.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useRef, useEffect } from 'react';\nimport { Tree, type TreeNode } from '../../../Tree';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { PaletteThumbnail } from './ShapePalette';\nimport { buildSvgMarkup } from '../nodes/svgIcons';\nimport { resolveThemeColor } from '../utils/themeColor';\nimport type { FlowNode, FlowLine, FlowDocument, FlowCanvasData } from '../types';\n\nconst SUB_CANVAS_ICON = '⧉';\n\nfunction OutlineNodeIcon({ node }: { node: FlowNode }) {\n if (node.data.childCanvasId) return <span style={{ fontSize: 15 }}>{SUB_CANVAS_ICON}</span>;\n if (node.type === 'shapeSvg' && node.data.svgId) {\n const markup = buildSvgMarkup(node.data.svgId, resolveThemeColor(node.data.color, '#475569') || '#475569');\n return markup ? (\n <img\n src={`data:image/svg+xml;utf8,${encodeURIComponent(markup)}`}\n width={24}\n height={20}\n alt=\"\"\n style={{ display: 'block', objectFit: 'contain' }}\n />\n ) : null;\n }\n if (node.type === 'mediaNode') {\n const text = node.data.mediaKind === 'markdown' ? 'M↓'\n : node.data.mediaKind === 'html' ? '</>'\n : node.data.mediaKind === 'mermaid' ? '⎇'\n : node.data.mediaKind === 'math' ? '√x'\n : node.data.mediaKind === 'image' ? 'IMG'\n : node.data.mediaKind === 'model3d' ? '3D'\n : node.data.mediaKind === 'data' ? '⊞'\n : 'AI';\n return <span style={{ width: 24, textAlign: 'center', fontSize: 10, fontWeight: 700 }}>{text}</span>;\n }\n return <PaletteThumbnail type={node.type} />;\n}\n\nfunction buildNodeTree(nodes: FlowNode[], lines: FlowLine[], doc: FlowDocument): { nodeTree: TreeNode[]; assignedLineIds: Set<string> } {\n const childNodesOf = new Map<string, FlowNode[]>();\n const childLinesOf = new Map<string, FlowLine[]>();\n const assignedNodes = new Set<string>();\n const assignedLineIds = new Set<string>();\n\n for (const n of nodes) {\n if (n.parentId) {\n const list = childNodesOf.get(n.parentId) ?? [];\n list.push(n);\n childNodesOf.set(n.parentId, list);\n assignedNodes.add(n.id);\n }\n }\n for (const l of lines) {\n if (l.parentId) {\n const list = childLinesOf.get(l.parentId) ?? [];\n list.push(l);\n childLinesOf.set(l.parentId, list);\n assignedLineIds.add(l.id);\n }\n }\n\n // Spatial containment only for geometryGroup\n const geoGroups = nodes.filter(n => n.type === 'geometryGroup');\n for (const g of geoGroups) {\n const gx = g.position.x, gy = g.position.y;\n const gw = g.width, gh = g.height;\n for (const n of nodes) {\n if (n.id === g.id || assignedNodes.has(n.id)) continue;\n if (n.position.x >= gx && n.position.y >= gy\n && n.position.x + n.width <= gx + gw\n && n.position.y + n.height <= gy + gh) {\n const list = childNodesOf.get(g.id) ?? [];\n list.push(n);\n childNodesOf.set(g.id, list);\n assignedNodes.add(n.id);\n }\n }\n for (const l of lines) {\n if (assignedLineIds.has(l.id)) continue;\n if (l.points.length > 0 && l.points.every(p =>\n p.x >= gx && p.x <= gx + gw && p.y >= gy && p.y <= gy + gh\n )) {\n const list = childLinesOf.get(g.id) ?? [];\n list.push(l);\n childLinesOf.set(g.id, list);\n assignedLineIds.add(l.id);\n }\n }\n }\n\n const roots = nodes.filter(n => !assignedNodes.has(n.id));\n\n const lineToTree = (l: FlowLine): TreeNode => ({\n id: l.id,\n label: `${l.type} line`,\n icon: '〰',\n });\n\n const toTreeNode = (n: FlowNode): TreeNode => {\n const hasSubCanvas = !!n.data.childCanvasId;\n const icon = <OutlineNodeIcon node={n} />;\n const kidNodes = childNodesOf.get(n.id);\n const kidLines = childLinesOf.get(n.id);\n const item: TreeNode = {\n id: n.id,\n label: n.data.label || n.type,\n icon,\n meta: hasSubCanvas ? { childCanvasId: n.data.childCanvasId } : undefined,\n };\n\n const children: TreeNode[] = [];\n if (kidNodes && kidNodes.length > 0) {\n children.push(...kidNodes.map(toTreeNode));\n }\n if (kidLines && kidLines.length > 0) {\n children.push(...kidLines.map(lineToTree));\n }\n if (hasSubCanvas) {\n const subCanvas = doc.canvases[n.data.childCanvasId!];\n if (subCanvas) {\n const subTree = buildCanvasSubtree(subCanvas, doc, n.data.childCanvasId!);\n if (subTree.length > 0) {\n children.push(...subTree);\n }\n }\n }\n if (children.length > 0) {\n item.children = children;\n }\n return item;\n };\n\n return { nodeTree: roots.map(toTreeNode), assignedLineIds };\n}\n\nfunction buildCanvasSubtree(canvas: FlowCanvasData, doc: FlowDocument, canvasId: string): TreeNode[] {\n if (canvas.nodes.length === 0 && canvas.edges.length === 0 && canvas.lines.length === 0) {\n return [{ id: `_empty_${canvasId}`, label: '(empty sub-canvas)', icon: '○' }];\n }\n return buildNodeTree(canvas.nodes, canvas.lines, doc).nodeTree;\n}\n\n/**\n * Standalone panel (legacy). Prefer using OutlinePanelContent inside a FlowPanelGroup.\n */\nexport default function OutlinePanel() {\n const { showOutline } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('left', 180);\n\n if (!showOutline) return null;\n\n return (\n <div className=\"flow-palette\" data-flow-panel style={{ ...(panelStyle ?? { top: 56, left: 'auto', right: 248 + 16 }), width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--left\" {...resizeHandleProps} />\n <div\n className=\"flow-panel-drag-handle\"\n {...handleProps}\n style={{ fontSize: 11, fontWeight: 600, marginBottom: 6, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em', cursor: 'grab' }}\n >\n Outline\n </div>\n <div className=\"flow-palette-content\">\n <OutlinePanelContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function OutlinePanelContent() {\n const { focusOnRect } = useFlowUI();\n const { doc, currentCanvas, currentCanvasId, selection, setSelection, pushCanvas } = useFlowContext();\n\n const treeData = useMemo<TreeNode[]>(() => {\n const { nodeTree, assignedLineIds } = buildNodeTree(currentCanvas.nodes, currentCanvas.lines, doc);\n const edgeItems: TreeNode[] = currentCanvas.edges.map(e => {\n const sn = currentCanvas.nodes.find(n => n.id === e.source);\n const tn = currentCanvas.nodes.find(n => n.id === e.target);\n const srcLabel = sn?.data.label || e.source;\n const tgtLabel = tn?.data.label || e.target;\n return { id: e.id, label: `${srcLabel} → ${tgtLabel}`, icon: '→' };\n });\n const unassignedLines = currentCanvas.lines.filter(l => !assignedLineIds.has(l.id));\n const lineItems: TreeNode[] = unassignedLines.map(l => ({\n id: l.id,\n label: `${l.type} line`,\n icon: '〰',\n }));\n\n const tree: TreeNode[] = [];\n if (nodeTree.length > 0) tree.push({ id: '_nodes', label: `Nodes (${currentCanvas.nodes.length})`, children: nodeTree });\n if (edgeItems.length > 0) tree.push({ id: '_edges', label: `Edges (${edgeItems.length})`, children: edgeItems });\n if (lineItems.length > 0) tree.push({ id: '_lines', label: `Lines (${unassignedLines.length})`, children: lineItems });\n return tree;\n }, [currentCanvas, doc]);\n\n const activeId = useMemo(() => {\n if (selection.nodeIds.size === 1) return [...selection.nodeIds][0];\n if (selection.edgeIds.size === 1) return [...selection.edgeIds][0];\n if (selection.lineIds.size === 1) return [...selection.lineIds][0];\n return undefined;\n }, [selection]);\n\n const defaultExpanded = useMemo(() => {\n const ids: (string | number)[] = ['_nodes', '_edges', '_lines'];\n for (const n of currentCanvas.nodes) {\n if (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup) ids.push(n.id);\n if (n.data.childCanvasId) ids.push(n.id);\n }\n if (activeId) {\n const node = currentCanvas.nodes.find(n => n.id === activeId);\n if (node?.parentId) {\n let pid: string | undefined = node.parentId;\n while (pid) {\n ids.push(pid);\n const parent = currentCanvas.nodes.find(n => n.id === pid);\n pid = parent?.parentId;\n }\n }\n const line = currentCanvas.lines.find(l => l.id === activeId);\n if (line?.parentId) ids.push(line.parentId);\n }\n return ids;\n }, [currentCanvas.nodes, currentCanvas.lines, activeId]);\n\n const handleNodeClick = useCallback((node: TreeNode) => {\n const id = String(node.id);\n if (id.startsWith('_')) return;\n\n const flowNode = currentCanvas.nodes.find(n => n.id === id);\n const flowEdge = currentCanvas.edges.find(e => e.id === id);\n const flowLine = currentCanvas.lines.find(l => l.id === id);\n\n setSelection({\n nodeIds: flowNode ? new Set([id]) : new Set(),\n edgeIds: flowEdge ? new Set([id]) : new Set(),\n lineIds: flowLine ? new Set([id]) : new Set(),\n });\n\n if (flowNode) {\n focusOnRect(flowNode.position.x, flowNode.position.y, flowNode.width, flowNode.height);\n } else if (flowEdge) {\n const sn = currentCanvas.nodes.find(n => n.id === flowEdge.source);\n const tn = currentCanvas.nodes.find(n => n.id === flowEdge.target);\n if (sn && tn) {\n const minX = Math.min(sn.position.x, tn.position.x);\n const minY = Math.min(sn.position.y, tn.position.y);\n const maxX = Math.max(sn.position.x + sn.width, tn.position.x + tn.width);\n const maxY = Math.max(sn.position.y + sn.height, tn.position.y + tn.height);\n focusOnRect(minX, minY, maxX - minX, maxY - minY);\n }\n } else if (flowLine && flowLine.points.length > 0) {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of flowLine.points) {\n minX = Math.min(minX, p.x); minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y);\n }\n focusOnRect(minX - 20, minY - 20, maxX - minX + 40, maxY - minY + 40);\n }\n }, [currentCanvas, setSelection, focusOnRect]);\n\n const handleNodeDoubleClick = useCallback((node: TreeNode) => {\n const id = String(node.id);\n if (id.startsWith('_')) return;\n const flowNode = currentCanvas.nodes.find(n => n.id === id);\n if (flowNode?.data.childCanvasId) {\n pushCanvas(flowNode.data.childCanvasId);\n }\n }, [currentCanvas.nodes, pushCanvas]);\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!activeId || !containerRef.current) return;\n const timer = setTimeout(() => {\n const el = containerRef.current?.querySelector(`[data-node-id=\"${activeId}\"]`);\n if (el) el.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }, 60);\n return () => clearTimeout(timer);\n }, [activeId]);\n\n return (\n <div ref={containerRef}>\n <Tree\n data={treeData}\n onNodeClick={handleNodeClick}\n onNodeDoubleClick={handleNodeDoubleClick}\n activeNodeId={activeId}\n defaultExpandedIds={defaultExpanded}\n showSearch={false}\n showExpandAll={false}\n showIcon\n showLine\n indent={16}\n />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"OutlinePanel.js","names":["Tree","SUB_CANVAS_ICON","OutlineNodeIcon","node","markup","buildSvgMarkup","resolveThemeColor","text","PaletteThumbnail","buildNodeTree","childNodesOf","childLinesOf","assignedNodes","assignedLineIds","n","nodes","list","l","lines","geoGroups","g","gx","gy","gw","gh","p","roots","lineToTree","toTreeNode","hasSubCanvas","icon","kidNodes","kidLines","item","children","subCanvas","doc","subTree","buildCanvasSubtree","canvas","canvasId","OutlinePanel","useFlowUI","useDraggablePanel","useResizablePanel","showOutline","panelStyle","panelWidth","resizeHandleProps","handleProps","OutlinePanelContent","useFlowContext","treeData","useMemo","currentCanvas","edgeItems","sn","tn","srcLabel","tgtLabel","unassignedLines","lineItems","tree","nodeTree","activeId","selection","defaultExpanded","ids","pid","line","handleNodeClick","useCallback","id","flowNode","flowEdge","flowLine","setSelection","minX","minY","maxX","maxY","focusOnRect","handleNodeDoubleClick","pushCanvas","containerRef","useRef","useEffect","timer","el"],"sources":["../../../../../src/components/pro/Flow/panels/OutlinePanel.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useRef, useEffect } from 'react';\nimport { Tree, type TreeNode } from '../../../Tree';\nimport { useFlowUI } from '../context/FlowUIContext';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useDraggablePanel } from '../hooks/useDraggablePanel';\nimport { useResizablePanel } from '../hooks/useResizablePanel';\nimport { PaletteThumbnail } from './ShapePalette';\nimport { buildSvgMarkup } from '../nodes/svgIcons';\nimport { resolveThemeColor } from '../utils/themeColor';\nimport type { FlowNode, FlowLine, FlowDocument, FlowCanvasData } from '../types';\n\nconst SUB_CANVAS_ICON = '⧉';\n\nfunction OutlineNodeIcon({ node }: { node: FlowNode }) {\n if (node.data.childCanvasId) return <span style={{ fontSize: 15 }}>{SUB_CANVAS_ICON}</span>;\n if (node.type === 'shapeSvg' && node.data.svgId) {\n const markup = buildSvgMarkup(node.data.svgId, resolveThemeColor(node.data.color, '#475569') || '#475569');\n return markup ? (\n <img\n src={`data:image/svg+xml;utf8,${encodeURIComponent(markup)}`}\n width={24}\n height={20}\n alt=\"\"\n style={{ display: 'block', objectFit: 'contain' }}\n />\n ) : null;\n }\n if (node.type === 'mediaNode') {\n const text = node.data.mediaKind === 'markdown' ? 'M↓'\n : node.data.mediaKind === 'html' ? '</>'\n : node.data.mediaKind === 'mermaid' ? '⎇'\n : node.data.mediaKind === 'math' ? '√x'\n : node.data.mediaKind === 'image' ? 'IMG'\n : node.data.mediaKind === 'model3d' ? '3D'\n : node.data.mediaKind === 'data' ? '⊞'\n : 'AI';\n return <span style={{ width: 24, textAlign: 'center', fontSize: 10, fontWeight: 700 }}>{text}</span>;\n }\n return <PaletteThumbnail type={node.type} />;\n}\n\nfunction buildNodeTree(nodes: FlowNode[], lines: FlowLine[], doc: FlowDocument): { nodeTree: TreeNode[]; assignedLineIds: Set<string> } {\n const childNodesOf = new Map<string, FlowNode[]>();\n const childLinesOf = new Map<string, FlowLine[]>();\n const assignedNodes = new Set<string>();\n const assignedLineIds = new Set<string>();\n\n for (const n of nodes) {\n if (n.parentId) {\n const list = childNodesOf.get(n.parentId) ?? [];\n list.push(n);\n childNodesOf.set(n.parentId, list);\n assignedNodes.add(n.id);\n }\n }\n for (const l of lines) {\n if (l.parentId) {\n const list = childLinesOf.get(l.parentId) ?? [];\n list.push(l);\n childLinesOf.set(l.parentId, list);\n assignedLineIds.add(l.id);\n }\n }\n\n // Spatial containment only for geometryGroup\n const geoGroups = nodes.filter(n => n.type === 'geometryGroup');\n for (const g of geoGroups) {\n const gx = g.position.x, gy = g.position.y;\n const gw = g.width, gh = g.height;\n for (const n of nodes) {\n if (n.id === g.id || assignedNodes.has(n.id)) continue;\n if (n.position.x >= gx && n.position.y >= gy\n && n.position.x + n.width <= gx + gw\n && n.position.y + n.height <= gy + gh) {\n const list = childNodesOf.get(g.id) ?? [];\n list.push(n);\n childNodesOf.set(g.id, list);\n assignedNodes.add(n.id);\n }\n }\n for (const l of lines) {\n if (assignedLineIds.has(l.id)) continue;\n if (l.points.length > 0 && l.points.every(p =>\n p.x >= gx && p.x <= gx + gw && p.y >= gy && p.y <= gy + gh\n )) {\n const list = childLinesOf.get(g.id) ?? [];\n list.push(l);\n childLinesOf.set(g.id, list);\n assignedLineIds.add(l.id);\n }\n }\n }\n\n const roots = nodes.filter(n => !assignedNodes.has(n.id));\n\n const lineToTree = (l: FlowLine): TreeNode => ({\n id: l.id,\n label: `${l.type} line`,\n icon: '〰',\n });\n\n const toTreeNode = (n: FlowNode): TreeNode => {\n const hasSubCanvas = !!n.data.childCanvasId;\n const icon = <OutlineNodeIcon node={n} />;\n const kidNodes = childNodesOf.get(n.id);\n const kidLines = childLinesOf.get(n.id);\n const item: TreeNode = {\n id: n.id,\n label: n.data.label || n.type,\n icon,\n meta: hasSubCanvas ? { childCanvasId: n.data.childCanvasId } : undefined,\n };\n\n const children: TreeNode[] = [];\n if (kidNodes && kidNodes.length > 0) {\n children.push(...kidNodes.map(toTreeNode));\n }\n if (kidLines && kidLines.length > 0) {\n children.push(...kidLines.map(lineToTree));\n }\n if (hasSubCanvas) {\n const subCanvas = doc.canvases[n.data.childCanvasId!];\n if (subCanvas) {\n const subTree = buildCanvasSubtree(subCanvas, doc, n.data.childCanvasId!);\n if (subTree.length > 0) {\n children.push(...subTree);\n }\n }\n }\n if (children.length > 0) {\n item.children = children;\n }\n return item;\n };\n\n return { nodeTree: roots.map(toTreeNode), assignedLineIds };\n}\n\nfunction buildCanvasSubtree(canvas: FlowCanvasData, doc: FlowDocument, canvasId: string): TreeNode[] {\n if (canvas.nodes.length === 0 && canvas.edges.length === 0 && canvas.lines.length === 0) {\n return [{ id: `_empty_${canvasId}`, label: '(empty sub-canvas)', icon: '○' }];\n }\n return buildNodeTree(canvas.nodes, canvas.lines, doc).nodeTree;\n}\n\n/**\n * Standalone panel (legacy). Prefer using OutlinePanelContent inside a FlowPanelGroup.\n */\nexport default function OutlinePanel() {\n const { showOutline } = useFlowUI();\n const { panelStyle, handleProps } = useDraggablePanel();\n const { panelWidth, resizeHandleProps } = useResizablePanel('left', 180);\n\n if (!showOutline) return null;\n\n return (\n <div className=\"flow-palette\" data-flow-panel style={{ ...(panelStyle ?? { top: 56, left: 'auto', right: 248 + 16 }), width: panelWidth }}>\n <div className=\"flow-panel-resize-handle flow-panel-resize-handle--left\" {...resizeHandleProps} />\n <div\n className=\"flow-panel-drag-handle\"\n {...handleProps}\n style={{ fontSize: 11, fontWeight: 600, marginBottom: 6, color: 'color-mix(in oklch, var(--color-base-content) 50%, transparent)', textTransform: 'uppercase', letterSpacing: '0.05em', cursor: 'grab' }}\n >\n Outline\n </div>\n <div className=\"flow-palette-content\">\n <OutlinePanelContent />\n </div>\n </div>\n );\n}\n\n/** Reusable content for embedding inside FlowPanelGroup tabs. */\nexport function OutlinePanelContent() {\n const { focusOnRect } = useFlowUI();\n const { doc, currentCanvas, currentCanvasId, selection, setSelection, pushCanvas } = useFlowContext();\n\n const treeData = useMemo<TreeNode[]>(() => {\n const { nodeTree, assignedLineIds } = buildNodeTree(currentCanvas.nodes, currentCanvas.lines, doc);\n const edgeItems: TreeNode[] = currentCanvas.edges.map(e => {\n const sn = currentCanvas.nodes.find(n => n.id === e.source);\n const tn = currentCanvas.nodes.find(n => n.id === e.target);\n const srcLabel = sn?.data.label || e.source;\n const tgtLabel = tn?.data.label || e.target;\n return { id: e.id, label: `${srcLabel} → ${tgtLabel}`, icon: '→' };\n });\n const unassignedLines = currentCanvas.lines.filter(l => !assignedLineIds.has(l.id));\n const lineItems: TreeNode[] = unassignedLines.map(l => ({\n id: l.id,\n label: `${l.type} line`,\n icon: '〰',\n }));\n\n const tree: TreeNode[] = [];\n if (nodeTree.length > 0) tree.push({ id: '_nodes', label: `Nodes (${currentCanvas.nodes.length})`, children: nodeTree });\n if (edgeItems.length > 0) tree.push({ id: '_edges', label: `Edges (${edgeItems.length})`, children: edgeItems });\n if (lineItems.length > 0) tree.push({ id: '_lines', label: `Lines (${unassignedLines.length})`, children: lineItems });\n return tree;\n }, [currentCanvas, doc]);\n\n const activeId = useMemo(() => {\n if (selection.nodeIds.size === 1) return [...selection.nodeIds][0];\n if (selection.edgeIds.size === 1) return [...selection.edgeIds][0];\n if (selection.lineIds.size === 1) return [...selection.lineIds][0];\n return undefined;\n }, [selection]);\n\n const defaultExpanded = useMemo(() => {\n const ids: (string | number)[] = ['_nodes', '_edges', '_lines'];\n for (const n of currentCanvas.nodes) {\n if (n.type === 'flowGroup' || n.type === 'geometryGroup' || n.data.isGroup) ids.push(n.id);\n if (n.data.childCanvasId) ids.push(n.id);\n }\n if (activeId) {\n const node = currentCanvas.nodes.find(n => n.id === activeId);\n if (node?.parentId) {\n let pid: string | undefined = node.parentId;\n while (pid) {\n ids.push(pid);\n const parent = currentCanvas.nodes.find(n => n.id === pid);\n pid = parent?.parentId;\n }\n }\n const line = currentCanvas.lines.find(l => l.id === activeId);\n if (line?.parentId) ids.push(line.parentId);\n }\n return ids;\n }, [currentCanvas.nodes, currentCanvas.lines, activeId]);\n\n const handleNodeClick = useCallback((node: TreeNode) => {\n const id = String(node.id);\n if (id.startsWith('_')) return;\n\n const flowNode = currentCanvas.nodes.find(n => n.id === id);\n const flowEdge = currentCanvas.edges.find(e => e.id === id);\n const flowLine = currentCanvas.lines.find(l => l.id === id);\n\n setSelection({\n nodeIds: flowNode ? new Set([id]) : new Set(),\n edgeIds: flowEdge ? new Set([id]) : new Set(),\n lineIds: flowLine ? new Set([id]) : new Set(),\n });\n\n if (flowNode) {\n focusOnRect(flowNode.position.x, flowNode.position.y, flowNode.width, flowNode.height);\n } else if (flowEdge) {\n const sn = currentCanvas.nodes.find(n => n.id === flowEdge.source);\n const tn = currentCanvas.nodes.find(n => n.id === flowEdge.target);\n if (sn && tn) {\n const minX = Math.min(sn.position.x, tn.position.x);\n const minY = Math.min(sn.position.y, tn.position.y);\n const maxX = Math.max(sn.position.x + sn.width, tn.position.x + tn.width);\n const maxY = Math.max(sn.position.y + sn.height, tn.position.y + tn.height);\n focusOnRect(minX, minY, maxX - minX, maxY - minY);\n }\n } else if (flowLine && flowLine.points.length > 0) {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of flowLine.points) {\n minX = Math.min(minX, p.x); minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x); maxY = Math.max(maxY, p.y);\n }\n focusOnRect(minX - 20, minY - 20, maxX - minX + 40, maxY - minY + 40);\n }\n }, [currentCanvas, setSelection, focusOnRect]);\n\n const handleNodeDoubleClick = useCallback((node: TreeNode) => {\n const id = String(node.id);\n if (id.startsWith('_')) return;\n const flowNode = currentCanvas.nodes.find(n => n.id === id);\n if (flowNode?.data.childCanvasId) {\n pushCanvas(flowNode.data.childCanvasId);\n }\n }, [currentCanvas.nodes, pushCanvas]);\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!activeId || !containerRef.current) return;\n const timer = setTimeout(() => {\n const el = containerRef.current?.querySelector(`[data-node-id=\"${activeId}\"]`);\n if (el) el.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }, 60);\n return () => clearTimeout(timer);\n }, [activeId]);\n\n return (\n <div ref={containerRef}>\n <Tree\n data={treeData}\n onNodeClick={handleNodeClick}\n onNodeDoubleClick={handleNodeDoubleClick}\n activeNodeId={activeId}\n defaultExpandedIds={defaultExpanded}\n showSearch={false}\n showExpandAll={false}\n showIcon\n showLine\n indent={16}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAWA,IAAMC,IAAkB;AAExB,SAASC,EAAgB,EAAE,WAA4B;CACrD,IAAIC,EAAK,KAAK,eAAe,OAAO,kBAAC,QAAD;EAAM,OAAO,EAAE,UAAU,GAAG;EAAI,UAAAF;CAAsB,CAAA;CAC1F,IAAIE,EAAK,SAAS,cAAcA,EAAK,KAAK,OAAO;EAC/C,IAAMC,IAASC,EAAeF,EAAK,KAAK,OAAOG,EAAkBH,EAAK,KAAK,OAAO,SAAS,KAAK,SAAS;EACzG,OAAOC,IACL,kBAAC,OAAD;GACE,KAAK,2BAA2B,mBAAmBA,CAAM;GACzD,OAAO;GACP,QAAQ;GACR,KAAI;GACJ,OAAO;IAAE,SAAS;IAAS,WAAW;GAAU;EACjD,CAAA,IACC;CACN;CACA,IAAID,EAAK,SAAS,aAAa;EAC7B,IAAMI,IAAOJ,EAAK,KAAK,cAAc,aAAa,OAC9CA,EAAK,KAAK,cAAc,SAAS,QAC/BA,EAAK,KAAK,cAAc,YAAY,MAClCA,EAAK,KAAK,cAAc,SAAS,OAC/BA,EAAK,KAAK,cAAc,UAAU,QAChCA,EAAK,KAAK,cAAc,YAAY,OAClCA,EAAK,KAAK,cAAc,SAAS,MAC/B;EAChB,OAAO,kBAAC,QAAD;GAAM,OAAO;IAAE,OAAO;IAAI,WAAW;IAAU,UAAU;IAAI,YAAY;GAAI;GAAI,UAAAI;EAAW,CAAA;CACrG;CACA,OAAO,kBAACC,GAAD,EAAkB,MAAML,EAAK,KAAO,CAAA;AAC7C;AAEA,SAASM,EAAc,GAAmB,GAAmB,GAA2E;CACtI,IAAMC,oBAAe,IAAI,IAAwB,GAC3CC,oBAAe,IAAI,IAAwB,GAC3CC,oBAAgB,IAAI,IAAY,GAChCC,oBAAkB,IAAI,IAAY;CAExC,KAAK,IAAMC,KAAKC,GACd,IAAID,EAAE,UAAU;EACd,IAAME,IAAON,EAAa,IAAII,EAAE,QAAQ,KAAK,CAAC;EAG9C,AAFAE,EAAK,KAAKF,CAAC,GACXJ,EAAa,IAAII,EAAE,UAAUE,CAAI,GACjCJ,EAAc,IAAIE,EAAE,EAAE;CACxB;CAEF,KAAK,IAAMG,KAAKC,GACd,IAAID,EAAE,UAAU;EACd,IAAMD,IAAOL,EAAa,IAAIM,EAAE,QAAQ,KAAK,CAAC;EAG9C,AAFAD,EAAK,KAAKC,CAAC,GACXN,EAAa,IAAIM,EAAE,UAAUD,CAAI,GACjCH,EAAgB,IAAII,EAAE,EAAE;CAC1B;CAIF,IAAME,IAAYJ,EAAM,QAAO,MAAKD,EAAE,SAAS,eAAe;CAC9D,KAAK,IAAMM,KAAKD,GAAW;EACzB,IAAME,IAAKD,EAAE,SAAS,GAAGE,IAAKF,EAAE,SAAS,GACnCG,IAAKH,EAAE,OAAOI,IAAKJ,EAAE;EAC3B,KAAK,IAAMN,KAAKC,GACd,IAAI,IAAE,OAAOK,EAAE,MAAMR,EAAc,IAAIE,EAAE,EAAE,MACvCA,EAAE,SAAS,KAAKO,KAAMP,EAAE,SAAS,KAAKQ,KACrCR,EAAE,SAAS,IAAIA,EAAE,SAASO,IAAKE,KAC/BT,EAAE,SAAS,IAAIA,EAAE,UAAUQ,IAAKE,GAAI;GACvC,IAAMR,IAAON,EAAa,IAAIU,EAAE,EAAE,KAAK,CAAC;GAGxC,AAFAJ,EAAK,KAAKF,CAAC,GACXJ,EAAa,IAAIU,EAAE,IAAIJ,CAAI,GAC3BJ,EAAc,IAAIE,EAAE,EAAE;EACxB;EAEF,KAAK,IAAMG,KAAKC,GACd,IAAI,GAAgB,IAAID,EAAE,EAAE,KACxBA,EAAE,OAAO,SAAS,KAAKA,EAAE,OAAO,OAAM,MACxCQ,EAAE,KAAKJ,KAAMI,EAAE,KAAKJ,IAAKE,KAAME,EAAE,KAAKH,KAAMG,EAAE,KAAKH,IAAKE,CAC1D,GAAG;GACD,IAAMR,IAAOL,EAAa,IAAIS,EAAE,EAAE,KAAK,CAAC;GAGxC,AAFAJ,EAAK,KAAKC,CAAC,GACXN,EAAa,IAAIS,EAAE,IAAIJ,CAAI,GAC3BH,EAAgB,IAAII,EAAE,EAAE;EAC1B;CAEJ;CAEA,IAAMS,IAAQX,EAAM,QAAO,MAAK,CAACH,EAAc,IAAIE,EAAE,EAAE,CAAC,GAElDa,KAAc,OAA2B;EAC7C,IAAIV,EAAE;EACN,OAAO,GAAGA,EAAE,KAAK;EACjB,MAAM;CACR,IAEMW,KAAc,MAA0B;EAC5C,IAAMC,IAAe,CAAC,CAACf,EAAE,KAAK,eACxBgB,IAAO,kBAAC5B,GAAD,EAAiB,MAAMY,EAAI,CAAA,GAClCiB,IAAWrB,EAAa,IAAII,EAAE,EAAE,GAChCkB,IAAWrB,EAAa,IAAIG,EAAE,EAAE,GAChCmB,IAAiB;GACrB,IAAInB,EAAE;GACN,OAAOA,EAAE,KAAK,SAASA,EAAE;GACzB;GACA,MAAMe,IAAe,EAAE,eAAef,EAAE,KAAK,cAAc,IAAI,KAAA;EACjE,GAEMoB,IAAuB,CAAC;EAO9B,IANIH,KAAYA,EAAS,SAAS,KAChCG,EAAS,KAAK,GAAGH,EAAS,IAAIH,CAAU,CAAC,GAEvCI,KAAYA,EAAS,SAAS,KAChCE,EAAS,KAAK,GAAGF,EAAS,IAAIL,CAAU,CAAC,GAEvCE,GAAc;GAChB,IAAMM,IAAYC,EAAI,SAAStB,EAAE,KAAK;GACtC,IAAIqB,GAAW;IACb,IAAME,IAAUC,EAAmBH,GAAWC,GAAKtB,EAAE,KAAK,aAAc;IACxE,AAAIuB,EAAQ,SAAS,KACnBH,EAAS,KAAK,GAAGG,CAAO;GAE5B;EACF;EAIA,OAHIH,EAAS,SAAS,MACpB,EAAK,WAAWA,IAEXD;CACT;CAEA,OAAO;EAAE,UAAUP,EAAM,IAAIE,CAAU;EAAG;CAAgB;AAC5D;AAEA,SAASU,EAAmB,GAAwB,GAAmB,GAA8B;CAInG,OAHIC,EAAO,MAAM,WAAW,KAAKA,EAAO,MAAM,WAAW,KAAKA,EAAO,MAAM,WAAW,IAC7E,CAAC;EAAE,IAAI,UAAUC;EAAY,OAAO;EAAsB,MAAM;CAAI,CAAC,IAEvE/B,EAAc8B,EAAO,OAAOA,EAAO,OAAOH,CAAG,CAAC,CAAC;AACxD;AAKA,SAAwBK,IAAe;CACrC,IAAM,EAAE,mBAAgBC,EAAU,GAC5B,EAAE,eAAY,mBAAgBC,EAAkB,GAChD,EAAE,eAAY,yBAAsBC,EAAkB,QAAQ,GAAG;CAIvE,OAFKC,IAGH,kBAAC,OAAD;EAAK,WAAU;EAAe,mBAAA;EAAgB,OAAO;GAAE,GAAIC,KAAc;IAAE,KAAK;IAAI,MAAM;IAAQ,OAAO;GAAS;GAAI,OAAOC;EAAW;EAAxI,UAAA;GACE,kBAAC,OAAD;IAAK,WAAU;IAA0D,GAAIC;GAAoB,CAAA;GACjG,kBAAC,OAAD;IACE,WAAU;IACV,GAAIC;IACJ,OAAO;KAAE,UAAU;KAAI,YAAY;KAAK,cAAc;KAAG,OAAO;KAAmE,eAAe;KAAa,eAAe;KAAU,QAAQ;IAAO;IACxM,UAAA;GAEI,CAAA;GACL,kBAAC,OAAD;IAAK,WAAU;IACb,UAAA,kBAACC,GAAD,CAAsB,CAAA;GACnB,CAAA;EACF;MAfkB;AAiB3B;AAGA,SAAgBA,IAAsB;CACpC,IAAM,EAAE,mBAAgBR,EAAU,GAC5B,EAAE,QAAK,kBAAe,oBAAiB,cAAW,iBAAc,kBAAeS,EAAe,GAE9FC,IAAWC,QAA0B;EACzC,IAAM,EAAE,aAAU,uBAAoB5C,EAAc6C,EAAc,OAAOA,EAAc,OAAOlB,CAAG,GAC3FmB,IAAwBD,EAAc,MAAM,KAAI,MAAK;GACzD,IAAME,IAAKF,EAAc,MAAM,MAAK,MAAKxC,EAAE,OAAO,EAAE,MAAM,GACpD2C,IAAKH,EAAc,MAAM,MAAK,MAAKxC,EAAE,OAAO,EAAE,MAAM,GACpD4C,IAAWF,GAAI,KAAK,SAAS,EAAE,QAC/BG,IAAWF,GAAI,KAAK,SAAS,EAAE;GACrC,OAAO;IAAE,IAAI,EAAE;IAAI,OAAO,GAAGC,EAAS,KAAKC;IAAY,MAAM;GAAI;EACnE,CAAC,GACKC,IAAkBN,EAAc,MAAM,QAAO,MAAK,CAACzC,EAAgB,IAAII,EAAE,EAAE,CAAC,GAC5E4C,IAAwBD,EAAgB,KAAI,OAAM;GACtD,IAAI3C,EAAE;GACN,OAAO,GAAGA,EAAE,KAAK;GACjB,MAAM;EACR,EAAE,GAEI6C,IAAmB,CAAC;EAI1B,OAHIC,EAAS,SAAS,KAAGD,EAAK,KAAK;GAAE,IAAI;GAAU,OAAO,UAAUR,EAAc,MAAM,OAAO;GAAI,UAAUS;EAAS,CAAC,GACnHR,EAAU,SAAS,KAAGO,EAAK,KAAK;GAAE,IAAI;GAAU,OAAO,UAAUP,EAAU,OAAO;GAAI,UAAUA;EAAU,CAAC,GAC3GM,EAAU,SAAS,KAAGC,EAAK,KAAK;GAAE,IAAI;GAAU,OAAO,UAAUF,EAAgB,OAAO;GAAI,UAAUC;EAAU,CAAC,GAC9GC;CACT,GAAG,CAACR,GAAelB,CAAG,CAAC,GAEjB4B,IAAWX,QAAc;EAC7B,IAAIY,EAAU,QAAQ,SAAS,GAAG,OAAO,CAAC,GAAGA,EAAU,OAAO,CAAC,CAAC;EAChE,IAAIA,EAAU,QAAQ,SAAS,GAAG,OAAO,CAAC,GAAGA,EAAU,OAAO,CAAC,CAAC;EAChE,IAAIA,EAAU,QAAQ,SAAS,GAAG,OAAO,CAAC,GAAGA,EAAU,OAAO,CAAC,CAAC;CAElE,GAAG,CAACA,CAAS,CAAC,GAERC,IAAkBb,QAAc;EACpC,IAAMc,IAA2B;GAAC;GAAU;GAAU;EAAQ;EAC9D,KAAK,IAAMrD,KAAKwC,EAAc,OAE5B,CADIxC,EAAE,SAAS,eAAeA,EAAE,SAAS,mBAAmBA,EAAE,KAAK,YAASqD,EAAI,KAAKrD,EAAE,EAAE,GACrFA,EAAE,KAAK,iBAAeqD,EAAI,KAAKrD,EAAE,EAAE;EAEzC,IAAIkD,GAAU;GACZ,IAAM7D,IAAOmD,EAAc,MAAM,MAAK,MAAKxC,EAAE,OAAOkD,CAAQ;GAC5D,IAAI7D,GAAM,UAAU;IAClB,IAAIiE,IAA0BjE,EAAK;IACnC,OAAOiE,IAGL,AAFAD,EAAI,KAAKC,CAAG,GAEZ,IADed,EAAc,MAAM,MAAK,MAAKxC,EAAE,OAAOsD,CAChD,CAAA,EAAQ;GAElB;GACA,IAAMC,IAAOf,EAAc,MAAM,MAAK,MAAKrC,EAAE,OAAO+C,CAAQ;GAC5D,AAAIK,GAAM,YAAUF,EAAI,KAAKE,EAAK,QAAQ;EAC5C;EACA,OAAOF;CACT,GAAG;EAACb,EAAc;EAAOA,EAAc;EAAOU;CAAQ,CAAC,GAEjDM,IAAkBC,GAAa,MAAmB;EACtD,IAAMC,IAAK,OAAOrE,EAAK,EAAE;EACzB,IAAIqE,EAAG,WAAW,GAAG,GAAG;EAExB,IAAMC,IAAWnB,EAAc,MAAM,MAAK,MAAKxC,EAAE,OAAO0D,CAAE,GACpDE,IAAWpB,EAAc,MAAM,MAAK,MAAK,EAAE,OAAOkB,CAAE,GACpDG,IAAWrB,EAAc,MAAM,MAAK,MAAKrC,EAAE,OAAOuD,CAAE;EAQ1D,IANAI,EAAa;GACX,SAASH,oBAAW,IAAI,IAAI,CAACD,CAAE,CAAC,oBAAI,IAAI,IAAI;GAC5C,SAASE,oBAAW,IAAI,IAAI,CAACF,CAAE,CAAC,oBAAI,IAAI,IAAI;GAC5C,SAASG,oBAAW,IAAI,IAAI,CAACH,CAAE,CAAC,oBAAI,IAAI,IAAI;EAC9C,CAAC,GAEGC,GACF,EAAYA,EAAS,SAAS,GAAGA,EAAS,SAAS,GAAGA,EAAS,OAAOA,EAAS,MAAM;OAChF,IAAIC,GAAU;GACnB,IAAMlB,IAAKF,EAAc,MAAM,MAAK,MAAKxC,EAAE,OAAO4D,EAAS,MAAM,GAC3DjB,IAAKH,EAAc,MAAM,MAAK,MAAKxC,EAAE,OAAO4D,EAAS,MAAM;GACjE,IAAIlB,KAAMC,GAAI;IACZ,IAAMoB,IAAO,KAAK,IAAIrB,EAAG,SAAS,GAAGC,EAAG,SAAS,CAAC,GAC5CqB,IAAO,KAAK,IAAItB,EAAG,SAAS,GAAGC,EAAG,SAAS,CAAC,GAC5CsB,IAAO,KAAK,IAAIvB,EAAG,SAAS,IAAIA,EAAG,OAAOC,EAAG,SAAS,IAAIA,EAAG,KAAK,GAClEuB,IAAO,KAAK,IAAIxB,EAAG,SAAS,IAAIA,EAAG,QAAQC,EAAG,SAAS,IAAIA,EAAG,MAAM;IAC1E,EAAYoB,GAAMC,GAAMC,IAAOF,GAAMG,IAAOF,CAAI;GAClD;EACF,OAAO,IAAIH,KAAYA,EAAS,OAAO,SAAS,GAAG;GACjD,IAAIE,IAAO,UAAUC,IAAO,UAAUC,IAAO,WAAWC,IAAO;GAC/D,KAAK,IAAMvD,KAAKkD,EAAS,QAEK,AAD5B,IAAO,KAAK,IAAIE,GAAMpD,EAAE,CAAC,GAAG,IAAO,KAAK,IAAIqD,GAAMrD,EAAE,CAAC,GACrD,IAAO,KAAK,IAAIsD,GAAMtD,EAAE,CAAC,GAAG,IAAO,KAAK,IAAIuD,GAAMvD,EAAE,CAAC;GAEvD,EAAYoD,IAAO,IAAIC,IAAO,IAAIC,IAAOF,IAAO,IAAIG,IAAOF,IAAO,EAAE;EACtE;CACF,GAAG;EAACxB;EAAesB;EAAcK;CAAW,CAAC,GAEvCC,IAAwBX,GAAa,MAAmB;EAC5D,IAAMC,IAAK,OAAOrE,EAAK,EAAE;EACzB,IAAIqE,EAAG,WAAW,GAAG,GAAG;EACxB,IAAMC,IAAWnB,EAAc,MAAM,MAAK,MAAKxC,EAAE,OAAO0D,CAAE;EAC1D,AAAIC,GAAU,KAAK,iBACjBU,EAAWV,EAAS,KAAK,aAAa;CAE1C,GAAG,CAACnB,EAAc,OAAO6B,CAAU,CAAC,GAE9BC,IAAeC,EAAuB,IAAI;CAWhD,OATAC,QAAgB;EACd,IAAI,CAACtB,KAAY,CAACoB,EAAa,SAAS;EACxC,IAAMG,IAAQ,iBAAiB;GAC7B,IAAMC,IAAKJ,EAAa,SAAS,cAAc,kBAAkBpB,EAAS,GAAG;GAC7E,AAAIwB,KAAIA,EAAG,eAAe;IAAE,OAAO;IAAW,UAAU;GAAS,CAAC;EACpE,GAAG,EAAE;EACL,aAAa,aAAaD,CAAK;CACjC,GAAG,CAACvB,CAAQ,CAAC,GAGX,kBAAC,OAAD;EAAK,KAAKoB;EACR,UAAA,kBAACpF,GAAD;GACE,MAAMoD;GACN,aAAakB;GACb,mBAAmBY;GACnB,cAAclB;GACd,oBAAoBE;GACpB,YAAY;GACZ,eAAe;GACf,UAAA;GACA,UAAA;GACA,QAAQ;EACT,CAAA;CACE,CAAA;AAET"}