@dust-tt/sparkle 0.2.454 → 0.2.456

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 (74) hide show
  1. package/dist/cjs/index.js +1 -1
  2. package/dist/esm/components/AnimatedText.d.ts +1 -1
  3. package/dist/esm/components/AnimatedText.d.ts.map +1 -1
  4. package/dist/esm/components/AnimatedText.js +32 -8
  5. package/dist/esm/components/AnimatedText.js.map +1 -1
  6. package/dist/esm/components/Avatar.d.ts.map +1 -1
  7. package/dist/esm/components/Avatar.js +8 -24
  8. package/dist/esm/components/Avatar.js.map +1 -1
  9. package/dist/esm/components/Button.d.ts +1 -1
  10. package/dist/esm/components/Chip.d.ts +1 -1
  11. package/dist/esm/components/Chip.d.ts.map +1 -1
  12. package/dist/esm/components/Chip.js +36 -10
  13. package/dist/esm/components/Chip.js.map +1 -1
  14. package/dist/esm/components/ColorPicker.js +1 -1
  15. package/dist/esm/components/ColorPicker.js.map +1 -1
  16. package/dist/esm/components/ContentMessage.d.ts +1 -1
  17. package/dist/esm/components/ContentMessage.d.ts.map +1 -1
  18. package/dist/esm/components/ContentMessage.js +59 -14
  19. package/dist/esm/components/ContentMessage.js.map +1 -1
  20. package/dist/esm/components/Counter.d.ts +1 -1
  21. package/dist/esm/components/DataTable.d.ts +8 -3
  22. package/dist/esm/components/DataTable.d.ts.map +1 -1
  23. package/dist/esm/components/DataTable.js +61 -10
  24. package/dist/esm/components/DataTable.js.map +1 -1
  25. package/dist/esm/components/Hoverable.d.ts +1 -1
  26. package/dist/esm/components/PriceTable.d.ts.map +1 -1
  27. package/dist/esm/components/PriceTable.js +0 -7
  28. package/dist/esm/components/PriceTable.js.map +1 -1
  29. package/dist/esm/components/index.d.ts +0 -1
  30. package/dist/esm/components/index.d.ts.map +1 -1
  31. package/dist/esm/components/index.js +0 -1
  32. package/dist/esm/components/index.js.map +1 -1
  33. package/dist/esm/stories/Avatar.stories.js +3 -3
  34. package/dist/esm/stories/Avatar.stories.js.map +1 -1
  35. package/dist/esm/stories/Chip.stories.d.ts +3 -3
  36. package/dist/esm/stories/ColorPalette.stories.d.ts +2 -1
  37. package/dist/esm/stories/ColorPalette.stories.d.ts.map +1 -1
  38. package/dist/esm/stories/ColorPalette.stories.js +65 -13
  39. package/dist/esm/stories/ColorPalette.stories.js.map +1 -1
  40. package/dist/esm/stories/ColorPicker.stories.d.ts.map +1 -1
  41. package/dist/esm/stories/ColorPicker.stories.js +48 -128
  42. package/dist/esm/stories/ColorPicker.stories.js.map +1 -1
  43. package/dist/esm/stories/ContentMessage.stories.js +8 -8
  44. package/dist/esm/stories/ContentMessage.stories.js.map +1 -1
  45. package/dist/esm/stories/DataTable.stories.d.ts +1 -0
  46. package/dist/esm/stories/DataTable.stories.d.ts.map +1 -1
  47. package/dist/esm/stories/DataTable.stories.js +27 -3
  48. package/dist/esm/stories/DataTable.stories.js.map +1 -1
  49. package/dist/esm/stories/IconButton.stories.d.ts +1 -1
  50. package/dist/sparkle.css +345 -1439
  51. package/package.json +1 -1
  52. package/src/components/AnimatedText.tsx +64 -19
  53. package/src/components/Avatar.tsx +8 -24
  54. package/src/components/Chip.tsx +72 -22
  55. package/src/components/ColorPicker.tsx +1 -1
  56. package/src/components/ContentMessage.tsx +68 -14
  57. package/src/components/DataTable.tsx +87 -0
  58. package/src/components/PriceTable.tsx +0 -8
  59. package/src/components/index.ts +0 -1
  60. package/src/stories/Avatar.stories.tsx +3 -3
  61. package/src/stories/ColorPalette.stories.tsx +83 -2
  62. package/src/stories/ColorPicker.stories.tsx +48 -128
  63. package/src/stories/ContentMessage.stories.tsx +8 -8
  64. package/src/stories/DataTable.stories.tsx +60 -2
  65. package/dist/esm/components/IconToggleButton.d.ts +0 -17
  66. package/dist/esm/components/IconToggleButton.d.ts.map +0 -1
  67. package/dist/esm/components/IconToggleButton.js +0 -37
  68. package/dist/esm/components/IconToggleButton.js.map +0 -1
  69. package/dist/esm/stories/IconToggleButton.stories.d.ts +0 -11
  70. package/dist/esm/stories/IconToggleButton.stories.d.ts.map +0 -1
  71. package/dist/esm/stories/IconToggleButton.stories.js +0 -24
  72. package/dist/esm/stories/IconToggleButton.stories.js.map +0 -1
  73. package/src/components/IconToggleButton.tsx +0 -106
  74. package/src/stories/IconToggleButton.stories.tsx +0 -30
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dust-tt/sparkle",
3
- "version": "0.2.454",
3
+ "version": "0.2.456",
4
4
  "scripts": {
5
5
  "build": "rm -rf dist && npm run tailwind && npm run build:esm && npm run build:cjs",
6
6
  "tailwind": "tailwindcss -i ./src/styles/tailwind.css -o dist/sparkle.css",
@@ -4,30 +4,75 @@ import React, { ReactNode } from "react";
4
4
  import { cn } from "@sparkle/lib/utils";
5
5
 
6
6
  const ANIMATED_TEXT_VARIANTS = [
7
+ "primary",
7
8
  "muted",
9
+ "white",
8
10
  "highlight",
11
+ "success",
12
+ "warning",
13
+ "info",
14
+ "green",
15
+ "blue",
16
+ "rose",
17
+ "golden",
18
+ //to be removed
9
19
  "emerald",
10
20
  "amber",
11
21
  "slate",
12
22
  "purple",
13
- "warning",
14
23
  "sky",
15
24
  "pink",
16
25
  "red",
17
- "white",
18
26
  ] as const;
19
27
 
20
28
  type AnimatedTextVariantType = (typeof ANIMATED_TEXT_VARIANTS)[number];
21
29
 
22
30
  const animatedVariants: Record<AnimatedTextVariantType, string> = {
31
+ primary: cn(
32
+ "s-from-primary-800 s-via-primary-950 s-via-50% s-to-primary-800",
33
+ "dark:s-from-primary-800-night dark:s-via-primary-950-night dark:s-via-50% dark:s-to-primary-800-night"
34
+ ),
23
35
  muted: cn(
24
36
  "s-from-transparent s-via-primary-950/80 s-via-50% s-to-transparent",
25
37
  "dark:s-from-transparent dark:s-via-primary-50/80 dark:s-via-50% dark:s-to-transparent"
26
38
  ),
39
+ white: cn(
40
+ "s-from-primary-600 s-via-primary-950 s-via-50% s-to-primary-600",
41
+ "dark:s-from-primary-600-night dark:s-via-primary-950-night dark:s-via-50% dark:s-to-primary-600-night"
42
+ ),
27
43
  highlight: cn(
28
44
  "s-from-highlight s-via-highlight-800 s-via-50% s-to-highlight",
29
45
  "dark:s-from-highlight-night dark:s-via-highlight-800-night dark:s-via-50% dark:s-to-highlight-night"
30
46
  ),
47
+ warning: cn(
48
+ "s-from-warning-800 s-via-warning-950 s-via-50% s-to-warning-800",
49
+ "dark:s-from-warning-800-night dark:s-via-warning-950-night dark:s-via-50% dark:s-to-warning-800-night"
50
+ ),
51
+ success: cn(
52
+ "s-from-success-800 s-via-success-950 s-via-50% s-to-success-800",
53
+ "dark:s-from-success-800-night dark:s-via-success-950-night dark:s-via-50% dark:s-to-success-800-night"
54
+ ),
55
+ info: cn(
56
+ "s-from-info-800 s-via-info-950 s-via-50% s-to-info-800",
57
+ "dark:s-from-info-800-night dark:s-via-info-950-night dark:s-via-50% dark:s-to-info-800-night"
58
+ ),
59
+ green: cn(
60
+ "s-from-emerald-800 s-via-emerald-950 s-via-50% s-to-emerald-800",
61
+ "dark:s-from-emerald-800-night dark:s-via-emerald-950-night dark:s-via-50% dark:s-to-emerald-800-night"
62
+ ),
63
+ blue: cn(
64
+ "s-from-sky-800 s-via-sky-950 s-via-50% s-to-sky-800",
65
+ "dark:s-from-sky-800-night dark:s-via-sky-950-night dark:s-via-50% dark:s-to-sky-800-night"
66
+ ),
67
+ rose: cn(
68
+ "s-from-rose-800 s-via-rose-950 s-via-50% s-to-rose-800",
69
+ "dark:s-from-rose-800-night dark:s-via-rose-950-night dark:s-via-50% dark:s-to-rose-800-night"
70
+ ),
71
+ golden: cn(
72
+ "s-from-golden-800 s-via-golden-950 s-via-50% s-to-golden-800",
73
+ "dark:s-from-golden-800-night dark:s-via-golden-950-night dark:s-via-50% dark:s-to-golden-800-night"
74
+ ),
75
+ // To be removed
31
76
  emerald: cn(
32
77
  "s-from-emerald-800 s-via-emerald-950 s-via-50% s-to-emerald-800",
33
78
  "dark:s-from-emerald-800-night dark:s-via-emerald-950-night dark:s-via-50% dark:s-to-emerald-800-night"
@@ -36,9 +81,13 @@ const animatedVariants: Record<AnimatedTextVariantType, string> = {
36
81
  "s-from-amber-800 s-via-amber-950 s-via-50% s-to-amber-800",
37
82
  "dark:s-from-amber-800-night dark:s-via-amber-950-night dark:s-via-50% dark:s-to-amber-800-night"
38
83
  ),
39
- white: cn(
40
- "s-from-primary-600 s-via-primary-950 s-via-50% s-to-primary-600",
41
- "dark:s-from-primary-600-night dark:s-via-primary-950-night dark:s-via-50% dark:s-to-primary-600-night"
84
+ red: cn(
85
+ "s-from-red-800 s-via-red-950 s-via-50% s-to-red-800",
86
+ "dark:s-from-red-800-night dark:s-via-red-950-night dark:s-via-50% dark:s-to-red-800-night"
87
+ ),
88
+ sky: cn(
89
+ "s-from-sky-800 s-via-sky-950 s-via-50% s-to-sky-800",
90
+ "dark:s-from-sky-800-night dark:s-via-sky-950-night dark:s-via-50% dark:s-to-sky-800-night"
42
91
  ),
43
92
  slate: cn(
44
93
  "s-from-primary-600 s-via-primary-950 s-via-50% s-to-primary-600",
@@ -48,22 +97,10 @@ const animatedVariants: Record<AnimatedTextVariantType, string> = {
48
97
  "s-from-purple-800 s-via-purple-950 s-via-50% s-to-purple-800",
49
98
  "dark:s-from-purple-800-night dark:s-via-purple-950-night dark:s-via-50% dark:s-to-purple-800-night"
50
99
  ),
51
- warning: cn(
52
- "s-from-warning-800 s-via-warning-950 s-via-50% s-to-warning-800",
53
- "dark:s-from-warning-800-night dark:s-via-warning-950-night dark:s-via-50% dark:s-to-warning-800-night"
54
- ),
55
- sky: cn(
56
- "s-from-sky-800 s-via-sky-950 s-via-50% s-to-sky-800",
57
- "dark:s-from-sky-800-night dark:s-via-sky-950-night dark:s-via-50% dark:s-to-sky-800-night"
58
- ),
59
100
  pink: cn(
60
101
  "s-from-pink-800 s-via-pink-950 s-via-50% s-to-pink-800",
61
102
  "dark:s-from-pink-800-night dark:s-via-pink-950-night dark:s-via-50% dark:s-to-pink-800-night"
62
103
  ),
63
- red: cn(
64
- "s-from-red-800 s-via-red-950 s-via-50% s-to-red-800",
65
- "dark:s-from-red-800-night dark:s-via-red-950-night dark:s-via-50% dark:s-to-red-800-night"
66
- ),
67
104
  };
68
105
 
69
106
  const animVariants = cva(
@@ -79,14 +116,22 @@ const animVariants = cva(
79
116
  );
80
117
 
81
118
  const animatedTextVariants: Record<AnimatedTextVariantType, string> = {
119
+ primary: "s-text-primary-800 dark:s-text-primary-800-night",
120
+ white: "s-text-muted-foreground dark:s-text-muted-foreground-night",
82
121
  muted: "s-text-muted-foreground dark:s-text-muted-foreground-night",
83
122
  highlight: "s-text-highlight dark:s-text-highlight-night",
123
+ success: "s-text-success-800 dark:s-text-success-800-night",
124
+ info: "s-text-info-800 dark:s-text-info-800-night",
125
+ warning: "s-text-warning-800 dark:s-text-warning-800-night",
126
+ green: "s-text-emerald-800 dark:s-text-emerald-800-night",
127
+ blue: "s-text-sky-800 dark:s-text-sky-800-night",
128
+ rose: "s-text-rose-800 dark:s-text-rose-800-night",
129
+ golden: "s-text-golden-800 dark:s-text-rose-golden-night",
130
+ //To be removed
84
131
  emerald: "s-text-emerald-800 dark:s-text-emerald-800-night",
85
132
  amber: "s-text-amber-800 dark:s-text-amber-800-night",
86
133
  slate: "s-text-muted-foreground dark:s-text-muted-foreground-night",
87
- white: "s-text-muted-foreground dark:s-text-muted-foreground-night",
88
134
  purple: "s-text-purple-800 dark:s-text-purple-800-night",
89
- warning: "s-text-warning-800 dark:s-text-warning-800-night",
90
135
  sky: "s-text-sky-800 dark:s-text-sky-800-night",
91
136
  pink: "s-text-pink-800 dark:s-text-pink-800-night",
92
137
  red: "s-text-red-800 dark:s-text-red-800-night",
@@ -106,22 +106,14 @@ const getColor = (name: string) => {
106
106
  hash = name.charCodeAt(i) + ((hash << 5) - hash);
107
107
  }
108
108
  const colors = [
109
+ "s-bg-blue-300",
110
+ "s-bg-violet-300",
111
+ "s-bg-pink-300",
109
112
  "s-bg-red-300",
110
113
  "s-bg-orange-300",
111
- "s-bg-amber-300",
112
- "s-bg-yellow-300",
114
+ "s-bg-golden-300",
113
115
  "s-bg-lime-300",
114
- "s-bg-green-300",
115
116
  "s-bg-emerald-300",
116
- "s-bg-teal-300",
117
- "s-bg-cyan-300",
118
- "s-bg-sky-300",
119
- "s-bg-blue-300",
120
- "s-bg-indigo-300",
121
- "s-bg-violet-300",
122
- "s-bg-purple-300",
123
- "s-bg-fuchsia-300",
124
- "s-bg-rose-300",
125
117
  ];
126
118
  return colors[Math.abs(hash) % colors.length];
127
119
  };
@@ -135,22 +127,14 @@ const getTextVariant = (name: string) => {
135
127
  hash = name.charCodeAt(i) + ((hash << 5) - hash);
136
128
  }
137
129
  const txtColors = [
130
+ "s-text-blue-700",
131
+ "s-text-violet-700",
132
+ "s-text-pink-700",
138
133
  "s-text-red-700",
139
134
  "s-text-orange-700",
140
- "s-text-amber-700",
141
- "s-text-yellow-700",
135
+ "s-text-golden-700",
142
136
  "s-text-lime-700",
143
- "s-text-green-700",
144
137
  "s-text-emerald-700",
145
- "s-text-teal-700",
146
- "s-text-cyan-700",
147
- "s-text-sky-700",
148
- "s-text-blue-700",
149
- "s-text-indigo-700",
150
- "s-text-violet-700",
151
- "s-text-purple-700",
152
- "s-text-fuchsia-700",
153
- "s-text-rose-700",
154
138
  ];
155
139
  return txtColors[Math.abs(hash) % txtColors.length];
156
140
  };
@@ -16,15 +16,23 @@ export const CHIP_SIZES = ["xs", "sm"] as const;
16
16
  type ChipSizeType = (typeof CHIP_SIZES)[number];
17
17
 
18
18
  export const CHIP_COLORS = [
19
+ "primary",
20
+ "white",
21
+ "success",
22
+ "warning",
23
+ "info",
24
+ "highlight",
25
+ "green",
26
+ "blue",
27
+ "rose",
28
+ "golden",
19
29
  "emerald",
20
30
  "amber",
21
31
  "slate",
22
- "purple",
23
- "warning",
24
32
  "sky",
25
33
  "pink",
26
34
  "red",
27
- "white",
35
+ "purple",
28
36
  ] as const;
29
37
 
30
38
  type ChipColorType = (typeof CHIP_COLORS)[number];
@@ -35,6 +43,55 @@ const sizeVariants: Record<ChipSizeType, string> = {
35
43
  };
36
44
 
37
45
  const backgroundVariants: Record<ChipColorType, string> = {
46
+ primary: cn(
47
+ "s-bg-muted-background s-border-border",
48
+ "dark:s-bg-muted-background-night dark:s-border-border-night"
49
+ ),
50
+ white: cn(
51
+ "s-bg-background s-border-border",
52
+ "dark:s-bg-muted-background-night dark:s-border-border-night"
53
+ ),
54
+ highlight: cn(
55
+ "s-bg-highlight-100 s-border-highlight-200",
56
+ "dark:s-bg-highlight-100-night dark:s-border-highlight-200-night"
57
+ ),
58
+ success: cn(
59
+ "s-bg-success-100 s-border-success-200",
60
+ "dark:s-bg-success-100-night dark:s-border-success-200-night"
61
+ ),
62
+ info: cn(
63
+ "s-bg-info-100 s-border-info-200",
64
+ "dark:s-bg-info-100-night dark:s-border-info-200-night"
65
+ ),
66
+ warning: cn(
67
+ "s-bg-warning-100 s-border-warning-200",
68
+ "dark:s-bg-warning-100-night dark:s-border-warning-200-night"
69
+ ),
70
+ green: cn(
71
+ "s-bg-green-100 s-border-green-200",
72
+ "dark:s-bg-green-100-night dark:s-border-green-200-night"
73
+ ),
74
+ blue: cn(
75
+ "s-bg-sky-100 s-border-sky-200",
76
+ "dark:s-bg-sky-100-night dark:s-border-sky-200-night"
77
+ ),
78
+ rose: cn(
79
+ "s-bg-rose-100 s-border-rose-200",
80
+ "dark:s-bg-rose-100-night dark:s-border-rose-200-night"
81
+ ),
82
+ golden: cn(
83
+ "s-bg-golden-100 s-border-golden-200",
84
+ "dark:s-bg-golden-100-night dark:s-border-golden-200-night"
85
+ ),
86
+ // To be removed
87
+ slate: cn(
88
+ "s-bg-muted-background s-border-border",
89
+ "dark:s-bg-muted-background-night dark:s-border-border-night"
90
+ ),
91
+ red: cn(
92
+ "s-bg-red-100 s-border-red-200",
93
+ "dark:s-bg-red-100-night dark:s-border-red-200-night"
94
+ ),
38
95
  emerald: cn(
39
96
  "s-bg-emerald-100 s-border-emerald-200",
40
97
  "dark:s-bg-emerald-100-night dark:s-border-emerald-200-night"
@@ -43,22 +100,10 @@ const backgroundVariants: Record<ChipColorType, string> = {
43
100
  "s-bg-amber-100 s-border-amber-200",
44
101
  "dark:s-bg-amber-100-night dark:s-border-amber-200-night"
45
102
  ),
46
- slate: cn(
47
- "s-bg-muted-background s-border-border",
48
- "dark:s-bg-muted-background-night dark:s-border-border-night"
49
- ),
50
103
  purple: cn(
51
104
  "s-bg-purple-100 s-border-purple-200",
52
105
  "dark:s-bg-purple-100-night dark:s-border-purple-200-night"
53
106
  ),
54
- white: cn(
55
- "s-bg-background s-border-border",
56
- "dark:s-bg-muted-background-night dark:s-border-border-night"
57
- ),
58
- warning: cn(
59
- "s-bg-warning-100 s-border-warning-200",
60
- "dark:s-bg-warning-100-night dark:s-border-warning-200-night"
61
- ),
62
107
  sky: cn(
63
108
  "s-bg-sky-100 s-border-sky-200",
64
109
  "dark:s-bg-sky-100-night dark:s-border-sky-200-night"
@@ -67,22 +112,27 @@ const backgroundVariants: Record<ChipColorType, string> = {
67
112
  "s-bg-pink-100 s-border-pink-200",
68
113
  "dark:s-bg-pink-100-night dark:s-border-pink-200-night"
69
114
  ),
70
- red: cn(
71
- "s-bg-red-100 s-border-red-200",
72
- "dark:s-bg-red-100-night dark:s-border-red-200-night"
73
- ),
74
115
  };
75
116
 
76
117
  const textVariants: Record<ChipColorType, string> = {
118
+ primary: "s-text-primary-900 dark:s-text-primary-900-night",
119
+ white: "s-text-foreground dark:s-text-foreground-night",
120
+ highlight: "s-text-highlight-900 dark:s-text-highlight-900-night",
121
+ success: "s-text-success-900 dark:s-text-success-900-night",
122
+ warning: "s-text-warning-900 dark:s-text-warning-900-night",
123
+ info: "s-text-info-900 dark:s-text-info-900-night",
124
+ green: "s-text-green-900 dark:s-text-green-900-night",
125
+ blue: "s-text-sky-900 dark:s-text-sky-900-night",
126
+ rose: "s-text-rose-900 dark:s-text-rose-900-night",
127
+ golden: "s-text-golden-900 dark:s-text-golden-900-night",
128
+ // To be removed
77
129
  emerald: "s-text-emerald-900 dark:s-text-emerald-900-night",
78
130
  amber: "s-text-amber-900 dark:s-text-amber-900-night",
79
131
  slate: "s-text-foreground dark:s-text-foreground-night",
80
- purple: "s-text-purple-900 dark:s-text-purple-900-night",
81
- warning: "s-text-warning-900 dark:s-text-warning-900-night",
82
132
  sky: "s-text-sky-900 dark:s-text-sky-900-night",
83
133
  pink: "s-text-pink-900 dark:s-text-pink-900-night",
84
134
  red: "s-text-red-900 dark:s-text-red-900-night",
85
- white: "s-text-foreground dark:s-text-foreground-night",
135
+ purple: "s-text-purple-900 dark:s-text-purple-900-night",
86
136
  };
87
137
 
88
138
  const chipVariants = cva("s-inline-flex s-box-border s-items-center", {
@@ -24,7 +24,7 @@ export function ColorPicker<T extends string>({
24
24
  onColorSelect,
25
25
  }: ColorPickerProps<T>) {
26
26
  return (
27
- <div className="s-grid-rows-20 w-auto s-grid s-grid-cols-8 s-gap-1.5 s-rounded s-p-2 s-shadow-lg">
27
+ <div className="s-grid-rows-20 w-auto s-grid s-grid-cols-8 s-gap-1.5 s-rounded s-p-2">
28
28
  {colors.map((color) => {
29
29
  return (
30
30
  <ColorSwatch
@@ -9,11 +9,20 @@ const CONTENT_MESSAGE_VARIANTS = [
9
9
  "amber",
10
10
  "slate",
11
11
  "purple",
12
- "warning",
13
12
  "sky",
14
13
  "pink",
15
14
  "action",
16
15
  "red",
16
+ //New variants
17
+ "primary",
18
+ "warning",
19
+ "success",
20
+ "highlight",
21
+ "info",
22
+ "green",
23
+ "blue",
24
+ "rose",
25
+ "golden",
17
26
  ] as const;
18
27
 
19
28
  type ContentMessageVariantType = (typeof CONTENT_MESSAGE_VARIANTS)[number];
@@ -23,20 +32,38 @@ const CONTENT_MESSAGE_SIZES = ["sm", "md", "lg"] as const;
23
32
  type ContentMessageSizeType = (typeof CONTENT_MESSAGE_SIZES)[number];
24
33
 
25
34
  const contentMessageVariants = cva(
26
- "s-flex s-flex-col s-gap-1 s-rounded-2xl s-p-4",
35
+ "s-flex s-flex-col s-gap-1 s-rounded-2xl s-p-4 s-border",
27
36
  {
28
37
  variants: {
29
38
  variant: {
30
- emerald: "s-bg-green-100 dark:s-bg-green-100-night",
31
- amber: "s-bg-golden-100 dark:s-bg-golden-100-night",
39
+ emerald:
40
+ "s-bg-green-100 dark:s-bg-green-100-night s-border-transparent",
41
+ amber:
42
+ "s-bg-golden-100 dark:s-bg-golden-100-night s-border-transparent",
32
43
  slate:
33
44
  "s-bg-muted-background dark:s-bg-muted-background-night s-border s-border-border dark:s-border-border-night",
34
- purple: "s-bg-purple-100 dark:s-bg-purple-100-night",
35
- warning: "s-bg-warning-100 dark:s-bg-warning-100-night",
36
- sky: "s-bg-sky-100 dark:s-bg-sky-100-night",
37
- pink: "s-bg-pink-100 dark:s-bg-pink-100-night",
38
- action: "s-bg-highlight-100 dark:s-bg-highlight-100-night",
39
- red: "s-bg-red-100 dark:s-bg-red-100-night",
45
+ purple:
46
+ "s-bg-purple-100 dark:s-bg-purple-100-night s-border-transparent",
47
+ sky: "s-bg-sky-100 dark:s-bg-sky-100-night s-border-transparent",
48
+ pink: "s-bg-pink-100 dark:s-bg-pink-100-night s-border-transparent",
49
+ action:
50
+ "s-bg-highlight-100 dark:s-bg-highlight-100-night s-border-transparent",
51
+ red: "s-bg-red-100 dark:s-bg-red-100-night s-border-transparent",
52
+ // tbr
53
+ primary:
54
+ "s-bg-muted-background dark:s-bg-muted-background-night s-border-border dark:s-border-border-night",
55
+ success:
56
+ "s-bg-success-100 dark:s-bg-success-100-night s-border-transparent",
57
+ warning:
58
+ "s-bg-warning-100 dark:s-bg-warning-100-night s-border-transparent",
59
+ highlight:
60
+ "s-bg-highlight-100 dark:s-bg-highlight-100-night s-border-transparent",
61
+ info: "s-bg-info-100 dark:s-bg-info-100-night s-border-transparent",
62
+ green: "s-bg-green-100 dark:s-bg-green-100-night s-border-transparent",
63
+ blue: "s-bg-blue-100 dark:s-bg-blue-100-night s-border-transparent",
64
+ rose: "s-bg-rose-100 dark:s-bg-rose-100-night s-border-transparent",
65
+ golden:
66
+ "s-bg-golden-100 dark:s-bg-golden-100-night s-border-transparent",
40
67
  },
41
68
  size: {
42
69
  lg: "",
@@ -45,7 +72,7 @@ const contentMessageVariants = cva(
45
72
  },
46
73
  },
47
74
  defaultVariants: {
48
- variant: "amber",
75
+ variant: "info",
49
76
  size: "md",
50
77
  },
51
78
  }
@@ -58,11 +85,20 @@ const iconVariants = cva("s-shrink-0", {
58
85
  amber: "s-text-golden-800 dark:s-text-golden-800-night",
59
86
  slate: "s-text-primary-800 dark:s-text-primary-800-night",
60
87
  purple: "s-text-purple-800 dark:s-text-purple-800-night",
61
- warning: "s-text-warning-800 dark:s-text-warning-800-night",
62
88
  sky: "s-text-sky-800 dark:s-text-sky-800-night",
63
89
  pink: "s-text-pink-800 dark:s-text-pink-800-night",
64
90
  action: "s-text-highlight-800 dark:s-text-highlight-800-night",
65
91
  red: "s-text-red-800 dark:s-text-red-800-night",
92
+ // tbr
93
+ primary: "s-text-primary-800 dark:s-text-primary-800-night",
94
+ warning: "s-text-warning-800 dark:s-text-warning-800-night",
95
+ success: "s-text-success-800 dark:s-text-success-800-night",
96
+ highlight: "s-text-highlight-800 dark:s-text-highlight-800-night",
97
+ info: "s-text-info-800 dark:s-text-info-800-night",
98
+ green: "s-text-green-800 dark:s-text-green-800-night",
99
+ blue: "s-text-blue-800 dark:s-text-blue-800-night",
100
+ rose: "s-text-rose-800 dark:s-text-rose-800-night",
101
+ golden: "s-text-golden-800 dark:s-text-golden-800-night",
66
102
  },
67
103
  },
68
104
  });
@@ -74,11 +110,20 @@ const titleVariants = cva("s-text-sm s-font-semibold", {
74
110
  amber: "s-text-golden-800 dark:s-text-golden-800-night",
75
111
  slate: "s-text-foreground dark:s-text-foreground-night",
76
112
  purple: "s-text-purple-800 dark:s-text-purple-800-night",
77
- warning: "s-text-warning-800 dark:s-text-warning-800-night",
78
113
  sky: "s-text-sky-800 dark:s-text-sky-800-night",
79
114
  pink: "s-text-pink-800 dark:s-text-pink-800-night",
80
115
  action: "s-text-highlight-800 dark:s-text-highlight-800-night",
81
116
  red: "s-text-red-800 dark:s-text-red-800-night",
117
+ // tbr
118
+ primary: "s-text-foreground dark:s-text-foreground-night",
119
+ warning: "s-text-warning-800 dark:s-text-warning-800-night",
120
+ success: "s-text-success-800 dark:s-text-success-800-night",
121
+ highlight: "s-text-highlight-800 dark:s-text-highlight-800-night",
122
+ info: "s-text-info-800 dark:s-text-info-800-night",
123
+ green: "s-text-green-800 dark:s-text-green-800-night",
124
+ blue: "s-text-blue-800 dark:s-text-blue-800-night",
125
+ rose: "s-text-rose-800 dark:s-text-rose-800-night",
126
+ golden: "s-text-golden-800 dark:s-text-golden-800-night",
82
127
  },
83
128
  },
84
129
  });
@@ -90,11 +135,20 @@ const textVariants = cva("s-text-sm", {
90
135
  amber: "s-text-golden-950 dark:s-text-golden-950-night",
91
136
  slate: "s-text-muted-foreground dark:s-text-muted-foreground-night",
92
137
  purple: "s-text-purple-950 dark:s-text-purple-950-night",
93
- warning: "s-text-warning-950 dark:s-text-warning-950-night",
94
138
  sky: "s-text-sky-950 dark:s-text-sky-950-night",
95
139
  pink: "s-text-pink-950 dark:s-text-pink-950-night",
96
140
  action: "s-text-highlight-950 dark:s-text-highlight-950-night",
97
141
  red: "s-text-red-950 dark:s-text-red-950-night",
142
+ // tbr
143
+ primary: "s-text-muted-foreground dark:s-text-muted-foreground-night",
144
+ warning: "s-text-warning-950 dark:s-text-warning-950-night",
145
+ success: "s-text-success-950 dark:s-text-success-950-night",
146
+ highlight: "s-text-highlight-950 dark:s-text-highlight-950-night",
147
+ info: "s-text-info-950 dark:s-text-info-950-night",
148
+ green: "s-text-green-950 dark:s-text-green-950-night",
149
+ blue: "s-text-blue-950 dark:s-text-blue-950-night",
150
+ rose: "s-text-rose-950 dark:s-text-rose-950-night",
151
+ golden: "s-text-golden-950 dark:s-text-golden-950-night",
98
152
  },
99
153
  },
100
154
  });
@@ -8,6 +8,8 @@ import {
8
8
  getPaginationRowModel,
9
9
  getSortedRowModel,
10
10
  PaginationState,
11
+ Row,
12
+ RowSelectionState,
11
13
  type SortingState,
12
14
  Updater,
13
15
  useReactTable,
@@ -18,6 +20,7 @@ import React, { ReactNode, useEffect, useRef, useState } from "react";
18
20
  import {
19
21
  Avatar,
20
22
  Button,
23
+ Checkbox,
21
24
  DropdownMenu,
22
25
  DropdownMenuContent,
23
26
  DropdownMenuGroup,
@@ -95,6 +98,9 @@ interface DataTableProps<TData extends TBaseData> {
95
98
  setSorting?: (sorting: SortingState) => void;
96
99
  isServerSideSorting?: boolean;
97
100
  disablePaginationNumbers?: boolean;
101
+ rowSelection?: RowSelectionState;
102
+ setRowSelection?: (rowSelection: RowSelectionState) => void;
103
+ enableRowSelection?: boolean | ((row: Row<TData>) => boolean);
98
104
  }
99
105
 
100
106
  export function DataTable<TData extends TBaseData>({
@@ -113,6 +119,9 @@ export function DataTable<TData extends TBaseData>({
113
119
  setSorting,
114
120
  isServerSideSorting = false,
115
121
  disablePaginationNumbers = false,
122
+ rowSelection,
123
+ setRowSelection,
124
+ enableRowSelection = false,
116
125
  }: DataTableProps<TData>) {
117
126
  const windowSize = useWindowSize();
118
127
 
@@ -140,6 +149,15 @@ export function DataTable<TData extends TBaseData>({
140
149
  }
141
150
  : undefined;
142
151
 
152
+ const onRowSelectionChange =
153
+ rowSelection && setRowSelection
154
+ ? (updater: Updater<RowSelectionState>) => {
155
+ const newValue =
156
+ typeof updater === "function" ? updater(rowSelection) : updater;
157
+ setRowSelection(newValue);
158
+ }
159
+ : undefined;
160
+
143
161
  const table = useReactTable({
144
162
  data,
145
163
  columns,
@@ -157,17 +175,20 @@ export function DataTable<TData extends TBaseData>({
157
175
  getFilteredRowModel: getFilteredRowModel(),
158
176
  getPaginationRowModel: pagination ? getPaginationRowModel() : undefined,
159
177
  onColumnFiltersChange: setColumnFilters,
178
+ onRowSelectionChange,
160
179
  state: {
161
180
  columnFilters,
162
181
  ...(isServerSideSorting && {
163
182
  sorting,
164
183
  }),
165
184
  pagination,
185
+ rowSelection,
166
186
  },
167
187
  initialState: {
168
188
  sorting,
169
189
  },
170
190
  onPaginationChange,
191
+ enableRowSelection,
171
192
  });
172
193
 
173
194
  useEffect(() => {
@@ -235,6 +256,7 @@ export function DataTable<TData extends TBaseData>({
235
256
  widthClassName={widthClassName}
236
257
  key={row.id}
237
258
  onClick={row.original.onClick}
259
+ data-selected={row.getIsSelected()}
238
260
  >
239
261
  {row.getVisibleCells().map((cell) => {
240
262
  const breakpoint = columnsBreakpoints[cell.column.id];
@@ -291,6 +313,9 @@ export function ScrollableDataTable<TData extends TBaseData>({
291
313
  maxHeight = "s-h-100",
292
314
  onLoadMore,
293
315
  isLoading = false,
316
+ rowSelection,
317
+ setRowSelection,
318
+ enableRowSelection,
294
319
  }: ScrollableDataTableProps<TData>) {
295
320
  const windowSize = useWindowSize();
296
321
  const tableContainerRef = useRef<HTMLDivElement>(null);
@@ -316,12 +341,26 @@ export function ScrollableDataTable<TData extends TBaseData>({
316
341
  };
317
342
  }, []);
318
343
 
344
+ const onRowSelectionChange =
345
+ rowSelection && setRowSelection
346
+ ? (updater: Updater<RowSelectionState>) => {
347
+ const newValue =
348
+ typeof updater === "function" ? updater(rowSelection) : updater;
349
+ setRowSelection(newValue);
350
+ }
351
+ : undefined;
352
+
319
353
  const table = useReactTable({
320
354
  data,
321
355
  columns,
322
356
  rowCount: totalRowCount,
323
357
  getCoreRowModel: getCoreRowModel(),
324
358
  enableColumnResizing: true,
359
+ onRowSelectionChange,
360
+ enableRowSelection,
361
+ state: {
362
+ rowSelection,
363
+ },
325
364
  });
326
365
 
327
366
  useEffect(() => {
@@ -466,6 +505,7 @@ export function ScrollableDataTable<TData extends TBaseData>({
466
505
  widthClassName={widthClassName}
467
506
  onClick={row.original.onClick}
468
507
  className="s-absolute s-w-full"
508
+ data-selected={row.getIsSelected()}
469
509
  style={{
470
510
  transform: `translateY(${virtualRow.start}px)`,
471
511
  }}
@@ -616,6 +656,7 @@ interface RowProps extends React.HTMLAttributes<HTMLTableRowElement> {
616
656
  children: ReactNode;
617
657
  onClick?: () => void;
618
658
  widthClassName: string;
659
+ "data-selected"?: boolean;
619
660
  }
620
661
 
621
662
  DataTable.Row = function Row({
@@ -633,6 +674,8 @@ DataTable.Row = function Row({
633
674
  onClick
634
675
  ? "s-cursor-pointer hover:s-bg-muted dark:hover:s-bg-muted-night"
635
676
  : "",
677
+ props["data-selected"] &&
678
+ "s-bg-highlight-50 dark:s-bg-highlight-900/10",
636
679
  widthClassName,
637
680
  className
638
681
  )}
@@ -1013,3 +1056,47 @@ DataTable.Caption = function Caption({
1013
1056
  </caption>
1014
1057
  );
1015
1058
  };
1059
+
1060
+ export function createSelectionColumn<TData>(): ColumnDef<TData> {
1061
+ return {
1062
+ id: "select",
1063
+ enableSorting: false,
1064
+ enableHiding: false,
1065
+ header: ({ table }) => (
1066
+ <Checkbox
1067
+ size="xs"
1068
+ checked={
1069
+ table.getIsAllRowsSelected()
1070
+ ? true
1071
+ : table.getIsSomeRowsSelected()
1072
+ ? "partial"
1073
+ : false
1074
+ }
1075
+ onCheckedChange={(state) => {
1076
+ if (state === "indeterminate") {
1077
+ return;
1078
+ }
1079
+ table.toggleAllRowsSelected(state);
1080
+ }}
1081
+ />
1082
+ ),
1083
+ cell: ({ row }) => (
1084
+ <div className="s-flex s-h-full s-w-full s-items-center">
1085
+ <Checkbox
1086
+ size="xs"
1087
+ checked={row.getIsSelected()}
1088
+ disabled={!row.getCanSelect()}
1089
+ onCheckedChange={(state) => {
1090
+ if (state === "indeterminate") {
1091
+ return;
1092
+ }
1093
+ row.toggleSelected(state);
1094
+ }}
1095
+ />
1096
+ </div>
1097
+ ),
1098
+ meta: {
1099
+ className: "s-w-10",
1100
+ },
1101
+ };
1102
+ }