dishui 0.0.108 → 0.0.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/dist/.release-verified.json +3 -2
  2. package/dist/components/Accordion/index.js.map +1 -1
  3. package/dist/components/Avatar/index.js.map +1 -1
  4. package/dist/components/Badge/index.js.map +1 -1
  5. package/dist/components/Button/index.js.map +1 -1
  6. package/dist/components/ButtonMenu/index.js.map +1 -1
  7. package/dist/components/Card/Metric2.js.map +1 -1
  8. package/dist/components/Card/Ticket2.js.map +1 -1
  9. package/dist/components/Card/index.js.map +1 -1
  10. package/dist/components/Chart/Chart.js.map +1 -1
  11. package/dist/components/Checkbox/index.js.map +1 -1
  12. package/dist/components/ChoicePicker/index.js.map +1 -1
  13. package/dist/components/Column/index.js.map +1 -1
  14. package/dist/components/ConfirmDialog/index.js.map +1 -1
  15. package/dist/components/DateTimeInput/index.js.map +1 -1
  16. package/dist/components/Demo/index.js.map +1 -1
  17. package/dist/components/Demo/source.js.map +1 -1
  18. package/dist/components/Divider/index.js.map +1 -1
  19. package/dist/components/EmptyState/index.js.map +1 -1
  20. package/dist/components/Field/index.js.map +1 -1
  21. package/dist/components/FileUploader/DropZone.js.map +1 -1
  22. package/dist/components/FileUploader/FileItem.js.map +1 -1
  23. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  24. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  25. package/dist/components/GroupButton/index.js.map +1 -1
  26. package/dist/components/GroupedTable/index.js.map +1 -1
  27. package/dist/components/Icon/index.js.map +1 -1
  28. package/dist/components/Image/index.js.map +1 -1
  29. package/dist/components/Input/index.js.map +1 -1
  30. package/dist/components/Label/index.js.map +1 -1
  31. package/dist/components/Layout/index.js.map +1 -1
  32. package/dist/components/LayoutSuite/DashboardSuite.js.map +1 -1
  33. package/dist/components/LayoutSuite/index.js.map +1 -1
  34. package/dist/components/List/index.js.map +1 -1
  35. package/dist/components/Markdown/Markdown.js.map +1 -1
  36. package/dist/components/Markdown/codeThemes.js.map +1 -1
  37. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  38. package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
  39. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  40. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  41. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  42. package/dist/components/Modal/focusScope.js.map +1 -1
  43. package/dist/components/Modal/index.js.map +1 -1
  44. package/dist/components/MultipleChoice/index.js.map +1 -1
  45. package/dist/components/NavigationList/index.js.map +1 -1
  46. package/dist/components/Page/Float2.js.map +1 -1
  47. package/dist/components/Page/index.js.map +1 -1
  48. package/dist/components/Page/resize2.js.map +1 -1
  49. package/dist/components/PageHeader/index.js.map +1 -1
  50. package/dist/components/PagePanel/index.js.map +1 -1
  51. package/dist/components/ProtectedRoute/index.js.map +1 -1
  52. package/dist/components/Resizable/ResizeGrip.js.map +1 -1
  53. package/dist/components/Resizable/index.js.map +1 -1
  54. package/dist/components/Resizable/useResize.js.map +1 -1
  55. package/dist/components/Row/index.js.map +1 -1
  56. package/dist/components/Section/index.js.map +1 -1
  57. package/dist/components/Select/index.js.map +1 -1
  58. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  59. package/dist/components/Skeleton/index.js.map +1 -1
  60. package/dist/components/Slider/index.js.map +1 -1
  61. package/dist/components/Switch/index.js.map +1 -1
  62. package/dist/components/Tab/index.js.map +1 -1
  63. package/dist/components/Table/index.js.map +1 -1
  64. package/dist/components/Tabs/index.js.map +1 -1
  65. package/dist/components/Tabs/tabNavigation.js.map +1 -1
  66. package/dist/components/Text/index.js.map +1 -1
  67. package/dist/components/Textarea/index.js.map +1 -1
  68. package/dist/components/Tooltip/index.js.map +1 -1
  69. package/dist/components/Tree/Tree.js.map +1 -1
  70. package/dist/components/ai/AgentChat/index.js.map +1 -1
  71. package/dist/components/ai/AgentRunCard/index.js.map +1 -1
  72. package/dist/components/ai/AgentScreen/index.js.map +1 -1
  73. package/dist/components/ai/ApprovalCard/index.js.map +1 -1
  74. package/dist/components/ai/CodeView/index.js.map +1 -1
  75. package/dist/components/ai/CommandSearch/index.js.map +1 -1
  76. package/dist/components/ai/ContextCards/index.js.map +1 -1
  77. package/dist/components/ai/DiffTable/index.js.map +1 -1
  78. package/dist/components/ai/FilterTable/index.js.map +1 -1
  79. package/dist/components/ai/FineTuneCard/index.js.map +1 -1
  80. package/dist/components/ai/InsightCards/index.js.map +1 -1
  81. package/dist/components/ai/IssueCard/index.js.map +1 -1
  82. package/dist/components/ai/LoadingState/index.js.map +1 -1
  83. package/dist/components/ai/PromptBar/index.js.map +1 -1
  84. package/dist/components/ai/RecommendationCard/index.js.map +1 -1
  85. package/dist/components/ai/RecordsTable/index.js.map +1 -1
  86. package/dist/components/ai/SelectionActions/index.js.map +1 -1
  87. package/dist/components/ai/StateFlow/index.js.map +1 -1
  88. package/dist/components/ai/StreamingText/index.js.map +1 -1
  89. package/dist/components/ai/TaskRows/index.js.map +1 -1
  90. package/dist/components/ai/Thinking/index.js.map +1 -1
  91. package/dist/components/ai/ToolChips/index.js.map +1 -1
  92. package/dist/components/ai/shared.js.map +1 -1
  93. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  94. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  95. package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
  96. package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
  97. package/dist/components/pro/Calendar/Calendar.js +165 -160
  98. package/dist/components/pro/Calendar/Calendar.js.map +1 -1
  99. package/dist/components/pro/Calendar/hooks/useCalendarDrag.js.map +1 -1
  100. package/dist/components/pro/Calendar/hooks/useCalendarState.js +31 -31
  101. package/dist/components/pro/Calendar/hooks/useCalendarState.js.map +1 -1
  102. package/dist/components/pro/Calendar/utils.js.map +1 -1
  103. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  104. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  105. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
  106. package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
  107. package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
  108. package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
  109. package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
  110. package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
  111. package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
  112. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  113. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +65 -59
  114. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  115. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  116. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  117. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  118. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  119. package/dist/components/pro/CodeEditor/utils.js.map +1 -1
  120. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  121. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  122. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  123. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  124. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  125. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  126. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  127. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  128. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  129. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  130. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  131. package/dist/components/pro/DataTable/extension.js.map +1 -1
  132. package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
  133. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  134. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  135. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  136. package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
  137. package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
  138. package/dist/components/pro/DataTable/useDataTableModel.js +119 -104
  139. package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -1
  140. package/dist/components/pro/DataTable/utils.js.map +1 -1
  141. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  142. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  143. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  144. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  145. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  146. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  147. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  148. package/dist/components/pro/Flow/Flow.js.map +1 -1
  149. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  150. package/dist/components/pro/Flow/archify/build.js.map +1 -1
  151. package/dist/components/pro/Flow/archify/convert.js.map +1 -1
  152. package/dist/components/pro/Flow/archify/palette.js.map +1 -1
  153. package/dist/components/pro/Flow/archify/presets.js.map +1 -1
  154. package/dist/components/pro/Flow/archify/spec.js.map +1 -1
  155. package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
  156. package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
  157. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
  158. package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
  159. package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
  160. package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
  161. package/dist/components/pro/Flow/constants.js.map +1 -1
  162. package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
  163. package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
  164. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  165. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  166. package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
  167. package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
  168. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
  169. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  170. package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
  171. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  172. package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
  173. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  174. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  175. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
  176. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  177. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  178. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  179. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  180. package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
  181. package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
  182. package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
  183. package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
  184. package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
  185. package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
  186. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  187. package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
  188. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  189. package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
  190. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  191. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  192. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  193. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  194. package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
  195. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  196. package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
  197. package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
  198. package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
  199. package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -1
  200. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  201. package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -1
  202. package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
  203. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  204. package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
  205. package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
  206. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  207. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  208. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  209. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  210. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  211. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  212. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  213. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  214. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  215. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  216. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  217. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  218. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  219. package/dist/components/pro/Flow/types.js.map +1 -1
  220. package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
  221. package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
  222. package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
  223. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  224. package/dist/components/pro/Gantt/Gantt.js.map +1 -1
  225. package/dist/components/pro/Gantt/hooks/useGanttDrag.js.map +1 -1
  226. package/dist/components/pro/Gantt/hooks/useGanttState.js +79 -71
  227. package/dist/components/pro/Gantt/hooks/useGanttState.js.map +1 -1
  228. package/dist/components/pro/Gantt/utils.js.map +1 -1
  229. package/dist/components/pro/Kanban/Kanban.js.map +1 -1
  230. package/dist/components/pro/Kanban/Swimlanes.js.map +1 -1
  231. package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -1
  232. package/dist/components/pro/Kanban/utils.js.map +1 -1
  233. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  234. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  235. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  236. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  237. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  238. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  239. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  240. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  241. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  242. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  243. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  244. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  245. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  246. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  247. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  248. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  249. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
  250. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  251. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  252. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  253. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  254. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  255. package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
  256. package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
  257. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  258. package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
  259. package/dist/components/pro/Sprite/Molly/animations.js +52 -0
  260. package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
  261. package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
  262. package/dist/components/pro/Sprite/Molly/events.js +46 -0
  263. package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
  264. package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
  265. package/dist/components/pro/Sprite/Molly/index.js +12 -0
  266. package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
  267. package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
  268. package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
  269. package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
  270. package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
  271. package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
  272. package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
  273. package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
  274. package/dist/components/pro/Sprite/Molly/model.js +614 -0
  275. package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
  276. package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
  277. package/dist/components/pro/Sprite/Molly/rig.js +102 -0
  278. package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
  279. package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
  280. package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
  281. package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
  282. package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
  283. package/dist/components/pro/Sprite/Ruby/events.js +46 -0
  284. package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
  285. package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
  286. package/dist/components/pro/Sprite/Ruby/index.js +12 -0
  287. package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
  288. package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
  289. package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
  290. package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
  291. package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
  292. package/dist/components/pro/Sprite/Ruby/model.js +605 -0
  293. package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
  294. package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
  295. package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
  296. package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
  297. package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
  298. package/dist/components/pro/Sprite/Sprite2.js +224 -0
  299. package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
  300. package/dist/components/pro/Sprite/actions.d.ts +3 -0
  301. package/dist/components/pro/Sprite/actions.js +16 -0
  302. package/dist/components/pro/Sprite/actions.js.map +1 -0
  303. package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
  304. package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
  305. package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
  306. package/dist/components/pro/Sprite/index.d.ts +4 -0
  307. package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
  308. package/dist/components/pro/Sprite/shared/animation.js +39 -0
  309. package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
  310. package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
  311. package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
  312. package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
  313. package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
  314. package/dist/components/pro/Sprite/shared/events.js +21 -0
  315. package/dist/components/pro/Sprite/shared/events.js.map +1 -0
  316. package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
  317. package/dist/components/pro/Sprite/shared/face.js +33 -0
  318. package/dist/components/pro/Sprite/shared/face.js.map +1 -0
  319. package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
  320. package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
  321. package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
  322. package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
  323. package/dist/components/pro/Sprite/shared/gait.js +19 -0
  324. package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
  325. package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
  326. package/dist/components/pro/Sprite/shared/geometry.js +59 -0
  327. package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
  328. package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
  329. package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
  330. package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
  331. package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
  332. package/dist/components/pro/Sprite/shared/playback.js +74 -0
  333. package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
  334. package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
  335. package/dist/components/pro/Sprite/shared/rig.js +48 -0
  336. package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
  337. package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
  338. package/dist/components/pro/Sprite/shared/scene.js +21 -0
  339. package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
  340. package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
  341. package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
  342. package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
  343. package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
  344. package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
  345. package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
  346. package/dist/components/pro/Sprite/types.d.ts +40 -0
  347. package/dist/contexts/AppContext.js.map +1 -1
  348. package/dist/contexts/authentication.js.map +1 -1
  349. package/dist/data-table.js +3 -3
  350. package/dist/data-table.js.map +1 -1
  351. package/dist/dishui.css +1 -1
  352. package/dist/hooks/useClickOutside.js.map +1 -1
  353. package/dist/hooks/useContainerElement.js.map +1 -1
  354. package/dist/hooks/useControllableState.js.map +1 -1
  355. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  356. package/dist/hooks/useDebounce.js.map +1 -1
  357. package/dist/hooks/useDraggable.js.map +1 -1
  358. package/dist/hooks/useTableColumns.js.map +1 -1
  359. package/dist/hooks/useTableData.js.map +1 -1
  360. package/dist/index-nostyled.d.ts +2 -0
  361. package/dist/index.d.ts +2 -0
  362. package/dist/index.js +116 -115
  363. package/dist/layouts/MainLayout.js.map +1 -1
  364. package/dist/layouts/Navbar.js.map +1 -1
  365. package/dist/layouts/Sidebar.js.map +1 -1
  366. package/dist/layouts/headbar/Headbar.js.map +1 -1
  367. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  368. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  369. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  370. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  371. package/dist/sprite.js +2 -0
  372. package/dist/styles/themeStyles.js.map +1 -1
  373. package/dist/utils/cn.js.map +1 -1
  374. package/dist/utils/flexLayout.js.map +1 -1
  375. package/dist/utils/i18n.js.map +1 -1
  376. package/dist/utils/menu.js.map +1 -1
  377. package/dist/utils/rehype-code-meta.js.map +1 -1
  378. package/dist/utils/remark-code-meta.js.map +1 -1
  379. package/dist/utils/routerBuilder.js.map +1 -1
  380. package/dist/utils/safeStorage.js.map +1 -1
  381. package/dist/utils/selection.js +29 -20
  382. package/dist/utils/selection.js.map +1 -1
  383. package/dist/utils/themes.js.map +1 -1
  384. package/package.json +15 -11
@@ -1 +1 @@
1
- {"version":3,"file":"AppContext.js","names":[],"sources":["../../src/contexts/AppContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useState, useEffect } from 'react';\nimport { RouterProvider } from '@tanstack/react-router';\nimport { Router } from '@tanstack/react-router';\nimport Sidebar from '../layouts/Sidebar';\nimport { Headbar } from '../layouts/headbar';\nimport type { SearchConfig } from '../layouts/headbar';\nimport { Outlet } from '@tanstack/react-router';\nimport { MenuItem } from '../types/menu';\nimport { ThemeConfig } from '../utils/themes';\nimport { MobileSidebarToggleButton } from '../components/SidebarToggleButton';\nimport { readStoredJSON, writeStoredJSON, safeStorage } from '../utils/safeStorage';\nimport { isUser, readStoredUser, requiresAuthentication } from './authentication';\n\n// 主题类型\nexport type ThemeType = 'light' | 'dark' | 'cursor' | 'retro' | 'cyberpunk' | 'matrix' | 'oceanblue' | 'eyecare' | 'ghibli' | 'pinkgirl' | 'mintgirl' | 'wuxing' | 'jukebox';\n\n// 用户类型定义\nexport type User = {\n id: string;\n name: string;\n email: string;\n roles: string[];\n};\n\n// 认证上下文类型\nexport type AuthContextType = {\n user: User | null;\n isAuthenticated: boolean;\n login: (user: User) => void;\n logout: () => void;\n hasRole: (role: string) => boolean;\n hasAnyRole: (roles: string[]) => boolean;\n};\n\n// 应用上下文类型\nexport type AppContextType = {\n title?: string;\n language: 'zh' | 'en';\n theme: ThemeType;\n setLanguage: (lang: 'zh' | 'en') => void;\n setTheme: (theme: ThemeType) => void;\n auth: AuthContextType;\n menuItems?: MenuItem[];\n getMenuItems?: (language: 'zh' | 'en') => MenuItem[];\n themes?: ThemeConfig[];\n sidebarWidth?: number;\n sidebarCollapsedWidth?: number;\n navbarHeight?: number;\n};\n\nconst AppContext = createContext<AppContextType | undefined>(undefined);\n\nexport const useAppContext = () => {\n const context = useContext(AppContext);\n if (!context) {\n throw new Error('useAppContext must be used within an AppShell');\n }\n return context;\n};\n\n// 导出独立的认证 hook\nexport const useAuth = () => {\n const context = useAppContext();\n return context.auth;\n};\n\n// AppShell 配置类型\nexport type AppShellConfig = {\n title?: string;\n initialLang?: 'zh' | 'en';\n initialTheme?: ThemeType;\n menuItems?: MenuItem[];\n getMenuItems?: (language: 'zh' | 'en') => MenuItem[];\n themes?: ThemeConfig[];\n /** Enables client auth state and navigation notifications, not loader protection. Use route beforeLoad for loaders. */\n enableAuth?: boolean;\n onAuthRequired?: () => boolean | void;\n protectedRoutes?: string[];\n publicRoutes?: string[];\n loginUrl?: string;\n authFailedCallback?: (path: string, loginUrl: string) => void;\n /** 布局模式: 'sidebar'(默认,顶栏+侧边栏) | 'topbar'(仅顶栏,无侧边栏) */\n layout?: 'sidebar' | 'topbar';\n sidebarWidth?: number;\n sidebarCollapsedWidth?: number;\n navbarHeight?: number; // Navbar 高度(像素),默认 64px\n searchConfig?: SearchConfig;\n /** Headbar 左侧插槽(传入 ReactNode 或接收 toggleSidebar 的渲染函数) */\n headbarLeft?: React.ReactNode | ((toggleSidebar: () => void) => React.ReactNode);\n /** Headbar 中间插槽 */\n headbarMiddle?: React.ReactNode;\n /** Headbar 右侧插槽 */\n headbarRight?: React.ReactNode;\n};\n\n// 全局配置存储\nlet globalConfig: AppShellConfig = {};\n\n// 导出的布局包装器组件 - 用于路由\nexport const AppLayoutWrapper: React.FC = () => {\n const { title, language, theme, menuItems, getMenuItems, themes, sidebarWidth: configSidebarWidth, sidebarCollapsedWidth, navbarHeight: configNavbarHeight } = useAppContext();\n\n // 从 localStorage 读取侧边栏折叠状态\n const [sidebarCollapsed, setSidebarCollapsed] = useState(() =>\n readStoredJSON('sidebar-collapsed', (value): value is boolean => typeof value === 'boolean', false)\n );\n\n const [sidebarWidth, setSidebarWidth] = useState(configSidebarWidth || 280);\n const sidebarRef = React.useRef<HTMLDivElement>(null);\n\n // 窄屏(手机)适配:内容留白收窄,侧边栏默认折叠,用户可手动展开\n const [narrowViewport, setNarrowViewport] = useState(() => typeof window !== 'undefined' && window.innerWidth < 768);\n // null = 未手动干预,跟随默认规则(窄屏折叠 / 桌面跟随保存的偏好)\n const [sidebarUserOverride, setSidebarUserOverride] = useState<boolean | null>(null);\n\n useEffect(() => {\n const onResize = () => setNarrowViewport(window.innerWidth < 768);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n // 当配置的 sidebarWidth 改变时,更新本地 state\n React.useEffect(() => {\n if (configSidebarWidth) {\n setSidebarWidth(configSidebarWidth);\n }\n }, [configSidebarWidth]);\n\n // 保存侧边栏折叠状态到 localStorage\n React.useEffect(() => {\n writeStoredJSON('sidebar-collapsed', sidebarCollapsed);\n }, [sidebarCollapsed]);\n\n const effectiveSidebarCollapsed = sidebarUserOverride ?? (narrowViewport || sidebarCollapsed);\n\n const toggleSidebar = () => {\n const collapsed = !effectiveSidebarCollapsed;\n setSidebarUserOverride(collapsed);\n setSidebarCollapsed(collapsed);\n };\n\n const contentPaddingX = narrowViewport ? 16 : 128;\n\n const handleSidebarWidthChange = (width: number) => {\n setSidebarWidth(width);\n };\n\n const navbarHeight = configNavbarHeight || 64; // 默认 64px\n const layout = globalConfig.layout || 'sidebar';\n\n // 解析 headbar 插槽:支持 ReactNode 或渲染函数\n const headbarLeftConfig = globalConfig.headbarLeft;\n const resolvedLeft = typeof headbarLeftConfig === 'function'\n ? headbarLeftConfig(toggleSidebar)\n : headbarLeftConfig;\n\n // topbar 模式:仅顶部导航,无侧边栏\n if (layout === 'topbar') {\n return (\n <div className=\"h-screen flex flex-col bg-base-100\" data-theme={theme}>\n <div style={{ height: `${navbarHeight}px`, flexShrink: 0 }}>\n <Headbar\n left={resolvedLeft}\n middle={globalConfig.headbarMiddle}\n right={globalConfig.headbarRight}\n height={navbarHeight}\n />\n </div>\n <main className=\"flex-1 overflow-y-auto\" style={{ paddingLeft: `${contentPaddingX}px`, paddingRight: `${contentPaddingX}px`, paddingTop: '16px', paddingBottom: '16px' }}>\n <Outlet />\n </main>\n </div>\n );\n }\n\n // sidebar 模式(默认):顶栏 + 侧边栏\n return (\n <div className=\"h-screen flex flex-col bg-base-100\" data-theme={theme}>\n {/* 固定高度的 Headbar */}\n <div style={{ height: `${navbarHeight}px`, flexShrink: 0 }}>\n <Headbar\n left={resolvedLeft}\n middle={globalConfig.headbarMiddle}\n right={globalConfig.headbarRight}\n height={navbarHeight}\n />\n </div>\n\n {/* Sidebar 和 Content 区域 - 独立滚动 */}\n <div className=\"flex flex-1 overflow-hidden\" style={{ height: `calc(100vh - ${navbarHeight}px)` }}>\n {/* Sidebar - 独立滚动(overflow visible 以允许右边缘 pill 轻微越界) */}\n <div\n className=\"flex-shrink-0\"\n ref={sidebarRef}\n style={{ height: '100%', overflow: 'visible' }}\n >\n <Sidebar\n isCollapsed={effectiveSidebarCollapsed}\n language={language}\n items={menuItems}\n getMenuItems={getMenuItems}\n onWidthChange={handleSidebarWidthChange}\n onToggle={toggleSidebar}\n initialWidth={sidebarWidth}\n collapsedWidth={sidebarCollapsedWidth || 64}\n />\n </div>\n\n {/* Content - 独立滚动 */}\n <main className=\"flex-1 overflow-y-auto\" style={{ height: '100%', paddingLeft: `${contentPaddingX}px`, paddingRight: `${contentPaddingX}px`, paddingTop: '16px', paddingBottom: '16px' }}>\n <Outlet />\n </main>\n\n {/* 侧边栏切换控件:桌面端 pill 已由 Sidebar 内部渲染,此处仅保留移动端按钮 */}\n <MobileSidebarToggleButton\n isCollapsed={effectiveSidebarCollapsed}\n onToggle={toggleSidebar}\n />\n </div>\n </div>\n );\n};\n\n// AppShell 属性类型\nexport type AppShellProps = {\n router?: Router<any, any>;\n children?: React.ReactNode;\n} & AppShellConfig;\n\n// AppShell 主组件\nexport const AppShell: React.FC<AppShellProps> = ({\n router,\n children,\n title = 'DiShUI',\n initialLang,\n initialTheme,\n menuItems,\n getMenuItems,\n themes,\n enableAuth = false,\n onAuthRequired,\n protectedRoutes = [],\n publicRoutes = ['/login', '/register'],\n loginUrl = '/login',\n authFailedCallback,\n layout = 'sidebar',\n sidebarWidth = 280,\n sidebarCollapsedWidth = 64,\n navbarHeight = 64,\n searchConfig,\n headbarLeft,\n headbarMiddle,\n headbarRight,\n}) => {\n // 保存全局配置\n globalConfig = {\n title,\n initialLang,\n initialTheme,\n menuItems,\n getMenuItems,\n themes,\n enableAuth,\n onAuthRequired,\n protectedRoutes,\n publicRoutes,\n loginUrl,\n authFailedCallback,\n layout,\n sidebarWidth,\n sidebarCollapsedWidth,\n navbarHeight,\n searchConfig,\n headbarLeft,\n headbarMiddle,\n headbarRight,\n };\n\n // 语言状态管理\n const [language, setLanguage] = useState<'zh' | 'en'>(() => {\n const savedLanguage = safeStorage.getItem('app-language');\n if (savedLanguage === 'zh' || savedLanguage === 'en') return savedLanguage;\n return initialLang || 'zh';\n });\n\n // 主题状态管理\n const [theme, setTheme] = useState<ThemeType>(() => {\n const savedTheme = safeStorage.getItem('app-theme');\n const validThemes: ThemeType[] = ['light', 'dark', 'cursor', 'retro', 'cyberpunk', 'matrix', 'oceanblue', 'eyecare', 'ghibli', 'pinkgirl', 'mintgirl', 'wuxing', 'jukebox'];\n if (savedTheme && validThemes.includes(savedTheme as ThemeType)) {\n return savedTheme as ThemeType;\n }\n return initialTheme || 'light';\n });\n\n // 用户认证状态管理\n const [user, setUser] = useState<User | null>(() => {\n if (!enableAuth) return null;\n return readStoredUser();\n });\n\n // Navigation can happen synchronously after login/logout, before React commits.\n const authUserRef = React.useRef(user);\n const lastAuthFailure = React.useRef<string | null>(null);\n\n // 保存语言设置\n useEffect(() => {\n safeStorage.setItem('app-language', language);\n }, [language]);\n\n // 保存主题设置\n useEffect(() => {\n safeStorage.setItem('app-theme', theme);\n if (typeof document !== 'undefined') document.documentElement.setAttribute('data-theme', theme);\n }, [theme]);\n\n // 保存用户信息\n useEffect(() => {\n if (enableAuth) {\n if (user) {\n writeStoredJSON('app-user', user);\n } else {\n safeStorage.removeItem('app-user');\n }\n }\n }, [user, enableAuth]);\n\n // 认证方法\n const login = (newUser: User) => {\n if (!isUser(newUser)) throw new TypeError('Invalid user: expected id, name, email and string roles');\n authUserRef.current = newUser;\n lastAuthFailure.current = null;\n setUser(newUser);\n if (enableAuth) writeStoredJSON('app-user', newUser);\n };\n\n const logout = () => {\n authUserRef.current = null;\n setUser(null);\n safeStorage.removeItem('app-user');\n };\n\n const hasRole = (role: string): boolean => {\n return user?.roles.includes(role) || false;\n };\n\n const hasAnyRole = (roles: string[]): boolean => {\n return roles.some(role => user?.roles.includes(role)) || false;\n };\n\n // UX notification only: router events cannot cancel/await loaders. Install native\n // beforeLoad guards when constructing protected routes, including preload paths.\n useEffect(() => {\n if (!enableAuth || !router) {\n lastAuthFailure.current = null;\n return;\n }\n\n const checkAuthentication = (pathname: string, currentUser = authUserRef.current) => {\n if (currentUser || !requiresAuthentication(pathname, protectedRoutes, publicRoutes)) {\n lastAuthFailure.current = null;\n return;\n }\n // Inline configuration arrays/callbacks and StrictMode must not repeat a notification.\n if (lastAuthFailure.current === pathname) return;\n lastAuthFailure.current = pathname;\n\n // Keep the existing contract: true means the caller handled the auth requirement.\n if (onAuthRequired?.()) return;\n if (authFailedCallback) {\n authFailedCallback(pathname, loginUrl);\n } else if (typeof window !== 'undefined') {\n window.location.href = loginUrl;\n }\n };\n\n const unsubscribe = router.subscribe('onBeforeLoad', ({ toLocation }) => {\n checkAuthentication(toLocation.pathname);\n });\n // Covers the initial visit and auth changes without a pathname change (logout).\n checkAuthentication(router.state.location.pathname, user);\n return unsubscribe;\n }, [enableAuth, user, router, protectedRoutes, publicRoutes, onAuthRequired, loginUrl, authFailedCallback]);\n\n const authContext: AuthContextType = {\n user,\n isAuthenticated: !!user,\n login,\n logout,\n hasRole,\n hasAnyRole,\n };\n\n const value: AppContextType = {\n title,\n language,\n theme,\n setLanguage,\n setTheme,\n auth: authContext,\n menuItems,\n getMenuItems,\n themes,\n sidebarWidth,\n sidebarCollapsedWidth,\n navbarHeight,\n };\n\n return (\n <AppContext.Provider value={value}>\n {router ? (\n children || <RouterProvider router={router} />\n ) : (\n children\n )}\n </AppContext.Provider>\n );\n};\n\n// 保持向后兼容的 AppProvider 别名\nexport const AppProvider = AppShell;\n\nexport default AppShell;\n"],"mappings":"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"}
1
+ {"version":3,"file":"AppContext.js","names":["Sidebar","Headbar","React","AppContext","createContext","useAppContext","context","useContext","useAuth","globalConfig","AppLayoutWrapper","configSidebarWidth","configNavbarHeight","sidebarCollapsed","setSidebarCollapsed","useState","readStoredJSON","value","sidebarWidth","setSidebarWidth","sidebarRef","narrowViewport","setNarrowViewport","sidebarUserOverride","setSidebarUserOverride","useEffect","onResize","effectiveSidebarCollapsed","toggleSidebar","collapsed","contentPaddingX","handleSidebarWidthChange","width","navbarHeight","layout","headbarLeftConfig","resolvedLeft","theme","Outlet","menuItems","sidebarCollapsedWidth","MobileSidebarToggleButton","AppShell","language","setLanguage","savedLanguage","safeStorage","initialLang","setTheme","savedTheme","initialTheme","user","setUser","enableAuth","readStoredUser","authUserRef","lastAuthFailure","writeStoredJSON","login","isUser","newUser","logout","hasRole","role","hasAnyRole","roles","router","checkAuthentication","currentUser","requiresAuthentication","pathname","protectedRoutes","publicRoutes","authFailedCallback","loginUrl","unsubscribe","toLocation","onAuthRequired","children","RouterProvider","AppProvider"],"sources":["../../src/contexts/AppContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useState, useEffect } from 'react';\nimport { RouterProvider } from '@tanstack/react-router';\nimport { Router } from '@tanstack/react-router';\nimport Sidebar from '../layouts/Sidebar';\nimport { Headbar } from '../layouts/headbar';\nimport type { SearchConfig } from '../layouts/headbar';\nimport { Outlet } from '@tanstack/react-router';\nimport { MenuItem } from '../types/menu';\nimport { ThemeConfig } from '../utils/themes';\nimport { MobileSidebarToggleButton } from '../components/SidebarToggleButton';\nimport { readStoredJSON, writeStoredJSON, safeStorage } from '../utils/safeStorage';\nimport { isUser, readStoredUser, requiresAuthentication } from './authentication';\n\n// 主题类型\nexport type ThemeType = 'light' | 'dark' | 'cursor' | 'retro' | 'cyberpunk' | 'matrix' | 'oceanblue' | 'eyecare' | 'ghibli' | 'pinkgirl' | 'mintgirl' | 'wuxing' | 'jukebox';\n\n// 用户类型定义\nexport type User = {\n id: string;\n name: string;\n email: string;\n roles: string[];\n};\n\n// 认证上下文类型\nexport type AuthContextType = {\n user: User | null;\n isAuthenticated: boolean;\n login: (user: User) => void;\n logout: () => void;\n hasRole: (role: string) => boolean;\n hasAnyRole: (roles: string[]) => boolean;\n};\n\n// 应用上下文类型\nexport type AppContextType = {\n title?: string;\n language: 'zh' | 'en';\n theme: ThemeType;\n setLanguage: (lang: 'zh' | 'en') => void;\n setTheme: (theme: ThemeType) => void;\n auth: AuthContextType;\n menuItems?: MenuItem[];\n getMenuItems?: (language: 'zh' | 'en') => MenuItem[];\n themes?: ThemeConfig[];\n sidebarWidth?: number;\n sidebarCollapsedWidth?: number;\n navbarHeight?: number;\n};\n\nconst AppContext = createContext<AppContextType | undefined>(undefined);\n\nexport const useAppContext = () => {\n const context = useContext(AppContext);\n if (!context) {\n throw new Error('useAppContext must be used within an AppShell');\n }\n return context;\n};\n\n// 导出独立的认证 hook\nexport const useAuth = () => {\n const context = useAppContext();\n return context.auth;\n};\n\n// AppShell 配置类型\nexport type AppShellConfig = {\n title?: string;\n initialLang?: 'zh' | 'en';\n initialTheme?: ThemeType;\n menuItems?: MenuItem[];\n getMenuItems?: (language: 'zh' | 'en') => MenuItem[];\n themes?: ThemeConfig[];\n /** Enables client auth state and navigation notifications, not loader protection. Use route beforeLoad for loaders. */\n enableAuth?: boolean;\n onAuthRequired?: () => boolean | void;\n protectedRoutes?: string[];\n publicRoutes?: string[];\n loginUrl?: string;\n authFailedCallback?: (path: string, loginUrl: string) => void;\n /** 布局模式: 'sidebar'(默认,顶栏+侧边栏) | 'topbar'(仅顶栏,无侧边栏) */\n layout?: 'sidebar' | 'topbar';\n sidebarWidth?: number;\n sidebarCollapsedWidth?: number;\n navbarHeight?: number; // Navbar 高度(像素),默认 64px\n searchConfig?: SearchConfig;\n /** Headbar 左侧插槽(传入 ReactNode 或接收 toggleSidebar 的渲染函数) */\n headbarLeft?: React.ReactNode | ((toggleSidebar: () => void) => React.ReactNode);\n /** Headbar 中间插槽 */\n headbarMiddle?: React.ReactNode;\n /** Headbar 右侧插槽 */\n headbarRight?: React.ReactNode;\n};\n\n// 全局配置存储\nlet globalConfig: AppShellConfig = {};\n\n// 导出的布局包装器组件 - 用于路由\nexport const AppLayoutWrapper: React.FC = () => {\n const { title, language, theme, menuItems, getMenuItems, themes, sidebarWidth: configSidebarWidth, sidebarCollapsedWidth, navbarHeight: configNavbarHeight } = useAppContext();\n\n // 从 localStorage 读取侧边栏折叠状态\n const [sidebarCollapsed, setSidebarCollapsed] = useState(() =>\n readStoredJSON('sidebar-collapsed', (value): value is boolean => typeof value === 'boolean', false)\n );\n\n const [sidebarWidth, setSidebarWidth] = useState(configSidebarWidth || 280);\n const sidebarRef = React.useRef<HTMLDivElement>(null);\n\n // 窄屏(手机)适配:内容留白收窄,侧边栏默认折叠,用户可手动展开\n const [narrowViewport, setNarrowViewport] = useState(() => typeof window !== 'undefined' && window.innerWidth < 768);\n // null = 未手动干预,跟随默认规则(窄屏折叠 / 桌面跟随保存的偏好)\n const [sidebarUserOverride, setSidebarUserOverride] = useState<boolean | null>(null);\n\n useEffect(() => {\n const onResize = () => setNarrowViewport(window.innerWidth < 768);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n\n // 当配置的 sidebarWidth 改变时,更新本地 state\n React.useEffect(() => {\n if (configSidebarWidth) {\n setSidebarWidth(configSidebarWidth);\n }\n }, [configSidebarWidth]);\n\n // 保存侧边栏折叠状态到 localStorage\n React.useEffect(() => {\n writeStoredJSON('sidebar-collapsed', sidebarCollapsed);\n }, [sidebarCollapsed]);\n\n const effectiveSidebarCollapsed = sidebarUserOverride ?? (narrowViewport || sidebarCollapsed);\n\n const toggleSidebar = () => {\n const collapsed = !effectiveSidebarCollapsed;\n setSidebarUserOverride(collapsed);\n setSidebarCollapsed(collapsed);\n };\n\n const contentPaddingX = narrowViewport ? 16 : 128;\n\n const handleSidebarWidthChange = (width: number) => {\n setSidebarWidth(width);\n };\n\n const navbarHeight = configNavbarHeight || 64; // 默认 64px\n const layout = globalConfig.layout || 'sidebar';\n\n // 解析 headbar 插槽:支持 ReactNode 或渲染函数\n const headbarLeftConfig = globalConfig.headbarLeft;\n const resolvedLeft = typeof headbarLeftConfig === 'function'\n ? headbarLeftConfig(toggleSidebar)\n : headbarLeftConfig;\n\n // topbar 模式:仅顶部导航,无侧边栏\n if (layout === 'topbar') {\n return (\n <div className=\"h-screen flex flex-col bg-base-100\" data-theme={theme}>\n <div style={{ height: `${navbarHeight}px`, flexShrink: 0 }}>\n <Headbar\n left={resolvedLeft}\n middle={globalConfig.headbarMiddle}\n right={globalConfig.headbarRight}\n height={navbarHeight}\n />\n </div>\n <main className=\"flex-1 overflow-y-auto\" style={{ paddingLeft: `${contentPaddingX}px`, paddingRight: `${contentPaddingX}px`, paddingTop: '16px', paddingBottom: '16px' }}>\n <Outlet />\n </main>\n </div>\n );\n }\n\n // sidebar 模式(默认):顶栏 + 侧边栏\n return (\n <div className=\"h-screen flex flex-col bg-base-100\" data-theme={theme}>\n {/* 固定高度的 Headbar */}\n <div style={{ height: `${navbarHeight}px`, flexShrink: 0 }}>\n <Headbar\n left={resolvedLeft}\n middle={globalConfig.headbarMiddle}\n right={globalConfig.headbarRight}\n height={navbarHeight}\n />\n </div>\n\n {/* Sidebar 和 Content 区域 - 独立滚动 */}\n <div className=\"flex flex-1 overflow-hidden\" style={{ height: `calc(100vh - ${navbarHeight}px)` }}>\n {/* Sidebar - 独立滚动(overflow visible 以允许右边缘 pill 轻微越界) */}\n <div\n className=\"flex-shrink-0\"\n ref={sidebarRef}\n style={{ height: '100%', overflow: 'visible' }}\n >\n <Sidebar\n isCollapsed={effectiveSidebarCollapsed}\n language={language}\n items={menuItems}\n getMenuItems={getMenuItems}\n onWidthChange={handleSidebarWidthChange}\n onToggle={toggleSidebar}\n initialWidth={sidebarWidth}\n collapsedWidth={sidebarCollapsedWidth || 64}\n />\n </div>\n\n {/* Content - 独立滚动 */}\n <main className=\"flex-1 overflow-y-auto\" style={{ height: '100%', paddingLeft: `${contentPaddingX}px`, paddingRight: `${contentPaddingX}px`, paddingTop: '16px', paddingBottom: '16px' }}>\n <Outlet />\n </main>\n\n {/* 侧边栏切换控件:桌面端 pill 已由 Sidebar 内部渲染,此处仅保留移动端按钮 */}\n <MobileSidebarToggleButton\n isCollapsed={effectiveSidebarCollapsed}\n onToggle={toggleSidebar}\n />\n </div>\n </div>\n );\n};\n\n// AppShell 属性类型\nexport type AppShellProps = {\n router?: Router<any, any>;\n children?: React.ReactNode;\n} & AppShellConfig;\n\n// AppShell 主组件\nexport const AppShell: React.FC<AppShellProps> = ({\n router,\n children,\n title = 'DiShUI',\n initialLang,\n initialTheme,\n menuItems,\n getMenuItems,\n themes,\n enableAuth = false,\n onAuthRequired,\n protectedRoutes = [],\n publicRoutes = ['/login', '/register'],\n loginUrl = '/login',\n authFailedCallback,\n layout = 'sidebar',\n sidebarWidth = 280,\n sidebarCollapsedWidth = 64,\n navbarHeight = 64,\n searchConfig,\n headbarLeft,\n headbarMiddle,\n headbarRight,\n}) => {\n // 保存全局配置\n globalConfig = {\n title,\n initialLang,\n initialTheme,\n menuItems,\n getMenuItems,\n themes,\n enableAuth,\n onAuthRequired,\n protectedRoutes,\n publicRoutes,\n loginUrl,\n authFailedCallback,\n layout,\n sidebarWidth,\n sidebarCollapsedWidth,\n navbarHeight,\n searchConfig,\n headbarLeft,\n headbarMiddle,\n headbarRight,\n };\n\n // 语言状态管理\n const [language, setLanguage] = useState<'zh' | 'en'>(() => {\n const savedLanguage = safeStorage.getItem('app-language');\n if (savedLanguage === 'zh' || savedLanguage === 'en') return savedLanguage;\n return initialLang || 'zh';\n });\n\n // 主题状态管理\n const [theme, setTheme] = useState<ThemeType>(() => {\n const savedTheme = safeStorage.getItem('app-theme');\n const validThemes: ThemeType[] = ['light', 'dark', 'cursor', 'retro', 'cyberpunk', 'matrix', 'oceanblue', 'eyecare', 'ghibli', 'pinkgirl', 'mintgirl', 'wuxing', 'jukebox'];\n if (savedTheme && validThemes.includes(savedTheme as ThemeType)) {\n return savedTheme as ThemeType;\n }\n return initialTheme || 'light';\n });\n\n // 用户认证状态管理\n const [user, setUser] = useState<User | null>(() => {\n if (!enableAuth) return null;\n return readStoredUser();\n });\n\n // Navigation can happen synchronously after login/logout, before React commits.\n const authUserRef = React.useRef(user);\n const lastAuthFailure = React.useRef<string | null>(null);\n\n // 保存语言设置\n useEffect(() => {\n safeStorage.setItem('app-language', language);\n }, [language]);\n\n // 保存主题设置\n useEffect(() => {\n safeStorage.setItem('app-theme', theme);\n if (typeof document !== 'undefined') document.documentElement.setAttribute('data-theme', theme);\n }, [theme]);\n\n // 保存用户信息\n useEffect(() => {\n if (enableAuth) {\n if (user) {\n writeStoredJSON('app-user', user);\n } else {\n safeStorage.removeItem('app-user');\n }\n }\n }, [user, enableAuth]);\n\n // 认证方法\n const login = (newUser: User) => {\n if (!isUser(newUser)) throw new TypeError('Invalid user: expected id, name, email and string roles');\n authUserRef.current = newUser;\n lastAuthFailure.current = null;\n setUser(newUser);\n if (enableAuth) writeStoredJSON('app-user', newUser);\n };\n\n const logout = () => {\n authUserRef.current = null;\n setUser(null);\n safeStorage.removeItem('app-user');\n };\n\n const hasRole = (role: string): boolean => {\n return user?.roles.includes(role) || false;\n };\n\n const hasAnyRole = (roles: string[]): boolean => {\n return roles.some(role => user?.roles.includes(role)) || false;\n };\n\n // UX notification only: router events cannot cancel/await loaders. Install native\n // beforeLoad guards when constructing protected routes, including preload paths.\n useEffect(() => {\n if (!enableAuth || !router) {\n lastAuthFailure.current = null;\n return;\n }\n\n const checkAuthentication = (pathname: string, currentUser = authUserRef.current) => {\n if (currentUser || !requiresAuthentication(pathname, protectedRoutes, publicRoutes)) {\n lastAuthFailure.current = null;\n return;\n }\n // Inline configuration arrays/callbacks and StrictMode must not repeat a notification.\n if (lastAuthFailure.current === pathname) return;\n lastAuthFailure.current = pathname;\n\n // Keep the existing contract: true means the caller handled the auth requirement.\n if (onAuthRequired?.()) return;\n if (authFailedCallback) {\n authFailedCallback(pathname, loginUrl);\n } else if (typeof window !== 'undefined') {\n window.location.href = loginUrl;\n }\n };\n\n const unsubscribe = router.subscribe('onBeforeLoad', ({ toLocation }) => {\n checkAuthentication(toLocation.pathname);\n });\n // Covers the initial visit and auth changes without a pathname change (logout).\n checkAuthentication(router.state.location.pathname, user);\n return unsubscribe;\n }, [enableAuth, user, router, protectedRoutes, publicRoutes, onAuthRequired, loginUrl, authFailedCallback]);\n\n const authContext: AuthContextType = {\n user,\n isAuthenticated: !!user,\n login,\n logout,\n hasRole,\n hasAnyRole,\n };\n\n const value: AppContextType = {\n title,\n language,\n theme,\n setLanguage,\n setTheme,\n auth: authContext,\n menuItems,\n getMenuItems,\n themes,\n sidebarWidth,\n sidebarCollapsedWidth,\n navbarHeight,\n };\n\n return (\n <AppContext.Provider value={value}>\n {router ? (\n children || <RouterProvider router={router} />\n ) : (\n children\n )}\n </AppContext.Provider>\n );\n};\n\n// 保持向后兼容的 AppProvider 别名\nexport const AppProvider = AppShell;\n\nexport default AppShell;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"authentication.js","names":[],"sources":["../../src/contexts/authentication.ts"],"sourcesContent":["import type { User } from './AppContext';\nimport { readStoredJSON } from '../utils/safeStorage';\n\n/** Shape validation only; browser storage is not proof of identity or permissions. */\nexport function isUser(value: unknown): value is User {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const user = value as Record<string, unknown>;\n return typeof user.id === 'string' && user.id.trim().length > 0\n && typeof user.name === 'string'\n && typeof user.email === 'string'\n && Array.isArray(user.roles) && user.roles.every(role => typeof role === 'string');\n}\n\nexport function readStoredUser(): User | null {\n return readStoredJSON<User | null>('app-user', isUser, null);\n}\n\n/** A prefix matches complete path segments; '/' only matches the home page. */\nexport function matchesAuthPath(pathname: string, route: string): boolean {\n if (!route.startsWith('/')) return false;\n const prefix = route.replace(/\\/+$/, '') || '/';\n return pathname === prefix || (prefix !== '/' && pathname.startsWith(`${prefix}/`));\n}\n\nexport function requiresAuthentication(pathname: string, protectedRoutes: string[], publicRoutes: string[]): boolean {\n return !publicRoutes.some(route => matchesAuthPath(pathname, route))\n && (protectedRoutes.length === 0 || protectedRoutes.some(route => matchesAuthPath(pathname, route)));\n}\n"],"mappings":";;AAIA,SAAgB,EAAO,GAA+B;CACpD,IAAI,CAAC,KAAS,OAAO,KAAU,YAAY,MAAM,QAAQ,CAAK,GAAG,OAAO;CACxE,IAAM,IAAO;CACb,OAAO,OAAO,EAAK,MAAO,YAAY,EAAK,GAAG,KAAK,CAAC,CAAC,SAAS,KACzD,OAAO,EAAK,QAAS,YACrB,OAAO,EAAK,SAAU,YACtB,MAAM,QAAQ,EAAK,KAAK,KAAK,EAAK,MAAM,OAAM,MAAQ,OAAO,KAAS,QAAQ;AACrF;AAEA,SAAgB,IAA8B;CAC5C,OAAO,EAA4B,YAAY,GAAQ,IAAI;AAC7D;AAGA,SAAgB,EAAgB,GAAkB,GAAwB;CACxE,IAAI,CAAC,EAAM,WAAW,GAAG,GAAG,OAAO;CACnC,IAAM,IAAS,EAAM,QAAQ,QAAQ,EAAE,KAAK;CAC5C,OAAO,MAAa,KAAW,MAAW,OAAO,EAAS,WAAW,GAAG,EAAO,EAAE;AACnF;AAEA,SAAgB,EAAuB,GAAkB,GAA2B,GAAiC;CACnH,OAAO,CAAC,EAAa,MAAK,MAAS,EAAgB,GAAU,CAAK,CAAC,MAC7D,EAAgB,WAAW,KAAK,EAAgB,MAAK,MAAS,EAAgB,GAAU,CAAK,CAAC;AACtG"}
1
+ {"version":3,"file":"authentication.js","names":["isUser","value","user","role","readStoredUser","readStoredJSON","matchesAuthPath","route","prefix","pathname","requiresAuthentication","publicRoutes","protectedRoutes"],"sources":["../../src/contexts/authentication.ts"],"sourcesContent":["import type { User } from './AppContext';\nimport { readStoredJSON } from '../utils/safeStorage';\n\n/** Shape validation only; browser storage is not proof of identity or permissions. */\nexport function isUser(value: unknown): value is User {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const user = value as Record<string, unknown>;\n return typeof user.id === 'string' && user.id.trim().length > 0\n && typeof user.name === 'string'\n && typeof user.email === 'string'\n && Array.isArray(user.roles) && user.roles.every(role => typeof role === 'string');\n}\n\nexport function readStoredUser(): User | null {\n return readStoredJSON<User | null>('app-user', isUser, null);\n}\n\n/** A prefix matches complete path segments; '/' only matches the home page. */\nexport function matchesAuthPath(pathname: string, route: string): boolean {\n if (!route.startsWith('/')) return false;\n const prefix = route.replace(/\\/+$/, '') || '/';\n return pathname === prefix || (prefix !== '/' && pathname.startsWith(`${prefix}/`));\n}\n\nexport function requiresAuthentication(pathname: string, protectedRoutes: string[], publicRoutes: string[]): boolean {\n return !publicRoutes.some(route => matchesAuthPath(pathname, route))\n && (protectedRoutes.length === 0 || protectedRoutes.some(route => matchesAuthPath(pathname, route)));\n}\n"],"mappings":";;AAIA,SAAgBA,EAAO,GAA+B;CACpD,IAAI,CAACC,KAAS,OAAOA,KAAU,YAAY,MAAM,QAAQA,CAAK,GAAG,OAAO;CACxE,IAAMC,IAAOD;CACb,OAAO,OAAOC,EAAK,MAAO,YAAYA,EAAK,GAAG,KAAK,CAAC,CAAC,SAAS,KACzD,OAAOA,EAAK,QAAS,YACrB,OAAOA,EAAK,SAAU,YACtB,MAAM,QAAQA,EAAK,KAAK,KAAKA,EAAK,MAAM,OAAM,MAAQ,OAAOC,KAAS,QAAQ;AACrF;AAEA,SAAgBC,IAA8B;CAC5C,OAAOC,EAA4B,YAAYL,GAAQ,IAAI;AAC7D;AAGA,SAAgBM,EAAgB,GAAkB,GAAwB;CACxE,IAAI,CAACC,EAAM,WAAW,GAAG,GAAG,OAAO;CACnC,IAAMC,IAASD,EAAM,QAAQ,QAAQ,EAAE,KAAK;CAC5C,OAAOE,MAAaD,KAAWA,MAAW,OAAOC,EAAS,WAAW,GAAGD,EAAO,EAAE;AACnF;AAEA,SAAgBE,EAAuB,GAAkB,GAA2B,GAAiC;CACnH,OAAO,CAACC,EAAa,MAAK,MAASL,EAAgBG,GAAUF,CAAK,CAAC,MAC7DK,EAAgB,WAAW,KAAKA,EAAgB,MAAK,MAASN,EAAgBG,GAAUF,CAAK,CAAC;AACtG"}
@@ -1,6 +1,6 @@
1
1
  import { Filters_exports as e } from "./components/pro/DataTable/Filters.js";
2
- import t from "./components/pro/DataTable/DataTable.js";
3
- import { utils_exports as n } from "./components/pro/DataTable/utils.js";
2
+ import { utils_exports as t } from "./components/pro/DataTable/utils.js";
3
+ import n from "./components/pro/DataTable/DataTable.js";
4
4
  import r from "./hooks/useTableColumns.js";
5
5
  import i from "./hooks/useTableData.js";
6
6
  import { defineExtension as a } from "./components/pro/DataTable/extension.js";
@@ -10,7 +10,7 @@ import { PivotPanel as c } from "./components/pro/DataTable/PivotPanel.js";
10
10
  import { usePivotExtension as l } from "./components/pro/DataTable/pivotExtension.js";
11
11
  import { useRowDetailExtension as u } from "./components/pro/DataTable/rowDetailExtension.js";
12
12
  //#region src/components/pro/DataTable/index.ts
13
- var { TextFilter: d, NumberRangeFilter: f, SelectFilter: p, BooleanFilter: m, DateRangeFilter: h, MultiSelectFilter: g, FilterPanel: _ } = e, { createColumn: v, createComputedColumn: y, createActionColumn: b, createSelectionColumn: x, numericSort: S, dateSort: C, stringSort: w, treeSort: T, createSelectOptions: E, extractUniqueOptions: D, defaultFilterFunctions: O } = n, k = t;
13
+ var { TextFilter: d, NumberRangeFilter: f, SelectFilter: p, BooleanFilter: m, DateRangeFilter: h, MultiSelectFilter: g, FilterPanel: _ } = e, { createColumn: v, createComputedColumn: y, createActionColumn: b, createSelectionColumn: x, numericSort: S, dateSort: C, stringSort: w, treeSort: T, createSelectOptions: E, extractUniqueOptions: D, defaultFilterFunctions: O } = t, k = n;
14
14
  //#endregion
15
15
  export { m as BooleanFilter, h as DateRangeFilter, _ as FilterPanel, g as MultiSelectFilter, f as NumberRangeFilter, c as PivotPanel, s as PivotView, p as SelectFilter, d as TextFilter, o as computePivot, b as createActionColumn, v as createColumn, y as createComputedColumn, E as createSelectOptions, x as createSelectionColumn, C as dateSort, k as default, O as defaultFilterFunctions, a as defineExtension, D as extractUniqueOptions, S as numericSort, w as stringSort, T as treeSort, l as usePivotExtension, u as useRowDetailExtension, r as useTableColumns, i as useTableData };
16
16
 
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.js","names":[],"sources":["../src/components/pro/DataTable/index.ts"],"sourcesContent":["import DataTableComponent from './DataTable';\nimport * as Filters from './Filters';\nimport * as Utils from './utils';\n\n// 导出 Hook\nexport { useTableColumns } from '../../../hooks/useTableColumns';\nexport type { ColumnConfig, ColumnFilterConfig } from '../../../hooks/useTableColumns';\nexport { useTableData } from '../../../hooks/useTableData';\nexport type { UseTableDataOptions, UseTableDataReturn } from '../../../hooks/useTableData';\n\n// 导出所有过滤器组件\nexport const {\n TextFilter,\n NumberRangeFilter,\n SelectFilter,\n BooleanFilter,\n DateRangeFilter,\n MultiSelectFilter,\n FilterPanel\n} = Filters;\n\n// 导出所有辅助函数\nexport const {\n createColumn,\n createComputedColumn,\n createActionColumn,\n createSelectionColumn,\n numericSort,\n dateSort,\n stringSort,\n treeSort,\n createSelectOptions,\n extractUniqueOptions,\n defaultFilterFunctions\n} = Utils;\n\n// 导出扩展系统(Core + Extension 架构)\nexport { defineExtension } from './extension';\nexport type {\n DataTableApi,\n DataTableExtension,\n DataTableRowContext,\n DataTableCellContext,\n DataTableMenuItem,\n} from './extension';\n\n// 导出内置扩展\nexport { usePivotExtension } from './pivotExtension';\nexport type {\n PivotExtensionOptions,\n PivotField,\n PivotPanelPlacement,\n} from './pivotExtension';\nexport { useRowDetailExtension } from './rowDetailExtension';\nexport type { RowDetailOptions } from './rowDetailExtension';\n\n// 导出透视(Pivot)相关\nexport { PivotView } from './PivotView';\nexport type { PivotViewProps, PivotValue, PivotFieldLabels } from './PivotView';\nexport { PivotPanel } from './PivotPanel';\nexport type { PivotPanelProps } from './PivotPanel';\nexport { computePivot } from './pivotEngine';\nexport type {\n PivotAggFn,\n PivotConfig,\n PivotResult,\n PivotRowNode,\n} from './pivotEngine';\n\n// 导出类型\nexport type {\n DataTableProps,\n DataTableViewMode,\n DataTableCardOptions,\n CellEventHandler,\n RowEventHandler,\n ColumnEventHandler,\n TableEventHandler\n} from './DataTable';\n\n// 导出过滤器相关类型\nexport type {\n FilterPanelProps,\n TextFilterProps,\n NumberFilterProps,\n SelectFilterProps,\n BooleanFilterProps,\n DateRangeFilterProps\n} from './Filters';\n\n// 导出TreeDataRow类型\nexport type { TreeDataRow } from './utils';\n\n// 从 TanStack Table 兼容层导出常用类型(v8 命名,底层已适配 v9)\nexport type {\n ColumnDef,\n ColumnFiltersState,\n SortingState,\n VisibilityState,\n RowSelectionState,\n PaginationState\n} from './tanstack-table';\n\nexport default DataTableComponent; "],"mappings":";;;;;;;;;;;;AAWA,IAAa,EACX,eACA,sBACA,iBACA,kBACA,oBACA,sBACA,mBACE,GAGS,EACX,iBACA,yBACA,uBACA,0BACA,gBACA,aACA,eACA,aACA,wBACA,yBACA,8BACE,GAqEJ,IAAe"}
1
+ {"version":3,"file":"data-table.js","names":["Filters","Utils","DataTableComponent","DataTable","useTableColumns","useTableData","Filters_exports","utils_exports","DataTable_default","BooleanFilter","DateRangeFilter","FilterPanel","MultiSelectFilter","NumberRangeFilter","PivotPanel","PivotView","SelectFilter","TextFilter","computePivot","createActionColumn","createColumn","createComputedColumn","createSelectOptions","createSelectionColumn","dateSort","defaultFilterFunctions","defineExtension","extractUniqueOptions","numericSort","stringSort","treeSort","usePivotExtension","useRowDetailExtension"],"sources":["../src/components/pro/DataTable/index.ts"],"sourcesContent":["import DataTableComponent from './DataTable';\nimport * as Filters from './Filters';\nimport * as Utils from './utils';\n\n// 导出 Hook\nexport { useTableColumns } from '../../../hooks/useTableColumns';\nexport type { ColumnConfig, ColumnFilterConfig } from '../../../hooks/useTableColumns';\nexport { useTableData } from '../../../hooks/useTableData';\nexport type { UseTableDataOptions, UseTableDataReturn } from '../../../hooks/useTableData';\n\n// 导出所有过滤器组件\nexport const {\n TextFilter,\n NumberRangeFilter,\n SelectFilter,\n BooleanFilter,\n DateRangeFilter,\n MultiSelectFilter,\n FilterPanel\n} = Filters;\n\n// 导出所有辅助函数\nexport const {\n createColumn,\n createComputedColumn,\n createActionColumn,\n createSelectionColumn,\n numericSort,\n dateSort,\n stringSort,\n treeSort,\n createSelectOptions,\n extractUniqueOptions,\n defaultFilterFunctions\n} = Utils;\n\n// 导出扩展系统(Core + Extension 架构)\nexport { defineExtension } from './extension';\nexport type {\n DataTableApi,\n DataTableExtension,\n DataTableRowContext,\n DataTableCellContext,\n DataTableMenuItem,\n} from './extension';\n\n// 导出内置扩展\nexport { usePivotExtension } from './pivotExtension';\nexport type {\n PivotExtensionOptions,\n PivotField,\n PivotPanelPlacement,\n} from './pivotExtension';\nexport { useRowDetailExtension } from './rowDetailExtension';\nexport type { RowDetailOptions } from './rowDetailExtension';\n\n// 导出透视(Pivot)相关\nexport { PivotView } from './PivotView';\nexport type { PivotViewProps, PivotValue, PivotFieldLabels } from './PivotView';\nexport { PivotPanel } from './PivotPanel';\nexport type { PivotPanelProps } from './PivotPanel';\nexport { computePivot } from './pivotEngine';\nexport type {\n PivotAggFn,\n PivotConfig,\n PivotResult,\n PivotRowNode,\n} from './pivotEngine';\n\n// 导出类型\nexport type {\n DataTableProps,\n DataTableViewMode,\n DataTableCardOptions,\n CellEventHandler,\n RowEventHandler,\n ColumnEventHandler,\n TableEventHandler\n} from './DataTable';\n\n// 导出过滤器相关类型\nexport type {\n FilterPanelProps,\n TextFilterProps,\n NumberFilterProps,\n SelectFilterProps,\n BooleanFilterProps,\n DateRangeFilterProps\n} from './Filters';\n\n// 导出TreeDataRow类型\nexport type { TreeDataRow } from './utils';\n\n// 从 TanStack Table 兼容层导出常用类型(v8 命名,底层已适配 v9)\nexport type {\n ColumnDef,\n ColumnFiltersState,\n SortingState,\n VisibilityState,\n RowSelectionState,\n PaginationState\n} from './tanstack-table';\n\nexport default DataTableComponent; "],"mappings":";;;;;;;;;;;;AAWA,IAAa,EACX,eACA,sBACA,iBACA,kBACA,oBACA,sBACA,mBACEA,GAGS,EACX,iBACA,yBACA,uBACA,0BACA,gBACA,aACA,eACA,aACA,wBACA,yBACA,8BACEC,GAqEJO,IAAeN"}