@rovula/ui 0.0.26 → 0.0.28

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 (159) hide show
  1. package/dist/cjs/bundle.css +185 -37
  2. package/dist/cjs/bundle.js +3 -3
  3. package/dist/cjs/bundle.js.map +1 -1
  4. package/dist/cjs/types/components/AlertDialog/{Alert.stories.d.ts → AlertDialog.stories.d.ts} +4 -0
  5. package/dist/cjs/types/components/Calendar/Calendar.stories.d.ts +7 -7
  6. package/dist/cjs/types/components/RadioGroup/RadioGroup.stories.d.ts +1 -1
  7. package/dist/cjs/types/components/Text/Text.d.ts +5 -6
  8. package/dist/cjs/types/components/Text/Text.stories.d.ts +10 -2
  9. package/dist/cjs/types/components/Toast/Toast.d.ts +17 -0
  10. package/dist/cjs/types/components/Toast/Toast.stories.d.ts +358 -0
  11. package/dist/cjs/types/components/Toast/Toast.styles.d.ts +12 -0
  12. package/dist/cjs/types/components/Toast/Toaster.d.ts +1 -0
  13. package/dist/cjs/types/components/Toast/useToast.d.ts +55 -0
  14. package/dist/cjs/types/components/Tooltip/Tooltip.d.ts +8 -0
  15. package/dist/cjs/types/components/Tooltip/Tooltip.stories.d.ts +59 -0
  16. package/dist/cjs/types/components/Tooltip/TooltipSimple.d.ts +13 -0
  17. package/dist/cjs/types/icons/material-icon/outline/AllOutIcon.d.ts +3 -0
  18. package/dist/cjs/types/icons/material-icon/outline/FormatAlignCenterIcon.d.ts +3 -0
  19. package/dist/cjs/types/icons/material-icon/outline/FormatAlignJustifyIcon.d.ts +3 -0
  20. package/dist/cjs/types/icons/material-icon/outline/FormatAlignLeftIcon.d.ts +3 -0
  21. package/dist/cjs/types/icons/material-icon/outline/FormatAlignRightIcon.d.ts +3 -0
  22. package/dist/cjs/types/icons/material-icon/outline/FormatBoldIcon.d.ts +3 -0
  23. package/dist/cjs/types/icons/material-icon/outline/FormatItalicIcon.d.ts +3 -0
  24. package/dist/cjs/types/icons/material-icon/outline/FormatListBulletedIcon.d.ts +3 -0
  25. package/dist/cjs/types/icons/material-icon/outline/FormatListNumberedIcon.d.ts +3 -0
  26. package/dist/cjs/types/icons/material-icon/outline/FormatUnderlinedIcon.d.ts +3 -0
  27. package/dist/cjs/types/icons/material-icon/outline/index.d.ts +10 -0
  28. package/dist/cjs/types/icons/material-icon/solid/AllOutIcon.d.ts +3 -0
  29. package/dist/cjs/types/icons/material-icon/solid/FormatAlignCenterIcon.d.ts +3 -0
  30. package/dist/cjs/types/icons/material-icon/solid/FormatAlignJustifyIcon.d.ts +3 -0
  31. package/dist/cjs/types/icons/material-icon/solid/FormatAlignLeftIcon.d.ts +3 -0
  32. package/dist/cjs/types/icons/material-icon/solid/FormatAlignRightIcon.d.ts +3 -0
  33. package/dist/cjs/types/icons/material-icon/solid/FormatBoldIcon.d.ts +3 -0
  34. package/dist/cjs/types/icons/material-icon/solid/FormatItalicIcon.d.ts +3 -0
  35. package/dist/cjs/types/icons/material-icon/solid/FormatListBulletedIcon.d.ts +3 -0
  36. package/dist/cjs/types/icons/material-icon/solid/FormatListNumberedIcon.d.ts +3 -0
  37. package/dist/cjs/types/icons/material-icon/solid/FormatUnderlinedIcon.d.ts +3 -0
  38. package/dist/cjs/types/icons/material-icon/solid/index.d.ts +10 -0
  39. package/dist/cjs/types/index.d.ts +5 -0
  40. package/dist/components/AlertDialog/{Alert.stories.js → AlertDialog.stories.js} +13 -1
  41. package/dist/components/Checkbox/Checkbox.js +5 -4
  42. package/dist/components/Icon/Icon.stories.js +10 -0
  43. package/dist/components/Popover/Popover.js +1 -1
  44. package/dist/components/RadioGroup/RadioGroup.js +1 -4
  45. package/dist/components/Switch/Switch.js +1 -1
  46. package/dist/components/Text/Text.js +3 -5
  47. package/dist/components/Toast/Toast.js +52 -0
  48. package/dist/components/Toast/Toast.stories.js +82 -0
  49. package/dist/components/Toast/Toast.styles.js +60 -0
  50. package/dist/components/Toast/Toaster.js +24 -0
  51. package/dist/components/Toast/useToast.js +121 -0
  52. package/dist/components/Tooltip/Tooltip.js +26 -0
  53. package/dist/components/Tooltip/Tooltip.stories.js +61 -0
  54. package/dist/components/Tooltip/TooltipSimple.js +18 -0
  55. package/dist/esm/bundle.css +185 -37
  56. package/dist/esm/bundle.js +3 -3
  57. package/dist/esm/bundle.js.map +1 -1
  58. package/dist/esm/types/components/AlertDialog/{Alert.stories.d.ts → AlertDialog.stories.d.ts} +4 -0
  59. package/dist/esm/types/components/Calendar/Calendar.stories.d.ts +7 -7
  60. package/dist/esm/types/components/RadioGroup/RadioGroup.stories.d.ts +1 -1
  61. package/dist/esm/types/components/Text/Text.d.ts +5 -6
  62. package/dist/esm/types/components/Text/Text.stories.d.ts +10 -2
  63. package/dist/esm/types/components/Toast/Toast.d.ts +17 -0
  64. package/dist/esm/types/components/Toast/Toast.stories.d.ts +358 -0
  65. package/dist/esm/types/components/Toast/Toast.styles.d.ts +12 -0
  66. package/dist/esm/types/components/Toast/Toaster.d.ts +1 -0
  67. package/dist/esm/types/components/Toast/useToast.d.ts +55 -0
  68. package/dist/esm/types/components/Tooltip/Tooltip.d.ts +8 -0
  69. package/dist/esm/types/components/Tooltip/Tooltip.stories.d.ts +59 -0
  70. package/dist/esm/types/components/Tooltip/TooltipSimple.d.ts +13 -0
  71. package/dist/esm/types/icons/material-icon/outline/AllOutIcon.d.ts +3 -0
  72. package/dist/esm/types/icons/material-icon/outline/FormatAlignCenterIcon.d.ts +3 -0
  73. package/dist/esm/types/icons/material-icon/outline/FormatAlignJustifyIcon.d.ts +3 -0
  74. package/dist/esm/types/icons/material-icon/outline/FormatAlignLeftIcon.d.ts +3 -0
  75. package/dist/esm/types/icons/material-icon/outline/FormatAlignRightIcon.d.ts +3 -0
  76. package/dist/esm/types/icons/material-icon/outline/FormatBoldIcon.d.ts +3 -0
  77. package/dist/esm/types/icons/material-icon/outline/FormatItalicIcon.d.ts +3 -0
  78. package/dist/esm/types/icons/material-icon/outline/FormatListBulletedIcon.d.ts +3 -0
  79. package/dist/esm/types/icons/material-icon/outline/FormatListNumberedIcon.d.ts +3 -0
  80. package/dist/esm/types/icons/material-icon/outline/FormatUnderlinedIcon.d.ts +3 -0
  81. package/dist/esm/types/icons/material-icon/outline/index.d.ts +10 -0
  82. package/dist/esm/types/icons/material-icon/solid/AllOutIcon.d.ts +3 -0
  83. package/dist/esm/types/icons/material-icon/solid/FormatAlignCenterIcon.d.ts +3 -0
  84. package/dist/esm/types/icons/material-icon/solid/FormatAlignJustifyIcon.d.ts +3 -0
  85. package/dist/esm/types/icons/material-icon/solid/FormatAlignLeftIcon.d.ts +3 -0
  86. package/dist/esm/types/icons/material-icon/solid/FormatAlignRightIcon.d.ts +3 -0
  87. package/dist/esm/types/icons/material-icon/solid/FormatBoldIcon.d.ts +3 -0
  88. package/dist/esm/types/icons/material-icon/solid/FormatItalicIcon.d.ts +3 -0
  89. package/dist/esm/types/icons/material-icon/solid/FormatListBulletedIcon.d.ts +3 -0
  90. package/dist/esm/types/icons/material-icon/solid/FormatListNumberedIcon.d.ts +3 -0
  91. package/dist/esm/types/icons/material-icon/solid/FormatUnderlinedIcon.d.ts +3 -0
  92. package/dist/esm/types/icons/material-icon/solid/index.d.ts +10 -0
  93. package/dist/esm/types/index.d.ts +5 -0
  94. package/dist/icons/material-icon/outline/AllOutIcon.js +3 -0
  95. package/dist/icons/material-icon/outline/FormatAlignCenterIcon.js +3 -0
  96. package/dist/icons/material-icon/outline/FormatAlignJustifyIcon.js +3 -0
  97. package/dist/icons/material-icon/outline/FormatAlignLeftIcon.js +3 -0
  98. package/dist/icons/material-icon/outline/FormatAlignRightIcon.js +3 -0
  99. package/dist/icons/material-icon/outline/FormatBoldIcon.js +3 -0
  100. package/dist/icons/material-icon/outline/FormatItalicIcon.js +3 -0
  101. package/dist/icons/material-icon/outline/FormatListBulletedIcon.js +3 -0
  102. package/dist/icons/material-icon/outline/FormatListNumberedIcon.js +3 -0
  103. package/dist/icons/material-icon/outline/FormatUnderlinedIcon.js +3 -0
  104. package/dist/icons/material-icon/outline/index.js +10 -0
  105. package/dist/icons/material-icon/solid/AllOutIcon.js +3 -0
  106. package/dist/icons/material-icon/solid/FormatAlignCenterIcon.js +3 -0
  107. package/dist/icons/material-icon/solid/FormatAlignJustifyIcon.js +3 -0
  108. package/dist/icons/material-icon/solid/FormatAlignLeftIcon.js +3 -0
  109. package/dist/icons/material-icon/solid/FormatAlignRightIcon.js +3 -0
  110. package/dist/icons/material-icon/solid/FormatBoldIcon.js +3 -0
  111. package/dist/icons/material-icon/solid/FormatItalicIcon.js +3 -0
  112. package/dist/icons/material-icon/solid/FormatListBulletedIcon.js +3 -0
  113. package/dist/icons/material-icon/solid/FormatListNumberedIcon.js +3 -0
  114. package/dist/icons/material-icon/solid/FormatUnderlinedIcon.js +3 -0
  115. package/dist/icons/material-icon/solid/index.js +10 -0
  116. package/dist/index.d.ts +94 -6
  117. package/dist/index.js +5 -0
  118. package/dist/src/theme/global.css +230 -46
  119. package/dist/theme/themes/xspector/state.css +1 -1
  120. package/package.json +4 -1
  121. package/src/components/AlertDialog/{Alert.stories.tsx → AlertDialog.stories.tsx} +41 -1
  122. package/src/components/Checkbox/Checkbox.tsx +9 -4
  123. package/src/components/Icon/Icon.stories.tsx +10 -0
  124. package/src/components/Popover/Popover.tsx +1 -1
  125. package/src/components/RadioGroup/RadioGroup.tsx +6 -7
  126. package/src/components/Switch/Switch.tsx +8 -5
  127. package/src/components/Text/Text.tsx +33 -40
  128. package/src/components/Toast/Toast.stories.tsx +144 -0
  129. package/src/components/Toast/Toast.styles.tsx +73 -0
  130. package/src/components/Toast/Toast.tsx +116 -0
  131. package/src/components/Toast/Toaster.tsx +50 -0
  132. package/src/components/Toast/useToast.ts +222 -0
  133. package/src/components/Tooltip/Tooltip.stories.tsx +152 -0
  134. package/src/components/Tooltip/Tooltip.tsx +38 -0
  135. package/src/components/Tooltip/TooltipSimple.tsx +46 -0
  136. package/src/icons/material-icon/outline/AllOutIcon.tsx +20 -0
  137. package/src/icons/material-icon/outline/FormatAlignCenterIcon.tsx +20 -0
  138. package/src/icons/material-icon/outline/FormatAlignJustifyIcon.tsx +20 -0
  139. package/src/icons/material-icon/outline/FormatAlignLeftIcon.tsx +20 -0
  140. package/src/icons/material-icon/outline/FormatAlignRightIcon.tsx +20 -0
  141. package/src/icons/material-icon/outline/FormatBoldIcon.tsx +20 -0
  142. package/src/icons/material-icon/outline/FormatItalicIcon.tsx +20 -0
  143. package/src/icons/material-icon/outline/FormatListBulletedIcon.tsx +20 -0
  144. package/src/icons/material-icon/outline/FormatListNumberedIcon.tsx +20 -0
  145. package/src/icons/material-icon/outline/FormatUnderlinedIcon.tsx +20 -0
  146. package/src/icons/material-icon/outline/index.ts +10 -0
  147. package/src/icons/material-icon/solid/AllOutIcon.tsx +20 -0
  148. package/src/icons/material-icon/solid/FormatAlignCenterIcon.tsx +20 -0
  149. package/src/icons/material-icon/solid/FormatAlignJustifyIcon.tsx +20 -0
  150. package/src/icons/material-icon/solid/FormatAlignLeftIcon.tsx +20 -0
  151. package/src/icons/material-icon/solid/FormatAlignRightIcon.tsx +20 -0
  152. package/src/icons/material-icon/solid/FormatBoldIcon.tsx +20 -0
  153. package/src/icons/material-icon/solid/FormatItalicIcon.tsx +20 -0
  154. package/src/icons/material-icon/solid/FormatListBulletedIcon.tsx +20 -0
  155. package/src/icons/material-icon/solid/FormatListNumberedIcon.tsx +20 -0
  156. package/src/icons/material-icon/solid/FormatUnderlinedIcon.tsx +20 -0
  157. package/src/icons/material-icon/solid/index.ts +10 -0
  158. package/src/index.ts +5 -0
  159. package/src/theme/themes/xspector/state.css +1 -1
@@ -0,0 +1,222 @@
1
+ "use client";
2
+
3
+ // Inspired by react-hot-toast library
4
+ import * as React from "react";
5
+ import { ToastActionElement, ToastProps } from "./Toast";
6
+
7
+ const TOAST_LIMIT = 1;
8
+ const TOAST_REMOVE_DELAY = 6000;
9
+
10
+ type ToasterToast = ToastProps & {
11
+ id: string;
12
+ title?: React.ReactNode;
13
+ description?: React.ReactNode;
14
+ action?: ToastActionElement;
15
+ contentMode?: "vertical" | "horizontal";
16
+ };
17
+
18
+ type ToasterPosition =
19
+ | "top-center"
20
+ | "top-left"
21
+ | "top-right"
22
+ | "bottom-center"
23
+ | "bottom-left"
24
+ | "bottom-right"
25
+ | undefined;
26
+
27
+ const actionTypes = {
28
+ ADD_TOAST: "ADD_TOAST",
29
+ UPDATE_TOAST: "UPDATE_TOAST",
30
+ DISMISS_TOAST: "DISMISS_TOAST",
31
+ REMOVE_TOAST: "REMOVE_TOAST",
32
+ ADD_POSITION: "ADD_POSITION",
33
+ } as const;
34
+
35
+ let count = 0;
36
+
37
+ function genId() {
38
+ count = (count + 1) % Number.MAX_SAFE_INTEGER;
39
+ return count.toString();
40
+ }
41
+
42
+ type ActionType = typeof actionTypes;
43
+
44
+ type Action =
45
+ | {
46
+ type: ActionType["ADD_TOAST"];
47
+ toast: ToasterToast;
48
+ }
49
+ | {
50
+ type: ActionType["UPDATE_TOAST"];
51
+ toast: Partial<ToasterToast>;
52
+ }
53
+ | {
54
+ type: ActionType["DISMISS_TOAST"];
55
+ toastId?: ToasterToast["id"];
56
+ }
57
+ | {
58
+ type: ActionType["REMOVE_TOAST"];
59
+ toastId?: ToasterToast["id"];
60
+ }
61
+ | {
62
+ type: ActionType["ADD_POSITION"];
63
+ position?: ToasterPosition;
64
+ };
65
+
66
+ interface State {
67
+ toasts: ToasterToast[];
68
+ position?: ToasterPosition;
69
+ }
70
+
71
+ const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();
72
+
73
+ const addToRemoveQueue = (toastId: string) => {
74
+ if (toastTimeouts.has(toastId)) {
75
+ return;
76
+ }
77
+
78
+ const timeout = setTimeout(() => {
79
+ toastTimeouts.delete(toastId);
80
+ dispatch({
81
+ type: "REMOVE_TOAST",
82
+ toastId: toastId,
83
+ });
84
+ }, TOAST_REMOVE_DELAY);
85
+
86
+ toastTimeouts.set(toastId, timeout);
87
+ };
88
+
89
+ export const reducer = (state: State, action: Action): State => {
90
+ switch (action.type) {
91
+ case "ADD_TOAST":
92
+ return {
93
+ ...state,
94
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
95
+ };
96
+
97
+ case "UPDATE_TOAST":
98
+ return {
99
+ ...state,
100
+ toasts: state.toasts.map((t) =>
101
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
102
+ ),
103
+ };
104
+
105
+ case "DISMISS_TOAST": {
106
+ const { toastId } = action;
107
+
108
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
109
+ // but I'll keep it here for simplicity
110
+ if (toastId) {
111
+ addToRemoveQueue(toastId);
112
+ } else {
113
+ state.toasts.forEach((toast) => {
114
+ addToRemoveQueue(toast.id);
115
+ });
116
+ }
117
+
118
+ return {
119
+ ...state,
120
+ toasts: state.toasts.map((t) =>
121
+ t.id === toastId || toastId === undefined
122
+ ? {
123
+ ...t,
124
+ open: false,
125
+ }
126
+ : t
127
+ ),
128
+ };
129
+ }
130
+ case "REMOVE_TOAST":
131
+ if (action.toastId === undefined) {
132
+ return {
133
+ ...state,
134
+ toasts: [],
135
+ };
136
+ }
137
+ return {
138
+ ...state,
139
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
140
+ };
141
+ case "ADD_POSITION":
142
+ return {
143
+ ...state,
144
+ position: action.position,
145
+ };
146
+ }
147
+ };
148
+
149
+ const listeners: Array<(state: State) => void> = [];
150
+
151
+ let memoryState: State = { toasts: [], position: undefined };
152
+
153
+ function dispatch(action: Action) {
154
+ memoryState = reducer(memoryState, action);
155
+ listeners.forEach((listener) => {
156
+ listener(memoryState);
157
+ });
158
+ }
159
+
160
+ type Toast = Omit<ToasterToast, "id">;
161
+
162
+ function toast({ ...props }: Toast) {
163
+ const id = genId();
164
+
165
+ const update = (props: ToasterToast) =>
166
+ dispatch({
167
+ type: "UPDATE_TOAST",
168
+ toast: { ...props, id },
169
+ });
170
+ const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id });
171
+
172
+ dispatch({
173
+ type: "ADD_TOAST",
174
+ toast: {
175
+ ...props,
176
+ id,
177
+ open: true,
178
+ onOpenChange: (open) => {
179
+ if (!open) dismiss();
180
+ },
181
+ },
182
+ });
183
+
184
+ return {
185
+ id: id,
186
+ dismiss,
187
+ update,
188
+ };
189
+ }
190
+
191
+ type ToastOptions = {
192
+ position?: State["position"];
193
+ };
194
+
195
+ function useToast(options?: ToastOptions) {
196
+ const [state, setState] = React.useState<State>(memoryState);
197
+
198
+ React.useEffect(() => {
199
+ listeners.push(setState);
200
+ return () => {
201
+ const index = listeners.indexOf(setState);
202
+ if (index > -1) {
203
+ listeners.splice(index, 1);
204
+ }
205
+ };
206
+ }, [state]);
207
+
208
+ React.useEffect(() => {
209
+ dispatch({
210
+ type: "ADD_POSITION",
211
+ position: options?.position,
212
+ });
213
+ }, [options?.position]);
214
+
215
+ return {
216
+ ...state,
217
+ toast,
218
+ dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
219
+ };
220
+ }
221
+
222
+ export { useToast, toast };
@@ -0,0 +1,152 @@
1
+ import React from "react";
2
+ import type { Meta, StoryObj } from "@storybook/react";
3
+ import { useArgs } from "@storybook/preview-api";
4
+ import {
5
+ Tooltip,
6
+ TooltipArrow,
7
+ TooltipContent,
8
+ TooltipProvider,
9
+ TooltipTrigger,
10
+ } from "./Tooltip";
11
+ import Button from "../Button/Button";
12
+ import { TooltipSimple } from "./TooltipSimple";
13
+
14
+ const meta = {
15
+ title: "Components/Tooltip",
16
+ // component: TooltipProvider,
17
+ tags: ["react-docgen-typescript"],
18
+ parameters: {
19
+ layout: "fullscreen",
20
+ },
21
+ decorators: [
22
+ (Story) => (
23
+ <div className="p-5 flex w-full">
24
+ <Story />
25
+ </div>
26
+ ),
27
+ ],
28
+ } satisfies Meta<typeof Tooltip>;
29
+
30
+ export default meta;
31
+
32
+ export const Default = {
33
+ args: {
34
+ delayDuration: 700,
35
+ skipDelayDuration: 300,
36
+ disableHoverableContent: false,
37
+ },
38
+ render: (args: any) => {
39
+ console.log("args ", args);
40
+ const props: typeof args = {
41
+ ...args,
42
+ };
43
+ return (
44
+ <div className="flex flex-row gap-4 w-full">
45
+ <div className="flex flex-1 justify-center items-center space-x-2">
46
+ <TooltipProvider
47
+ delayDuration={props.delayDuration}
48
+ skipDelayDuration={props.skipDelayDuration}
49
+ disableHoverableContent={props.disableHoverableContent}
50
+ >
51
+ <Tooltip>
52
+ <TooltipTrigger>Hover</TooltipTrigger>
53
+ <TooltipContent>
54
+ <p>Add to library</p>
55
+ <TooltipArrow className="m-0" />
56
+ </TooltipContent>
57
+ </Tooltip>
58
+ </TooltipProvider>
59
+ </div>
60
+ </div>
61
+ );
62
+ },
63
+ } satisfies StoryObj;
64
+
65
+ export const Position = {
66
+ argTypes: {
67
+ side: { control: "select", options: ["top", "right", "bottom", "left"] },
68
+ align: { control: "select", options: ["start", "center", "end"] },
69
+ },
70
+ args: {
71
+ side: "top",
72
+ align: "center",
73
+ sideOffset: 4,
74
+ },
75
+ render: function Render(args) {
76
+ return (
77
+ <div className="flex flex-row gap-4 h-full w-full">
78
+ <div className="flex flex-1 h-60 justify-center items-center space-x-2">
79
+ <TooltipProvider>
80
+ <Tooltip open>
81
+ <TooltipTrigger>Hover</TooltipTrigger>
82
+ <TooltipContent
83
+ side={args.side}
84
+ align={args.align}
85
+ sideOffset={args.sideOffset}
86
+ >
87
+ <p>Add to library</p>
88
+ <TooltipArrow className="m-0" />
89
+ </TooltipContent>
90
+ </Tooltip>
91
+ </TooltipProvider>
92
+ </div>
93
+ </div>
94
+ );
95
+ },
96
+ } satisfies StoryObj<{
97
+ side: "top" | "right" | "bottom" | "left";
98
+ align: "start" | "center" | "end";
99
+ sideOffset: number;
100
+ }>;
101
+
102
+ export const Controlled = {
103
+ args: {
104
+ open: false,
105
+ },
106
+ render: function Render(args) {
107
+ const [{ open }, updateArgs] = useArgs();
108
+
109
+ return (
110
+ <div className="flex flex-row gap-4 w-full">
111
+ <div className="flex flex-1 justify-center items-center space-x-2">
112
+ <TooltipProvider>
113
+ <Tooltip defaultOpen open={open}>
114
+ <TooltipTrigger asChild>
115
+ <Button
116
+ variant="outline"
117
+ onMouseOver={() => updateArgs({ open: true })}
118
+ onMouseLeave={() => updateArgs({ open: false })}
119
+ >
120
+ Hover
121
+ </Button>
122
+ </TooltipTrigger>
123
+ <TooltipContent>
124
+ <p>Add to library</p>
125
+ <TooltipArrow className="m-0" />
126
+ </TooltipContent>
127
+ </Tooltip>
128
+ </TooltipProvider>
129
+ </div>
130
+ </div>
131
+ );
132
+ },
133
+ } satisfies StoryObj;
134
+
135
+ export const Simple = {
136
+ args: {
137
+ open: false,
138
+ },
139
+ render: function Render(args) {
140
+ const [{ open }, updateArgs] = useArgs();
141
+
142
+ return (
143
+ <div className="flex flex-row gap-4 w-full">
144
+ <div className="flex flex-1 justify-center items-center space-x-2">
145
+ <TooltipSimple content="Tooltip content">
146
+ <button>Tooltip trigger</button>
147
+ </TooltipSimple>
148
+ </div>
149
+ </div>
150
+ );
151
+ },
152
+ } satisfies StoryObj;
@@ -0,0 +1,38 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
5
+
6
+ import { cn } from "@/utils/cn";
7
+
8
+ const TooltipProvider = TooltipPrimitive.Provider;
9
+
10
+ const Tooltip = TooltipPrimitive.Root;
11
+
12
+ const TooltipTrigger = TooltipPrimitive.Trigger;
13
+
14
+ const TooltipArrow = TooltipPrimitive.Arrow;
15
+
16
+ const TooltipContent = React.forwardRef<
17
+ React.ElementRef<typeof TooltipPrimitive.Content>,
18
+ React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
19
+ >(({ className, sideOffset = 4, ...props }, ref) => (
20
+ <TooltipPrimitive.Content
21
+ ref={ref}
22
+ sideOffset={sideOffset}
23
+ className={cn(
24
+ "z-50 overflow-hidden rounded-md bg-common-black px-3 py-1.5 typography-buttonMS text-common-white shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
25
+ className
26
+ )}
27
+ {...props}
28
+ />
29
+ ));
30
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
31
+
32
+ export {
33
+ Tooltip,
34
+ TooltipTrigger,
35
+ TooltipContent,
36
+ TooltipProvider,
37
+ TooltipArrow,
38
+ };
@@ -0,0 +1,46 @@
1
+ "use client";
2
+
3
+ import React, { ReactNode } from "react";
4
+ import {
5
+ Tooltip,
6
+ TooltipTrigger,
7
+ TooltipContent,
8
+ TooltipArrow,
9
+ TooltipProvider,
10
+ } from "./Tooltip";
11
+
12
+ interface TooltipProps {
13
+ children: ReactNode;
14
+ content: ReactNode;
15
+ open?: boolean;
16
+ defaultOpen?: boolean;
17
+ onOpenChange?: (open: boolean) => void;
18
+ side?: "top" | "bottom" | "left" | "right";
19
+ align?: "start" | "center" | "end";
20
+ className?: string;
21
+ }
22
+
23
+ export function TooltipSimple({
24
+ children,
25
+ content,
26
+ open,
27
+ defaultOpen,
28
+ onOpenChange,
29
+ ...props
30
+ }: TooltipProps) {
31
+ return (
32
+ <TooltipProvider>
33
+ <Tooltip
34
+ open={open}
35
+ defaultOpen={defaultOpen}
36
+ onOpenChange={onOpenChange}
37
+ >
38
+ <TooltipTrigger asChild>{children}</TooltipTrigger>
39
+ <TooltipContent side="top" align="center" {...props}>
40
+ {content}
41
+ <TooltipArrow width={11} height={5} />
42
+ </TooltipContent>
43
+ </Tooltip>
44
+ </TooltipProvider>
45
+ );
46
+ }
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { SVGProps } from "react";
3
+
4
+ const AllOutIcon = (props: SVGProps<SVGSVGElement>) => (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={24}
8
+ height={24}
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ {...props}
12
+ >
13
+ <path
14
+ fill="currentColor"
15
+ d="M7 21H5c-.55 0-1.02-.196-1.413-.587A1.926 1.926 0 0 1 3 19v-2c0-.283.096-.52.288-.712A.967.967 0 0 1 4 16c.283 0 .52.096.713.288.191.191.287.429.287.712v2h2c.283 0 .52.096.713.288.191.191.287.429.287.712s-.096.52-.287.712A.967.967 0 0 1 7 21Zm12 0h-2a.968.968 0 0 1-.712-.288A.968.968 0 0 1 16 20c0-.283.096-.52.288-.712A.968.968 0 0 1 17 19h2v-2c0-.283.096-.52.288-.712A.968.968 0 0 1 20 16c.283 0 .52.096.712.288.192.191.288.429.288.712v2c0 .55-.196 1.02-.587 1.413A1.926 1.926 0 0 1 19 21Zm-7-2c-1.933 0-3.583-.683-4.95-2.05C5.683 15.583 5 13.933 5 12c0-1.933.683-3.583 2.05-4.95C8.417 5.683 10.067 5 12 5c1.933 0 3.583.683 4.95 2.05C18.317 8.417 19 10.067 19 12c0 1.933-.683 3.583-2.05 4.95C15.583 18.317 13.933 19 12 19ZM3 5c0-.55.196-1.02.587-1.413A1.926 1.926 0 0 1 5 3h2c.283 0 .52.096.713.288.191.191.287.429.287.712s-.096.52-.287.713A.968.968 0 0 1 7 5H5v2c0 .283-.096.52-.287.713A.968.968 0 0 1 4 8a.968.968 0 0 1-.712-.287A.968.968 0 0 1 3 7V5Zm17 3a.968.968 0 0 1-.712-.287A.967.967 0 0 1 19 7V5h-2a.968.968 0 0 1-.712-.287A.967.967 0 0 1 16 4c0-.283.096-.52.288-.712A.968.968 0 0 1 17 3h2c.55 0 1.02.196 1.413.587C20.803 3.98 21 4.45 21 5v2c0 .283-.096.52-.288.713A.968.968 0 0 1 20 8Z"
16
+ />
17
+ </svg>
18
+ );
19
+
20
+ export default AllOutIcon;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { SVGProps } from "react";
3
+
4
+ const FormatAlignCenterIcon = (props: SVGProps<SVGSVGElement>) => (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={24}
8
+ height={24}
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ {...props}
12
+ >
13
+ <path
14
+ fill="currentColor"
15
+ d="M5.618 19a.597.597 0 0 1-.44-.178.598.598 0 0 1-.178-.44c0-.175.06-.322.178-.44a.598.598 0 0 1 .44-.177h12.764c.175 0 .322.059.44.177a.598.598 0 0 1 .178.44c0 .176-.06.322-.178.44a.597.597 0 0 1-.44.178H5.618Zm3.294-3.191a.597.597 0 0 1-.44-.178.598.598 0 0 1-.178-.44c0-.175.06-.322.178-.44a.598.598 0 0 1 .44-.178h6.176c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.598.598 0 0 1-.44.178H8.912Zm-3.294-3.191a.597.597 0 0 1-.44-.178A.598.598 0 0 1 5 12c0-.175.06-.322.178-.44a.597.597 0 0 1 .44-.178h12.764c.175 0 .322.06.44.178A.598.598 0 0 1 19 12c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.178H5.618Zm3.294-3.192a.597.597 0 0 1-.44-.177.598.598 0 0 1-.178-.44c0-.176.06-.322.178-.44a.597.597 0 0 1 .44-.178h6.176c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.598.598 0 0 1-.44.177H8.912Zm-3.294-3.19a.597.597 0 0 1-.44-.178.598.598 0 0 1-.178-.44c0-.176.06-.322.178-.44A.597.597 0 0 1 5.618 5h12.764c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.177H5.618Z"
16
+ />
17
+ </svg>
18
+ );
19
+
20
+ export default FormatAlignCenterIcon;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { SVGProps } from "react";
3
+
4
+ const FormatAlignJustifyIcon = (props: SVGProps<SVGSVGElement>) => (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={24}
8
+ height={24}
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ {...props}
12
+ >
13
+ <path
14
+ fill="currentColor"
15
+ d="M5.618 19a.597.597 0 0 1-.44-.178.598.598 0 0 1-.178-.44c0-.175.06-.322.178-.44a.598.598 0 0 1 .44-.177h12.764c.175 0 .322.059.44.177a.598.598 0 0 1 .178.44c0 .176-.06.322-.178.44a.597.597 0 0 1-.44.178H5.618Zm0-3.191a.597.597 0 0 1-.44-.178.598.598 0 0 1-.178-.44c0-.175.06-.322.178-.44a.598.598 0 0 1 .44-.178h12.764c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.178H5.618Zm0-3.191a.597.597 0 0 1-.44-.178A.598.598 0 0 1 5 12c0-.175.06-.322.178-.44a.597.597 0 0 1 .44-.178h12.764c.175 0 .322.06.44.178A.598.598 0 0 1 19 12c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.178H5.618Zm0-3.192a.597.597 0 0 1-.44-.177.598.598 0 0 1-.178-.44c0-.176.06-.322.178-.44a.597.597 0 0 1 .44-.178h12.764c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.177H5.618Zm0-3.19a.597.597 0 0 1-.44-.178.598.598 0 0 1-.178-.44c0-.176.06-.322.178-.44A.597.597 0 0 1 5.618 5h12.764c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.177H5.618Z"
16
+ />
17
+ </svg>
18
+ );
19
+
20
+ export default FormatAlignJustifyIcon;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { SVGProps } from "react";
3
+
4
+ const FormatAlignLeftIcon = (props: SVGProps<SVGSVGElement>) => (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={24}
8
+ height={24}
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ {...props}
12
+ >
13
+ <path
14
+ fill="currentColor"
15
+ d="M5.618 19a.597.597 0 0 1-.44-.178.598.598 0 0 1-.178-.44c0-.175.06-.322.178-.44a.598.598 0 0 1 .44-.177h12.764c.175 0 .322.059.44.177a.598.598 0 0 1 .178.44c0 .176-.06.322-.178.44a.597.597 0 0 1-.44.178H5.618Zm0-3.191a.597.597 0 0 1-.44-.178.598.598 0 0 1-.178-.44c0-.175.06-.322.178-.44a.598.598 0 0 1 .44-.178h7.823c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.178H5.618Zm0-3.191a.597.597 0 0 1-.44-.178A.598.598 0 0 1 5 12c0-.175.06-.322.178-.44a.597.597 0 0 1 .44-.178h12.764c.175 0 .322.06.44.178A.598.598 0 0 1 19 12c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.178H5.618Zm0-3.192a.597.597 0 0 1-.44-.177.598.598 0 0 1-.178-.44c0-.176.06-.322.178-.44a.597.597 0 0 1 .44-.178h7.823c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.177H5.618Zm0-3.19a.597.597 0 0 1-.44-.178.598.598 0 0 1-.178-.44c0-.176.06-.322.178-.44A.597.597 0 0 1 5.618 5h12.764c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.177H5.618Z"
16
+ />
17
+ </svg>
18
+ );
19
+
20
+ export default FormatAlignLeftIcon;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { SVGProps } from "react";
3
+
4
+ const FormatAlignRightIcon = (props: SVGProps<SVGSVGElement>) => (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={24}
8
+ height={24}
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ {...props}
12
+ >
13
+ <path
14
+ fill="currentColor"
15
+ d="M5.618 6.235a.597.597 0 0 1-.44-.177.598.598 0 0 1-.178-.44c0-.176.06-.322.178-.44A.597.597 0 0 1 5.618 5h12.764c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.177H5.618Zm4.94 3.191a.597.597 0 0 1-.44-.177.598.598 0 0 1-.177-.44c0-.176.06-.322.178-.44a.597.597 0 0 1 .44-.178h7.823c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.177H10.56Zm-4.94 3.192a.597.597 0 0 1-.44-.178A.598.598 0 0 1 5 12c0-.175.06-.322.178-.44a.597.597 0 0 1 .44-.178h12.764c.175 0 .322.06.44.178A.598.598 0 0 1 19 12c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.178H5.618Zm4.94 3.19a.597.597 0 0 1-.44-.177.597.597 0 0 1-.177-.44c0-.175.06-.322.178-.44a.597.597 0 0 1 .44-.178h7.823c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.178H10.56ZM5.619 19a.597.597 0 0 1-.44-.178.598.598 0 0 1-.178-.44c0-.175.06-.322.178-.44a.598.598 0 0 1 .44-.177h12.764c.175 0 .322.059.44.177a.598.598 0 0 1 .178.44c0 .176-.06.322-.178.44a.597.597 0 0 1-.44.178H5.618Z"
16
+ />
17
+ </svg>
18
+ );
19
+
20
+ export default FormatAlignRightIcon;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { SVGProps } from "react";
3
+
4
+ const FormatBoldIcon = (props: SVGProps<SVGSVGElement>) => (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={24}
8
+ height={24}
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ {...props}
12
+ >
13
+ <path
14
+ fill="currentColor"
15
+ d="M8.63 19.133c-.453 0-.838-.158-1.155-.475A1.571 1.571 0 0 1 7 17.504V6.55c0-.453.158-.837.475-1.154A1.571 1.571 0 0 1 8.63 4.92h3.584c1.094 0 2.082.34 2.966 1.021.883.68 1.325 1.597 1.325 2.75 0 .802-.194 1.455-.58 1.96-.388.506-.805.873-1.252 1.101.55.19 1.076.565 1.576 1.125S17 14.193 17 15.142c0 1.37-.505 2.379-1.516 3.024-1.01.645-2.03.967-3.055.967h-3.8Zm.676-2.137h3.036c.845 0 1.442-.234 1.79-.703.35-.469.525-.918.525-1.349 0-.43-.175-.88-.524-1.35-.35-.468-.963-.702-1.84-.702H9.306v4.104Zm0-6.175h2.783c.652 0 1.168-.187 1.55-.56.382-.372.572-.818.572-1.338 0-.553-.202-1.005-.605-1.355-.404-.35-.898-.526-1.484-.526H9.306v3.779Z"
16
+ />
17
+ </svg>
18
+ );
19
+
20
+ export default FormatBoldIcon;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { SVGProps } from "react";
3
+
4
+ const FormatItalicIcon = (props: SVGProps<SVGSVGElement>) => (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={24}
8
+ height={24}
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ {...props}
12
+ >
13
+ <path
14
+ fill="currentColor"
15
+ d="M6.875 18.54a.845.845 0 0 1-.621-.255.847.847 0 0 1-.254-.622c0-.245.085-.452.254-.62a.846.846 0 0 1 .621-.254h2.82l3.138-9.328h-2.82a.845.845 0 0 1-.622-.254.846.846 0 0 1-.254-.622c0-.245.085-.452.254-.621a.846.846 0 0 1 .621-.253h7.113c.245 0 .452.084.621.254.17.17.254.376.254.622a.844.844 0 0 1-.254.62.845.845 0 0 1-.621.254h-2.523l-3.137 9.328h2.523c.245 0 .452.085.62.254.17.17.255.377.255.622a.844.844 0 0 1-.254.621.846.846 0 0 1-.621.253H6.875Z"
16
+ />
17
+ </svg>
18
+ );
19
+
20
+ export default FormatItalicIcon;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { SVGProps } from "react";
3
+
4
+ const FormatListBulletedIcon = (props: SVGProps<SVGSVGElement>) => (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={24}
8
+ height={24}
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ {...props}
12
+ >
13
+ <path
14
+ fill="currentColor"
15
+ d="M10.4 17.559a.598.598 0 0 1-.44-.178.598.598 0 0 1-.177-.44c0-.175.059-.322.177-.44a.598.598 0 0 1 .44-.178h7.982c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.178H10.4Zm0-4.941a.598.598 0 0 1-.44-.178.598.598 0 0 1-.177-.44c0-.175.059-.322.177-.44a.598.598 0 0 1 .44-.178h7.982c.175 0 .322.06.44.178A.598.598 0 0 1 19 12c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.178H10.4Zm0-4.942a.598.598 0 0 1-.44-.177.598.598 0 0 1-.177-.44c0-.176.059-.322.177-.44a.598.598 0 0 1 .44-.178h7.982c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.177H10.4ZM6.37 18.311c-.377 0-.7-.134-.968-.402A1.319 1.319 0 0 1 5 16.94c0-.377.134-.7.402-.967.269-.269.591-.403.968-.403s.7.134.967.403c.269.268.403.59.403.967s-.134.7-.403.968c-.268.268-.59.402-.967.402Zm0-4.941c-.377 0-.7-.134-.968-.403A1.319 1.319 0 0 1 5 12c0-.377.134-.7.402-.967.269-.269.591-.403.968-.403s.7.134.967.402c.269.269.403.591.403.968s-.134.7-.403.967c-.268.269-.59.403-.967.403Zm0-4.941c-.377 0-.7-.134-.968-.403A1.319 1.319 0 0 1 5 7.06c0-.377.134-.7.402-.968.269-.268.591-.402.968-.402s.7.134.967.402c.269.269.403.591.403.968s-.134.7-.403.967c-.268.269-.59.403-.967.403Z"
16
+ />
17
+ </svg>
18
+ );
19
+
20
+ export default FormatListBulletedIcon;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { SVGProps } from "react";
3
+
4
+ const FormatListNumberedIcon = (props: SVGProps<SVGSVGElement>) => (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={24}
8
+ height={24}
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ {...props}
12
+ >
13
+ <path
14
+ fill="currentColor"
15
+ d="M5.491 19.823a.477.477 0 0 1-.491-.49.477.477 0 0 1 .491-.491h1.568v-.871h-.744a.477.477 0 0 1-.491-.491.477.477 0 0 1 .49-.491h.745v-.871H5.49A.477.477 0 0 1 5 15.627a.477.477 0 0 1 .491-.491h1.853c.197 0 .363.067.496.2.134.134.2.3.2.496v.983a.674.674 0 0 1-.2.496.674.674 0 0 1-.496.2c.197 0 .363.067.496.2.134.134.2.3.2.497v.919a.674.674 0 0 1-.2.496.674.674 0 0 1-.496.2H5.491Zm.071-5.479a.543.543 0 0 1-.399-.163.543.543 0 0 1-.163-.4v-1.575c0-.197.067-.363.2-.497.134-.133.3-.2.497-.2h1.362v-.87H5.49A.476.476 0 0 1 5 10.147a.478.478 0 0 1 .491-.492h1.853c.197 0 .363.067.496.2.134.134.2.3.2.497v1.441a.675.675 0 0 1-.2.497.674.674 0 0 1-.496.2H5.982v.87H7.55a.477.477 0 0 1 .49.491.478.478 0 0 1-.49.492H5.562Zm1.165-5.48a.478.478 0 0 1-.492-.49V5.157h-.744A.477.477 0 0 1 5 4.668a.478.478 0 0 1 .491-.492h1.172c.157 0 .289.054.395.16.106.106.16.237.16.395v3.642a.477.477 0 0 1-.491.491ZM10.4 17.56a.598.598 0 0 1-.44-.178.598.598 0 0 1-.177-.44c0-.175.059-.322.177-.44a.598.598 0 0 1 .44-.178h7.982c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.178H10.4Zm0-4.941a.598.598 0 0 1-.44-.178.598.598 0 0 1-.177-.44c0-.175.059-.322.177-.44a.598.598 0 0 1 .44-.178h7.982c.175 0 .322.06.44.178A.598.598 0 0 1 19 12c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.178H10.4Zm0-4.942a.598.598 0 0 1-.44-.177.598.598 0 0 1-.177-.44c0-.176.059-.322.177-.44a.598.598 0 0 1 .44-.178h7.982c.175 0 .322.06.44.178a.598.598 0 0 1 .178.44c0 .175-.06.322-.178.44a.597.597 0 0 1-.44.177H10.4Z"
16
+ />
17
+ </svg>
18
+ );
19
+
20
+ export default FormatListNumberedIcon;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import { SVGProps } from "react";
3
+
4
+ const FormatUnderlinedIcon = (props: SVGProps<SVGSVGElement>) => (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={24}
8
+ height={24}
9
+ viewBox="0 0 24 24"
10
+ fill="none"
11
+ {...props}
12
+ >
13
+ <path
14
+ fill="currentColor"
15
+ d="M6.676 19.442a.655.655 0 0 1-.482-.195.655.655 0 0 1-.194-.482c0-.192.065-.352.194-.482.13-.13.29-.194.482-.194h10.648c.191 0 .352.065.482.195s.194.29.194.482a.654.654 0 0 1-.194.481.655.655 0 0 1-.482.195H6.676ZM12 16.199c-1.402 0-2.497-.426-3.283-1.277-.787-.852-1.18-1.992-1.18-3.423V5.201c0-.228.083-.423.251-.585a.825.825 0 0 1 .593-.244c.228 0 .422.081.584.244a.8.8 0 0 1 .243.585v6.381c0 .911.242 1.642.727 2.19.484.55 1.172.825 2.065.825s1.581-.275 2.066-.824c.484-.55.726-1.28.726-2.19V5.2c0-.228.084-.423.252-.585a.825.825 0 0 1 .593-.244c.227 0 .422.081.584.244a.8.8 0 0 1 .243.585v6.298c0 1.43-.394 2.571-1.18 3.423-.787.851-1.882 1.277-3.284 1.277Z"
16
+ />
17
+ </svg>
18
+ );
19
+
20
+ export default FormatUnderlinedIcon;