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.
- package/dist/components/Demo/index.js +2 -2
- package/dist/components/Demo/index.js.map +1 -1
- package/dist/components/Input/index.js +52 -62
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/LayoutSuite/index.d.ts +10 -0
- package/dist/components/LayoutSuite/index.js +27 -18
- package/dist/components/LayoutSuite/index.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js +1 -0
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Markdown/useMarkdownSource.js +46 -31
- package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
- package/dist/components/Markdown/useMarkmapRenderer.js +44 -31
- package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
- package/dist/components/Markdown/useMermaidRenderer.js +49 -31
- package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
- package/dist/components/Page/index.d.ts +18 -4
- package/dist/components/Page/index.js +47 -35
- package/dist/components/Page/index.js.map +1 -1
- package/dist/components/ProtectedRoute/index.d.ts +2 -1
- package/dist/components/ProtectedRoute/index.js +16 -6
- package/dist/components/ProtectedRoute/index.js.map +1 -1
- package/dist/components/Select/index.d.ts +6 -0
- package/dist/components/Select/index.js +166 -136
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/Tabs/index.d.ts +12 -1
- package/dist/components/Tabs/index.js +42 -17
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Text/index.d.ts +1 -1
- package/dist/components/Text/index.js +2 -2
- package/dist/components/Text/index.js.map +1 -1
- package/dist/components/pro/ArticleContextMenu/index.js +7 -7
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js +200 -189
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/types.d.ts +3 -0
- package/dist/components/pro/DataTable/DataTable.d.ts +1 -1
- package/dist/components/pro/DataTable/DataTable.js +98 -240
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableBody.js +14 -16
- package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
- package/dist/components/pro/DataTable/components/TablePagination.d.ts +3 -9
- package/dist/components/pro/DataTable/components/TablePagination.js +29 -25
- package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
- package/dist/components/pro/DataTable/tanstack-table.d.ts +2 -2
- package/dist/components/pro/DataTable/tanstack-table.js +29 -21
- package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
- package/dist/components/pro/DataTable/treeDataUtils.d.ts +2 -0
- package/dist/components/pro/DataTable/treeDataUtils.js +18 -19
- package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
- package/dist/components/pro/DataTable/types.d.ts +24 -0
- package/dist/components/pro/DataTable/useDataTableModel.d.ts +16 -0
- package/dist/components/pro/DataTable/useDataTableModel.js +148 -0
- package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -0
- package/dist/components/pro/FileExplorer/Breadcrumb.js +12 -12
- package/dist/components/pro/Flow/nodes/DataNodeView.js +87 -82
- package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js +69 -63
- package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.d.ts +14 -0
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.js +76 -0
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -0
- package/dist/components/pro/Flow/nodes/demandRender.d.ts +11 -0
- package/dist/components/pro/Flow/nodes/demandRender.js +26 -0
- package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -0
- package/dist/components/pro/RichTextEditor/SlashMenu.js +68 -58
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/contexts/AppContext.d.ts +1 -0
- package/dist/contexts/AppContext.js +144 -145
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/contexts/authentication.d.ts +7 -0
- package/dist/contexts/authentication.js +22 -0
- package/dist/contexts/authentication.js.map +1 -0
- package/dist/dishui.css +1 -1
- package/dist/hooks/useControllableState.d.ts +6 -14
- package/dist/hooks/useControllableState.js +21 -15
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useTableColumns.d.ts +3 -3
- package/dist/hooks/useTableColumns.js +2 -2
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/hooks/useTableData.d.ts +11 -4
- package/dist/hooks/useTableData.js +44 -26
- package/dist/hooks/useTableData.js.map +1 -1
- package/dist/index-nostyled.d.ts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +97 -97
- package/dist/layouts/Sidebar.d.ts +3 -1
- package/dist/layouts/Sidebar.js +131 -122
- package/dist/layouts/Sidebar.js.map +1 -1
- package/dist/utils/i18n.js +1 -1
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/routerBuilder.d.ts +7 -5
- package/dist/utils/routerBuilder.js +11 -15
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/safeStorage.d.ts +8 -0
- package/dist/utils/safeStorage.js +45 -0
- package/dist/utils/safeStorage.js.map +1 -0
- 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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"}
|
package/dist/utils/i18n.js
CHANGED
package/dist/utils/i18n.js.map
CHANGED
|
@@ -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,
|
|
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 =
|
|
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 ?
|
|
11
|
-
let
|
|
12
|
-
return
|
|
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:
|
|
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
|
|
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.
|
|
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
|
|
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
|
}
|