dishui 0.0.83 → 0.0.89

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 (100) hide show
  1. package/dist/components/Demo/index.js +2 -2
  2. package/dist/components/Demo/index.js.map +1 -1
  3. package/dist/components/Input/index.js +52 -62
  4. package/dist/components/Input/index.js.map +1 -1
  5. package/dist/components/LayoutSuite/index.d.ts +10 -0
  6. package/dist/components/LayoutSuite/index.js +27 -18
  7. package/dist/components/LayoutSuite/index.js.map +1 -1
  8. package/dist/components/Markdown/markdownComponents.js +1 -0
  9. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  10. package/dist/components/Markdown/useMarkdownSource.js +46 -31
  11. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  12. package/dist/components/Markdown/useMarkmapRenderer.js +44 -31
  13. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  14. package/dist/components/Markdown/useMermaidRenderer.js +49 -31
  15. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  16. package/dist/components/Page/index.d.ts +18 -4
  17. package/dist/components/Page/index.js +47 -35
  18. package/dist/components/Page/index.js.map +1 -1
  19. package/dist/components/ProtectedRoute/index.d.ts +2 -1
  20. package/dist/components/ProtectedRoute/index.js +16 -6
  21. package/dist/components/ProtectedRoute/index.js.map +1 -1
  22. package/dist/components/Select/index.d.ts +6 -0
  23. package/dist/components/Select/index.js +166 -136
  24. package/dist/components/Select/index.js.map +1 -1
  25. package/dist/components/Tabs/index.d.ts +12 -1
  26. package/dist/components/Tabs/index.js +42 -17
  27. package/dist/components/Tabs/index.js.map +1 -1
  28. package/dist/components/Text/index.d.ts +1 -1
  29. package/dist/components/Text/index.js +2 -2
  30. package/dist/components/Text/index.js.map +1 -1
  31. package/dist/components/pro/ArticleContextMenu/index.js +7 -7
  32. package/dist/components/pro/CodeEditor/editors/CodeEditor.js +200 -189
  33. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  34. package/dist/components/pro/CodeEditor/types.d.ts +3 -0
  35. package/dist/components/pro/DataTable/DataTable.d.ts +1 -1
  36. package/dist/components/pro/DataTable/DataTable.js +98 -240
  37. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  38. package/dist/components/pro/DataTable/components/TableBody.js +14 -16
  39. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  40. package/dist/components/pro/DataTable/components/TablePagination.d.ts +3 -9
  41. package/dist/components/pro/DataTable/components/TablePagination.js +29 -25
  42. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  43. package/dist/components/pro/DataTable/tanstack-table.d.ts +2 -2
  44. package/dist/components/pro/DataTable/tanstack-table.js +29 -21
  45. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  46. package/dist/components/pro/DataTable/treeDataUtils.d.ts +2 -0
  47. package/dist/components/pro/DataTable/treeDataUtils.js +18 -19
  48. package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
  49. package/dist/components/pro/DataTable/types.d.ts +24 -0
  50. package/dist/components/pro/DataTable/useDataTableModel.d.ts +16 -0
  51. package/dist/components/pro/DataTable/useDataTableModel.js +148 -0
  52. package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -0
  53. package/dist/components/pro/FileExplorer/Breadcrumb.js +12 -12
  54. package/dist/components/pro/Flow/nodes/DataNodeView.js +87 -82
  55. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  56. package/dist/components/pro/Flow/nodes/MediaContent.js +1 -1
  57. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  58. package/dist/components/pro/Flow/nodes/MediaOverlay.js +1 -1
  59. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  60. package/dist/components/pro/Flow/nodes/Model3DView.js +69 -63
  61. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  62. package/dist/components/pro/Flow/nodes/chartGeometryBudget.d.ts +14 -0
  63. package/dist/components/pro/Flow/nodes/chartGeometryBudget.js +76 -0
  64. package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -0
  65. package/dist/components/pro/Flow/nodes/demandRender.d.ts +11 -0
  66. package/dist/components/pro/Flow/nodes/demandRender.js +26 -0
  67. package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -0
  68. package/dist/components/pro/RichTextEditor/SlashMenu.js +68 -58
  69. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  70. package/dist/contexts/AppContext.d.ts +1 -0
  71. package/dist/contexts/AppContext.js +144 -145
  72. package/dist/contexts/AppContext.js.map +1 -1
  73. package/dist/contexts/authentication.d.ts +7 -0
  74. package/dist/contexts/authentication.js +22 -0
  75. package/dist/contexts/authentication.js.map +1 -0
  76. package/dist/dishui.css +1 -1
  77. package/dist/hooks/useControllableState.d.ts +6 -14
  78. package/dist/hooks/useControllableState.js +21 -15
  79. package/dist/hooks/useControllableState.js.map +1 -1
  80. package/dist/hooks/useTableColumns.d.ts +3 -3
  81. package/dist/hooks/useTableColumns.js +2 -2
  82. package/dist/hooks/useTableColumns.js.map +1 -1
  83. package/dist/hooks/useTableData.d.ts +11 -4
  84. package/dist/hooks/useTableData.js +44 -26
  85. package/dist/hooks/useTableData.js.map +1 -1
  86. package/dist/index-nostyled.d.ts +2 -2
  87. package/dist/index.d.ts +2 -2
  88. package/dist/index.js +97 -97
  89. package/dist/layouts/Sidebar.d.ts +3 -1
  90. package/dist/layouts/Sidebar.js +131 -122
  91. package/dist/layouts/Sidebar.js.map +1 -1
  92. package/dist/utils/i18n.js +1 -1
  93. package/dist/utils/i18n.js.map +1 -1
  94. package/dist/utils/routerBuilder.d.ts +7 -5
  95. package/dist/utils/routerBuilder.js +11 -15
  96. package/dist/utils/routerBuilder.js.map +1 -1
  97. package/dist/utils/safeStorage.d.ts +8 -0
  98. package/dist/utils/safeStorage.js +45 -0
  99. package/dist/utils/safeStorage.js.map +1 -0
  100. package/package.json +22 -5
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar.js","names":[],"sources":["../../src/layouts/Sidebar.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useMemo } from 'react';\nimport { useNavigate, useRouterState } from '@tanstack/react-router';\nimport { MenuItem } from '../types/menu';\nimport { getMenuItems as defaultGetMenuItems } from '../utils/menu';\nimport { Tree, TreeNode } from '../components/Tree';\nimport { generateSidebarActiveStyles } from '../styles/themeStyles';\nimport { DesktopSidebarToggleButton } from '../components/SidebarToggleButton';\nimport Text, { type TextProps } from '../components/Text';\n\nexport type SidebarLevelText = Pick<TextProps, 'size' | 'weight' | 'color'>;\n\nconst DEFAULT_LEVEL_TEXT = [\n { size: 'base', weight: 'semibold' },\n { size: 'sm', weight: 'medium' },\n { size: 'sm', weight: 'normal' },\n] as const satisfies readonly SidebarLevelText[];\n\n// 组件属性\nexport type SidebarProps = {\n isCollapsed: boolean;\n /** 侧栏所在侧,控制内侧 pill 的位置与调宽方向。 */\n side?: 'left' | 'right';\n language: 'zh' | 'en';\n items?: MenuItem[];\n /**\n * Opt-in typography for levels 1–3; deeper nodes reuse level 3.\n * Omitted: preserve legacy Sidebar/LayoutSuite typography. When supplied,\n * missing values default to base/sm/sm, semibold/medium/normal and inherited color.\n * Selected labels always inherit the active row color.\n */\n levelText?: readonly [SidebarLevelText?, SidebarLevelText?, SidebarLevelText?];\n getMenuItems?: (language: 'zh' | 'en') => MenuItem[];\n onWidthChange?: (width: number) => void;\n initialWidth?: number;\n collapsedWidth?: number;\n /**\n * 折叠 / 展开切换回调。传入后,侧边栏会在其边缘渲染统一的悬浮 pill 控制条\n * (点击折叠、拖拽调节宽度),无需再在外层单独渲染 SidebarToggleButtons。\n */\n onToggle?: () => void;\n /** 拖拽调节宽度的最小值(px) */\n minWidth?: number;\n /** 拖拽调节宽度的最大值(px) */\n maxWidth?: number;\n};\n\nconst Sidebar: React.FC<SidebarProps> = ({\n isCollapsed,\n side = 'left',\n language,\n items: propItems,\n levelText,\n getMenuItems,\n onWidthChange,\n initialWidth = 280,\n collapsedWidth = 64,\n onToggle,\n minWidth = 160,\n maxWidth = 400,\n}) => {\n const [items, setItems] = useState<MenuItem[]>([]);\n const [activeNodeId, setActiveNodeId] = useState<string | number>('');\n const [sidebarWidth, setSidebarWidth] = useState(() => Math.max(minWidth, Math.min(initialWidth, maxWidth)));\n const sidebarRef = useRef<HTMLDivElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n const routerState = useRouterState({ select: (s: { location: { pathname: string } }) => s.location });\n const navigate = useNavigate();\n\n // 当 initialWidth 改变时,更新侧边栏宽度\n useEffect(() => {\n setSidebarWidth(Math.max(minWidth, Math.min(initialWidth, maxWidth)));\n }, [initialWidth, minWidth, maxWidth]);\n\n // 统一的宽度变更处理:同步内部状态并通知父组件。\n // pill 拖拽与外部同步都通过此入口,避免必须回传 initialWidth 才能生效。\n const handleInternalWidthChange = (width: number) => {\n const next = Math.max(minWidth, Math.min(width, maxWidth));\n setSidebarWidth(next);\n onWidthChange?.(next);\n };\n\n // 当语言改变或传入items prop时,更新菜单项\n useEffect(() => {\n if (propItems !== undefined) {\n setItems(propItems);\n } else if (getMenuItems) {\n setItems(getMenuItems(language));\n } else {\n setItems(defaultGetMenuItems(language));\n }\n }, [language, propItems, getMenuItems]);\n\n // 活跃节点变化时,自动滚动到可见区域(菜单过长时保证当前页可见)。\n // 延迟 350ms:Tree 展开动画(max-height 0.3s)期间布局仍在变化,立即\n // scrollIntoView 会计算到动画中途的位置而滚动不到位。\n useEffect(() => {\n if (!activeNodeId) return;\n const t = setTimeout(() => {\n scrollRef.current\n ?.querySelector('.tree-node-content-active')\n ?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }, 350);\n return () => clearTimeout(t);\n }, [activeNodeId]);\n\n // 兜底:确保鼠标悬停在菜单任意位置都能滚轮滚动。\n // 部分浏览器/嵌套滚动场景下原生滚轮可能不作用于该容器,这里用非被动\n // 监听手动滚动;成功滚动后 preventDefault,避免浏览器默认行为造成双重滚动。\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n if (el.scrollHeight <= el.clientHeight) return;\n const dy = e.deltaMode === 1 ? e.deltaY * 16 : e.deltaY; // 行模式 → 像素\n if (dy === 0) return;\n const before = el.scrollTop;\n el.scrollTop = before + dy;\n if (el.scrollTop !== before) e.preventDefault();\n };\n el.addEventListener('wheel', onWheel, { passive: false });\n return () => el.removeEventListener('wheel', onWheel);\n }, []);\n\n // 将 MenuItem 转换为 TreeNode\n const convertToTreeNodes = (menuItems: MenuItem[], isTopLevel: boolean = true): TreeNode[] => {\n return menuItems.map(item => ({\n id: item.id,\n label: item.label,\n icon: item.icon || (!isTopLevel ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n ) : undefined),\n children: item.children ? convertToTreeNodes(item.children, false) : undefined,\n meta: {\n path: item.path,\n },\n }));\n };\n\n // 转换后的树形数据\n const treeData = useMemo(() => convertToTreeNodes(items, true), [items]);\n\n // 获取默认展开的节点ID(默认全部展开)\n const defaultExpandedIds = useMemo(() => {\n if (items.length === 0) return [];\n\n // 收集所有有子节点的项的ID,使其默认全展开\n const collectAllExpandableIds = (menuItems: MenuItem[]): string[] => {\n let result: string[] = [];\n for (const item of menuItems) {\n if (item.children?.length) {\n result.push(item.id);\n result = [...result, ...collectAllExpandableIds(item.children)];\n }\n }\n return result;\n };\n\n return collectAllExpandableIds(items);\n }, [items]);\n\n // 更新活跃节点ID\n useEffect(() => {\n const currentPath = routerState.pathname;\n const findNodeByPath = (menuItems: MenuItem[]): string | null => {\n for (const item of menuItems) {\n if (item.path === currentPath) {\n return item.id;\n }\n if (item.children) {\n const found = findNodeByPath(item.children);\n if (found) return found;\n }\n }\n return null;\n };\n\n const nodeId = findNodeByPath(items);\n if (nodeId) {\n setActiveNodeId(nodeId);\n }\n }, [items, routerState.pathname]);\n\n\n\n // 处理节点点击\n const handleNodeClick = (node: TreeNode) => {\n // 如果节点有路径,直接导航\n if (node.meta?.path) {\n setActiveNodeId(node.id);\n navigate({ to: node.meta.path });\n return;\n }\n\n // 如果没有路径但有子节点,寻找第一个有路径的后代节点\n if (node.children && node.children.length > 0) {\n const findFirstPath = (nodes: TreeNode[]): TreeNode | null => {\n for (const n of nodes) {\n if (n.meta?.path) return n;\n if (n.children && n.children.length > 0) {\n const found = findFirstPath(n.children);\n if (found) return found;\n }\n }\n return null;\n };\n\n const firstNodeWithPath = findFirstPath(node.children);\n if (firstNodeWithPath) {\n setActiveNodeId(firstNodeWithPath.id);\n navigate({ to: firstNodeWithPath.meta!.path });\n } else {\n // 全都没有路径则激活当前节点\n setActiveNodeId(node.id);\n }\n } else {\n setActiveNodeId(node.id);\n }\n };\n\n if (isCollapsed) {\n return (\n <div\n ref={sidebarRef}\n className=\"blade-sidebar h-full bg-base-200 overflow-visible transition-all duration-200 ease-in-out relative\"\n style={{ width: `${collapsedWidth}px` }}\n >\n {onToggle && (\n <DesktopSidebarToggleButton\n isCollapsed={isCollapsed}\n side={side}\n onToggle={onToggle}\n sidebarWidth={sidebarWidth}\n collapsedWidth={collapsedWidth}\n onWidthChange={onWidthChange ? handleInternalWidthChange : undefined}\n minWidth={minWidth}\n maxWidth={maxWidth}\n anchorRef={sidebarRef}\n />\n )}\n <ul className=\"flex flex-col p-2 gap-1 h-full overflow-y-auto overflow-x-hidden\">\n {items.map(item => (\n <li key={item.id}>\n {item.path ? (\n <button\n onClick={() => navigate({ to: item.path! })}\n aria-label={item.label}\n className=\"flex justify-center items-center rounded-lg hover:bg-base-300 transition-colors w-full\"\n style={{\n WebkitTapHighlightColor: 'transparent',\n height: `${Math.min(collapsedWidth - 16, 40)}px`,\n width: `${Math.min(collapsedWidth - 16, 40)}px`,\n margin: '0 auto'\n }}\n >\n {item.icon || <span className=\"text-sm\">{item.label.charAt(0)}</span>}\n </button>\n ) : (\n <div\n className=\"flex justify-center items-center\"\n style={{\n WebkitTapHighlightColor: 'transparent',\n height: `${Math.min(collapsedWidth - 16, 40)}px`,\n width: `${Math.min(collapsedWidth - 16, 40)}px`,\n margin: '0 auto'\n }}\n >\n {item.icon || <span className=\"text-sm\">{item.label.charAt(0)}</span>}\n </div>\n )}\n </li>\n ))}\n </ul>\n </div>\n );\n }\n\n return (\n <div\n ref={sidebarRef}\n className=\"blade-sidebar h-full bg-base-200 overflow-visible flex flex-col transition-colors duration-200 ease-in-out relative\"\n style={{ width: `${sidebarWidth}px`, maxWidth, minWidth }}\n >\n {onToggle && (\n <DesktopSidebarToggleButton\n isCollapsed={isCollapsed}\n side={side}\n onToggle={onToggle}\n sidebarWidth={sidebarWidth}\n collapsedWidth={collapsedWidth}\n onWidthChange={onWidthChange ? handleInternalWidthChange : undefined}\n minWidth={minWidth}\n maxWidth={maxWidth}\n anchorRef={sidebarRef}\n />\n )}\n <div ref={scrollRef} className=\"sidebar-scroll min-h-0 flex-grow overflow-y-auto scrollbar-thin scrollbar-thumb-base-300 scrollbar-track-transparent\">\n <Tree\n data={treeData}\n activeNodeId={activeNodeId}\n defaultExpandedIds={defaultExpandedIds}\n showSearch={false}\n showExpandAll={false}\n showIcon={true}\n showCount={false}\n showLine={true}\n indent={1}\n togglePosition=\"right\"\n maxHeight=\"100%\"\n className={`sidebar-tree${levelText !== undefined ? ' sidebar-tree-level-text' : ''}`}\n renderLabel={(node, depth) => {\n const level = Math.min(depth, 2);\n const text = levelText?.[level];\n const defaults = DEFAULT_LEVEL_TEXT[level];\n return (\n <Text\n size={text?.size ?? defaults.size}\n weight={text?.weight ?? defaults.weight}\n color={activeNodeId === node.id ? 'inherit' : text?.color ?? 'inherit'}\n style={levelText === undefined\n ? { fontSize: 'inherit', lineHeight: 'inherit', fontWeight: 'inherit' }\n : undefined}\n >\n {node.label}\n </Text>\n );\n }}\n onNodeClick={handleNodeClick}\n />\n </div>\n\n <style>{`\n /* Sidebar Tree 自定义样式 */\n .sidebar-tree {\n background: transparent;\n border: none;\n padding: 0.5rem;\n }\n \n .sidebar-tree .tree-node-content {\n padding: 0.5rem 1rem;\n border-radius: 0.5rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n \n /* 活跃状态 - 为每个主题设置匹配的配色 */\n .sidebar-tree .tree-node-content-active {\n font-weight: 600 !important;\n padding-left: calc(1rem - 4px) !important;\n }\n \n /* 主题活跃状态样式 - 从共用配置生成 */\n ${generateSidebarActiveStyles()}\n \n /* 悬停状态 */\n .sidebar-tree .tree-node-content:hover:not(.tree-node-active .tree-node-content):not(.tree-node-content-active) {\n background-color: var(--color-base-200);\n }\n \n /* 右侧展开按钮样式 */\n .sidebar-tree .tree-node-toggle-right {\n width: auto;\n height: auto;\n min-width: auto;\n min-height: auto;\n padding: 0.25rem;\n opacity: 0.6;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: 0.25rem;\n }\n \n .sidebar-tree .tree-node-toggle-right:hover {\n opacity: 1;\n background-color: var(--color-base-300);\n }\n \n /* 右侧按钮图标旋转 */\n .sidebar-tree .tree-node-toggle-right svg {\n width: 1rem;\n height: 1rem;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n \n .sidebar-tree .tree-node-toggle-right.tree-node-toggle-expanded svg {\n transform: rotate(90deg);\n }\n \n /* 图标样式 */\n .sidebar-tree .tree-node-icon {\n width: 1.25rem;\n height: 1.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: color 0.2s ease;\n }\n \n .sidebar-tree .tree-node-icon svg {\n width: 1.25rem;\n height: 1.25rem;\n }\n \n /* 子节点图标稍小 */\n .sidebar-tree .tree-node-children .tree-node-icon svg {\n width: 1rem;\n height: 1rem;\n opacity: 0.8;\n }\n \n /* Preserve the legacy all-level appearance only when typography is not configured. */\n .sidebar-tree:not(.sidebar-tree-level-text) .tree-node-label {\n font-size: 1rem;\n line-height: 1.4rem;\n font-weight: 500;\n }\n \n /* 连接线样式 - 强制显示!向右移动并加粗,增加整体左边距 */\n /* 使用双重选择器增加优先级,避免被其他 Tree 组件样式覆盖 */\n .sidebar-tree.sidebar-tree .tree-show-line .tree-node-children-expanded,\n .sidebar-tree.sidebar-tree .tree-node-children.tree-node-children-expanded,\n div.sidebar-tree .tree-show-line .tree-node-children-expanded,\n div.sidebar-tree .tree-node-children.tree-node-children-expanded {\n border-left: 3px solid rgba(128, 128, 128, 0.35) !important;\n margin-left: 24px !important;\n padding-left: 8px !important;\n box-sizing: border-box !important;\n }\n \n /* 隐藏 Tree 组件的圆点装饰 - 避免与 Sidebar 样式冲突 */\n .sidebar-tree.sidebar-tree .tree-show-line .tree-node-children-expanded::before,\n div.sidebar-tree .tree-show-line .tree-node-children-expanded::before {\n display: none !important;\n }\n \n /* 隐藏 Tree 组件的标题和操作按钮 */\n .sidebar-tree .tree-header,\n .sidebar-tree .tree-search,\n .sidebar-tree .tree-actions {\n display: none;\n }\n \n /* 移除内边距 */\n .sidebar-tree > div:first-child {\n padding: 0;\n }\n \n /* 子节点动画优化 - 减小间距 */\n .sidebar-tree .tree-node-children {\n margin-top: 0.125rem !important;\n }\n \n /* 一级菜单项间距 */\n .sidebar-tree > div > .tree-nodes > .tree-node {\n margin-bottom: 0.375rem;\n }\n \n /* 二级菜单项间距 */\n .sidebar-tree .tree-node-children > .tree-node {\n margin-bottom: 0.125rem;\n }\n `}</style>\n </div>\n );\n};\n\nexport default Sidebar; "],"mappings":"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"}
1
+ {"version":3,"file":"Sidebar.js","names":[],"sources":["../../src/layouts/Sidebar.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useMemo } from 'react';\nimport { Link, useNavigate, useRouterState } from '@tanstack/react-router';\nimport { MenuItem } from '../types/menu';\nimport { getMenuItems as defaultGetMenuItems } from '../utils/menu';\nimport { Tree, TreeNode } from '../components/Tree';\nimport { generateSidebarActiveStyles } from '../styles/themeStyles';\nimport { DesktopSidebarToggleButton } from '../components/SidebarToggleButton';\nimport Text, { type TextProps } from '../components/Text';\n\nexport type SidebarLevelText = Pick<TextProps, 'size' | 'weight' | 'color'>;\n\nconst DEFAULT_LEVEL_TEXT = [\n { size: 'base', weight: 'semibold' },\n { size: 'sm', weight: 'medium' },\n { size: 'sm', weight: 'normal' },\n] as const satisfies readonly SidebarLevelText[];\n\n// 组件属性\nexport type SidebarProps = {\n isCollapsed: boolean;\n /** 侧栏所在侧,控制内侧 pill 的位置与调宽方向。 */\n side?: 'left' | 'right';\n language: 'zh' | 'en';\n items?: MenuItem[];\n /**\n * Opt-in typography for levels 1–3; deeper nodes reuse level 3.\n * Omitted: preserve legacy Sidebar/LayoutSuite typography. When supplied,\n * missing values default to base/sm/sm and semibold/medium/normal.\n * Levels 3+ default to theme-adaptive neutral gray, even without levelText.\n * Explicit colors retain Text semantics (secondary may be a theme accent).\n * Selected labels always inherit the active row color.\n */\n levelText?: readonly [SidebarLevelText?, SidebarLevelText?, SidebarLevelText?];\n getMenuItems?: (language: 'zh' | 'en') => MenuItem[];\n onWidthChange?: (width: number) => void;\n initialWidth?: number;\n collapsedWidth?: number;\n /**\n * 折叠 / 展开切换回调。传入后,侧边栏会在其边缘渲染统一的悬浮 pill 控制条\n * (点击折叠、拖拽调节宽度),无需再在外层单独渲染 SidebarToggleButtons。\n */\n onToggle?: () => void;\n /** 拖拽调节宽度的最小值(px) */\n minWidth?: number;\n /** 拖拽调节宽度的最大值(px) */\n maxWidth?: number;\n};\n\nconst Sidebar: React.FC<SidebarProps> = ({\n isCollapsed,\n side = 'left',\n language,\n items: propItems,\n levelText,\n getMenuItems,\n onWidthChange,\n initialWidth = 280,\n collapsedWidth = 64,\n onToggle,\n minWidth = 160,\n maxWidth = 400,\n}) => {\n const [items, setItems] = useState<MenuItem[]>([]);\n const [activeNodeId, setActiveNodeId] = useState<string | number>('');\n const [sidebarWidth, setSidebarWidth] = useState(() => Math.max(minWidth, Math.min(initialWidth, maxWidth)));\n const sidebarRef = useRef<HTMLDivElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n const routerState = useRouterState({ select: (s: { location: { pathname: string } }) => s.location });\n const navigate = useNavigate();\n\n // 当 initialWidth 改变时,更新侧边栏宽度\n useEffect(() => {\n setSidebarWidth(Math.max(minWidth, Math.min(initialWidth, maxWidth)));\n }, [initialWidth, minWidth, maxWidth]);\n\n // 统一的宽度变更处理:同步内部状态并通知父组件。\n // pill 拖拽与外部同步都通过此入口,避免必须回传 initialWidth 才能生效。\n const handleInternalWidthChange = (width: number) => {\n const next = Math.max(minWidth, Math.min(width, maxWidth));\n setSidebarWidth(next);\n onWidthChange?.(next);\n };\n\n // 当语言改变或传入items prop时,更新菜单项\n useEffect(() => {\n if (propItems !== undefined) {\n setItems(propItems);\n } else if (getMenuItems) {\n setItems(getMenuItems(language));\n } else {\n setItems(defaultGetMenuItems(language));\n }\n }, [language, propItems, getMenuItems]);\n\n // 活跃节点变化时,自动滚动到可见区域(菜单过长时保证当前页可见)。\n // 延迟 350ms:Tree 展开动画(max-height 0.3s)期间布局仍在变化,立即\n // scrollIntoView 会计算到动画中途的位置而滚动不到位。\n useEffect(() => {\n if (!activeNodeId) return;\n const t = setTimeout(() => {\n scrollRef.current\n ?.querySelector(isCollapsed ? '[aria-current=\"page\"]' : '.tree-node-content-active')\n ?.scrollIntoView({ block: 'nearest', behavior: window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'instant' : 'smooth' });\n }, 350);\n return () => clearTimeout(t);\n }, [activeNodeId, isCollapsed]);\n\n // 兜底:确保鼠标悬停在菜单任意位置都能滚轮滚动。\n // 部分浏览器/嵌套滚动场景下原生滚轮可能不作用于该容器,这里用非被动\n // 监听手动滚动;成功滚动后 preventDefault,避免浏览器默认行为造成双重滚动。\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n if (el.scrollHeight <= el.clientHeight) return;\n const dy = e.deltaMode === 1 ? e.deltaY * 16 : e.deltaY; // 行模式 → 像素\n if (dy === 0) return;\n const before = el.scrollTop;\n el.scrollTop = before + dy;\n if (el.scrollTop !== before) e.preventDefault();\n };\n el.addEventListener('wheel', onWheel, { passive: false });\n return () => el.removeEventListener('wheel', onWheel);\n }, [isCollapsed]);\n\n // 将 MenuItem 转换为 TreeNode\n const convertToTreeNodes = (menuItems: MenuItem[], isTopLevel: boolean = true): TreeNode[] => {\n return menuItems.map(item => ({\n id: item.id,\n label: item.label,\n icon: item.icon || (!isTopLevel ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n ) : undefined),\n children: item.children ? convertToTreeNodes(item.children, false) : undefined,\n meta: {\n path: item.path,\n },\n }));\n };\n\n // 转换后的树形数据\n const treeData = useMemo(() => convertToTreeNodes(items, true), [items]);\n\n // 获取默认展开的节点ID(默认全部展开)\n const defaultExpandedIds = useMemo(() => {\n if (items.length === 0) return [];\n\n // 收集所有有子节点的项的ID,使其默认全展开\n const collectAllExpandableIds = (menuItems: MenuItem[]): string[] => {\n let result: string[] = [];\n for (const item of menuItems) {\n if (item.children?.length) {\n result.push(item.id);\n result = [...result, ...collectAllExpandableIds(item.children)];\n }\n }\n return result;\n };\n\n return collectAllExpandableIds(items);\n }, [items]);\n\n // 更新活跃节点ID\n useEffect(() => {\n const currentPath = routerState.pathname;\n const findNodeByPath = (menuItems: MenuItem[]): string | null => {\n for (const item of menuItems) {\n if (item.path === currentPath) {\n return item.id;\n }\n if (item.children) {\n const found = findNodeByPath(item.children);\n if (found) return found;\n }\n }\n return null;\n };\n\n const nodeId = findNodeByPath(items);\n setActiveNodeId(nodeId ?? '');\n }, [items, routerState.pathname]);\n\n\n\n // 处理节点点击\n const handleNodeClick = (node: TreeNode) => {\n // 如果节点有路径,直接导航\n if (node.meta?.path) {\n setActiveNodeId(node.id);\n navigate({ to: node.meta.path });\n return;\n }\n\n // 如果没有路径但有子节点,寻找第一个有路径的后代节点\n if (node.children && node.children.length > 0) {\n const findFirstPath = (nodes: TreeNode[]): TreeNode | null => {\n for (const n of nodes) {\n if (n.meta?.path) return n;\n if (n.children && n.children.length > 0) {\n const found = findFirstPath(n.children);\n if (found) return found;\n }\n }\n return null;\n };\n\n const firstNodeWithPath = findFirstPath(node.children);\n if (firstNodeWithPath) {\n setActiveNodeId(firstNodeWithPath.id);\n navigate({ to: firstNodeWithPath.meta!.path });\n } else {\n // 全都没有路径则激活当前节点\n setActiveNodeId(node.id);\n }\n } else {\n setActiveNodeId(node.id);\n }\n };\n\n const collectLinks = (nodes: MenuItem[], parents: string[] = []): { item: MenuItem; trail: string }[] =>\n nodes.flatMap(item => {\n const trail = [...parents, item.label];\n return [\n ...(item.path ? [{ item, trail: trail.join(' / ') }] : []),\n ...collectLinks(item.children ?? [], trail),\n ];\n });\n\n /* Keep Tree mounted so rail toggles do not reset the user's expanded branches. */\n const rail = isCollapsed ? (\n <nav ref={scrollRef} className=\"sidebar-rail\" aria-label={language === 'zh' ? '侧边导航' : 'Sidebar navigation'}>\n {items.map(group => {\n const links = collectLinks([group]);\n return links.length > 0 ? (\n <div key={group.id} role=\"group\" aria-label={group.label} className=\"sidebar-rail-group\">\n {links.map(({ item, trail }) => (\n <Link\n key={item.id}\n to={item.path!}\n className=\"sidebar-rail-link\"\n aria-label={trail}\n title={trail}\n aria-current={routerState.pathname === item.path ? 'page' : undefined}\n >\n <span aria-hidden=\"true\">{item.icon || <span>{item.label.charAt(0)}</span>}</span>\n </Link>\n ))}\n </div>\n ) : null;\n })}\n </nav>\n ) : null;\n\n return (\n <div\n ref={sidebarRef}\n className=\"blade-sidebar sidebar-container h-full bg-base-200 overflow-visible flex flex-col transition-colors duration-200 ease-in-out relative\"\n style={isCollapsed ? { width: collapsedWidth } : { width: sidebarWidth, maxWidth, minWidth }}\n >\n {onToggle && (\n <DesktopSidebarToggleButton\n isCollapsed={isCollapsed}\n side={side}\n onToggle={onToggle}\n sidebarWidth={sidebarWidth}\n collapsedWidth={collapsedWidth}\n onWidthChange={onWidthChange ? handleInternalWidthChange : undefined}\n minWidth={minWidth}\n maxWidth={maxWidth}\n anchorRef={sidebarRef}\n />\n )}\n {rail}\n <div hidden={isCollapsed} style={isCollapsed ? { display: 'none' } : undefined} ref={isCollapsed ? undefined : scrollRef} className=\"sidebar-scroll min-h-0 flex-grow overflow-y-auto scrollbar-thin scrollbar-thumb-base-300 scrollbar-track-transparent\">\n <Tree\n data={treeData}\n activeNodeId={activeNodeId}\n defaultExpandedIds={defaultExpandedIds}\n showSearch={false}\n showExpandAll={false}\n showIcon={true}\n showCount={false}\n showLine={true}\n indent={1}\n togglePosition=\"right\"\n maxHeight=\"100%\"\n className={`sidebar-tree${levelText !== undefined ? ' sidebar-tree-level-text' : ''}`}\n renderLabel={(node, depth) => {\n const level = Math.min(depth, 2);\n const text = levelText?.[level];\n const defaults = DEFAULT_LEVEL_TEXT[level];\n return (\n <Text\n size={text?.size ?? defaults.size}\n weight={text?.weight ?? defaults.weight}\n color={activeNodeId === node.id ? 'inherit' : text?.color ?? 'inherit'}\n style={{\n ...(levelText === undefined ? { fontSize: 'inherit', lineHeight: 'inherit', fontWeight: 'inherit' } : {}),\n ...(level === 2 && text?.color === undefined && activeNodeId !== node.id\n ? { color: 'var(--sidebar-level-muted)' } : {}),\n }}\n >\n {node.label}\n </Text>\n );\n }}\n onNodeClick={handleNodeClick}\n />\n </div>\n\n <style>{`\n .sidebar-container {\n --sidebar-level-muted: oklch(from color-mix(in oklab, var(--color-base-content) 76%, var(--color-base-200)) l 0 0);\n }\n /* LayoutSuite uses semantic surfaces even in colorful themes. Match its text luminance. */\n .dishui-layout-suite-sidebar > .sidebar-container {\n --sidebar-level-muted: oklch(from var(--dishui-text-tertiary) l 0 0);\n }\n .sidebar-rail { min-height: 0; height: 100%; overflow-y: auto; overflow-x: hidden; overscroll-behavior: contain; padding: 6px; }\n .sidebar-rail-group { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 4px 2px; margin-bottom: 8px; border: 1px solid var(--dishui-border-hairline, var(--color-base-300)); border-radius: 10px; }\n .sidebar-rail-link { display: flex; align-items: center; justify-content: center; width: 100%; max-width: 36px; min-height: 36px; flex-shrink: 0; border-radius: 6px; color: var(--sidebar-level-muted); text-decoration: none; transition: background-color 150ms, color 150ms; }\n .sidebar-rail-link > span { display: flex; align-items: center; justify-content: center; }\n .sidebar-rail-link svg { width: 18px; height: 18px; }\n .sidebar-rail-link:hover { background: var(--color-base-300); }\n .sidebar-rail-link[aria-current=\"page\"] { color: var(--color-primary); background: color-mix(in oklab, var(--color-primary) 12%, var(--color-base-200)); box-shadow: inset 2px 0 var(--color-primary); }\n .sidebar-rail-link:focus-visible { outline: 2px solid var(--dishui-ring, var(--color-primary)); outline-offset: -2px; }\n @media (prefers-reduced-motion: reduce) { .sidebar-rail-link { transition: none; } }\n /* Sidebar Tree 自定义样式 */\n .sidebar-tree {\n background: transparent;\n border: none;\n padding: 0.5rem;\n }\n \n .sidebar-tree .tree-node-content {\n padding: 0.5rem 1rem;\n border-radius: 0.5rem;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n \n /* 活跃状态 - 为每个主题设置匹配的配色 */\n .sidebar-tree .tree-node-content-active {\n font-weight: 600 !important;\n padding-left: calc(1rem - 4px) !important;\n }\n \n /* 主题活跃状态样式 - 从共用配置生成 */\n ${generateSidebarActiveStyles()}\n \n /* 悬停状态 */\n .sidebar-tree .tree-node-content:hover:not(.tree-node-active .tree-node-content):not(.tree-node-content-active) {\n background-color: var(--color-base-200);\n }\n \n /* 右侧展开按钮样式 */\n .sidebar-tree .tree-node-toggle-right {\n width: auto;\n height: auto;\n min-width: auto;\n min-height: auto;\n padding: 0.25rem;\n opacity: 0.6;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n border-radius: 0.25rem;\n }\n \n .sidebar-tree .tree-node-toggle-right:hover {\n opacity: 1;\n background-color: var(--color-base-300);\n }\n \n /* 右侧按钮图标旋转 */\n .sidebar-tree .tree-node-toggle-right svg {\n width: 1rem;\n height: 1rem;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n \n .sidebar-tree .tree-node-toggle-right.tree-node-toggle-expanded svg {\n transform: rotate(90deg);\n }\n \n /* 图标样式 */\n .sidebar-tree .tree-node-icon {\n width: 1.25rem;\n height: 1.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: color 0.2s ease;\n }\n \n .sidebar-tree .tree-node-icon svg {\n width: 1.25rem;\n height: 1.25rem;\n }\n \n /* 子节点图标稍小 */\n .sidebar-tree .tree-node-children .tree-node-icon svg {\n width: 1rem;\n height: 1rem;\n opacity: 0.8;\n }\n \n /* Preserve the legacy all-level appearance only when typography is not configured. */\n .sidebar-tree:not(.sidebar-tree-level-text) .tree-node-label {\n font-size: 1rem;\n line-height: 1.4rem;\n font-weight: 500;\n }\n \n /* 连接线样式 - 强制显示!向右移动并加粗,增加整体左边距 */\n /* 使用双重选择器增加优先级,避免被其他 Tree 组件样式覆盖 */\n .sidebar-tree.sidebar-tree .tree-show-line .tree-node-children-expanded,\n .sidebar-tree.sidebar-tree .tree-node-children.tree-node-children-expanded,\n div.sidebar-tree .tree-show-line .tree-node-children-expanded,\n div.sidebar-tree .tree-node-children.tree-node-children-expanded {\n border-left: 3px solid rgba(128, 128, 128, 0.35) !important;\n margin-left: 24px !important;\n padding-left: 8px !important;\n box-sizing: border-box !important;\n }\n \n /* 隐藏 Tree 组件的圆点装饰 - 避免与 Sidebar 样式冲突 */\n .sidebar-tree.sidebar-tree .tree-show-line .tree-node-children-expanded::before,\n div.sidebar-tree .tree-show-line .tree-node-children-expanded::before {\n display: none !important;\n }\n \n /* 隐藏 Tree 组件的标题和操作按钮 */\n .sidebar-tree .tree-header,\n .sidebar-tree .tree-search,\n .sidebar-tree .tree-actions {\n display: none;\n }\n \n /* 移除内边距 */\n .sidebar-tree > div:first-child {\n padding: 0;\n }\n \n /* 子节点动画优化 - 减小间距 */\n .sidebar-tree .tree-node-children {\n margin-top: 0.125rem !important;\n }\n \n /* 一级菜单项间距 */\n .sidebar-tree > div > .tree-nodes > .tree-node {\n margin-bottom: 0.375rem;\n }\n \n /* 二级菜单项间距 */\n .sidebar-tree .tree-node-children > .tree-node {\n margin-bottom: 0.125rem;\n }\n `}</style>\n </div>\n );\n};\n\nexport default Sidebar; "],"mappings":"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"}
@@ -397,7 +397,7 @@ var e = {
397
397
  },
398
398
  flow: {
399
399
  id: "flow",
400
- label: "流程图编辑器",
400
+ label: "流程图",
401
401
  path: "/components/flow"
402
402
  },
403
403
  flowUsage: {
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.js","names":[],"sources":["../../src/utils/i18n.tsx"],"sourcesContent":["// 导入类型\nimport { MenuItem } from '../types/menu';\n\n// 定义语言类型\nexport type Language = 'zh' | 'en';\n\n// 定义翻译类型\nexport type Translations = {\n navbar: {\n search: string;\n searchPlaceholder: string;\n searchShortcut: string;\n noResults: string;\n };\n sidebar: {\n menu: {\n home: MenuItem;\n components: Omit<MenuItem, 'children'> & {\n children: Record<string, MenuItem>;\n };\n layouts: Omit<MenuItem, 'children'> & {\n children: Record<string, MenuItem>;\n };\n advanced: Omit<MenuItem, 'children'> & {\n children: Record<string, MenuItem>;\n };\n charts: MenuItem;\n showcase: Omit<MenuItem, 'children'> & {\n children: Record<string, MenuItem>;\n };\n };\n };\n};\n\n// 中文翻译\nexport const zhTranslations: Translations = {\n navbar: {\n search: '搜索组件',\n searchPlaceholder: '搜索组件、文档、示例...',\n searchShortcut: 'Cmd+K',\n noResults: '没有找到匹配的结果',\n },\n sidebar: {\n menu: {\n home: {\n id: 'home',\n label: '主页',\n path: '/',\n },\n components: {\n id: 'components',\n label: '组件',\n children: {\n button: {\n id: 'button',\n label: '按钮',\n path: '/components/button',\n },\n badge: {\n id: 'badge',\n label: '徽章',\n path: '/components/badge',\n },\n groupbutton: {\n id: 'groupbutton',\n label: '选择按钮组',\n path: '/components/group-button',\n },\n cardinfo: {\n id: 'cardinfo',\n label: '信息卡',\n path: '/components/card/info',\n },\n cardstat: {\n id: 'cardstat',\n label: '统计卡',\n path: '/components/card/stat',\n },\n cardmetric: {\n id: 'cardmetric',\n label: '指标卡',\n path: '/components/card-metric',\n },\n groupedtable: {\n id: 'groupedtable',\n label: '分组表格',\n path: '/components/grouped-table',\n },\n navigationlist: {\n id: 'navigationlist',\n label: '导航列表',\n path: '/components/navigation-list',\n },\n skeleton: {\n id: 'skeleton',\n label: '骨架',\n path: '/components/skeleton',\n },\n input: {\n id: 'input',\n label: '输入框',\n path: '/components/input',\n },\n label: {\n id: 'label',\n label: '标签',\n path: '/components/label',\n },\n checkbox: {\n id: 'checkbox',\n label: '复选框',\n path: '/components/checkbox',\n },\n select: {\n id: 'select',\n label: '选择器',\n path: '/components/select',\n },\n card: {\n id: 'card',\n label: '卡片',\n path: '/components/card',\n },\n avatar: {\n id: 'avatar',\n label: '头像',\n path: '/components/avatar',\n },\n accordion: {\n id: 'accordion',\n label: '手风琴',\n path: '/components/accordion',\n },\n emptystate: {\n id: 'emptystate',\n label: '空状态',\n path: '/components/emptystate',\n },\n modal: {\n id: 'modal',\n label: '模态框',\n path: '/components/modal',\n },\n tabs: {\n id: 'tabs',\n label: '标签页',\n path: '/components/tabs',\n },\n list: {\n id: 'list',\n label: '列表',\n path: '/components/list',\n },\n table: {\n id: 'table',\n label: '表格',\n path: '/components/table',\n },\n markdown: {\n id: 'markdown',\n label: 'Markdown文档',\n path: '/components/markdown',\n },\n tree: {\n id: 'tree',\n label: '树形控件',\n path: '/components/tree',\n },\n fileuploader: {\n id: 'fileuploader',\n label: '文件上传',\n path: '/components/fileuploader',\n },\n text: {\n id: 'text',\n label: '文本',\n path: '/components/text',\n },\n image: {\n id: 'image',\n label: '图片',\n path: '/components/image',\n },\n icon: {\n id: 'icon',\n label: '图标',\n path: '/components/icon',\n },\n slider: {\n id: 'slider',\n label: '滑块',\n path: '/components/slider',\n },\n datetimeinput: {\n id: 'datetimeinput',\n label: '日期时间',\n path: '/components/datetime-input',\n },\n multiplechoice: {\n id: 'multiplechoice',\n label: '多选组',\n path: '/components/multiple-choice',\n },\n choicepicker: {\n id: 'choicepicker',\n label: '单选组',\n path: '/components/choice-picker',\n },\n },\n },\n layouts: {\n id: 'layouts',\n label: '布局',\n children: {\n layout: { id: 'layout', label: '布局总览', path: '/layouts/layout' },\n resizable: { id: 'resizable', label: '可调节布局', path: '/layouts/resizable' },\n container: { id: 'container', label: '容器', path: '/layouts/container' },\n grid: { id: 'grid', label: '栅格', path: '/layouts/grid' },\n flex: { id: 'flex', label: '弹性布局', path: '/layouts/flex' },\n group: { id: 'group', label: '布局组', path: '/layouts/group' },\n space: { id: 'space', label: '占位', path: '/layouts/space' },\n page: { id: 'page', label: '页面布局', path: '/layouts/page' },\n row: { id: 'row', label: '行布局', path: '/layouts/row' },\n column: { id: 'column', label: '列布局', path: '/layouts/column' },\n },\n },\n charts: {\n id: 'charts',\n label: '图表',\n path: '/components/chart',\n children: [\n { id: 'chart-line', label: '折线图', path: '/components/chart/line' },\n { id: 'chart-area', label: '面积图', path: '/components/chart/area' },\n { id: 'chart-bar', label: '柱状图', path: '/components/chart/bar' },\n { id: 'chart-pie', label: '饼图', path: '/components/chart/pie' },\n { id: 'chart-scatter', label: '散点图', path: '/components/chart/scatter' },\n { id: 'chart-combo', label: '组合图', path: '/components/chart/complex/combo' },\n { id: 'chart-stacked', label: '堆叠面积图', path: '/components/chart/complex/stacked' },\n { id: 'chart-heatmap', label: '热力图', path: '/components/chart/complex/heatmap' },\n { id: 'chart-regression', label: '回归分析', path: '/components/chart/complex/regression' },\n { id: 'chart-radar', label: '雷达图', path: '/components/chart/special/radar' },\n { id: 'chart-sankey', label: '桑基图', path: '/components/chart/special/sankey' },\n { id: 'chart-network', label: '网络图', path: '/components/chart/special/network' },\n { id: 'chart-calendar', label: '日历热力图', path: '/components/chart/special/calendar' },\n { id: 'chart-stacked-pie', label: '堆叠饼图', path: '/components/chart/special/stacked-pie' },\n { id: 'chart-funnel', label: '销售漏斗图', path: '/components/chart/special/funnel' },\n { id: 'chart-treemap', label: '矩形树图', path: '/components/chart/special/treemap' },\n { id: 'chart-globe', label: '地球', path: '/components/chart/special/globe' },\n { id: 'chart-world-map', label: '世界地图', path: '/components/chart/special/world-map' },\n ],\n },\n advanced: {\n id: 'advanced-components',\n label: '高级组件',\n children: {\n datatable: {\n id: 'datatable',\n label: '数据表格',\n path: '/components/datatable',\n },\n datatableAdvanced: {\n id: 'datatableadvanced',\n label: '高级表格',\n path: '/components/datatable/advanced',\n },\n datatableAdvancedTree: {\n id: 'datatableadvancedtree',\n label: '高级树形表格',\n path: '/components/datatable/advancedTreeTable',\n },\n datatableHooks: {\n id: 'datatablehooks',\n label: '钩子简化示例',\n path: '/components/datatable/hooks',\n },\n datatablePivot: {\n id: 'datatablepivot',\n label: '透视与扩展',\n path: '/components/datatable/pivot',\n },\n\n jukebox: {\n id: 'jukebox',\n label: '音乐播放器',\n path: '/components/jukebox',\n },\n articlecontrol: {\n id: 'articlecontrol',\n label: '文档悬浮控件',\n path: '/components/articlecontrol',\n },\n codeeditor: {\n id: 'codeeditor',\n label: '代码编辑器',\n path: '/components/codeeditor',\n },\n markdowneditor: {\n id: 'markdowneditor',\n label: '文档编辑器',\n path: '/components/markdowneditor',\n },\n sidebar: {\n id: 'sidebar-demo',\n label: '侧边栏',\n path: '/components/sidebar',\n },\n fileexplorer: {\n id: 'fileexplorer',\n label: '文件浏览器',\n path: '/components/fileexplorer',\n },\n richtexteditor: {\n id: 'richtexteditor',\n label: '富文本编辑器',\n path: '/components/richtexteditor',\n },\n richtexteditorMobile: {\n id: 'richtexteditor-mobile',\n label: '富文本编辑器移动端示例',\n path: '/components/richtexteditor/mobile',\n },\n flow: {\n id: 'flow',\n label: '流程图编辑器',\n path: '/components/flow',\n },\n flowUsage: {\n id: 'flow-usage',\n label: '流程图使用示例',\n path: '/components/flow/usage',\n },\n flowMobile: {\n id: 'flow-mobile',\n label: '流程图移动端示例',\n path: '/components/flow/mobile',\n },\n gantt: {\n id: 'gantt',\n label: '甘特图',\n path: '/components/gantt',\n },\n ganttScenarios: {\n id: 'gantt-scenarios',\n label: '甘特图场景示例',\n path: '/components/gantt/scenarios',\n },\n calendar: {\n id: 'calendar',\n label: '日历',\n path: '/components/calendar',\n },\n calendarScenarios: {\n id: 'calendar-scenarios',\n label: '日历场景示例',\n path: '/components/calendar/scenarios',\n },\n },\n },\n showcase: {\n id: 'showcase',\n label: '案例',\n children: {\n itbudget: {\n id: 'showcase-it-budget',\n label: '信息技术预算',\n path: '/showcase/it-budget',\n },\n },\n },\n },\n },\n};\n\n// 英文翻译\nexport const enTranslations: Translations = {\n navbar: {\n search: 'Search Components',\n searchPlaceholder: 'Search components, docs, examples...',\n searchShortcut: 'Cmd+K',\n noResults: 'No results found',\n },\n sidebar: {\n menu: {\n home: {\n id: 'home',\n label: 'Home',\n path: '/',\n },\n components: {\n id: 'components',\n label: 'Components',\n children: {\n button: {\n id: 'button',\n label: 'Button',\n path: '/components/button',\n },\n badge: {\n id: 'badge',\n label: 'Badge',\n path: '/components/badge',\n },\n groupbutton: {\n id: 'groupbutton',\n label: 'GroupButton',\n path: '/components/group-button',\n },\n cardinfo: {\n id: 'cardinfo',\n label: 'Card.Info',\n path: '/components/card/info',\n },\n cardstat: {\n id: 'cardstat',\n label: 'Card.Stat',\n path: '/components/card/stat',\n },\n cardmetric: {\n id: 'cardmetric',\n label: 'Card.Metric',\n path: '/components/card-metric',\n },\n groupedtable: {\n id: 'groupedtable',\n label: 'GroupedTable',\n path: '/components/grouped-table',\n },\n navigationlist: {\n id: 'navigationlist',\n label: 'NavigationList',\n path: '/components/navigation-list',\n },\n skeleton: {\n id: 'skeleton',\n label: 'Skeleton',\n path: '/components/skeleton',\n },\n input: {\n id: 'input',\n label: 'Input',\n path: '/components/input',\n },\n label: {\n id: 'label',\n label: 'Label',\n path: '/components/label',\n },\n checkbox: {\n id: 'checkbox',\n label: 'Checkbox',\n path: '/components/checkbox',\n },\n select: {\n id: 'select',\n label: 'Select',\n path: '/components/select',\n },\n card: {\n id: 'card',\n label: 'Card',\n path: '/components/card',\n },\n avatar: {\n id: 'avatar',\n label: 'Avatar',\n path: '/components/avatar',\n },\n accordion: {\n id: 'accordion',\n label: 'Accordion',\n path: '/components/accordion',\n },\n emptystate: {\n id: 'emptystate',\n label: 'EmptyState',\n path: '/components/emptystate',\n },\n modal: {\n id: 'modal',\n label: 'Modal',\n path: '/components/modal',\n },\n tabs: {\n id: 'tabs',\n label: 'Tabs',\n path: '/components/tabs',\n },\n list: {\n id: 'list',\n label: 'List',\n path: '/components/list',\n },\n table: {\n id: 'table',\n label: 'Table',\n path: '/components/table',\n },\n markdown: {\n id: 'markdown',\n label: 'Markdown',\n path: '/components/markdown',\n },\n tree: {\n id: 'tree',\n label: 'Tree',\n path: '/components/tree',\n },\n fileuploader: {\n id: 'fileuploader',\n label: 'FileUploader',\n path: '/components/fileuploader',\n },\n text: {\n id: 'text',\n label: 'Text',\n path: '/components/text',\n },\n image: {\n id: 'image',\n label: 'Image',\n path: '/components/image',\n },\n icon: {\n id: 'icon',\n label: 'Icon',\n path: '/components/icon',\n },\n slider: {\n id: 'slider',\n label: 'Slider',\n path: '/components/slider',\n },\n datetimeinput: {\n id: 'datetimeinput',\n label: 'DateTimeInput',\n path: '/components/datetime-input',\n },\n multiplechoice: {\n id: 'multiplechoice',\n label: 'MultipleChoice',\n path: '/components/multiple-choice',\n },\n choicepicker: {\n id: 'choicepicker',\n label: 'ChoicePicker',\n path: '/components/choice-picker',\n },\n },\n },\n layouts: {\n id: 'layouts',\n label: 'Layout',\n children: {\n layout: { id: 'layout', label: 'Layout Overview', path: '/layouts/layout' },\n resizable: { id: 'resizable', label: 'Resizable', path: '/layouts/resizable' },\n container: { id: 'container', label: 'Container', path: '/layouts/container' },\n grid: { id: 'grid', label: 'Grid', path: '/layouts/grid' },\n flex: { id: 'flex', label: 'Flex', path: '/layouts/flex' },\n group: { id: 'group', label: 'Group', path: '/layouts/group' },\n space: { id: 'space', label: 'Space', path: '/layouts/space' },\n page: { id: 'page', label: 'Page Layout', path: '/layouts/page' },\n row: { id: 'row', label: 'Row', path: '/layouts/row' },\n column: { id: 'column', label: 'Column', path: '/layouts/column' },\n },\n },\n charts: {\n id: 'charts',\n label: 'Charts',\n path: '/components/chart',\n children: [\n { id: 'chart-line', label: 'Line Chart', path: '/components/chart/line' },\n { id: 'chart-area', label: 'Area Chart', path: '/components/chart/area' },\n { id: 'chart-bar', label: 'Bar Chart', path: '/components/chart/bar' },\n { id: 'chart-pie', label: 'Pie Chart', path: '/components/chart/pie' },\n { id: 'chart-scatter', label: 'Scatter Chart', path: '/components/chart/scatter' },\n { id: 'chart-combo', label: 'Combo Chart', path: '/components/chart/complex/combo' },\n { id: 'chart-stacked', label: 'Stacked Area', path: '/components/chart/complex/stacked' },\n { id: 'chart-heatmap', label: 'Heatmap', path: '/components/chart/complex/heatmap' },\n { id: 'chart-regression', label: 'Regression Analysis', path: '/components/chart/complex/regression' },\n { id: 'chart-radar', label: 'Radar Chart', path: '/components/chart/special/radar' },\n { id: 'chart-sankey', label: 'Sankey Diagram', path: '/components/chart/special/sankey' },\n { id: 'chart-network', label: 'Network Graph', path: '/components/chart/special/network' },\n { id: 'chart-calendar', label: 'Calendar Heatmap', path: '/components/chart/special/calendar' },\n { id: 'chart-stacked-pie', label: 'Stacked Pie', path: '/components/chart/special/stacked-pie' },\n { id: 'chart-funnel', label: 'Sales Funnel', path: '/components/chart/special/funnel' },\n { id: 'chart-treemap', label: 'Treemap', path: '/components/chart/special/treemap' },\n { id: 'chart-globe', label: 'Globe', path: '/components/chart/special/globe' },\n { id: 'chart-world-map', label: 'World Map', path: '/components/chart/special/world-map' }\n ],\n },\n advanced: {\n id: 'advanced-components',\n label: 'Advanced Components',\n children: {\n datatable: {\n id: 'datatable',\n label: 'DataTable',\n path: '/components/datatable',\n },\n datatableAdvanced: {\n id: 'datatableadvanced',\n label: 'Advanced Table',\n path: '/components/datatable/advanced',\n },\n datatableAdvancedTree: {\n id: 'datatableadvancedtree',\n label: 'Advanced Tree Table',\n path: '/components/datatable/advancedTreeTable',\n },\n datatableHooks: {\n id: 'datatablehooks',\n label: 'Hooks Simplification',\n path: '/components/datatable/hooks',\n },\n datatablePivot: {\n id: 'datatablepivot',\n label: 'Pivot & Extensions',\n path: '/components/datatable/pivot',\n },\n\n jukebox: {\n id: 'jukebox',\n label: 'Jukebox',\n path: '/components/jukebox',\n },\n articlecontrol: {\n id: 'articlecontrol',\n label: 'ArticleControl',\n path: '/components/articlecontrol',\n },\n codeeditor: {\n id: 'codeeditor',\n label: 'CodeEditor',\n path: '/components/codeeditor',\n },\n markdowneditor: {\n id: 'markdowneditor',\n label: 'MarkdownEditor',\n path: '/components/markdowneditor',\n },\n sidebar: {\n id: 'sidebar-demo',\n label: 'Sidebar',\n path: '/components/sidebar',\n },\n fileexplorer: {\n id: 'fileexplorer',\n label: 'FileExplorer',\n path: '/components/fileexplorer',\n },\n richtexteditor: {\n id: 'richtexteditor',\n label: 'RichTextEditor',\n path: '/components/richtexteditor',\n },\n richtexteditorMobile: {\n id: 'richtexteditor-mobile',\n label: 'RichTextEditor Mobile Guide',\n path: '/components/richtexteditor/mobile',\n },\n flow: {\n id: 'flow',\n label: 'Flow Editor',\n path: '/components/flow',\n },\n flowUsage: {\n id: 'flow-usage',\n label: 'Flow Usage Guide',\n path: '/components/flow/usage',\n },\n flowMobile: {\n id: 'flow-mobile',\n label: 'Flow Mobile Guide',\n path: '/components/flow/mobile',\n },\n gantt: {\n id: 'gantt',\n label: 'Gantt Chart',\n path: '/components/gantt',\n },\n ganttScenarios: {\n id: 'gantt-scenarios',\n label: 'Gantt Scenarios',\n path: '/components/gantt/scenarios',\n },\n calendar: {\n id: 'calendar',\n label: 'Calendar',\n path: '/components/calendar',\n },\n calendarScenarios: {\n id: 'calendar-scenarios',\n label: 'Calendar Scenarios',\n path: '/components/calendar/scenarios',\n },\n },\n },\n showcase: {\n id: 'showcase',\n label: 'Showcase',\n children: {\n itbudget: {\n id: 'showcase-it-budget',\n label: 'IT Budget',\n path: '/showcase/it-budget',\n },\n },\n },\n },\n },\n};\n\n// 根据语言获取翻译\nexport const getTranslations = (language: Language): Translations => {\n return language === 'zh' ? zhTranslations : enTranslations;\n};"],"mappings":"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"}
1
+ {"version":3,"file":"i18n.js","names":[],"sources":["../../src/utils/i18n.tsx"],"sourcesContent":["// 导入类型\nimport { MenuItem } from '../types/menu';\n\n// 定义语言类型\nexport type Language = 'zh' | 'en';\n\n// 定义翻译类型\nexport type Translations = {\n navbar: {\n search: string;\n searchPlaceholder: string;\n searchShortcut: string;\n noResults: string;\n };\n sidebar: {\n menu: {\n home: MenuItem;\n components: Omit<MenuItem, 'children'> & {\n children: Record<string, MenuItem>;\n };\n layouts: Omit<MenuItem, 'children'> & {\n children: Record<string, MenuItem>;\n };\n advanced: Omit<MenuItem, 'children'> & {\n children: Record<string, MenuItem>;\n };\n charts: MenuItem;\n showcase: Omit<MenuItem, 'children'> & {\n children: Record<string, MenuItem>;\n };\n };\n };\n};\n\n// 中文翻译\nexport const zhTranslations: Translations = {\n navbar: {\n search: '搜索组件',\n searchPlaceholder: '搜索组件、文档、示例...',\n searchShortcut: 'Cmd+K',\n noResults: '没有找到匹配的结果',\n },\n sidebar: {\n menu: {\n home: {\n id: 'home',\n label: '主页',\n path: '/',\n },\n components: {\n id: 'components',\n label: '组件',\n children: {\n button: {\n id: 'button',\n label: '按钮',\n path: '/components/button',\n },\n badge: {\n id: 'badge',\n label: '徽章',\n path: '/components/badge',\n },\n groupbutton: {\n id: 'groupbutton',\n label: '选择按钮组',\n path: '/components/group-button',\n },\n cardinfo: {\n id: 'cardinfo',\n label: '信息卡',\n path: '/components/card/info',\n },\n cardstat: {\n id: 'cardstat',\n label: '统计卡',\n path: '/components/card/stat',\n },\n cardmetric: {\n id: 'cardmetric',\n label: '指标卡',\n path: '/components/card-metric',\n },\n groupedtable: {\n id: 'groupedtable',\n label: '分组表格',\n path: '/components/grouped-table',\n },\n navigationlist: {\n id: 'navigationlist',\n label: '导航列表',\n path: '/components/navigation-list',\n },\n skeleton: {\n id: 'skeleton',\n label: '骨架',\n path: '/components/skeleton',\n },\n input: {\n id: 'input',\n label: '输入框',\n path: '/components/input',\n },\n label: {\n id: 'label',\n label: '标签',\n path: '/components/label',\n },\n checkbox: {\n id: 'checkbox',\n label: '复选框',\n path: '/components/checkbox',\n },\n select: {\n id: 'select',\n label: '选择器',\n path: '/components/select',\n },\n card: {\n id: 'card',\n label: '卡片',\n path: '/components/card',\n },\n avatar: {\n id: 'avatar',\n label: '头像',\n path: '/components/avatar',\n },\n accordion: {\n id: 'accordion',\n label: '手风琴',\n path: '/components/accordion',\n },\n emptystate: {\n id: 'emptystate',\n label: '空状态',\n path: '/components/emptystate',\n },\n modal: {\n id: 'modal',\n label: '模态框',\n path: '/components/modal',\n },\n tabs: {\n id: 'tabs',\n label: '标签页',\n path: '/components/tabs',\n },\n list: {\n id: 'list',\n label: '列表',\n path: '/components/list',\n },\n table: {\n id: 'table',\n label: '表格',\n path: '/components/table',\n },\n markdown: {\n id: 'markdown',\n label: 'Markdown文档',\n path: '/components/markdown',\n },\n tree: {\n id: 'tree',\n label: '树形控件',\n path: '/components/tree',\n },\n fileuploader: {\n id: 'fileuploader',\n label: '文件上传',\n path: '/components/fileuploader',\n },\n text: {\n id: 'text',\n label: '文本',\n path: '/components/text',\n },\n image: {\n id: 'image',\n label: '图片',\n path: '/components/image',\n },\n icon: {\n id: 'icon',\n label: '图标',\n path: '/components/icon',\n },\n slider: {\n id: 'slider',\n label: '滑块',\n path: '/components/slider',\n },\n datetimeinput: {\n id: 'datetimeinput',\n label: '日期时间',\n path: '/components/datetime-input',\n },\n multiplechoice: {\n id: 'multiplechoice',\n label: '多选组',\n path: '/components/multiple-choice',\n },\n choicepicker: {\n id: 'choicepicker',\n label: '单选组',\n path: '/components/choice-picker',\n },\n },\n },\n layouts: {\n id: 'layouts',\n label: '布局',\n children: {\n layout: { id: 'layout', label: '布局总览', path: '/layouts/layout' },\n resizable: { id: 'resizable', label: '可调节布局', path: '/layouts/resizable' },\n container: { id: 'container', label: '容器', path: '/layouts/container' },\n grid: { id: 'grid', label: '栅格', path: '/layouts/grid' },\n flex: { id: 'flex', label: '弹性布局', path: '/layouts/flex' },\n group: { id: 'group', label: '布局组', path: '/layouts/group' },\n space: { id: 'space', label: '占位', path: '/layouts/space' },\n page: { id: 'page', label: '页面布局', path: '/layouts/page' },\n row: { id: 'row', label: '行布局', path: '/layouts/row' },\n column: { id: 'column', label: '列布局', path: '/layouts/column' },\n },\n },\n charts: {\n id: 'charts',\n label: '图表',\n path: '/components/chart',\n children: [\n { id: 'chart-line', label: '折线图', path: '/components/chart/line' },\n { id: 'chart-area', label: '面积图', path: '/components/chart/area' },\n { id: 'chart-bar', label: '柱状图', path: '/components/chart/bar' },\n { id: 'chart-pie', label: '饼图', path: '/components/chart/pie' },\n { id: 'chart-scatter', label: '散点图', path: '/components/chart/scatter' },\n { id: 'chart-combo', label: '组合图', path: '/components/chart/complex/combo' },\n { id: 'chart-stacked', label: '堆叠面积图', path: '/components/chart/complex/stacked' },\n { id: 'chart-heatmap', label: '热力图', path: '/components/chart/complex/heatmap' },\n { id: 'chart-regression', label: '回归分析', path: '/components/chart/complex/regression' },\n { id: 'chart-radar', label: '雷达图', path: '/components/chart/special/radar' },\n { id: 'chart-sankey', label: '桑基图', path: '/components/chart/special/sankey' },\n { id: 'chart-network', label: '网络图', path: '/components/chart/special/network' },\n { id: 'chart-calendar', label: '日历热力图', path: '/components/chart/special/calendar' },\n { id: 'chart-stacked-pie', label: '堆叠饼图', path: '/components/chart/special/stacked-pie' },\n { id: 'chart-funnel', label: '销售漏斗图', path: '/components/chart/special/funnel' },\n { id: 'chart-treemap', label: '矩形树图', path: '/components/chart/special/treemap' },\n { id: 'chart-globe', label: '地球', path: '/components/chart/special/globe' },\n { id: 'chart-world-map', label: '世界地图', path: '/components/chart/special/world-map' },\n ],\n },\n advanced: {\n id: 'advanced-components',\n label: '高级组件',\n children: {\n datatable: {\n id: 'datatable',\n label: '数据表格',\n path: '/components/datatable',\n },\n datatableAdvanced: {\n id: 'datatableadvanced',\n label: '高级表格',\n path: '/components/datatable/advanced',\n },\n datatableAdvancedTree: {\n id: 'datatableadvancedtree',\n label: '高级树形表格',\n path: '/components/datatable/advancedTreeTable',\n },\n datatableHooks: {\n id: 'datatablehooks',\n label: '钩子简化示例',\n path: '/components/datatable/hooks',\n },\n datatablePivot: {\n id: 'datatablepivot',\n label: '透视与扩展',\n path: '/components/datatable/pivot',\n },\n\n jukebox: {\n id: 'jukebox',\n label: '音乐播放器',\n path: '/components/jukebox',\n },\n articlecontrol: {\n id: 'articlecontrol',\n label: '文档悬浮控件',\n path: '/components/articlecontrol',\n },\n codeeditor: {\n id: 'codeeditor',\n label: '代码编辑器',\n path: '/components/codeeditor',\n },\n markdowneditor: {\n id: 'markdowneditor',\n label: '文档编辑器',\n path: '/components/markdowneditor',\n },\n sidebar: {\n id: 'sidebar-demo',\n label: '侧边栏',\n path: '/components/sidebar',\n },\n fileexplorer: {\n id: 'fileexplorer',\n label: '文件浏览器',\n path: '/components/fileexplorer',\n },\n richtexteditor: {\n id: 'richtexteditor',\n label: '富文本编辑器',\n path: '/components/richtexteditor',\n },\n richtexteditorMobile: {\n id: 'richtexteditor-mobile',\n label: '富文本编辑器移动端示例',\n path: '/components/richtexteditor/mobile',\n },\n flow: {\n id: 'flow',\n label: '流程图',\n path: '/components/flow',\n },\n flowUsage: {\n id: 'flow-usage',\n label: '流程图使用示例',\n path: '/components/flow/usage',\n },\n flowMobile: {\n id: 'flow-mobile',\n label: '流程图移动端示例',\n path: '/components/flow/mobile',\n },\n gantt: {\n id: 'gantt',\n label: '甘特图',\n path: '/components/gantt',\n },\n ganttScenarios: {\n id: 'gantt-scenarios',\n label: '甘特图场景示例',\n path: '/components/gantt/scenarios',\n },\n calendar: {\n id: 'calendar',\n label: '日历',\n path: '/components/calendar',\n },\n calendarScenarios: {\n id: 'calendar-scenarios',\n label: '日历场景示例',\n path: '/components/calendar/scenarios',\n },\n },\n },\n showcase: {\n id: 'showcase',\n label: '案例',\n children: {\n itbudget: {\n id: 'showcase-it-budget',\n label: '信息技术预算',\n path: '/showcase/it-budget',\n },\n },\n },\n },\n },\n};\n\n// 英文翻译\nexport const enTranslations: Translations = {\n navbar: {\n search: 'Search Components',\n searchPlaceholder: 'Search components, docs, examples...',\n searchShortcut: 'Cmd+K',\n noResults: 'No results found',\n },\n sidebar: {\n menu: {\n home: {\n id: 'home',\n label: 'Home',\n path: '/',\n },\n components: {\n id: 'components',\n label: 'Components',\n children: {\n button: {\n id: 'button',\n label: 'Button',\n path: '/components/button',\n },\n badge: {\n id: 'badge',\n label: 'Badge',\n path: '/components/badge',\n },\n groupbutton: {\n id: 'groupbutton',\n label: 'GroupButton',\n path: '/components/group-button',\n },\n cardinfo: {\n id: 'cardinfo',\n label: 'Card.Info',\n path: '/components/card/info',\n },\n cardstat: {\n id: 'cardstat',\n label: 'Card.Stat',\n path: '/components/card/stat',\n },\n cardmetric: {\n id: 'cardmetric',\n label: 'Card.Metric',\n path: '/components/card-metric',\n },\n groupedtable: {\n id: 'groupedtable',\n label: 'GroupedTable',\n path: '/components/grouped-table',\n },\n navigationlist: {\n id: 'navigationlist',\n label: 'NavigationList',\n path: '/components/navigation-list',\n },\n skeleton: {\n id: 'skeleton',\n label: 'Skeleton',\n path: '/components/skeleton',\n },\n input: {\n id: 'input',\n label: 'Input',\n path: '/components/input',\n },\n label: {\n id: 'label',\n label: 'Label',\n path: '/components/label',\n },\n checkbox: {\n id: 'checkbox',\n label: 'Checkbox',\n path: '/components/checkbox',\n },\n select: {\n id: 'select',\n label: 'Select',\n path: '/components/select',\n },\n card: {\n id: 'card',\n label: 'Card',\n path: '/components/card',\n },\n avatar: {\n id: 'avatar',\n label: 'Avatar',\n path: '/components/avatar',\n },\n accordion: {\n id: 'accordion',\n label: 'Accordion',\n path: '/components/accordion',\n },\n emptystate: {\n id: 'emptystate',\n label: 'EmptyState',\n path: '/components/emptystate',\n },\n modal: {\n id: 'modal',\n label: 'Modal',\n path: '/components/modal',\n },\n tabs: {\n id: 'tabs',\n label: 'Tabs',\n path: '/components/tabs',\n },\n list: {\n id: 'list',\n label: 'List',\n path: '/components/list',\n },\n table: {\n id: 'table',\n label: 'Table',\n path: '/components/table',\n },\n markdown: {\n id: 'markdown',\n label: 'Markdown',\n path: '/components/markdown',\n },\n tree: {\n id: 'tree',\n label: 'Tree',\n path: '/components/tree',\n },\n fileuploader: {\n id: 'fileuploader',\n label: 'FileUploader',\n path: '/components/fileuploader',\n },\n text: {\n id: 'text',\n label: 'Text',\n path: '/components/text',\n },\n image: {\n id: 'image',\n label: 'Image',\n path: '/components/image',\n },\n icon: {\n id: 'icon',\n label: 'Icon',\n path: '/components/icon',\n },\n slider: {\n id: 'slider',\n label: 'Slider',\n path: '/components/slider',\n },\n datetimeinput: {\n id: 'datetimeinput',\n label: 'DateTimeInput',\n path: '/components/datetime-input',\n },\n multiplechoice: {\n id: 'multiplechoice',\n label: 'MultipleChoice',\n path: '/components/multiple-choice',\n },\n choicepicker: {\n id: 'choicepicker',\n label: 'ChoicePicker',\n path: '/components/choice-picker',\n },\n },\n },\n layouts: {\n id: 'layouts',\n label: 'Layout',\n children: {\n layout: { id: 'layout', label: 'Layout Overview', path: '/layouts/layout' },\n resizable: { id: 'resizable', label: 'Resizable', path: '/layouts/resizable' },\n container: { id: 'container', label: 'Container', path: '/layouts/container' },\n grid: { id: 'grid', label: 'Grid', path: '/layouts/grid' },\n flex: { id: 'flex', label: 'Flex', path: '/layouts/flex' },\n group: { id: 'group', label: 'Group', path: '/layouts/group' },\n space: { id: 'space', label: 'Space', path: '/layouts/space' },\n page: { id: 'page', label: 'Page Layout', path: '/layouts/page' },\n row: { id: 'row', label: 'Row', path: '/layouts/row' },\n column: { id: 'column', label: 'Column', path: '/layouts/column' },\n },\n },\n charts: {\n id: 'charts',\n label: 'Charts',\n path: '/components/chart',\n children: [\n { id: 'chart-line', label: 'Line Chart', path: '/components/chart/line' },\n { id: 'chart-area', label: 'Area Chart', path: '/components/chart/area' },\n { id: 'chart-bar', label: 'Bar Chart', path: '/components/chart/bar' },\n { id: 'chart-pie', label: 'Pie Chart', path: '/components/chart/pie' },\n { id: 'chart-scatter', label: 'Scatter Chart', path: '/components/chart/scatter' },\n { id: 'chart-combo', label: 'Combo Chart', path: '/components/chart/complex/combo' },\n { id: 'chart-stacked', label: 'Stacked Area', path: '/components/chart/complex/stacked' },\n { id: 'chart-heatmap', label: 'Heatmap', path: '/components/chart/complex/heatmap' },\n { id: 'chart-regression', label: 'Regression Analysis', path: '/components/chart/complex/regression' },\n { id: 'chart-radar', label: 'Radar Chart', path: '/components/chart/special/radar' },\n { id: 'chart-sankey', label: 'Sankey Diagram', path: '/components/chart/special/sankey' },\n { id: 'chart-network', label: 'Network Graph', path: '/components/chart/special/network' },\n { id: 'chart-calendar', label: 'Calendar Heatmap', path: '/components/chart/special/calendar' },\n { id: 'chart-stacked-pie', label: 'Stacked Pie', path: '/components/chart/special/stacked-pie' },\n { id: 'chart-funnel', label: 'Sales Funnel', path: '/components/chart/special/funnel' },\n { id: 'chart-treemap', label: 'Treemap', path: '/components/chart/special/treemap' },\n { id: 'chart-globe', label: 'Globe', path: '/components/chart/special/globe' },\n { id: 'chart-world-map', label: 'World Map', path: '/components/chart/special/world-map' }\n ],\n },\n advanced: {\n id: 'advanced-components',\n label: 'Advanced Components',\n children: {\n datatable: {\n id: 'datatable',\n label: 'DataTable',\n path: '/components/datatable',\n },\n datatableAdvanced: {\n id: 'datatableadvanced',\n label: 'Advanced Table',\n path: '/components/datatable/advanced',\n },\n datatableAdvancedTree: {\n id: 'datatableadvancedtree',\n label: 'Advanced Tree Table',\n path: '/components/datatable/advancedTreeTable',\n },\n datatableHooks: {\n id: 'datatablehooks',\n label: 'Hooks Simplification',\n path: '/components/datatable/hooks',\n },\n datatablePivot: {\n id: 'datatablepivot',\n label: 'Pivot & Extensions',\n path: '/components/datatable/pivot',\n },\n\n jukebox: {\n id: 'jukebox',\n label: 'Jukebox',\n path: '/components/jukebox',\n },\n articlecontrol: {\n id: 'articlecontrol',\n label: 'ArticleControl',\n path: '/components/articlecontrol',\n },\n codeeditor: {\n id: 'codeeditor',\n label: 'CodeEditor',\n path: '/components/codeeditor',\n },\n markdowneditor: {\n id: 'markdowneditor',\n label: 'MarkdownEditor',\n path: '/components/markdowneditor',\n },\n sidebar: {\n id: 'sidebar-demo',\n label: 'Sidebar',\n path: '/components/sidebar',\n },\n fileexplorer: {\n id: 'fileexplorer',\n label: 'FileExplorer',\n path: '/components/fileexplorer',\n },\n richtexteditor: {\n id: 'richtexteditor',\n label: 'RichTextEditor',\n path: '/components/richtexteditor',\n },\n richtexteditorMobile: {\n id: 'richtexteditor-mobile',\n label: 'RichTextEditor Mobile Guide',\n path: '/components/richtexteditor/mobile',\n },\n flow: {\n id: 'flow',\n label: 'Flow Editor',\n path: '/components/flow',\n },\n flowUsage: {\n id: 'flow-usage',\n label: 'Flow Usage Guide',\n path: '/components/flow/usage',\n },\n flowMobile: {\n id: 'flow-mobile',\n label: 'Flow Mobile Guide',\n path: '/components/flow/mobile',\n },\n gantt: {\n id: 'gantt',\n label: 'Gantt Chart',\n path: '/components/gantt',\n },\n ganttScenarios: {\n id: 'gantt-scenarios',\n label: 'Gantt Scenarios',\n path: '/components/gantt/scenarios',\n },\n calendar: {\n id: 'calendar',\n label: 'Calendar',\n path: '/components/calendar',\n },\n calendarScenarios: {\n id: 'calendar-scenarios',\n label: 'Calendar Scenarios',\n path: '/components/calendar/scenarios',\n },\n },\n },\n showcase: {\n id: 'showcase',\n label: 'Showcase',\n children: {\n itbudget: {\n id: 'showcase-it-budget',\n label: 'IT Budget',\n path: '/showcase/it-budget',\n },\n },\n },\n },\n },\n};\n\n// 根据语言获取翻译\nexport const getTranslations = (language: Language): Translations => {\n return language === 'zh' ? zhTranslations : enTranslations;\n};\n"],"mappings":"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"}
@@ -11,6 +11,9 @@ export interface RouteConfig {
11
11
  children?: RouteConfig[];
12
12
  /** 路由 ID(仅用于无路径的布局路由,不能与 path 同时使用) */
13
13
  id?: string;
14
+ /** Native TanStack guard. Throw redirect(...) or an error to stop this route's loaders. */
15
+ beforeLoad?: AnyRoute['options']['beforeLoad'];
16
+ loader?: AnyRoute['options']['loader'];
14
17
  }
15
18
  /**
16
19
  * 路由构建器配置
@@ -24,20 +27,19 @@ export interface RouterBuilderConfig {
24
27
  basepath?: string;
25
28
  /** 自定义 404 组件 */
26
29
  notFoundComponent?: RouteComponent;
30
+ /** Runs before descendant loaders, including preloads. Must allow public/login routes explicitly. */
31
+ beforeLoad?: AnyRoute['options']['beforeLoad'];
27
32
  }
28
33
  /**
29
34
  * 构建路由器
30
35
  * @param config 路由构建器配置
31
36
  * @returns TanStack Router 实例
32
37
  */
33
- export declare function buildRouter(config: RouterBuilderConfig): import("@tanstack/router-core").RouterCore<import("@tanstack/router-core").Route<import("@tanstack/router-core").Register, any, "/", "/", string, "__root__", undefined, {}, {}, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, AnyRoute[], unknown, unknown, unknown, undefined>, "never", false, import("@tanstack/history").RouterHistory, Record<string, any>>;
38
+ export declare function buildRouter(config: RouterBuilderConfig): import("@tanstack/router-core").RouterCore<import("@tanstack/router-core").Route<import("@tanstack/router-core").Register, any, "/", "/", string, "__root__", undefined, {}, {}, import("@tanstack/router-core").AnyContext, any, {}, undefined, AnyRoute[], unknown, unknown, unknown, undefined>, "never", false, import("@tanstack/history").RouterHistory, Record<string, any>>;
34
39
  /**
35
40
  * 从扁平路由配置创建路由器(简化版)
36
41
  * @param routes 路由配置数组
37
42
  * @param rootComponent 根路由组件
38
43
  * @returns TanStack Router 实例
39
44
  */
40
- export declare function createRouterFromConfig(routes: RouteConfig[], rootComponent?: RouteComponent, options?: {
41
- basepath?: string;
42
- notFoundComponent?: RouteComponent;
43
- }): import("@tanstack/router-core").RouterCore<import("@tanstack/router-core").Route<import("@tanstack/router-core").Register, any, "/", "/", string, "__root__", undefined, {}, {}, import("@tanstack/router-core").AnyContext, import("@tanstack/router-core").AnyContext, {}, undefined, AnyRoute[], unknown, unknown, unknown, undefined>, "never", false, import("@tanstack/history").RouterHistory, Record<string, any>>;
45
+ export declare function createRouterFromConfig(routes: RouteConfig[], rootComponent?: RouteComponent, options?: Pick<RouterBuilderConfig, 'basepath' | 'notFoundComponent' | 'beforeLoad'>): import("@tanstack/router-core").RouterCore<import("@tanstack/router-core").Route<import("@tanstack/router-core").Register, any, "/", "/", string, "__root__", undefined, {}, {}, import("@tanstack/router-core").AnyContext, any, {}, undefined, AnyRoute[], unknown, unknown, unknown, undefined>, "never", false, import("@tanstack/history").RouterHistory, Record<string, any>>;
@@ -3,29 +3,24 @@ import { jsx as e, jsxs as t } from "react/jsx-runtime";
3
3
  import { createRootRoute as n, createRoute as r, createRouter as i } from "@tanstack/react-router";
4
4
  //#region src/utils/routerBuilder.tsx
5
5
  function a(e, t) {
6
- let n = [], i = {
6
+ let n = {
7
7
  getParentRoute: () => t,
8
- component: e.component
8
+ component: e.component,
9
+ beforeLoad: e.beforeLoad,
10
+ loader: e.loader
9
11
  };
10
- e.path ? i.path = e.path : e.id && (i.id = e.id);
11
- let o = r(i);
12
- return n.push(o), e.children && e.children.length > 0 && e.children.forEach((e) => {
13
- let t = a(e, o);
14
- n.push(...t);
15
- }), n;
12
+ e.path ? n.path = e.path : e.id && (n.id = e.id);
13
+ let i = r(n);
14
+ return e.children && e.children.length > 0 && i.addChildren(e.children.map((e) => a(e, i))), i;
16
15
  }
17
16
  function o(e) {
18
17
  let t = n({
19
18
  component: e.rootComponent,
19
+ beforeLoad: e.beforeLoad,
20
20
  notFoundComponent: e.notFoundComponent ?? s
21
- }), r = [];
22
- e.routes.forEach((e) => {
23
- let n = a(e, t);
24
- r.push(...n);
25
- });
26
- let o = t.addChildren(r);
21
+ }), r = t.addChildren(e.routes.map((e) => a(e, t)));
27
22
  return i({
28
- routeTree: o,
23
+ routeTree: r,
29
24
  basepath: e.basepath,
30
25
  defaultNotFoundComponent: e.notFoundComponent ?? s
31
26
  });
@@ -57,6 +52,7 @@ function c(e, t, n) {
57
52
  routes: e,
58
53
  rootComponent: t,
59
54
  basepath: n?.basepath,
55
+ beforeLoad: n?.beforeLoad,
60
56
  notFoundComponent: n?.notFoundComponent
61
57
  });
62
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"routerBuilder.js","names":[],"sources":["../../src/utils/routerBuilder.tsx"],"sourcesContent":["import React from 'react';\nimport {\n createRouter,\n createRootRoute,\n createRoute,\n RootRoute,\n AnyRoute,\n RouteComponent,\n} from '@tanstack/react-router';\n\n/**\n * 路由配置接口\n */\nexport interface RouteConfig {\n /** 路由路径(与 id 二选一,优先使用 path) */\n path?: string;\n /** 路由组件 */\n component?: RouteComponent;\n /** 子路由配置 */\n children?: RouteConfig[];\n /** 路由 ID(仅用于无路径的布局路由,不能与 path 同时使用) */\n id?: string;\n}\n\n/**\n * 路由构建器配置\n */\nexport interface RouterBuilderConfig {\n /** 路由配置数组 */\n routes: RouteConfig[];\n /** 根路由组件,默认使用 AppLayoutWrapper */\n rootComponent?: RouteComponent;\n /** 路由基础路径,部署在子路径时使用(如 '/dish-ui') */\n basepath?: string;\n /** 自定义 404 组件 */\n notFoundComponent?: RouteComponent;\n}\n\n/**\n * 递归创建路由树\n * @param config 路由配置\n * @param parentRoute 父路由\n * @returns 创建的路由数组\n */\nfunction createRoutesRecursive(\n config: RouteConfig,\n parentRoute: RootRoute | AnyRoute\n): AnyRoute[] {\n const routes: AnyRoute[] = [];\n\n // 创建当前路由\n // 注意:TanStack Router 不允许同时设置 id 和 path\n // id 只用于无路径的布局路由\n const routeOptions: any = {\n getParentRoute: () => parentRoute,\n component: config.component,\n };\n\n // 如果有 path,使用 path;否则使用 id(用于布局路由)\n if (config.path) {\n routeOptions.path = config.path;\n } else if (config.id) {\n routeOptions.id = config.id;\n }\n\n const currentRoute = createRoute(routeOptions);\n\n routes.push(currentRoute);\n\n // 递归创建子路由\n if (config.children && config.children.length > 0) {\n config.children.forEach((childConfig) => {\n const childRoutes = createRoutesRecursive(childConfig, currentRoute);\n routes.push(...childRoutes);\n });\n }\n\n return routes;\n}\n\n/**\n * 构建路由器\n * @param config 路由构建器配置\n * @returns TanStack Router 实例\n */\nexport function buildRouter(config: RouterBuilderConfig) {\n const rootRoute = createRootRoute({\n component: config.rootComponent,\n notFoundComponent: config.notFoundComponent ?? DefaultNotFound,\n });\n\n const allRoutes: AnyRoute[] = [];\n\n config.routes.forEach((routeConfig) => {\n const routes = createRoutesRecursive(routeConfig, rootRoute);\n allRoutes.push(...routes);\n });\n\n const routeTree = rootRoute.addChildren(allRoutes);\n\n const router = createRouter({\n routeTree,\n basepath: config.basepath,\n defaultNotFoundComponent: config.notFoundComponent ?? DefaultNotFound,\n });\n\n return router;\n}\n\nfunction DefaultNotFound() {\n return (\n <div style={{ textAlign: 'center', padding: '4rem 1rem' }}>\n <h1 style={{ fontSize: '3rem', fontWeight: 700, margin: 0 }}>404</h1>\n <p style={{ color: '#666', marginTop: '0.5rem' }}>Page not found</p>\n </div>\n );\n}\n\n/**\n * 从扁平路由配置创建路由器(简化版)\n * @param routes 路由配置数组\n * @param rootComponent 根路由组件\n * @returns TanStack Router 实例\n */\nexport function createRouterFromConfig(\n routes: RouteConfig[],\n rootComponent?: RouteComponent,\n options?: { basepath?: string; notFoundComponent?: RouteComponent }\n) {\n return buildRouter({\n routes,\n rootComponent,\n basepath: options?.basepath,\n notFoundComponent: options?.notFoundComponent,\n });\n}\n\n"],"mappings":";;;;AA4CA,SAAS,EACL,GACA,GACU;CACV,IAAM,IAAqB,CAAC,GAKtB,IAAoB;EACtB,sBAAsB;EACtB,WAAW,EAAO;CACtB;CAGA,AAAI,EAAO,OACP,EAAa,OAAO,EAAO,OACpB,EAAO,OACd,EAAa,KAAK,EAAO;CAG7B,IAAM,IAAe,EAAY,CAAY;CAY7C,OAVA,EAAO,KAAK,CAAY,GAGpB,EAAO,YAAY,EAAO,SAAS,SAAS,KAC5C,EAAO,SAAS,SAAS,MAAgB;EACrC,IAAM,IAAc,EAAsB,GAAa,CAAY;EACnE,EAAO,KAAK,GAAG,CAAW;CAC9B,CAAC,GAGE;AACX;AAOA,SAAgB,EAAY,GAA6B;CACrD,IAAM,IAAY,EAAgB;EAC9B,WAAW,EAAO;EAClB,mBAAmB,EAAO,qBAAqB;CACnD,CAAC,GAEK,IAAwB,CAAC;CAE/B,EAAO,OAAO,SAAS,MAAgB;EACnC,IAAM,IAAS,EAAsB,GAAa,CAAS;EAC3D,EAAU,KAAK,GAAG,CAAM;CAC5B,CAAC;CAED,IAAM,IAAY,EAAU,YAAY,CAAS;CAQjD,OANe,EAAa;EACxB;EACA,UAAU,EAAO;EACjB,0BAA0B,EAAO,qBAAqB;CAC1D,CAEO;AACX;AAEA,SAAS,IAAkB;CACvB,OACI,kBAAC,OAAD;EAAK,OAAO;GAAE,WAAW;GAAU,SAAS;EAAY;EAAxD,UAAA,CACI,kBAAC,MAAD;GAAI,OAAO;IAAE,UAAU;IAAQ,YAAY;IAAK,QAAQ;GAAE;GAAG,UAAA;EAAO,CAAA,GACpE,kBAAC,KAAD;GAAG,OAAO;IAAE,OAAO;IAAQ,WAAW;GAAS;GAAG,UAAA;EAAiB,CAAA,CAClE;;AAEb;AAQA,SAAgB,EACZ,GACA,GACA,GACF;CACE,OAAO,EAAY;EACf;EACA;EACA,UAAU,GAAS;EACnB,mBAAmB,GAAS;CAChC,CAAC;AACL"}
1
+ {"version":3,"file":"routerBuilder.js","names":[],"sources":["../../src/utils/routerBuilder.tsx"],"sourcesContent":["import React from 'react';\nimport {\n createRouter,\n createRootRoute,\n createRoute,\n RootRoute,\n AnyRoute,\n RouteComponent,\n} from '@tanstack/react-router';\n\n/**\n * 路由配置接口\n */\nexport interface RouteConfig {\n /** 路由路径(与 id 二选一,优先使用 path) */\n path?: string;\n /** 路由组件 */\n component?: RouteComponent;\n /** 子路由配置 */\n children?: RouteConfig[];\n /** 路由 ID(仅用于无路径的布局路由,不能与 path 同时使用) */\n id?: string;\n /** Native TanStack guard. Throw redirect(...) or an error to stop this route's loaders. */\n beforeLoad?: AnyRoute['options']['beforeLoad'];\n loader?: AnyRoute['options']['loader'];\n}\n\n/**\n * 路由构建器配置\n */\nexport interface RouterBuilderConfig {\n /** 路由配置数组 */\n routes: RouteConfig[];\n /** 根路由组件,默认使用 AppLayoutWrapper */\n rootComponent?: RouteComponent;\n /** 路由基础路径,部署在子路径时使用(如 '/dish-ui') */\n basepath?: string;\n /** 自定义 404 组件 */\n notFoundComponent?: RouteComponent;\n /** Runs before descendant loaders, including preloads. Must allow public/login routes explicitly. */\n beforeLoad?: AnyRoute['options']['beforeLoad'];\n}\n\n/**\n * 递归创建路由树\n * @param config 路由配置\n * @param parentRoute 父路由\n * @returns 带有子路由的当前路由\n */\nfunction createRoutesRecursive(\n config: RouteConfig,\n parentRoute: RootRoute | AnyRoute\n): AnyRoute {\n\n // 创建当前路由\n // 注意:TanStack Router 不允许同时设置 id 和 path\n // id 只用于无路径的布局路由\n const routeOptions: any = {\n getParentRoute: () => parentRoute,\n component: config.component,\n beforeLoad: config.beforeLoad,\n loader: config.loader,\n };\n\n // 如果有 path,使用 path;否则使用 id(用于布局路由)\n if (config.path) {\n routeOptions.path = config.path;\n } else if (config.id) {\n routeOptions.id = config.id;\n }\n\n const currentRoute = createRoute(routeOptions);\n\n // Keep the actual hierarchy so pathless/layout guards and context reach descendants.\n if (config.children && config.children.length > 0) {\n currentRoute.addChildren(config.children.map(childConfig => createRoutesRecursive(childConfig, currentRoute)));\n }\n\n return currentRoute;\n}\n\n/**\n * 构建路由器\n * @param config 路由构建器配置\n * @returns TanStack Router 实例\n */\nexport function buildRouter(config: RouterBuilderConfig) {\n const rootRoute = createRootRoute({\n component: config.rootComponent,\n beforeLoad: config.beforeLoad,\n notFoundComponent: config.notFoundComponent ?? DefaultNotFound,\n });\n\n const routeTree = rootRoute.addChildren(config.routes.map(routeConfig => createRoutesRecursive(routeConfig, rootRoute)));\n\n const router = createRouter({\n routeTree,\n basepath: config.basepath,\n defaultNotFoundComponent: config.notFoundComponent ?? DefaultNotFound,\n });\n\n return router;\n}\n\nfunction DefaultNotFound() {\n return (\n <div style={{ textAlign: 'center', padding: '4rem 1rem' }}>\n <h1 style={{ fontSize: '3rem', fontWeight: 700, margin: 0 }}>404</h1>\n <p style={{ color: '#666', marginTop: '0.5rem' }}>Page not found</p>\n </div>\n );\n}\n\n/**\n * 从扁平路由配置创建路由器(简化版)\n * @param routes 路由配置数组\n * @param rootComponent 根路由组件\n * @returns TanStack Router 实例\n */\nexport function createRouterFromConfig(\n routes: RouteConfig[],\n rootComponent?: RouteComponent,\n options?: Pick<RouterBuilderConfig, 'basepath' | 'notFoundComponent' | 'beforeLoad'>\n) {\n return buildRouter({\n routes,\n rootComponent,\n basepath: options?.basepath,\n beforeLoad: options?.beforeLoad,\n notFoundComponent: options?.notFoundComponent,\n });\n}\n\n"],"mappings":";;;;AAiDA,SAAS,EACL,GACA,GACQ;CAKR,IAAM,IAAoB;EACtB,sBAAsB;EACtB,WAAW,EAAO;EAClB,YAAY,EAAO;EACnB,QAAQ,EAAO;CACnB;CAGA,AAAI,EAAO,OACP,EAAa,OAAO,EAAO,OACpB,EAAO,OACd,EAAa,KAAK,EAAO;CAG7B,IAAM,IAAe,EAAY,CAAY;CAO7C,OAJI,EAAO,YAAY,EAAO,SAAS,SAAS,KAC5C,EAAa,YAAY,EAAO,SAAS,KAAI,MAAe,EAAsB,GAAa,CAAY,CAAC,CAAC,GAG1G;AACX;AAOA,SAAgB,EAAY,GAA6B;CACrD,IAAM,IAAY,EAAgB;EAC9B,WAAW,EAAO;EAClB,YAAY,EAAO;EACnB,mBAAmB,EAAO,qBAAqB;CACnD,CAAC,GAEK,IAAY,EAAU,YAAY,EAAO,OAAO,KAAI,MAAe,EAAsB,GAAa,CAAS,CAAC,CAAC;CAQvH,OANe,EAAa;EACxB;EACA,UAAU,EAAO;EACjB,0BAA0B,EAAO,qBAAqB;CAC1D,CAEO;AACX;AAEA,SAAS,IAAkB;CACvB,OACI,kBAAC,OAAD;EAAK,OAAO;GAAE,WAAW;GAAU,SAAS;EAAY;EAAxD,UAAA,CACI,kBAAC,MAAD;GAAI,OAAO;IAAE,UAAU;IAAQ,YAAY;IAAK,QAAQ;GAAE;GAAG,UAAA;EAAO,CAAA,GACpE,kBAAC,KAAD;GAAG,OAAO;IAAE,OAAO;IAAQ,WAAW;GAAS;GAAG,UAAA;EAAiB,CAAA,CAClE;;AAEb;AAQA,SAAgB,EACZ,GACA,GACA,GACF;CACE,OAAO,EAAY;EACf;EACA;EACA,UAAU,GAAS;EACnB,YAAY,GAAS;EACrB,mBAAmB,GAAS;CAChC,CAAC;AACL"}
@@ -0,0 +1,8 @@
1
+ /** Best-effort persistence: unavailable/blocked storage must not break in-memory UI state. */
2
+ export declare const safeStorage: {
3
+ getItem(key: string): string | null;
4
+ setItem(key: string, value: string): boolean;
5
+ removeItem(key: string): boolean;
6
+ };
7
+ export declare function readStoredJSON<T>(key: string, isValid: (value: unknown) => value is T, fallback: T): T;
8
+ export declare function writeStoredJSON(key: string, value: unknown): boolean;
@@ -0,0 +1,45 @@
1
+ //#region src/utils/safeStorage.ts
2
+ var e = {
3
+ getItem(e) {
4
+ try {
5
+ return typeof window > "u" ? null : window.localStorage.getItem(e);
6
+ } catch {
7
+ return null;
8
+ }
9
+ },
10
+ setItem(e, t) {
11
+ try {
12
+ return typeof window > "u" ? !1 : (window.localStorage.setItem(e, t), !0);
13
+ } catch {
14
+ return !1;
15
+ }
16
+ },
17
+ removeItem(e) {
18
+ try {
19
+ return typeof window > "u" ? !1 : (window.localStorage.removeItem(e), !0);
20
+ } catch {
21
+ return !1;
22
+ }
23
+ }
24
+ };
25
+ function t(t, n, r) {
26
+ let i = e.getItem(t);
27
+ if (i === null) return r;
28
+ try {
29
+ let e = JSON.parse(i);
30
+ if (n(e)) return e;
31
+ } catch {}
32
+ return e.removeItem(t), r;
33
+ }
34
+ function n(t, n) {
35
+ try {
36
+ let r = JSON.stringify(n);
37
+ return r !== void 0 && e.setItem(t, r);
38
+ } catch {
39
+ return !1;
40
+ }
41
+ }
42
+ //#endregion
43
+ export { t as readStoredJSON, e as safeStorage, n as writeStoredJSON };
44
+
45
+ //# sourceMappingURL=safeStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeStorage.js","names":[],"sources":["../../src/utils/safeStorage.ts"],"sourcesContent":["/** Best-effort persistence: unavailable/blocked storage must not break in-memory UI state. */\nexport const safeStorage = {\n getItem(key: string): string | null {\n try {\n return typeof window === 'undefined' ? null : window.localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n setItem(key: string, value: string): boolean {\n try {\n if (typeof window === 'undefined') return false;\n window.localStorage.setItem(key, value);\n return true;\n } catch {\n return false;\n }\n },\n removeItem(key: string): boolean {\n try {\n if (typeof window === 'undefined') return false;\n window.localStorage.removeItem(key);\n return true;\n } catch {\n return false;\n }\n },\n};\n\nexport function readStoredJSON<T>(key: string, isValid: (value: unknown) => value is T, fallback: T): T {\n const saved = safeStorage.getItem(key);\n if (saved === null) return fallback;\n try {\n const value: unknown = JSON.parse(saved);\n if (isValid(value)) return value;\n } catch {\n // Treat malformed data and validator failures just like a missing preference.\n }\n safeStorage.removeItem(key);\n return fallback;\n}\n\nexport function writeStoredJSON(key: string, value: unknown): boolean {\n try {\n const serialized = JSON.stringify(value);\n return serialized !== undefined && safeStorage.setItem(key, serialized);\n } catch {\n return false;\n }\n}\n"],"mappings":";AACA,IAAa,IAAc;CACzB,QAAQ,GAA4B;EAClC,IAAI;GACF,OAAO,OAAO,SAAW,MAAc,OAAO,OAAO,aAAa,QAAQ,CAAG;EAC/E,QAAQ;GACN,OAAO;EACT;CACF;CACA,QAAQ,GAAa,GAAwB;EAC3C,IAAI;GAGF,OAFI,OAAO,SAAW,MAAoB,MAC1C,OAAO,aAAa,QAAQ,GAAK,CAAK,GAC/B;EACT,QAAQ;GACN,OAAO;EACT;CACF;CACA,WAAW,GAAsB;EAC/B,IAAI;GAGF,OAFI,OAAO,SAAW,MAAoB,MAC1C,OAAO,aAAa,WAAW,CAAG,GAC3B;EACT,QAAQ;GACN,OAAO;EACT;CACF;AACF;AAEA,SAAgB,EAAkB,GAAa,GAAyC,GAAgB;CACtG,IAAM,IAAQ,EAAY,QAAQ,CAAG;CACrC,IAAI,MAAU,MAAM,OAAO;CAC3B,IAAI;EACF,IAAM,IAAiB,KAAK,MAAM,CAAK;EACvC,IAAI,EAAQ,CAAK,GAAG,OAAO;CAC7B,QAAQ,CAER;CAEA,OADA,EAAY,WAAW,CAAG,GACnB;AACT;AAEA,SAAgB,EAAgB,GAAa,GAAyB;CACpE,IAAI;EACF,IAAM,IAAa,KAAK,UAAU,CAAK;EACvC,OAAO,MAAe,KAAA,KAAa,EAAY,QAAQ,GAAK,CAAU;CACxE,QAAQ;EACN,OAAO;CACT;AACF"}
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "dishui",
3
- "version": "0.0.83",
3
+ "version": "0.0.89",
4
4
  "description": "New Components UI Framework with AI Powered",
5
5
  "type": "module",
6
+ "packageManager": "pnpm@11.12.0",
6
7
  "main": "dist/index.js",
7
8
  "module": "dist/index.js",
8
9
  "types": "dist/index.d.ts",
@@ -65,6 +66,16 @@
65
66
  "test:showcase": "node --test scripts/showcase-components.test.mjs showcase/it-budget/ITBudget.smoke.test.mjs",
66
67
  "build:types": "tsc --emitDeclarationOnly -p tsconfig.json && node scripts/strip-dts-css-imports.mjs",
67
68
  "typecheck": "tsc --noEmit -p tsconfig.demo.json",
69
+ "typecheck:lib": "tsc --noEmit -p tsconfig.json",
70
+ "typecheck:all": "npm run typecheck:lib && npm run typecheck && npm run typecheck:showcase",
71
+ "test": "node scripts/run-tests.mjs unit",
72
+ "test:browser": "node scripts/run-tests.mjs browser",
73
+ "test:browser:all": "node scripts/run-tests.mjs browser-all",
74
+ "test:regression": "node --test scripts/data-table-stage-a.test.mjs scripts/table-columns.test.mjs src/contexts/AppContext.test.mjs src/components/pro/Flow/nodes/flowStageC.test.mjs scripts/lint-baseline.test.mjs scripts/package-smoke.test.mjs",
75
+ "test:package": "node scripts/package-smoke.mjs",
76
+ "test:perf": "node scripts/flow-stage-c.perf.mjs",
77
+ "check": "npm run typecheck:all && npm run lint:check && npm run docs:check && npm test",
78
+ "check:release": "npm run check && npm run test:browser && npm run build && npm run test:package",
68
79
  "docs:generate": "node scripts/check-docs.mjs --write",
69
80
  "docs:check": "node scripts/check-docs.mjs",
70
81
  "test:docs": "node --test scripts/check-docs.test.mjs",
@@ -73,8 +84,10 @@
73
84
  "test:flow": "node --test scripts/flow-hooks.test.mjs scripts/flow-import-export.test.mjs",
74
85
  "lint": "oxlint --config .oxlintrc.json src",
75
86
  "lint:fix": "oxlint --config .oxlintrc.json --fix src",
87
+ "lint:check": "node scripts/lint-baseline.mjs",
88
+ "lint:baseline": "node scripts/lint-baseline.mjs --write",
76
89
  "test:styles": "node --test scripts/styles.test.mjs",
77
- "prepublishOnly": "npm run test:styles && npm run build",
90
+ "prepublishOnly": "npm run check:release",
78
91
  "publish:npm": "npm publish --access public",
79
92
  "release": "node scripts/release.mjs",
80
93
  "release:patch": "node scripts/release.mjs patch",
@@ -105,8 +118,6 @@
105
118
  "@types/d3-scale": "^4.0.9",
106
119
  "@types/d3-shape": "^3.1.7",
107
120
  "@types/d3-time": "^3.0.4",
108
- "@types/hast": "^3.0.5",
109
- "@types/mdast": "^4.0.4",
110
121
  "@types/node": "^26.1.1",
111
122
  "@types/react": "^19.2.17",
112
123
  "@types/react-dom": "^19.2.3",
@@ -119,7 +130,9 @@
119
130
  "d3-shape": "3.2.0",
120
131
  "d3-time": "3.1.0",
121
132
  "daisyui": "^5.7.32",
133
+ "esbuild": "0.28.2",
122
134
  "oxlint": "^1.82.0",
135
+ "playwright-core": "1.58.2",
123
136
  "postcss": "^8.5.19",
124
137
  "react": "^19.2.7",
125
138
  "react-dom": "^19.2.7",
@@ -127,7 +140,6 @@
127
140
  "tailwindcss": "^4.3.3",
128
141
  "tslib": "^2.8.1",
129
142
  "typescript": "^7.0.2",
130
- "unified": "^11.0.5",
131
143
  "vite": "^8.2.2"
132
144
  },
133
145
  "dependencies": {
@@ -149,8 +161,10 @@
149
161
  "@lezer/highlight": "^1.2.3",
150
162
  "@tailwindcss/vite": "^4.3.3",
151
163
  "@tanstack/charts": "0.16.2",
164
+ "@tanstack/history": "^1.162.2",
152
165
  "@tanstack/react-charts": "^0.16.2",
153
166
  "@tanstack/react-table": "^9.2.4",
167
+ "@tanstack/router-core": "^1.171.28",
154
168
  "@tanstack/table-core": "^9.2.4",
155
169
  "@tiptap/core": "^3.28.0",
156
170
  "@tiptap/extension-color": "^3.28.0",
@@ -174,6 +188,8 @@
174
188
  "@tiptap/pm": "^3.28.0",
175
189
  "@tiptap/react": "^3.28.0",
176
190
  "@tiptap/starter-kit": "^3.28.0",
191
+ "@types/hast": "^3.0.5",
192
+ "@types/mdast": "^4.0.4",
177
193
  "fflate": "^0.8.2",
178
194
  "katex": "^0.17.0",
179
195
  "markmap-lib": "^0.18.12",
@@ -190,6 +206,7 @@
190
206
  "remark-math": "^6.0.0",
191
207
  "three": "^0.180.0",
192
208
  "topojson-client": "^3.1.0",
209
+ "unified": "^11.0.5",
193
210
  "unist-util-visit": "^5.1.0",
194
211
  "world-atlas": "^2.0.2"
195
212
  }