@dust-tt/sparkle 0.2.455 → 0.2.457
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/dist/cjs/index.js +1 -1
- package/dist/esm/components/DataTable.d.ts +8 -3
- package/dist/esm/components/DataTable.d.ts.map +1 -1
- package/dist/esm/components/DataTable.js +61 -10
- package/dist/esm/components/DataTable.js.map +1 -1
- package/dist/esm/components/DoubleIcon.d.ts +15 -0
- package/dist/esm/components/DoubleIcon.d.ts.map +1 -0
- package/dist/esm/components/DoubleIcon.js +26 -0
- package/dist/esm/components/DoubleIcon.js.map +1 -0
- package/dist/esm/components/Dropdown.d.ts.map +1 -1
- package/dist/esm/components/Dropdown.js +8 -4
- package/dist/esm/components/Dropdown.js.map +1 -1
- package/dist/esm/components/index.d.ts +1 -1
- package/dist/esm/components/index.d.ts.map +1 -1
- package/dist/esm/components/index.js +1 -1
- package/dist/esm/components/index.js.map +1 -1
- package/dist/esm/stories/DataTable.stories.d.ts +1 -0
- package/dist/esm/stories/DataTable.stories.d.ts.map +1 -1
- package/dist/esm/stories/DataTable.stories.js +27 -3
- package/dist/esm/stories/DataTable.stories.js.map +1 -1
- package/dist/esm/stories/DoubleIcon.stories.d.ts +8 -0
- package/dist/esm/stories/DoubleIcon.stories.d.ts.map +1 -0
- package/dist/esm/stories/DoubleIcon.stories.js +97 -0
- package/dist/esm/stories/DoubleIcon.stories.js.map +1 -0
- package/dist/sparkle.css +29 -21
- package/package.json +1 -1
- package/src/components/DataTable.tsx +87 -0
- package/src/components/DoubleIcon.tsx +43 -0
- package/src/components/Dropdown.tsx +18 -6
- package/src/components/index.ts +1 -1
- package/src/stories/DataTable.stories.tsx +60 -2
- package/src/stories/DoubleIcon.stories.tsx +163 -0
- package/dist/esm/components/IconToggleButton.d.ts +0 -17
- package/dist/esm/components/IconToggleButton.d.ts.map +0 -1
- package/dist/esm/components/IconToggleButton.js +0 -37
- package/dist/esm/components/IconToggleButton.js.map +0 -1
- package/dist/esm/stories/IconToggleButton.stories.d.ts +0 -11
- package/dist/esm/stories/IconToggleButton.stories.d.ts.map +0 -1
- package/dist/esm/stories/IconToggleButton.stories.js +0 -24
- package/dist/esm/stories/IconToggleButton.stories.js.map +0 -1
- package/src/components/IconToggleButton.tsx +0 -106
- package/src/stories/IconToggleButton.stories.tsx +0 -30
|
@@ -2,6 +2,7 @@ import type { Meta } from "@storybook/react";
|
|
|
2
2
|
import {
|
|
3
3
|
ColumnDef,
|
|
4
4
|
PaginationState,
|
|
5
|
+
RowSelectionState,
|
|
5
6
|
SortingState,
|
|
6
7
|
} from "@tanstack/react-table";
|
|
7
8
|
import React, { useCallback, useMemo, useState } from "react";
|
|
@@ -19,7 +20,7 @@ import {
|
|
|
19
20
|
Input,
|
|
20
21
|
ScrollableDataTable,
|
|
21
22
|
} from "@sparkle/components/";
|
|
22
|
-
import { MenuItem } from "@sparkle/components/DataTable";
|
|
23
|
+
import { createSelectionColumn, MenuItem } from "@sparkle/components/DataTable";
|
|
23
24
|
import { FolderIcon } from "@sparkle/icons";
|
|
24
25
|
|
|
25
26
|
const meta = {
|
|
@@ -45,6 +46,7 @@ type Data = {
|
|
|
45
46
|
React.ComponentPropsWithoutRef<typeof DropdownMenu>,
|
|
46
47
|
"modal"
|
|
47
48
|
>;
|
|
49
|
+
id?: number;
|
|
48
50
|
roundedAvatar?: boolean;
|
|
49
51
|
};
|
|
50
52
|
|
|
@@ -529,6 +531,7 @@ const createData = (start: number, count: number) => {
|
|
|
529
531
|
return Array(count)
|
|
530
532
|
.fill(0)
|
|
531
533
|
.map((_, i) => ({
|
|
534
|
+
id: i,
|
|
532
535
|
name: `Item ${start + i + 1}`,
|
|
533
536
|
usedBy: Math.floor(Math.random() * 100),
|
|
534
537
|
addedBy: `UserUserUserUserUserUserUserUserUserUserUser ${Math.floor(Math.random() * 10) + 1}`,
|
|
@@ -542,6 +545,7 @@ const createData = (start: number, count: number) => {
|
|
|
542
545
|
|
|
543
546
|
export const ScrollableDataTableExample = () => {
|
|
544
547
|
const [filter, setFilter] = useState("");
|
|
548
|
+
const [rowSelection, setRowSelection] = useState<RowSelectionState>({});
|
|
545
549
|
const [data, setData] = useState(() => createData(0, 50));
|
|
546
550
|
const [isLoading, setIsLoading] = useState(false);
|
|
547
551
|
|
|
@@ -559,6 +563,11 @@ export const ScrollableDataTableExample = () => {
|
|
|
559
563
|
const columnsWithSize = columns.map((column, index) => {
|
|
560
564
|
return { ...column, meta: { sizeRatio: index % 2 === 0 ? 15 : 10 } };
|
|
561
565
|
});
|
|
566
|
+
|
|
567
|
+
const columnsWithSelection: ColumnDef<Data>[] = useMemo(
|
|
568
|
+
() => [createSelectionColumn<Data>(), ...columnsWithSize],
|
|
569
|
+
[]
|
|
570
|
+
);
|
|
562
571
|
return (
|
|
563
572
|
<div className="s-flex s-w-full s-max-w-4xl s-flex-col s-gap-6">
|
|
564
573
|
<h3 className="s-text-lg s-font-medium">
|
|
@@ -577,10 +586,13 @@ export const ScrollableDataTableExample = () => {
|
|
|
577
586
|
data={data}
|
|
578
587
|
filter={filter}
|
|
579
588
|
filterColumn="name"
|
|
580
|
-
columns={
|
|
589
|
+
columns={columnsWithSelection}
|
|
581
590
|
onLoadMore={loadMore}
|
|
582
591
|
isLoading={isLoading}
|
|
583
592
|
maxHeight="s-max-h-[500px]"
|
|
593
|
+
rowSelection={rowSelection}
|
|
594
|
+
setRowSelection={setRowSelection}
|
|
595
|
+
enableRowSelection={true}
|
|
584
596
|
/>
|
|
585
597
|
|
|
586
598
|
<div className="s-text-sm s-text-muted-foreground">
|
|
@@ -590,3 +602,49 @@ export const ScrollableDataTableExample = () => {
|
|
|
590
602
|
</div>
|
|
591
603
|
);
|
|
592
604
|
};
|
|
605
|
+
|
|
606
|
+
export const DataTableWithRowSelectionExample = () => {
|
|
607
|
+
const [rowSelection, setRowSelection] = useState<RowSelectionState>({});
|
|
608
|
+
const [data] = useState<Data[]>(() => createData(0, 10));
|
|
609
|
+
const [filter, setFilter] = useState("");
|
|
610
|
+
|
|
611
|
+
const columnsWithSelection: ColumnDef<Data>[] = useMemo(
|
|
612
|
+
() => [createSelectionColumn<Data>(), ...columns],
|
|
613
|
+
[]
|
|
614
|
+
);
|
|
615
|
+
|
|
616
|
+
return (
|
|
617
|
+
<div className="s-flex s-w-full s-max-w-4xl s-flex-col s-gap-6">
|
|
618
|
+
<h3 className="s-text-lg s-font-medium">DataTable with Row Selection</h3>
|
|
619
|
+
|
|
620
|
+
<div className="s-flex s-flex-col s-gap-4">
|
|
621
|
+
<Input
|
|
622
|
+
name="filter"
|
|
623
|
+
placeholder="Filter"
|
|
624
|
+
value={filter}
|
|
625
|
+
onChange={(e) => setFilter(e.target.value)}
|
|
626
|
+
/>
|
|
627
|
+
|
|
628
|
+
<DataTable
|
|
629
|
+
data={data}
|
|
630
|
+
filter={filter}
|
|
631
|
+
filterColumn="name"
|
|
632
|
+
columns={columnsWithSelection}
|
|
633
|
+
rowSelection={rowSelection}
|
|
634
|
+
setRowSelection={setRowSelection}
|
|
635
|
+
enableRowSelection={true}
|
|
636
|
+
/>
|
|
637
|
+
|
|
638
|
+
<div className="s-rounded-md s-border s-bg-muted/50 s-p-2">
|
|
639
|
+
<h4 className="s-mb-2 s-font-medium">Selection State:</h4>
|
|
640
|
+
<pre className="s-overflow-auto s-text-xs">
|
|
641
|
+
{JSON.stringify(rowSelection, null, 2)}
|
|
642
|
+
</pre>
|
|
643
|
+
<p className="s-mt-2 s-text-sm">
|
|
644
|
+
Selected {Object.keys(rowSelection).length} of {data.length} rows
|
|
645
|
+
</p>
|
|
646
|
+
</div>
|
|
647
|
+
</div>
|
|
648
|
+
</div>
|
|
649
|
+
);
|
|
650
|
+
};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import type { Meta } from "@storybook/react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
import { DoubleIcon } from "@sparkle/components";
|
|
5
|
+
import {
|
|
6
|
+
ChatBubbleBottomCenterTextIcon,
|
|
7
|
+
CheckCircleIcon,
|
|
8
|
+
DocumentIcon,
|
|
9
|
+
FolderIcon,
|
|
10
|
+
HeartIcon,
|
|
11
|
+
PlusIcon,
|
|
12
|
+
SparklesIcon,
|
|
13
|
+
StarIcon,
|
|
14
|
+
UserIcon,
|
|
15
|
+
} from "@sparkle/icons";
|
|
16
|
+
import { SlackLogo } from "@sparkle/logo";
|
|
17
|
+
|
|
18
|
+
const meta = {
|
|
19
|
+
title: "Primitives/DoubleIcon",
|
|
20
|
+
component: DoubleIcon,
|
|
21
|
+
} satisfies Meta<typeof DoubleIcon>;
|
|
22
|
+
|
|
23
|
+
export default meta;
|
|
24
|
+
|
|
25
|
+
export const IconPositions = () => (
|
|
26
|
+
<div className="s-flex s-flex-col s-gap-8">
|
|
27
|
+
<div className="s-flex s-items-center s-gap-16">
|
|
28
|
+
<div className="s-flex s-flex-col s-items-center s-gap-2">
|
|
29
|
+
<DoubleIcon
|
|
30
|
+
mainIconProps={{
|
|
31
|
+
visual: ChatBubbleBottomCenterTextIcon,
|
|
32
|
+
size: "md",
|
|
33
|
+
className: "s-text-primary-500",
|
|
34
|
+
}}
|
|
35
|
+
secondaryIconProps={{
|
|
36
|
+
visual: CheckCircleIcon,
|
|
37
|
+
size: "xs",
|
|
38
|
+
className: "s-text-success-500",
|
|
39
|
+
}}
|
|
40
|
+
position="bottom-right"
|
|
41
|
+
/>
|
|
42
|
+
<span className="s-text-xs s-text-muted-foreground">bottom-right</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<div className="s-flex s-flex-col s-items-center s-gap-2">
|
|
46
|
+
<DoubleIcon
|
|
47
|
+
mainIconProps={{
|
|
48
|
+
visual: ChatBubbleBottomCenterTextIcon,
|
|
49
|
+
size: "md",
|
|
50
|
+
className: "s-text-primary-500",
|
|
51
|
+
}}
|
|
52
|
+
secondaryIconProps={{
|
|
53
|
+
visual: CheckCircleIcon,
|
|
54
|
+
size: "xs",
|
|
55
|
+
className: "s-text-success-500",
|
|
56
|
+
}}
|
|
57
|
+
position="top-right"
|
|
58
|
+
/>
|
|
59
|
+
<span className="s-text-xs s-text-muted-foreground">top-right</span>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div className="s-flex s-flex-col s-items-center s-gap-2">
|
|
63
|
+
<DoubleIcon
|
|
64
|
+
mainIconProps={{
|
|
65
|
+
visual: ChatBubbleBottomCenterTextIcon,
|
|
66
|
+
size: "md",
|
|
67
|
+
className: "s-text-primary-500",
|
|
68
|
+
}}
|
|
69
|
+
secondaryIconProps={{
|
|
70
|
+
visual: CheckCircleIcon,
|
|
71
|
+
size: "xs",
|
|
72
|
+
className: "s-text-success-500",
|
|
73
|
+
}}
|
|
74
|
+
position="bottom-left"
|
|
75
|
+
/>
|
|
76
|
+
<span className="s-text-xs s-text-muted-foreground">bottom-left</span>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<div className="s-flex s-flex-col s-items-center s-gap-2">
|
|
80
|
+
<DoubleIcon
|
|
81
|
+
mainIconProps={{
|
|
82
|
+
visual: ChatBubbleBottomCenterTextIcon,
|
|
83
|
+
size: "md",
|
|
84
|
+
className: "s-text-primary-500",
|
|
85
|
+
}}
|
|
86
|
+
secondaryIconProps={{
|
|
87
|
+
visual: CheckCircleIcon,
|
|
88
|
+
size: "xs",
|
|
89
|
+
className: "s-text-success-500",
|
|
90
|
+
}}
|
|
91
|
+
position="top-left"
|
|
92
|
+
/>
|
|
93
|
+
<span className="s-text-xs s-text-muted-foreground">top-left</span>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
<div className="s-flex s-items-center s-gap-16">
|
|
98
|
+
<div className="s-flex s-flex-col s-items-center s-gap-2">
|
|
99
|
+
<DoubleIcon
|
|
100
|
+
mainIconProps={{
|
|
101
|
+
visual: DocumentIcon,
|
|
102
|
+
size: "md",
|
|
103
|
+
className: "s-text-blue-500",
|
|
104
|
+
}}
|
|
105
|
+
secondaryIconProps={{
|
|
106
|
+
visual: PlusIcon,
|
|
107
|
+
size: "xs",
|
|
108
|
+
className: "s-text-highlight-500",
|
|
109
|
+
}}
|
|
110
|
+
position="bottom-right"
|
|
111
|
+
/>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<div className="s-flex s-flex-col s-items-center s-gap-2">
|
|
115
|
+
<DoubleIcon
|
|
116
|
+
mainIconProps={{
|
|
117
|
+
visual: UserIcon,
|
|
118
|
+
size: "md",
|
|
119
|
+
className: "s-text-purple-500",
|
|
120
|
+
}}
|
|
121
|
+
secondaryIconProps={{
|
|
122
|
+
visual: StarIcon,
|
|
123
|
+
size: "xs",
|
|
124
|
+
className: "s-text-golden-500",
|
|
125
|
+
}}
|
|
126
|
+
position="top-right"
|
|
127
|
+
/>
|
|
128
|
+
</div>
|
|
129
|
+
|
|
130
|
+
<div className="s-flex s-flex-col s-items-center s-gap-2">
|
|
131
|
+
<DoubleIcon
|
|
132
|
+
mainIconProps={{
|
|
133
|
+
visual: SlackLogo,
|
|
134
|
+
size: "md",
|
|
135
|
+
className: "s-text-green-500",
|
|
136
|
+
}}
|
|
137
|
+
secondaryIconProps={{
|
|
138
|
+
visual: FolderIcon,
|
|
139
|
+
size: "sm",
|
|
140
|
+
className: "s-text-red-500",
|
|
141
|
+
}}
|
|
142
|
+
position="bottom-right"
|
|
143
|
+
/>
|
|
144
|
+
</div>
|
|
145
|
+
|
|
146
|
+
<div className="s-flex s-flex-col s-items-center s-gap-2">
|
|
147
|
+
<DoubleIcon
|
|
148
|
+
mainIconProps={{
|
|
149
|
+
visual: HeartIcon,
|
|
150
|
+
size: "md",
|
|
151
|
+
className: "s-text-red-500",
|
|
152
|
+
}}
|
|
153
|
+
secondaryIconProps={{
|
|
154
|
+
visual: SparklesIcon,
|
|
155
|
+
size: "xs",
|
|
156
|
+
className: "s-text-golden-500",
|
|
157
|
+
}}
|
|
158
|
+
position="top-left"
|
|
159
|
+
/>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
);
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import React, { ComponentType, MouseEventHandler } from "react";
|
|
2
|
-
import { Tooltip } from "./Tooltip";
|
|
3
|
-
type IconToggleButtonProps = {
|
|
4
|
-
variant?: "secondary" | "tertiary";
|
|
5
|
-
onClick?: MouseEventHandler<HTMLButtonElement>;
|
|
6
|
-
size?: "xs" | "sm" | "md";
|
|
7
|
-
tooltip?: string;
|
|
8
|
-
tooltipPosition?: React.ComponentProps<typeof Tooltip>["side"];
|
|
9
|
-
icon: ComponentType;
|
|
10
|
-
iconSelected?: ComponentType;
|
|
11
|
-
className?: string;
|
|
12
|
-
disabled?: boolean;
|
|
13
|
-
selected?: boolean;
|
|
14
|
-
};
|
|
15
|
-
export declare function IconToggleButton({ variant, onClick, disabled, tooltip, tooltipPosition, icon, iconSelected, className, selected, size, }: IconToggleButtonProps): React.JSX.Element;
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=IconToggleButton.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IconToggleButton.d.ts","sourceRoot":"","sources":["../../../src/components/IconToggleButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAKhE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,KAAK,qBAAqB,GAAG;IAC3B,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;IACnC,OAAO,CAAC,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,EAAE,aAAa,CAAC;IACpB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAkCF,wBAAgB,gBAAgB,CAAC,EAC/B,OAAoB,EACpB,OAAO,EACP,QAAgB,EAChB,OAAO,EACP,eAAuB,EACvB,IAAI,EACJ,YAAY,EACZ,SAAc,EACd,QAAgB,EAChB,IAAW,GACZ,EAAE,qBAAqB,qBA0CvB"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { classNames, cn } from "../lib/utils";
|
|
3
|
-
import { Icon } from "./Icon";
|
|
4
|
-
import { Tooltip } from "./Tooltip";
|
|
5
|
-
var baseClasses = "s-transition-all s-ease-out s-duration-300 s-cursor-pointer hover:s-scale-110";
|
|
6
|
-
var iconClasses = {
|
|
7
|
-
secondary: {
|
|
8
|
-
idle: cn("s-text-foreground", "dark:s-text-foreground-night"),
|
|
9
|
-
selected: cn("s-text-highlight-500", "dark:s-text-highlight-500-night"),
|
|
10
|
-
hover: cn("hover:s-text-highlight-400", "dark:hover:s-text-highlight-400-night"),
|
|
11
|
-
active: cn("active:s-text-highlight-600", "dark:active:s-text-highlight-600-night"),
|
|
12
|
-
disabled: cn("s-text-primary-500", "dark:s-text-primary-500-night"),
|
|
13
|
-
},
|
|
14
|
-
tertiary: {
|
|
15
|
-
idle: cn("s-text-primary-600", "dark:s-text-primary-600-night"),
|
|
16
|
-
selected: cn("s-text-highlight-500", "dark:s-text-highlight-500-night"),
|
|
17
|
-
hover: cn("hover:s-text-highlight-400", "dark:hover:s-text-highlight-400-night"),
|
|
18
|
-
active: cn("active:s-text-highlight-600", "dark:active:s-text-highlight-600-night"),
|
|
19
|
-
disabled: cn("s-text-primary-500", "dark:s-text-primary-500-night"),
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
export function IconToggleButton(_a) {
|
|
23
|
-
var _b = _a.variant, variant = _b === void 0 ? "tertiary" : _b, onClick = _a.onClick, _c = _a.disabled, disabled = _c === void 0 ? false : _c, tooltip = _a.tooltip, _d = _a.tooltipPosition, tooltipPosition = _d === void 0 ? "top" : _d, icon = _a.icon, iconSelected = _a.iconSelected, _e = _a.className, className = _e === void 0 ? "" : _e, _f = _a.selected, selected = _f === void 0 ? false : _f, _g = _a.size, size = _g === void 0 ? "sm" : _g;
|
|
24
|
-
var iconGroup = iconClasses[variant];
|
|
25
|
-
var finalIconClasses = classNames(className, baseClasses, disabled
|
|
26
|
-
? iconGroup.disabled
|
|
27
|
-
: selected
|
|
28
|
-
? iconGroup.selected
|
|
29
|
-
: iconGroup.idle, disabled ? "" : selected ? "" : iconGroup.hover, disabled ? "" : iconGroup.active);
|
|
30
|
-
var IconButtonToggleContent = (React.createElement("button", { className: finalIconClasses, onClick: function (e) {
|
|
31
|
-
if (!disabled) {
|
|
32
|
-
onClick === null || onClick === void 0 ? void 0 : onClick(e); // Run passed onClick event
|
|
33
|
-
}
|
|
34
|
-
}, disabled: disabled }, icon && (React.createElement(Icon, { visual: selected && iconSelected ? iconSelected : icon, size: size }))));
|
|
35
|
-
return tooltip ? (React.createElement(Tooltip, { trigger: IconButtonToggleContent, label: tooltip, side: tooltipPosition })) : (IconButtonToggleContent);
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=IconToggleButton.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IconToggleButton.js","sourceRoot":"","sources":["../../../src/components/IconToggleButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,IAAI,EAAa,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,IAAM,WAAW,GACf,+EAA+E,CAAC;AAElF,IAAM,WAAW,GAAG;IAClB,SAAS,EAAE;QACT,IAAI,EAAE,EAAE,CAAC,mBAAmB,EAAE,8BAA8B,CAAC;QAC7D,QAAQ,EAAE,EAAE,CAAC,sBAAsB,EAAE,iCAAiC,CAAC;QACvE,KAAK,EAAE,EAAE,CACP,4BAA4B,EAC5B,uCAAuC,CACxC;QACD,MAAM,EAAE,EAAE,CACR,6BAA6B,EAC7B,wCAAwC,CACzC;QACD,QAAQ,EAAE,EAAE,CAAC,oBAAoB,EAAE,+BAA+B,CAAC;KACpE;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,EAAE,CAAC,oBAAoB,EAAE,+BAA+B,CAAC;QAC/D,QAAQ,EAAE,EAAE,CAAC,sBAAsB,EAAE,iCAAiC,CAAC;QACvE,KAAK,EAAE,EAAE,CACP,4BAA4B,EAC5B,uCAAuC,CACxC;QACD,MAAM,EAAE,EAAE,CACR,6BAA6B,EAC7B,wCAAwC,CACzC;QACD,QAAQ,EAAE,EAAE,CAAC,oBAAoB,EAAE,+BAA+B,CAAC;KACpE;CACF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,EAWT;QAVtB,eAAoB,EAApB,OAAO,mBAAG,UAAU,KAAA,EACpB,OAAO,aAAA,EACP,gBAAgB,EAAhB,QAAQ,mBAAG,KAAK,KAAA,EAChB,OAAO,aAAA,EACP,uBAAuB,EAAvB,eAAe,mBAAG,KAAK,KAAA,EACvB,IAAI,UAAA,EACJ,YAAY,kBAAA,EACZ,iBAAc,EAAd,SAAS,mBAAG,EAAE,KAAA,EACd,gBAAgB,EAAhB,QAAQ,mBAAG,KAAK,KAAA,EAChB,YAAW,EAAX,IAAI,mBAAG,IAAI,KAAA;IAEX,IAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACvC,IAAM,gBAAgB,GAAG,UAAU,CACjC,SAAS,EACT,WAAW,EACX,QAAQ;QACN,CAAC,CAAC,SAAS,CAAC,QAAQ;QACpB,CAAC,CAAC,QAAQ;YACR,CAAC,CAAC,SAAS,CAAC,QAAQ;YACpB,CAAC,CAAC,SAAS,CAAC,IAAI,EACpB,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAC/C,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CACjC,CAAC;IAEF,IAAM,uBAAuB,GAAG,CAC9B,gCACE,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,UAAC,CAAC;YACT,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,CAAC,CAAC,CAAC,CAAC,2BAA2B;YAC3C,CAAC;QACH,CAAC,EACD,QAAQ,EAAE,QAAQ,IAEjB,IAAI,IAAI,CACP,oBAAC,IAAI,IACH,MAAM,EAAE,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EACtD,IAAI,EAAE,IAAyB,GAC/B,CACH,CACM,CACV,CAAC;IAEF,OAAO,OAAO,CAAC,CAAC,CAAC,CACf,oBAAC,OAAO,IACN,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,eAAe,GACrB,CACH,CAAC,CAAC,CAAC,CACF,uBAAuB,CACxB,CAAC;AACJ,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { StoryObj } from "@storybook/react";
|
|
2
|
-
import { IconToggleButton } from "../index_with_tw_base";
|
|
3
|
-
declare const meta: {
|
|
4
|
-
title: string;
|
|
5
|
-
component: typeof IconToggleButton;
|
|
6
|
-
};
|
|
7
|
-
export default meta;
|
|
8
|
-
type Story = StoryObj<typeof meta>;
|
|
9
|
-
export declare const IconToggleButtonSecondary: Story;
|
|
10
|
-
export declare const IconToggleButtonTertiary: Story;
|
|
11
|
-
//# sourceMappingURL=IconToggleButton.stories.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IconToggleButton.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/IconToggleButton.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAiB,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAExE,QAAA,MAAM,IAAI;;;CAG+B,CAAC;AAE1C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,yBAAyB,EAAE,KAQvC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,KAOtC,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Cog6ToothIcon, IconToggleButton } from "../index_with_tw_base";
|
|
2
|
-
var meta = {
|
|
3
|
-
title: "Primitives/IconToggleButton",
|
|
4
|
-
component: IconToggleButton,
|
|
5
|
-
};
|
|
6
|
-
export default meta;
|
|
7
|
-
export var IconToggleButtonSecondary = {
|
|
8
|
-
args: {
|
|
9
|
-
variant: "secondary",
|
|
10
|
-
tooltip: "This a secondary IconButton",
|
|
11
|
-
icon: Cog6ToothIcon,
|
|
12
|
-
iconSelected: Cog6ToothIcon,
|
|
13
|
-
selected: false,
|
|
14
|
-
},
|
|
15
|
-
};
|
|
16
|
-
export var IconToggleButtonTertiary = {
|
|
17
|
-
args: {
|
|
18
|
-
variant: "tertiary",
|
|
19
|
-
tooltip: "This a tertiary IconButton",
|
|
20
|
-
icon: Cog6ToothIcon,
|
|
21
|
-
selected: false,
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
//# sourceMappingURL=IconToggleButton.stories.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IconToggleButton.stories.js","sourceRoot":"","sources":["../../../src/stories/IconToggleButton.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAExE,IAAM,IAAI,GAAG;IACX,KAAK,EAAE,6BAA6B;IACpC,SAAS,EAAE,gBAAgB;CACY,CAAC;AAE1C,eAAe,IAAI,CAAC;AAGpB,MAAM,CAAC,IAAM,yBAAyB,GAAU;IAC9C,IAAI,EAAE;QACJ,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE,6BAA6B;QACtC,IAAI,EAAE,aAAa;QACnB,YAAY,EAAE,aAAa;QAC3B,QAAQ,EAAE,KAAK;KAChB;CACF,CAAC;AAEF,MAAM,CAAC,IAAM,wBAAwB,GAAU;IAC7C,IAAI,EAAE;QACJ,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,4BAA4B;QACrC,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,KAAK;KAChB;CACF,CAAC"}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import React, { ComponentType, MouseEventHandler } from "react";
|
|
2
|
-
|
|
3
|
-
import { classNames, cn } from "@sparkle/lib/utils";
|
|
4
|
-
|
|
5
|
-
import { Icon, IconProps } from "./Icon";
|
|
6
|
-
import { Tooltip } from "./Tooltip";
|
|
7
|
-
|
|
8
|
-
type IconToggleButtonProps = {
|
|
9
|
-
variant?: "secondary" | "tertiary";
|
|
10
|
-
onClick?: MouseEventHandler<HTMLButtonElement>;
|
|
11
|
-
size?: "xs" | "sm" | "md";
|
|
12
|
-
tooltip?: string;
|
|
13
|
-
tooltipPosition?: React.ComponentProps<typeof Tooltip>["side"];
|
|
14
|
-
icon: ComponentType;
|
|
15
|
-
iconSelected?: ComponentType;
|
|
16
|
-
className?: string;
|
|
17
|
-
disabled?: boolean;
|
|
18
|
-
selected?: boolean;
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const baseClasses =
|
|
22
|
-
"s-transition-all s-ease-out s-duration-300 s-cursor-pointer hover:s-scale-110";
|
|
23
|
-
|
|
24
|
-
const iconClasses = {
|
|
25
|
-
secondary: {
|
|
26
|
-
idle: cn("s-text-foreground", "dark:s-text-foreground-night"),
|
|
27
|
-
selected: cn("s-text-highlight-500", "dark:s-text-highlight-500-night"),
|
|
28
|
-
hover: cn(
|
|
29
|
-
"hover:s-text-highlight-400",
|
|
30
|
-
"dark:hover:s-text-highlight-400-night"
|
|
31
|
-
),
|
|
32
|
-
active: cn(
|
|
33
|
-
"active:s-text-highlight-600",
|
|
34
|
-
"dark:active:s-text-highlight-600-night"
|
|
35
|
-
),
|
|
36
|
-
disabled: cn("s-text-primary-500", "dark:s-text-primary-500-night"),
|
|
37
|
-
},
|
|
38
|
-
tertiary: {
|
|
39
|
-
idle: cn("s-text-primary-600", "dark:s-text-primary-600-night"),
|
|
40
|
-
selected: cn("s-text-highlight-500", "dark:s-text-highlight-500-night"),
|
|
41
|
-
hover: cn(
|
|
42
|
-
"hover:s-text-highlight-400",
|
|
43
|
-
"dark:hover:s-text-highlight-400-night"
|
|
44
|
-
),
|
|
45
|
-
active: cn(
|
|
46
|
-
"active:s-text-highlight-600",
|
|
47
|
-
"dark:active:s-text-highlight-600-night"
|
|
48
|
-
),
|
|
49
|
-
disabled: cn("s-text-primary-500", "dark:s-text-primary-500-night"),
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
export function IconToggleButton({
|
|
54
|
-
variant = "tertiary",
|
|
55
|
-
onClick,
|
|
56
|
-
disabled = false,
|
|
57
|
-
tooltip,
|
|
58
|
-
tooltipPosition = "top",
|
|
59
|
-
icon,
|
|
60
|
-
iconSelected,
|
|
61
|
-
className = "",
|
|
62
|
-
selected = false,
|
|
63
|
-
size = "sm",
|
|
64
|
-
}: IconToggleButtonProps) {
|
|
65
|
-
const iconGroup = iconClasses[variant];
|
|
66
|
-
const finalIconClasses = classNames(
|
|
67
|
-
className,
|
|
68
|
-
baseClasses,
|
|
69
|
-
disabled
|
|
70
|
-
? iconGroup.disabled
|
|
71
|
-
: selected
|
|
72
|
-
? iconGroup.selected
|
|
73
|
-
: iconGroup.idle,
|
|
74
|
-
disabled ? "" : selected ? "" : iconGroup.hover,
|
|
75
|
-
disabled ? "" : iconGroup.active
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
const IconButtonToggleContent = (
|
|
79
|
-
<button
|
|
80
|
-
className={finalIconClasses}
|
|
81
|
-
onClick={(e) => {
|
|
82
|
-
if (!disabled) {
|
|
83
|
-
onClick?.(e); // Run passed onClick event
|
|
84
|
-
}
|
|
85
|
-
}}
|
|
86
|
-
disabled={disabled}
|
|
87
|
-
>
|
|
88
|
-
{icon && (
|
|
89
|
-
<Icon
|
|
90
|
-
visual={selected && iconSelected ? iconSelected : icon}
|
|
91
|
-
size={size as IconProps["size"]}
|
|
92
|
-
/>
|
|
93
|
-
)}
|
|
94
|
-
</button>
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
return tooltip ? (
|
|
98
|
-
<Tooltip
|
|
99
|
-
trigger={IconButtonToggleContent}
|
|
100
|
-
label={tooltip}
|
|
101
|
-
side={tooltipPosition}
|
|
102
|
-
/>
|
|
103
|
-
) : (
|
|
104
|
-
IconButtonToggleContent
|
|
105
|
-
);
|
|
106
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
-
|
|
3
|
-
import { Cog6ToothIcon, IconToggleButton } from "../index_with_tw_base";
|
|
4
|
-
|
|
5
|
-
const meta = {
|
|
6
|
-
title: "Primitives/IconToggleButton",
|
|
7
|
-
component: IconToggleButton,
|
|
8
|
-
} satisfies Meta<typeof IconToggleButton>;
|
|
9
|
-
|
|
10
|
-
export default meta;
|
|
11
|
-
type Story = StoryObj<typeof meta>;
|
|
12
|
-
|
|
13
|
-
export const IconToggleButtonSecondary: Story = {
|
|
14
|
-
args: {
|
|
15
|
-
variant: "secondary",
|
|
16
|
-
tooltip: "This a secondary IconButton",
|
|
17
|
-
icon: Cog6ToothIcon,
|
|
18
|
-
iconSelected: Cog6ToothIcon,
|
|
19
|
-
selected: false,
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export const IconToggleButtonTertiary: Story = {
|
|
24
|
-
args: {
|
|
25
|
-
variant: "tertiary",
|
|
26
|
-
tooltip: "This a tertiary IconButton",
|
|
27
|
-
icon: Cog6ToothIcon,
|
|
28
|
-
selected: false,
|
|
29
|
-
},
|
|
30
|
-
};
|