aural-ui 2.1.5 → 2.1.7

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.
@@ -80,10 +80,13 @@ type InputProps = {
80
80
  className?: string
81
81
  value?: string | number
82
82
  defaultValue?: string | number
83
+ autoComplete?: string
84
+ autoFocus?: boolean
83
85
  onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void
84
86
  onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void
85
87
  onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void
86
88
  onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void
89
+ ariaLabel?: string
87
90
  startIcon?: ReactNode
88
91
  endIcon?: ReactNode
89
92
  id?: string
@@ -208,6 +211,8 @@ const PasswordToggle = forwardRef<
208
211
  </button>
209
212
  ))
210
213
 
214
+ PasswordToggle.displayName = "PasswordToggle"
215
+
211
216
  // InputBase component - Core input functionality without any wrapper elements
212
217
  const InputBase = forwardRef<
213
218
  HTMLInputElement,
@@ -217,6 +222,7 @@ const InputBase = forwardRef<
217
222
  disabled?: boolean
218
223
  className?: string
219
224
  unstyled?: boolean
225
+ ariaLabel?: string
220
226
  type?: string
221
227
  placeholder?: string
222
228
  value?: string | number
@@ -256,6 +262,7 @@ const InputBase = forwardRef<
256
262
  maxLength,
257
263
  startIcon = false,
258
264
  endIcon = false,
265
+ ariaLabel,
259
266
  ...props
260
267
  },
261
268
  ref
@@ -303,6 +310,7 @@ const InputBase = forwardRef<
303
310
  ref={ref}
304
311
  type={type}
305
312
  id={id}
313
+ aria-label={ariaLabel}
306
314
  name={name}
307
315
  className={inputClassName}
308
316
  placeholder={placeholder}
@@ -32,6 +32,7 @@ A comprehensive search input component with both controlled and uncontrolled mod
32
32
  - **Dark Theme Optimized**: Default styling for dark interfaces
33
33
  - **Accessibility**: Full keyboard navigation and screen reader support
34
34
  - **Event Handling**: Separate onChange and onSearch callbacks
35
+ - **Input Ref Access**: Easily focus or manage the input programmatically
35
36
 
36
37
  ## Component Modes
37
38
 
@@ -40,11 +41,13 @@ Use \`value\`, \`onChange\`, and \`onSearch\` for external state management:
40
41
 
41
42
  \`\`\`tsx
42
43
  const [searchValue, setSearchValue] = useState("")
44
+ const inputRef = useRef<HTMLInputElement>(null)
43
45
 
44
46
  <Search
45
47
  value={searchValue}
46
48
  onChange={setSearchValue}
47
49
  onSearch={(query) => handleSearch(query)}
50
+ inputRef={inputRef}
48
51
  />
49
52
  \`\`\`
50
53
 
@@ -52,9 +55,12 @@ const [searchValue, setSearchValue] = useState("")
52
55
  Use \`initialValue\` and \`onSearch\` for internal state management:
53
56
 
54
57
  \`\`\`tsx
58
+ const inputRef = useRef<HTMLInputElement>(null)
59
+
55
60
  <Search
56
61
  initialValue="initial search"
57
62
  onSearch={(query) => handleSearch(query)}
63
+ inputRef={inputRef}
58
64
  />
59
65
  \`\`\`
60
66
 
@@ -68,6 +74,7 @@ Use \`initialValue\` and \`onSearch\` for internal state management:
68
74
  - **children**: Custom content for rendering results
69
75
  - **placeholder**: Input placeholder text
70
76
  - **className**: Additional CSS classes
77
+ - **inputRef**: Ref to access or focus the underlying input element
71
78
  `,
72
79
  },
73
80
  },
@@ -14,11 +14,13 @@ export interface SearchProps {
14
14
  placeholder?: string
15
15
  className?: string
16
16
  value?: string // Add value prop for controlled component
17
+ autoFocus?: boolean
17
18
  onSearch?: (query: string) => void
18
19
  onChange?: (value: string) => void // Add onChange for controlled component
19
20
  results?: SearchResult[]
20
21
  initialValue?: string
21
22
  children?: React.ReactNode // Children can be used to render custom search results
23
+ inputRef?: React.RefObject<HTMLInputElement | null>
22
24
  }
23
25
 
24
26
  export const Search = React.forwardRef<HTMLDivElement, SearchProps>(
@@ -27,11 +29,13 @@ export const Search = React.forwardRef<HTMLDivElement, SearchProps>(
27
29
  placeholder = "Search episodes",
28
30
  className = "",
29
31
  value: controlledValue,
32
+ autoFocus = false,
30
33
  onSearch,
31
34
  onChange,
32
35
  results = [],
33
36
  initialValue = "",
34
37
  children, // Children can be used to render custom search results
38
+ inputRef,
35
39
  },
36
40
  ref
37
41
  ) => {
@@ -99,8 +103,10 @@ export const Search = React.forwardRef<HTMLDivElement, SearchProps>(
99
103
  >
100
104
  {/* Search Input */}
101
105
  <Input
106
+ ref={inputRef}
102
107
  placeholder={placeholder}
103
108
  value={value}
109
+ autoFocus={autoFocus}
104
110
  onChange={handleChange}
105
111
  onFocus={() => setIsFocused(true)}
106
112
  onBlur={() => setIsFocused(false)}
@@ -70,6 +70,7 @@ interface SliderProps
70
70
  showLabel?: boolean
71
71
  label?: string
72
72
  alignThumb?: "center" | "bottom" | "top"
73
+ ariaLabel?: string
73
74
  classes?: {
74
75
  root?: string
75
76
  track?: string
@@ -89,6 +90,7 @@ function Slider({
89
90
  showLabel = true,
90
91
  label,
91
92
  alignThumb = "bottom",
93
+ ariaLabel,
92
94
  classes = {},
93
95
  ...props
94
96
  }: SliderProps) {
@@ -102,6 +104,13 @@ function Slider({
102
104
  [value, defaultValue, min, max]
103
105
  )
104
106
 
107
+ const getThumbAriaLabel = (index: number, currentValue: number) => {
108
+ if (ariaLabel) {
109
+ return `${ariaLabel}, current value: ${currentValue}`
110
+ }
111
+ return `Slider control ${index + 1}, current value: ${currentValue}`
112
+ }
113
+
105
114
  return (
106
115
  <SliderPrimitive.Root
107
116
  data-slot="slider"
@@ -145,6 +154,7 @@ function Slider({
145
154
  <SliderPrimitive.Thumb
146
155
  data-slot="slider-thumb"
147
156
  key={index}
157
+ aria-label={getThumbAriaLabel(index, _values[index])}
148
158
  className={cn(
149
159
  "block shrink-0 transition-[color,box-shadow] hover:ring-2 focus-visible:ring-2 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50",
150
160
  sliderThumbVariants({ size, variant }),
@@ -30,6 +30,24 @@ const meta: Meta<typeof Switch> = {
30
30
  control: { type: "boolean" },
31
31
  description: "Whether the switch is disabled or not",
32
32
  },
33
+ size: {
34
+ control: { type: "select" },
35
+ options: ["sm", "md", "lg"],
36
+ description: "Size variant of the switch",
37
+ defaultValue: "md",
38
+ },
39
+ onIcon: {
40
+ control: { type: "text" },
41
+ description: "Custom icon to display when switch is ON",
42
+ },
43
+ offIcon: {
44
+ control: { type: "text" },
45
+ description: "Custom icon to display when switch is OFF",
46
+ },
47
+ classNames: {
48
+ control: { type: "object" },
49
+ description: "Custom classNames for different parts of the switch",
50
+ },
33
51
  },
34
52
  }
35
53
 
@@ -61,6 +79,37 @@ export const DisabledAndChecked: Story = {
61
79
  },
62
80
  }
63
81
 
82
+ export const SizeVariants: Story = {
83
+ render: () => (
84
+ <div className="flex flex-col items-center space-y-4">
85
+ <div className="flex items-center space-x-4">
86
+ <Switch size="sm" checked={true} />
87
+ <span className="text-sm text-gray-400">Small (sm)</span>
88
+ </div>
89
+ <div className="flex items-center space-x-4">
90
+ <Switch size="md" checked={true} />
91
+ <span className="text-sm text-gray-400">Medium (md)</span>
92
+ </div>
93
+ <div className="flex items-center space-x-4">
94
+ <Switch size="lg" checked={true} />
95
+ <span className="text-sm text-gray-400">Large (lg)</span>
96
+ </div>
97
+ </div>
98
+ ),
99
+ }
100
+
101
+ export const WithCustomClassNames: Story = {
102
+ args: {
103
+ checked: true,
104
+ classNames: {
105
+ root: "border-2 border-blue-500",
106
+ onIcon: "text-green-600 font-bold",
107
+ offIcon: "text-gray-400",
108
+ thumb: "bg-blue-500 shadow-xl",
109
+ },
110
+ },
111
+ }
112
+
64
113
  export const WithLabel: Story = {
65
114
  render: () => (
66
115
  <div className="flex items-center space-x-2">
@@ -108,3 +157,57 @@ export const CheckedWithIcons: Story = {
108
157
  offIcon: <CrossIcon />,
109
158
  },
110
159
  }
160
+
161
+ export const AllVariants: Story = {
162
+ render: () => (
163
+ <div className="grid grid-cols-2 gap-6">
164
+ <div className="space-y-4">
165
+ <h3 className="text-lg font-semibold">Size Variants</h3>
166
+ <div className="space-y-3">
167
+ <div className="flex items-center justify-between">
168
+ <span>Small</span>
169
+ <Switch size="sm" checked={true} />
170
+ </div>
171
+ <div className="flex items-center justify-between">
172
+ <span>Medium</span>
173
+ <Switch size="md" checked={true} />
174
+ </div>
175
+ <div className="flex items-center justify-between">
176
+ <span>Large</span>
177
+ <Switch size="lg" checked={true} />
178
+ </div>
179
+ </div>
180
+ </div>
181
+
182
+ <div className="space-y-4">
183
+ <h3 className="text-lg font-semibold">With Custom Styling</h3>
184
+ <div className="space-y-3">
185
+ <div className="flex items-center justify-between">
186
+ <span>Custom Colors</span>
187
+ <Switch
188
+ size="md"
189
+ checked={true}
190
+ classNames={{
191
+ root: "border-2 border-purple-500",
192
+ thumb: "bg-purple-500",
193
+ }}
194
+ />
195
+ </div>
196
+ <div className="flex items-center justify-between">
197
+ <span>With Icons</span>
198
+ <Switch
199
+ size="md"
200
+ checked={true}
201
+ onIcon={<TickIcon />}
202
+ offIcon={<CrossIcon />}
203
+ />
204
+ </div>
205
+ <div className="flex items-center justify-between">
206
+ <span>Disabled</span>
207
+ <Switch size="md" checked={true} disabled />
208
+ </div>
209
+ </div>
210
+ </div>
211
+ </div>
212
+ ),
213
+ }
@@ -1,57 +1,129 @@
1
1
  import * as React from "react"
2
2
  import { cn } from "@lib/utils"
3
3
  import * as SwitchPrimitives from "@radix-ui/react-switch"
4
+ import clsx from "clsx"
5
+
6
+ type SwitchSize = "sm" | "md" | "lg"
7
+
8
+ type SwitchClassNames = {
9
+ root?: string
10
+ onIcon?: string
11
+ offIcon?: string
12
+ thumb?: string
13
+ }
4
14
 
5
15
  type SwitchWithIconsProps = React.ComponentPropsWithoutRef<
6
16
  typeof SwitchPrimitives.Root
7
17
  > & {
8
18
  offIcon?: React.ReactNode
9
19
  onIcon?: React.ReactNode
20
+ size?: SwitchSize
21
+ classNames?: SwitchClassNames
22
+ }
23
+
24
+ const switchVariants = {
25
+ size: {
26
+ sm: {
27
+ root: "h-6 w-12",
28
+ thumb:
29
+ "size-4 data-[state=checked]:translate-x-6.5 data-[state=unchecked]:translate-x-1",
30
+ onIcon: "p-1 left-1 text-fm-xs",
31
+ offIcon: "right-[5px] text-fm-xs",
32
+ },
33
+ md: {
34
+ root: "h-8 w-14",
35
+ thumb:
36
+ "size-6 data-[state=checked]:translate-x-7 data-[state=unchecked]:translate-x-1",
37
+ onIcon: "left-2 text-fm-sm",
38
+ offIcon: "right-1.5 text-fm-sm",
39
+ },
40
+ lg: {
41
+ root: "h-10 w-18",
42
+ thumb:
43
+ "size-8 data-[state=checked]:translate-x-9 data-[state=unchecked]:translate-x-1",
44
+ onIcon: "left-2.5 text-fm-base",
45
+ offIcon: "right-2 text-fm-base",
46
+ },
47
+ },
10
48
  }
11
49
 
12
50
  const Switch = React.forwardRef<
13
51
  React.ElementRef<typeof SwitchPrimitives.Root>,
14
52
  SwitchWithIconsProps
15
- >(({ className, onIcon, offIcon, checked, disabled, ...props }, ref) => (
16
- <SwitchPrimitives.Root
17
- ref={ref}
18
- checked={checked}
19
- disabled={disabled}
20
- className={cn(
21
- "data-[state=checked]:not-[:disabled]:border-fm-divider-positive data-[state=checked]:not-[:disabled]:bg-fm-green-50",
22
- "data-[state=unchecked]:not-[:disabled]:border-fm-divider-primary data-[state=unchecked]:not-[:disabled]:bg-fm-surface-primary",
23
- "data-[state=unchecked]:disabled:border-fm-divider-tertiary data-[state=unchecked]:disabled:bg-fm-surface-secondary",
24
- "data-[state=checked]:disabled:border-fm-green-100 data-[state=checked]:disabled:bg-fm-green-50",
25
- "focus-visible:ring-fm-primary focus-visible:ring-offset-fm-green-50",
26
- "hover:bg-fm-surface-secondary data-[state=unchecked]:not-[:disabled]:hover:bg-fm-surface-secondary",
27
- "data-[state=unchecked]:not-[:disabled]:hover:border-fm-divider-primary",
28
- "relative h-8 w-14 rounded-full border border-solid transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed",
29
- className
30
- )}
31
- {...props}
32
- >
33
- <span
34
- className={cn(
35
- "font-fm-brand text-fm-positive absolute top-1/2 left-2 -translate-y-1/2 [font-size:var(--text-fm-sm)]",
36
- disabled && "text-fm-positive-tert"
37
- )}
38
- data-state={checked ? "checked" : "unchecked"}
39
- data-disabled={disabled || undefined}
40
- >
41
- {onIcon ?? "ON"}
42
- </span>
43
-
44
- <span
45
- className="font-fm-brand text-fm-tertiary absolute top-1/2 right-1.5 -translate-y-1/2 [font-size:var(--text-fm-sm)]"
46
- data-state={checked ? "checked" : "unchecked"}
47
- data-disabled={disabled || undefined}
48
- >
49
- {offIcon ?? "OFF"}
50
- </span>
51
-
52
- <SwitchPrimitives.Thumb className="bg-fm-icon-active data-[disabled]:bg-fm-icon-inactive pointer-events-none z-10 block size-6 rounded-full shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-7 data-[state=unchecked]:translate-x-1" />
53
- </SwitchPrimitives.Root>
54
- ))
53
+ >(
54
+ (
55
+ {
56
+ className,
57
+ onIcon,
58
+ offIcon,
59
+ checked,
60
+ disabled,
61
+ size = "md",
62
+ classNames,
63
+ ...props
64
+ },
65
+ ref
66
+ ) => {
67
+ const sizeConfig = switchVariants.size[size]
68
+
69
+ return (
70
+ <SwitchPrimitives.Root
71
+ ref={ref}
72
+ checked={checked}
73
+ disabled={disabled}
74
+ className={cn(
75
+ "data-[state=checked]:not-[:disabled]:border-fm-divider-positive data-[state=checked]:not-[:disabled]:bg-fm-green-50",
76
+ "data-[state=unchecked]:not-[:disabled]:border-fm-divider-primary data-[state=unchecked]:not-[:disabled]:bg-fm-surface-primary",
77
+ "data-[state=unchecked]:disabled:border-fm-divider-tertiary data-[state=unchecked]:disabled:bg-fm-surface-secondary",
78
+ "data-[state=checked]:disabled:border-fm-green-100 data-[state=checked]:disabled:bg-fm-green-50",
79
+ "focus-visible:ring-fm-primary focus-visible:ring-offset-fm-green-50",
80
+ "hover:bg-fm-surface-secondary data-[state=unchecked]:not-[:disabled]:hover:bg-fm-surface-secondary",
81
+ "data-[state=unchecked]:not-[:disabled]:hover:border-fm-divider-primary",
82
+ "relative cursor-pointer rounded-full border border-solid transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed",
83
+ sizeConfig.root,
84
+ classNames?.root,
85
+ className
86
+ )}
87
+ {...props}
88
+ >
89
+ <span
90
+ className={clsx(
91
+ "font-fm-brand text-fm-divider-positive absolute top-1/2 -translate-y-1/2",
92
+ {
93
+ "text-fm-positive-tert": disabled,
94
+ },
95
+ sizeConfig.onIcon,
96
+ classNames?.onIcon
97
+ )}
98
+ data-state={checked ? "checked" : "unchecked"}
99
+ data-disabled={disabled || undefined}
100
+ >
101
+ {onIcon ?? "ON"}
102
+ </span>
103
+
104
+ <span
105
+ className={clsx(
106
+ "font-fm-brand text-fm-tertiary absolute top-1/2 -translate-y-1/2",
107
+ sizeConfig.offIcon,
108
+ classNames?.offIcon
109
+ )}
110
+ data-state={checked ? "checked" : "unchecked"}
111
+ data-disabled={disabled || undefined}
112
+ >
113
+ {offIcon ?? "OFF"}
114
+ </span>
115
+
116
+ <SwitchPrimitives.Thumb
117
+ className={cn(
118
+ "bg-fm-icon-active data-[disabled]:bg-fm-icon-inactive pointer-events-none z-10 block rounded-full shadow-lg ring-0 transition-transform",
119
+ sizeConfig.thumb,
120
+ classNames?.thumb
121
+ )}
122
+ />
123
+ </SwitchPrimitives.Root>
124
+ )
125
+ }
126
+ )
55
127
  Switch.displayName = SwitchPrimitives.Root.displayName
56
128
 
57
- export { Switch }
129
+ export { Switch, type SwitchSize, type SwitchClassNames }
@@ -5,7 +5,7 @@ import ThumbnailTags from "."
5
5
 
6
6
  type ThumbnailTagsProps = React.ComponentProps<typeof ThumbnailTags>
7
7
 
8
- const meta: Meta<ThumbnailTagsProps> = {
8
+ const meta: Meta<typeof ThumbnailTags> = {
9
9
  title: "Components/UI/ThumbnailTags",
10
10
  component: ThumbnailTags,
11
11
  parameters: {
@@ -28,6 +28,7 @@ const meta: Meta<ThumbnailTagsProps> = {
28
28
  "top10",
29
29
  "engagement",
30
30
  "completed-series",
31
+ "ranked",
31
32
  ],
32
33
  description:
33
34
  "Determines the visual style and layout of the thumbnail tag",
@@ -44,8 +45,13 @@ const meta: Meta<ThumbnailTagsProps> = {
44
45
  control: "text",
45
46
  description: "The secondary text content for variant Engagement",
46
47
  },
48
+ classNames: {
49
+ control: "object",
50
+ description:
51
+ "Custom CSS classes for the component elements (container, text, primaryText, secondaryText,svg)",
52
+ },
47
53
  },
48
- } satisfies Meta<ThumbnailTagsProps>
54
+ }
49
55
 
50
56
  export default meta
51
57
  type Story = StoryObj<ThumbnailTagsProps>
@@ -57,6 +63,13 @@ export const Default: Story = {
57
63
  },
58
64
  }
59
65
 
66
+ export const Ranked: Story = {
67
+ args: {
68
+ variant: "ranked",
69
+ text: "#1 in hindi",
70
+ },
71
+ }
72
+
60
73
  export const PromotionalTag = {
61
74
  args: {
62
75
  variant: "promotional",
@@ -98,7 +111,7 @@ export const AllVariants: Story = {
98
111
  render: () => (
99
112
  <div className="flex flex-col gap-6">
100
113
  <div className="space-y-4">
101
- <h3 className="text-lg font-semibold text-white">Promotional Tag</h3>
114
+ <h3 className="text-fm-lg font-semibold text-white">Promotional Tag</h3>
102
115
  <div className="flex gap-4">
103
116
  <ThumbnailTags variant="promotional" text="30% off" />
104
117
  <ThumbnailTags variant="promotional" text="NEW" />
@@ -107,7 +120,7 @@ export const AllVariants: Story = {
107
120
  </div>
108
121
 
109
122
  <div className="space-y-4">
110
- <h3 className="text-lg font-semibold text-white">Checked Tag</h3>
123
+ <h3 className="text-fm-lg font-semibold text-white">Checked Tag</h3>
111
124
  <div className="flex gap-4">
112
125
  <ThumbnailTags variant="checked" />
113
126
  <ThumbnailTags variant="checked" />
@@ -116,7 +129,7 @@ export const AllVariants: Story = {
116
129
  </div>
117
130
 
118
131
  <div className="space-y-4">
119
- <h3 className="text-lg font-semibold text-white">Engagement Tag</h3>
132
+ <h3 className="text-fm-lg font-semibold text-white">Engagement Tag</h3>
120
133
  <div className="flex gap-4">
121
134
  <ThumbnailTags
122
135
  variant="engagement"
@@ -137,20 +150,27 @@ export const AllVariants: Story = {
137
150
  </div>
138
151
 
139
152
  <div className="space-y-4">
140
- <h3 className="text-lg font-semibold text-white">Top 10 Tag</h3>
153
+ <h3 className="text-fm-lg font-semibold text-white">Top 10 Tag</h3>
141
154
  <div className="flex gap-4">
142
155
  <ThumbnailTags variant="top10" />
143
156
  </div>
144
157
  </div>
145
158
 
146
159
  <div className="space-y-4">
147
- <h3 className="text-lg font-semibold text-white">
160
+ <h3 className="text-fm-lg font-semibold text-white">
148
161
  Completed Series Tag
149
162
  </h3>
150
163
  <div className="flex gap-4">
151
164
  <ThumbnailTags variant="completed-series" />
152
165
  </div>
153
166
  </div>
167
+
168
+ <div className="space-y-4">
169
+ <h3 className="text-fm-lg font-semibold text-white">Ranked Tag</h3>
170
+ <div className="flex gap-4">
171
+ <ThumbnailTags variant="ranked" text="#1 show" />
172
+ </div>
173
+ </div>
154
174
  </div>
155
175
  ),
156
176
  }
@@ -163,7 +183,9 @@ export const UseCases: Story = {
163
183
  render: () => (
164
184
  <div className="space-y-8">
165
185
  <div className="space-y-4">
166
- <h3 className="text-lg font-semibold text-white">Promotional Tags</h3>
186
+ <h3 className="text-fm-lg font-semibold text-white">
187
+ Promotional Tags
188
+ </h3>
167
189
  <div className="flex gap-4">
168
190
  <ThumbnailTags variant="promotional" text="30% off" />
169
191
  <ThumbnailTags variant="promotional" text="FREE" />
@@ -172,14 +194,18 @@ export const UseCases: Story = {
172
194
  </div>
173
195
 
174
196
  <div className="space-y-4">
175
- <h3 className="text-lg font-semibold text-white">Status Indicators</h3>
197
+ <h3 className="text-fm-lg font-semibold text-white">
198
+ Status Indicators
199
+ </h3>
176
200
  <div className="flex gap-4">
177
201
  <ThumbnailTags variant="checked" />
178
202
  </div>
179
203
  </div>
180
204
 
181
205
  <div className="space-y-4">
182
- <h3 className="text-lg font-semibold text-white">Engagement Metrics</h3>
206
+ <h3 className="text-fm-lg font-semibold text-white">
207
+ Engagement Metrics
208
+ </h3>
183
209
  <div className="flex gap-4">
184
210
  <ThumbnailTags
185
211
  variant="engagement"
@@ -200,10 +226,13 @@ export const UseCases: Story = {
200
226
  </div>
201
227
 
202
228
  <div className="space-y-4">
203
- <h3 className="text-lg font-semibold text-white">Achievement Badges</h3>
229
+ <h3 className="text-fm-lg font-semibold text-white">
230
+ Achievement Badges
231
+ </h3>
204
232
  <div className="flex gap-4">
205
233
  <ThumbnailTags variant="top10" />
206
234
  <ThumbnailTags variant="completed-series" />
235
+ <ThumbnailTags variant="ranked" text="#1 show" />
207
236
  </div>
208
237
  </div>
209
238
  </div>