@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.
Files changed (42) hide show
  1. package/dist/cjs/index.js +1 -1
  2. package/dist/esm/components/DataTable.d.ts +8 -3
  3. package/dist/esm/components/DataTable.d.ts.map +1 -1
  4. package/dist/esm/components/DataTable.js +61 -10
  5. package/dist/esm/components/DataTable.js.map +1 -1
  6. package/dist/esm/components/DoubleIcon.d.ts +15 -0
  7. package/dist/esm/components/DoubleIcon.d.ts.map +1 -0
  8. package/dist/esm/components/DoubleIcon.js +26 -0
  9. package/dist/esm/components/DoubleIcon.js.map +1 -0
  10. package/dist/esm/components/Dropdown.d.ts.map +1 -1
  11. package/dist/esm/components/Dropdown.js +8 -4
  12. package/dist/esm/components/Dropdown.js.map +1 -1
  13. package/dist/esm/components/index.d.ts +1 -1
  14. package/dist/esm/components/index.d.ts.map +1 -1
  15. package/dist/esm/components/index.js +1 -1
  16. package/dist/esm/components/index.js.map +1 -1
  17. package/dist/esm/stories/DataTable.stories.d.ts +1 -0
  18. package/dist/esm/stories/DataTable.stories.d.ts.map +1 -1
  19. package/dist/esm/stories/DataTable.stories.js +27 -3
  20. package/dist/esm/stories/DataTable.stories.js.map +1 -1
  21. package/dist/esm/stories/DoubleIcon.stories.d.ts +8 -0
  22. package/dist/esm/stories/DoubleIcon.stories.d.ts.map +1 -0
  23. package/dist/esm/stories/DoubleIcon.stories.js +97 -0
  24. package/dist/esm/stories/DoubleIcon.stories.js.map +1 -0
  25. package/dist/sparkle.css +29 -21
  26. package/package.json +1 -1
  27. package/src/components/DataTable.tsx +87 -0
  28. package/src/components/DoubleIcon.tsx +43 -0
  29. package/src/components/Dropdown.tsx +18 -6
  30. package/src/components/index.ts +1 -1
  31. package/src/stories/DataTable.stories.tsx +60 -2
  32. package/src/stories/DoubleIcon.stories.tsx +163 -0
  33. package/dist/esm/components/IconToggleButton.d.ts +0 -17
  34. package/dist/esm/components/IconToggleButton.d.ts.map +0 -1
  35. package/dist/esm/components/IconToggleButton.js +0 -37
  36. package/dist/esm/components/IconToggleButton.js.map +0 -1
  37. package/dist/esm/stories/IconToggleButton.stories.d.ts +0 -11
  38. package/dist/esm/stories/IconToggleButton.stories.d.ts.map +0 -1
  39. package/dist/esm/stories/IconToggleButton.stories.js +0 -24
  40. package/dist/esm/stories/IconToggleButton.stories.js.map +0 -1
  41. package/src/components/IconToggleButton.tsx +0 -106
  42. 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={columnsWithSize}
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":"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"}
@@ -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
- };