@neoptocom/neopto-ui 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -151,7 +151,7 @@ function Card({
151
151
  children,
152
152
  className = "",
153
153
  style,
154
- showDecorations = true,
154
+ showDecorations = false,
155
155
  ...props
156
156
  }) {
157
157
  const mergedStyle = {
@@ -1312,6 +1312,9 @@ var MessageBubble = React2__namespace.forwardRef(
1312
1312
  }
1313
1313
  );
1314
1314
  MessageBubble.displayName = "MessageBubble";
1315
+ function Separator({ className = "" }) {
1316
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `w-full my-1.5 h-px bg-[var(--border)] ${className}` });
1317
+ }
1315
1318
 
1316
1319
  exports.AgentButton = AgentButton_default;
1317
1320
  exports.AnimatedBgCircle = AnimatedBgCircle_default;
@@ -1331,6 +1334,7 @@ exports.Input = Input;
1331
1334
  exports.MessageBubble = MessageBubble;
1332
1335
  exports.Modal = Modal;
1333
1336
  exports.Search = Search;
1337
+ exports.Separator = Separator;
1334
1338
  exports.Skeleton = Skeleton;
1335
1339
  exports.Typo = Typo;
1336
1340
  exports.assets = assets_exports;
package/dist/index.d.cts CHANGED
@@ -45,7 +45,7 @@ type CardProps = React.HTMLAttributes<HTMLDivElement> & {
45
45
  children: React.ReactNode;
46
46
  /** Additional CSS classes */
47
47
  className?: string;
48
- /** Show decorative elements (default: true) */
48
+ /** Show decorative elements (default: false) */
49
49
  showDecorations?: boolean;
50
50
  };
51
51
  declare function Card({ children, className, style, showDecorations, ...props }: CardProps): react_jsx_runtime.JSX.Element;
@@ -309,4 +309,9 @@ type MessageBubbleProps = {
309
309
  };
310
310
  declare const MessageBubble: React.ForwardRefExoticComponent<MessageBubbleProps & React.RefAttributes<HTMLDivElement>>;
311
311
 
312
- export { AgentButton, type AgentButtonProps, AnimatedBgCircle, AnimatedBgRectangle, AppBackground, type AppBackgroundProps, Autocomplete, type AutocompleteOption, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BackgroundBlur, type BackgroundBlurProps, Button, type ButtonProps, Card, type CardProps, Chip, type ChipProps, Counter, type CounterProps, Icon, IconButton, type IconButtonProps, type IconProps, Input, type InputProps, MessageBubble, type MessageBubbleProps, Modal, type ModalProps, Search, type SearchOption, type SearchProps, Skeleton, type SkeletonProps, Typo, type TypoProps, type TypoVariant, type TypoWeight, index as assets };
312
+ type SeparatorProps = {
313
+ className?: string;
314
+ };
315
+ declare function Separator({ className }: SeparatorProps): react_jsx_runtime.JSX.Element;
316
+
317
+ export { AgentButton, type AgentButtonProps, AnimatedBgCircle, AnimatedBgRectangle, AppBackground, type AppBackgroundProps, Autocomplete, type AutocompleteOption, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BackgroundBlur, type BackgroundBlurProps, Button, type ButtonProps, Card, type CardProps, Chip, type ChipProps, Counter, type CounterProps, Icon, IconButton, type IconButtonProps, type IconProps, Input, type InputProps, MessageBubble, type MessageBubbleProps, Modal, type ModalProps, Search, type SearchOption, type SearchProps, Separator, type SeparatorProps, Skeleton, type SkeletonProps, Typo, type TypoProps, type TypoVariant, type TypoWeight, index as assets };
package/dist/index.d.ts CHANGED
@@ -45,7 +45,7 @@ type CardProps = React.HTMLAttributes<HTMLDivElement> & {
45
45
  children: React.ReactNode;
46
46
  /** Additional CSS classes */
47
47
  className?: string;
48
- /** Show decorative elements (default: true) */
48
+ /** Show decorative elements (default: false) */
49
49
  showDecorations?: boolean;
50
50
  };
51
51
  declare function Card({ children, className, style, showDecorations, ...props }: CardProps): react_jsx_runtime.JSX.Element;
@@ -309,4 +309,9 @@ type MessageBubbleProps = {
309
309
  };
310
310
  declare const MessageBubble: React.ForwardRefExoticComponent<MessageBubbleProps & React.RefAttributes<HTMLDivElement>>;
311
311
 
312
- export { AgentButton, type AgentButtonProps, AnimatedBgCircle, AnimatedBgRectangle, AppBackground, type AppBackgroundProps, Autocomplete, type AutocompleteOption, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BackgroundBlur, type BackgroundBlurProps, Button, type ButtonProps, Card, type CardProps, Chip, type ChipProps, Counter, type CounterProps, Icon, IconButton, type IconButtonProps, type IconProps, Input, type InputProps, MessageBubble, type MessageBubbleProps, Modal, type ModalProps, Search, type SearchOption, type SearchProps, Skeleton, type SkeletonProps, Typo, type TypoProps, type TypoVariant, type TypoWeight, index as assets };
312
+ type SeparatorProps = {
313
+ className?: string;
314
+ };
315
+ declare function Separator({ className }: SeparatorProps): react_jsx_runtime.JSX.Element;
316
+
317
+ export { AgentButton, type AgentButtonProps, AnimatedBgCircle, AnimatedBgRectangle, AppBackground, type AppBackgroundProps, Autocomplete, type AutocompleteOption, type AutocompleteProps, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, BackgroundBlur, type BackgroundBlurProps, Button, type ButtonProps, Card, type CardProps, Chip, type ChipProps, Counter, type CounterProps, Icon, IconButton, type IconButtonProps, type IconProps, Input, type InputProps, MessageBubble, type MessageBubbleProps, Modal, type ModalProps, Search, type SearchOption, type SearchProps, Separator, type SeparatorProps, Skeleton, type SkeletonProps, Typo, type TypoProps, type TypoVariant, type TypoWeight, index as assets };
package/dist/index.js CHANGED
@@ -130,7 +130,7 @@ function Card({
130
130
  children,
131
131
  className = "",
132
132
  style,
133
- showDecorations = true,
133
+ showDecorations = false,
134
134
  ...props
135
135
  }) {
136
136
  const mergedStyle = {
@@ -1291,5 +1291,8 @@ var MessageBubble = React2.forwardRef(
1291
1291
  }
1292
1292
  );
1293
1293
  MessageBubble.displayName = "MessageBubble";
1294
+ function Separator({ className = "" }) {
1295
+ return /* @__PURE__ */ jsx("div", { className: `w-full my-1.5 h-px bg-[var(--border)] ${className}` });
1296
+ }
1294
1297
 
1295
- export { AgentButton_default as AgentButton, AnimatedBgCircle_default as AnimatedBgCircle, AnimatedBgRectangle_default as AnimatedBgRectangle, AppBackground, Autocomplete, Avatar, AvatarGroup, BackgroundBlur, Button, Card, Chip, Counter, Icon, IconButton, Input, MessageBubble, Modal, Search, Skeleton, Typo, assets_exports as assets };
1298
+ export { AgentButton_default as AgentButton, AnimatedBgCircle_default as AnimatedBgCircle, AnimatedBgRectangle_default as AnimatedBgRectangle, AppBackground, Autocomplete, Avatar, AvatarGroup, BackgroundBlur, Button, Card, Chip, Counter, Icon, IconButton, Input, MessageBubble, Modal, Search, Separator, Skeleton, Typo, assets_exports as assets };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neoptocom/neopto-ui",
3
- "version": "0.12.0",
3
+ "version": "0.12.1",
4
4
  "private": false,
5
5
  "description": "A modern React component library built with Tailwind CSS v4 and TypeScript. Features dark mode, design tokens, and comprehensive Storybook documentation. Requires Tailwind v4+.",
6
6
  "keywords": [
@@ -5,7 +5,7 @@ export type CardProps = React.HTMLAttributes<HTMLDivElement> & {
5
5
  children: React.ReactNode;
6
6
  /** Additional CSS classes */
7
7
  className?: string;
8
- /** Show decorative elements (default: true) */
8
+ /** Show decorative elements (default: false) */
9
9
  showDecorations?: boolean;
10
10
  };
11
11
 
@@ -13,7 +13,7 @@ export function Card({
13
13
  children,
14
14
  className = "",
15
15
  style,
16
- showDecorations = true,
16
+ showDecorations = false,
17
17
  ...props
18
18
  }: CardProps) {
19
19
  // Merge user styles with card styles
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+
3
+ export type SeparatorProps = {
4
+ className?: string;
5
+ };
6
+
7
+ export function Separator({ className = "" }: SeparatorProps) {
8
+ return (
9
+ <div className={`w-full my-1.5 h-px bg-[var(--border)] ${className}`} />
10
+ );
11
+ }
12
+
package/src/index.ts CHANGED
@@ -20,6 +20,7 @@ export { default as Chip } from "./components/Chip";
20
20
  export { default as Counter } from "./components/Counter";
21
21
  export * from "./components/Chat";
22
22
  export * from "./components/MessageBubble";
23
+ export * from "./components/Separator";
23
24
 
24
25
  // Types
25
26
  export type { AppBackgroundProps } from "./components/AppBackground";
@@ -39,4 +40,5 @@ export type { IconProps } from "./components/Icon";
39
40
  export type { ChipProps } from "./components/Chip";
40
41
  export type { CounterProps } from "./components/Counter";
41
42
  export type { AgentButtonProps } from "./components/Chat";
42
- export type { MessageBubbleProps } from "./components/MessageBubble";
43
+ export type { MessageBubbleProps } from "./components/MessageBubble";
44
+ export type { SeparatorProps } from "./components/Separator";
@@ -0,0 +1,233 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { Card } from "../components/Card";
3
+ import Typo from "../components/Typo";
4
+ import { Button } from "../components/Button";
5
+
6
+ const meta: Meta<typeof Card> = {
7
+ title: "Components/Card",
8
+ component: Card,
9
+ parameters: {
10
+ layout: "padded",
11
+ },
12
+ };
13
+ export default meta;
14
+ type Story = StoryObj<typeof Card>;
15
+
16
+ export const Default: Story = {
17
+ render: () => (
18
+ <div className="max-w-md">
19
+ <Card>
20
+ <Typo variant="headline-sm" bold="semibold">Default Card</Typo>
21
+ <Typo variant="body-md" className="mt-2">
22
+ This is a default card with glassmorphic styling.
23
+ </Typo>
24
+ </Card>
25
+ </div>
26
+ ),
27
+ };
28
+
29
+ export const WithDecorations: Story = {
30
+ render: () => (
31
+ <div className="max-w-md">
32
+ <Card showDecorations={true}>
33
+ <Typo variant="headline-sm" bold="semibold">Card With Decorations</Typo>
34
+ <Typo variant="body-md" className="mt-2">
35
+ This card has the decorative SVG gradient borders enabled.
36
+ </Typo>
37
+ </Card>
38
+ </div>
39
+ ),
40
+ };
41
+
42
+ export const CustomPadding: Story = {
43
+ render: () => (
44
+ <div className="max-w-md space-y-4">
45
+ <Card className="p-8">
46
+ <Typo variant="label-lg" bold="semibold">Large Padding (p-8)</Typo>
47
+ <Typo variant="body-sm" className="mt-1">More breathing room inside the card.</Typo>
48
+ </Card>
49
+ <Card className="p-4">
50
+ <Typo variant="label-lg" bold="semibold">Small Padding (p-4)</Typo>
51
+ <Typo variant="body-sm" className="mt-1">Compact card layout.</Typo>
52
+ </Card>
53
+ <Card className="p-0">
54
+ <div className="p-6 border-b border-[var(--border)]">
55
+ <Typo variant="label-lg" bold="semibold">No Default Padding (p-0)</Typo>
56
+ </div>
57
+ <div className="p-6">
58
+ <Typo variant="body-sm">Custom padding applied to inner elements.</Typo>
59
+ </div>
60
+ </Card>
61
+ </div>
62
+ ),
63
+ };
64
+
65
+ export const WithContent: Story = {
66
+ render: () => (
67
+ <div className="max-w-md">
68
+ <Card>
69
+ <Typo variant="title-lg" bold="semibold">Product Feature</Typo>
70
+ <Typo variant="body-md" className="mt-3">
71
+ This card showcases how rich content looks with the glassmorphic background.
72
+ </Typo>
73
+ <div className="mt-4 space-y-2">
74
+ <div className="flex items-start gap-2">
75
+ <span className="text-[var(--success)]">✓</span>
76
+ <Typo variant="body-sm">Fast performance</Typo>
77
+ </div>
78
+ <div className="flex items-start gap-2">
79
+ <span className="text-[var(--success)]">✓</span>
80
+ <Typo variant="body-sm">Easy to customize</Typo>
81
+ </div>
82
+ <div className="flex items-start gap-2">
83
+ <span className="text-[var(--success)]">✓</span>
84
+ <Typo variant="body-sm">Beautiful design</Typo>
85
+ </div>
86
+ </div>
87
+ <div className="mt-6">
88
+ <Button variant="primary">Learn More</Button>
89
+ </div>
90
+ </Card>
91
+ </div>
92
+ ),
93
+ };
94
+
95
+ export const MultipleCards: Story = {
96
+ render: () => (
97
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
98
+ <Card>
99
+ <Typo variant="title-md" bold="semibold">Analytics</Typo>
100
+ <Typo variant="display-md" bold="bold" className="mt-4">1,234</Typo>
101
+ <Typo variant="body-sm" className="mt-1 text-[var(--muted-fg)]">Total Users</Typo>
102
+ </Card>
103
+ <Card>
104
+ <Typo variant="title-md" bold="semibold">Revenue</Typo>
105
+ <Typo variant="display-md" bold="bold" className="mt-4">$45.2K</Typo>
106
+ <Typo variant="body-sm" className="mt-1 text-[var(--muted-fg)]">This Month</Typo>
107
+ </Card>
108
+ <Card>
109
+ <Typo variant="title-md" bold="semibold">Growth</Typo>
110
+ <Typo variant="display-md" bold="bold" className="mt-4">+24%</Typo>
111
+ <Typo variant="body-sm" className="mt-1 text-[var(--muted-fg)]">vs Last Month</Typo>
112
+ </Card>
113
+ </div>
114
+ ),
115
+ };
116
+
117
+ export const LargeCard: Story = {
118
+ render: () => (
119
+ <div className="max-w-3xl">
120
+ <Card className="p-8">
121
+ <div className="flex items-start justify-between">
122
+ <div>
123
+ <Typo variant="headline-md" bold="semibold">Welcome to NeoPTO UI</Typo>
124
+ <Typo variant="body-lg" className="mt-2 text-[var(--muted-fg)]">
125
+ A modern React component library
126
+ </Typo>
127
+ </div>
128
+ <Button variant="primary">Get Started</Button>
129
+ </div>
130
+ <div className="mt-6 grid grid-cols-2 gap-6">
131
+ <div>
132
+ <Typo variant="label-lg" bold="semibold" className="text-[var(--color-brand)]">
133
+ Modern Design
134
+ </Typo>
135
+ <Typo variant="body-md" className="mt-2">
136
+ Built with the latest design trends and best practices for creating beautiful user interfaces.
137
+ </Typo>
138
+ </div>
139
+ <div>
140
+ <Typo variant="label-lg" bold="semibold" className="text-[var(--color-brand)]">
141
+ Developer Friendly
142
+ </Typo>
143
+ <Typo variant="body-md" className="mt-2">
144
+ Fully typed with TypeScript and documented with Storybook for the best developer experience.
145
+ </Typo>
146
+ </div>
147
+ </div>
148
+ </Card>
149
+ </div>
150
+ ),
151
+ };
152
+
153
+ export const CardList: Story = {
154
+ render: () => (
155
+ <div className="max-w-2xl space-y-3">
156
+ {[1, 2, 3, 4].map((item) => (
157
+ <Card key={item} className="p-4">
158
+ <div className="flex items-center justify-between">
159
+ <div className="flex items-center gap-4">
160
+ <div className="w-12 h-12 rounded-full bg-[var(--muted)] flex items-center justify-center">
161
+ <Typo variant="title-md" bold="semibold">{item}</Typo>
162
+ </div>
163
+ <div>
164
+ <Typo variant="title-sm" bold="semibold">List Item {item}</Typo>
165
+ <Typo variant="body-sm" className="text-[var(--muted-fg)]">
166
+ Description for item {item}
167
+ </Typo>
168
+ </div>
169
+ </div>
170
+ <Button variant="ghost" size="sm">View</Button>
171
+ </div>
172
+ </Card>
173
+ ))}
174
+ </div>
175
+ ),
176
+ };
177
+
178
+ export const NestedContent: Story = {
179
+ render: () => (
180
+ <div className="max-w-2xl">
181
+ <Card>
182
+ <Typo variant="headline-sm" bold="semibold">Project Dashboard</Typo>
183
+ <div className="mt-4 space-y-3">
184
+ <Card className="p-4 bg-[var(--muted)]">
185
+ <Typo variant="title-sm" bold="medium">In Progress</Typo>
186
+ <Typo variant="body-sm" className="mt-1 text-[var(--muted-fg)]">3 tasks remaining</Typo>
187
+ </Card>
188
+ <Card className="p-4 bg-[var(--muted)]">
189
+ <Typo variant="title-sm" bold="medium">Completed</Typo>
190
+ <Typo variant="body-sm" className="mt-1 text-[var(--muted-fg)]">15 tasks done</Typo>
191
+ </Card>
192
+ </div>
193
+ </Card>
194
+ </div>
195
+ ),
196
+ };
197
+
198
+ export const FormCard: Story = {
199
+ render: () => (
200
+ <div className="max-w-md">
201
+ <Card>
202
+ <Typo variant="headline-sm" bold="semibold">Sign In</Typo>
203
+ <Typo variant="body-sm" className="mt-1 text-[var(--muted-fg)]">
204
+ Enter your credentials to continue
205
+ </Typo>
206
+ <form className="mt-6 space-y-4">
207
+ <div>
208
+ <label className="block mb-2">
209
+ <Typo variant="label-md" bold="medium">Email</Typo>
210
+ </label>
211
+ <input
212
+ type="email"
213
+ placeholder="you@example.com"
214
+ className="w-full px-4 py-3 rounded-2xl bg-[var(--muted)] border-none outline-none focus:ring-2 focus:ring-[var(--color-brand)]"
215
+ />
216
+ </div>
217
+ <div>
218
+ <label className="block mb-2">
219
+ <Typo variant="label-md" bold="medium">Password</Typo>
220
+ </label>
221
+ <input
222
+ type="password"
223
+ placeholder="••••••••"
224
+ className="w-full px-4 py-3 rounded-2xl bg-[var(--muted)] border-none outline-none focus:ring-2 focus:ring-[var(--color-brand)]"
225
+ />
226
+ </div>
227
+ <Button variant="primary" className="w-full">Sign In</Button>
228
+ </form>
229
+ </Card>
230
+ </div>
231
+ ),
232
+ };
233
+
@@ -0,0 +1,197 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { Separator } from "../components/Separator";
3
+ import Typo from "../components/Typo";
4
+ import { Card } from "../components/Card";
5
+
6
+ const meta: Meta<typeof Separator> = {
7
+ title: "Components/Separator",
8
+ component: Separator,
9
+ };
10
+ export default meta;
11
+ type Story = StoryObj<typeof Separator>;
12
+
13
+ export const Default: Story = {
14
+ render: () => (
15
+ <div className="max-w-md">
16
+ <Typo variant="body-md">Content above separator</Typo>
17
+ <Separator />
18
+ <Typo variant="body-md">Content below separator</Typo>
19
+ </div>
20
+ ),
21
+ };
22
+
23
+ export const InCard: Story = {
24
+ render: () => (
25
+ <div className="max-w-md">
26
+ <Card>
27
+ <Typo variant="title-md" bold="semibold">Card Title</Typo>
28
+ <Typo variant="body-sm" className="mt-2 text-[var(--muted-fg)]">
29
+ Some description text goes here
30
+ </Typo>
31
+ <Separator />
32
+ <Typo variant="body-md">
33
+ Additional content after the separator
34
+ </Typo>
35
+ </Card>
36
+ </div>
37
+ ),
38
+ };
39
+
40
+ export const CustomSpacing: Story = {
41
+ render: () => (
42
+ <div className="max-w-md space-y-8">
43
+ <div>
44
+ <Typo variant="label-lg" bold="semibold">No Margin</Typo>
45
+ <Separator className="my-0" />
46
+ <Typo variant="body-sm">Text immediately after</Typo>
47
+ </div>
48
+
49
+ <div>
50
+ <Typo variant="label-lg" bold="semibold">Large Margin (my-4)</Typo>
51
+ <Separator className="my-4" />
52
+ <Typo variant="body-sm">More space around separator</Typo>
53
+ </div>
54
+
55
+ <div>
56
+ <Typo variant="label-lg" bold="semibold">Extra Large Margin (my-8)</Typo>
57
+ <Separator className="my-8" />
58
+ <Typo variant="body-sm">Even more space</Typo>
59
+ </div>
60
+ </div>
61
+ ),
62
+ };
63
+
64
+ export const DifferentColors: Story = {
65
+ render: () => (
66
+ <div className="max-w-md space-y-6">
67
+ <div>
68
+ <Typo variant="label-lg" bold="semibold">Default Border Color</Typo>
69
+ <Separator />
70
+ </div>
71
+
72
+ <div>
73
+ <Typo variant="label-lg" bold="semibold">Brand Color</Typo>
74
+ <Separator className="bg-[var(--color-brand)]" />
75
+ </div>
76
+
77
+ <div>
78
+ <Typo variant="label-lg" bold="semibold">Success Color</Typo>
79
+ <Separator className="bg-[var(--success)]" />
80
+ </div>
81
+
82
+ <div>
83
+ <Typo variant="label-lg" bold="semibold">Muted Foreground</Typo>
84
+ <Separator className="bg-[var(--muted-fg)]" />
85
+ </div>
86
+ </div>
87
+ ),
88
+ };
89
+
90
+ export const DifferentThickness: Story = {
91
+ render: () => (
92
+ <div className="max-w-md space-y-6">
93
+ <div>
94
+ <Typo variant="label-lg" bold="semibold">Default (1px)</Typo>
95
+ <Separator />
96
+ </div>
97
+
98
+ <div>
99
+ <Typo variant="label-lg" bold="semibold">2px Thick</Typo>
100
+ <Separator className="h-0.5" />
101
+ </div>
102
+
103
+ <div>
104
+ <Typo variant="label-lg" bold="semibold">4px Thick</Typo>
105
+ <Separator className="h-1" />
106
+ </div>
107
+
108
+ <div>
109
+ <Typo variant="label-lg" bold="semibold">8px Thick</Typo>
110
+ <Separator className="h-2" />
111
+ </div>
112
+ </div>
113
+ ),
114
+ };
115
+
116
+ export const InList: Story = {
117
+ render: () => (
118
+ <div className="max-w-md">
119
+ <Card>
120
+ <Typo variant="title-md" bold="semibold">Menu Items</Typo>
121
+ <Separator className="my-3" />
122
+
123
+ <div className="space-y-3">
124
+ <Typo variant="body-md">Home</Typo>
125
+ <Separator />
126
+ <Typo variant="body-md">About</Typo>
127
+ <Separator />
128
+ <Typo variant="body-md">Services</Typo>
129
+ <Separator />
130
+ <Typo variant="body-md">Contact</Typo>
131
+ </div>
132
+ </Card>
133
+ </div>
134
+ ),
135
+ };
136
+
137
+ export const VerticalSections: Story = {
138
+ render: () => (
139
+ <div className="max-w-2xl">
140
+ <Card>
141
+ <Typo variant="headline-sm" bold="semibold">Article Title</Typo>
142
+ <Typo variant="body-sm" className="mt-1 text-[var(--muted-fg)]">
143
+ Published on October 28, 2025
144
+ </Typo>
145
+
146
+ <Separator className="my-6" />
147
+
148
+ <Typo variant="body-md">
149
+ This is the introduction paragraph of the article. It provides context and sets up what the reader can expect.
150
+ </Typo>
151
+
152
+ <Separator className="my-6" />
153
+
154
+ <Typo variant="title-md" bold="semibold">Section 1</Typo>
155
+ <Typo variant="body-md" className="mt-2">
156
+ Content for the first section goes here with relevant information.
157
+ </Typo>
158
+
159
+ <Separator className="my-6" />
160
+
161
+ <Typo variant="title-md" bold="semibold">Section 2</Typo>
162
+ <Typo variant="body-md" className="mt-2">
163
+ Content for the second section with more details.
164
+ </Typo>
165
+ </Card>
166
+ </div>
167
+ ),
168
+ };
169
+
170
+ export const WithWidth: Story = {
171
+ render: () => (
172
+ <div className="max-w-md space-y-6">
173
+ <div>
174
+ <Typo variant="label-lg" bold="semibold">Full Width (default)</Typo>
175
+ <Separator />
176
+ </div>
177
+
178
+ <div>
179
+ <Typo variant="label-lg" bold="semibold">50% Width</Typo>
180
+ <Separator className="w-1/2" />
181
+ </div>
182
+
183
+ <div>
184
+ <Typo variant="label-lg" bold="semibold">25% Width</Typo>
185
+ <Separator className="w-1/4" />
186
+ </div>
187
+
188
+ <div>
189
+ <Typo variant="label-lg" bold="semibold">Centered 50%</Typo>
190
+ <div className="flex justify-center">
191
+ <Separator className="w-1/2" />
192
+ </div>
193
+ </div>
194
+ </div>
195
+ ),
196
+ };
197
+