aural-ui 2.0.1 → 2.0.3

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 (56) hide show
  1. package/dist/components/button/Button.stories.tsx +43 -0
  2. package/dist/components/button/index.tsx +10 -4
  3. package/dist/components/chip/index.tsx +3 -3
  4. package/dist/components/dropdown/index.tsx +2 -7
  5. package/dist/components/icon-button/IconButton.stories.tsx +48 -0
  6. package/dist/components/icon-button/index.tsx +6 -2
  7. package/dist/components/input/index.tsx +4 -0
  8. package/dist/components/overlay/index.tsx +22 -5
  9. package/dist/components/sheet/index.tsx +5 -2
  10. package/dist/components/tag/index.tsx +2 -2
  11. package/dist/components/textarea/index.tsx +2 -0
  12. package/dist/components/tooltip/index.tsx +45 -0
  13. package/dist/hooks/index.ts +1 -0
  14. package/dist/hooks/use-change-state/UseChangeState.stories.tsx +744 -0
  15. package/dist/hooks/use-change-state/index.tsx +17 -0
  16. package/dist/hooks/use-change-state/meta.ts +6 -0
  17. package/dist/icons/all-icons.tsx +155 -79
  18. package/dist/icons/capital-a-letter-icon/CapitalALetterIcon.stories.tsx +992 -0
  19. package/dist/icons/capital-a-letter-icon/index.tsx +32 -0
  20. package/dist/icons/capital-a-letter-icon/meta.ts +8 -0
  21. package/dist/icons/circle-tick-icon/CircleTickIcon.stories.tsx +1204 -0
  22. package/dist/icons/circle-tick-icon/index.tsx +22 -0
  23. package/dist/icons/circle-tick-icon/meta.ts +8 -0
  24. package/dist/icons/copy-icon/CopyIcon.stories.tsx +1021 -0
  25. package/dist/icons/copy-icon/index.tsx +21 -0
  26. package/dist/icons/copy-icon/meta.ts +8 -0
  27. package/dist/icons/download-icon/DownloadIcon.stories.tsx +877 -0
  28. package/dist/icons/download-icon/index.tsx +22 -0
  29. package/dist/icons/download-icon/meta.ts +8 -0
  30. package/dist/icons/filter-bar-row-icon/FilterBarRowIcon.stories.tsx +1109 -0
  31. package/dist/icons/filter-bar-row-icon/index.tsx +24 -0
  32. package/dist/icons/filter-bar-row-icon/meta.ts +8 -0
  33. package/dist/icons/head-icon/HeadIcon.stories.tsx +981 -0
  34. package/dist/icons/head-icon/index.tsx +26 -0
  35. package/dist/icons/head-icon/meta.ts +8 -0
  36. package/dist/icons/index.ts +48 -25
  37. package/dist/icons/musical-note-icon/MusicalNoteIcon.stories.tsx +1032 -0
  38. package/dist/icons/musical-note-icon/index.tsx +25 -0
  39. package/dist/icons/musical-note-icon/meta.ts +8 -0
  40. package/dist/icons/notepad-icon/NotepadIcon.stories.tsx +1159 -0
  41. package/dist/icons/notepad-icon/index.tsx +21 -0
  42. package/dist/icons/notepad-icon/meta.ts +8 -0
  43. package/dist/icons/notes-icon/NotesIcon.stories.tsx +1159 -0
  44. package/dist/icons/notes-icon/index.tsx +24 -0
  45. package/dist/icons/notes-icon/meta.ts +8 -0
  46. package/dist/icons/paper-plane-icon/PaperPlaneIcon.stories.tsx +936 -0
  47. package/dist/icons/paper-plane-icon/index.tsx +33 -0
  48. package/dist/icons/paper-plane-icon/meta.ts +8 -0
  49. package/dist/icons/setting-icon/SettingIcon.stories.tsx +1024 -0
  50. package/dist/icons/setting-icon/index.tsx +30 -0
  51. package/dist/icons/setting-icon/meta.ts +8 -0
  52. package/dist/icons/suggestion-icon/SuggestionIcon.stories.tsx +907 -0
  53. package/dist/icons/suggestion-icon/index.tsx +33 -0
  54. package/dist/icons/suggestion-icon/meta.ts +8 -0
  55. package/dist/index.js +1 -1
  56. package/package.json +1 -1
@@ -1,3 +1,4 @@
1
+ import React from "react"
1
2
  import type { Meta, StoryObj } from "@storybook/react"
2
3
 
3
4
  import { Button } from "."
@@ -79,3 +80,45 @@ export const Disabled: Story = {
79
80
  variant: "primary",
80
81
  },
81
82
  }
83
+
84
+ export const WithToolTip: Story = {
85
+ render: () => (
86
+ <div className="flex gap-6 rounded p-8">
87
+ <Button
88
+ tooltip="Primary Variant"
89
+ tooltipContentProps={{
90
+ align: "center",
91
+ side: "top",
92
+ sideOffset: 10,
93
+ }}
94
+ >
95
+ Primary
96
+ </Button>
97
+ <Button
98
+ variant="secondary"
99
+ tooltip="Secondary Variant"
100
+ tooltipContentProps={{
101
+ align: "center",
102
+ side: "bottom",
103
+ sideOffset: 10,
104
+ }}
105
+ >
106
+ Secondary
107
+ </Button>
108
+ <Button
109
+ variant="outline"
110
+ tooltip="Outline Variant"
111
+ tooltipContentProps={{
112
+ align: "center",
113
+ side: "top",
114
+ sideOffset: 10,
115
+ }}
116
+ >
117
+ Outline
118
+ </Button>
119
+ <Button variant="text" tooltip="Text Variant">
120
+ Text
121
+ </Button>
122
+ </div>
123
+ ),
124
+ }
@@ -3,6 +3,8 @@ import { FeatureShineIcon } from "@icons/feature-shine-icon"
3
3
  import { cn } from "@lib/utils"
4
4
  import { cva } from "class-variance-authority"
5
5
 
6
+ import { withTooltip } from "../tooltip"
7
+
6
8
  export const buttonVariants = cva(
7
9
  "group relative font-fm-brand focus-visible:ring-fm-primary focus-visible:ring-offset-fm-contrast outline-none focus-visible:ring-2 focus-visible:ring-offset-6",
8
10
  {
@@ -68,8 +70,8 @@ export const innerButtonVariants = cva(
68
70
  export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
69
71
  children: React.ReactNode
70
72
  className?: string
71
- leftIcon?: React.ReactNode | boolean
72
- rightIcon?: React.ReactNode | boolean
73
+ leftIcon?: React.ReactNode
74
+ rightIcon?: React.ReactNode
73
75
  iconProps?: React.SVGProps<SVGSVGElement>
74
76
  innerClassName?: string
75
77
  isDisabled?: boolean
@@ -77,7 +79,7 @@ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
77
79
  variant?: "primary" | "secondary" | "outline" | "text"
78
80
  }
79
81
 
80
- export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
82
+ export const RawButton = forwardRef<HTMLButtonElement, ButtonProps>(
81
83
  (
82
84
  {
83
85
  variant = "primary",
@@ -99,7 +101,7 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
99
101
  ? "var(--color-fm-secondary-800)"
100
102
  : "var(--color-fm-primary)"
101
103
 
102
- const renderIcon = (icon: React.ReactNode | boolean) => {
104
+ const renderIcon = (icon: React.ReactNode) => {
103
105
  if (!icon) {
104
106
  return null
105
107
  }
@@ -156,3 +158,7 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
156
158
  )
157
159
  }
158
160
  )
161
+
162
+ RawButton.displayName = "RawButton"
163
+
164
+ export const Button = withTooltip(RawButton)
@@ -9,9 +9,9 @@ export interface ChipProps
9
9
  /** Sets the chip to selected state */
10
10
  selected?: boolean
11
11
  /** Icon to display on the left side (overrides icon prop for left side) */
12
- leftIcon?: ReactNode | boolean
12
+ leftIcon?: ReactNode
13
13
  /** Icon to display on the right side (overrides icon prop for right side) */
14
- rightIcon?: ReactNode | boolean
14
+ rightIcon?: ReactNode
15
15
  /** Icon properties for the left and right icons */
16
16
  iconProps?: React.SVGProps<SVGSVGElement>
17
17
  /** Callback fired when the chip is selected */
@@ -43,7 +43,7 @@ export const Chip = forwardRef<HTMLButtonElement, ChipProps>(
43
43
  }
44
44
  }
45
45
 
46
- const renderIcon = (icon: React.ReactNode | boolean) => {
46
+ const renderIcon = (icon: React.ReactNode) => {
47
47
  if (!icon) {
48
48
  return null
49
49
  }
@@ -227,7 +227,7 @@ function DropdownMenuRadioItem({
227
227
  data-slot="dropdown-menu-radio-item"
228
228
  className={cn(
229
229
  // Base styles
230
- "rounded-fm-s relative flex cursor-default items-center gap-2 px-4 py-3 pl-8",
230
+ "rounded-fm-s relative flex cursor-default items-center gap-2 px-4 py-3",
231
231
  "text-fm-primary font-fm-text leading-fm-lg [font-size:var(--text-fm-lg)] tracking-wide",
232
232
  "transition-colors duration-200 outline-none select-none",
233
233
  // Hover and focus states
@@ -245,12 +245,7 @@ function DropdownMenuRadioItem({
245
245
  >
246
246
  <span className="pointer-events-none absolute left-4 flex size-3.5 items-center justify-center">
247
247
  <DropdownMenuPrimitive.ItemIndicator>
248
- <TickIcon
249
- className={cn(
250
- "text-fm-icon-active size-2 fill-current",
251
- classes?.indicator
252
- )}
253
- />
248
+ <TickIcon className={cn("text-fm-icon-active", classes?.indicator)} />
254
249
  </DropdownMenuPrimitive.ItemIndicator>
255
250
  </span>
256
251
  {children}
@@ -4,6 +4,8 @@ import { FeatureShineIcon } from "@icons/feature-shine-icon"
4
4
  import { SearchIcon } from "@icons/search-icon"
5
5
  import { type Meta, type StoryObj } from "@storybook/react"
6
6
 
7
+ import { NotepadIcon } from "src/ui/icons"
8
+
7
9
  import { IconButton } from "."
8
10
 
9
11
  const meta: Meta<typeof IconButton> = {
@@ -133,6 +135,52 @@ export const WithoutBackground: Story = {
133
135
  ),
134
136
  }
135
137
 
138
+ export const WithToolTip: Story = {
139
+ render: () => (
140
+ <div className="bg-fm-neutral-0 flex flex-col space-y-6 rounded p-8">
141
+ <h2 className="text-fm-yellow-500 text-sm font-bold">
142
+ With ToolTip EXAMPLES
143
+ </h2>
144
+
145
+ <div className="flex space-x-4">
146
+ <IconButton
147
+ variant="background"
148
+ icon={<SearchIcon />}
149
+ label="Search"
150
+ onClick={() => alert("Search clicked")}
151
+ tooltip="Search Items"
152
+ tooltipContentProps={{
153
+ align: "center",
154
+ side: "bottom",
155
+ }}
156
+ />
157
+ <IconButton
158
+ variant="ghost"
159
+ icon={<CrossIcon />}
160
+ label="Close"
161
+ onClick={() => alert("Close clicked")}
162
+ tooltip="Cancel"
163
+ tooltipContentProps={{
164
+ align: "center",
165
+ side: "bottom",
166
+ }}
167
+ />
168
+ <IconButton
169
+ variant="outlined"
170
+ icon={<NotepadIcon />}
171
+ label="Add"
172
+ onClick={() => alert("Add clicked")}
173
+ tooltip="Notes"
174
+ tooltipContentProps={{
175
+ align: "center",
176
+ side: "bottom",
177
+ }}
178
+ />
179
+ </div>
180
+ </div>
181
+ ),
182
+ }
183
+
136
184
  export const Outlined: Story = {
137
185
  args: {
138
186
  label: "Search",
@@ -3,6 +3,8 @@ import { cn } from "@lib/utils"
3
3
  import { AccessibleIcon } from "@radix-ui/react-accessible-icon"
4
4
  import { cva, type VariantProps } from "class-variance-authority"
5
5
 
6
+ import { withTooltip } from "../tooltip"
7
+
6
8
  // Define variants with class-variance-authority
7
9
  const iconButtonVariants = cva(
8
10
  // Base styles for all icon buttons
@@ -65,7 +67,7 @@ export interface IconButtonProps
65
67
  className?: string
66
68
  }
67
69
 
68
- const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(
70
+ const IconButtonComp = forwardRef<HTMLButtonElement, IconButtonProps>(
69
71
  (
70
72
  {
71
73
  className,
@@ -125,6 +127,8 @@ const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(
125
127
  }
126
128
  )
127
129
 
128
- IconButton.displayName = "IconButton"
130
+ const IconButton = withTooltip(IconButtonComp)
131
+
132
+ IconButtonComp.displayName = "IconButton"
129
133
 
130
134
  export { IconButton, iconButtonVariants }
@@ -83,6 +83,7 @@ type InputProps = {
83
83
  onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void
84
84
  onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void
85
85
  onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void
86
+ onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void
86
87
  startIcon?: ReactNode
87
88
  endIcon?: ReactNode
88
89
  id?: string
@@ -223,6 +224,7 @@ const InputBase = forwardRef<
223
224
  onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void
224
225
  onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void
225
226
  onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void
227
+ onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void
226
228
  id?: string
227
229
  name?: string
228
230
  required?: boolean
@@ -337,6 +339,7 @@ const Input = forwardRef<HTMLInputElement, InputProps>(
337
339
  onChange,
338
340
  onBlur,
339
341
  onFocus,
342
+ onKeyDown,
340
343
  startIcon,
341
344
  endIcon,
342
345
  id,
@@ -418,6 +421,7 @@ const Input = forwardRef<HTMLInputElement, InputProps>(
418
421
  onChange={handleChange}
419
422
  onFocus={onFocus}
420
423
  onBlur={onBlur}
424
+ onKeyDown={onKeyDown}
421
425
  required={required}
422
426
  maxLength={maxLength}
423
427
  startIcon={!!startIcon}
@@ -35,19 +35,36 @@ const overlayVariants = cva(
35
35
 
36
36
  export interface OverlayProps
37
37
  extends React.HTMLAttributes<HTMLDivElement>,
38
- VariantProps<typeof overlayVariants> {}
38
+ VariantProps<typeof overlayVariants> {
39
+ classes?: {
40
+ content?: string
41
+ root?: string
42
+ wrapper?: string
43
+ }
44
+ }
39
45
 
40
46
  const Overlay = React.forwardRef<HTMLDivElement, OverlayProps>(
41
- ({ opacity, glass, noise, className, children, ...props }, ref) => (
47
+ ({ opacity, glass, noise, className, children, classes, ...props }, ref) => (
42
48
  <>
43
49
  <div
44
50
  ref={ref}
45
- className={cn(overlayVariants({ opacity, glass, noise }), className)}
51
+ className={cn(
52
+ overlayVariants({ opacity, glass, noise }),
53
+ className,
54
+ classes?.root
55
+ )}
46
56
  {...props}
47
57
  />
48
58
  {children && (
49
- <div className="pointer-events-none fixed inset-0 z-50 flex items-center justify-center">
50
- <div className="pointer-events-auto">{children}</div>
59
+ <div
60
+ className={cn(
61
+ "pointer-events-none fixed inset-0 z-50 flex items-center justify-center",
62
+ classes?.wrapper
63
+ )}
64
+ >
65
+ <div className={cn("pointer-events-auto", classes?.content)}>
66
+ {children}
67
+ </div>
51
68
  </div>
52
69
  )}
53
70
  </>
@@ -301,7 +301,9 @@ const closeIconVariants = cva(
301
301
  interface SheetContentProps
302
302
  extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,
303
303
  VariantProps<typeof sheetVariants>,
304
- ISheetOverlay {}
304
+ ISheetOverlay {
305
+ container: HTMLElement | null
306
+ }
305
307
 
306
308
  const SheetContent = React.forwardRef<
307
309
  React.ElementRef<typeof SheetPrimitive.Content>,
@@ -317,11 +319,12 @@ const SheetContent = React.forwardRef<
317
319
  noise,
318
320
  children,
319
321
  classes,
322
+ container,
320
323
  ...props
321
324
  },
322
325
  ref
323
326
  ) => (
324
- <SheetPortal>
327
+ <SheetPortal container={container}>
325
328
  <SheetOverlay
326
329
  opacity={opacity}
327
330
  glass={glass}
@@ -20,8 +20,8 @@ interface TagProps {
20
20
  emphasis?: "primary" | "secondary" | "tertiary"
21
21
  className?: string
22
22
  size?: "xs" | "sm" | "md"
23
- leftIcon?: React.ReactNode | boolean
24
- rightIcon?: React.ReactNode | boolean
23
+ leftIcon?: React.ReactNode
24
+ rightIcon?: React.ReactNode
25
25
  children: React.ReactNode
26
26
  iconProps?: React.SVGProps<SVGSVGElement>
27
27
  id?: string
@@ -30,6 +30,8 @@ interface TextAreaBaseProps {
30
30
  onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void
31
31
  onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void
32
32
  onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void
33
+ onInput?: (e: React.FocusEvent<HTMLTextAreaElement>) => void
34
+ onKeyDown?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void
33
35
  id?: string
34
36
  name?: string
35
37
  required?: boolean
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import * as React from "react"
2
3
  import { cn } from "@lib/utils"
3
4
  import * as TooltipPrimitive from "@radix-ui/react-tooltip"
@@ -301,4 +302,48 @@ function TooltipContent({
301
302
  )
302
303
  }
303
304
 
305
+ export function withTooltip<
306
+ T extends
307
+ | keyof React.JSX.IntrinsicElements
308
+ | React.ForwardRefExoticComponent<any>,
309
+ >(Component: T) {
310
+ return React.forwardRef<
311
+ React.ElementRef<T>,
312
+ {
313
+ tooltip?: React.ReactNode
314
+ tooltipContentProps?: Omit<
315
+ React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>,
316
+ "children"
317
+ >
318
+ tooltipProps?: Omit<
319
+ React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>,
320
+ "children"
321
+ >
322
+ } & React.ComponentPropsWithoutRef<T>
323
+ >(function ExtendComponent(
324
+ { tooltip, tooltipContentProps, tooltipProps, ...props },
325
+ ref
326
+ ) {
327
+ const [mounted, setMounted] = React.useState(false)
328
+
329
+ React.useEffect(() => {
330
+ setMounted(true)
331
+ }, [])
332
+
333
+ const component = <Component ref={ref} {...(props as any)} />
334
+
335
+ if (tooltip && mounted) {
336
+ return (
337
+ <Tooltip delayDuration={200} {...tooltipProps}>
338
+ <TooltipTrigger asChild>{component}</TooltipTrigger>
339
+
340
+ <TooltipContent {...tooltipContentProps}>{tooltip}</TooltipContent>
341
+ </Tooltip>
342
+ )
343
+ }
344
+
345
+ return component
346
+ })
347
+ }
348
+
304
349
  export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
@@ -1,3 +1,4 @@
1
1
  // Export all hooks from a single entry point
2
2
  export * from "./use-previous"
3
3
  export * from "./use-standalone-pagination"
4
+ export * from "./use-change-state"