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":"Float2.js","names":[],"sources":["../../../src/components/Page/Float.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { cn } from '../../utils/cn';\nimport './Float.css';\n\nexport type PageFloatProps = React.HTMLAttributes<HTMLDivElement> & {\n title?: string;\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n defaultPosition?: { x: number; y: number };\n draggable?: boolean;\n};\n\n/** Coordinates are relative to the containing Page; dragging is confined to it. */\nexport default function PageFloat({\n title = 'Float', collapsed, defaultCollapsed = false, onCollapsedChange,\n defaultPosition = { x: 16, y: 16 }, draggable = true,\n className, style, children, ...rest\n}: PageFloatProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);\n const isCollapsed = collapsed ?? internalCollapsed;\n const [position, setPosition] = useState(defaultPosition);\n const root = useRef<HTMLDivElement>(null);\n const toggle = useRef<HTMLButtonElement>(null);\n const drag = useRef<{ id: number; x: number; y: number; origin: typeof position; moved: boolean } | null>(null);\n const suppressClick = useRef(false);\n const clamp = useCallback((next: typeof position) => {\n const element = root.current;\n const parent = element?.offsetParent as HTMLElement | null;\n if (!element || !parent) return next;\n return {\n x: Math.max(0, Math.min(next.x, parent.clientWidth - element.offsetWidth)),\n y: Math.max(0, Math.min(next.y, parent.clientHeight - element.offsetHeight)),\n };\n }, []);\n useEffect(() => {\n const update = () => setPosition(current => {\n const next = clamp(current);\n return next.x === current.x && next.y === current.y ? current : next;\n });\n update();\n const observer = new ResizeObserver(update);\n if (root.current) observer.observe(root.current);\n if (root.current?.offsetParent) observer.observe(root.current.offsetParent);\n return () => observer.disconnect();\n }, [clamp, isCollapsed]);\n const changeCollapsed = () => {\n setInternalCollapsed(!isCollapsed);\n onCollapsedChange?.(!isCollapsed);\n toggle.current?.focus();\n };\n const dragEvents = {\n onPointerDown: (event: React.PointerEvent<HTMLButtonElement>) => {\n suppressClick.current = false;\n if (!draggable || event.button !== 0) return;\n drag.current = { id: event.pointerId, x: event.clientX, y: event.clientY, origin: position, moved: false };\n event.currentTarget.setPointerCapture(event.pointerId);\n },\n onPointerMove: (event: React.PointerEvent<HTMLButtonElement>) => {\n const current = drag.current;\n if (!current || current.id !== event.pointerId) return;\n const dx = event.clientX - current.x;\n const dy = event.clientY - current.y;\n if (Math.abs(dx) + Math.abs(dy) > 4) current.moved = true;\n if (current.moved) setPosition(clamp({ x: current.origin.x + dx, y: current.origin.y + dy }));\n },\n onPointerUp: (event: React.PointerEvent<HTMLButtonElement>) => {\n suppressClick.current = drag.current?.moved ?? false;\n drag.current = null;\n if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId);\n },\n onPointerCancel: () => { drag.current = null; },\n onLostPointerCapture: () => { drag.current = null; },\n onKeyDown: (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (!draggable) return;\n const delta = event.shiftKey ? 32 : 8;\n const offsets: Record<string, [number, number]> = { ArrowLeft: [-delta, 0], ArrowRight: [delta, 0], ArrowUp: [0, -delta], ArrowDown: [0, delta] };\n const offset = offsets[event.key];\n if (!offset) return;\n event.preventDefault();\n setPosition(current => clamp({ x: current.x + offset[0], y: current.y + offset[1] }));\n },\n };\n return (\n <div {...rest} ref={root} className={cn('dishui-page-float absolute z-30 overflow-hidden border border-base-300 bg-base-100 text-base-content shadow-sm', isCollapsed ? 'rounded-full' : 'rounded-lg', className)}\n data-collapsed={isCollapsed}\n style={{ width: 288, maxWidth: '100%', maxHeight: '100%', ...style,\n ...(isCollapsed ? { boxSizing: 'border-box', width: 48, height: 48, minWidth: 48, minHeight: 48, maxWidth: 48, maxHeight: 48, padding: 0, borderRadius: '50%' } as React.CSSProperties : {}),\n left: position.x, top: position.y }}>\n <div className={cn('flex items-center border-base-300', isCollapsed && 'h-full w-full')}>\n {!isCollapsed && <button type=\"button\" {...dragEvents} onClick={() => { suppressClick.current = false; }} aria-label={`${title}: move with arrow keys`} className=\"min-w-0 flex-1 truncate px-3 py-2 text-left text-sm font-medium focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary\" style={{ touchAction: draggable ? 'none' : undefined, cursor: draggable ? 'grab' : undefined }}>{title}</button>}\n <button ref={toggle} type=\"button\" {...(isCollapsed ? dragEvents : {})} aria-label={`${isCollapsed ? 'Expand' : 'Collapse'} ${title}`} aria-expanded={!isCollapsed}\n title={`${isCollapsed ? 'Expand' : 'Collapse'} ${title}`}\n className={cn('dishui-page-float-toggle flex shrink-0 items-center justify-center focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary', isCollapsed ? 'h-full w-full rounded-full' : 'h-9 w-9 rounded-md')}\n style={{ touchAction: isCollapsed && draggable ? 'none' : undefined, cursor: isCollapsed && draggable ? 'grab' : 'pointer' }}\n onClick={() => { if (!suppressClick.current) changeCollapsed(); suppressClick.current = false; }}>\n <svg aria-hidden=\"true\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {isCollapsed ? <><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"3\" /><path d=\"M4 10h16M9 4v6\" /></> : <path d=\"M6 12h12\" />}\n </svg>\n </button>\n </div>\n <div hidden={isCollapsed} className=\"overflow-auto border-t border-base-300 p-3 text-sm\" style={{ maxHeight: 'min(60vh, 360px)' }}>{children}</div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Float2.js","names":["_Fragment","PageFloat","rest","internalCollapsed","setInternalCollapsed","useState","defaultCollapsed","isCollapsed","collapsed","position","setPosition","defaultPosition","root","useRef","toggle","drag","suppressClick","clamp","useCallback","element","parent","next","update","current","observer","changeCollapsed","onCollapsedChange","dragEvents","draggable","event","dx","dy","delta","offset","cn","className","style","title","Fragment"],"sources":["../../../src/components/Page/Float.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { cn } from '../../utils/cn';\nimport './Float.css';\n\nexport type PageFloatProps = React.HTMLAttributes<HTMLDivElement> & {\n title?: string;\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n defaultPosition?: { x: number; y: number };\n draggable?: boolean;\n};\n\n/** Coordinates are relative to the containing Page; dragging is confined to it. */\nexport default function PageFloat({\n title = 'Float', collapsed, defaultCollapsed = false, onCollapsedChange,\n defaultPosition = { x: 16, y: 16 }, draggable = true,\n className, style, children, ...rest\n}: PageFloatProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);\n const isCollapsed = collapsed ?? internalCollapsed;\n const [position, setPosition] = useState(defaultPosition);\n const root = useRef<HTMLDivElement>(null);\n const toggle = useRef<HTMLButtonElement>(null);\n const drag = useRef<{ id: number; x: number; y: number; origin: typeof position; moved: boolean } | null>(null);\n const suppressClick = useRef(false);\n const clamp = useCallback((next: typeof position) => {\n const element = root.current;\n const parent = element?.offsetParent as HTMLElement | null;\n if (!element || !parent) return next;\n return {\n x: Math.max(0, Math.min(next.x, parent.clientWidth - element.offsetWidth)),\n y: Math.max(0, Math.min(next.y, parent.clientHeight - element.offsetHeight)),\n };\n }, []);\n useEffect(() => {\n const update = () => setPosition(current => {\n const next = clamp(current);\n return next.x === current.x && next.y === current.y ? current : next;\n });\n update();\n const observer = new ResizeObserver(update);\n if (root.current) observer.observe(root.current);\n if (root.current?.offsetParent) observer.observe(root.current.offsetParent);\n return () => observer.disconnect();\n }, [clamp, isCollapsed]);\n const changeCollapsed = () => {\n setInternalCollapsed(!isCollapsed);\n onCollapsedChange?.(!isCollapsed);\n toggle.current?.focus();\n };\n const dragEvents = {\n onPointerDown: (event: React.PointerEvent<HTMLButtonElement>) => {\n suppressClick.current = false;\n if (!draggable || event.button !== 0) return;\n drag.current = { id: event.pointerId, x: event.clientX, y: event.clientY, origin: position, moved: false };\n event.currentTarget.setPointerCapture(event.pointerId);\n },\n onPointerMove: (event: React.PointerEvent<HTMLButtonElement>) => {\n const current = drag.current;\n if (!current || current.id !== event.pointerId) return;\n const dx = event.clientX - current.x;\n const dy = event.clientY - current.y;\n if (Math.abs(dx) + Math.abs(dy) > 4) current.moved = true;\n if (current.moved) setPosition(clamp({ x: current.origin.x + dx, y: current.origin.y + dy }));\n },\n onPointerUp: (event: React.PointerEvent<HTMLButtonElement>) => {\n suppressClick.current = drag.current?.moved ?? false;\n drag.current = null;\n if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId);\n },\n onPointerCancel: () => { drag.current = null; },\n onLostPointerCapture: () => { drag.current = null; },\n onKeyDown: (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (!draggable) return;\n const delta = event.shiftKey ? 32 : 8;\n const offsets: Record<string, [number, number]> = { ArrowLeft: [-delta, 0], ArrowRight: [delta, 0], ArrowUp: [0, -delta], ArrowDown: [0, delta] };\n const offset = offsets[event.key];\n if (!offset) return;\n event.preventDefault();\n setPosition(current => clamp({ x: current.x + offset[0], y: current.y + offset[1] }));\n },\n };\n return (\n <div {...rest} ref={root} className={cn('dishui-page-float absolute z-30 overflow-hidden border border-base-300 bg-base-100 text-base-content shadow-sm', isCollapsed ? 'rounded-full' : 'rounded-lg', className)}\n data-collapsed={isCollapsed}\n style={{ width: 288, maxWidth: '100%', maxHeight: '100%', ...style,\n ...(isCollapsed ? { boxSizing: 'border-box', width: 48, height: 48, minWidth: 48, minHeight: 48, maxWidth: 48, maxHeight: 48, padding: 0, borderRadius: '50%' } as React.CSSProperties : {}),\n left: position.x, top: position.y }}>\n <div className={cn('flex items-center border-base-300', isCollapsed && 'h-full w-full')}>\n {!isCollapsed && <button type=\"button\" {...dragEvents} onClick={() => { suppressClick.current = false; }} aria-label={`${title}: move with arrow keys`} className=\"min-w-0 flex-1 truncate px-3 py-2 text-left text-sm font-medium focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary\" style={{ touchAction: draggable ? 'none' : undefined, cursor: draggable ? 'grab' : undefined }}>{title}</button>}\n <button ref={toggle} type=\"button\" {...(isCollapsed ? dragEvents : {})} aria-label={`${isCollapsed ? 'Expand' : 'Collapse'} ${title}`} aria-expanded={!isCollapsed}\n title={`${isCollapsed ? 'Expand' : 'Collapse'} ${title}`}\n className={cn('dishui-page-float-toggle flex shrink-0 items-center justify-center focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary', isCollapsed ? 'h-full w-full rounded-full' : 'h-9 w-9 rounded-md')}\n style={{ touchAction: isCollapsed && draggable ? 'none' : undefined, cursor: isCollapsed && draggable ? 'grab' : 'pointer' }}\n onClick={() => { if (!suppressClick.current) changeCollapsed(); suppressClick.current = false; }}>\n <svg aria-hidden=\"true\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {isCollapsed ? <><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"3\" /><path d=\"M4 10h16M9 4v6\" /></> : <path d=\"M6 12h12\" />}\n </svg>\n </button>\n </div>\n <div hidden={isCollapsed} className=\"overflow-auto border-t border-base-300 p-3 text-sm\" style={{ maxHeight: 'min(60vh, 360px)' }}>{children}</div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Page/index.tsx"],"sourcesContent":["import React from 'react';\nimport PageFloat from './Float';\nimport ResizableAside, { type PageResizeProps } from './resize';\nexport type { PageFloatProps } from './Float';\nimport PageHeader, { PageHeaderProps } from '../PageHeader';\nimport { cn } from '../../utils/cn';\nimport PagePanel, { type PagePanelProps, type PageAutoHideProps } from '../PagePanel';\n\nexport type { PagePanelProps } from '../PagePanel';\n\n/**\n * Page 布局脚手架\n * ----------------------------------------------------------------------------\n * 为管理后台等页面提供统一的「页头 + 主体 + 左右侧栏」骨架,配合 PageHeader、\n * Card.Info 等组件使用。所有区域都是可选的,可按需组合。\n *\n * 典型结构:\n * <Page fullHeight>\n * <Page.Header title=\"用户管理\" actions={<Button>新建</Button>} />\n * <Page.Body scroll>\n * <Page.Left width={240}>筛选器</Page.Left>\n * <Page.Main scroll>主内容</Page.Main>\n * <Page.Right width={320}>详情</Page.Right>\n * </Page.Body>\n * </Page>\n */\n\nexport type PageProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 是否占满父容器高度并启用内部滚动(主体区滚动,页头固定) */\n fullHeight?: boolean;\n};\n\nexport type PageBodyProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 主体内的间距(left/main/right 之间),数字按 px 处理,默认 16 */\n gap?: number | string;\n /** 是否让主体区在剩余空间内滚动(配合 Page fullHeight 使用) */\n scroll?: boolean;\n};\n\nexport type PageHeaderLevel = PageHeaderProps & { key: React.Key };\nexport type PageHeaderSlotProps = PageHeaderProps & {\n /** 按顺序从上到下渲染;每级覆盖公共属性。空数组不渲染页头。 */\n levels?: readonly PageHeaderLevel[];\n};\n\nexport type PageAsideLevel = PageAsideProps & { key: React.Key };\nexport type PageAsideSlotProps = PageAsideProps & {\n /** 按 DOM 顺序从左到右渲染(小屏纵向堆叠);每级覆盖公共属性。 */\n levels?: readonly PageAsideLevel[];\n};\n\nexport type PageAsideProps = React.HTMLAttributes<HTMLDivElement> & PagePanelProps & PageResizeProps & {\n /** 侧栏宽度,数字按 px 处理;Left 默认 260,Right 默认 320。外部变化会同步到拖动宽度。 */\n width?: number | string;\n /** 是否显示分隔边框 */\n bordered?: boolean;\n /** 侧栏内部纵向滚动自适应 */\n scroll?: boolean;\n /** 小屏(<768px)下是否隐藏(侧栏通常在移动端折叠) */\n hideOnMobile?: boolean;\n};\n\nexport type PageMainProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 主内容区是否在剩余空间内纵向滚动 */\n scroll?: boolean;\n};\n\nconst toCssSize = (value: number | string | undefined): string | undefined =>\n typeof value === 'number' ? `${value}px` : value;\n\nconst Page = ({ fullHeight = false, className = '', children, ...rest }: PageProps) => (\n <div\n className={cn(\n 'dishui-page flex w-full min-w-0 flex-col text-body leading-5 text-base-content',\n fullHeight && 'h-full min-h-0',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n);\n\n/** 不增加包装节点,保持 Page / Body 的布局、间距及面板开关语义。 */\nconst PageHeaderSlot = ({ levels, ...props }: PageHeaderSlotProps) => levels === undefined\n ? <PageHeader {...props} />\n : <>{levels.map(({ key, ...level }) => <PageHeader {...props} {...level} key={key} />)}</>;\n\nconst PageBody = ({ gap = 16, scroll = false, className = '', style, children, ...rest }: PageBodyProps) => (\n <div\n className={cn(\n 'dishui-page-body flex w-full flex-col md:flex-row',\n scroll && 'min-h-0 flex-1',\n className,\n )}\n style={{ ...style, gap: 0, ['--dishui-page-gap' as string]: toCssSize(style?.gap ?? gap) }}\n {...rest}\n >\n {children}\n </div>\n);\n\nconst PageLeft = ({ levels, ...props }: PageAsideSlotProps): React.ReactElement => levels === undefined\n ? PageLeftPanel(props)\n : <>{levels.map(({ key, ...level }) => <PageLeftPanel {...props} {...level} key={key} />)}</>;\n\nconst PageLeftPanel = ({\n resizeVariant = 'pill', resizable = false, minWidth = 160, maxWidth = 600, onWidthChange,\n open, mode, animated, duration,\n width = 260,\n bordered = true,\n scroll = true,\n hideOnMobile = false,\n className = '',\n style,\n children,\n ...rest\n}: PageAsideProps) => {\n const panel = <PagePanel edge=\"left\" width={style?.width ?? width} hideOnMobile={hideOnMobile} open={open} mode={mode} animated={animated} duration={duration}>\n <aside\n className={cn(\n 'dishui-page-left w-full shrink-0 md:w-(--dishui-aside-w)',\n bordered && 'md:border-r md:border-base-300 md:pr-4',\n scroll && 'md:min-h-0 md:overflow-y-auto',\n hideOnMobile && 'hidden md:block',\n className,\n )}\n style={{ ['--dishui-aside-w' as string]: toCssSize(width), ...style }}\n {...rest}\n >\n {children}\n </aside>\n </PagePanel>;\n return resizable ? <ResizableAside panel={panel} resizeVariant={resizeVariant} minWidth={minWidth} maxWidth={maxWidth} onWidthChange={onWidthChange} /> : panel;\n};\n\nconst PageRight = ({ levels, ...props }: PageAsideSlotProps): React.ReactElement => levels === undefined\n ? PageRightPanel(props)\n : <>{levels.map(({ key, ...level }) => <PageRightPanel {...props} {...level} key={key} />)}</>;\n\nconst PageRightPanel = ({\n resizeVariant = 'pill', resizable = false, minWidth = 160, maxWidth = 600, onWidthChange,\n open, mode, animated, duration,\n width = 320,\n bordered = true,\n scroll = true,\n hideOnMobile = false,\n className = '',\n style,\n children,\n ...rest\n}: PageAsideProps) => {\n const panel = <PagePanel edge=\"right\" width={style?.width ?? width} hideOnMobile={hideOnMobile} open={open} mode={mode} animated={animated} duration={duration}>\n <aside\n className={cn(\n 'dishui-page-right w-full shrink-0 md:w-(--dishui-aside-w)',\n bordered && 'md:border-l md:border-base-300 md:pl-4',\n scroll && 'md:min-h-0 md:overflow-y-auto',\n hideOnMobile && 'hidden md:block',\n className,\n )}\n style={{ ['--dishui-aside-w' as string]: toCssSize(width), ...style }}\n {...rest}\n >\n {children}\n </aside>\n </PagePanel>;\n return resizable ? <ResizableAside panel={panel} resizeVariant={resizeVariant} minWidth={minWidth} maxWidth={maxWidth} onWidthChange={onWidthChange} /> : panel;\n};\n\nexport type PageFooterProps = React.HTMLAttributes<HTMLElement> & PagePanelProps & PageAutoHideProps & {\n left?: React.ReactNode;\n center?: React.ReactNode;\n right?: React.ReactNode;\n};\n\nconst PageFooter = ({\n open, mode, animated, duration, autoHide, className, children, left, center, right, ...rest\n}: PageFooterProps) => (\n <PagePanel edge=\"footer\" autoHide={autoHide} open={open} mode={mode} animated={animated} duration={duration}>\n <footer className={cn('dishui-page-footer', className)} {...rest}>\n {children !== undefined ? children : (\n <div className=\"dishui-page-header-layout\" data-centered={center != null && center !== false || undefined}>\n {left != null && <div className=\"dishui-page-header-left\">{left}</div>}\n {center != null && <div className=\"dishui-page-header-center\">{center}</div>}\n {right != null && <div className=\"dishui-page-header-right\">{right}</div>}\n </div>\n )}\n </footer>\n </PagePanel>\n);\n\nconst PageMain = ({ scroll = false, className = '', children, ...rest }: PageMainProps) => (\n <main\n className={cn(\n 'dishui-page-main min-w-0 flex-1',\n scroll && 'min-h-0 overflow-y-auto',\n className,\n )}\n {...rest}\n >\n {children}\n </main>\n);\n\ninterface PageCompound extends React.FC<PageProps> {\n Header: typeof PageHeaderSlot;\n Footer: typeof PageFooter;\n Float: typeof PageFloat;\n Body: typeof PageBody;\n Left: typeof PageLeft;\n Right: typeof PageRight;\n Main: typeof PageMain;\n}\n\nconst PageWithCompounds = Page as PageCompound;\nPageWithCompounds.Header = PageHeaderSlot;\nPageWithCompounds.Footer = PageFooter;\nPageWithCompounds.Float = PageFloat;\nPageWithCompounds.Body = PageBody;\nPageWithCompounds.Left = PageLeft;\nPageWithCompounds.Right = PageRight;\nPageWithCompounds.Main = PageMain;\n\nexport { PageBody, PageLeft, PageRight, PageMain, PageFooter, PageFloat };\nexport default PageWithCompounds;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_Fragment","PagePanel","PageHeader","PageFloat","ResizableAside","toCssSize","value","Page","rest","cn","fullHeight","className","PageHeaderSlot","props","levels","Fragment","level","PageBody","scroll","style","gap","PageLeft","PageLeftPanel","panel","width","bordered","hideOnMobile","resizable","PageRight","PageRightPanel","PageFooter","children","center","left","right","PageMain","PageWithCompounds"],"sources":["../../../src/components/Page/index.tsx"],"sourcesContent":["import React from 'react';\nimport PageFloat from './Float';\nimport ResizableAside, { type PageResizeProps } from './resize';\nexport type { PageFloatProps } from './Float';\nimport PageHeader, { PageHeaderProps } from '../PageHeader';\nimport { cn } from '../../utils/cn';\nimport PagePanel, { type PagePanelProps, type PageAutoHideProps } from '../PagePanel';\n\nexport type { PagePanelProps } from '../PagePanel';\n\n/**\n * Page 布局脚手架\n * ----------------------------------------------------------------------------\n * 为管理后台等页面提供统一的「页头 + 主体 + 左右侧栏」骨架,配合 PageHeader、\n * Card.Info 等组件使用。所有区域都是可选的,可按需组合。\n *\n * 典型结构:\n * <Page fullHeight>\n * <Page.Header title=\"用户管理\" actions={<Button>新建</Button>} />\n * <Page.Body scroll>\n * <Page.Left width={240}>筛选器</Page.Left>\n * <Page.Main scroll>主内容</Page.Main>\n * <Page.Right width={320}>详情</Page.Right>\n * </Page.Body>\n * </Page>\n */\n\nexport type PageProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 是否占满父容器高度并启用内部滚动(主体区滚动,页头固定) */\n fullHeight?: boolean;\n};\n\nexport type PageBodyProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 主体内的间距(left/main/right 之间),数字按 px 处理,默认 16 */\n gap?: number | string;\n /** 是否让主体区在剩余空间内滚动(配合 Page fullHeight 使用) */\n scroll?: boolean;\n};\n\nexport type PageHeaderLevel = PageHeaderProps & { key: React.Key };\nexport type PageHeaderSlotProps = PageHeaderProps & {\n /** 按顺序从上到下渲染;每级覆盖公共属性。空数组不渲染页头。 */\n levels?: readonly PageHeaderLevel[];\n};\n\nexport type PageAsideLevel = PageAsideProps & { key: React.Key };\nexport type PageAsideSlotProps = PageAsideProps & {\n /** 按 DOM 顺序从左到右渲染(小屏纵向堆叠);每级覆盖公共属性。 */\n levels?: readonly PageAsideLevel[];\n};\n\nexport type PageAsideProps = React.HTMLAttributes<HTMLDivElement> & PagePanelProps & PageResizeProps & {\n /** 侧栏宽度,数字按 px 处理;Left 默认 260,Right 默认 320。外部变化会同步到拖动宽度。 */\n width?: number | string;\n /** 是否显示分隔边框 */\n bordered?: boolean;\n /** 侧栏内部纵向滚动自适应 */\n scroll?: boolean;\n /** 小屏(<768px)下是否隐藏(侧栏通常在移动端折叠) */\n hideOnMobile?: boolean;\n};\n\nexport type PageMainProps = React.HTMLAttributes<HTMLDivElement> & {\n /** 主内容区是否在剩余空间内纵向滚动 */\n scroll?: boolean;\n};\n\nconst toCssSize = (value: number | string | undefined): string | undefined =>\n typeof value === 'number' ? `${value}px` : value;\n\nconst Page = ({ fullHeight = false, className = '', children, ...rest }: PageProps) => (\n <div\n className={cn(\n 'dishui-page flex w-full min-w-0 flex-col text-body leading-5 text-base-content',\n fullHeight && 'h-full min-h-0',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n);\n\n/** 不增加包装节点,保持 Page / Body 的布局、间距及面板开关语义。 */\nconst PageHeaderSlot = ({ levels, ...props }: PageHeaderSlotProps) => levels === undefined\n ? <PageHeader {...props} />\n : <>{levels.map(({ key, ...level }) => <PageHeader {...props} {...level} key={key} />)}</>;\n\nconst PageBody = ({ gap = 16, scroll = false, className = '', style, children, ...rest }: PageBodyProps) => (\n <div\n className={cn(\n 'dishui-page-body flex w-full flex-col md:flex-row',\n scroll && 'min-h-0 flex-1',\n className,\n )}\n style={{ ...style, gap: 0, ['--dishui-page-gap' as string]: toCssSize(style?.gap ?? gap) }}\n {...rest}\n >\n {children}\n </div>\n);\n\nconst PageLeft = ({ levels, ...props }: PageAsideSlotProps): React.ReactElement => levels === undefined\n ? PageLeftPanel(props)\n : <>{levels.map(({ key, ...level }) => <PageLeftPanel {...props} {...level} key={key} />)}</>;\n\nconst PageLeftPanel = ({\n resizeVariant = 'pill', resizable = false, minWidth = 160, maxWidth = 600, onWidthChange,\n open, mode, animated, duration,\n width = 260,\n bordered = true,\n scroll = true,\n hideOnMobile = false,\n className = '',\n style,\n children,\n ...rest\n}: PageAsideProps) => {\n const panel = <PagePanel edge=\"left\" width={style?.width ?? width} hideOnMobile={hideOnMobile} open={open} mode={mode} animated={animated} duration={duration}>\n <aside\n className={cn(\n 'dishui-page-left w-full shrink-0 md:w-(--dishui-aside-w)',\n bordered && 'md:border-r md:border-base-300 md:pr-4',\n scroll && 'md:min-h-0 md:overflow-y-auto',\n hideOnMobile && 'hidden md:block',\n className,\n )}\n style={{ ['--dishui-aside-w' as string]: toCssSize(width), ...style }}\n {...rest}\n >\n {children}\n </aside>\n </PagePanel>;\n return resizable ? <ResizableAside panel={panel} resizeVariant={resizeVariant} minWidth={minWidth} maxWidth={maxWidth} onWidthChange={onWidthChange} /> : panel;\n};\n\nconst PageRight = ({ levels, ...props }: PageAsideSlotProps): React.ReactElement => levels === undefined\n ? PageRightPanel(props)\n : <>{levels.map(({ key, ...level }) => <PageRightPanel {...props} {...level} key={key} />)}</>;\n\nconst PageRightPanel = ({\n resizeVariant = 'pill', resizable = false, minWidth = 160, maxWidth = 600, onWidthChange,\n open, mode, animated, duration,\n width = 320,\n bordered = true,\n scroll = true,\n hideOnMobile = false,\n className = '',\n style,\n children,\n ...rest\n}: PageAsideProps) => {\n const panel = <PagePanel edge=\"right\" width={style?.width ?? width} hideOnMobile={hideOnMobile} open={open} mode={mode} animated={animated} duration={duration}>\n <aside\n className={cn(\n 'dishui-page-right w-full shrink-0 md:w-(--dishui-aside-w)',\n bordered && 'md:border-l md:border-base-300 md:pl-4',\n scroll && 'md:min-h-0 md:overflow-y-auto',\n hideOnMobile && 'hidden md:block',\n className,\n )}\n style={{ ['--dishui-aside-w' as string]: toCssSize(width), ...style }}\n {...rest}\n >\n {children}\n </aside>\n </PagePanel>;\n return resizable ? <ResizableAside panel={panel} resizeVariant={resizeVariant} minWidth={minWidth} maxWidth={maxWidth} onWidthChange={onWidthChange} /> : panel;\n};\n\nexport type PageFooterProps = React.HTMLAttributes<HTMLElement> & PagePanelProps & PageAutoHideProps & {\n left?: React.ReactNode;\n center?: React.ReactNode;\n right?: React.ReactNode;\n};\n\nconst PageFooter = ({\n open, mode, animated, duration, autoHide, className, children, left, center, right, ...rest\n}: PageFooterProps) => (\n <PagePanel edge=\"footer\" autoHide={autoHide} open={open} mode={mode} animated={animated} duration={duration}>\n <footer className={cn('dishui-page-footer', className)} {...rest}>\n {children !== undefined ? children : (\n <div className=\"dishui-page-header-layout\" data-centered={center != null && center !== false || undefined}>\n {left != null && <div className=\"dishui-page-header-left\">{left}</div>}\n {center != null && <div className=\"dishui-page-header-center\">{center}</div>}\n {right != null && <div className=\"dishui-page-header-right\">{right}</div>}\n </div>\n )}\n </footer>\n </PagePanel>\n);\n\nconst PageMain = ({ scroll = false, className = '', children, ...rest }: PageMainProps) => (\n <main\n className={cn(\n 'dishui-page-main min-w-0 flex-1',\n scroll && 'min-h-0 overflow-y-auto',\n className,\n )}\n {...rest}\n >\n {children}\n </main>\n);\n\ninterface PageCompound extends React.FC<PageProps> {\n Header: typeof PageHeaderSlot;\n Footer: typeof PageFooter;\n Float: typeof PageFloat;\n Body: typeof PageBody;\n Left: typeof PageLeft;\n Right: typeof PageRight;\n Main: typeof PageMain;\n}\n\nconst PageWithCompounds = Page as PageCompound;\nPageWithCompounds.Header = PageHeaderSlot;\nPageWithCompounds.Footer = PageFooter;\nPageWithCompounds.Float = PageFloat;\nPageWithCompounds.Body = PageBody;\nPageWithCompounds.Left = PageLeft;\nPageWithCompounds.Right = PageRight;\nPageWithCompounds.Main = PageMain;\n\nexport { PageBody, PageLeft, PageRight, PageMain, PageFooter, PageFloat };\nexport default PageWithCompounds;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resize2.js","names":[],"sources":["../../../src/components/Page/resize.tsx"],"sourcesContent":["import React, { useEffect, useId, useLayoutEffect, useRef, useState } from 'react';\nimport PagePanel from '../PagePanel';\nimport { useResize } from '../Resizable/useResize';\nimport { ResizeGrip } from '../Resizable/ResizeGrip';\nimport './resize.css';\n\nexport type PageResizeProps = {\n /** 启用侧栏宽度调整,默认 false。 */\n resizable?: boolean;\n /** 调宽手柄外观,默认 pill;line 仅显示分隔线。 */\n resizeVariant?: 'pill' | 'line';\n /** 可调整的最小像素宽度,默认 160。 */\n minWidth?: number;\n /** 可调整的最大像素宽度,默认 600。 */\n maxWidth?: number;\n /** 用户调整宽度时触发,参数为像素宽度。 */\n onWidthChange?: (width: number) => void;\n};\n\nexport function resizeLimits(min = 160, max = 600) {\n const lower = Number.isFinite(min) ? Math.max(0, min) : 160;\n return [lower, Number.isFinite(max) ? Math.max(lower, max) : Math.max(lower, 600)] as const;\n}\n\nexport const clampWidth = (width: number, min: number, max: number) => Math.min(max, Math.max(min, width));\n\ntype Props = Omit<PageResizeProps, 'resizable'> & {\n panel: React.ReactElement<React.ComponentProps<typeof PagePanel>>;\n};\n\n/** Keep the legacy aside markup/scroll owner; the separator belongs to the shell. */\nexport default function ResizableAside({ panel, minWidth, maxWidth, onWidthChange, resizeVariant = 'pill' }: Props) {\n const { width = 260, open = true, edge } = panel.props;\n const [min, max] = resizeLimits(minWidth, maxWidth);\n const [local, setLocal] = useState<{ source: number | string; value?: number }>({ source: width });\n // Reset on prop changes, not on every parent render or callback notification.\n if (local.source !== width) setLocal({ source: width });\n const lastRequestedWidth = useRef<number | undefined>(undefined);\n const [measured, setMeasured] = useState(typeof width === 'number' ? clampWidth(width, min, max) : min);\n const asideRef = useRef<HTMLElement>(null);\n\n const generatedId = useId();\n const aside = panel.props.children as React.ReactElement<React.HTMLAttributes<HTMLElement>>;\n const id = aside.props.id ?? generatedId;\n const effective = local.source === width && local.value !== undefined ? clampWidth(local.value, min, max)\n : typeof width === 'number' ? clampWidth(width, min, max) : width;\n const direction = edge === 'right' ? -1 : 1;\n\n const resize = useResize({\n value: typeof effective === 'number' ? effective : measured,\n getValue: () => asideRef.current?.getBoundingClientRect().width ?? measured,\n min, max, disabled: !open,\n getScale: () => direction,\n keyboardDirection: direction,\n step: 8, shiftMultiplier: 4, threshold: 0,\n onChange: value => change(value),\n });\n const stop = resize.cancel;\n\n // Parent feedback acknowledges the drag; unrelated external changes cancel it.\n useLayoutEffect(() => {\n if (width !== lastRequestedWidth.current) stop();\n }, [width, stop]);\n useEffect(() => {\n const media = window.matchMedia('(min-width: 768px)');\n const cancel = () => stop();\n media.addEventListener('change', cancel);\n return () => { media.removeEventListener('change', cancel); stop(); };\n }, [stop]);\n useEffect(() => { if (!open) stop(); }, [open, stop]);\n useLayoutEffect(() => {\n const element = asideRef.current;\n if (!element) return;\n const measure = () => {\n if (window.matchMedia('(min-width: 768px)').matches && open) {\n setMeasured(clampWidth(element.getBoundingClientRect().width, min, max));\n }\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [min, max, open]);\n\n const change = (value: number) => {\n const next = clampWidth(value, min, max);\n const current = asideRef.current?.getBoundingClientRect().width ?? measured;\n if (next === current) return;\n lastRequestedWidth.current = next;\n setLocal({ source: width, value: next });\n setMeasured(next);\n onWidthChange?.(next);\n };\n const enabled = () => open && window.matchMedia('(min-width: 768px)').matches;\n const handle = <div\n className=\"dishui-resize-handle dishui-page-resize-handle\"\n data-orientation=\"horizontal\"\n data-variant={resizeVariant}\n data-dragging={resize.dragging || undefined}\n role=\"separator\"\n tabIndex={open ? 0 : -1}\n aria-label={edge === 'right' ? 'Resize right panel' : 'Resize left panel'}\n aria-orientation=\"vertical\"\n aria-controls={id}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={typeof effective === 'number' ? effective : measured}\n onPointerDown={event => {\n if (!enabled()) return;\n event.preventDefault();\n resize.onPointerDown(event);\n }}\n onClickCapture={resize.onClickCapture}\n onKeyDown={event => {\n if (!enabled()) return;\n resize.onKeyDown(event);\n }}\n ><ResizeGrip variant={resizeVariant} /></div>;\n return React.cloneElement(panel, {\n width: typeof effective === 'string' ? `clamp(${min}px, ${effective}, ${max}px)` : effective,\n resizeHandle: handle,\n },\n React.cloneElement(aside as React.ReactElement<React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>>, {\n ref: asideRef,\n id,\n style: { ...aside.props.style, width: undefined, '--dishui-aside-w': typeof effective === 'number' ? `${effective}px` : effective } as React.CSSProperties,\n }));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"resize2.js","names":["React","resizeLimits","lower","min","max","clampWidth","width","ResizableAside","panel","minWidth","maxWidth","local","setLocal","useState","lastRequestedWidth","useRef","measured","setMeasured","asideRef","generatedId","useId","aside","id","effective","direction","edge","resize","useResize","open","change","value","stop","useLayoutEffect","useEffect","media","cancel","element","measure","observer","next","onWidthChange","enabled","handle","resizeVariant","event","ResizeGrip"],"sources":["../../../src/components/Page/resize.tsx"],"sourcesContent":["import React, { useEffect, useId, useLayoutEffect, useRef, useState } from 'react';\nimport PagePanel from '../PagePanel';\nimport { useResize } from '../Resizable/useResize';\nimport { ResizeGrip } from '../Resizable/ResizeGrip';\nimport './resize.css';\n\nexport type PageResizeProps = {\n /** 启用侧栏宽度调整,默认 false。 */\n resizable?: boolean;\n /** 调宽手柄外观,默认 pill;line 仅显示分隔线。 */\n resizeVariant?: 'pill' | 'line';\n /** 可调整的最小像素宽度,默认 160。 */\n minWidth?: number;\n /** 可调整的最大像素宽度,默认 600。 */\n maxWidth?: number;\n /** 用户调整宽度时触发,参数为像素宽度。 */\n onWidthChange?: (width: number) => void;\n};\n\nexport function resizeLimits(min = 160, max = 600) {\n const lower = Number.isFinite(min) ? Math.max(0, min) : 160;\n return [lower, Number.isFinite(max) ? Math.max(lower, max) : Math.max(lower, 600)] as const;\n}\n\nexport const clampWidth = (width: number, min: number, max: number) => Math.min(max, Math.max(min, width));\n\ntype Props = Omit<PageResizeProps, 'resizable'> & {\n panel: React.ReactElement<React.ComponentProps<typeof PagePanel>>;\n};\n\n/** Keep the legacy aside markup/scroll owner; the separator belongs to the shell. */\nexport default function ResizableAside({ panel, minWidth, maxWidth, onWidthChange, resizeVariant = 'pill' }: Props) {\n const { width = 260, open = true, edge } = panel.props;\n const [min, max] = resizeLimits(minWidth, maxWidth);\n const [local, setLocal] = useState<{ source: number | string; value?: number }>({ source: width });\n // Reset on prop changes, not on every parent render or callback notification.\n if (local.source !== width) setLocal({ source: width });\n const lastRequestedWidth = useRef<number | undefined>(undefined);\n const [measured, setMeasured] = useState(typeof width === 'number' ? clampWidth(width, min, max) : min);\n const asideRef = useRef<HTMLElement>(null);\n\n const generatedId = useId();\n const aside = panel.props.children as React.ReactElement<React.HTMLAttributes<HTMLElement>>;\n const id = aside.props.id ?? generatedId;\n const effective = local.source === width && local.value !== undefined ? clampWidth(local.value, min, max)\n : typeof width === 'number' ? clampWidth(width, min, max) : width;\n const direction = edge === 'right' ? -1 : 1;\n\n const resize = useResize({\n value: typeof effective === 'number' ? effective : measured,\n getValue: () => asideRef.current?.getBoundingClientRect().width ?? measured,\n min, max, disabled: !open,\n getScale: () => direction,\n keyboardDirection: direction,\n step: 8, shiftMultiplier: 4, threshold: 0,\n onChange: value => change(value),\n });\n const stop = resize.cancel;\n\n // Parent feedback acknowledges the drag; unrelated external changes cancel it.\n useLayoutEffect(() => {\n if (width !== lastRequestedWidth.current) stop();\n }, [width, stop]);\n useEffect(() => {\n const media = window.matchMedia('(min-width: 768px)');\n const cancel = () => stop();\n media.addEventListener('change', cancel);\n return () => { media.removeEventListener('change', cancel); stop(); };\n }, [stop]);\n useEffect(() => { if (!open) stop(); }, [open, stop]);\n useLayoutEffect(() => {\n const element = asideRef.current;\n if (!element) return;\n const measure = () => {\n if (window.matchMedia('(min-width: 768px)').matches && open) {\n setMeasured(clampWidth(element.getBoundingClientRect().width, min, max));\n }\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [min, max, open]);\n\n const change = (value: number) => {\n const next = clampWidth(value, min, max);\n const current = asideRef.current?.getBoundingClientRect().width ?? measured;\n if (next === current) return;\n lastRequestedWidth.current = next;\n setLocal({ source: width, value: next });\n setMeasured(next);\n onWidthChange?.(next);\n };\n const enabled = () => open && window.matchMedia('(min-width: 768px)').matches;\n const handle = <div\n className=\"dishui-resize-handle dishui-page-resize-handle\"\n data-orientation=\"horizontal\"\n data-variant={resizeVariant}\n data-dragging={resize.dragging || undefined}\n role=\"separator\"\n tabIndex={open ? 0 : -1}\n aria-label={edge === 'right' ? 'Resize right panel' : 'Resize left panel'}\n aria-orientation=\"vertical\"\n aria-controls={id}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={typeof effective === 'number' ? effective : measured}\n onPointerDown={event => {\n if (!enabled()) return;\n event.preventDefault();\n resize.onPointerDown(event);\n }}\n onClickCapture={resize.onClickCapture}\n onKeyDown={event => {\n if (!enabled()) return;\n resize.onKeyDown(event);\n }}\n ><ResizeGrip variant={resizeVariant} /></div>;\n return React.cloneElement(panel, {\n width: typeof effective === 'string' ? `clamp(${min}px, ${effective}, ${max}px)` : effective,\n resizeHandle: handle,\n },\n React.cloneElement(aside as React.ReactElement<React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>>, {\n ref: asideRef,\n id,\n style: { ...aside.props.style, width: undefined, '--dishui-aside-w': typeof effective === 'number' ? `${effective}px` : effective } as React.CSSProperties,\n }));\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/PageHeader/index.tsx"],"sourcesContent":["import React from 'react';\nimport PagePanel, { type PagePanelProps, type PageAutoHideProps } from '../PagePanel';\nimport './style.css';\n\nexport type PageHeaderProps = PagePanelProps & PageAutoHideProps & {\n /** 页面标题 */\n title?: React.ReactNode;\n /** 覆盖默认图标、标题和描述;null 清空,undefined 使用旧 API。 */\n left?: React.ReactNode;\n /** 相对整个 header 水平居中的内容。 */\n center?: React.ReactNode;\n /** 覆盖 actions;null 清空,undefined 使用 actions。 */\n right?: React.ReactNode;\n /** 标题下方的描述文字 */\n description?: React.ReactNode;\n /** 标题左侧的图标(通常为 lucide 图标) */\n icon?: React.ReactNode;\n /** 右侧操作区(按钮组等) */\n actions?: React.ReactNode;\n /** 紧凑模式:标题与间距更小 */\n compact?: boolean;\n className?: string;\n};\n\nconst hasContent = (node: React.ReactNode): boolean =>\n React.Children.toArray(node).some(child =>\n React.isValidElement<{ children?: React.ReactNode }>(child) && child.type === React.Fragment\n ? hasContent(child.props.children)\n : typeof child !== 'string' || child.trim().length > 0,\n );\n\n/**\n * 页面头部:统一管理后台等页面的标题 / 描述 / 操作区排版。\n * 相比页面内手写的 `text-3xl` 标题,默认字号更精致(text-lg)。\n */\nconst PageHeader = ({\n open, mode, animated, duration, autoHide,\n title,\n description,\n icon,\n actions,\n left,\n center,\n right,\n compact = true,\n className = '',\n}: PageHeaderProps) => {\n const titleSize = compact ? 'text-lg' : 'text-xl';\n const iconSize = compact ? '[&>svg]:h-5 [&>svg]:w-5' : '[&>svg]:h-6 [&>svg]:w-6';\n const spacing = compact ? 'mb-4' : 'mb-6';\n\n\n const defaultLeft = (\n <>\n {(hasContent(icon) || hasContent(title)) && (\n <div className=\"flex min-w-0 items-center gap-2.5\">\n {hasContent(icon) && (\n <span className={`shrink-0 text-base-content/70 ${iconSize}`}>{icon}</span>\n )}\n {hasContent(title) && (\n <h1 className={`min-w-0 truncate font-semibold text-base-content ${titleSize}`}>{title}</h1>\n )}\n </div>\n )}\n {hasContent(description) && (\n <p className=\"mt-1 text-body-sm leading-5 text-base-content/70\">{description}</p>\n )}\n </>\n );\n const leftContent = left !== undefined ? left : defaultLeft;\n const rightContent = right !== undefined ? right : actions;\n\n return (\n <PagePanel edge=\"header\" autoHide={autoHide} open={open} mode={mode} animated={animated} duration={duration}>\n <header className={`dishui-page-header text-body ${spacing} ${className}`.trim()}>\n <div className=\"dishui-page-header-layout\" data-centered={hasContent(center) || undefined}>\n {hasContent(leftContent) && <div className=\"dishui-page-header-left\">{leftContent}</div>}\n {hasContent(center) && <div className=\"dishui-page-header-center\">{center}</div>}\n {hasContent(rightContent) && <div className=\"dishui-page-header-right\">{rightContent}</div>}\n </div>\n </header>\n </PagePanel>\n );\n};\n\nexport default PageHeader;\n"],"mappings":";;;;;AAwBA,IAAM,KAAc,MAChB,EAAM,SAAS,QAAQ,CAAI,CAAC,CAAC,MAAK,MAC9B,EAAM,eAA+C,CAAK,KAAK,EAAM,SAAS,EAAM,WAC9E,EAAW,EAAM,MAAM,QAAQ,IAC/B,OAAO,KAAU,YAAY,EAAM,KAAK,CAAC,CAAC,SAAS,CAC7D,GAME,KAAc,EAChB,SAAM,SAAM,aAAU,aAAU,aAChC,UACA,gBACA,SACA,YACA,SACA,WACA,UACA,aAAU,IACV,eAAY,SACO;CACnB,IAAM,IAAY,IAAU,YAAY,WAClC,IAAW,IAAU,4BAA4B,2BACjD,IAAU,IAAU,SAAS,QAG7B,IACF,kBAAA,GAAA,EAAA,UAAA,EACM,EAAW,CAAI,KAAK,EAAW,CAAK,MAClC,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACK,EAAW,CAAI,KACZ,kBAAC,QAAD;GAAM,WAAW,iCAAiC;GAAa,UAAA;EAAW,CAAA,GAE7E,EAAW,CAAK,KACb,kBAAC,MAAD;GAAI,WAAW,oDAAoD;GAAc,UAAA;EAAU,CAAA,CAE9F;CAER,CAAA,GAAA,EAAW,CAAW,KACnB,kBAAC,KAAD;EAAG,WAAU;EAAoD,UAAA;CAAe,CAAA,CAEtF,EAAA,CAAA,GAEA,IAAc,MAAS,KAAA,IAAmB,IAAP,GACnC,IAAe,MAAU,KAAA,IAAoB,IAAR;CAE3C,OACI,kBAAC,GAAD;EAAW,MAAK;EAAmB;EAAgB;EAAY;EAAgB;EAAoB;EAC/F,UAAA,kBAAC,UAAD;GAAQ,WAAW,gCAAgC,EAAQ,GAAG,IAAY,KAAK;GAC3E,UAAA,kBAAC,OAAD;IAAK,WAAU;IAA4B,iBAAe,EAAW,CAAM,KAAK,KAAA;IAAhF,UAAA;KACK,EAAW,CAAW,KAAK,kBAAC,OAAD;MAAK,WAAU;MAA2B,UAAA;KAAiB,CAAA;KACtF,EAAW,CAAM,KAAK,kBAAC,OAAD;MAAK,WAAU;MAA6B,UAAA;KAAY,CAAA;KAC9E,EAAW,CAAY,KAAK,kBAAC,OAAD;MAAK,WAAU;MAA4B,UAAA;KAAkB,CAAA;IACzF;;EACD,CAAA;CACD,CAAA;AAEnB"}
1
+ {"version":3,"file":"index.js","names":["_Fragment","PagePanel","React","hasContent","node","child","PageHeader","titleSize","compact","iconSize","spacing","defaultLeft","Fragment","icon","title","description","leftContent","left","rightContent","right","actions","className","center"],"sources":["../../../src/components/PageHeader/index.tsx"],"sourcesContent":["import React from 'react';\nimport PagePanel, { type PagePanelProps, type PageAutoHideProps } from '../PagePanel';\nimport './style.css';\n\nexport type PageHeaderProps = PagePanelProps & PageAutoHideProps & {\n /** 页面标题 */\n title?: React.ReactNode;\n /** 覆盖默认图标、标题和描述;null 清空,undefined 使用旧 API。 */\n left?: React.ReactNode;\n /** 相对整个 header 水平居中的内容。 */\n center?: React.ReactNode;\n /** 覆盖 actions;null 清空,undefined 使用 actions。 */\n right?: React.ReactNode;\n /** 标题下方的描述文字 */\n description?: React.ReactNode;\n /** 标题左侧的图标(通常为 lucide 图标) */\n icon?: React.ReactNode;\n /** 右侧操作区(按钮组等) */\n actions?: React.ReactNode;\n /** 紧凑模式:标题与间距更小 */\n compact?: boolean;\n className?: string;\n};\n\nconst hasContent = (node: React.ReactNode): boolean =>\n React.Children.toArray(node).some(child =>\n React.isValidElement<{ children?: React.ReactNode }>(child) && child.type === React.Fragment\n ? hasContent(child.props.children)\n : typeof child !== 'string' || child.trim().length > 0,\n );\n\n/**\n * 页面头部:统一管理后台等页面的标题 / 描述 / 操作区排版。\n * 相比页面内手写的 `text-3xl` 标题,默认字号更精致(text-lg)。\n */\nconst PageHeader = ({\n open, mode, animated, duration, autoHide,\n title,\n description,\n icon,\n actions,\n left,\n center,\n right,\n compact = true,\n className = '',\n}: PageHeaderProps) => {\n const titleSize = compact ? 'text-lg' : 'text-xl';\n const iconSize = compact ? '[&>svg]:h-5 [&>svg]:w-5' : '[&>svg]:h-6 [&>svg]:w-6';\n const spacing = compact ? 'mb-4' : 'mb-6';\n\n\n const defaultLeft = (\n <>\n {(hasContent(icon) || hasContent(title)) && (\n <div className=\"flex min-w-0 items-center gap-2.5\">\n {hasContent(icon) && (\n <span className={`shrink-0 text-base-content/70 ${iconSize}`}>{icon}</span>\n )}\n {hasContent(title) && (\n <h1 className={`min-w-0 truncate font-semibold text-base-content ${titleSize}`}>{title}</h1>\n )}\n </div>\n )}\n {hasContent(description) && (\n <p className=\"mt-1 text-body-sm leading-5 text-base-content/70\">{description}</p>\n )}\n </>\n );\n const leftContent = left !== undefined ? left : defaultLeft;\n const rightContent = right !== undefined ? right : actions;\n\n return (\n <PagePanel edge=\"header\" autoHide={autoHide} open={open} mode={mode} animated={animated} duration={duration}>\n <header className={`dishui-page-header text-body ${spacing} ${className}`.trim()}>\n <div className=\"dishui-page-header-layout\" data-centered={hasContent(center) || undefined}>\n {hasContent(leftContent) && <div className=\"dishui-page-header-left\">{leftContent}</div>}\n {hasContent(center) && <div className=\"dishui-page-header-center\">{center}</div>}\n {hasContent(rightContent) && <div className=\"dishui-page-header-right\">{rightContent}</div>}\n </div>\n </header>\n </PagePanel>\n );\n};\n\nexport default PageHeader;\n"],"mappings":";;;;;AAwBA,IAAMG,KAAc,MAChBD,EAAM,SAAS,QAAQE,CAAI,CAAC,CAAC,MAAK,MAC9BF,EAAM,eAA+CG,CAAK,KAAKA,EAAM,SAASH,EAAM,WAC9EC,EAAWE,EAAM,MAAM,QAAQ,IAC/B,OAAOA,KAAU,YAAYA,EAAM,KAAK,CAAC,CAAC,SAAS,CAC7D,GAMEC,KAAc,EAChB,SAAM,SAAM,aAAU,aAAU,aAChC,UACA,gBACA,SACA,YACA,SACA,WACA,UACA,aAAU,IACV,eAAY,SACO;CACnB,IAAMC,IAAYC,IAAU,YAAY,WAClCC,IAAWD,IAAU,4BAA4B,2BACjDE,IAAUF,IAAU,SAAS,QAG7BG,IACF,kBAAAX,GAAA,EAAA,UAAA,EACMG,EAAWU,CAAI,KAAKV,EAAWW,CAAK,MAClC,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACKX,EAAWU,CAAI,KACZ,kBAAC,QAAD;GAAM,WAAW,iCAAiCJ;GAAa,UAAAI;EAAW,CAAA,GAE7EV,EAAWW,CAAK,KACb,kBAAC,MAAD;GAAI,WAAW,oDAAoDP;GAAc,UAAAO;EAAU,CAAA,CAE9F;CAER,CAAA,GAAAX,EAAWY,CAAW,KACnB,kBAAC,KAAD;EAAG,WAAU;EAAoD,UAAAA;CAAe,CAAA,CAEtF,EAAA,CAAA,GAEAC,IAAcC,MAAS,KAAA,IAAmBN,IAAPM,GACnCC,IAAeC,MAAU,KAAA,IAAoBC,IAARD;CAE3C,OACI,kBAAClB,GAAD;EAAW,MAAK;EAAmB;EAAgB;EAAY;EAAgB;EAAoB;EAC/F,UAAA,kBAAC,UAAD;GAAQ,WAAW,gCAAgCS,EAAQ,GAAGW,IAAY,KAAK;GAC3E,UAAA,kBAAC,OAAD;IAAK,WAAU;IAA4B,iBAAelB,EAAWmB,CAAM,KAAK,KAAA;IAAhF,UAAA;KACKnB,EAAWa,CAAW,KAAK,kBAAC,OAAD;MAAK,WAAU;MAA2B,UAAAA;KAAiB,CAAA;KACtFb,EAAWmB,CAAM,KAAK,kBAAC,OAAD;MAAK,WAAU;MAA6B,UAAAA;KAAY,CAAA;KAC9EnB,EAAWe,CAAY,KAAK,kBAAC,OAAD;MAAK,WAAU;MAA4B,UAAAA;KAAkB,CAAA;IACzF;;EACD,CAAA;CACD,CAAA;AAEnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/PagePanel/index.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport './style.css';\n\nexport type PagePanelProps = {\n /** 是否展开,默认 true。折叠时保留内容挂载,但禁用交互。 */\n open?: boolean;\n /** push 占用布局空间;overlay 覆盖 Page / Body,默认 push。 */\n mode?: 'push' | 'overlay';\n /** 是否启用动画,默认 true;遵循 prefers-reduced-motion。 */\n animated?: boolean;\n /** 动画时长(毫秒),默认 200。 */\n duration?: number;\n};\n\nexport type PageAutoHideProps = {\n /** 正文下滚隐藏、上滚或到顶显示。默认 false;阈值默认 24px。显式 open 优先。 */\n autoHide?: boolean | {\n threshold?: number;\n /** 达到下滚阈值后等待的毫秒数,默认 0;与动画 duration 独立。 */\n delay?: number;\n };\n};\n\ntype PanelProps = PagePanelProps & PageAutoHideProps & {\n edge: 'header' | 'footer' | 'left' | 'right';\n width?: number | string;\n hideOnMobile?: boolean;\n children: React.ReactNode;\n /** Internal resize control, outside the clipping/scrolling content. */\n resizeHandle?: React.ReactNode;\n};\n\n/** Layout-only shell: consumer classes and HTML attributes stay on the semantic content. */\nconst renderPanel = ({\n open = true,\n mode = 'push',\n animated = true,\n duration = 200,\n edge,\n width,\n hideOnMobile = false,\n children,\n resizeHandle,\n}: PanelProps, ref?: React.Ref<HTMLDivElement>) => (\n <div\n ref={ref}\n className=\"dishui-page-panel\"\n data-edge={edge}\n data-resizable={resizeHandle ? true : undefined}\n data-mode={mode}\n data-open={open}\n data-hide-mobile={hideOnMobile || undefined}\n inert={!open}\n aria-hidden={!open || undefined}\n style={{\n '--dishui-panel-duration': `${animated && Number.isFinite(duration) ? Math.max(0, duration) : 0}ms`,\n '--dishui-panel-width': typeof width === 'number' ? `${width}px` : width,\n } as React.CSSProperties}\n >\n <div className=\"dishui-page-panel-clip\">{children}</div>\n {resizeHandle}\n </div>\n);\n\nconst AutoHidePanel = (props: PanelProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(true);\n const enabled = Boolean(props.autoHide) && props.open === undefined;\n const value = typeof props.autoHide === 'object' ? props.autoHide.threshold : undefined;\n const threshold = typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : 24;\n\n const requestedDelay = typeof props.autoHide === 'object' ? props.autoHide.delay : undefined;\n const delay = typeof requestedDelay === 'number' && Number.isFinite(requestedDelay) && requestedDelay >= 0\n ? Math.min(requestedDelay, 2147483647) : 0;\n\n useEffect(() => {\n if (!enabled) {\n setOpen(true);\n return;\n }\n const panel = ref.current;\n const page = panel?.closest<HTMLElement>('.dishui-page');\n if (!panel || !page) return;\n const doc = panel.ownerDocument;\n const win = doc.defaultView;\n if (!win) return;\n const main = Array.from(page.querySelectorAll<HTMLElement>('.dishui-page-main'))\n .find(node => node.closest('.dishui-page') === page);\n if (!main) return;\n const internal = () => /auto|scroll|overlay/.test(win.getComputedStyle(main).overflowY);\n const measure = () => {\n const local = internal();\n const scroller = local ? main : doc.scrollingElement!;\n return {\n local,\n top: Math.max(0, scroller.scrollTop),\n max: Math.max(0, scroller.scrollHeight - scroller.clientHeight),\n origin: local ? 0 : main.getBoundingClientRect().top + win.scrollY,\n };\n };\n let previous = measure();\n let travel = 0;\n let frame = 0;\n let hideTimer: number | undefined;\n const cancelHide = () => {\n if (hideTimer !== undefined) win.clearTimeout(hideTimer);\n hideTimer = undefined;\n };\n const visible = () => {\n const rect = page.getBoundingClientRect();\n return rect.bottom > 0 && rect.top < win.innerHeight && rect.right > 0 && rect.left < win.innerWidth;\n };\n const hide = () => {\n if (hideTimer !== undefined) return;\n const commit = () => {\n hideTimer = undefined;\n if (!panel.contains(doc.activeElement) && visible() && measure().top > 0) setOpen(false);\n };\n if (delay === 0) commit();\n else hideTimer = win.setTimeout(commit, delay);\n };\n const sample = () => {\n frame = 0;\n const next = measure();\n const rect = page.getBoundingClientRect();\n // Grid collapse, scroll anchoring and bottom clamping are layout, not intent.\n const layoutMovement = Math.abs(next.max - previous.max) + Math.abs(next.origin - previous.origin);\n const sourceChanged = next.local !== previous.local;\n const delta = next.top - previous.top;\n previous = next;\n // A larger movement cannot be explained by anchoring/clamping alone;\n // keep responding to deliberate scrolling during an animation.\n const layoutOnly = layoutMovement > 0.5 && Math.abs(delta) <= layoutMovement + 1;\n if (sourceChanged || layoutOnly || rect.bottom <= 0 || rect.top >= win.innerHeight\n || rect.right <= 0 || rect.left >= win.innerWidth) {\n travel = 0;\n if (sourceChanged || !visible()) cancelHide();\n return;\n }\n if (!delta) return;\n if (delta < 0) cancelHide();\n if (next.top <= 0) {\n cancelHide();\n travel = 0;\n setOpen(true);\n return;\n }\n if (panel.contains(doc.activeElement)) {\n cancelHide();\n travel = 0;\n return;\n }\n travel = Math.sign(delta) === Math.sign(travel) ? travel + delta : delta;\n if (Math.abs(travel) >= threshold) {\n if (travel < 0) setOpen(true);\n else hide();\n travel = 0;\n }\n };\n const schedule = () => { if (!frame) frame = win.requestAnimationFrame(sample); };\n const onScroll = (event: Event) => {\n if (internal() ? event.target === main : event.target === doc || event.target === win) schedule();\n };\n const onFocus = () => { cancelHide(); travel = 0; setOpen(true); };\n main.addEventListener('scroll', onScroll, { passive: true });\n win.addEventListener('scroll', onScroll, { passive: true });\n panel.addEventListener('focusin', onFocus);\n const observer = new ResizeObserver(schedule);\n observer.observe(main);\n observer.observe(page);\n observer.observe(doc.documentElement);\n return () => {\n main.removeEventListener('scroll', onScroll);\n win.removeEventListener('scroll', onScroll);\n panel.removeEventListener('focusin', onFocus);\n observer.disconnect();\n cancelHide();\n win.cancelAnimationFrame(frame);\n };\n }, [enabled, threshold, delay]);\n\n return renderPanel({ ...props, open: props.open ?? (enabled ? open : true) }, ref);\n};\n\nconst PagePanel = (props: PanelProps) => props.edge === 'header' || props.edge === 'footer'\n ? <AutoHidePanel {...props} />\n : renderPanel(props);\n\nexport default PagePanel;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["renderPanel","edge","resizeHandle","mode","open","hideOnMobile","animated","duration","width","AutoHidePanel","ref","useRef","setOpen","useState","enabled","props","value","threshold","requestedDelay","delay","useEffect","panel","page","doc","win","main","node","internal","measure","local","scroller","previous","travel","frame","hideTimer","cancelHide","visible","rect","hide","commit","sample","next","layoutMovement","sourceChanged","delta","layoutOnly","schedule","onScroll","event","onFocus","observer","PagePanel"],"sources":["../../../src/components/PagePanel/index.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport './style.css';\n\nexport type PagePanelProps = {\n /** 是否展开,默认 true。折叠时保留内容挂载,但禁用交互。 */\n open?: boolean;\n /** push 占用布局空间;overlay 覆盖 Page / Body,默认 push。 */\n mode?: 'push' | 'overlay';\n /** 是否启用动画,默认 true;遵循 prefers-reduced-motion。 */\n animated?: boolean;\n /** 动画时长(毫秒),默认 200。 */\n duration?: number;\n};\n\nexport type PageAutoHideProps = {\n /** 正文下滚隐藏、上滚或到顶显示。默认 false;阈值默认 24px。显式 open 优先。 */\n autoHide?: boolean | {\n threshold?: number;\n /** 达到下滚阈值后等待的毫秒数,默认 0;与动画 duration 独立。 */\n delay?: number;\n };\n};\n\ntype PanelProps = PagePanelProps & PageAutoHideProps & {\n edge: 'header' | 'footer' | 'left' | 'right';\n width?: number | string;\n hideOnMobile?: boolean;\n children: React.ReactNode;\n /** Internal resize control, outside the clipping/scrolling content. */\n resizeHandle?: React.ReactNode;\n};\n\n/** Layout-only shell: consumer classes and HTML attributes stay on the semantic content. */\nconst renderPanel = ({\n open = true,\n mode = 'push',\n animated = true,\n duration = 200,\n edge,\n width,\n hideOnMobile = false,\n children,\n resizeHandle,\n}: PanelProps, ref?: React.Ref<HTMLDivElement>) => (\n <div\n ref={ref}\n className=\"dishui-page-panel\"\n data-edge={edge}\n data-resizable={resizeHandle ? true : undefined}\n data-mode={mode}\n data-open={open}\n data-hide-mobile={hideOnMobile || undefined}\n inert={!open}\n aria-hidden={!open || undefined}\n style={{\n '--dishui-panel-duration': `${animated && Number.isFinite(duration) ? Math.max(0, duration) : 0}ms`,\n '--dishui-panel-width': typeof width === 'number' ? `${width}px` : width,\n } as React.CSSProperties}\n >\n <div className=\"dishui-page-panel-clip\">{children}</div>\n {resizeHandle}\n </div>\n);\n\nconst AutoHidePanel = (props: PanelProps) => {\n const ref = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(true);\n const enabled = Boolean(props.autoHide) && props.open === undefined;\n const value = typeof props.autoHide === 'object' ? props.autoHide.threshold : undefined;\n const threshold = typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : 24;\n\n const requestedDelay = typeof props.autoHide === 'object' ? props.autoHide.delay : undefined;\n const delay = typeof requestedDelay === 'number' && Number.isFinite(requestedDelay) && requestedDelay >= 0\n ? Math.min(requestedDelay, 2147483647) : 0;\n\n useEffect(() => {\n if (!enabled) {\n setOpen(true);\n return;\n }\n const panel = ref.current;\n const page = panel?.closest<HTMLElement>('.dishui-page');\n if (!panel || !page) return;\n const doc = panel.ownerDocument;\n const win = doc.defaultView;\n if (!win) return;\n const main = Array.from(page.querySelectorAll<HTMLElement>('.dishui-page-main'))\n .find(node => node.closest('.dishui-page') === page);\n if (!main) return;\n const internal = () => /auto|scroll|overlay/.test(win.getComputedStyle(main).overflowY);\n const measure = () => {\n const local = internal();\n const scroller = local ? main : doc.scrollingElement!;\n return {\n local,\n top: Math.max(0, scroller.scrollTop),\n max: Math.max(0, scroller.scrollHeight - scroller.clientHeight),\n origin: local ? 0 : main.getBoundingClientRect().top + win.scrollY,\n };\n };\n let previous = measure();\n let travel = 0;\n let frame = 0;\n let hideTimer: number | undefined;\n const cancelHide = () => {\n if (hideTimer !== undefined) win.clearTimeout(hideTimer);\n hideTimer = undefined;\n };\n const visible = () => {\n const rect = page.getBoundingClientRect();\n return rect.bottom > 0 && rect.top < win.innerHeight && rect.right > 0 && rect.left < win.innerWidth;\n };\n const hide = () => {\n if (hideTimer !== undefined) return;\n const commit = () => {\n hideTimer = undefined;\n if (!panel.contains(doc.activeElement) && visible() && measure().top > 0) setOpen(false);\n };\n if (delay === 0) commit();\n else hideTimer = win.setTimeout(commit, delay);\n };\n const sample = () => {\n frame = 0;\n const next = measure();\n const rect = page.getBoundingClientRect();\n // Grid collapse, scroll anchoring and bottom clamping are layout, not intent.\n const layoutMovement = Math.abs(next.max - previous.max) + Math.abs(next.origin - previous.origin);\n const sourceChanged = next.local !== previous.local;\n const delta = next.top - previous.top;\n previous = next;\n // A larger movement cannot be explained by anchoring/clamping alone;\n // keep responding to deliberate scrolling during an animation.\n const layoutOnly = layoutMovement > 0.5 && Math.abs(delta) <= layoutMovement + 1;\n if (sourceChanged || layoutOnly || rect.bottom <= 0 || rect.top >= win.innerHeight\n || rect.right <= 0 || rect.left >= win.innerWidth) {\n travel = 0;\n if (sourceChanged || !visible()) cancelHide();\n return;\n }\n if (!delta) return;\n if (delta < 0) cancelHide();\n if (next.top <= 0) {\n cancelHide();\n travel = 0;\n setOpen(true);\n return;\n }\n if (panel.contains(doc.activeElement)) {\n cancelHide();\n travel = 0;\n return;\n }\n travel = Math.sign(delta) === Math.sign(travel) ? travel + delta : delta;\n if (Math.abs(travel) >= threshold) {\n if (travel < 0) setOpen(true);\n else hide();\n travel = 0;\n }\n };\n const schedule = () => { if (!frame) frame = win.requestAnimationFrame(sample); };\n const onScroll = (event: Event) => {\n if (internal() ? event.target === main : event.target === doc || event.target === win) schedule();\n };\n const onFocus = () => { cancelHide(); travel = 0; setOpen(true); };\n main.addEventListener('scroll', onScroll, { passive: true });\n win.addEventListener('scroll', onScroll, { passive: true });\n panel.addEventListener('focusin', onFocus);\n const observer = new ResizeObserver(schedule);\n observer.observe(main);\n observer.observe(page);\n observer.observe(doc.documentElement);\n return () => {\n main.removeEventListener('scroll', onScroll);\n win.removeEventListener('scroll', onScroll);\n panel.removeEventListener('focusin', onFocus);\n observer.disconnect();\n cancelHide();\n win.cancelAnimationFrame(frame);\n };\n }, [enabled, threshold, delay]);\n\n return renderPanel({ ...props, open: props.open ?? (enabled ? open : true) }, ref);\n};\n\nconst PagePanel = (props: PanelProps) => props.edge === 'header' || props.edge === 'footer'\n ? <AutoHidePanel {...props} />\n : renderPanel(props);\n\nexport default PagePanel;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/ProtectedRoute/index.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport { useAuth } from '../../contexts/AppContext';\n\nexport type ProtectedRouteProps = {\n children: React.ReactNode;\n requiredRoles?: string[];\n requireAny?: boolean; // 如果为 true,只需要满足任一角色;如果为 false,需要满足所有角色\n fallbackPath?: string;\n fallback?: React.ReactNode;\n};\n\n/**\n * ProtectedRoute 组件\n * \n * 用于保护需要认证或特定角色才能访问的页面内容。\n * 组件渲染晚于 loader;数据访问必须使用路由 beforeLoad 和服务端授权。\n * \n * @example\n * ```tsx\n * // 基本用法 - 只需要认证\n * <ProtectedRoute>\n * <AdminPanel />\n * </ProtectedRoute>\n * \n * // 需要特定角色\n * <ProtectedRoute requiredRoles={['admin']}>\n * <AdminPanel />\n * </ProtectedRoute>\n * \n * // 需要任一角色\n * <ProtectedRoute requiredRoles={['admin', 'moderator']} requireAny>\n * <ModeratorPanel />\n * </ProtectedRoute>\n * \n * // 自定义回退路径\n * <ProtectedRoute fallbackPath=\"/unauthorized\">\n * <SecretPage />\n * </ProtectedRoute>\n * \n * // 自定义回退组件\n * <ProtectedRoute fallback={<UnauthorizedMessage />}>\n * <SecretPage />\n * </ProtectedRoute>\n * ```\n */\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({\n children,\n requiredRoles = [],\n requireAny = false,\n fallbackPath = '/login',\n fallback,\n}) => {\n const { isAuthenticated, hasRole, hasAnyRole } = useAuth();\n\n const hasRequiredRoles = requiredRoles.length === 0 || (requireAny\n ? hasAnyRole(requiredRoles)\n : requiredRoles.every(role => hasRole(role)));\n const denied = !isAuthenticated || !hasRequiredRoles;\n const destination = !isAuthenticated ? fallbackPath : '/unauthorized';\n const hasFallback = fallback !== undefined && fallback !== null;\n const lastRedirect = useRef<string | null>(null);\n\n useEffect(() => {\n if (!denied || hasFallback) {\n lastRedirect.current = null;\n return;\n }\n // StrictMode replays effects; a second hard navigation can abort the first.\n if (typeof window !== 'undefined' && lastRedirect.current !== destination) {\n lastRedirect.current = destination;\n window.location.href = destination;\n }\n }, [denied, hasFallback, destination]);\n\n if (denied) return hasFallback ? <>{fallback}</> : null;\n return <>{children}</>;\n};\n\nexport default ProtectedRoute;\n\n"],"mappings":";;;;AA6CA,IAAa,KAAiD,EAC5D,aACA,mBAAgB,CAAC,GACjB,gBAAa,IACb,kBAAe,UACf,kBACI;CACJ,IAAM,EAAE,oBAAiB,YAAS,kBAAe,EAAQ,GAEnD,IAAmB,EAAc,WAAW,MAAM,IACpD,EAAW,CAAa,IACxB,EAAc,OAAM,MAAQ,EAAQ,CAAI,CAAC,IACvC,IAAS,CAAC,KAAmB,CAAC,GAC9B,IAAe,IAAiC,kBAAf,GACjC,IAAc,KAAuC,MACrD,IAAe,EAAsB,IAAI;CAe/C,OAbA,QAAgB;EACd,IAAI,CAAC,KAAU,GAAa;GAC1B,EAAa,UAAU;GACvB;EACF;EAEA,AAAI,OAAO,SAAW,OAAe,EAAa,YAAY,MAC5D,EAAa,UAAU,GACvB,OAAO,SAAS,OAAO;CAE3B,GAAG;EAAC;EAAQ;EAAa;CAAW,CAAC,GAEjC,IAAe,IAAc,kBAAA,GAAA,EAAA,UAAG,EAAW,CAAA,IAAI,OAC5C,kBAAA,GAAA,EAAG,YAAW,CAAA;AACvB"}
1
+ {"version":3,"file":"index.js","names":["_Fragment","ProtectedRoute","useAuth","hasRequiredRoles","requiredRoles","requireAny","hasAnyRole","hasRole","role","denied","isAuthenticated","destination","fallbackPath","hasFallback","fallback","lastRedirect","useRef","useEffect","Fragment"],"sources":["../../../src/components/ProtectedRoute/index.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport { useAuth } from '../../contexts/AppContext';\n\nexport type ProtectedRouteProps = {\n children: React.ReactNode;\n requiredRoles?: string[];\n requireAny?: boolean; // 如果为 true,只需要满足任一角色;如果为 false,需要满足所有角色\n fallbackPath?: string;\n fallback?: React.ReactNode;\n};\n\n/**\n * ProtectedRoute 组件\n * \n * 用于保护需要认证或特定角色才能访问的页面内容。\n * 组件渲染晚于 loader;数据访问必须使用路由 beforeLoad 和服务端授权。\n * \n * @example\n * ```tsx\n * // 基本用法 - 只需要认证\n * <ProtectedRoute>\n * <AdminPanel />\n * </ProtectedRoute>\n * \n * // 需要特定角色\n * <ProtectedRoute requiredRoles={['admin']}>\n * <AdminPanel />\n * </ProtectedRoute>\n * \n * // 需要任一角色\n * <ProtectedRoute requiredRoles={['admin', 'moderator']} requireAny>\n * <ModeratorPanel />\n * </ProtectedRoute>\n * \n * // 自定义回退路径\n * <ProtectedRoute fallbackPath=\"/unauthorized\">\n * <SecretPage />\n * </ProtectedRoute>\n * \n * // 自定义回退组件\n * <ProtectedRoute fallback={<UnauthorizedMessage />}>\n * <SecretPage />\n * </ProtectedRoute>\n * ```\n */\nexport const ProtectedRoute: React.FC<ProtectedRouteProps> = ({\n children,\n requiredRoles = [],\n requireAny = false,\n fallbackPath = '/login',\n fallback,\n}) => {\n const { isAuthenticated, hasRole, hasAnyRole } = useAuth();\n\n const hasRequiredRoles = requiredRoles.length === 0 || (requireAny\n ? hasAnyRole(requiredRoles)\n : requiredRoles.every(role => hasRole(role)));\n const denied = !isAuthenticated || !hasRequiredRoles;\n const destination = !isAuthenticated ? fallbackPath : '/unauthorized';\n const hasFallback = fallback !== undefined && fallback !== null;\n const lastRedirect = useRef<string | null>(null);\n\n useEffect(() => {\n if (!denied || hasFallback) {\n lastRedirect.current = null;\n return;\n }\n // StrictMode replays effects; a second hard navigation can abort the first.\n if (typeof window !== 'undefined' && lastRedirect.current !== destination) {\n lastRedirect.current = destination;\n window.location.href = destination;\n }\n }, [denied, hasFallback, destination]);\n\n if (denied) return hasFallback ? <>{fallback}</> : null;\n return <>{children}</>;\n};\n\nexport default ProtectedRoute;\n\n"],"mappings":";;;;AA6CA,IAAaC,KAAiD,EAC5D,aACA,mBAAgB,CAAC,GACjB,gBAAa,IACb,kBAAe,UACf,kBACI;CACJ,IAAM,EAAE,oBAAiB,YAAS,kBAAeC,EAAQ,GAEnDC,IAAmBC,EAAc,WAAW,MAAMC,IACpDC,EAAWF,CAAa,IACxBA,EAAc,OAAM,MAAQG,EAAQC,CAAI,CAAC,IACvCC,IAAS,CAACC,KAAmB,CAACP,GAC9BQ,IAAeD,IAAiC,kBAAfE,GACjCC,IAAcC,KAAuC,MACrDC,IAAeC,EAAsB,IAAI;CAe/C,OAbAC,QAAgB;EACd,IAAI,CAACR,KAAUI,GAAa;GAC1B,EAAa,UAAU;GACvB;EACF;EAEA,AAAI,OAAO,SAAW,OAAeE,EAAa,YAAYJ,MAC5D,EAAa,UAAUA,GACvB,OAAO,SAAS,OAAOA;CAE3B,GAAG;EAACF;EAAQI;EAAaF;CAAW,CAAC,GAEjCF,IAAeI,IAAc,kBAAAb,GAAA,EAAA,UAAGc,EAAW,CAAA,IAAI,OAC5C,kBAAAd,GAAA,EAAG,YAAW,CAAA;AACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ResizeGrip.js","names":[],"sources":["../../../src/components/Resizable/ResizeGrip.tsx"],"sourcesContent":["import React from 'react';\nimport './ResizeHandle.css';\n\n/** Visual-only primitive; consumers own layout, semantics and interaction. */\nexport function ResizeGrip({ variant = 'pill' }: { variant?: 'pill' | 'line' }) {\n return variant === 'pill' ? <span className=\"dishui-resizable-grip\" aria-hidden=\"true\" /> : null;\n}\n"],"mappings":";;;;AAIA,SAAgB,EAAW,EAAE,aAAU,UAAyC;CAC9E,OAAO,MAAY,SAAS,kBAAC,QAAD;EAAM,WAAU;EAAwB,eAAY;CAAQ,CAAA,IAAI;AAC9F"}
1
+ {"version":3,"file":"ResizeGrip.js","names":["ResizeGrip","variant"],"sources":["../../../src/components/Resizable/ResizeGrip.tsx"],"sourcesContent":["import React from 'react';\nimport './ResizeHandle.css';\n\n/** Visual-only primitive; consumers own layout, semantics and interaction. */\nexport function ResizeGrip({ variant = 'pill' }: { variant?: 'pill' | 'line' }) {\n return variant === 'pill' ? <span className=\"dishui-resizable-grip\" aria-hidden=\"true\" /> : null;\n}\n"],"mappings":";;;;AAIA,SAAgBA,EAAW,EAAE,aAAU,UAAyC;CAC9E,OAAOC,MAAY,SAAS,kBAAC,QAAD;EAAM,WAAU;EAAwB,eAAY;CAAQ,CAAA,IAAI;AAC9F"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Resizable/index.tsx"],"sourcesContent":["import React, { Children, createContext, isValidElement, useContext, useId, useLayoutEffect, useRef, useState } from 'react';\nimport { useResize } from './useResize';\nimport { ResizeGrip } from './ResizeGrip';\nimport './Resizable.css';\nexport { useResize } from './useResize';\nexport type { UseResizeOptions } from './useResize';\n\nexport interface ResizablePanelProps extends React.HTMLAttributes<HTMLDivElement> {\n minSize?: number;\n maxSize?: number;\n}\nexport interface ResizableHandleProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: 'line' | 'pill';\n disabled?: boolean;\n step?: number;\n}\nexport interface ResizableProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: 'horizontal' | 'vertical';\n sizes?: number[];\n defaultSizes?: number[];\n onSizesChange?: (sizes: number[]) => void;\n onSizesCommit?: (sizes: number[]) => void;\n disabled?: boolean;\n}\ninterface GroupContext {\n orientation: 'horizontal' | 'vertical';\n disabled: boolean;\n sizes: number[];\n bounds: { min: number; max: number }[];\n ids: string[];\n root: React.RefObject<HTMLDivElement | null>;\n change: (index: number, value: number, commit?: boolean) => void;\n}\nconst Group = createContext<GroupContext | null>(null);\nconst Position = createContext(0);\n\nexport function ResizablePanel({ minSize: _min, maxSize: _max, className = '', style, ...props }: ResizablePanelProps) {\n const group = useContext(Group);\n const index = useContext(Position);\n if (!group) throw new Error('Resizable.Panel must be inside Resizable');\n return <div {...props} id={group.ids[index]} className={`dishui-resizable-panel ${className}`} style={{ ...style, flex: `${group.sizes[index]} 1 0px` }} />;\n}\n\nexport function ResizableHandle({ variant = 'pill', disabled = false, step = 1, className = '', onPointerDown, onKeyDown, onClickCapture, children, ...props }: ResizableHandleProps) {\n const group = useContext(Group);\n const index = useContext(Position);\n if (!group) throw new Error('Resizable.Handle must be inside Resizable');\n const total = group.sizes[index] + group.sizes[index + 1];\n const min = Math.max(group.bounds[index].min, total - group.bounds[index + 1].max);\n const max = Math.min(group.bounds[index].max, total - group.bounds[index + 1].min);\n const locked = disabled || group.disabled || min >= max;\n const resize = useResize({\n orientation: group.orientation, value: group.sizes[index], min, max, disabled: locked, step,\n getScale: () => {\n const root = group.root.current;\n if (!root) return 0;\n const dimension = group.orientation === 'horizontal' ? 'width' : 'height';\n const available = Array.from(root.children).filter(el => el.classList.contains('dishui-resizable-panel')).reduce((sum, el) => sum + el.getBoundingClientRect()[dimension], 0);\n const rtl = group.orientation === 'horizontal' && getComputedStyle(root).direction === 'rtl';\n return available > 0 ? (rtl ? -100 : 100) / available : 0;\n },\n onChange: value => group.change(index, value),\n onCommit: value => group.change(index, value, true),\n });\n return <div {...props} role=\"separator\" tabIndex={locked ? -1 : 0}\n aria-label={props['aria-label'] ?? 'Resize panels'} aria-orientation={group.orientation === 'horizontal' ? 'vertical' : 'horizontal'}\n aria-controls={group.ids[index]} aria-valuemin={min} aria-valuemax={max} aria-valuenow={group.sizes[index]} aria-valuetext={`${Number(group.sizes[index].toFixed(2))}%`} aria-disabled={locked}\n data-orientation={group.orientation} data-variant={variant} data-dragging={resize.dragging || undefined}\n className={`dishui-resize-handle dishui-resizable-handle ${className}`}\n onPointerDown={event => { onPointerDown?.(event); if (!event.defaultPrevented) resize.onPointerDown(event); }}\n onKeyDown={event => { onKeyDown?.(event); if (!event.defaultPrevented) resize.onKeyDown(event); }}\n onClickCapture={event => { resize.onClickCapture(event); if (!event.defaultPrevented) onClickCapture?.(event); }}>\n {children ?? <ResizeGrip variant={variant} />}\n </div>;\n}\n\nfunction ResizableRoot({ orientation = 'horizontal', sizes: controlled, defaultSizes, onSizesChange, onSizesCommit, disabled = false, children, className = '', style, ...props }: ResizableProps) {\n const root = useRef<HTMLDivElement>(null);\n const id = useId();\n const nodes = Children.toArray(children);\n if (!nodes.length || nodes.some((node, i) => !isValidElement(node) || node.type !== (i % 2 === 0 ? ResizablePanel : ResizableHandle)) || nodes.length % 2 === 0) {\n throw new Error('Resizable requires alternating Panel / Handle children, starting and ending with Panel. Nest groups inside a Panel.');\n }\n const panels = nodes.filter((_, i) => i % 2 === 0) as React.ReactElement<ResizablePanelProps>[];\n const bounds = panels.map(panel => ({ min: panel.props.minSize ?? 0, max: panel.props.maxSize ?? 100 }));\n if (bounds.some(b => !Number.isFinite(b.min) || !Number.isFinite(b.max) || b.min < 0 || b.max > 100 || b.min > b.max) || bounds.reduce((s, b) => s + b.min, 0) > 100 || bounds.reduce((s, b) => s + b.max, 0) < 100) throw new Error('Resizable panel constraints must be feasible percentages between 0 and 100');\n const normalize = (input?: number[]) => {\n if (input && (input.length !== panels.length || input.some(v => !Number.isFinite(v) || v < 0) || Math.abs(input.reduce((s, v) => s + v, 0) - 100) > 0.001)) throw new Error('Resizable sizes must match the panel count and sum to 100');\n const values = bounds.map((b, i) => Math.max(b.min, Math.min(b.max, input?.[i] ?? 100 / panels.length)));\n let remaining = 100 - values.reduce((s, v) => s + v, 0);\n for (let i = 0; i < values.length && Math.abs(remaining) > 1e-8; i++) {\n const delta = Math.max(bounds[i].min - values[i], Math.min(bounds[i].max - values[i], remaining));\n values[i] += delta;\n remaining -= delta;\n }\n return values;\n };\n const [internal, setInternal] = useState(() => normalize(defaultSizes));\n const sizes = normalize(controlled ?? (internal.length === panels.length ? internal : undefined));\n const current = useRef(sizes);\n useLayoutEffect(() => { current.current = sizes; });\n const change = (index: number, value: number, commit = false) => {\n const next = [...current.current];\n const total = next[index] + next[index + 1];\n next[index] = value;\n next[index + 1] = total - value;\n if (commit) { onSizesCommit?.(next); return; }\n if (!controlled) { current.current = next; setInternal(next); }\n onSizesChange?.(next);\n };\n const ids = panels.map((panel, i) => panel.props.id ?? `${id}-panel-${i}`);\n return <Group.Provider value={{ orientation, disabled, sizes, bounds, ids, root, change }}>\n <div {...props} ref={root} className={`dishui-resizable ${className}`} data-orientation={orientation} style={style}>\n {nodes.map((node, i) => <Position.Provider key={(node as React.ReactElement).key ?? i} value={Math.floor(i / 2)}>{node}</Position.Provider>)}\n </div>\n </Group.Provider>;\n}\n\nexport const Resizable = Object.assign(ResizableRoot, { Panel: ResizablePanel, Handle: ResizableHandle });\nexport default Resizable;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["Group","createContext","Position","ResizablePanel","_min","_max","props","group","useContext","index","className","style","ResizableHandle","total","min","max","locked","disabled","resize","useResize","root","dimension","available","el","sum","rtl","value","variant","onPointerDown","event","onKeyDown","onClickCapture","children","ResizeGrip","ResizableRoot","controlled","useRef","id","useId","nodes","Children","isValidElement","node","i","panels","bounds","panel","b","s","normalize","input","v","values","remaining","delta","internal","setInternal","useState","defaultSizes","sizes","current","change","next","commit","onSizesChange","ids","orientation","Resizable"],"sources":["../../../src/components/Resizable/index.tsx"],"sourcesContent":["import React, { Children, createContext, isValidElement, useContext, useId, useLayoutEffect, useRef, useState } from 'react';\nimport { useResize } from './useResize';\nimport { ResizeGrip } from './ResizeGrip';\nimport './Resizable.css';\nexport { useResize } from './useResize';\nexport type { UseResizeOptions } from './useResize';\n\nexport interface ResizablePanelProps extends React.HTMLAttributes<HTMLDivElement> {\n minSize?: number;\n maxSize?: number;\n}\nexport interface ResizableHandleProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: 'line' | 'pill';\n disabled?: boolean;\n step?: number;\n}\nexport interface ResizableProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: 'horizontal' | 'vertical';\n sizes?: number[];\n defaultSizes?: number[];\n onSizesChange?: (sizes: number[]) => void;\n onSizesCommit?: (sizes: number[]) => void;\n disabled?: boolean;\n}\ninterface GroupContext {\n orientation: 'horizontal' | 'vertical';\n disabled: boolean;\n sizes: number[];\n bounds: { min: number; max: number }[];\n ids: string[];\n root: React.RefObject<HTMLDivElement | null>;\n change: (index: number, value: number, commit?: boolean) => void;\n}\nconst Group = createContext<GroupContext | null>(null);\nconst Position = createContext(0);\n\nexport function ResizablePanel({ minSize: _min, maxSize: _max, className = '', style, ...props }: ResizablePanelProps) {\n const group = useContext(Group);\n const index = useContext(Position);\n if (!group) throw new Error('Resizable.Panel must be inside Resizable');\n return <div {...props} id={group.ids[index]} className={`dishui-resizable-panel ${className}`} style={{ ...style, flex: `${group.sizes[index]} 1 0px` }} />;\n}\n\nexport function ResizableHandle({ variant = 'pill', disabled = false, step = 1, className = '', onPointerDown, onKeyDown, onClickCapture, children, ...props }: ResizableHandleProps) {\n const group = useContext(Group);\n const index = useContext(Position);\n if (!group) throw new Error('Resizable.Handle must be inside Resizable');\n const total = group.sizes[index] + group.sizes[index + 1];\n const min = Math.max(group.bounds[index].min, total - group.bounds[index + 1].max);\n const max = Math.min(group.bounds[index].max, total - group.bounds[index + 1].min);\n const locked = disabled || group.disabled || min >= max;\n const resize = useResize({\n orientation: group.orientation, value: group.sizes[index], min, max, disabled: locked, step,\n getScale: () => {\n const root = group.root.current;\n if (!root) return 0;\n const dimension = group.orientation === 'horizontal' ? 'width' : 'height';\n const available = Array.from(root.children).filter(el => el.classList.contains('dishui-resizable-panel')).reduce((sum, el) => sum + el.getBoundingClientRect()[dimension], 0);\n const rtl = group.orientation === 'horizontal' && getComputedStyle(root).direction === 'rtl';\n return available > 0 ? (rtl ? -100 : 100) / available : 0;\n },\n onChange: value => group.change(index, value),\n onCommit: value => group.change(index, value, true),\n });\n return <div {...props} role=\"separator\" tabIndex={locked ? -1 : 0}\n aria-label={props['aria-label'] ?? 'Resize panels'} aria-orientation={group.orientation === 'horizontal' ? 'vertical' : 'horizontal'}\n aria-controls={group.ids[index]} aria-valuemin={min} aria-valuemax={max} aria-valuenow={group.sizes[index]} aria-valuetext={`${Number(group.sizes[index].toFixed(2))}%`} aria-disabled={locked}\n data-orientation={group.orientation} data-variant={variant} data-dragging={resize.dragging || undefined}\n className={`dishui-resize-handle dishui-resizable-handle ${className}`}\n onPointerDown={event => { onPointerDown?.(event); if (!event.defaultPrevented) resize.onPointerDown(event); }}\n onKeyDown={event => { onKeyDown?.(event); if (!event.defaultPrevented) resize.onKeyDown(event); }}\n onClickCapture={event => { resize.onClickCapture(event); if (!event.defaultPrevented) onClickCapture?.(event); }}>\n {children ?? <ResizeGrip variant={variant} />}\n </div>;\n}\n\nfunction ResizableRoot({ orientation = 'horizontal', sizes: controlled, defaultSizes, onSizesChange, onSizesCommit, disabled = false, children, className = '', style, ...props }: ResizableProps) {\n const root = useRef<HTMLDivElement>(null);\n const id = useId();\n const nodes = Children.toArray(children);\n if (!nodes.length || nodes.some((node, i) => !isValidElement(node) || node.type !== (i % 2 === 0 ? ResizablePanel : ResizableHandle)) || nodes.length % 2 === 0) {\n throw new Error('Resizable requires alternating Panel / Handle children, starting and ending with Panel. Nest groups inside a Panel.');\n }\n const panels = nodes.filter((_, i) => i % 2 === 0) as React.ReactElement<ResizablePanelProps>[];\n const bounds = panels.map(panel => ({ min: panel.props.minSize ?? 0, max: panel.props.maxSize ?? 100 }));\n if (bounds.some(b => !Number.isFinite(b.min) || !Number.isFinite(b.max) || b.min < 0 || b.max > 100 || b.min > b.max) || bounds.reduce((s, b) => s + b.min, 0) > 100 || bounds.reduce((s, b) => s + b.max, 0) < 100) throw new Error('Resizable panel constraints must be feasible percentages between 0 and 100');\n const normalize = (input?: number[]) => {\n if (input && (input.length !== panels.length || input.some(v => !Number.isFinite(v) || v < 0) || Math.abs(input.reduce((s, v) => s + v, 0) - 100) > 0.001)) throw new Error('Resizable sizes must match the panel count and sum to 100');\n const values = bounds.map((b, i) => Math.max(b.min, Math.min(b.max, input?.[i] ?? 100 / panels.length)));\n let remaining = 100 - values.reduce((s, v) => s + v, 0);\n for (let i = 0; i < values.length && Math.abs(remaining) > 1e-8; i++) {\n const delta = Math.max(bounds[i].min - values[i], Math.min(bounds[i].max - values[i], remaining));\n values[i] += delta;\n remaining -= delta;\n }\n return values;\n };\n const [internal, setInternal] = useState(() => normalize(defaultSizes));\n const sizes = normalize(controlled ?? (internal.length === panels.length ? internal : undefined));\n const current = useRef(sizes);\n useLayoutEffect(() => { current.current = sizes; });\n const change = (index: number, value: number, commit = false) => {\n const next = [...current.current];\n const total = next[index] + next[index + 1];\n next[index] = value;\n next[index + 1] = total - value;\n if (commit) { onSizesCommit?.(next); return; }\n if (!controlled) { current.current = next; setInternal(next); }\n onSizesChange?.(next);\n };\n const ids = panels.map((panel, i) => panel.props.id ?? `${id}-panel-${i}`);\n return <Group.Provider value={{ orientation, disabled, sizes, bounds, ids, root, change }}>\n <div {...props} ref={root} className={`dishui-resizable ${className}`} data-orientation={orientation} style={style}>\n {nodes.map((node, i) => <Position.Provider key={(node as React.ReactElement).key ?? i} value={Math.floor(i / 2)}>{node}</Position.Provider>)}\n </div>\n </Group.Provider>;\n}\n\nexport const Resizable = Object.assign(ResizableRoot, { Panel: ResizablePanel, Handle: ResizableHandle });\nexport default Resizable;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useResize.js","names":[],"sources":["../../../src/components/Resizable/useResize.ts"],"sourcesContent":["import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nexport interface UseResizeOptions {\n orientation?: 'horizontal' | 'vertical';\n value: number;\n min?: number;\n max?: number;\n disabled?: boolean;\n step?: number;\n /** Arrow-key direction; independent of pointer scaling. Defaults to 1. */\n keyboardDirection?: 1 | -1;\n shiftMultiplier?: number;\n /** Read the actual size at pointer down / key down (e.g. CSS-sized edges). */\n getValue?: () => number;\n /** Value units per CSS pixel; evaluated at pointer down. */\n getScale?: () => number;\n threshold?: number;\n onChange: (value: number) => void;\n onCommit?: (value: number) => void;\n}\n\n/** Shared pointer/keyboard engine. Does not mutate document/body styles. */\nexport function useResize(options: UseResizeOptions) {\n const latest = useRef(options);\n useLayoutEffect(() => { latest.current = options; });\n const cleanup = useRef<(() => void) | null>(null);\n const suppressClick = useRef(false);\n const [dragging, setDragging] = useState(false);\n const cancel = useCallback(() => cleanup.current?.(), []);\n useEffect(() => () => cleanup.current?.(), []);\n useEffect(() => { if (options.disabled) cleanup.current?.(); }, [options.disabled]);\n const clamp = (v: number) => Math.max(latest.current.min ?? 0, Math.min(latest.current.max ?? 100, v));\n const onPointerDown = (event: React.PointerEvent<HTMLElement>) => {\n if (latest.current.disabled || event.button !== 0 || !event.isPrimary || cleanup.current) return;\n event.stopPropagation();\n const el = event.currentTarget;\n el.focus();\n const id = event.pointerId;\n const { orientation = 'horizontal', getScale, threshold = 3 } = latest.current;\n const value = latest.current.getValue?.() ?? latest.current.value;\n const start = orientation === 'horizontal' ? event.clientX : event.clientY;\n const scale = getScale?.() ?? 1;\n if (!Number.isFinite(scale) || scale === 0) return;\n let moved = false;\n let last = value;\n suppressClick.current = false;\n const finish = (commit = false) => {\n el.removeEventListener('pointermove', move);\n el.removeEventListener('pointerup', up);\n el.removeEventListener('pointercancel', cancel);\n el.removeEventListener('lostpointercapture', cancel);\n el.ownerDocument.defaultView?.removeEventListener('blur', cancel);\n cleanup.current = null;\n if (el.hasPointerCapture(id)) el.releasePointerCapture(id);\n setDragging(false);\n if (commit && moved) latest.current.onCommit?.(last);\n };\n const move = (e: PointerEvent) => {\n if (e.pointerId !== id) return;\n const delta = (orientation === 'horizontal' ? e.clientX : e.clientY) - start;\n if (!moved && Math.abs(delta) <= threshold) return;\n moved = true;\n suppressClick.current = true;\n setDragging(true);\n e.preventDefault();\n last = clamp(value + delta * scale);\n latest.current.onChange(last);\n };\n const up = (e: PointerEvent) => { if (e.pointerId === id) finish(true); };\n const cancel = (cancelEvent?: Event) => {\n if (cancelEvent && 'pointerId' in cancelEvent && (cancelEvent as PointerEvent).pointerId !== id) return;\n suppressClick.current = true;\n finish();\n };\n try { el.setPointerCapture(id); } catch { return; }\n el.addEventListener('pointermove', move);\n el.addEventListener('pointerup', up);\n el.addEventListener('pointercancel', cancel);\n el.addEventListener('lostpointercapture', cancel);\n el.ownerDocument.defaultView?.addEventListener('blur', cancel);\n cleanup.current = cancel;\n };\n const onKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n const { disabled, orientation = 'horizontal', min = 0, max = 100, step = 1, keyboardDirection = 1, shiftMultiplier = 10 } = latest.current;\n if (disabled) return;\n const value = latest.current.getValue?.() ?? latest.current.value;\n const negative = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';\n const positive = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown';\n let next: number;\n if (event.key === 'Home') next = min;\n else if (event.key === 'End') next = max;\n else if (event.key === negative || event.key === positive) next = value + (event.key === negative ? -1 : 1) * keyboardDirection * step * (event.shiftKey ? shiftMultiplier : 1);\n else return;\n event.preventDefault();\n event.stopPropagation();\n next = clamp(next);\n latest.current.onChange(next);\n latest.current.onCommit?.(next);\n };\n const onClickCapture = (event: React.MouseEvent<HTMLElement>) => {\n if (suppressClick.current && event.detail !== 0) {\n event.preventDefault();\n event.stopPropagation();\n suppressClick.current = false;\n }\n };\n return { dragging, cancel, onPointerDown, onKeyDown, onClickCapture };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useResize.js","names":["useResize","latest","useRef","options","cleanup","suppressClick","dragging","setDragging","useState","cancel","useCallback","useEffect","clamp","v","event","el","id","value","start","orientation","scale","getScale","moved","last","finish","move","up","commit","delta","threshold","cancelEvent","disabled","negative","positive","next","min","max","keyboardDirection","step","shiftMultiplier"],"sources":["../../../src/components/Resizable/useResize.ts"],"sourcesContent":["import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nexport interface UseResizeOptions {\n orientation?: 'horizontal' | 'vertical';\n value: number;\n min?: number;\n max?: number;\n disabled?: boolean;\n step?: number;\n /** Arrow-key direction; independent of pointer scaling. Defaults to 1. */\n keyboardDirection?: 1 | -1;\n shiftMultiplier?: number;\n /** Read the actual size at pointer down / key down (e.g. CSS-sized edges). */\n getValue?: () => number;\n /** Value units per CSS pixel; evaluated at pointer down. */\n getScale?: () => number;\n threshold?: number;\n onChange: (value: number) => void;\n onCommit?: (value: number) => void;\n}\n\n/** Shared pointer/keyboard engine. Does not mutate document/body styles. */\nexport function useResize(options: UseResizeOptions) {\n const latest = useRef(options);\n useLayoutEffect(() => { latest.current = options; });\n const cleanup = useRef<(() => void) | null>(null);\n const suppressClick = useRef(false);\n const [dragging, setDragging] = useState(false);\n const cancel = useCallback(() => cleanup.current?.(), []);\n useEffect(() => () => cleanup.current?.(), []);\n useEffect(() => { if (options.disabled) cleanup.current?.(); }, [options.disabled]);\n const clamp = (v: number) => Math.max(latest.current.min ?? 0, Math.min(latest.current.max ?? 100, v));\n const onPointerDown = (event: React.PointerEvent<HTMLElement>) => {\n if (latest.current.disabled || event.button !== 0 || !event.isPrimary || cleanup.current) return;\n event.stopPropagation();\n const el = event.currentTarget;\n el.focus();\n const id = event.pointerId;\n const { orientation = 'horizontal', getScale, threshold = 3 } = latest.current;\n const value = latest.current.getValue?.() ?? latest.current.value;\n const start = orientation === 'horizontal' ? event.clientX : event.clientY;\n const scale = getScale?.() ?? 1;\n if (!Number.isFinite(scale) || scale === 0) return;\n let moved = false;\n let last = value;\n suppressClick.current = false;\n const finish = (commit = false) => {\n el.removeEventListener('pointermove', move);\n el.removeEventListener('pointerup', up);\n el.removeEventListener('pointercancel', cancel);\n el.removeEventListener('lostpointercapture', cancel);\n el.ownerDocument.defaultView?.removeEventListener('blur', cancel);\n cleanup.current = null;\n if (el.hasPointerCapture(id)) el.releasePointerCapture(id);\n setDragging(false);\n if (commit && moved) latest.current.onCommit?.(last);\n };\n const move = (e: PointerEvent) => {\n if (e.pointerId !== id) return;\n const delta = (orientation === 'horizontal' ? e.clientX : e.clientY) - start;\n if (!moved && Math.abs(delta) <= threshold) return;\n moved = true;\n suppressClick.current = true;\n setDragging(true);\n e.preventDefault();\n last = clamp(value + delta * scale);\n latest.current.onChange(last);\n };\n const up = (e: PointerEvent) => { if (e.pointerId === id) finish(true); };\n const cancel = (cancelEvent?: Event) => {\n if (cancelEvent && 'pointerId' in cancelEvent && (cancelEvent as PointerEvent).pointerId !== id) return;\n suppressClick.current = true;\n finish();\n };\n try { el.setPointerCapture(id); } catch { return; }\n el.addEventListener('pointermove', move);\n el.addEventListener('pointerup', up);\n el.addEventListener('pointercancel', cancel);\n el.addEventListener('lostpointercapture', cancel);\n el.ownerDocument.defaultView?.addEventListener('blur', cancel);\n cleanup.current = cancel;\n };\n const onKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n const { disabled, orientation = 'horizontal', min = 0, max = 100, step = 1, keyboardDirection = 1, shiftMultiplier = 10 } = latest.current;\n if (disabled) return;\n const value = latest.current.getValue?.() ?? latest.current.value;\n const negative = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';\n const positive = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown';\n let next: number;\n if (event.key === 'Home') next = min;\n else if (event.key === 'End') next = max;\n else if (event.key === negative || event.key === positive) next = value + (event.key === negative ? -1 : 1) * keyboardDirection * step * (event.shiftKey ? shiftMultiplier : 1);\n else return;\n event.preventDefault();\n event.stopPropagation();\n next = clamp(next);\n latest.current.onChange(next);\n latest.current.onCommit?.(next);\n };\n const onClickCapture = (event: React.MouseEvent<HTMLElement>) => {\n if (suppressClick.current && event.detail !== 0) {\n event.preventDefault();\n event.stopPropagation();\n suppressClick.current = false;\n }\n };\n return { dragging, cancel, onPointerDown, onKeyDown, onClickCapture };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Row/index.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { FLEX_ALIGN_CLASS, FLEX_JUSTIFY_CLASS, flexGap, type FlexAlign, type FlexJustify } from '../../utils/flexLayout';\n\nexport type RowAlign = FlexAlign;\nexport type RowJustify = FlexJustify;\n\nexport type RowProps = {\n children?: React.ReactNode;\n /** Gap between children; number is treated as px. */\n gap?: number | string;\n /** Cross-axis alignment. */\n align?: RowAlign;\n /** Main-axis distribution. */\n justify?: RowJustify;\n /** Allow children to wrap onto the next line. */\n wrap?: boolean;\n /** Reverse the visual order of children. */\n reverse?: boolean;\n /** Extra class names on the container. */\n className?: string;\n /** Inline styles on the container. */\n style?: React.CSSProperties;\n /** Click handler on the container. */\n onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;\n};\n\n\n/**\n * Row —— A2UI 布局组件:水平排列子元素。\n * 等价于 `display: flex; flex-direction: row` 的语义化封装。\n */\nconst Row: React.FC<RowProps> = ({\n children,\n gap,\n align = 'center',\n justify = 'start',\n wrap = false,\n reverse = false,\n className = '',\n style,\n onClick,\n}) => (\n <div\n className={cn(\n 'flex',\n reverse ? 'flex-row-reverse' : 'flex-row',\n FLEX_ALIGN_CLASS[align],\n FLEX_JUSTIFY_CLASS[justify],\n wrap && 'flex-wrap',\n className,\n )}\n style={{ gap: flexGap(gap), ...style }}\n onClick={onClick}\n >\n {children}\n </div>\n);\n\nexport default Row;\n"],"mappings":";;;;;AAgCA,IAAM,KAA2B,EAC/B,aACA,QACA,WAAQ,UACR,aAAU,SACV,UAAO,IACP,aAAU,IACV,eAAY,IACZ,UACA,iBAEA,kBAAC,OAAD;CACE,WAAW,EACT,QACA,IAAU,qBAAqB,YAC/B,EAAiB,IACjB,EAAmB,IACnB,KAAQ,aACR,CACF;CACA,OAAO;EAAE,KAAK,EAAQ,CAAG;EAAG,GAAG;CAAM;CAC5B;CAER;AACE,CAAA"}
1
+ {"version":3,"file":"index.js","names":["Row","cn","reverse","FLEX_ALIGN_CLASS","align","FLEX_JUSTIFY_CLASS","justify","wrap","className","flexGap","gap","style"],"sources":["../../../src/components/Row/index.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\nimport { FLEX_ALIGN_CLASS, FLEX_JUSTIFY_CLASS, flexGap, type FlexAlign, type FlexJustify } from '../../utils/flexLayout';\n\nexport type RowAlign = FlexAlign;\nexport type RowJustify = FlexJustify;\n\nexport type RowProps = {\n children?: React.ReactNode;\n /** Gap between children; number is treated as px. */\n gap?: number | string;\n /** Cross-axis alignment. */\n align?: RowAlign;\n /** Main-axis distribution. */\n justify?: RowJustify;\n /** Allow children to wrap onto the next line. */\n wrap?: boolean;\n /** Reverse the visual order of children. */\n reverse?: boolean;\n /** Extra class names on the container. */\n className?: string;\n /** Inline styles on the container. */\n style?: React.CSSProperties;\n /** Click handler on the container. */\n onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;\n};\n\n\n/**\n * Row —— A2UI 布局组件:水平排列子元素。\n * 等价于 `display: flex; flex-direction: row` 的语义化封装。\n */\nconst Row: React.FC<RowProps> = ({\n children,\n gap,\n align = 'center',\n justify = 'start',\n wrap = false,\n reverse = false,\n className = '',\n style,\n onClick,\n}) => (\n <div\n className={cn(\n 'flex',\n reverse ? 'flex-row-reverse' : 'flex-row',\n FLEX_ALIGN_CLASS[align],\n FLEX_JUSTIFY_CLASS[justify],\n wrap && 'flex-wrap',\n className,\n )}\n style={{ gap: flexGap(gap), ...style }}\n onClick={onClick}\n >\n {children}\n </div>\n);\n\nexport default Row;\n"],"mappings":";;;;;AAgCA,IAAMA,KAA2B,EAC/B,aACA,QACA,WAAQ,UACR,aAAU,SACV,UAAO,IACP,aAAU,IACV,eAAY,IACZ,UACA,iBAEA,kBAAC,OAAD;CACE,WAAWC,EACT,QACAC,IAAU,qBAAqB,YAC/BC,EAAiBC,IACjBC,EAAmBC,IACnBC,KAAQ,aACRC,CACF;CACA,OAAO;EAAE,KAAKC,EAAQC,CAAG;EAAG,GAAGC;CAAM;CAC5B;CAER;AACE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Section/index.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\nimport './Section.css';\n\nexport type SectionProps = React.HTMLAttributes<HTMLElement> & {\n /** 区块标题(渲染为 h2) */\n title?: React.ReactNode;\n /** 标题下方的辅助说明 */\n description?: React.ReactNode;\n /** 头部右侧操作区(按钮、筛选等) */\n actions?: React.ReactNode;\n /** 底部脚注区 */\n footer?: React.ReactNode;\n /** `card`(默认,带边框/圆角/背景)| `plain`(无外框,仅分组语义与间距) */\n variant?: 'card' | 'plain';\n /** 移除主体内边距(用于表格等需要贴边的内容) */\n flush?: boolean;\n /** 标题层级,默认 2 */\n headingLevel?: 2 | 3 | 4;\n children?: React.ReactNode;\n};\n\nexport type SectionSlotProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst SectionHeader = ({ className, children, ...rest }: SectionSlotProps) => (\n <div {...rest} className={cn('dishui-section__header', className)}>{children}</div>\n);\n\nconst SectionBody = ({ className, children, ...rest }: SectionSlotProps & { flush?: boolean }) => {\n const { flush, ...divProps } = rest as SectionSlotProps & { flush?: boolean };\n return (\n <div {...divProps} className={cn('dishui-section__body', flush && 'dishui-section__body--flush', className)}>\n {children}\n </div>\n );\n};\n\nconst SectionFooter = ({ className, children, ...rest }: SectionSlotProps) => (\n <div {...rest} className={cn('dishui-section__footer', className)}>{children}</div>\n);\n\ninterface SectionCompound extends React.FC<SectionProps> {\n Header: React.FC<SectionSlotProps>;\n Body: React.FC<SectionSlotProps & { flush?: boolean }>;\n Footer: React.FC<SectionSlotProps>;\n}\n\n/**\n * Section 区块容器\n * ----------------------------------------------------------------------------\n * 用于按区块封装内容:可传 `title` / `description` / `actions` / `footer` 走\n * 便捷模式,或用 `Section.Header` / `Section.Body` / `Section.Footer` 复合组合。\n */\nconst Section = ({\n title, description, actions, footer,\n variant = 'card', flush = false, headingLevel = 2,\n className, children, ...rest\n}: SectionProps) => {\n const HeadingTag = `h${headingLevel}` as 'h2' | 'h3' | 'h4';\n const hasHeader = title != null || description != null || actions != null;\n\n return (\n <section {...rest} className={cn('dishui-section', variant === 'plain' && 'dishui-section--plain', className)}>\n {hasHeader && (\n <div className=\"dishui-section__header\">\n <div className=\"dishui-section__headings\">\n {title != null && <HeadingTag className=\"dishui-section__title\">{title}</HeadingTag>}\n {description != null && <p className=\"dishui-section__description\">{description}</p>}\n </div>\n {actions != null && <div className=\"dishui-section__actions\">{actions}</div>}\n </div>\n )}\n <div className={cn('dishui-section__body', flush && 'dishui-section__body--flush')}>{children}</div>\n {footer != null && <div className=\"dishui-section__footer\">{footer}</div>}\n </section>\n );\n};\n\nconst SectionWithCompounds = Section as SectionCompound;\nSectionWithCompounds.Header = SectionHeader;\nSectionWithCompounds.Body = SectionBody;\nSectionWithCompounds.Footer = SectionFooter;\n\nexport default SectionWithCompounds;\n"],"mappings":";;;;;AAwBA,IAAM,KAAiB,EAAE,cAAW,aAAU,GAAG,QAC/C,kBAAC,OAAD;CAAK,GAAI;CAAM,WAAW,EAAG,0BAA0B,CAAS;CAAI;AAAc,CAAA,GAG9E,KAAe,EAAE,cAAW,aAAU,GAAG,QAAmD;CAChG,IAAM,EAAE,UAAO,GAAG,MAAa;CAC/B,OACE,kBAAC,OAAD;EAAK,GAAI;EAAU,WAAW,EAAG,wBAAwB,KAAS,+BAA+B,CAAS;EACvG;CACE,CAAA;AAET,GAEM,KAAiB,EAAE,cAAW,aAAU,GAAG,QAC/C,kBAAC,OAAD;CAAK,GAAI;CAAM,WAAW,EAAG,0BAA0B,CAAS;CAAI;AAAc,CAAA,GAwC9E,KAzBW,EACf,UAAO,gBAAa,YAAS,WAC7B,aAAU,QAAQ,WAAQ,IAAO,kBAAe,GAChD,cAAW,aAAU,GAAG,QACN;CAClB,IAAM,IAAa,IAAI,KACjB,IAAY,KAAS,QAAQ,KAAe,QAAQ,KAAW;CAErE,OACE,kBAAC,WAAD;EAAS,GAAI;EAAM,WAAW,EAAG,kBAAkB,MAAY,WAAW,yBAAyB,CAAS;EAA5G,UAAA;GACG,KACC,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACG,KAAS,QAAQ,kBAAC,GAAD;MAAY,WAAU;MAAyB,UAAA;KAAkB,CAAA,GAClF,KAAe,QAAQ,kBAAC,KAAD;MAAG,WAAU;MAA+B,UAAA;KAAe,CAAA,CAChF;IACJ,CAAA,GAAA,KAAW,QAAQ,kBAAC,OAAD;KAAK,WAAU;KAA2B,UAAA;IAAa,CAAA,CACxE;;GAEP,kBAAC,OAAD;IAAK,WAAW,EAAG,wBAAwB,KAAS,6BAA6B;IAAI;GAAc,CAAA;GAClG,KAAU,QAAQ,kBAAC,OAAD;IAAK,WAAU;IAA0B,UAAA;GAAY,CAAA;EACjE;;AAEb;AAGA,EAAqB,SAAS,GAC9B,EAAqB,OAAO,GAC5B,EAAqB,SAAS"}
1
+ {"version":3,"file":"index.js","names":["SectionHeader","rest","cn","className","SectionBody","divProps","flush","SectionFooter","SectionWithCompounds","HeadingTag","headingLevel","hasHeader","title","description","actions","variant","footer"],"sources":["../../../src/components/Section/index.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\nimport './Section.css';\n\nexport type SectionProps = React.HTMLAttributes<HTMLElement> & {\n /** 区块标题(渲染为 h2) */\n title?: React.ReactNode;\n /** 标题下方的辅助说明 */\n description?: React.ReactNode;\n /** 头部右侧操作区(按钮、筛选等) */\n actions?: React.ReactNode;\n /** 底部脚注区 */\n footer?: React.ReactNode;\n /** `card`(默认,带边框/圆角/背景)| `plain`(无外框,仅分组语义与间距) */\n variant?: 'card' | 'plain';\n /** 移除主体内边距(用于表格等需要贴边的内容) */\n flush?: boolean;\n /** 标题层级,默认 2 */\n headingLevel?: 2 | 3 | 4;\n children?: React.ReactNode;\n};\n\nexport type SectionSlotProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst SectionHeader = ({ className, children, ...rest }: SectionSlotProps) => (\n <div {...rest} className={cn('dishui-section__header', className)}>{children}</div>\n);\n\nconst SectionBody = ({ className, children, ...rest }: SectionSlotProps & { flush?: boolean }) => {\n const { flush, ...divProps } = rest as SectionSlotProps & { flush?: boolean };\n return (\n <div {...divProps} className={cn('dishui-section__body', flush && 'dishui-section__body--flush', className)}>\n {children}\n </div>\n );\n};\n\nconst SectionFooter = ({ className, children, ...rest }: SectionSlotProps) => (\n <div {...rest} className={cn('dishui-section__footer', className)}>{children}</div>\n);\n\ninterface SectionCompound extends React.FC<SectionProps> {\n Header: React.FC<SectionSlotProps>;\n Body: React.FC<SectionSlotProps & { flush?: boolean }>;\n Footer: React.FC<SectionSlotProps>;\n}\n\n/**\n * Section 区块容器\n * ----------------------------------------------------------------------------\n * 用于按区块封装内容:可传 `title` / `description` / `actions` / `footer` 走\n * 便捷模式,或用 `Section.Header` / `Section.Body` / `Section.Footer` 复合组合。\n */\nconst Section = ({\n title, description, actions, footer,\n variant = 'card', flush = false, headingLevel = 2,\n className, children, ...rest\n}: SectionProps) => {\n const HeadingTag = `h${headingLevel}` as 'h2' | 'h3' | 'h4';\n const hasHeader = title != null || description != null || actions != null;\n\n return (\n <section {...rest} className={cn('dishui-section', variant === 'plain' && 'dishui-section--plain', className)}>\n {hasHeader && (\n <div className=\"dishui-section__header\">\n <div className=\"dishui-section__headings\">\n {title != null && <HeadingTag className=\"dishui-section__title\">{title}</HeadingTag>}\n {description != null && <p className=\"dishui-section__description\">{description}</p>}\n </div>\n {actions != null && <div className=\"dishui-section__actions\">{actions}</div>}\n </div>\n )}\n <div className={cn('dishui-section__body', flush && 'dishui-section__body--flush')}>{children}</div>\n {footer != null && <div className=\"dishui-section__footer\">{footer}</div>}\n </section>\n );\n};\n\nconst SectionWithCompounds = Section as SectionCompound;\nSectionWithCompounds.Header = SectionHeader;\nSectionWithCompounds.Body = SectionBody;\nSectionWithCompounds.Footer = SectionFooter;\n\nexport default SectionWithCompounds;\n"],"mappings":";;;;;AAwBA,IAAMA,KAAiB,EAAE,cAAW,aAAU,GAAGC,QAC/C,kBAAC,OAAD;CAAK,GAAIA;CAAM,WAAWC,EAAG,0BAA0BC,CAAS;CAAI;AAAc,CAAA,GAG9EC,KAAe,EAAE,cAAW,aAAU,GAAGH,QAAmD;CAChG,IAAM,EAAE,UAAO,GAAGI,MAAaJ;CAC/B,OACE,kBAAC,OAAD;EAAK,GAAII;EAAU,WAAWH,EAAG,wBAAwBI,KAAS,+BAA+BH,CAAS;EACvG;CACE,CAAA;AAET,GAEMI,KAAiB,EAAE,cAAW,aAAU,GAAGN,QAC/C,kBAAC,OAAD;CAAK,GAAIA;CAAM,WAAWC,EAAG,0BAA0BC,CAAS;CAAI;AAAc,CAAA,GAwC9EK,KAzBW,EACf,UAAO,gBAAa,YAAS,WAC7B,aAAU,QAAQ,WAAQ,IAAO,kBAAe,GAChD,cAAW,aAAU,GAAGP,QACN;CAClB,IAAMQ,IAAa,IAAIC,KACjBC,IAAYC,KAAS,QAAQC,KAAe,QAAQC,KAAW;CAErE,OACE,kBAAC,WAAD;EAAS,GAAIb;EAAM,WAAWC,EAAG,kBAAkBa,MAAY,WAAW,yBAAyBZ,CAAS;EAA5G,UAAA;GACGQ,KACC,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACGC,KAAS,QAAQ,kBAACH,GAAD;MAAY,WAAU;MAAyB,UAAAG;KAAkB,CAAA,GAClFC,KAAe,QAAQ,kBAAC,KAAD;MAAG,WAAU;MAA+B,UAAAA;KAAe,CAAA,CAChF;IACJ,CAAA,GAAAC,KAAW,QAAQ,kBAAC,OAAD;KAAK,WAAU;KAA2B,UAAAA;IAAa,CAAA,CACxE;;GAEP,kBAAC,OAAD;IAAK,WAAWZ,EAAG,wBAAwBI,KAAS,6BAA6B;IAAI;GAAc,CAAA;GAClGU,KAAU,QAAQ,kBAAC,OAAD;IAAK,WAAU;IAA0B,UAAAA;GAAY,CAAA;EACjE;;AAEb;AAGA,EAAqB,SAAShB,GAC9B,EAAqB,OAAOI,GAC5B,EAAqB,SAASG"}