@teamix-evo/ui 0.1.1 → 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 +20 -10
- package/src/components/accordion/accordion.meta.md +5 -4
- package/src/components/accordion/accordion.stories.tsx +14 -9
- package/src/components/accordion/accordion.tsx +104 -8
- package/src/components/affix/affix.meta.md +20 -2
- package/src/components/affix/affix.stories.tsx +102 -25
- package/src/components/affix/affix.tsx +79 -9
- package/src/components/alert/alert.meta.md +44 -13
- 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 +61 -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 +8 -3
- package/src/components/anchor/anchor.stories.tsx +3 -3
- package/src/components/anchor/anchor.tsx +2 -2
- package/src/components/app/app.meta.md +9 -4
- package/src/components/app/app.stories.tsx +9 -7
- package/src/components/aspect-ratio/aspect-ratio.meta.md +4 -3
- package/src/components/aspect-ratio/aspect-ratio.stories.tsx +3 -3
- package/src/components/auto-complete/auto-complete.meta.md +14 -6
- package/src/components/auto-complete/auto-complete.stories.tsx +47 -4
- package/src/components/auto-complete/auto-complete.tsx +119 -71
- package/src/components/avatar/avatar.meta.md +6 -7
- package/src/components/avatar/avatar.stories.tsx +21 -3
- package/src/components/avatar/avatar.tsx +24 -23
- package/src/components/badge/badge.meta.md +10 -9
- package/src/components/badge/badge.stories.tsx +2 -2
- package/src/components/badge/badge.tsx +9 -15
- package/src/components/breadcrumb/breadcrumb.meta.md +27 -7
- package/src/components/breadcrumb/breadcrumb.stories.tsx +127 -4
- package/src/components/breadcrumb/breadcrumb.tsx +22 -8
- package/src/components/button/button.meta.md +258 -21
- package/src/components/button/button.stories.tsx +549 -41
- package/src/components/button/button.tsx +335 -33
- package/src/components/button/demo/as-child.tsx +24 -0
- package/src/components/button/demo/basic.tsx +8 -0
- package/src/components/button/demo/block.tsx +16 -0
- package/src/components/button/demo/loading.tsx +19 -0
- package/src/components/button/demo/shapes.tsx +18 -0
- package/src/components/button/demo/sizes.tsx +19 -0
- package/src/components/button/demo/variants.tsx +19 -0
- package/src/components/button/demo/with-icon.tsx +20 -0
- package/src/components/calendar/calendar.meta.md +13 -3
- package/src/components/calendar/calendar.stories.tsx +6 -6
- package/src/components/calendar/calendar.tsx +73 -8
- package/src/components/card/card.meta.md +27 -5
- package/src/components/card/card.stories.tsx +42 -3
- package/src/components/card/card.tsx +146 -63
- package/src/components/carousel/carousel.meta.md +4 -3
- package/src/components/carousel/carousel.stories.tsx +11 -6
- package/src/components/cascader/cascader.meta.md +47 -17
- package/src/components/cascader/cascader.stories.tsx +22 -10
- package/src/components/cascader/cascader.tsx +428 -85
- package/src/components/checkbox/checkbox.meta.md +75 -7
- package/src/components/checkbox/checkbox.stories.tsx +161 -3
- package/src/components/checkbox/checkbox.tsx +77 -9
- package/src/components/collapsible/collapsible.meta.md +14 -6
- package/src/components/collapsible/collapsible.stories.tsx +10 -2
- package/src/components/collapsible/collapsible.tsx +93 -6
- package/src/components/color-picker/color-picker.meta.md +12 -7
- package/src/components/color-picker/color-picker.stories.tsx +86 -7
- package/src/components/color-picker/color-picker.tsx +20 -9
- package/src/components/command/command.meta.md +29 -13
- package/src/components/command/command.stories.tsx +4 -4
- package/src/components/command/command.tsx +19 -8
- package/src/components/context-menu/context-menu.meta.md +11 -8
- package/src/components/context-menu/context-menu.stories.tsx +11 -3
- package/src/components/context-menu/context-menu.tsx +21 -8
- package/src/components/data-table/data-table.meta.md +6 -5
- package/src/components/data-table/data-table.stories.tsx +13 -6
- package/src/components/data-table/data-table.tsx +2 -2
- package/src/components/date-picker/date-picker.meta.md +88 -19
- 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 +10 -5
- package/src/components/descriptions/descriptions.stories.tsx +3 -3
- package/src/components/descriptions/descriptions.tsx +22 -14
- package/src/components/dialog/dialog.meta.md +76 -13
- 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 +33 -34
- package/src/components/drawer/drawer.stories.tsx +29 -12
- package/src/components/drawer/drawer.tsx +22 -113
- package/src/components/dropdown-menu/dropdown-menu.meta.md +78 -10
- package/src/components/dropdown-menu/dropdown-menu.stories.tsx +88 -2
- 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 +9 -4
- package/src/components/empty/empty.stories.tsx +4 -4
- package/src/components/empty/empty.tsx +10 -3
- package/src/components/field/field.meta.md +47 -9
- package/src/components/field/field.stories.tsx +385 -5
- 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 +54 -6
- package/src/components/flex/flex.stories.tsx +107 -20
- package/src/components/flex/flex.tsx +27 -4
- package/src/components/float-button/float-button.meta.md +8 -3
- package/src/components/float-button/float-button.stories.tsx +9 -7
- package/src/components/float-button/float-button.tsx +1 -1
- package/src/components/form/form.meta.md +39 -17
- package/src/components/form/form.stories.tsx +350 -3
- package/src/components/form/form.tsx +101 -35
- package/src/components/grid/grid.meta.md +7 -2
- package/src/components/grid/grid.stories.tsx +6 -4
- package/src/components/hover-card/hover-card.meta.md +20 -9
- package/src/components/hover-card/hover-card.stories.tsx +34 -5
- 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 +9 -4
- package/src/components/image/image.stories.tsx +3 -3
- package/src/components/image/image.tsx +6 -4
- package/src/components/input/demo/basic.tsx +12 -0
- package/src/components/input/demo/clearable.tsx +21 -0
- package/src/components/input/demo/show-count.tsx +18 -0
- package/src/components/input/demo/sizes.tsx +15 -0
- package/src/components/input/input.meta.md +39 -33
- package/src/components/input/input.stories.tsx +62 -35
- package/src/components/input/input.tsx +97 -98
- package/src/components/input-group/input-group.meta.md +54 -22
- package/src/components/input-group/input-group.stories.tsx +49 -16
- package/src/components/input-group/input-group.tsx +44 -8
- package/src/components/input-number/input-number.meta.md +64 -7
- package/src/components/input-number/input-number.stories.tsx +46 -8
- package/src/components/input-number/input-number.tsx +99 -26
- package/src/components/input-otp/input-otp.meta.md +4 -3
- 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 -3
- package/src/components/item/item.stories.tsx +8 -5
- package/src/components/item/item.tsx +7 -6
- package/src/components/kbd/kbd.meta.md +13 -4
- package/src/components/kbd/kbd.stories.tsx +4 -4
- package/src/components/kbd/kbd.tsx +10 -5
- package/src/components/label/label.meta.md +18 -10
- 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 -3
- package/src/components/masonry/masonry.stories.tsx +7 -5
- package/src/components/masonry/masonry.tsx +1 -0
- package/src/components/mentions/mentions.meta.md +36 -6
- package/src/components/mentions/mentions.stories.tsx +120 -6
- package/src/components/mentions/mentions.tsx +11 -5
- package/src/components/menubar/menubar.meta.md +30 -12
- package/src/components/menubar/menubar.stories.tsx +62 -2
- package/src/components/menubar/menubar.tsx +9 -9
- package/src/components/native-select/native-select.meta.md +8 -3
- package/src/components/native-select/native-select.stories.tsx +8 -5
- package/src/components/native-select/native-select.tsx +1 -1
- package/src/components/navigation-menu/navigation-menu.meta.md +19 -9
- package/src/components/navigation-menu/navigation-menu.stories.tsx +112 -9
- package/src/components/navigation-menu/navigation-menu.tsx +8 -4
- package/src/components/notification/notification.meta.md +52 -10
- package/src/components/notification/notification.stories.tsx +11 -9
- package/src/components/notification/notification.tsx +36 -21
- 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 +140 -37
- package/src/components/pagination/pagination.stories.tsx +232 -10
- package/src/components/pagination/pagination.tsx +355 -63
- package/src/components/popconfirm/popconfirm.meta.md +9 -4
- package/src/components/popconfirm/popconfirm.stories.tsx +3 -4
- package/src/components/popconfirm/popconfirm.tsx +2 -2
- package/src/components/popover/popover.meta.md +62 -5
- package/src/components/popover/popover.stories.tsx +83 -7
- package/src/components/popover/popover.tsx +77 -28
- package/src/components/progress/progress.meta.md +38 -6
- package/src/components/progress/progress.stories.tsx +3 -3
- package/src/components/progress/progress.tsx +24 -16
- package/src/components/radio-group/radio-group.meta.md +79 -7
- package/src/components/radio-group/radio-group.stories.tsx +39 -3
- package/src/components/radio-group/radio-group.tsx +149 -18
- package/src/components/rate/rate.meta.md +35 -4
- package/src/components/rate/rate.stories.tsx +13 -5
- package/src/components/rate/rate.tsx +37 -10
- package/src/components/resizable/resizable.meta.md +7 -4
- package/src/components/resizable/resizable.stories.tsx +6 -6
- package/src/components/resizable/resizable.tsx +1 -1
- package/src/components/result/result.meta.md +7 -2
- package/src/components/result/result.stories.tsx +4 -8
- package/src/components/result/result.tsx +24 -15
- package/src/components/scroll-area/scroll-area.meta.md +4 -3
- package/src/components/scroll-area/scroll-area.stories.tsx +12 -4
- package/src/components/scroll-area/scroll-area.tsx +3 -3
- package/src/components/segmented/segmented.meta.md +7 -4
- package/src/components/segmented/segmented.stories.tsx +37 -8
- package/src/components/segmented/segmented.tsx +15 -7
- package/src/components/select/select.meta.md +197 -52
- package/src/components/select/select.stories.tsx +238 -63
- package/src/components/select/select.tsx +718 -171
- package/src/components/separator/separator.meta.md +4 -3
- package/src/components/separator/separator.stories.tsx +3 -3
- package/src/components/separator/separator.tsx +3 -7
- package/src/components/sheet/sheet.meta.md +32 -16
- package/src/components/sheet/sheet.stories.tsx +116 -10
- package/src/components/sheet/sheet.tsx +116 -29
- package/src/components/sidebar/sidebar.meta.md +37 -18
- package/src/components/sidebar/sidebar.stories.tsx +701 -29
- package/src/components/sidebar/sidebar.tsx +615 -142
- package/src/components/skeleton/skeleton.meta.md +4 -5
- package/src/components/skeleton/skeleton.stories.tsx +4 -4
- package/src/components/skeleton/skeleton.tsx +7 -7
- package/src/components/slider/slider.meta.md +57 -5
- package/src/components/slider/slider.stories.tsx +58 -6
- package/src/components/slider/slider.tsx +154 -13
- package/src/components/sonner/sonner.meta.md +58 -7
- package/src/components/sonner/sonner.stories.tsx +78 -5
- package/src/components/sonner/sonner.tsx +137 -8
- package/src/components/spinner/spinner.meta.md +62 -13
- package/src/components/spinner/spinner.stories.tsx +66 -14
- package/src/components/spinner/spinner.tsx +111 -9
- package/src/components/statistic/statistic.meta.md +7 -2
- package/src/components/statistic/statistic.stories.tsx +3 -7
- package/src/components/statistic/statistic.tsx +5 -6
- package/src/components/steps/steps.meta.md +18 -4
- package/src/components/steps/steps.stories.tsx +43 -3
- package/src/components/steps/steps.tsx +15 -12
- package/src/components/switch/switch.meta.md +51 -5
- package/src/components/switch/switch.stories.tsx +6 -6
- package/src/components/switch/switch.tsx +109 -41
- package/src/components/table/table.meta.md +17 -6
- package/src/components/table/table.stories.tsx +10 -5
- package/src/components/table/table.tsx +4 -4
- package/src/components/tabs/tabs.meta.md +38 -25
- package/src/components/tabs/tabs.stories.tsx +111 -25
- package/src/components/tabs/tabs.tsx +125 -54
- package/src/components/tag/tag.meta.md +105 -40
- package/src/components/tag/tag.stories.tsx +189 -16
- package/src/components/tag/tag.tsx +222 -21
- package/src/components/textarea/textarea.meta.md +35 -19
- package/src/components/textarea/textarea.stories.tsx +32 -6
- package/src/components/textarea/textarea.tsx +33 -9
- package/src/components/time-picker/time-picker.meta.md +124 -32
- package/src/components/time-picker/time-picker.stories.tsx +85 -15
- package/src/components/time-picker/time-picker.tsx +913 -61
- package/src/components/timeline/timeline.meta.md +14 -6
- package/src/components/timeline/timeline.stories.tsx +37 -7
- package/src/components/timeline/timeline.tsx +35 -14
- package/src/components/toggle/toggle.meta.md +5 -4
- 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 +5 -4
- 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 +55 -5
- package/src/components/tooltip/tooltip.stories.tsx +42 -5
- package/src/components/tooltip/tooltip.tsx +81 -21
- package/src/components/tour/tour.meta.md +9 -4
- package/src/components/tour/tour.stories.tsx +3 -3
- package/src/components/tour/tour.tsx +4 -4
- package/src/components/transfer/transfer.meta.md +11 -6
- package/src/components/transfer/transfer.stories.tsx +4 -8
- package/src/components/transfer/transfer.tsx +28 -21
- package/src/components/tree/tree.meta.md +63 -5
- package/src/components/tree/tree.stories.tsx +31 -12
- package/src/components/tree/tree.tsx +9 -8
- package/src/components/tree-select/tree-select.meta.md +59 -8
- package/src/components/tree-select/tree-select.stories.tsx +3 -3
- package/src/components/tree-select/tree-select.tsx +42 -7
- package/src/components/typography/typography.meta.md +61 -14
- package/src/components/typography/typography.stories.tsx +12 -11
- package/src/components/typography/typography.tsx +43 -28
- package/src/components/upload/upload.meta.md +49 -4
- package/src/components/upload/upload.stories.tsx +72 -12
- package/src/components/upload/upload.tsx +170 -37
- package/src/components/watermark/watermark.meta.md +7 -2
- package/src/components/watermark/watermark.stories.tsx +101 -9
- package/src/components/watermark/watermark.tsx +1 -0
- 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 -92
- package/src/components/button-group/button-group.stories.tsx +0 -90
- package/src/components/button-group/button-group.tsx +0 -75
- package/src/components/combobox/combobox.meta.md +0 -93
- package/src/components/combobox/combobox.stories.tsx +0 -55
- package/src/components/combobox/combobox.tsx +0 -130
- package/src/components/space/space.meta.md +0 -94
- package/src/components/space/space.stories.tsx +0 -94
- package/src/components/space/space.tsx +0 -106
|
@@ -1,38 +1,78 @@
|
|
|
1
1
|
---
|
|
2
2
|
id: time-picker
|
|
3
3
|
name: TimePicker
|
|
4
|
+
displayName: 时间选择
|
|
4
5
|
type: component
|
|
5
|
-
category:
|
|
6
|
+
category: data-entry
|
|
6
7
|
since: 0.1.0
|
|
7
|
-
package:
|
|
8
|
+
package: '@teamix-evo/ui'
|
|
8
9
|
---
|
|
9
10
|
|
|
10
|
-
# TimePicker
|
|
11
|
+
# TimePicker 时间选择
|
|
11
12
|
|
|
12
|
-
时间选择 —
|
|
13
|
+
时间选择 — 输入框 + 滚动列面板。提供两种形态:
|
|
14
|
+
|
|
15
|
+
- `<TimePicker />` — 单值(对应 antd `TimePicker`)
|
|
16
|
+
- `<TimeRangePicker />` — 范围(对应 antd `TimePicker.RangePicker`)
|
|
17
|
+
|
|
18
|
+
内核为 Radix Popover + 自研 `TimeColumn` 滚动列(每列单独滚动、点选高亮、自动 scroll into view),完全替换原 `<input type="time">` 实现以贴合 OpenTrek 设计语言。
|
|
13
19
|
|
|
14
20
|
## When to use
|
|
15
21
|
|
|
16
|
-
-
|
|
17
|
-
-
|
|
22
|
+
- 表单需要时分(可选秒)精确输入(会议预约、闹钟、营业时间)
|
|
23
|
+
- 需要时间区间(开始-结束)→ 用 `TimeRangePicker`
|
|
24
|
+
- 配 `DatePicker` 的 `showTime` 完成日期 + 时间填写
|
|
18
25
|
|
|
19
26
|
## When NOT to use
|
|
20
27
|
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
|
|
28
|
+
- 仅需日期 → `DatePicker`(纯日期模式)
|
|
29
|
+
- 不需要面板交互、SSR safe 优先、移动端原生体验 → 直接用原生 `<input type="time">`
|
|
30
|
+
|
|
31
|
+
## Props
|
|
32
|
+
|
|
33
|
+
> 以下表格由 `pnpm --filter @teamix-evo/ui gen:meta` 自动生成。
|
|
24
34
|
|
|
25
35
|
<!-- auto:props:begin -->
|
|
26
36
|
| 名称 | 类型 | 默认值 | 必填 | 说明 |
|
|
27
37
|
| --- | --- | --- | --- | --- |
|
|
28
|
-
| `value` | `string` | – | – | 受控值(`
|
|
29
|
-
| `defaultValue` | `string` | – | – |
|
|
30
|
-
| `onChange` | `(value: string) => void` | – | – | 值变化回调(
|
|
31
|
-
| `
|
|
32
|
-
| `
|
|
33
|
-
| `
|
|
38
|
+
| `value` | `string` | – | – | 受控值(由 `format` 决定字面)。空串表示未选。 |
|
|
39
|
+
| `defaultValue` | `string` | – | – | 非受控初值。 |
|
|
40
|
+
| `onChange` | `(value: string) => void` | – | – | 值变化回调(选中或清除时触发)。 |
|
|
41
|
+
| `format` | `string` | `"HH:mm:ss"` | – | 时间格式(date-fns / antd 风格 token):支持 `HH/H/mm/m/ss/s`。 不含 `s` token 时不渲染秒列。 |
|
|
42
|
+
| `hourStep` | `number` | `1` | – | 小时步长(antd 并集)。 |
|
|
43
|
+
| `minuteStep` | `number` | `1` | – | 分钟步长。 |
|
|
44
|
+
| `secondStep` | `number` | `1` | – | 秒步长。 |
|
|
45
|
+
| `disabledHours` | `() => number[]` | – | – | 禁用小时回调,返回禁用的小时数组。 |
|
|
46
|
+
| `disabledMinutes` | `(hour: number) => number[]` | – | – | 禁用分钟回调,接收当前选中小时。 |
|
|
47
|
+
| `disabledSeconds` | `(hour: number, minute: number) => number[]` | – | – | 禁用秒回调,接收当前选中小时/分钟。 |
|
|
48
|
+
| `placeholder` | `string` | `"请选择时间"` | – | 占位文本。 |
|
|
49
|
+
| `disabled` | `boolean` | – | – | 是否禁用。 |
|
|
50
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `"md"` | – | 触发器尺寸(对齐 Input)。 |
|
|
51
|
+
| `error` | `boolean` | `false` | – | 错误态(同时设置 `aria-invalid`)。 |
|
|
52
|
+
| `hasClear` | `boolean` | `true` | – | 显示清除按钮(antd `allowClear` 并集)。有值时显示 X,空值还原为时钟 icon。 |
|
|
53
|
+
| `className` | `string` | – | – | 触发器 className。 |
|
|
54
|
+
| `id` | `string` | – | – | 触发器 id(用于 label htmlFor)。 |
|
|
55
|
+
| `status` | `'default' \| 'error' \| 'warning'` | `"default"` | – | 校验状态(对齐 antd `status`)— `'error'` / `'warning'` / `'default'`。 与 `error` 并存时,`status='error'` 优先。 |
|
|
56
|
+
| `open` | `boolean` | – | – | 受控弹层显隐(对齐 antd `open`)。 业务侧需要"程序化打开 / 关闭"时使用;不传则组件内部自管。 |
|
|
57
|
+
| `onOpenChange` | `(open: boolean) => void` | – | – | 弹层显隐变化回调。 |
|
|
58
|
+
| `inputReadOnly` | `boolean` | `false` | – | 输入框只读 — 仅能通过点击弹层选择,不能直接键入(对齐 antd `inputReadOnly`)。 |
|
|
34
59
|
<!-- auto:props:end -->
|
|
35
60
|
|
|
61
|
+
## TimeRangePicker Props
|
|
62
|
+
|
|
63
|
+
`TimeRangePicker` 共享 `TimePicker` 的所有 prop(format / hourStep / minuteStep / secondStep / disabledHours / disabledMinutes / disabledSeconds / size / disabled / error / clearable / className / id),并增加:
|
|
64
|
+
|
|
65
|
+
| 名称 | 类型 | 默认值 | 必填 | 说明 |
|
|
66
|
+
| -------------- | ----------------------------------- | ----------------------------- | ---- | -------------------------------------------- |
|
|
67
|
+
| `value` | `[string, string]` | – | – | 受控值(`[起始, 结束]`)。空串表示对应端未选。 |
|
|
68
|
+
| `defaultValue` | `[string, string]` | – | – | 非受控初值。 |
|
|
69
|
+
| `onChange` | `(value: [string, string]) => void` | – | – | 值变化回调(点击「确定」时触发)。 |
|
|
70
|
+
| `placeholders` | `[string, string]` | `["请选择时间","请选择时间"]` | – | 起始 / 结束占位文本。 |
|
|
71
|
+
|
|
72
|
+
## 依赖
|
|
73
|
+
|
|
74
|
+
> 以下表格由 `pnpm --filter @teamix-evo/ui gen:meta` 自动生成。
|
|
75
|
+
|
|
36
76
|
<!-- auto:deps:begin -->
|
|
37
77
|
### 同库依赖
|
|
38
78
|
|
|
@@ -41,6 +81,8 @@ package: "@teamix-evo/ui"
|
|
|
41
81
|
| Entry | 类型 | 描述 |
|
|
42
82
|
| --- | --- | --- |
|
|
43
83
|
| `cn` | util | Tailwind className 合并工具(clsx + tailwind-merge) |
|
|
84
|
+
| `popover` | component | 可交互浮层 — Radix Popover + antd arrow 并集,使用 showArrow 控制尖角(与 Tooltip / HoverCard 命名统一) |
|
|
85
|
+
| `button` | component | 通用按钮 — shadcn 实现 + cloud-design 能力并集(loading / icon / shape / block / dashed variant / color 语义双 prop / disabledTooltip)。同文件合一导出 ButtonGroup + ButtonGroupText(等价 antd Space.Compact + cd SplitButton)。 |
|
|
44
86
|
|
|
45
87
|
### npm 依赖
|
|
46
88
|
|
|
@@ -53,31 +95,81 @@ pnpm add lucide-react@^0.460.0
|
|
|
53
95
|
|
|
54
96
|
## AI 生成纪律
|
|
55
97
|
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
- **`
|
|
59
|
-
-
|
|
60
|
-
-
|
|
98
|
+
- **`format` 决定列的显隐**:有 `s/ss` 才显示秒列,没有 `m/mm` 时不显示分钟列。**默认 "HH:mm:ss"** —— 单纯需要时分用 `format="HH:mm"`,**不要**为了"隐藏秒"而魔改样式
|
|
99
|
+
- **value 必须能被 `parseTime` 解析**:格式宽松,按非数字切分;但**强烈建议**与 `format` 保持一致,避免来回 round-trip 时丢失字段
|
|
100
|
+
- **`hourStep` / `minuteStep` / `secondStep` 是渲染步长**:仅决定可选项粒度,**不会**自动把已有值往档位上对齐(由消费方负责)
|
|
101
|
+
- **`disabledHours` / `disabledMinutes` / `disabledSeconds` 是高阶函数**:`disabledMinutes(hour)` 接收当前选中小时;切换小时后自动重新计算可选分钟。**不要**手动写 useState 维护可选集
|
|
102
|
+
- **空状态用空字符串** `""`,不要传 `null` / `undefined`(受控模式时类型即不允许)
|
|
103
|
+
- **Range 模式点「确定」才触发 `onChange`**:面板内的滚动调整只更新内部 draft;关闭面板等价于"取消"
|
|
104
|
+
- **`error` 是布尔开关**(对齐 Input);消费方可以直接 `aria-invalid` 也能达到同效果
|
|
105
|
+
- **`clearable` 仅在有值时显示**:点击清除会触发 `onChange('')` / `onChange(['', ''])`
|
|
61
106
|
|
|
62
107
|
## Examples
|
|
63
108
|
|
|
64
109
|
```tsx
|
|
65
|
-
import { TimePicker } from '@/components/ui/time-picker';
|
|
110
|
+
import { TimePicker, TimeRangePicker } from '@/components/ui/time-picker';
|
|
66
111
|
import * as React from 'react';
|
|
67
112
|
|
|
68
|
-
// 基础(HH:mm)
|
|
69
|
-
<TimePicker defaultValue="09:30" />
|
|
113
|
+
// 基础(默认 HH:mm:ss)
|
|
114
|
+
<TimePicker defaultValue="09:30:00" />
|
|
70
115
|
|
|
71
|
-
// 受控 +
|
|
116
|
+
// 受控 + 可清除
|
|
72
117
|
const [t, setT] = React.useState('09:30:00');
|
|
73
|
-
<TimePicker value={t} onChange={setT}
|
|
118
|
+
<TimePicker value={t} onChange={setT} clearable />
|
|
119
|
+
|
|
120
|
+
// 只显示时:分
|
|
121
|
+
<TimePicker format="HH:mm" defaultValue="09:30" />
|
|
122
|
+
|
|
123
|
+
// 5 分钟一档,禁用工作时间外
|
|
124
|
+
<TimePicker
|
|
125
|
+
minuteStep={5}
|
|
126
|
+
disabledHours={() => [0, 1, 2, 3, 4, 5, 6, 7, 8, 19, 20, 21, 22, 23]}
|
|
127
|
+
/>
|
|
128
|
+
|
|
129
|
+
// 错误态
|
|
130
|
+
<TimePicker error defaultValue="09:00:00" />
|
|
74
131
|
|
|
75
|
-
//
|
|
76
|
-
|
|
132
|
+
// 范围
|
|
133
|
+
const [r, setR] = React.useState<[string, string]>(['09:00', '18:00']);
|
|
134
|
+
<TimeRangePicker value={r} onChange={setR} format="HH:mm" clearable />
|
|
77
135
|
|
|
78
|
-
// 与 DatePicker 配对
|
|
79
|
-
<
|
|
80
|
-
<DatePicker />
|
|
81
|
-
<TimePicker />
|
|
82
|
-
</div>
|
|
136
|
+
// 与 DatePicker.showTime 配对(走 DatePicker)
|
|
137
|
+
<DatePicker showTime />
|
|
83
138
|
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## TimePicker 形态 — 旧库 API → 新映射
|
|
143
|
+
|
|
144
|
+
> 旧库 `TimePicker2`(hybridcloud) → 新库 `TimePicker` + `TimeRangePicker`(独立导出)。
|
|
145
|
+
> 新库值类型为 `string`(如 `"09:30:00"`),不依赖 moment / dayjs。
|
|
146
|
+
|
|
147
|
+
### 命名 & 结构映射
|
|
148
|
+
|
|
149
|
+
| 旧库 | 新库 | 说明 |
|
|
150
|
+
| -------------------------------- | ------------------------------------------- | ------------------------------ |
|
|
151
|
+
| `TimePicker2` | `TimePicker` | 组件名简化 |
|
|
152
|
+
| `TimePicker2.RangePicker` | `TimeRangePicker` | 独立导出(非挂载) |
|
|
153
|
+
| `value` (Dayjs) | `value` (string) | 类型变更,无日期库依赖 |
|
|
154
|
+
| `onChange(Dayjs, string)` | `onChange(string)` | 签名简化,直接返回格式化字符串 |
|
|
155
|
+
| `size: large/medium/small` | `size: 'sm' \| 'md' \| 'lg'` | md = medium |
|
|
156
|
+
| `state="error"` | `error={true}` | 布尔开关(对齐 Input) |
|
|
157
|
+
| `format` (HH:mm:ss) | `format` (HH:mm:ss) | 相同语法 |
|
|
158
|
+
| `disabledHours(i) => bool` | `disabledHours() => number[]` | 返回禁用数组(对齐 antd v5) |
|
|
159
|
+
| `disabledMinutes(h,i) => bool` | `disabledMinutes(hour) => number[]` | 返回禁用数组 |
|
|
160
|
+
| `disabledSeconds(h,m,i) => bool` | `disabledSeconds(hour, minute) => number[]` | 返回禁用数组 |
|
|
161
|
+
| `hasClear` | `hasClear` | 命名保留 |
|
|
162
|
+
| `visible / onVisibleChange` | _(未来 P2)_ | MVP 内部管理 |
|
|
163
|
+
| `ranges` (快捷值) | _(未来 P2: presets)_ | MVP 不含预设 |
|
|
164
|
+
| `label` | 不复刻 | 用外部 FormItem label |
|
|
165
|
+
| `hasBorder` | 不复刻 | className 覆盖 |
|
|
166
|
+
| `isPreview / renderPreview` | 不复刻 | 新库无预览态 |
|
|
167
|
+
|
|
168
|
+
### 迁移 FAQ
|
|
169
|
+
|
|
170
|
+
| 问题 | 回答 |
|
|
171
|
+
| ----------------------- | ---------------------------------------------------------------------------------- |
|
|
172
|
+
| Dayjs → string 怎么转? | `dayjs.format('HH:mm:ss')` 即可;反向 `dayjs(str, 'HH:mm:ss')` |
|
|
173
|
+
| disabledHours 签名差异? | 旧: `(hour) => boolean` 返回单项是否禁用;新: `() => number[]` 返回所有禁用小时数组 |
|
|
174
|
+
| Range 值结构? | 旧: `[Dayjs, Dayjs]` → 新: `[string, string]`,如 `['09:00', '18:00']` |
|
|
175
|
+
| 只要时分怎么办? | `format="HH:mm"`,自动隐藏秒列 |
|
|
@@ -1,32 +1,42 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
-
import { TimePicker } from './time-picker';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
|
+
import { TimePicker, TimeRangePicker } from './time-picker';
|
|
4
4
|
|
|
5
5
|
const meta: Meta<typeof TimePicker> = {
|
|
6
|
-
title: '
|
|
6
|
+
title: '数据录入 · Data Entry/TimePicker',
|
|
7
7
|
component: TimePicker,
|
|
8
8
|
tags: ['autodocs'],
|
|
9
9
|
parameters: {
|
|
10
10
|
docs: {
|
|
11
11
|
description: {
|
|
12
12
|
component:
|
|
13
|
-
'时间选择
|
|
13
|
+
'TimePicker 时间选择 —— 选择一个时间点或一段时间区间。Radix Popover 容器 + 自研 TimeColumn 滚动列(对齐 antd `TimePicker` / `TimePicker.RangePicker`,shadcn 未提供原子,本组件做并集补足):关键 prop 包括 `format` / `hourStep` / `minuteStep` / `secondStep` / `disabledHours` / `disabledMinutes` / `disabledSeconds` / `hasClear` / `size` / `error`。视觉走 OpenTrek semantic tokens,所有样式来自 `@teamix-evo/tokens`,无 mock。',
|
|
14
14
|
},
|
|
15
15
|
},
|
|
16
16
|
},
|
|
17
17
|
argTypes: {
|
|
18
|
-
size: { control: 'inline-radio', options: ['sm', '
|
|
19
|
-
|
|
18
|
+
size: { control: 'inline-radio', options: ['sm', 'md', 'lg'] },
|
|
19
|
+
format: { control: 'text' },
|
|
20
20
|
disabled: { control: 'boolean' },
|
|
21
|
+
hasClear: { control: 'boolean' },
|
|
22
|
+
error: { control: 'boolean' },
|
|
23
|
+
placeholder: { control: 'text' },
|
|
24
|
+
},
|
|
25
|
+
args: {
|
|
26
|
+
size: 'md',
|
|
27
|
+
format: 'HH:mm:ss',
|
|
28
|
+
disabled: false,
|
|
29
|
+
hasClear: true,
|
|
30
|
+
error: false,
|
|
31
|
+
placeholder: '请选择时间',
|
|
21
32
|
},
|
|
22
|
-
args: { size: 'default', showSeconds: false, disabled: false },
|
|
23
33
|
};
|
|
24
34
|
|
|
25
35
|
export default meta;
|
|
26
36
|
type Story = StoryObj<typeof TimePicker>;
|
|
27
37
|
|
|
28
38
|
export const Playground: Story = {
|
|
29
|
-
render: (args) => <TimePicker {...args} defaultValue="09:30" />,
|
|
39
|
+
render: (args) => <TimePicker {...args} defaultValue="09:30:00" />,
|
|
30
40
|
};
|
|
31
41
|
|
|
32
42
|
export const Controlled: Story = {
|
|
@@ -35,25 +45,85 @@ export const Controlled: Story = {
|
|
|
35
45
|
const [t, setT] = React.useState('09:30:00');
|
|
36
46
|
return (
|
|
37
47
|
<div className="flex items-center gap-3">
|
|
38
|
-
<TimePicker value={t} onChange={setT}
|
|
39
|
-
<span className="text-sm text-muted-foreground tabular-nums">
|
|
48
|
+
<TimePicker value={t} onChange={setT} />
|
|
49
|
+
<span className="text-sm text-muted-foreground tabular-nums">
|
|
50
|
+
{t || '(空)'}
|
|
51
|
+
</span>
|
|
40
52
|
</div>
|
|
41
53
|
);
|
|
42
54
|
},
|
|
43
55
|
};
|
|
44
56
|
|
|
45
|
-
export const
|
|
57
|
+
export const HourMinute: Story = {
|
|
58
|
+
name: '只显示时:分',
|
|
59
|
+
parameters: { controls: { disable: true } },
|
|
60
|
+
render: () => <TimePicker format="HH:mm" defaultValue="09:30" />,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export const StepFiveMinutes: Story = {
|
|
64
|
+
name: '5 分钟一档',
|
|
46
65
|
parameters: { controls: { disable: true } },
|
|
47
|
-
render: () =>
|
|
66
|
+
render: () => (
|
|
67
|
+
<TimePicker minuteStep={5} secondStep={10} defaultValue="10:00:00" />
|
|
68
|
+
),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export const DisabledHours: Story = {
|
|
72
|
+
name: '禁用工作时间外',
|
|
73
|
+
parameters: { controls: { disable: true } },
|
|
74
|
+
render: () => (
|
|
75
|
+
<TimePicker
|
|
76
|
+
defaultValue="09:00:00"
|
|
77
|
+
disabledHours={() => [
|
|
78
|
+
...Array.from({ length: 9 }, (_, i) => i), // 0-8
|
|
79
|
+
...Array.from({ length: 5 }, (_, i) => 19 + i), // 19-23
|
|
80
|
+
]}
|
|
81
|
+
/>
|
|
82
|
+
),
|
|
48
83
|
};
|
|
49
84
|
|
|
50
85
|
export const Sizes: Story = {
|
|
51
86
|
parameters: { controls: { disable: true } },
|
|
52
87
|
render: () => (
|
|
53
88
|
<div className="flex items-center gap-3">
|
|
54
|
-
<TimePicker size="sm" defaultValue="09:00" />
|
|
55
|
-
<TimePicker size="
|
|
56
|
-
<TimePicker size="lg" defaultValue="09:00" />
|
|
89
|
+
<TimePicker size="sm" defaultValue="09:00:00" />
|
|
90
|
+
<TimePicker size="md" defaultValue="09:00:00" />
|
|
91
|
+
<TimePicker size="lg" defaultValue="09:00:00" />
|
|
57
92
|
</div>
|
|
58
93
|
),
|
|
59
94
|
};
|
|
95
|
+
|
|
96
|
+
export const Disabled: Story = {
|
|
97
|
+
parameters: { controls: { disable: true } },
|
|
98
|
+
render: () => <TimePicker disabled defaultValue="09:00:00" />,
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export const ErrorState: Story = {
|
|
102
|
+
name: '错误态',
|
|
103
|
+
parameters: { controls: { disable: true } },
|
|
104
|
+
render: () => <TimePicker error defaultValue="09:00:00" />,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export const RangePlayground: StoryObj<typeof TimeRangePicker> = {
|
|
108
|
+
name: 'Range / 范围选择',
|
|
109
|
+
parameters: { controls: { disable: true } },
|
|
110
|
+
render: () => {
|
|
111
|
+
const [r, setR] = React.useState<[string, string]>(['', '']);
|
|
112
|
+
return (
|
|
113
|
+
<div className="flex flex-col gap-3">
|
|
114
|
+
<TimeRangePicker value={r} onChange={setR} />
|
|
115
|
+
<span className="text-sm text-muted-foreground tabular-nums">
|
|
116
|
+
{r[0] && r[1] ? `${r[0]} ~ ${r[1]}` : '(未选)'}
|
|
117
|
+
</span>
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export const RangeHourMinute: StoryObj<typeof TimeRangePicker> = {
|
|
124
|
+
name: 'Range · 时:分',
|
|
125
|
+
parameters: { controls: { disable: true } },
|
|
126
|
+
render: () => (
|
|
127
|
+
<TimeRangePicker defaultValue={['09:00', '18:00']} format="HH:mm" />
|
|
128
|
+
),
|
|
129
|
+
};
|