@teamix-evo/ui 0.4.0 → 0.5.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 +46 -50
- package/manifest.json +406 -653
- package/package.json +15 -34
- package/src/_design-system/theme-tokens/stories.tsx +1474 -0
- package/src/components/accordion/index.tsx +139 -0
- package/src/components/accordion/meta.md +162 -0
- package/src/components/accordion/stories.tsx +145 -0
- package/src/components/affix/index.tsx +149 -0
- package/src/components/affix/meta.md +23 -0
- package/src/components/affix/stories.tsx +70 -0
- package/src/components/alert/index.tsx +220 -0
- package/src/components/alert/meta.md +133 -0
- package/src/components/alert/stories.tsx +126 -0
- package/src/components/alert-dialog/index.tsx +282 -0
- package/src/components/alert-dialog/meta.md +86 -0
- package/src/components/alert-dialog/stories.tsx +163 -0
- package/src/components/avatar/index.tsx +159 -0
- package/src/components/avatar/meta.md +242 -0
- package/src/components/avatar/stories.tsx +241 -0
- package/src/components/badge/index.tsx +299 -0
- package/src/components/badge/meta.md +237 -0
- package/src/components/badge/stories.tsx +275 -0
- package/src/components/breadcrumb/index.tsx +137 -0
- package/src/components/breadcrumb/meta.md +64 -0
- package/src/components/breadcrumb/stories.tsx +86 -0
- package/src/components/button/index.tsx +202 -0
- package/src/components/button/meta.md +209 -0
- package/src/components/button/stories.tsx +215 -0
- package/src/components/button-group/index.tsx +211 -0
- package/src/components/button-group/meta.md +190 -0
- package/src/components/button-group/stories.tsx +182 -0
- package/src/components/calendar/index.tsx +240 -0
- package/src/components/calendar/meta.md +36 -0
- package/src/components/calendar/stories.tsx +36 -0
- package/src/components/card/index.tsx +262 -0
- package/src/components/card/meta.md +194 -0
- package/src/components/card/stories.tsx +202 -0
- package/src/components/carousel/index.tsx +481 -0
- package/src/components/carousel/meta.md +208 -0
- package/src/components/carousel/stories.tsx +271 -0
- package/src/components/cascader-select/index.tsx +308 -0
- package/src/components/cascader-select/meta.md +28 -0
- package/src/components/cascader-select/stories.tsx +118 -0
- package/src/components/checkbox/index.tsx +208 -0
- package/src/components/checkbox/meta.md +166 -0
- package/src/components/checkbox/stories.tsx +206 -0
- package/src/components/collapsible/index.tsx +72 -0
- package/src/components/collapsible/meta.md +87 -0
- package/src/components/collapsible/stories.tsx +97 -0
- package/src/components/color-picker/index.tsx +677 -0
- package/src/components/color-picker/meta.md +83 -0
- package/src/components/color-picker/stories.tsx +172 -0
- package/src/components/combobox/index.tsx +687 -0
- package/src/components/combobox/meta.md +83 -0
- package/src/components/combobox/stories.tsx +179 -0
- package/src/components/command/index.tsx +238 -0
- package/src/components/command/meta.md +48 -0
- package/src/components/command/stories.tsx +83 -0
- package/src/components/data-table/index.tsx +1537 -0
- package/src/components/data-table/meta.md +107 -0
- package/src/components/data-table/stories.tsx +1234 -0
- package/src/components/date-picker/index.tsx +1492 -0
- package/src/components/date-picker/meta.md +103 -0
- package/src/components/date-picker/stories.tsx +125 -0
- package/src/components/descriptions/index.tsx +535 -0
- package/src/components/descriptions/meta.md +104 -0
- package/src/components/descriptions/stories.tsx +389 -0
- package/src/components/dialog/index.tsx +255 -0
- package/src/components/dialog/meta.md +244 -0
- package/src/components/dialog/stories.tsx +330 -0
- package/src/components/dropdown-menu/index.tsx +301 -0
- package/src/components/dropdown-menu/meta.md +93 -0
- package/src/components/dropdown-menu/stories.tsx +124 -0
- package/src/components/empty/index.tsx +431 -0
- package/src/components/empty/meta.md +274 -0
- package/src/components/empty/stories.tsx +278 -0
- package/src/components/field/index.tsx +374 -0
- package/src/components/field/meta.md +283 -0
- package/src/components/field/stories.tsx +327 -0
- package/src/components/filter-bar/index.tsx +976 -0
- package/src/components/filter-bar/meta.md +57 -0
- package/src/components/filter-bar/stories.tsx +496 -0
- package/src/components/float-button/index.tsx +163 -0
- package/src/components/float-button/meta.md +73 -0
- package/src/components/float-button/stories.tsx +68 -0
- package/src/components/form/index.tsx +218 -0
- package/src/components/form/meta.md +16 -0
- package/src/components/form/stories.tsx +301 -0
- package/src/components/hover-card/index.tsx +103 -0
- package/src/components/hover-card/meta.md +71 -0
- package/src/components/hover-card/stories.tsx +107 -0
- package/src/components/icon/index.tsx +225 -0
- package/src/components/icon/meta.md +102 -0
- package/src/components/icon/stories.tsx +127 -0
- package/src/components/image/index.tsx +147 -0
- package/src/components/image/meta.md +55 -0
- package/src/components/image/stories.tsx +48 -0
- package/src/components/input/index.tsx +63 -0
- package/src/components/input/meta.md +57 -0
- package/src/components/input/stories.tsx +66 -0
- package/src/components/input-group/index.tsx +292 -0
- package/src/components/input-group/meta.md +108 -0
- package/src/components/input-group/stories.tsx +258 -0
- package/src/components/input-ip/index.tsx +288 -0
- package/src/components/input-ip/meta.md +48 -0
- package/src/components/input-ip/stories.tsx +69 -0
- package/src/components/input-number/index.tsx +360 -0
- package/src/components/input-number/meta.md +156 -0
- package/src/components/input-number/stories.tsx +187 -0
- package/src/components/item/index.tsx +368 -0
- package/src/components/item/meta.md +395 -0
- package/src/components/item/stories.tsx +432 -0
- package/src/components/label/index.tsx +44 -0
- package/src/components/label/meta.md +68 -0
- package/src/components/label/stories.tsx +64 -0
- package/src/components/mentions/index.tsx +369 -0
- package/src/components/mentions/meta.md +118 -0
- package/src/components/mentions/stories.tsx +153 -0
- package/src/components/menubar/index.tsx +313 -0
- package/src/components/menubar/meta.md +52 -0
- package/src/components/menubar/stories.tsx +99 -0
- package/src/components/navigation-menu/index.tsx +216 -0
- package/src/components/navigation-menu/meta.md +66 -0
- package/src/components/navigation-menu/stories.tsx +137 -0
- package/src/components/page-header/index.tsx +218 -0
- package/src/components/page-header/meta.md +211 -0
- package/src/components/page-header/stories.tsx +290 -0
- package/src/components/page-shell/index.tsx +119 -0
- package/src/components/page-shell/meta.md +115 -0
- package/src/components/page-shell/stories.tsx +154 -0
- package/src/components/pagination/index.tsx +580 -0
- package/src/components/pagination/meta.md +39 -0
- package/src/components/pagination/stories.tsx +319 -0
- package/src/components/popconfirm/index.tsx +477 -0
- package/src/components/popconfirm/meta.md +164 -0
- package/src/components/popconfirm/stories.tsx +231 -0
- package/src/components/popover/index.tsx +181 -0
- package/src/components/popover/meta.md +97 -0
- package/src/components/popover/stories.tsx +169 -0
- package/src/components/progress/index.tsx +176 -0
- package/src/components/progress/meta.md +95 -0
- package/src/components/progress/stories.tsx +115 -0
- package/src/components/radio-group/index.tsx +78 -0
- package/src/components/radio-group/meta.md +137 -0
- package/src/components/radio-group/stories.tsx +285 -0
- package/src/components/rate/index.tsx +284 -0
- package/src/components/rate/meta.md +63 -0
- package/src/components/rate/stories.tsx +107 -0
- package/src/components/resizable/index.tsx +122 -0
- package/src/components/resizable/meta.md +142 -0
- package/src/components/resizable/stories.tsx +105 -0
- package/src/components/scroll-area/index.tsx +83 -0
- package/src/components/scroll-area/meta.md +85 -0
- package/src/components/scroll-area/stories.tsx +82 -0
- package/src/components/select/index.tsx +325 -0
- package/src/components/select/meta.md +183 -0
- package/src/components/select/stories.tsx +210 -0
- package/src/components/separator/index.tsx +51 -0
- package/src/components/separator/meta.md +68 -0
- package/src/components/separator/stories.tsx +53 -0
- package/src/components/sheet/index.tsx +293 -0
- package/src/components/sheet/meta.md +226 -0
- package/src/components/sheet/stories.tsx +405 -0
- package/src/components/sidebar/index.tsx +715 -0
- package/src/components/sidebar/meta.md +14 -0
- package/src/components/sidebar/{sidebar.stories.tsx → stories.tsx} +250 -330
- package/src/components/skeleton/index.tsx +415 -0
- package/src/components/skeleton/meta.md +210 -0
- package/src/components/skeleton/stories.tsx +197 -0
- package/src/components/slider/index.tsx +222 -0
- package/src/components/slider/meta.md +125 -0
- package/src/components/slider/stories.tsx +109 -0
- package/src/components/sonner/index.tsx +149 -0
- package/src/components/sonner/meta.md +156 -0
- package/src/components/sonner/stories.tsx +285 -0
- package/src/components/spinner/index.tsx +335 -0
- package/src/components/spinner/meta.md +172 -0
- package/src/components/spinner/stories.tsx +197 -0
- package/src/components/statistic/{statistic.tsx → index.tsx} +25 -26
- package/src/components/statistic/meta.md +94 -0
- package/src/components/statistic/stories.tsx +85 -0
- package/src/components/steps/index.tsx +500 -0
- package/src/components/steps/meta.md +245 -0
- package/src/components/steps/stories.tsx +287 -0
- package/src/components/switch/index.tsx +175 -0
- package/src/components/switch/meta.md +107 -0
- package/src/components/switch/stories.tsx +154 -0
- package/src/components/table/index.tsx +350 -0
- package/src/components/table/meta.md +148 -0
- package/src/components/table/stories.tsx +189 -0
- package/src/components/tabs/index.tsx +379 -0
- package/src/components/tabs/meta.md +244 -0
- package/src/components/tabs/stories.tsx +312 -0
- package/src/components/tag/index.tsx +774 -0
- package/src/components/tag/meta.md +256 -0
- package/src/components/tag/stories.tsx +431 -0
- package/src/components/textarea/index.tsx +62 -0
- package/src/components/textarea/meta.md +77 -0
- package/src/components/textarea/stories.tsx +112 -0
- package/src/components/time-picker/index.tsx +887 -0
- package/src/components/time-picker/meta.md +102 -0
- package/src/components/time-picker/stories.tsx +125 -0
- package/src/components/timeline/index.tsx +422 -0
- package/src/components/timeline/meta.md +352 -0
- package/src/components/timeline/stories.tsx +369 -0
- package/src/components/toggle/index.tsx +74 -0
- package/src/components/toggle/meta.md +76 -0
- package/src/components/toggle/stories.tsx +66 -0
- package/src/components/toggle-group/index.tsx +167 -0
- package/src/components/toggle-group/meta.md +141 -0
- package/src/components/toggle-group/stories.tsx +124 -0
- package/src/components/tooltip/index.tsx +144 -0
- package/src/components/tooltip/meta.md +186 -0
- package/src/components/tooltip/stories.tsx +212 -0
- package/src/components/transfer/index.tsx +639 -0
- package/src/components/transfer/meta.md +76 -0
- package/src/components/transfer/stories.tsx +221 -0
- package/src/components/tree/index.tsx +764 -0
- package/src/components/tree/meta.md +96 -0
- package/src/components/tree/stories.tsx +385 -0
- package/src/components/tree/utils.ts +269 -0
- package/src/components/tree-select/index.tsx +400 -0
- package/src/components/tree-select/meta.md +78 -0
- package/src/components/tree-select/stories.tsx +234 -0
- package/src/components/typography/index.tsx +290 -0
- package/src/components/typography/meta.md +151 -0
- package/src/components/typography/stories.tsx +151 -0
- package/src/components/upload/index.tsx +858 -0
- package/src/components/upload/meta.md +122 -0
- package/src/components/upload/stories.tsx +261 -0
- package/src/components/watermark/index.tsx +152 -0
- package/src/components/watermark/meta.md +67 -0
- package/src/components/watermark/stories.tsx +59 -0
- package/src/hooks/use-mobile.ts +9 -11
- package/src/lib/color.ts +243 -0
- package/src/{utils/cn.ts → lib/utils.ts} +1 -1
- package/src/components/accordion/accordion.meta.md +0 -88
- package/src/components/accordion/accordion.stories.tsx +0 -72
- package/src/components/accordion/accordion.tsx +0 -154
- package/src/components/affix/affix.meta.md +0 -98
- package/src/components/affix/affix.stories.tsx +0 -134
- package/src/components/affix/affix.tsx +0 -167
- package/src/components/alert/alert.meta.md +0 -132
- package/src/components/alert/alert.stories.tsx +0 -138
- package/src/components/alert/alert.tsx +0 -179
- package/src/components/alert-dialog/alert-dialog.meta.md +0 -152
- package/src/components/alert-dialog/alert-dialog.stories.tsx +0 -223
- package/src/components/alert-dialog/alert-dialog.tsx +0 -183
- package/src/components/anchor/anchor.meta.md +0 -92
- package/src/components/anchor/anchor.stories.tsx +0 -74
- package/src/components/anchor/anchor.tsx +0 -130
- package/src/components/app/app.meta.md +0 -91
- package/src/components/app/app.stories.tsx +0 -64
- package/src/components/app/app.tsx +0 -58
- package/src/components/aspect-ratio/aspect-ratio.meta.md +0 -82
- package/src/components/aspect-ratio/aspect-ratio.stories.tsx +0 -59
- package/src/components/aspect-ratio/aspect-ratio.tsx +0 -22
- package/src/components/auto-complete/auto-complete.meta.md +0 -110
- package/src/components/auto-complete/auto-complete.stories.tsx +0 -136
- package/src/components/auto-complete/auto-complete.tsx +0 -253
- package/src/components/avatar/avatar.meta.md +0 -93
- package/src/components/avatar/avatar.stories.tsx +0 -98
- package/src/components/avatar/avatar.tsx +0 -127
- package/src/components/badge/badge.meta.md +0 -120
- package/src/components/badge/badge.stories.tsx +0 -153
- package/src/components/badge/badge.tsx +0 -204
- package/src/components/breadcrumb/breadcrumb.meta.md +0 -127
- package/src/components/breadcrumb/breadcrumb.stories.tsx +0 -207
- package/src/components/breadcrumb/breadcrumb.tsx +0 -136
- package/src/components/button/button.meta.md +0 -335
- package/src/components/button/button.stories.tsx +0 -743
- package/src/components/button/button.tsx +0 -466
- package/src/components/calendar/calendar.meta.md +0 -128
- package/src/components/calendar/calendar.stories.tsx +0 -68
- package/src/components/calendar/calendar.tsx +0 -172
- package/src/components/card/card.meta.md +0 -139
- package/src/components/card/card.stories.tsx +0 -151
- package/src/components/card/card.tsx +0 -306
- package/src/components/carousel/carousel.meta.md +0 -118
- package/src/components/carousel/carousel.stories.tsx +0 -89
- package/src/components/carousel/carousel.tsx +0 -224
- package/src/components/cascader/cascader.meta.md +0 -140
- package/src/components/cascader/cascader.stories.tsx +0 -120
- package/src/components/cascader/cascader.tsx +0 -548
- package/src/components/checkbox/checkbox.meta.md +0 -167
- package/src/components/checkbox/checkbox.stories.tsx +0 -288
- package/src/components/checkbox/checkbox.tsx +0 -195
- package/src/components/collapsible/collapsible.meta.md +0 -88
- package/src/components/collapsible/collapsible.stories.tsx +0 -43
- package/src/components/collapsible/collapsible.tsx +0 -105
- package/src/components/color-picker/color-picker.meta.md +0 -89
- package/src/components/color-picker/color-picker.stories.tsx +0 -159
- package/src/components/color-picker/color-picker.tsx +0 -171
- package/src/components/command/command.meta.md +0 -120
- package/src/components/command/command.stories.tsx +0 -59
- package/src/components/command/command.tsx +0 -158
- package/src/components/context-menu/context-menu.meta.md +0 -93
- package/src/components/context-menu/context-menu.stories.tsx +0 -54
- package/src/components/context-menu/context-menu.tsx +0 -204
- package/src/components/data-table/data-table.meta.md +0 -150
- package/src/components/data-table/data-table.stories.tsx +0 -132
- package/src/components/data-table/data-table.tsx +0 -185
- package/src/components/date-picker/date-picker.meta.md +0 -175
- package/src/components/date-picker/date-picker.stories.tsx +0 -108
- package/src/components/date-picker/date-picker.tsx +0 -1554
- package/src/components/descriptions/descriptions.meta.md +0 -83
- package/src/components/descriptions/descriptions.stories.tsx +0 -60
- package/src/components/descriptions/descriptions.tsx +0 -137
- package/src/components/dialog/dialog.meta.md +0 -168
- package/src/components/dialog/dialog.stories.tsx +0 -255
- package/src/components/dialog/dialog.tsx +0 -180
- package/src/components/dialog/imperative.tsx +0 -252
- package/src/components/drawer/drawer.meta.md +0 -95
- package/src/components/drawer/drawer.stories.tsx +0 -71
- package/src/components/drawer/drawer.tsx +0 -23
- package/src/components/dropdown-menu/dropdown-menu.meta.md +0 -171
- package/src/components/dropdown-menu/dropdown-menu.stories.tsx +0 -198
- package/src/components/dropdown-menu/dropdown-menu.tsx +0 -209
- package/src/components/ellipsis/ellipsis.meta.md +0 -87
- package/src/components/ellipsis/ellipsis.stories.tsx +0 -72
- package/src/components/ellipsis/ellipsis.tsx +0 -153
- package/src/components/empty/empty.meta.md +0 -86
- package/src/components/empty/empty.stories.tsx +0 -46
- package/src/components/empty/empty.tsx +0 -54
- package/src/components/field/field.meta.md +0 -154
- package/src/components/field/field.stories.tsx +0 -497
- package/src/components/field/field.tsx +0 -392
- package/src/components/filter-bar/filter-bar.meta.md +0 -92
- package/src/components/filter-bar/filter-bar.stories.tsx +0 -1086
- package/src/components/filter-bar/filter-bar.tsx +0 -568
- package/src/components/flex/flex.meta.md +0 -142
- package/src/components/flex/flex.stories.tsx +0 -199
- package/src/components/flex/flex.tsx +0 -145
- package/src/components/float-button/float-button.meta.md +0 -92
- package/src/components/float-button/float-button.stories.tsx +0 -80
- package/src/components/float-button/float-button.tsx +0 -143
- package/src/components/form/form.meta.md +0 -153
- package/src/components/form/form.stories.tsx +0 -472
- package/src/components/form/form.tsx +0 -260
- package/src/components/grid/grid.meta.md +0 -92
- package/src/components/grid/grid.stories.tsx +0 -101
- package/src/components/grid/grid.tsx +0 -130
- package/src/components/hover-card/hover-card.meta.md +0 -103
- package/src/components/hover-card/hover-card.stories.tsx +0 -97
- package/src/components/hover-card/hover-card.tsx +0 -67
- package/src/components/icon/DEVELOPMENT.md +0 -809
- package/src/components/icon/icon.meta.md +0 -170
- package/src/components/icon/icon.stories.tsx +0 -344
- package/src/components/icon/icon.tsx +0 -248
- package/src/components/image/image.meta.md +0 -99
- package/src/components/image/image.stories.tsx +0 -55
- package/src/components/image/image.tsx +0 -140
- package/src/components/input/input.meta.md +0 -115
- package/src/components/input/input.stories.tsx +0 -144
- package/src/components/input/input.tsx +0 -212
- package/src/components/input-group/input-group.meta.md +0 -124
- package/src/components/input-group/input-group.stories.tsx +0 -121
- package/src/components/input-group/input-group.tsx +0 -143
- package/src/components/input-number/input-number.meta.md +0 -148
- package/src/components/input-number/input-number.stories.tsx +0 -125
- package/src/components/input-number/input-number.tsx +0 -283
- package/src/components/input-otp/input-otp.meta.md +0 -106
- package/src/components/input-otp/input-otp.stories.tsx +0 -65
- package/src/components/input-otp/input-otp.tsx +0 -97
- package/src/components/item/item.meta.md +0 -121
- package/src/components/item/item.stories.tsx +0 -116
- package/src/components/item/item.tsx +0 -172
- package/src/components/kbd/kbd.meta.md +0 -94
- package/src/components/kbd/kbd.stories.tsx +0 -70
- package/src/components/kbd/kbd.tsx +0 -86
- package/src/components/label/label.meta.md +0 -99
- package/src/components/label/label.stories.tsx +0 -145
- package/src/components/label/label.tsx +0 -138
- package/src/components/masonry/masonry.meta.md +0 -90
- package/src/components/masonry/masonry.stories.tsx +0 -68
- package/src/components/masonry/masonry.tsx +0 -60
- package/src/components/mentions/mentions.meta.md +0 -119
- package/src/components/mentions/mentions.stories.tsx +0 -189
- package/src/components/mentions/mentions.tsx +0 -243
- package/src/components/menubar/menubar.meta.md +0 -118
- package/src/components/menubar/menubar.stories.tsx +0 -141
- package/src/components/menubar/menubar.tsx +0 -232
- package/src/components/native-select/native-select.meta.md +0 -93
- package/src/components/native-select/native-select.stories.tsx +0 -83
- package/src/components/native-select/native-select.tsx +0 -54
- package/src/components/navigation-menu/navigation-menu.meta.md +0 -118
- package/src/components/navigation-menu/navigation-menu.stories.tsx +0 -215
- package/src/components/navigation-menu/navigation-menu.tsx +0 -129
- package/src/components/notification/notification.meta.md +0 -133
- package/src/components/notification/notification.stories.tsx +0 -98
- package/src/components/notification/notification.tsx +0 -99
- package/src/components/page-header/DEVELOPMENT.md +0 -842
- package/src/components/page-header/page-header.meta.md +0 -210
- package/src/components/page-header/page-header.stories.tsx +0 -428
- package/src/components/page-header/page-header.tsx +0 -284
- package/src/components/page-shell/page-shell.meta.md +0 -116
- package/src/components/page-shell/page-shell.stories.tsx +0 -149
- package/src/components/page-shell/page-shell.tsx +0 -115
- package/src/components/pagination/pagination.meta.md +0 -230
- package/src/components/pagination/pagination.stories.tsx +0 -284
- package/src/components/pagination/pagination.tsx +0 -567
- package/src/components/popconfirm/popconfirm.meta.md +0 -114
- package/src/components/popconfirm/popconfirm.stories.tsx +0 -75
- package/src/components/popconfirm/popconfirm.tsx +0 -134
- package/src/components/popover/popover.meta.md +0 -154
- package/src/components/popover/popover.stories.tsx +0 -158
- package/src/components/popover/popover.tsx +0 -104
- package/src/components/progress/progress.meta.md +0 -118
- package/src/components/progress/progress.stories.tsx +0 -75
- package/src/components/progress/progress.tsx +0 -203
- package/src/components/radio-group/radio-group.meta.md +0 -175
- package/src/components/radio-group/radio-group.stories.tsx +0 -113
- package/src/components/radio-group/radio-group.tsx +0 -209
- package/src/components/rate/rate.meta.md +0 -118
- package/src/components/rate/rate.stories.tsx +0 -89
- package/src/components/rate/rate.tsx +0 -180
- package/src/components/resizable/resizable.meta.md +0 -95
- package/src/components/resizable/resizable.stories.tsx +0 -104
- package/src/components/resizable/resizable.tsx +0 -56
- package/src/components/result/result.meta.md +0 -95
- package/src/components/result/result.stories.tsx +0 -67
- package/src/components/result/result.tsx +0 -100
- package/src/components/scroll-area/scroll-area.meta.md +0 -85
- package/src/components/scroll-area/scroll-area.stories.tsx +0 -49
- package/src/components/scroll-area/scroll-area.tsx +0 -51
- package/src/components/segmented/segmented.meta.md +0 -106
- package/src/components/segmented/segmented.stories.tsx +0 -130
- package/src/components/segmented/segmented.tsx +0 -146
- package/src/components/select/select.meta.md +0 -255
- package/src/components/select/select.stories.tsx +0 -275
- package/src/components/select/select.tsx +0 -735
- package/src/components/separator/separator.meta.md +0 -75
- package/src/components/separator/separator.stories.tsx +0 -71
- package/src/components/separator/separator.tsx +0 -100
- package/src/components/sheet/sheet.meta.md +0 -113
- package/src/components/sheet/sheet.stories.tsx +0 -188
- package/src/components/sheet/sheet.tsx +0 -226
- package/src/components/sidebar/sidebar.meta.md +0 -151
- package/src/components/sidebar/sidebar.tsx +0 -853
- package/src/components/skeleton/skeleton.meta.md +0 -94
- package/src/components/skeleton/skeleton.stories.tsx +0 -79
- package/src/components/skeleton/skeleton.tsx +0 -144
- package/src/components/slider/slider.meta.md +0 -146
- package/src/components/slider/slider.stories.tsx +0 -121
- package/src/components/slider/slider.tsx +0 -227
- package/src/components/sonner/sonner.meta.md +0 -147
- package/src/components/sonner/sonner.stories.tsx +0 -164
- package/src/components/sonner/sonner.tsx +0 -169
- package/src/components/spinner/spinner.meta.md +0 -125
- package/src/components/spinner/spinner.stories.tsx +0 -123
- package/src/components/spinner/spinner.tsx +0 -166
- package/src/components/statistic/statistic.meta.md +0 -104
- package/src/components/statistic/statistic.stories.tsx +0 -67
- package/src/components/steps/steps.meta.md +0 -116
- package/src/components/steps/steps.stories.tsx +0 -115
- package/src/components/steps/steps.tsx +0 -173
- package/src/components/switch/switch.meta.md +0 -138
- package/src/components/switch/switch.stories.tsx +0 -75
- package/src/components/switch/switch.tsx +0 -169
- package/src/components/table/table.meta.md +0 -106
- package/src/components/table/table.stories.tsx +0 -80
- package/src/components/table/table.tsx +0 -124
- package/src/components/tabs/tabs.meta.md +0 -111
- package/src/components/tabs/tabs.stories.tsx +0 -156
- package/src/components/tabs/tabs.tsx +0 -190
- package/src/components/tag/tag.meta.md +0 -159
- package/src/components/tag/tag.stories.tsx +0 -250
- package/src/components/tag/tag.tsx +0 -386
- package/src/components/textarea/textarea.meta.md +0 -99
- package/src/components/textarea/textarea.stories.tsx +0 -89
- package/src/components/textarea/textarea.tsx +0 -137
- package/src/components/time-picker/time-picker.meta.md +0 -175
- package/src/components/time-picker/time-picker.stories.tsx +0 -129
- package/src/components/time-picker/time-picker.tsx +0 -946
- package/src/components/timeline/timeline.meta.md +0 -110
- package/src/components/timeline/timeline.stories.tsx +0 -134
- package/src/components/timeline/timeline.tsx +0 -168
- package/src/components/toggle/toggle.meta.md +0 -89
- package/src/components/toggle/toggle.stories.tsx +0 -66
- package/src/components/toggle/toggle.tsx +0 -54
- package/src/components/toggle-group/toggle-group.meta.md +0 -91
- package/src/components/toggle-group/toggle-group.stories.tsx +0 -83
- package/src/components/toggle-group/toggle-group.tsx +0 -78
- package/src/components/tooltip/tooltip.meta.md +0 -149
- package/src/components/tooltip/tooltip.stories.tsx +0 -108
- package/src/components/tooltip/tooltip.tsx +0 -153
- package/src/components/tour/tour.meta.md +0 -121
- package/src/components/tour/tour.stories.tsx +0 -66
- package/src/components/tour/tour.tsx +0 -242
- package/src/components/transfer/transfer.meta.md +0 -95
- package/src/components/transfer/transfer.stories.tsx +0 -64
- package/src/components/transfer/transfer.tsx +0 -258
- package/src/components/tree/tree.meta.md +0 -169
- package/src/components/tree/tree.stories.tsx +0 -128
- package/src/components/tree/tree.tsx +0 -368
- package/src/components/tree-select/tree-select.meta.md +0 -151
- package/src/components/tree-select/tree-select.stories.tsx +0 -80
- package/src/components/tree-select/tree-select.tsx +0 -206
- package/src/components/typography/typography.meta.md +0 -149
- package/src/components/typography/typography.stories.tsx +0 -116
- package/src/components/typography/typography.tsx +0 -260
- package/src/components/upload/upload.meta.md +0 -156
- package/src/components/upload/upload.stories.tsx +0 -135
- package/src/components/upload/upload.tsx +0 -398
- package/src/components/watermark/watermark.meta.md +0 -100
- package/src/components/watermark/watermark.stories.tsx +0 -170
- package/src/components/watermark/watermark.tsx +0 -166
- package/src/hooks/use-breakpoint.ts +0 -117
- package/src/hooks/use-debounce-callback.ts +0 -52
- package/src/stories/theme-tokens.stories.tsx +0 -747
- package/src/utils/trigger-input.ts +0 -57
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
|
|
4
|
+
import { Button } from '@/components/button';
|
|
5
|
+
import {
|
|
6
|
+
Skeleton,
|
|
7
|
+
SkeletonAvatar,
|
|
8
|
+
SkeletonImage,
|
|
9
|
+
SkeletonButton,
|
|
10
|
+
SkeletonInput,
|
|
11
|
+
SkeletonTitle,
|
|
12
|
+
SkeletonParagraph,
|
|
13
|
+
} from './index';
|
|
14
|
+
|
|
15
|
+
const meta: Meta<typeof Skeleton> = {
|
|
16
|
+
title: '反馈 · Feedback/Skeleton 骨架屏',
|
|
17
|
+
component: Skeleton,
|
|
18
|
+
tags: ['autodocs'],
|
|
19
|
+
};
|
|
20
|
+
export default meta;
|
|
21
|
+
|
|
22
|
+
type Story = StoryObj<typeof meta>;
|
|
23
|
+
|
|
24
|
+
/** 基础骨架屏,默认呼吸动画与圆角矩形形态。 */
|
|
25
|
+
export const Default: Story = {
|
|
26
|
+
render: () => <Skeleton className="h-4 w-64" />,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** 四种 variant 形状对照。 */
|
|
30
|
+
export const Variants: Story = {
|
|
31
|
+
render: () => (
|
|
32
|
+
<div className="flex flex-col gap-3">
|
|
33
|
+
<div className="flex items-center gap-3">
|
|
34
|
+
<span className="w-24 text-muted-foreground">text</span>
|
|
35
|
+
<Skeleton variant="text" className="max-w-64" />
|
|
36
|
+
</div>
|
|
37
|
+
<div className="flex items-center gap-3">
|
|
38
|
+
<span className="w-24 text-muted-foreground">rectangular</span>
|
|
39
|
+
<Skeleton variant="rectangular" className="h-4 w-64" />
|
|
40
|
+
</div>
|
|
41
|
+
<div className="flex items-center gap-3">
|
|
42
|
+
<span className="w-24 text-muted-foreground">rounded</span>
|
|
43
|
+
<Skeleton variant="rounded" className="h-4 w-64" />
|
|
44
|
+
</div>
|
|
45
|
+
<div className="flex items-center gap-3">
|
|
46
|
+
<span className="w-24 text-muted-foreground">circular</span>
|
|
47
|
+
<Skeleton variant="circular" className="size-10" />
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/** pulse / none 两种动画对照。 */
|
|
54
|
+
export const Animations: Story = {
|
|
55
|
+
render: () => (
|
|
56
|
+
<div className="flex flex-col gap-3">
|
|
57
|
+
<div className="flex items-center gap-3">
|
|
58
|
+
<span className="w-16 text-muted-foreground">pulse</span>
|
|
59
|
+
<Skeleton animation="pulse" className="h-4 w-64" />
|
|
60
|
+
</div>
|
|
61
|
+
<div className="flex items-center gap-3">
|
|
62
|
+
<span className="w-16 text-muted-foreground">none</span>
|
|
63
|
+
<Skeleton animation="none" className="h-4 w-64" />
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
),
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/** 通过 width / height props 直接传值(数字按 px 解析)。 */
|
|
70
|
+
export const WithDimensions: Story = {
|
|
71
|
+
render: () => (
|
|
72
|
+
<div className="flex flex-col gap-3">
|
|
73
|
+
<Skeleton width={240} height={16} />
|
|
74
|
+
<Skeleton width="50%" height={16} />
|
|
75
|
+
<Skeleton width={120} height={120} variant="circular" />
|
|
76
|
+
</div>
|
|
77
|
+
),
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/** loading + children 条件渲染:loading=false 时直接显示真实内容。 */
|
|
81
|
+
export const Loading: Story = {
|
|
82
|
+
render: () => {
|
|
83
|
+
const [loading, setLoading] = React.useState(true);
|
|
84
|
+
return (
|
|
85
|
+
<div className="flex flex-col gap-3">
|
|
86
|
+
<Button onClick={() => setLoading((v) => !v)}>切换</Button>
|
|
87
|
+
<Skeleton loading={loading} className="h-4 w-64">
|
|
88
|
+
<span className="text-foreground">真实内容已加载</span>
|
|
89
|
+
</Skeleton>
|
|
90
|
+
</div>
|
|
91
|
+
);
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/** 头像骨架:三档尺寸 + 两种形状。 */
|
|
96
|
+
export const Avatar: Story = {
|
|
97
|
+
render: () => (
|
|
98
|
+
<div className="flex flex-col gap-4">
|
|
99
|
+
<div className="flex items-center gap-3">
|
|
100
|
+
<SkeletonAvatar size="sm" />
|
|
101
|
+
<SkeletonAvatar size="default" />
|
|
102
|
+
<SkeletonAvatar size="lg" />
|
|
103
|
+
<SkeletonAvatar size={56} />
|
|
104
|
+
</div>
|
|
105
|
+
<div className="flex items-center gap-3">
|
|
106
|
+
<SkeletonAvatar shape="square" size="sm" />
|
|
107
|
+
<SkeletonAvatar shape="square" size="default" />
|
|
108
|
+
<SkeletonAvatar shape="square" size="lg" />
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
),
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/** 图片骨架:三档尺寸 + block 自适应。 */
|
|
115
|
+
export const Image: Story = {
|
|
116
|
+
render: () => (
|
|
117
|
+
<div className="flex flex-col gap-4">
|
|
118
|
+
<div className="flex items-end gap-3">
|
|
119
|
+
<SkeletonImage size="sm" />
|
|
120
|
+
<SkeletonImage size="default" />
|
|
121
|
+
<SkeletonImage size="lg" />
|
|
122
|
+
</div>
|
|
123
|
+
<SkeletonImage block />
|
|
124
|
+
</div>
|
|
125
|
+
),
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
/** 按钮骨架:四档尺寸 + block。 */
|
|
129
|
+
export const ButtonSkeleton: Story = {
|
|
130
|
+
name: 'Button',
|
|
131
|
+
render: () => (
|
|
132
|
+
<div className="flex flex-col gap-3">
|
|
133
|
+
<div className="flex items-center gap-3">
|
|
134
|
+
<SkeletonButton size="sm" />
|
|
135
|
+
<SkeletonButton size="default" />
|
|
136
|
+
<SkeletonButton size="lg" />
|
|
137
|
+
<SkeletonButton size="icon" />
|
|
138
|
+
</div>
|
|
139
|
+
<SkeletonButton block />
|
|
140
|
+
</div>
|
|
141
|
+
),
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/** 输入框骨架:三档尺寸 + 非 block。 */
|
|
145
|
+
export const Input: Story = {
|
|
146
|
+
render: () => (
|
|
147
|
+
<div className="flex flex-col gap-3">
|
|
148
|
+
<SkeletonInput size="sm" />
|
|
149
|
+
<SkeletonInput size="default" />
|
|
150
|
+
<SkeletonInput size="lg" />
|
|
151
|
+
<SkeletonInput block={false} />
|
|
152
|
+
</div>
|
|
153
|
+
),
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
/** 标题骨架:默认 1/3 容器宽,可自定义 width。 */
|
|
157
|
+
export const Title: Story = {
|
|
158
|
+
render: () => (
|
|
159
|
+
<div className="flex flex-col gap-3">
|
|
160
|
+
<SkeletonTitle />
|
|
161
|
+
<SkeletonTitle width={200} />
|
|
162
|
+
<SkeletonTitle width="60%" />
|
|
163
|
+
</div>
|
|
164
|
+
),
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/** 段落骨架:rows + width 数组逐行覆盖;不传 width 时末行 60% 收窄。 */
|
|
168
|
+
export const Paragraph: Story = {
|
|
169
|
+
render: () => (
|
|
170
|
+
<div className="flex flex-col gap-6">
|
|
171
|
+
<SkeletonParagraph />
|
|
172
|
+
<SkeletonParagraph rows={5} />
|
|
173
|
+
<SkeletonParagraph rows={4} width={['100%', '90%', '80%', '40%']} />
|
|
174
|
+
</div>
|
|
175
|
+
),
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
/** 综合卡片占位:图片 + 头像 + 标题 + 段落。 */
|
|
179
|
+
export const CardComposition: Story = {
|
|
180
|
+
render: () => (
|
|
181
|
+
<div className="flex w-80 flex-col gap-4 rounded-md border border-border bg-card p-4">
|
|
182
|
+
<SkeletonImage block />
|
|
183
|
+
<div className="flex items-center gap-3">
|
|
184
|
+
<SkeletonAvatar />
|
|
185
|
+
<div className="flex flex-1 flex-col gap-2">
|
|
186
|
+
<SkeletonTitle width="50%" />
|
|
187
|
+
<Skeleton className="h-3 w-24" />
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
190
|
+
<SkeletonParagraph rows={3} />
|
|
191
|
+
<div className="flex items-center justify-end gap-2">
|
|
192
|
+
<SkeletonButton size="sm" />
|
|
193
|
+
<SkeletonButton size="sm" />
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
),
|
|
197
|
+
};
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 滑动输入条 Slider
|
|
3
|
+
*
|
|
4
|
+
* 拖拽滑块选择数值或范围,基于 Radix Slider 原语。支持 marks 刻度、tooltip 值提示与 reverse 反向选中。
|
|
5
|
+
*
|
|
6
|
+
* @when
|
|
7
|
+
* - 音量 / 亮度调节
|
|
8
|
+
* - 价格范围筛选
|
|
9
|
+
* - 图片编辑参数调整
|
|
10
|
+
*/
|
|
11
|
+
'use client';
|
|
12
|
+
|
|
13
|
+
import * as React from 'react';
|
|
14
|
+
import { Slider as SliderPrimitive } from 'radix-ui';
|
|
15
|
+
|
|
16
|
+
import { cn } from '@/lib/utils';
|
|
17
|
+
import {
|
|
18
|
+
Tooltip,
|
|
19
|
+
TooltipContent,
|
|
20
|
+
TooltipProvider,
|
|
21
|
+
TooltipTrigger,
|
|
22
|
+
} from '@/components/tooltip';
|
|
23
|
+
|
|
24
|
+
/** marks 入参形态:number 等分 / number[] 枚举 / Record<number, ReactNode> 值-标签映射 */
|
|
25
|
+
export type SliderMarks = number | number[] | Record<number, React.ReactNode>;
|
|
26
|
+
|
|
27
|
+
export interface SliderProps
|
|
28
|
+
extends React.ComponentProps<typeof SliderPrimitive.Root> {
|
|
29
|
+
/** 刻度配置:number=等分数,number[]=枚举值,对象={value: label} */
|
|
30
|
+
marks?: SliderMarks;
|
|
31
|
+
/** 刻度标签位置;horizontal 下=上/下,vertical 下=右/左 */
|
|
32
|
+
marksPosition?: 'above' | 'below';
|
|
33
|
+
/** tooltip 显示策略:auto(hover/active) / always(常驻) / never(隐藏) */
|
|
34
|
+
showTooltip?: 'auto' | 'always' | 'never';
|
|
35
|
+
/** 自定义 tooltip 内容;不传则显示当前数值 */
|
|
36
|
+
tooltipFormatter?: (value: number) => React.ReactNode;
|
|
37
|
+
/** 选中态反转(轨道与已选段颜色翻转) */
|
|
38
|
+
reverse?: boolean;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface ParsedMark {
|
|
42
|
+
value: number;
|
|
43
|
+
label: React.ReactNode;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function parseMarks(
|
|
47
|
+
marks: SliderMarks | undefined,
|
|
48
|
+
min: number,
|
|
49
|
+
max: number,
|
|
50
|
+
): ParsedMark[] {
|
|
51
|
+
if (marks == null) return [];
|
|
52
|
+
if (typeof marks === 'number') {
|
|
53
|
+
if (marks <= 0) return [];
|
|
54
|
+
const step = (max - min) / marks;
|
|
55
|
+
return Array.from({ length: marks + 1 }, (_, i) => {
|
|
56
|
+
const v = min + step * i;
|
|
57
|
+
return { value: v, label: v };
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (Array.isArray(marks)) {
|
|
61
|
+
return marks.map((v) => ({ value: v, label: v }));
|
|
62
|
+
}
|
|
63
|
+
return Object.entries(marks).map(([k, label]) => ({
|
|
64
|
+
value: Number(k),
|
|
65
|
+
label,
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function Slider({
|
|
70
|
+
className,
|
|
71
|
+
defaultValue,
|
|
72
|
+
value,
|
|
73
|
+
min = 0,
|
|
74
|
+
max = 100,
|
|
75
|
+
orientation = 'horizontal',
|
|
76
|
+
marks,
|
|
77
|
+
marksPosition = 'below',
|
|
78
|
+
showTooltip = 'auto',
|
|
79
|
+
tooltipFormatter,
|
|
80
|
+
reverse = false,
|
|
81
|
+
...props
|
|
82
|
+
}: SliderProps) {
|
|
83
|
+
const _values = React.useMemo(
|
|
84
|
+
() =>
|
|
85
|
+
Array.isArray(value)
|
|
86
|
+
? value
|
|
87
|
+
: Array.isArray(defaultValue)
|
|
88
|
+
? defaultValue
|
|
89
|
+
: [min, max],
|
|
90
|
+
[value, defaultValue, min, max],
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
const parsedMarks = React.useMemo(
|
|
94
|
+
() => parseMarks(marks, min, max),
|
|
95
|
+
[marks, min, max],
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
const hasLabels = parsedMarks.some(
|
|
99
|
+
(m) => m.label !== null && m.label !== undefined && m.label !== false,
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const isHorizontal = orientation === 'horizontal';
|
|
103
|
+
|
|
104
|
+
const pctOf = (v: number) => {
|
|
105
|
+
if (max === min) return 0;
|
|
106
|
+
return ((v - min) / (max - min)) * 100;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const markDotStyle = (v: number): React.CSSProperties => {
|
|
110
|
+
const pct = pctOf(v);
|
|
111
|
+
return isHorizontal
|
|
112
|
+
? { left: `${pct}%`, top: '50%', transform: 'translate(-50%, -50%)' }
|
|
113
|
+
: { bottom: `${pct}%`, left: '50%', transform: 'translate(-50%, 50%)' };
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const labelStyle = (v: number): React.CSSProperties => {
|
|
117
|
+
const pct = pctOf(v);
|
|
118
|
+
if (isHorizontal) {
|
|
119
|
+
return marksPosition === 'below'
|
|
120
|
+
? {
|
|
121
|
+
left: `${pct}%`,
|
|
122
|
+
top: '100%',
|
|
123
|
+
marginTop: 8,
|
|
124
|
+
transform: 'translateX(-50%)',
|
|
125
|
+
}
|
|
126
|
+
: {
|
|
127
|
+
left: `${pct}%`,
|
|
128
|
+
bottom: '100%',
|
|
129
|
+
marginBottom: 8,
|
|
130
|
+
transform: 'translateX(-50%)',
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return marksPosition === 'above'
|
|
134
|
+
? {
|
|
135
|
+
bottom: `${pct}%`,
|
|
136
|
+
left: '100%',
|
|
137
|
+
marginLeft: 8,
|
|
138
|
+
transform: 'translateY(50%)',
|
|
139
|
+
}
|
|
140
|
+
: {
|
|
141
|
+
bottom: `${pct}%`,
|
|
142
|
+
right: '100%',
|
|
143
|
+
marginRight: 8,
|
|
144
|
+
transform: 'translateY(50%)',
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
const renderThumb = (val: number, idx: number) => {
|
|
149
|
+
const thumb = (
|
|
150
|
+
<SliderPrimitive.Thumb
|
|
151
|
+
data-slot="slider-thumb"
|
|
152
|
+
className="relative block size-3 shrink-0 cursor-pointer rounded-full border-2 border-primary bg-background shadow-sm ring-ring/50 transition-[color,box-shadow,transform] duration-200 ease-out select-none after:absolute after:-inset-2 hover:scale-125 hover:ring-3 focus-visible:scale-125 focus-visible:ring-3 focus-visible:outline-hidden active:scale-125 active:ring-3 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50"
|
|
153
|
+
/>
|
|
154
|
+
);
|
|
155
|
+
if (showTooltip === 'never') {
|
|
156
|
+
return <React.Fragment key={idx}>{thumb}</React.Fragment>;
|
|
157
|
+
}
|
|
158
|
+
return (
|
|
159
|
+
<Tooltip key={idx} open={showTooltip === 'always' ? true : undefined}>
|
|
160
|
+
<TooltipTrigger asChild>{thumb}</TooltipTrigger>
|
|
161
|
+
<TooltipContent
|
|
162
|
+
data-slot="slider-tooltip"
|
|
163
|
+
side={isHorizontal ? 'top' : 'right'}
|
|
164
|
+
>
|
|
165
|
+
{tooltipFormatter ? tooltipFormatter(val) : val}
|
|
166
|
+
</TooltipContent>
|
|
167
|
+
</Tooltip>
|
|
168
|
+
);
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
return (
|
|
172
|
+
<TooltipProvider delayDuration={0}>
|
|
173
|
+
<SliderPrimitive.Root
|
|
174
|
+
data-slot="slider"
|
|
175
|
+
data-reverse={reverse || undefined}
|
|
176
|
+
defaultValue={defaultValue}
|
|
177
|
+
value={value}
|
|
178
|
+
min={min}
|
|
179
|
+
max={max}
|
|
180
|
+
orientation={orientation}
|
|
181
|
+
className={cn(
|
|
182
|
+
'group/slider relative flex w-full touch-none items-center select-none data-disabled:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-40 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col',
|
|
183
|
+
className,
|
|
184
|
+
)}
|
|
185
|
+
{...props}
|
|
186
|
+
>
|
|
187
|
+
<SliderPrimitive.Track
|
|
188
|
+
data-slot="slider-track"
|
|
189
|
+
className="relative grow overflow-hidden rounded-full bg-muted group-data-[reverse=true]/slider:bg-primary data-[orientation=horizontal]:h-1 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1"
|
|
190
|
+
>
|
|
191
|
+
<SliderPrimitive.Range
|
|
192
|
+
data-slot="slider-range"
|
|
193
|
+
className="absolute bg-primary group-data-[reverse=true]/slider:bg-muted select-none data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full"
|
|
194
|
+
/>
|
|
195
|
+
{parsedMarks.map((m) => (
|
|
196
|
+
<span
|
|
197
|
+
key={`mark-${m.value}`}
|
|
198
|
+
data-slot="slider-mark"
|
|
199
|
+
aria-hidden="true"
|
|
200
|
+
style={markDotStyle(m.value)}
|
|
201
|
+
className="pointer-events-none absolute size-1 rounded-full bg-border"
|
|
202
|
+
/>
|
|
203
|
+
))}
|
|
204
|
+
</SliderPrimitive.Track>
|
|
205
|
+
{_values.map((v, idx) => renderThumb(v, idx))}
|
|
206
|
+
{hasLabels &&
|
|
207
|
+
parsedMarks.map((m) => (
|
|
208
|
+
<span
|
|
209
|
+
key={`label-${m.value}`}
|
|
210
|
+
data-slot="slider-mark-label"
|
|
211
|
+
style={labelStyle(m.value)}
|
|
212
|
+
className="pointer-events-none absolute whitespace-nowrap text-xs text-muted-foreground"
|
|
213
|
+
>
|
|
214
|
+
{m.label}
|
|
215
|
+
</span>
|
|
216
|
+
))}
|
|
217
|
+
</SliderPrimitive.Root>
|
|
218
|
+
</TooltipProvider>
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export { Slider };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Slider
|
|
2
|
+
|
|
3
|
+
> 本文件由 `pnpm gen:meta` 自动生成,**请勿手动编辑**。
|
|
4
|
+
|
|
5
|
+
## 描述
|
|
6
|
+
|
|
7
|
+
滑动输入条 Slider
|
|
8
|
+
拖拽滑块选择数值或范围,基于 Radix Slider 原语。支持 marks 刻度、tooltip 值提示与 reverse 反向选中。
|
|
9
|
+
|
|
10
|
+
## 使用场景
|
|
11
|
+
|
|
12
|
+
- 音量 / 亮度调节
|
|
13
|
+
- 价格范围筛选
|
|
14
|
+
- 图片编辑参数调整
|
|
15
|
+
|
|
16
|
+
## Props
|
|
17
|
+
|
|
18
|
+
| 名称 | 类型 | 默认值 | 必填 | 说明 |
|
|
19
|
+
| --- | --- | --- | --- | --- |
|
|
20
|
+
| `marks` | `SliderMarks` | – | – | 刻度配置:number=等分数,number[]=枚举值,对象={value: label} |
|
|
21
|
+
| `marksPosition` | `'above' \| 'below'` | – | – | 刻度标签位置;horizontal 下=上/下,vertical 下=右/左 |
|
|
22
|
+
| `showTooltip` | `'auto' \| 'always' \| 'never'` | – | – | tooltip 显示策略:auto(hover/active) / always(常驻) / never(隐藏) |
|
|
23
|
+
| `tooltipFormatter` | `(value: number) => React.ReactNode` | – | – | 自定义 tooltip 内容;不传则显示当前数值 |
|
|
24
|
+
| `reverse` | `boolean` | – | – | 选中态反转(轨道与已选段颜色翻转) |
|
|
25
|
+
|
|
26
|
+
## 示例
|
|
27
|
+
|
|
28
|
+
### Range
|
|
29
|
+
|
|
30
|
+
双滑块范围选择。
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
<Slider defaultValue={[25, 75]} max={100} step={1} className="w-64" />
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### CustomStep
|
|
37
|
+
|
|
38
|
+
自定义步长为 10。
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
<Slider defaultValue={[30]} max={100} step={10} className="w-64" />
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Disabled
|
|
45
|
+
|
|
46
|
+
禁用状态。
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
<Slider defaultValue={[40]} max={100} disabled className="w-64" />
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Marks
|
|
53
|
+
|
|
54
|
+
三种 marks 形态:number 等分、number[] 枚举、Record 值-标签映射。
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
<div className="flex flex-col gap-10">
|
|
58
|
+
<Slider defaultValue={[30]} marks={5} className="w-64" />
|
|
59
|
+
<Slider defaultValue={[30]} marks={[0, 100]} className="w-64" />
|
|
60
|
+
<Slider
|
|
61
|
+
defaultValue={[30]}
|
|
62
|
+
marks={{ 0: '0°C', 26: '26°C', 37: '37°C', 100: '100°C' }}
|
|
63
|
+
className="w-64"
|
|
64
|
+
/>
|
|
65
|
+
</div>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### MarksPosition
|
|
69
|
+
|
|
70
|
+
marks 标签可放在轨道下方(默认)或上方。
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
<div className="flex flex-col gap-16">
|
|
74
|
+
<Slider
|
|
75
|
+
defaultValue={[30]}
|
|
76
|
+
marks={[0, 100]}
|
|
77
|
+
marksPosition="below"
|
|
78
|
+
className="w-64"
|
|
79
|
+
/>
|
|
80
|
+
<Slider
|
|
81
|
+
defaultValue={[30]}
|
|
82
|
+
marks={[0, 100]}
|
|
83
|
+
marksPosition="above"
|
|
84
|
+
className="w-64"
|
|
85
|
+
/>
|
|
86
|
+
</div>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Tooltip
|
|
90
|
+
|
|
91
|
+
Tooltip 默认 hover/active 显示,可通过 tooltipFormatter 自定义内容。
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
<Slider
|
|
95
|
+
defaultValue={[40]}
|
|
96
|
+
tooltipFormatter={(v) => `${v}%`}
|
|
97
|
+
className="w-64"
|
|
98
|
+
/>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Reverse
|
|
102
|
+
|
|
103
|
+
选中态反转:未选段变蓝、已选段变灰。
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
<div className="flex flex-col gap-6">
|
|
107
|
+
<Slider defaultValue={[30]} reverse className="w-64" />
|
|
108
|
+
<Slider defaultValue={[20, 70]} reverse className="w-64" />
|
|
109
|
+
</div>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Vertical
|
|
113
|
+
|
|
114
|
+
垂直方向,配合 marks 使用。
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
<div className="flex h-40 gap-10">
|
|
118
|
+
<Slider defaultValue={[40]} orientation="vertical" />
|
|
119
|
+
<Slider
|
|
120
|
+
defaultValue={[20, 80]}
|
|
121
|
+
orientation="vertical"
|
|
122
|
+
marks={[0, 50, 100]}
|
|
123
|
+
/>
|
|
124
|
+
</div>
|
|
125
|
+
```
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { Slider } from './index';
|
|
3
|
+
|
|
4
|
+
const meta: Meta<typeof Slider> = {
|
|
5
|
+
title: '数据录入 · Data Entry/Slider 滑块',
|
|
6
|
+
component: Slider,
|
|
7
|
+
tags: ['autodocs'],
|
|
8
|
+
};
|
|
9
|
+
export default meta;
|
|
10
|
+
|
|
11
|
+
type Story = StoryObj<typeof meta>;
|
|
12
|
+
|
|
13
|
+
/** 基础滑块,单值选取。 */
|
|
14
|
+
export const Default: Story = {
|
|
15
|
+
render: () => (
|
|
16
|
+
<Slider defaultValue={[50]} max={100} step={1} className="w-64" />
|
|
17
|
+
),
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/** 双滑块范围选择。 */
|
|
21
|
+
export const Range: Story = {
|
|
22
|
+
render: () => (
|
|
23
|
+
<Slider defaultValue={[25, 75]} max={100} step={1} className="w-64" />
|
|
24
|
+
),
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/** 自定义步长为 10。 */
|
|
28
|
+
export const CustomStep: Story = {
|
|
29
|
+
render: () => (
|
|
30
|
+
<Slider defaultValue={[30]} max={100} step={10} className="w-64" />
|
|
31
|
+
),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/** 禁用状态。 */
|
|
35
|
+
export const Disabled: Story = {
|
|
36
|
+
render: () => (
|
|
37
|
+
<Slider defaultValue={[40]} max={100} disabled className="w-64" />
|
|
38
|
+
),
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/** 三种 marks 形态:number 等分、number[] 枚举、Record 值-标签映射。 */
|
|
42
|
+
export const Marks: Story = {
|
|
43
|
+
render: () => (
|
|
44
|
+
<div className="flex flex-col gap-10">
|
|
45
|
+
<Slider defaultValue={[30]} marks={5} className="w-64" />
|
|
46
|
+
<Slider defaultValue={[30]} marks={[0, 100]} className="w-64" />
|
|
47
|
+
<Slider
|
|
48
|
+
defaultValue={[30]}
|
|
49
|
+
marks={{ 0: '0°C', 26: '26°C', 37: '37°C', 100: '100°C' }}
|
|
50
|
+
className="w-64"
|
|
51
|
+
/>
|
|
52
|
+
</div>
|
|
53
|
+
),
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/** marks 标签可放在轨道下方(默认)或上方。 */
|
|
57
|
+
export const MarksPosition: Story = {
|
|
58
|
+
render: () => (
|
|
59
|
+
<div className="flex flex-col gap-16">
|
|
60
|
+
<Slider
|
|
61
|
+
defaultValue={[30]}
|
|
62
|
+
marks={[0, 100]}
|
|
63
|
+
marksPosition="below"
|
|
64
|
+
className="w-64"
|
|
65
|
+
/>
|
|
66
|
+
<Slider
|
|
67
|
+
defaultValue={[30]}
|
|
68
|
+
marks={[0, 100]}
|
|
69
|
+
marksPosition="above"
|
|
70
|
+
className="w-64"
|
|
71
|
+
/>
|
|
72
|
+
</div>
|
|
73
|
+
),
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/** Tooltip 默认 hover/active 显示,可通过 tooltipFormatter 自定义内容。 */
|
|
77
|
+
export const Tooltip: Story = {
|
|
78
|
+
render: () => (
|
|
79
|
+
<Slider
|
|
80
|
+
defaultValue={[40]}
|
|
81
|
+
tooltipFormatter={(v) => `${v}%`}
|
|
82
|
+
className="w-64"
|
|
83
|
+
/>
|
|
84
|
+
),
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
/** 选中态反转:未选段变蓝、已选段变灰。 */
|
|
88
|
+
export const Reverse: Story = {
|
|
89
|
+
render: () => (
|
|
90
|
+
<div className="flex flex-col gap-6">
|
|
91
|
+
<Slider defaultValue={[30]} reverse className="w-64" />
|
|
92
|
+
<Slider defaultValue={[20, 70]} reverse className="w-64" />
|
|
93
|
+
</div>
|
|
94
|
+
),
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/** 垂直方向,配合 marks 使用。 */
|
|
98
|
+
export const Vertical: Story = {
|
|
99
|
+
render: () => (
|
|
100
|
+
<div className="flex h-40 gap-10">
|
|
101
|
+
<Slider defaultValue={[40]} orientation="vertical" />
|
|
102
|
+
<Slider
|
|
103
|
+
defaultValue={[20, 80]}
|
|
104
|
+
orientation="vertical"
|
|
105
|
+
marks={[0, 50, 100]}
|
|
106
|
+
/>
|
|
107
|
+
</div>
|
|
108
|
+
),
|
|
109
|
+
};
|