@teamix-evo/ui 0.2.0 → 0.3.0
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/README.md +184 -184
- package/manifest.json +680 -492
- package/package.json +15 -9
- package/src/components/accordion/accordion.meta.md +5 -9
- package/src/components/accordion/accordion.stories.tsx +3 -3
- package/src/components/accordion/accordion.tsx +104 -8
- package/src/components/affix/affix.meta.md +21 -12
- package/src/components/affix/affix.stories.tsx +101 -26
- package/src/components/affix/affix.tsx +79 -9
- package/src/components/alert/alert.meta.md +52 -26
- package/src/components/alert/alert.stories.tsx +66 -21
- package/src/components/alert/alert.tsx +81 -34
- package/src/components/alert-dialog/alert-dialog.meta.md +48 -16
- package/src/components/alert-dialog/alert-dialog.stories.tsx +145 -3
- package/src/components/alert-dialog/alert-dialog.tsx +60 -13
- package/src/components/anchor/anchor.meta.md +10 -14
- package/src/components/anchor/anchor.stories.tsx +3 -3
- package/src/components/anchor/anchor.tsx +2 -2
- package/src/components/app/app.meta.md +10 -14
- package/src/components/app/app.stories.tsx +6 -6
- package/src/components/aspect-ratio/aspect-ratio.meta.md +4 -8
- package/src/components/aspect-ratio/aspect-ratio.stories.tsx +3 -3
- package/src/components/auto-complete/auto-complete.meta.md +19 -20
- package/src/components/auto-complete/auto-complete.stories.tsx +44 -3
- package/src/components/auto-complete/auto-complete.tsx +119 -71
- package/src/components/avatar/avatar.meta.md +9 -22
- package/src/components/avatar/avatar.stories.tsx +21 -3
- package/src/components/avatar/avatar.tsx +24 -23
- package/src/components/badge/badge.meta.md +14 -18
- package/src/components/badge/badge.stories.tsx +2 -2
- package/src/components/badge/badge.tsx +2 -2
- package/src/components/breadcrumb/breadcrumb.meta.md +29 -20
- package/src/components/breadcrumb/breadcrumb.stories.tsx +120 -5
- package/src/components/breadcrumb/breadcrumb.tsx +22 -8
- package/src/components/button/button.meta.md +261 -29
- package/src/components/button/button.stories.tsx +549 -41
- package/src/components/button/button.tsx +335 -33
- package/src/components/calendar/calendar.meta.md +19 -14
- package/src/components/calendar/calendar.stories.tsx +5 -5
- package/src/components/calendar/calendar.tsx +73 -8
- package/src/components/card/card.meta.md +31 -34
- package/src/components/card/card.stories.tsx +34 -3
- package/src/components/card/card.tsx +146 -63
- package/src/components/carousel/carousel.meta.md +10 -14
- package/src/components/carousel/carousel.stories.tsx +1 -1
- package/src/components/cascader/cascader.meta.md +43 -22
- package/src/components/cascader/cascader.stories.tsx +13 -2
- package/src/components/cascader/cascader.tsx +427 -84
- package/src/components/checkbox/checkbox.meta.md +74 -24
- package/src/components/checkbox/checkbox.stories.tsx +160 -2
- package/src/components/checkbox/checkbox.tsx +77 -9
- package/src/components/collapsible/collapsible.meta.md +7 -6
- package/src/components/collapsible/collapsible.stories.tsx +2 -2
- package/src/components/collapsible/collapsible.tsx +93 -6
- package/src/components/color-picker/color-picker.meta.md +16 -20
- package/src/components/color-picker/color-picker.stories.tsx +86 -7
- package/src/components/color-picker/color-picker.tsx +19 -9
- package/src/components/command/command.meta.md +7 -11
- package/src/components/command/command.stories.tsx +4 -4
- package/src/components/command/command.tsx +18 -7
- package/src/components/context-menu/context-menu.meta.md +5 -25
- package/src/components/context-menu/context-menu.stories.tsx +4 -4
- package/src/components/context-menu/context-menu.tsx +21 -8
- package/src/components/data-table/data-table.meta.md +14 -18
- package/src/components/data-table/data-table.stories.tsx +1 -1
- package/src/components/data-table/data-table.tsx +2 -2
- package/src/components/date-picker/date-picker.meta.md +90 -41
- package/src/components/date-picker/date-picker.stories.tsx +55 -5
- package/src/components/date-picker/date-picker.tsx +1489 -91
- package/src/components/descriptions/descriptions.meta.md +12 -16
- package/src/components/descriptions/descriptions.stories.tsx +2 -2
- package/src/components/descriptions/descriptions.tsx +22 -14
- package/src/components/dialog/dialog.meta.md +67 -17
- package/src/components/dialog/dialog.stories.tsx +182 -20
- package/src/components/dialog/dialog.tsx +67 -15
- package/src/components/dialog/imperative.tsx +252 -0
- package/src/components/drawer/drawer.meta.md +27 -39
- package/src/components/drawer/drawer.stories.tsx +29 -12
- package/src/components/drawer/drawer.tsx +22 -114
- package/src/components/dropdown-menu/dropdown-menu.meta.md +64 -24
- package/src/components/dropdown-menu/dropdown-menu.stories.tsx +81 -3
- package/src/components/dropdown-menu/dropdown-menu.tsx +24 -10
- package/src/components/ellipsis/ellipsis.meta.md +87 -0
- package/src/components/ellipsis/ellipsis.stories.tsx +72 -0
- package/src/components/ellipsis/ellipsis.tsx +153 -0
- package/src/components/empty/empty.meta.md +10 -14
- package/src/components/empty/empty.stories.tsx +3 -3
- package/src/components/empty/empty.tsx +10 -3
- package/src/components/field/field.meta.md +46 -25
- package/src/components/field/field.stories.tsx +380 -3
- package/src/components/field/field.tsx +263 -35
- package/src/components/filter-bar/filter-bar.meta.md +92 -0
- package/src/components/filter-bar/filter-bar.stories.tsx +1083 -0
- package/src/components/filter-bar/filter-bar.tsx +568 -0
- package/src/components/flex/flex.meta.md +59 -20
- package/src/components/flex/flex.stories.tsx +65 -10
- package/src/components/flex/flex.tsx +27 -4
- package/src/components/float-button/float-button.meta.md +10 -29
- package/src/components/float-button/float-button.stories.tsx +6 -6
- package/src/components/form/form.meta.md +31 -52
- package/src/components/form/form.stories.tsx +350 -3
- package/src/components/form/form.tsx +101 -35
- package/src/components/grid/grid.meta.md +4 -24
- package/src/components/grid/grid.stories.tsx +2 -2
- package/src/components/hover-card/hover-card.meta.md +9 -10
- package/src/components/hover-card/hover-card.stories.tsx +29 -4
- package/src/components/hover-card/hover-card.tsx +51 -13
- package/src/components/icon/DEVELOPMENT.md +809 -0
- package/src/components/icon/icon.meta.md +170 -0
- package/src/components/icon/icon.stories.tsx +344 -0
- package/src/components/icon/icon.tsx +248 -0
- package/src/components/image/image.meta.md +14 -18
- package/src/components/image/image.stories.tsx +3 -3
- package/src/components/image/image.tsx +2 -0
- package/src/components/input/demo/sizes.tsx +2 -2
- package/src/components/input/input.meta.md +44 -43
- package/src/components/input/input.stories.tsx +62 -35
- package/src/components/input/input.tsx +96 -101
- package/src/components/input-group/input-group.meta.md +53 -39
- package/src/components/input-group/input-group.stories.tsx +49 -16
- package/src/components/input-group/input-group.tsx +43 -8
- package/src/components/input-number/input-number.meta.md +68 -20
- package/src/components/input-number/input-number.stories.tsx +33 -6
- package/src/components/input-number/input-number.tsx +79 -20
- package/src/components/input-otp/input-otp.meta.md +8 -20
- package/src/components/input-otp/input-otp.stories.tsx +3 -3
- package/src/components/input-otp/input-otp.tsx +1 -1
- package/src/components/item/item.meta.md +8 -26
- package/src/components/item/item.stories.tsx +3 -3
- package/src/components/item/item.tsx +7 -6
- package/src/components/kbd/kbd.meta.md +7 -19
- package/src/components/kbd/kbd.stories.tsx +4 -4
- package/src/components/kbd/kbd.tsx +8 -4
- package/src/components/label/label.meta.md +21 -18
- package/src/components/label/label.stories.tsx +64 -6
- package/src/components/label/label.tsx +91 -19
- package/src/components/masonry/masonry.meta.md +8 -12
- package/src/components/masonry/masonry.stories.tsx +4 -4
- package/src/components/mentions/mentions.meta.md +42 -21
- package/src/components/mentions/mentions.stories.tsx +120 -6
- package/src/components/mentions/mentions.tsx +10 -5
- package/src/components/menubar/menubar.meta.md +4 -8
- package/src/components/menubar/menubar.stories.tsx +55 -3
- package/src/components/menubar/menubar.tsx +9 -9
- package/src/components/native-select/native-select.meta.md +7 -11
- package/src/components/native-select/native-select.stories.tsx +4 -4
- package/src/components/native-select/native-select.tsx +1 -1
- package/src/components/navigation-menu/navigation-menu.meta.md +4 -8
- package/src/components/navigation-menu/navigation-menu.stories.tsx +106 -3
- package/src/components/navigation-menu/navigation-menu.tsx +6 -3
- package/src/components/notification/notification.meta.md +41 -8
- package/src/components/notification/notification.stories.tsx +9 -9
- package/src/components/notification/notification.tsx +34 -19
- package/src/components/page-header/DEVELOPMENT.md +842 -0
- package/src/components/page-header/page-header.meta.md +208 -0
- package/src/components/page-header/page-header.stories.tsx +421 -0
- package/src/components/page-header/page-header.tsx +281 -0
- package/src/components/pagination/pagination.meta.md +122 -50
- package/src/components/pagination/pagination.stories.tsx +227 -11
- package/src/components/pagination/pagination.tsx +355 -63
- package/src/components/popconfirm/popconfirm.meta.md +19 -23
- package/src/components/popconfirm/popconfirm.stories.tsx +2 -2
- package/src/components/popconfirm/popconfirm.tsx +1 -1
- package/src/components/popover/popover.meta.md +64 -12
- package/src/components/popover/popover.stories.tsx +83 -7
- package/src/components/popover/popover.tsx +77 -28
- package/src/components/progress/progress.meta.md +43 -26
- package/src/components/progress/progress.stories.tsx +2 -2
- package/src/components/progress/progress.tsx +19 -11
- package/src/components/radio-group/radio-group.meta.md +78 -11
- package/src/components/radio-group/radio-group.stories.tsx +38 -2
- package/src/components/radio-group/radio-group.tsx +149 -18
- package/src/components/rate/rate.meta.md +41 -19
- package/src/components/rate/rate.stories.tsx +2 -2
- package/src/components/rate/rate.tsx +37 -10
- package/src/components/resizable/resizable.meta.md +4 -12
- package/src/components/resizable/resizable.stories.tsx +5 -5
- package/src/components/resizable/resizable.tsx +1 -1
- package/src/components/result/result.meta.md +10 -14
- package/src/components/result/result.stories.tsx +2 -2
- package/src/components/result/result.tsx +21 -12
- package/src/components/scroll-area/scroll-area.meta.md +4 -8
- package/src/components/scroll-area/scroll-area.stories.tsx +5 -5
- package/src/components/segmented/segmented.meta.md +15 -17
- package/src/components/segmented/segmented.stories.tsx +3 -3
- package/src/components/segmented/segmented.tsx +15 -7
- package/src/components/select/select.meta.md +199 -67
- package/src/components/select/select.stories.tsx +238 -63
- package/src/components/select/select.tsx +718 -171
- package/src/components/separator/separator.meta.md +10 -14
- package/src/components/separator/separator.stories.tsx +2 -2
- package/src/components/separator/separator.tsx +3 -7
- package/src/components/sheet/sheet.meta.md +26 -21
- package/src/components/sheet/sheet.stories.tsx +116 -10
- package/src/components/sheet/sheet.tsx +116 -29
- package/src/components/sidebar/sidebar.meta.md +28 -38
- package/src/components/sidebar/sidebar.stories.tsx +696 -29
- package/src/components/sidebar/sidebar.tsx +615 -142
- package/src/components/skeleton/skeleton.meta.md +7 -31
- package/src/components/skeleton/skeleton.stories.tsx +3 -3
- package/src/components/skeleton/skeleton.tsx +7 -7
- package/src/components/slider/slider.meta.md +60 -13
- package/src/components/slider/slider.stories.tsx +58 -6
- package/src/components/slider/slider.tsx +154 -13
- package/src/components/sonner/sonner.meta.md +54 -8
- package/src/components/sonner/sonner.stories.tsx +79 -11
- package/src/components/sonner/sonner.tsx +137 -8
- package/src/components/spinner/spinner.meta.md +57 -21
- package/src/components/spinner/spinner.stories.tsx +66 -14
- package/src/components/spinner/spinner.tsx +111 -9
- package/src/components/statistic/statistic.meta.md +14 -30
- package/src/components/statistic/statistic.stories.tsx +1 -1
- package/src/components/statistic/statistic.tsx +4 -5
- package/src/components/steps/steps.meta.md +20 -15
- package/src/components/steps/steps.stories.tsx +37 -2
- package/src/components/steps/steps.tsx +15 -12
- package/src/components/switch/switch.meta.md +56 -15
- package/src/components/switch/switch.stories.tsx +5 -5
- package/src/components/switch/switch.tsx +59 -13
- package/src/components/table/table.meta.md +3 -7
- package/src/components/table/table.stories.tsx +1 -1
- package/src/components/table/table.tsx +4 -4
- package/src/components/tabs/tabs.meta.md +40 -32
- package/src/components/tabs/tabs.stories.tsx +104 -26
- package/src/components/tabs/tabs.tsx +125 -54
- package/src/components/tag/tag.meta.md +104 -68
- package/src/components/tag/tag.stories.tsx +183 -15
- package/src/components/tag/tag.tsx +222 -21
- package/src/components/textarea/textarea.meta.md +42 -31
- package/src/components/textarea/textarea.stories.tsx +32 -6
- package/src/components/textarea/textarea.tsx +32 -8
- package/src/components/time-picker/time-picker.meta.md +119 -50
- package/src/components/time-picker/time-picker.stories.tsx +65 -33
- package/src/components/time-picker/time-picker.tsx +889 -101
- package/src/components/timeline/timeline.meta.md +16 -17
- package/src/components/timeline/timeline.stories.tsx +24 -4
- package/src/components/timeline/timeline.tsx +32 -12
- package/src/components/toggle/toggle.meta.md +8 -12
- package/src/components/toggle/toggle.stories.tsx +4 -4
- package/src/components/toggle/toggle.tsx +4 -3
- package/src/components/toggle-group/toggle-group.meta.md +10 -14
- package/src/components/toggle-group/toggle-group.stories.tsx +3 -3
- package/src/components/toggle-group/toggle-group.tsx +2 -2
- package/src/components/tooltip/tooltip.meta.md +63 -18
- package/src/components/tooltip/tooltip.stories.tsx +42 -5
- package/src/components/tooltip/tooltip.tsx +81 -21
- package/src/components/tour/tour.meta.md +16 -20
- package/src/components/tour/tour.stories.tsx +3 -3
- package/src/components/tour/tour.tsx +3 -3
- package/src/components/transfer/transfer.meta.md +18 -22
- package/src/components/transfer/transfer.stories.tsx +2 -2
- package/src/components/transfer/transfer.tsx +28 -21
- package/src/components/tree/tree.meta.md +67 -22
- package/src/components/tree/tree.stories.tsx +1 -1
- package/src/components/tree/tree.tsx +9 -8
- package/src/components/tree-select/tree-select.meta.md +59 -23
- package/src/components/tree-select/tree-select.stories.tsx +2 -2
- package/src/components/tree-select/tree-select.tsx +42 -7
- package/src/components/typography/typography.meta.md +61 -39
- package/src/components/typography/typography.stories.tsx +14 -9
- package/src/components/typography/typography.tsx +38 -25
- package/src/components/upload/upload.meta.md +61 -25
- package/src/components/upload/upload.stories.tsx +69 -3
- package/src/components/upload/upload.tsx +170 -37
- package/src/components/watermark/watermark.meta.md +15 -19
- package/src/components/watermark/watermark.stories.tsx +98 -8
- package/src/hooks/use-breakpoint.ts +117 -0
- package/src/hooks/use-debounce-callback.ts +52 -0
- package/src/hooks/use-mobile.ts +23 -0
- package/src/stories/theme-tokens.stories.tsx +747 -0
- package/src/utils/trigger-input.ts +53 -0
- package/src/components/button-group/button-group.meta.md +0 -101
- package/src/components/button-group/button-group.stories.tsx +0 -93
- package/src/components/button-group/button-group.tsx +0 -75
- package/src/components/combobox/combobox.meta.md +0 -102
- package/src/components/combobox/combobox.stories.tsx +0 -55
- package/src/components/combobox/combobox.tsx +0 -130
- package/src/components/input/demo/addon.tsx +0 -15
- package/src/components/input/demo/with-prefix-suffix.tsx +0 -19
- package/src/components/space/space.meta.md +0 -103
- package/src/components/space/space.stories.tsx +0 -108
- package/src/components/space/space.tsx +0 -106
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
-
import { Settings } from 'lucide-react';
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { Settings, Info } from 'lucide-react';
|
|
3
3
|
import { Tooltip, TooltipProvider } from './tooltip';
|
|
4
4
|
import { Button } from '@/components/button/button';
|
|
5
5
|
|
|
6
6
|
const meta: Meta<typeof Tooltip> = {
|
|
7
|
-
title: '
|
|
7
|
+
title: '数据展示 · Data Display/Tooltip',
|
|
8
8
|
component: Tooltip,
|
|
9
9
|
tags: ['autodocs'],
|
|
10
10
|
parameters: {
|
|
11
11
|
docs: {
|
|
12
12
|
description: {
|
|
13
13
|
component:
|
|
14
|
-
'
|
|
14
|
+
'文字提示 —— 鼠标悬停或键盘聚焦元素时弹出的简短文字解释。基于 Radix Tooltip 实现 + antd `Tooltip` 并集能力:`title` 文本、`side` 四向、`arrow` 尖角、`delayDuration` 延迟、`withProvider` 内联 Provider,新增 `variant`(default 深底 / light 白底)对齐 cloud-design Balloon 双形态。视觉走 OpenTrek semantic tokens,所有样式来自 `@teamix-evo/tokens`,无 mock。',
|
|
15
15
|
},
|
|
16
16
|
},
|
|
17
17
|
},
|
|
@@ -20,10 +20,14 @@ const meta: Meta<typeof Tooltip> = {
|
|
|
20
20
|
control: 'inline-radio',
|
|
21
21
|
options: ['top', 'right', 'bottom', 'left'],
|
|
22
22
|
},
|
|
23
|
+
variant: {
|
|
24
|
+
control: 'inline-radio',
|
|
25
|
+
options: ['default', 'light'],
|
|
26
|
+
},
|
|
23
27
|
arrow: { control: 'boolean' },
|
|
24
28
|
title: { control: 'text' },
|
|
25
29
|
},
|
|
26
|
-
args: { side: 'top', arrow: true, title: '设置' },
|
|
30
|
+
args: { side: 'top', variant: 'default', arrow: true, title: '设置' },
|
|
27
31
|
decorators: [
|
|
28
32
|
(Story) => (
|
|
29
33
|
<TooltipProvider delayDuration={200}>
|
|
@@ -61,6 +65,39 @@ export const Sides: Story = {
|
|
|
61
65
|
),
|
|
62
66
|
};
|
|
63
67
|
|
|
68
|
+
export const Variants: Story = {
|
|
69
|
+
name: 'Variants · default vs light',
|
|
70
|
+
parameters: { controls: { disable: true } },
|
|
71
|
+
render: () => (
|
|
72
|
+
<div className="flex items-center gap-6">
|
|
73
|
+
<Tooltip title="深色 tooltip(default)" variant="default">
|
|
74
|
+
<Button variant="outline">深色</Button>
|
|
75
|
+
</Tooltip>
|
|
76
|
+
<Tooltip title="浅色 tooltip(light) · 带边框与阴影" variant="light">
|
|
77
|
+
<Button variant="outline">浅色</Button>
|
|
78
|
+
</Tooltip>
|
|
79
|
+
</div>
|
|
80
|
+
),
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const LightVariant: Story = {
|
|
84
|
+
name: 'Light variant 富文本',
|
|
85
|
+
parameters: { controls: { disable: true } },
|
|
86
|
+
render: () => (
|
|
87
|
+
<Tooltip
|
|
88
|
+
variant="light"
|
|
89
|
+
side="right"
|
|
90
|
+
title={
|
|
91
|
+
<span className="inline-flex items-center gap-1.5">
|
|
92
|
+
<Info className="size-3.5" /> 配额按账号每分钟计算
|
|
93
|
+
</span>
|
|
94
|
+
}
|
|
95
|
+
>
|
|
96
|
+
<Button variant="outline">规则说明</Button>
|
|
97
|
+
</Tooltip>
|
|
98
|
+
),
|
|
99
|
+
};
|
|
100
|
+
|
|
64
101
|
export const NoArrow: Story = {
|
|
65
102
|
parameters: { controls: { disable: true } },
|
|
66
103
|
render: () => (
|
|
@@ -1,14 +1,51 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
|
3
|
+
import { cva, type VariantProps } from 'class-variance-authority';
|
|
3
4
|
|
|
4
5
|
import { cn } from '@/utils/cn';
|
|
5
6
|
|
|
6
7
|
const TooltipProvider = TooltipPrimitive.Provider;
|
|
7
8
|
const TooltipRoot = TooltipPrimitive.Root;
|
|
8
|
-
const TooltipTrigger =
|
|
9
|
+
const TooltipTrigger = React.forwardRef<
|
|
10
|
+
React.ElementRef<typeof TooltipPrimitive.Trigger>,
|
|
11
|
+
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>
|
|
12
|
+
>(({ className, ...props }, ref) => (
|
|
13
|
+
<TooltipPrimitive.Trigger
|
|
14
|
+
ref={ref}
|
|
15
|
+
className={cn('cursor-pointer', className)}
|
|
16
|
+
{...props}
|
|
17
|
+
/>
|
|
18
|
+
));
|
|
19
|
+
TooltipTrigger.displayName = TooltipPrimitive.Trigger.displayName;
|
|
20
|
+
|
|
21
|
+
const tooltipContentVariants = cva(
|
|
22
|
+
'z-50 overflow-hidden rounded-md px-3 py-1.5 text-xs animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
|
|
23
|
+
{
|
|
24
|
+
variants: {
|
|
25
|
+
variant: {
|
|
26
|
+
default: 'bg-primary text-primary-foreground shadow-md',
|
|
27
|
+
light:
|
|
28
|
+
'border border-border bg-popover text-popover-foreground shadow-md',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
defaultVariants: {
|
|
32
|
+
variant: 'default',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
/** 箭头填充色与变体一一对应。 */
|
|
38
|
+
const arrowFillByVariant: Record<
|
|
39
|
+
NonNullable<VariantProps<typeof tooltipContentVariants>['variant']>,
|
|
40
|
+
string
|
|
41
|
+
> = {
|
|
42
|
+
default: 'fill-primary',
|
|
43
|
+
light: 'fill-popover',
|
|
44
|
+
};
|
|
9
45
|
|
|
10
46
|
export interface TooltipContentProps
|
|
11
|
-
extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content
|
|
47
|
+
extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>,
|
|
48
|
+
VariantProps<typeof tooltipContentVariants> {
|
|
12
49
|
/**
|
|
13
50
|
* 是否显示三角形箭头(antd `arrow` 并集)。
|
|
14
51
|
* @default true
|
|
@@ -19,24 +56,37 @@ export interface TooltipContentProps
|
|
|
19
56
|
const TooltipContent = React.forwardRef<
|
|
20
57
|
React.ElementRef<typeof TooltipPrimitive.Content>,
|
|
21
58
|
TooltipContentProps
|
|
22
|
-
>(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
sideOffset=
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
59
|
+
>(
|
|
60
|
+
(
|
|
61
|
+
{
|
|
62
|
+
className,
|
|
63
|
+
sideOffset = 4,
|
|
64
|
+
arrow = true,
|
|
65
|
+
variant = 'default',
|
|
66
|
+
children,
|
|
67
|
+
...props
|
|
68
|
+
},
|
|
69
|
+
ref,
|
|
70
|
+
) => (
|
|
71
|
+
<TooltipPrimitive.Portal>
|
|
72
|
+
<TooltipPrimitive.Content
|
|
73
|
+
ref={ref}
|
|
74
|
+
sideOffset={sideOffset}
|
|
75
|
+
className={cn(tooltipContentVariants({ variant }), className)}
|
|
76
|
+
{...props}
|
|
77
|
+
>
|
|
78
|
+
{children}
|
|
79
|
+
{arrow ? (
|
|
80
|
+
<TooltipPrimitive.Arrow
|
|
81
|
+
className={arrowFillByVariant[variant ?? 'default']}
|
|
82
|
+
width={8}
|
|
83
|
+
height={4}
|
|
84
|
+
/>
|
|
85
|
+
) : null}
|
|
86
|
+
</TooltipPrimitive.Content>
|
|
87
|
+
</TooltipPrimitive.Portal>
|
|
88
|
+
),
|
|
89
|
+
);
|
|
40
90
|
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
41
91
|
|
|
42
92
|
// ─── Convenience wrapper(antd-style 一行调用)──────────────────────────────
|
|
@@ -52,6 +102,14 @@ export interface TooltipProps
|
|
|
52
102
|
title: React.ReactNode;
|
|
53
103
|
/** 弹出方向。 @default "top" */
|
|
54
104
|
side?: 'top' | 'right' | 'bottom' | 'left';
|
|
105
|
+
/**
|
|
106
|
+
* 视觉变体:
|
|
107
|
+
* - `default`:深色背景 + 浅色文字(信息密度高、对比强,适合图标按钮 / 列截断提示)
|
|
108
|
+
* - `light`:浅色背景 + 深色文字 + 边框 + 阴影(视觉更轻,贴近富内容卡片调性,
|
|
109
|
+
* 对齐 cloud-design Balloon `type="primary"`)
|
|
110
|
+
* @default "default"
|
|
111
|
+
*/
|
|
112
|
+
variant?: 'default' | 'light';
|
|
55
113
|
/** 是否显示三角形箭头。 @default true */
|
|
56
114
|
arrow?: boolean;
|
|
57
115
|
/** 显示延迟(ms),默认沿用 Provider 的 delayDuration。 */
|
|
@@ -64,6 +122,7 @@ const Tooltip: React.FC<TooltipProps> = ({
|
|
|
64
122
|
children,
|
|
65
123
|
title,
|
|
66
124
|
side = 'top',
|
|
125
|
+
variant = 'default',
|
|
67
126
|
arrow = true,
|
|
68
127
|
delayDuration,
|
|
69
128
|
withProvider = false,
|
|
@@ -72,7 +131,7 @@ const Tooltip: React.FC<TooltipProps> = ({
|
|
|
72
131
|
const inner = (
|
|
73
132
|
<TooltipRoot delayDuration={delayDuration} {...rootProps}>
|
|
74
133
|
<TooltipTrigger asChild>{children}</TooltipTrigger>
|
|
75
|
-
<TooltipContent side={side} arrow={arrow}>
|
|
134
|
+
<TooltipContent side={side} variant={variant} arrow={arrow}>
|
|
76
135
|
{title}
|
|
77
136
|
</TooltipContent>
|
|
78
137
|
</TooltipRoot>
|
|
@@ -90,4 +149,5 @@ export {
|
|
|
90
149
|
TooltipRoot,
|
|
91
150
|
TooltipTrigger,
|
|
92
151
|
TooltipContent,
|
|
152
|
+
tooltipContentVariants,
|
|
93
153
|
};
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: tour
|
|
3
3
|
name: Tour
|
|
4
4
|
type: component
|
|
5
|
-
category:
|
|
5
|
+
category: deprecated
|
|
6
6
|
since: 0.1.0
|
|
7
7
|
package: '@teamix-evo/ui'
|
|
8
8
|
displayName: 新手引导
|
|
@@ -28,33 +28,30 @@ displayName: 新手引导
|
|
|
28
28
|
## Props
|
|
29
29
|
|
|
30
30
|
<!-- auto:props:begin -->
|
|
31
|
-
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
| `
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
37
|
-
| `
|
|
38
|
-
| `
|
|
39
|
-
| `
|
|
40
|
-
| `
|
|
41
|
-
| `
|
|
42
|
-
| `mask` | `boolean` | `true` | – | 是否显示遮罩(antd `mask` 并集)。 |
|
|
43
|
-
|
|
31
|
+
| 名称 | 类型 | 默认值 | 必填 | 说明 |
|
|
32
|
+
| --- | --- | --- | --- | --- |
|
|
33
|
+
| `steps` | `TourStep[]` | – | ✓ | 步骤列表(antd `steps` 并集)。 |
|
|
34
|
+
| `open` | `boolean` | – | – | 受控 open 状态。 |
|
|
35
|
+
| `defaultOpen` | `boolean` | `false` | – | uncontrolled 初值。 |
|
|
36
|
+
| `onOpenChange` | `(open: boolean) => void` | – | – | open 变化回调。 |
|
|
37
|
+
| `current` | `number` | – | – | 当前步骤索引(受控)。 |
|
|
38
|
+
| `onChange` | `(current: number) => void` | – | – | 步骤变化回调。 |
|
|
39
|
+
| `onFinish` | `() => void` | – | – | 完成时回调(走到最后一步且点击"完成")。 |
|
|
40
|
+
| `onClose` | `() => void` | – | – | 关闭回调(任意时刻点 X / mask)。 |
|
|
41
|
+
| `mask` | `boolean` | `true` | – | 是否显示遮罩(antd `mask` 并集)。 |
|
|
44
42
|
<!-- auto:props:end -->
|
|
45
43
|
|
|
46
44
|
## 依赖
|
|
47
45
|
|
|
48
46
|
<!-- auto:deps:begin -->
|
|
49
|
-
|
|
50
47
|
### 同库依赖
|
|
51
48
|
|
|
52
49
|
> `teamix-evo ui add tour` 时,以下 entry 会被自动连带安装(无需手动 add)。
|
|
53
50
|
|
|
54
|
-
| Entry
|
|
55
|
-
|
|
|
56
|
-
| `cn`
|
|
57
|
-
| `button` | component | 通用按钮 — shadcn 实现 +
|
|
51
|
+
| Entry | 类型 | 描述 |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| `cn` | util | Tailwind className 合并工具(clsx + tailwind-merge) |
|
|
54
|
+
| `button` | component | 通用按钮 — shadcn 实现 + cloud-design 能力并集(loading / icon / shape / block / dashed variant / color 语义双 prop / disabledTooltip)。同文件合一导出 ButtonGroup + ButtonGroupText(等价 antd Space.Compact + cd SplitButton)。 |
|
|
58
55
|
|
|
59
56
|
### npm 依赖
|
|
60
57
|
|
|
@@ -63,7 +60,6 @@ displayName: 新手引导
|
|
|
63
60
|
```bash
|
|
64
61
|
pnpm add lucide-react@^0.460.0
|
|
65
62
|
```
|
|
66
|
-
|
|
67
63
|
<!-- auto:deps:end -->
|
|
68
64
|
|
|
69
65
|
## AI 生成纪律
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
3
|
import { Tour } from './tour';
|
|
4
4
|
import { Button } from '@/components/button/button';
|
|
5
5
|
|
|
6
6
|
const meta: Meta<typeof Tour> = {
|
|
7
|
-
title: '
|
|
7
|
+
title: '废弃 · Deprecated/Tour',
|
|
8
8
|
component: Tour,
|
|
9
9
|
tags: ['autodocs'],
|
|
10
10
|
parameters: {
|
|
11
11
|
docs: {
|
|
12
12
|
description: {
|
|
13
13
|
component:
|
|
14
|
-
'新手引导 — 多步骤 spotlight + 卡片 + 步进按钮。帮助新用户首次进入页面时了解关键功能位置。等价 antd `Tour`(v5.0+)。业务侧自管“是否首次访问”。',
|
|
14
|
+
'⚠️ **已废弃** — 仅 Storybook 留档,不通过 manifest 对外发布。\n\n新手引导 — 多步骤 spotlight + 卡片 + 步进按钮。帮助新用户首次进入页面时了解关键功能位置。等价 antd `Tour`(v5.0+)。业务侧自管“是否首次访问”。',
|
|
15
15
|
},
|
|
16
16
|
},
|
|
17
17
|
},
|
|
@@ -188,7 +188,7 @@ const Tour: React.FC<TourProps> = ({
|
|
|
188
188
|
<div
|
|
189
189
|
role="dialog"
|
|
190
190
|
className={cn(
|
|
191
|
-
'absolute w-80 rounded-md border bg-popover p-4 text-popover-foreground shadow-xl',
|
|
191
|
+
'absolute w-80 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-xl',
|
|
192
192
|
)}
|
|
193
193
|
style={cardStyle}
|
|
194
194
|
>
|
|
@@ -198,13 +198,13 @@ const Tour: React.FC<TourProps> = ({
|
|
|
198
198
|
type="button"
|
|
199
199
|
aria-label="关闭"
|
|
200
200
|
onClick={close}
|
|
201
|
-
className="text-muted-foreground transition-colors hover:text-foreground"
|
|
201
|
+
className="cursor-pointer text-muted-foreground transition-colors hover:text-foreground"
|
|
202
202
|
>
|
|
203
203
|
<X className="size-4" />
|
|
204
204
|
</button>
|
|
205
205
|
</div>
|
|
206
206
|
{cur.description ? (
|
|
207
|
-
<div className="mt-2 text-
|
|
207
|
+
<div className="mt-2 text-xs text-muted-foreground">
|
|
208
208
|
{cur.description}
|
|
209
209
|
</div>
|
|
210
210
|
) : null}
|
|
@@ -3,7 +3,7 @@ id: transfer
|
|
|
3
3
|
name: Transfer
|
|
4
4
|
displayName: 穿梭框
|
|
5
5
|
type: component
|
|
6
|
-
category: data-
|
|
6
|
+
category: data-entry
|
|
7
7
|
since: 0.1.0
|
|
8
8
|
package: '@teamix-evo/ui'
|
|
9
9
|
---
|
|
@@ -26,35 +26,32 @@ package: '@teamix-evo/ui'
|
|
|
26
26
|
## Props
|
|
27
27
|
|
|
28
28
|
<!-- auto:props:begin -->
|
|
29
|
-
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
| `
|
|
33
|
-
| `
|
|
34
|
-
| `
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
37
|
-
| `
|
|
38
|
-
| `
|
|
39
|
-
| `
|
|
40
|
-
| `className` | `string` | – | – | – |
|
|
41
|
-
|
|
29
|
+
| 名称 | 类型 | 默认值 | 必填 | 说明 |
|
|
30
|
+
| --- | --- | --- | --- | --- |
|
|
31
|
+
| `dataSource` | `TransferItem[]` | – | ✓ | 全部数据源(左+右合集)。 |
|
|
32
|
+
| `targetKeys` | `string[]` | – | ✓ | 受控:已"穿梭到右侧"的 key 集合(antd `targetKeys` 并集)。 |
|
|
33
|
+
| `onChange` | `(next: string[]) => void` | – | – | 右侧集合变化回调。 |
|
|
34
|
+
| `titles` | `[React.ReactNode, React.ReactNode]` | `["源", "目标"]` | – | 两侧标题(antd `titles` 并集) — `[左, 右]`。 |
|
|
35
|
+
| `showSearch` | `boolean` | `false` | – | 启用搜索(antd `showSearch` 并集) — 两侧各一个输入框。 |
|
|
36
|
+
| `render` | `(item: TransferItem) => React.ReactNode` | – | – | 自定义渲染单项(antd `render` 并集) — 默认渲染 `item.title`。 |
|
|
37
|
+
| `disabled` | `boolean` | – | – | 整体禁用。 |
|
|
38
|
+
| `listHeight` | `number` | `280` | – | 单侧高度(像素)。 |
|
|
39
|
+
| `className` | `string` | – | – | – |
|
|
42
40
|
<!-- auto:props:end -->
|
|
43
41
|
|
|
44
42
|
## 依赖
|
|
45
43
|
|
|
46
44
|
<!-- auto:deps:begin -->
|
|
47
|
-
|
|
48
45
|
### 同库依赖
|
|
49
46
|
|
|
50
47
|
> `teamix-evo ui add transfer` 时,以下 entry 会被自动连带安装(无需手动 add)。
|
|
51
48
|
|
|
52
|
-
| Entry
|
|
53
|
-
|
|
|
54
|
-
| `cn`
|
|
55
|
-
| `button`
|
|
56
|
-
| `checkbox` | component | 复选框 — Radix Checkbox(原生 indeterminate)+ antd Checkbox.Group(options 数组驱动)
|
|
57
|
-
| `input`
|
|
49
|
+
| Entry | 类型 | 描述 |
|
|
50
|
+
| --- | --- | --- |
|
|
51
|
+
| `cn` | util | Tailwind className 合并工具(clsx + tailwind-merge) |
|
|
52
|
+
| `button` | component | 通用按钮 — shadcn 实现 + cloud-design 能力并集(loading / icon / shape / block / dashed variant / color 语义双 prop / disabledTooltip)。同文件合一导出 ButtonGroup + ButtonGroupText(等价 antd Space.Compact + cd SplitButton)。 |
|
|
53
|
+
| `checkbox` | component | 复选框 — Radix Checkbox(原生 indeterminate)+ antd Checkbox.Group(options 数组驱动) |
|
|
54
|
+
| `input` | component | 单行文本输入 — clearable / showCount / size(sm 24 / md 32 / lg 36,与 Button 同档)/ error 四档内建能力。前缀/后缀/addon 等复合形态已拆出独立 InputGroup;多行已拆出独立 Textarea |
|
|
58
55
|
|
|
59
56
|
### npm 依赖
|
|
60
57
|
|
|
@@ -63,7 +60,6 @@ package: '@teamix-evo/ui'
|
|
|
63
60
|
```bash
|
|
64
61
|
pnpm add lucide-react@^0.460.0
|
|
65
62
|
```
|
|
66
|
-
|
|
67
63
|
<!-- auto:deps:end -->
|
|
68
64
|
|
|
69
65
|
## AI 生成纪律
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
3
|
import { Transfer, type TransferItem } from './transfer';
|
|
4
4
|
|
|
5
5
|
const meta: Meta<typeof Transfer> = {
|
|
6
|
-
title: '
|
|
6
|
+
title: '数据录入 · Data Entry/Transfer',
|
|
7
7
|
component: Transfer,
|
|
8
8
|
tags: ['autodocs'],
|
|
9
9
|
parameters: {
|
|
@@ -120,33 +120,39 @@ const Transfer = React.forwardRef<HTMLDivElement, TransferProps>(
|
|
|
120
120
|
query: string,
|
|
121
121
|
setQuery: (v: string) => void,
|
|
122
122
|
) => {
|
|
123
|
-
const selectableKeys = visible
|
|
123
|
+
const selectableKeys = visible
|
|
124
|
+
.filter((i) => !i.disabled)
|
|
125
|
+
.map((i) => i.key);
|
|
124
126
|
const allChecked =
|
|
125
|
-
selectableKeys.length > 0 &&
|
|
127
|
+
selectableKeys.length > 0 &&
|
|
128
|
+
selectableKeys.every((k) => checked.includes(k));
|
|
126
129
|
const someChecked =
|
|
127
130
|
!allChecked && selectableKeys.some((k) => checked.includes(k));
|
|
128
131
|
const toggleAll = (value: boolean) => {
|
|
129
|
-
if (value)
|
|
132
|
+
if (value)
|
|
133
|
+
setChecked(Array.from(new Set([...checked, ...selectableKeys])));
|
|
130
134
|
else setChecked(checked.filter((k) => !selectableKeys.includes(k)));
|
|
131
135
|
};
|
|
132
136
|
|
|
133
137
|
return (
|
|
134
|
-
<div className="flex w-56 flex-col overflow-hidden rounded-md border bg-card text-
|
|
135
|
-
<div className="flex items-center justify-between gap-2 border-b px-3 py-2">
|
|
138
|
+
<div className="flex w-56 flex-col overflow-hidden rounded-md border border-border bg-card text-xs">
|
|
139
|
+
<div className="flex items-center justify-between gap-2 border-b border-b-border bg-muted/40 px-3 py-2">
|
|
136
140
|
<label className="flex items-center gap-2">
|
|
137
141
|
<Checkbox
|
|
138
|
-
checked={
|
|
142
|
+
checked={
|
|
143
|
+
allChecked ? true : someChecked ? 'indeterminate' : false
|
|
144
|
+
}
|
|
139
145
|
disabled={disabled || selectableKeys.length === 0}
|
|
140
146
|
onCheckedChange={(c) => toggleAll(c === true)}
|
|
141
147
|
/>
|
|
142
|
-
<span className="text-xs text-muted-foreground">
|
|
148
|
+
<span className="text-xs text-muted-foreground tabular-nums">
|
|
143
149
|
{checked.length}/{items.length}
|
|
144
150
|
</span>
|
|
145
151
|
</label>
|
|
146
|
-
<span className="text-xs font-medium">{title}</span>
|
|
152
|
+
<span className="text-xs font-medium text-foreground">{title}</span>
|
|
147
153
|
</div>
|
|
148
154
|
{showSearch ? (
|
|
149
|
-
<div className="border-b p-2">
|
|
155
|
+
<div className="border-b border-b-border p-2">
|
|
150
156
|
<div className="relative">
|
|
151
157
|
<Search className="absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" />
|
|
152
158
|
<Input
|
|
@@ -175,8 +181,9 @@ const Transfer = React.forwardRef<HTMLDivElement, TransferProps>(
|
|
|
175
181
|
<li key={item.key}>
|
|
176
182
|
<label
|
|
177
183
|
className={cn(
|
|
178
|
-
'flex items-center gap-2 px-3 py-1.5',
|
|
179
|
-
!itemDisabled && 'cursor-pointer hover:bg-accent',
|
|
184
|
+
'flex items-center gap-2 px-3 py-1.5 transition-colors',
|
|
185
|
+
!itemDisabled && 'cursor-pointer hover:bg-accent/50',
|
|
186
|
+
!itemDisabled && isChecked && 'bg-accent/40',
|
|
180
187
|
itemDisabled && 'cursor-not-allowed opacity-50',
|
|
181
188
|
)}
|
|
182
189
|
>
|
|
@@ -185,7 +192,8 @@ const Transfer = React.forwardRef<HTMLDivElement, TransferProps>(
|
|
|
185
192
|
disabled={itemDisabled}
|
|
186
193
|
onCheckedChange={(c) => {
|
|
187
194
|
if (c === true) setChecked([...checked, item.key]);
|
|
188
|
-
else
|
|
195
|
+
else
|
|
196
|
+
setChecked(checked.filter((k) => k !== item.key));
|
|
189
197
|
}}
|
|
190
198
|
/>
|
|
191
199
|
<span className="min-w-0 flex-1 truncate">
|
|
@@ -202,10 +210,7 @@ const Transfer = React.forwardRef<HTMLDivElement, TransferProps>(
|
|
|
202
210
|
};
|
|
203
211
|
|
|
204
212
|
return (
|
|
205
|
-
<div
|
|
206
|
-
ref={ref}
|
|
207
|
-
className={cn('flex items-center gap-3', className)}
|
|
208
|
-
>
|
|
213
|
+
<div ref={ref} className={cn('flex items-center gap-3', className)}>
|
|
209
214
|
{renderPane(
|
|
210
215
|
titles[0],
|
|
211
216
|
leftItems,
|
|
@@ -215,22 +220,24 @@ const Transfer = React.forwardRef<HTMLDivElement, TransferProps>(
|
|
|
215
220
|
leftQuery,
|
|
216
221
|
setLeftQuery,
|
|
217
222
|
)}
|
|
218
|
-
<div className="flex flex-col gap-
|
|
223
|
+
<div className="flex flex-col gap-1.5">
|
|
219
224
|
<Button
|
|
220
|
-
size="
|
|
225
|
+
size="sm"
|
|
221
226
|
variant="outline"
|
|
222
227
|
disabled={disabled || leftChecked.length === 0}
|
|
223
228
|
onClick={moveRight}
|
|
224
229
|
aria-label="移动到右侧"
|
|
225
|
-
|
|
230
|
+
className="size-7 p-0"
|
|
231
|
+
icon={<ChevronRight className="size-3.5" />}
|
|
226
232
|
/>
|
|
227
233
|
<Button
|
|
228
|
-
size="
|
|
234
|
+
size="sm"
|
|
229
235
|
variant="outline"
|
|
230
236
|
disabled={disabled || rightChecked.length === 0}
|
|
231
237
|
onClick={moveLeft}
|
|
232
238
|
aria-label="移动到左侧"
|
|
233
|
-
|
|
239
|
+
className="size-7 p-0"
|
|
240
|
+
icon={<ChevronLeft className="size-3.5" />}
|
|
234
241
|
/>
|
|
235
242
|
</div>
|
|
236
243
|
{renderPane(
|