@teamix-evo/ui 0.6.2 → 0.7.1

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/manifest.json CHANGED
@@ -1150,6 +1150,11 @@
1150
1150
  "source": "src/components/tree/index.tsx",
1151
1151
  "targetAlias": "components",
1152
1152
  "targetName": "tree.tsx"
1153
+ },
1154
+ {
1155
+ "source": "src/components/tree/utils.ts",
1156
+ "targetAlias": "components",
1157
+ "targetName": "utils.ts"
1153
1158
  }
1154
1159
  ],
1155
1160
  "meta": "src/components/tree/meta.md",
@@ -1372,7 +1377,7 @@
1372
1377
  }
1373
1378
  ],
1374
1379
  "meta": "src/components/tree-select/meta.md",
1375
- "registryDependencies": ["cn", "popover", "checkbox"],
1380
+ "registryDependencies": ["cn", "popover", "checkbox", "tree"],
1376
1381
  "dependencies": {
1377
1382
  "lucide-react": "^0.460.0",
1378
1383
  "class-variance-authority": "^0.7.1"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teamix-evo/ui",
3
- "version": "0.6.2",
3
+ "version": "0.7.1",
4
4
  "description": "Source-injected UI components for Teamix Evo (shadcn-based, antd capabilities)",
5
5
  "type": "module",
6
6
  "files": [
@@ -51,9 +51,9 @@
51
51
  "vite": "^5.4.0",
52
52
  "vite-tsconfig-paths": "^6.1.1",
53
53
  "zod": "^3",
54
+ "@teamix-evo/tokens": "^0.8.1",
54
55
  "@teamix-evo/eslint-config": "0.2.3",
55
- "@teamix-evo/registry": "0.12.0",
56
- "@teamix-evo/tokens": "^0.7.3"
56
+ "@teamix-evo/registry": "0.12.0"
57
57
  },
58
58
  "publishConfig": {
59
59
  "access": "public",
@@ -289,12 +289,6 @@ function alignClass(align?: DataTableColumn<unknown>['align']) {
289
289
  return undefined;
290
290
  }
291
291
 
292
- function widthStyle(col: DataTableColumn<unknown>): React.CSSProperties {
293
- const w = col.size ?? col.width;
294
- if (w === undefined) return {};
295
- return { width: typeof w === 'number' ? `${w}px` : w };
296
- }
297
-
298
292
  /** 把 DataTableColumn 适配为 TanStack ColumnDef;同时按 fixed 重排(左→中→右)以满足锁列 sticky 计算。 */
299
293
  function adaptColumns<T>(
300
294
  columns: DataTableColumn<T>[],
@@ -1222,7 +1216,7 @@ function DataTable<T = Record<string, unknown>>(props: DataTableProps<T>) {
1222
1216
  data-col-hover={isColHover ? '' : undefined}
1223
1217
  className={cn(
1224
1218
  alignClass(cellMeta?.align),
1225
- isFixed && 'bg-background',
1219
+ isFixed && 'bg-card group-hover/row:bg-row-hover',
1226
1220
  isColHover && 'bg-muted/30',
1227
1221
  )}
1228
1222
  onMouseEnter={crossline ? () => setHoveredColId(colId) : undefined}
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import type { Meta, StoryObj } from '@storybook/react';
3
- import { RefreshCw, Rows3, Settings2 } from 'lucide-react';
3
+ import { ArrowUpDown, RotateCw, Settings } from 'lucide-react';
4
4
  import { useForm } from 'react-hook-form';
5
5
 
6
6
  import { Avatar, AvatarFallback, AvatarImage } from '@/components/avatar';
@@ -380,19 +380,19 @@ export const Full: Story = {
380
380
  addonAfter={
381
381
  <div className="flex items-center gap-1">
382
382
  <Button variant="outline" size="icon">
383
- <RefreshCw />
383
+ <RotateCw className="text-muted-foreground" />
384
384
  </Button>
385
385
  <Button
386
386
  variant="outline"
387
387
  size="icon"
388
388
  onClick={() => setSize(size === 'sm' ? 'md' : 'sm')}
389
389
  >
390
- <Rows3 />
390
+ <ArrowUpDown className="text-muted-foreground" />
391
391
  </Button>
392
392
  <Popover>
393
393
  <PopoverTrigger asChild>
394
394
  <Button variant="outline" size="icon">
395
- <Settings2 />
395
+ <Settings className="text-muted-foreground" />
396
396
  </Button>
397
397
  </PopoverTrigger>
398
398
  <PopoverContent align="end" className="w-40 p-2">
@@ -50,7 +50,6 @@ import { Spinner } from '@/components/spinner';
50
50
  import {
51
51
  TimePickerPanel,
52
52
  parseTime,
53
- formatTime,
54
53
  triggerVariants,
55
54
  type TimeParts,
56
55
  type TriggerSize,
@@ -470,7 +470,7 @@ function FilterBarSearchKey({ options, className }: FilterBarSearchKeyProps) {
470
470
  <SelectTrigger
471
471
  size="sm"
472
472
  className={cn(
473
- 'h-full rounded-none border-0 border-r border-input bg-transparent shadow-none focus-visible:ring-0',
473
+ 'h-full rounded-none border-0 border-r border-r-input bg-transparent shadow-none focus-visible:ring-0 focus:border-r-input data-[state=open]:border-r-input',
474
474
  className,
475
475
  )}
476
476
  >
@@ -166,7 +166,7 @@ const PageHeaderDescription = React.forwardRef<
166
166
  <p
167
167
  ref={ref}
168
168
  data-slot="page-header-description"
169
- className={cn('my-2 text-xs text-muted-foreground', className)}
169
+ className={cn('mt-2 text-xs text-muted-foreground', className)}
170
170
  {...props}
171
171
  />
172
172
  ));
@@ -39,8 +39,94 @@ export default meta;
39
39
 
40
40
  type Story = StoryObj<typeof meta>;
41
41
 
42
- /** 完整版页头:面包屑 + 帮助链接 + 返回 + 主图标 + 标题(含 ⓘ) + 描述 + 多操作 + 底部信息。 */
42
+ /** 仅标题:最基础的页头形态,只包含一个标题。 */
43
43
  export const Default: Story = {
44
+ render: () => (
45
+ <PageHeader>
46
+ <PageHeaderContent>
47
+ <PageHeaderHeading>
48
+ <PageHeaderTitle>页面标题</PageHeaderTitle>
49
+ </PageHeaderHeading>
50
+ </PageHeaderContent>
51
+ </PageHeader>
52
+ ),
53
+ };
54
+
55
+ /** 标题 + 描述:标题下方附加一行描述文字。 */
56
+ export const WithDescription: Story = {
57
+ render: () => (
58
+ <PageHeader>
59
+ <PageHeaderContent>
60
+ <div className="flex flex-col">
61
+ <PageHeaderHeading>
62
+ <PageHeaderTitle>页面标题</PageHeaderTitle>
63
+ </PageHeaderHeading>
64
+ <PageHeaderDescription>
65
+ 页面描述页面描述页面描述页面描述页面描述页面描述页面描述
66
+ </PageHeaderDescription>
67
+ </div>
68
+ </PageHeaderContent>
69
+ </PageHeader>
70
+ ),
71
+ };
72
+
73
+ /** 仅面包屑:只有面包屑导航,无标题。 */
74
+ export const OnlyBreadcrumb: Story = {
75
+ render: () => (
76
+ <PageHeader>
77
+ <PageHeaderNav>
78
+ <Breadcrumb>
79
+ <BreadcrumbList>
80
+ <BreadcrumbItem>
81
+ <BreadcrumbLink href="#">首页</BreadcrumbLink>
82
+ </BreadcrumbItem>
83
+ <BreadcrumbSeparator />
84
+ <BreadcrumbItem>
85
+ <BreadcrumbLink href="#">实例列表</BreadcrumbLink>
86
+ </BreadcrumbItem>
87
+ <BreadcrumbSeparator />
88
+ <BreadcrumbItem>
89
+ <BreadcrumbPage>实例详情</BreadcrumbPage>
90
+ </BreadcrumbItem>
91
+ </BreadcrumbList>
92
+ </Breadcrumb>
93
+ </PageHeaderNav>
94
+ </PageHeader>
95
+ ),
96
+ };
97
+
98
+ /** 面包屑 + 标题:面包屑导航 + 标题,常见于二级页面。 */
99
+ export const WithBreadcrumb: Story = {
100
+ render: () => (
101
+ <PageHeader>
102
+ <PageHeaderNav>
103
+ <Breadcrumb>
104
+ <BreadcrumbList>
105
+ <BreadcrumbItem>
106
+ <BreadcrumbLink href="#">首页</BreadcrumbLink>
107
+ </BreadcrumbItem>
108
+ <BreadcrumbSeparator />
109
+ <BreadcrumbItem>
110
+ <BreadcrumbLink href="#">实例列表</BreadcrumbLink>
111
+ </BreadcrumbItem>
112
+ <BreadcrumbSeparator />
113
+ <BreadcrumbItem>
114
+ <BreadcrumbPage>实例详情</BreadcrumbPage>
115
+ </BreadcrumbItem>
116
+ </BreadcrumbList>
117
+ </Breadcrumb>
118
+ </PageHeaderNav>
119
+ <PageHeaderContent>
120
+ <PageHeaderHeading>
121
+ <PageHeaderTitle>实例详情</PageHeaderTitle>
122
+ </PageHeaderHeading>
123
+ </PageHeaderContent>
124
+ </PageHeader>
125
+ ),
126
+ };
127
+
128
+ /** 完整版页头:面包屑 + 帮助链接 + 返回 + 主图标 + 标题(含 ⓘ) + 描述 + 多操作。 */
129
+ export const Full: Story = {
44
130
  render: () => (
45
131
  <PageHeader>
46
132
  <PageHeaderNav>
@@ -93,7 +93,7 @@ function PageShell({
93
93
  // 受限容器(如 storybook `LayoutSandbox`)通过外级注入 `min-height: 0; height: 100%` 重置。
94
94
  // 说明:传入的 sidebar 如果是默认 collapsible="offcanvas",其内部使用 `position: fixed`、
95
95
  // 高度 100svh,适用于全屏页面;在受限容器中需使用 `collapsible="none"` 退出 fixed 布局。
96
- className={cn('!flex-col', className)}
96
+ className={cn('!flex-col !h-svh', className)}
97
97
  style={
98
98
  {
99
99
  '--sidebar-width': sidebarWidth,
@@ -107,7 +107,7 @@ function PageShell({
107
107
  {sidebar}
108
108
  <SidebarInset
109
109
  data-slot="page-shell-content"
110
- className={cn('!min-h-0 overflow-y-auto', bgClass)}
110
+ className={cn('!min-h-0 overflow-hidden', bgClass)}
111
111
  >
112
112
  {children}
113
113
  </SidebarInset>
@@ -154,7 +154,7 @@ function Table({
154
154
  // ─── TableHeader ────────────────────────────────────────────────────────────
155
155
 
156
156
  function TableHeader({ className, ...props }: React.ComponentProps<'thead'>) {
157
- const { stickyHeader, bordered, size } = useTableContext();
157
+ const { stickyHeader } = useTableContext();
158
158
  return (
159
159
  <thead
160
160
  data-slot="table-header"
@@ -219,8 +219,8 @@ const TableRow = React.forwardRef<
219
219
  className={cn(
220
220
  'border-b border-border-subtle transition-colors',
221
221
  hoverable &&
222
- 'hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted',
223
- crossline && 'group/row',
222
+ 'group/row hover:bg-row-hover has-aria-expanded:bg-row-hover data-[state=selected]:bg-muted',
223
+ crossline && !hoverable && 'group/row',
224
224
  className,
225
225
  )}
226
226
  {...props}