@teamix-evo/ui 0.7.1 → 0.7.2

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.
Files changed (120) hide show
  1. package/manifest.json +16 -7
  2. package/package.json +4 -4
  3. package/src/_design-system/theme-tokens/stories.tsx +2 -2
  4. package/src/components/accordion/index.tsx +1 -1
  5. package/src/components/affix/meta.md +26 -0
  6. package/src/components/alert/index.tsx +2 -2
  7. package/src/components/alert-dialog/index.tsx +3 -3
  8. package/src/components/alert-dialog/meta.md +52 -0
  9. package/src/components/alert-dialog/stories.tsx +45 -48
  10. package/src/components/avatar/index.tsx +1 -1
  11. package/src/components/badge/index.tsx +2 -2
  12. package/src/components/badge/meta.md +48 -0
  13. package/src/components/button/index.tsx +2 -2
  14. package/src/components/button/meta.md +15 -0
  15. package/src/components/button/stories.tsx +1 -1
  16. package/src/components/calendar/index.tsx +2 -2
  17. package/src/components/card/index.tsx +1 -1
  18. package/src/components/carousel/index.tsx +2 -2
  19. package/src/components/carousel/meta.md +34 -2
  20. package/src/components/carousel/stories.tsx +2 -2
  21. package/src/components/cascader-select/index.tsx +2 -1
  22. package/src/components/cascader-select/meta.md +46 -0
  23. package/src/components/checkbox/meta.md +47 -0
  24. package/src/components/color-picker/index.tsx +3 -3
  25. package/src/components/color-picker/meta.md +80 -0
  26. package/src/components/combobox/index.tsx +2 -2
  27. package/src/components/combobox/meta.md +130 -0
  28. package/src/components/data-table/index.tsx +2 -2
  29. package/src/components/data-table/meta.md +419 -0
  30. package/src/components/date-picker/meta.md +91 -0
  31. package/src/components/descriptions/index.tsx +1 -1
  32. package/src/components/descriptions/meta.md +245 -0
  33. package/src/components/dialog/index.tsx +4 -4
  34. package/src/components/dialog/meta.md +47 -1
  35. package/src/components/dialog/stories.tsx +38 -41
  36. package/src/components/dropdown-menu/index.tsx +5 -5
  37. package/src/components/empty/index.tsx +2 -2
  38. package/src/components/field/index.tsx +4 -4
  39. package/src/components/filter-bar/index.tsx +6 -6
  40. package/src/components/filter-bar/meta.md +323 -0
  41. package/src/components/float-button/index.tsx +2 -2
  42. package/src/components/form/index.tsx +1 -1
  43. package/src/components/form/meta.md +119 -0
  44. package/src/components/hover-card/index.tsx +1 -1
  45. package/src/components/hover-card/meta.md +21 -0
  46. package/src/components/input/meta.md +16 -0
  47. package/src/components/input-group/index.tsx +1 -1
  48. package/src/components/input-group/meta.md +118 -0
  49. package/src/components/input-group/stories.tsx +6 -6
  50. package/src/components/input-ip/index.tsx +2 -2
  51. package/src/components/input-ip/meta.md +30 -0
  52. package/src/components/input-ip/stories.tsx +2 -2
  53. package/src/components/input-number/index.tsx +3 -2
  54. package/src/components/input-number/meta.md +67 -0
  55. package/src/components/input-number/stories.tsx +2 -2
  56. package/src/components/item/index.tsx +4 -4
  57. package/src/components/label/meta.md +8 -0
  58. package/src/components/mentions/meta.md +15 -0
  59. package/src/components/menubar/index.tsx +4 -4
  60. package/src/components/navigation-menu/index.tsx +4 -4
  61. package/src/components/page-header/index.tsx +1 -1
  62. package/src/components/page-header/meta.md +145 -0
  63. package/src/components/page-shell/index.tsx +2 -2
  64. package/src/components/pagination/index.tsx +1 -1
  65. package/src/components/pagination/meta.md +203 -0
  66. package/src/components/popconfirm/meta.md +45 -0
  67. package/src/components/popover/index.tsx +2 -2
  68. package/src/components/popover/meta.md +47 -0
  69. package/src/components/progress/index.tsx +1 -1
  70. package/src/components/progress/meta.md +36 -0
  71. package/src/components/progress/stories.tsx +1 -1
  72. package/src/components/radio-group/meta.md +69 -0
  73. package/src/components/rate/index.tsx +1 -1
  74. package/src/components/rate/meta.md +50 -0
  75. package/src/components/resizable/index.tsx +1 -1
  76. package/src/components/select/index.tsx +2 -2
  77. package/src/components/select/meta.md +20 -0
  78. package/src/components/separator/index.tsx +1 -1
  79. package/src/components/sheet/index.tsx +13 -14
  80. package/src/components/sheet/meta.md +124 -0
  81. package/src/components/sheet/stories.tsx +110 -119
  82. package/src/components/sidebar/index.tsx +5 -5
  83. package/src/components/sidebar/meta.md +383 -0
  84. package/src/components/skeleton/meta.md +13 -0
  85. package/src/components/slider/index.tsx +2 -2
  86. package/src/components/sonner/meta.md +86 -0
  87. package/src/components/spinner/meta.md +46 -0
  88. package/src/components/spinner/stories.tsx +2 -2
  89. package/src/components/steps/meta.md +20 -0
  90. package/src/components/steps/stories.tsx +1 -1
  91. package/src/components/switch/index.tsx +2 -2
  92. package/src/components/switch/meta.md +33 -0
  93. package/src/components/table/index.tsx +2 -2
  94. package/src/components/table/meta.md +11 -0
  95. package/src/components/tabs/index.tsx +7 -7
  96. package/src/components/tabs/meta.md +52 -0
  97. package/src/components/tag/index.tsx +8 -8
  98. package/src/components/tag/meta.md +194 -0
  99. package/src/components/textarea/index.tsx +1 -1
  100. package/src/components/textarea/meta.md +27 -0
  101. package/src/components/textarea/stories.tsx +1 -1
  102. package/src/components/time-picker/index.tsx +3 -3
  103. package/src/components/time-picker/meta.md +76 -0
  104. package/src/components/timeline/index.tsx +1 -0
  105. package/src/components/toggle/index.tsx +1 -1
  106. package/src/components/toggle-group/index.tsx +1 -1
  107. package/src/components/tooltip/index.tsx +1 -1
  108. package/src/components/tooltip/meta.md +23 -0
  109. package/src/components/transfer/index.tsx +2 -2
  110. package/src/components/transfer/meta.md +97 -0
  111. package/src/components/tree/index.tsx +245 -15
  112. package/src/components/tree/meta.md +151 -0
  113. package/src/components/tree-select/index.tsx +16 -2
  114. package/src/components/tree-select/meta.md +150 -0
  115. package/src/components/typography/index.tsx +3 -3
  116. package/src/components/upload/index.tsx +3 -3
  117. package/src/components/upload/meta.md +82 -0
  118. package/src/components/tree/utils.ts +0 -269
  119. package/src/examples/built-in-assets/stories.tsx +0 -572
  120. package/src/examples/evaluators/stories.tsx +0 -502
@@ -128,6 +128,27 @@ CheckboxGroup 纵向排列。
128
128
  />
129
129
  ```
130
130
 
131
+ ### GroupControlled
132
+
133
+ CheckboxGroup 受控用法 + onChange 回调。
134
+
135
+ ```tsx
136
+ <div className="flex flex-col gap-2">
137
+ <CheckboxGroup
138
+ value={value}
139
+ onChange={setValue}
140
+ dataSource={[
141
+ { value: 'apple', label: '苹果' },
142
+ { value: 'banana', label: '香蕉' },
143
+ { value: 'orange', label: '橙子' },
144
+ ]}
145
+ />
146
+ <div className="text-xs text-muted-foreground">
147
+ 已选:{value.join(', ') || '无'}
148
+ </div>
149
+ </div>
150
+ ```
151
+
131
152
  ### GroupDisabled
132
153
 
133
154
  CheckboxGroup 整组禁用。
@@ -164,3 +185,29 @@ CheckboxGroup children 模式:自由组合 Checkbox 子元素,仍由 group
164
185
  </label>
165
186
  </CheckboxGroup>
166
187
  ```
188
+
189
+ ### CheckAll
190
+
191
+ 全选 / 半选 / 反选联动。
192
+
193
+ ```tsx
194
+ <div className="flex flex-col gap-3">
195
+ <label className="inline-flex cursor-pointer items-center gap-2 text-xs">
196
+ <Checkbox
197
+ checked={allChecked}
198
+ indeterminate={indeterminate}
199
+ onCheckedChange={(c) => setValue(c === true ? options : [])}
200
+ />
201
+ <span>全选</span>
202
+ </label>
203
+ <CheckboxGroup
204
+ value={value}
205
+ onChange={setValue}
206
+ dataSource={[
207
+ { value: 'apple', label: '苹果' },
208
+ { value: 'banana', label: '香蕉' },
209
+ { value: 'orange', label: '橙子' },
210
+ ]}
211
+ />
212
+ </div>
213
+ ```
@@ -48,7 +48,7 @@ type ColorPresets = string[] | ColorPresetGroup[];
48
48
  // ─── Trigger variants ──────────────────────────────────────────────────────
49
49
 
50
50
  const triggerVariants = cva(
51
- 'inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-input bg-background transition-colors hover:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',
51
+ 'inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-input bg-background transition-colors hover:border-ring focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50',
52
52
  {
53
53
  variants: {
54
54
  size: {
@@ -432,7 +432,7 @@ function PresetGrid({
432
432
  type="button"
433
433
  onClick={() => onSelect(hex)}
434
434
  className={cn(
435
- 'size-5 cursor-pointer rounded-sm border border-border transition-transform hover:scale-110 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',
435
+ 'size-5 cursor-pointer rounded-sm border border-border transition-transform hover:scale-110 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none',
436
436
  currentColor.toHex() === new Color(hex).toHex() &&
437
437
  'ring-1 ring-ring ring-offset-1',
438
438
  )}
@@ -628,7 +628,7 @@ function ColorPicker({
628
628
  <button
629
629
  type="button"
630
630
  onClick={cycleFormat}
631
- className="h-6 shrink-0 cursor-pointer rounded-sm px-1.5 text-xs font-medium uppercase text-muted-foreground transition-colors hover:bg-muted hover:text-foreground"
631
+ className="h-6 shrink-0 cursor-pointer rounded-sm px-1.5 text-xs font-medium text-muted-foreground uppercase transition-colors hover:bg-muted hover:text-foreground"
632
632
  >
633
633
  {currentFormat}
634
634
  </button>
@@ -40,6 +40,18 @@
40
40
 
41
41
  ## 示例
42
42
 
43
+ ### Basic
44
+
45
+ ```tsx
46
+ <ColorPicker />
47
+ ```
48
+
49
+ ### DefaultValue
50
+
51
+ ```tsx
52
+ <ColorPicker defaultValue="#52c41a" />
53
+ ```
54
+
43
55
  ### Sizes
44
56
 
45
57
  ```tsx
@@ -72,6 +84,68 @@
72
84
  </div>
73
85
  ```
74
86
 
87
+ ### DisabledAlpha
88
+
89
+ ```tsx
90
+ <ColorPicker disabledAlpha defaultValue="#1677ff" />
91
+ ```
92
+
93
+ ### AllowClear
94
+
95
+ ```tsx
96
+ <ColorPicker allowClear defaultValue="#faad14" />
97
+ ```
98
+
99
+ ### PresetFlat
100
+
101
+ ```tsx
102
+ <ColorPicker defaultValue="#1677ff" presets={[
103
+ '#f5222d'} '#fa541c'={'#fa541c'} '#fa8c16'={'#fa8c16'} '#faad14'={'#faad14'} '#fadb14'={'#fadb14'} '#a0d911'={'#a0d911'} '#52c41a'={'#52c41a'} '#13c2c2'={'#13c2c2'} '#1677ff'={'#1677ff'} '#2f54eb'={'#2f54eb'} '#722ed1'={'#722ed1'} '#eb2f96'={'#eb2f96'} ]={]} />
104
+ ```
105
+
106
+ ### PresetGroups
107
+
108
+ ```tsx
109
+ <ColorPicker defaultValue="#1677ff" presets={[
110
+ {
111
+ label: '推荐色'} colors={['#f5222d'} '#fa8c16'={'#fa8c16'} '#fadb14'={'#fadb14'} '#52c41a'={'#52c41a'} '#1677ff'={'#1677ff'} '#722ed1']={'#722ed1']} }={}} {
112
+ label: '中性色'={{
113
+ label: '中性色'} colors={['#000000'} '#434343'={'#434343'} '#8c8c8c'={'#8c8c8c'} '#bfbfbf'={'#bfbfbf'} '#d9d9d9'={'#d9d9d9'} '#ffffff']={'#ffffff']} defaultOpen={false} }={}} ]={]} />
114
+ ```
115
+
116
+ ### Controlled
117
+
118
+ ```tsx
119
+ <div className="flex items-center gap-3">
120
+ <ColorPicker
121
+ value={color}
122
+ onChange={(c) => setColor(c)}
123
+ showText
124
+ />
125
+ <Button
126
+ variant="outline"
127
+ size="sm"
128
+ onClick={() => setColor(new Color('#ff4d4f'))}
129
+ >
130
+ 设为红色
131
+ </Button>
132
+ </div>
133
+ ```
134
+
135
+ ### OnChangeComplete
136
+
137
+ ```tsx
138
+ <div className="flex items-center gap-3">
139
+ <ColorPicker
140
+ defaultValue="#1677ff"
141
+ onChangeComplete={(c) => setHex(c.toHex())}
142
+ />
143
+ <span className="text-xs text-muted-foreground">
144
+ 完成选色: {hex}
145
+ </span>
146
+ </div>
147
+ ```
148
+
75
149
  ### CustomTrigger
76
150
 
77
151
  ```tsx
@@ -81,3 +155,9 @@
81
155
  </Button>
82
156
  </ColorPicker>
83
157
  ```
158
+
159
+ ### Disabled
160
+
161
+ ```tsx
162
+ <ColorPicker disabled defaultValue="#faad14" />
163
+ ```
@@ -372,7 +372,7 @@ function ComboboxTrigger({
372
372
  }}
373
373
  className={cn(
374
374
  // 视觉与 SelectTrigger 对齐;focus-within 产生 ring;min-h 容纳多行 Tag
375
- "flex w-fit cursor-text items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-1 pr-2 pl-2.5 text-xs transition-colors outline-none has-[input:focus]:border-ring has-[input:focus]:ring-ring/20 data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 data-[size=default]:min-h-8 data-[size=sm]:min-h-7 data-[size=lg]:min-h-9 data-[size=lg]:text-sm aria-invalid:border-destructive aria-invalid:ring-1 aria-invalid:ring-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
375
+ "flex w-fit cursor-text items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-1 pr-2 pl-2.5 text-xs transition-colors outline-none has-[input:focus]:border-ring has-[input:focus]:ring-ring/20 aria-invalid:border-destructive aria-invalid:ring-1 aria-invalid:ring-destructive/20 data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50 data-[size=default]:min-h-8 data-[size=lg]:min-h-9 data-[size=lg]:text-sm data-[size=sm]:min-h-7 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
376
376
  className,
377
377
  )}
378
378
  {...props}
@@ -670,7 +670,7 @@ function ComboboxItem({
670
670
  }}
671
671
  className={cn(
672
672
  // 与 SelectItem 视觉对齐:h-8、左侧勾选位;hover 灰底,选中蓝底(含 hover 保持)
673
- "group/combobox-item relative flex h-8 w-full cursor-pointer items-center gap-1.5 rounded-md py-1 pr-2 pl-7 text-xs outline-hidden select-none hover:bg-muted data-[state=checked]:bg-primary/10 data-[state=checked]:hover:bg-primary/10 data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
673
+ "group/combobox-item relative flex h-8 w-full cursor-pointer items-center gap-1.5 rounded-md py-1 pr-2 pl-7 text-xs outline-hidden select-none hover:bg-muted data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[state=checked]:bg-primary/10 data-[state=checked]:hover:bg-primary/10 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
674
674
  className,
675
675
  )}
676
676
  {...props}
@@ -30,6 +30,136 @@
30
30
 
31
31
  ## 示例
32
32
 
33
+ ### Multiple
34
+
35
+ 多选:选中项以可关闭 Tag 形式展示在触发区。
36
+
37
+ ```tsx
38
+ <Combobox multiple value={value} onValueChange={setValue}>
39
+ <ComboboxTrigger
40
+ className="w-72"
41
+ onClear={value.length ? () => setValue([]) : undefined}
42
+ >
43
+ <ComboboxValue placeholder="选择多个城市" />
44
+ </ComboboxTrigger>
45
+ <ComboboxContent>
46
+ <ComboboxList>
47
+ <ComboboxEmpty>无匹配结果</ComboboxEmpty>
48
+ <ComboboxGroup>
49
+ {cityOptions.map((o) => (
50
+ <ComboboxItem key={o.value} value={o.value}>
51
+ {o.label}
52
+ </ComboboxItem>
53
+ ))}
54
+ </ComboboxGroup>
55
+ </ComboboxList>
56
+ </ComboboxContent>
57
+ </Combobox>
58
+ ```
59
+
60
+ ### WithMaxTagCount
61
+
62
+ 多选模式下通过 `maxTagCount` 控制选择的个数,通过 `maxTagPlaceholder` 控制选择的 hover 样式。
63
+
64
+ ```tsx
65
+ <div className="flex flex-wrap items-start gap-3">
66
+ {/* 默认 +N */}
67
+ <Combobox multiple maxTagCount={2} value={v1} onValueChange={setV1}>
68
+ <ComboboxTrigger className="w-60">
69
+ <ComboboxValue placeholder="选择城市" />
70
+ </ComboboxTrigger>
71
+ <ComboboxContent>
72
+ <ComboboxList>
73
+ <ComboboxGroup>
74
+ {cityOptions.map((o) => (
75
+ <ComboboxItem key={o.value} value={o.value}>
76
+ {o.label}
77
+ </ComboboxItem>
78
+ ))}
79
+ </ComboboxGroup>
80
+ </ComboboxList>
81
+ </ComboboxContent>
82
+ </Combobox>
83
+ {/* 自定义摘要 wrapped in Tag */}
84
+ <Combobox
85
+ multiple
86
+ maxTagCount={2}
87
+ maxTagPlaceholder={(_omitted, total) => (
88
+ <Tag size="sm" variant="solid" color="primary">
89
+ 已选择 {total}/{cityOptions.length} 项
90
+ </Tag>
91
+ )}
92
+ value={v2}
93
+ onValueChange={setV2}
94
+ >
95
+ <ComboboxTrigger className="w-60">
96
+ <ComboboxValue placeholder="选择城市" />
97
+ </ComboboxTrigger>
98
+ <ComboboxContent>
99
+ <ComboboxList>
100
+ <ComboboxGroup>
101
+ {cityOptions.map((o) => (
102
+ <ComboboxItem key={o.value} value={o.value}>
103
+ {o.label}
104
+ </ComboboxItem>
105
+ ))}
106
+ </ComboboxGroup>
107
+ </ComboboxList>
108
+ </ComboboxContent>
109
+ </Combobox>
110
+ {/* 简洁 x/total 纯文本 */}
111
+ <Combobox
112
+ multiple
113
+ maxTagCount={2}
114
+ maxTagPlaceholder={(_omitted, total) =>
115
+ `${total}/${cityOptions.length}`
116
+ }
117
+ value={v3}
118
+ onValueChange={setV3}
119
+ >
120
+ <ComboboxTrigger className="w-60">
121
+ <ComboboxValue placeholder="选择城市" />
122
+ </ComboboxTrigger>
123
+ <ComboboxContent>
124
+ <ComboboxList>
125
+ <ComboboxGroup>
126
+ {cityOptions.map((o) => (
127
+ <ComboboxItem key={o.value} value={o.value}>
128
+ {o.label}
129
+ </ComboboxItem>
130
+ ))}
131
+ </ComboboxGroup>
132
+ </ComboboxList>
133
+ </ComboboxContent>
134
+ </Combobox>
135
+ {/* maxTagCount=1 + 纯文本摘要 */}
136
+ <Combobox
137
+ multiple
138
+ maxTagCount={1}
139
+ maxTagPlaceholder={(_omitted, total) =>
140
+ `已选择 ${total}/${cityOptions.length} 项`
141
+ }
142
+ value={v4}
143
+ onValueChange={setV4}
144
+ >
145
+ <ComboboxTrigger className="w-60">
146
+ <ComboboxValue placeholder="选择城市" />
147
+ </ComboboxTrigger>
148
+ <ComboboxContent>
149
+ <ComboboxList>
150
+ <ComboboxGroup>
151
+ {cityOptions.map((o) => (
152
+ <ComboboxItem key={o.value} value={o.value}>
153
+ {o.label}
154
+ </ComboboxItem>
155
+ ))}
156
+ </ComboboxGroup>
157
+ </ComboboxList>
158
+ </ComboboxContent>
159
+ </Combobox>
160
+ </div>
161
+ ```
162
+
33
163
  ### Disabled
34
164
 
35
165
  禁用态。
@@ -1289,7 +1289,7 @@ function DataTable<T = Record<string, unknown>>(props: DataTableProps<T>) {
1289
1289
  data-slot="data-table-expanded-row"
1290
1290
  className="bg-muted/20 hover:bg-muted/20"
1291
1291
  >
1292
- <TableCell colSpan={colCount} className="whitespace-normal py-3">
1292
+ <TableCell colSpan={colCount} className="py-3 whitespace-normal">
1293
1293
  {expandable!.expandedRowRender(row.original, row.index)}
1294
1294
  </TableCell>
1295
1295
  </TableRow>
@@ -1462,7 +1462,7 @@ function DataTable<T = Record<string, unknown>>(props: DataTableProps<T>) {
1462
1462
  onTouchStart={header.getResizeHandler()}
1463
1463
  onClick={(e) => e.stopPropagation()}
1464
1464
  className={cn(
1465
- 'absolute right-0 top-0 z-10 h-full w-1 cursor-col-resize touch-none select-none bg-transparent transition-colors hover:bg-primary/40',
1465
+ 'absolute top-0 right-0 z-10 h-full w-1 cursor-col-resize touch-none bg-transparent transition-colors select-none hover:bg-primary/40',
1466
1466
  header.column.getIsResizing() && 'bg-primary',
1467
1467
  )}
1468
1468
  />