@trycompai/design-system 1.0.9 → 1.0.11
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/package.json +1 -1
- package/src/components/atoms/button.tsx +14 -14
- package/src/components/molecules/ai-chat.tsx +61 -28
- package/src/components/molecules/card.tsx +1 -1
- package/src/components/molecules/page-header.tsx +50 -39
- package/src/components/molecules/table.tsx +1 -1
- package/src/components/organisms/page-layout.tsx +4 -4
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@ import * as React from 'react';
|
|
|
5
5
|
import { Spinner } from './spinner';
|
|
6
6
|
|
|
7
7
|
const buttonVariants = cva(
|
|
8
|
-
"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-md border border-transparent text-
|
|
8
|
+
"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-md border border-transparent text-[13px] font-medium leading-none [text-box-trim:both] [text-box-edge:cap_alphabetic] focus-visible:ring-[3px] aria-invalid:ring-[3px] [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all duration-200 ease-out active:scale-[0.97] active:duration-75 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none cursor-pointer",
|
|
9
9
|
{
|
|
10
10
|
variants: {
|
|
11
11
|
variant: {
|
|
@@ -16,7 +16,7 @@ const buttonVariants = cva(
|
|
|
16
16
|
secondary:
|
|
17
17
|
'bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground',
|
|
18
18
|
ghost:
|
|
19
|
-
'hover:bg-
|
|
19
|
+
'hover:bg-accent hover:text-foreground dark:hover:bg-accent/50 aria-expanded:bg-accent aria-expanded:text-foreground',
|
|
20
20
|
destructive:
|
|
21
21
|
'bg-destructive/10 text-destructive hover:bg-destructive/15 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 focus-visible:border-destructive/40 dark:bg-destructive/20 dark:hover:bg-destructive/30',
|
|
22
22
|
link: 'text-primary underline-offset-4 hover:underline',
|
|
@@ -27,21 +27,21 @@ const buttonVariants = cva(
|
|
|
27
27
|
},
|
|
28
28
|
size: {
|
|
29
29
|
default:
|
|
30
|
-
'h-
|
|
31
|
-
xs: "h-
|
|
32
|
-
sm: "h-
|
|
33
|
-
lg: 'h-
|
|
34
|
-
icon: 'size-
|
|
30
|
+
'h-7 gap-1 px-2 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5',
|
|
31
|
+
xs: "h-5 gap-0.5 px-1.5 text-[11px] has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 [&_svg:not([class*='size-'])]:size-3",
|
|
32
|
+
sm: "h-6 gap-1 px-2 text-xs has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
|
|
33
|
+
lg: 'h-8 gap-1 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',
|
|
34
|
+
icon: 'size-7',
|
|
35
35
|
'icon-xs':
|
|
36
|
-
"size-
|
|
36
|
+
"size-5 [&_svg:not([class*='size-'])]:size-3",
|
|
37
37
|
'icon-sm':
|
|
38
|
-
'size-
|
|
39
|
-
'icon-lg': 'size-
|
|
38
|
+
'size-6',
|
|
39
|
+
'icon-lg': 'size-8',
|
|
40
40
|
// Round icon buttons - for avatar triggers and circular icons
|
|
41
|
-
'icon-round': 'size-
|
|
42
|
-
'icon-round-xs': "size-
|
|
43
|
-
'icon-round-sm': 'size-
|
|
44
|
-
'icon-round-lg': 'size-
|
|
41
|
+
'icon-round': 'size-7 rounded-full',
|
|
42
|
+
'icon-round-xs': "size-5 rounded-full [&_svg:not([class*='size-'])]:size-3",
|
|
43
|
+
'icon-round-sm': 'size-6 rounded-full',
|
|
44
|
+
'icon-round-lg': 'size-8 rounded-full',
|
|
45
45
|
// Calendar day button - special size for calendar day cells
|
|
46
46
|
'calendar-day': [
|
|
47
47
|
// Base sizing
|
|
@@ -63,14 +63,24 @@ function AIChat({
|
|
|
63
63
|
|
|
64
64
|
return (
|
|
65
65
|
<>
|
|
66
|
-
{/*
|
|
66
|
+
{/* Backdrop overlay */}
|
|
67
|
+
<div
|
|
68
|
+
data-slot="ai-chat-backdrop"
|
|
69
|
+
className={`fixed inset-0 z-20 bg-black/5 backdrop-blur-[2px] transition-opacity duration-300 ${
|
|
70
|
+
isOpen ? 'opacity-100' : 'opacity-0 pointer-events-none'
|
|
71
|
+
}`}
|
|
72
|
+
onClick={handleClose}
|
|
73
|
+
/>
|
|
74
|
+
{/* Chat Panel - floating module */}
|
|
67
75
|
<div
|
|
68
76
|
data-slot="ai-chat-panel"
|
|
69
|
-
className={`fixed top-
|
|
70
|
-
isOpen ? 'translate-x-0' : 'translate-x-
|
|
77
|
+
className={`fixed top-16 right-3 bottom-3 z-30 w-full max-w-md flex flex-col bg-background/95 backdrop-blur-xl border border-border/50 rounded-2xl overflow-hidden transition-all duration-300 ease-out ring-1 ring-black/[0.03] dark:ring-white/[0.05] ${
|
|
78
|
+
isOpen ? 'translate-x-0 opacity-100 scale-100' : 'translate-x-2 opacity-0 scale-[0.98] pointer-events-none'
|
|
71
79
|
}`}
|
|
72
80
|
style={{
|
|
73
|
-
boxShadow: isOpen
|
|
81
|
+
boxShadow: isOpen
|
|
82
|
+
? '0 24px 48px -12px rgb(0 0 0 / 0.15), 0 12px 24px -8px rgb(0 0 0 / 0.1), 0 0 0 1px rgb(0 0 0 / 0.03)'
|
|
83
|
+
: 'none',
|
|
74
84
|
}}
|
|
75
85
|
>
|
|
76
86
|
{children || <AIChatDefaultContent onClose={handleClose} />}
|
|
@@ -120,7 +130,7 @@ function AIChatTrigger({ onClick, isOpen, shortcut = 'J' }: AIChatTriggerProps)
|
|
|
120
130
|
// Default content when no children provided
|
|
121
131
|
function AIChatDefaultContent({ onClose }: { onClose: () => void }) {
|
|
122
132
|
const [message, setMessage] = React.useState('');
|
|
123
|
-
const inputRef = React.useRef<
|
|
133
|
+
const inputRef = React.useRef<HTMLTextAreaElement>(null);
|
|
124
134
|
|
|
125
135
|
// Focus input when panel opens
|
|
126
136
|
React.useEffect(() => {
|
|
@@ -128,43 +138,62 @@ function AIChatDefaultContent({ onClose }: { onClose: () => void }) {
|
|
|
128
138
|
return () => clearTimeout(timer);
|
|
129
139
|
}, []);
|
|
130
140
|
|
|
141
|
+
// Auto-resize textarea
|
|
142
|
+
const handleTextareaChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
|
143
|
+
setMessage(e.target.value);
|
|
144
|
+
e.target.style.height = 'auto';
|
|
145
|
+
e.target.style.height = `${Math.min(e.target.scrollHeight, 120)}px`;
|
|
146
|
+
};
|
|
147
|
+
|
|
131
148
|
return (
|
|
132
149
|
<>
|
|
133
150
|
{/* Header */}
|
|
134
|
-
<div className="flex items-center justify-between px-
|
|
151
|
+
<div className="flex items-center justify-between px-5 py-4 border-b border-border/50 shrink-0 bg-muted/30">
|
|
135
152
|
<div className="flex items-center gap-3">
|
|
136
|
-
<span className="flex size-
|
|
153
|
+
<span className="flex size-10 items-center justify-center rounded-xl bg-gradient-to-br from-primary/20 to-primary/5 text-primary ring-1 ring-primary/10">
|
|
137
154
|
<MagicWand className="size-5" />
|
|
138
155
|
</span>
|
|
139
156
|
<div>
|
|
140
157
|
<div className="font-semibold text-sm">AI Assistant</div>
|
|
141
|
-
<div className="text-xs text-muted-foreground">
|
|
158
|
+
<div className="text-xs text-muted-foreground">Powered by Claude</div>
|
|
142
159
|
</div>
|
|
143
160
|
</div>
|
|
144
161
|
<button
|
|
145
162
|
type="button"
|
|
146
163
|
onClick={onClose}
|
|
147
|
-
className="size-8 flex items-center justify-center rounded-
|
|
164
|
+
className="size-8 flex items-center justify-center rounded-lg hover:bg-muted text-muted-foreground hover:text-foreground transition-colors"
|
|
148
165
|
>
|
|
149
166
|
<Close className="size-4" />
|
|
150
167
|
</button>
|
|
151
168
|
</div>
|
|
152
169
|
|
|
153
170
|
{/* Messages Area */}
|
|
154
|
-
<div className="flex-1 overflow-auto p-
|
|
171
|
+
<div className="flex-1 overflow-auto p-5">
|
|
155
172
|
<div className="flex flex-col gap-4">
|
|
156
173
|
{/* AI Welcome Message */}
|
|
157
174
|
<div className="flex gap-3">
|
|
158
|
-
<span className="flex size-8 shrink-0 items-center justify-center rounded-lg bg-primary/
|
|
175
|
+
<span className="flex size-8 shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-primary/15 to-primary/5 text-primary">
|
|
159
176
|
<MagicWand className="size-4" />
|
|
160
177
|
</span>
|
|
161
|
-
<div className="flex-1 rounded-2xl rounded-tl-
|
|
162
|
-
<p className="mb-
|
|
163
|
-
<ul className="space-y-
|
|
164
|
-
<li
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
178
|
+
<div className="flex-1 rounded-2xl rounded-tl-lg bg-muted/50 ring-1 ring-border/50 px-4 py-3 text-sm">
|
|
179
|
+
<p className="mb-3 font-medium">Hi! I can help you with:</p>
|
|
180
|
+
<ul className="space-y-2 text-muted-foreground">
|
|
181
|
+
<li className="flex items-start gap-2">
|
|
182
|
+
<span className="size-1.5 rounded-full bg-primary/60 mt-1.5 shrink-0" />
|
|
183
|
+
<span>Understanding compliance requirements</span>
|
|
184
|
+
</li>
|
|
185
|
+
<li className="flex items-start gap-2">
|
|
186
|
+
<span className="size-1.5 rounded-full bg-primary/60 mt-1.5 shrink-0" />
|
|
187
|
+
<span>Reviewing and creating policies</span>
|
|
188
|
+
</li>
|
|
189
|
+
<li className="flex items-start gap-2">
|
|
190
|
+
<span className="size-1.5 rounded-full bg-primary/60 mt-1.5 shrink-0" />
|
|
191
|
+
<span>Analyzing evidence and controls</span>
|
|
192
|
+
</li>
|
|
193
|
+
<li className="flex items-start gap-2">
|
|
194
|
+
<span className="size-1.5 rounded-full bg-primary/60 mt-1.5 shrink-0" />
|
|
195
|
+
<span>Answering questions about SOC 2, ISO 27001, and more</span>
|
|
196
|
+
</li>
|
|
168
197
|
</ul>
|
|
169
198
|
</div>
|
|
170
199
|
</div>
|
|
@@ -172,31 +201,35 @@ function AIChatDefaultContent({ onClose }: { onClose: () => void }) {
|
|
|
172
201
|
</div>
|
|
173
202
|
|
|
174
203
|
{/* Input Area */}
|
|
175
|
-
<div className="p-4 border-t border-border shrink-0">
|
|
176
|
-
<div className="flex items-
|
|
177
|
-
<
|
|
204
|
+
<div className="p-4 border-t border-border/50 shrink-0 bg-muted/20">
|
|
205
|
+
<div className="flex items-end gap-2 rounded-xl bg-background ring-1 ring-border/50 px-4 py-3 focus-within:ring-2 focus-within:ring-primary/20 focus-within:border-primary/30 transition-all">
|
|
206
|
+
<textarea
|
|
178
207
|
ref={inputRef}
|
|
179
|
-
type="text"
|
|
180
208
|
value={message}
|
|
181
|
-
onChange={
|
|
182
|
-
placeholder="Ask
|
|
183
|
-
|
|
209
|
+
onChange={handleTextareaChange}
|
|
210
|
+
placeholder="Ask anything..."
|
|
211
|
+
rows={1}
|
|
212
|
+
className="flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground resize-none min-h-[24px] max-h-[120px]"
|
|
184
213
|
onKeyDown={(e) => {
|
|
185
|
-
if (e.key === 'Enter' && message.trim()) {
|
|
214
|
+
if (e.key === 'Enter' && !e.shiftKey && message.trim()) {
|
|
215
|
+
e.preventDefault();
|
|
186
216
|
// Handle send
|
|
187
217
|
setMessage('');
|
|
218
|
+
if (inputRef.current) {
|
|
219
|
+
inputRef.current.style.height = 'auto';
|
|
220
|
+
}
|
|
188
221
|
}
|
|
189
222
|
}}
|
|
190
223
|
/>
|
|
191
224
|
<button
|
|
192
225
|
type="button"
|
|
193
226
|
disabled={!message.trim()}
|
|
194
|
-
className="flex size-8 items-center justify-center rounded-lg bg-primary text-primary-foreground hover:bg-primary/90 transition-
|
|
227
|
+
className="flex size-8 shrink-0 items-center justify-center rounded-lg bg-primary text-primary-foreground hover:bg-primary/90 transition-all disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-primary shadow-sm"
|
|
195
228
|
>
|
|
196
229
|
<Send className="size-4" />
|
|
197
230
|
</button>
|
|
198
231
|
</div>
|
|
199
|
-
<div className="mt-3 flex items-center justify-center gap-2 text-xs text-muted-foreground">
|
|
232
|
+
<div className="mt-3 flex items-center justify-center gap-2 text-xs text-muted-foreground/70">
|
|
200
233
|
<Keyboard className="size-3" />
|
|
201
234
|
<span>Press <Kbd>Esc</Kbd> to close</span>
|
|
202
235
|
</div>
|
|
@@ -156,7 +156,7 @@ function CardFooter({ ...props }: Omit<React.ComponentProps<'div'>, 'className'>
|
|
|
156
156
|
return (
|
|
157
157
|
<div
|
|
158
158
|
data-slot="card-footer"
|
|
159
|
-
className="bg-muted rounded-b-md border-t p-4 group-data-[size=sm]/card:p-3 flex items-center"
|
|
159
|
+
className="bg-muted rounded-b-md border-t p-4 group-data-[size=sm]/card:p-3 flex items-center justify-between gap-4"
|
|
160
160
|
{...props}
|
|
161
161
|
/>
|
|
162
162
|
);
|
|
@@ -1,21 +1,25 @@
|
|
|
1
|
+
import { ArrowLeft } from '@carbon/icons-react';
|
|
1
2
|
import * as React from 'react';
|
|
2
3
|
|
|
3
4
|
import { Heading } from '../atoms/heading';
|
|
4
|
-
import {
|
|
5
|
-
import { Stack } from '../atoms/stack';
|
|
5
|
+
import { Breadcrumb, type BreadcrumbItemData } from './breadcrumb';
|
|
6
6
|
|
|
7
7
|
interface PageHeaderProps extends Omit<React.ComponentProps<'div'>, 'className'> {
|
|
8
8
|
title: string;
|
|
9
|
-
description?: string;
|
|
10
|
-
/** Additional descriptive text below description */
|
|
11
|
-
meta?: string;
|
|
12
9
|
actions?: React.ReactNode;
|
|
10
|
+
/** Breadcrumb items to display above the title */
|
|
11
|
+
breadcrumbs?: BreadcrumbItemData[];
|
|
12
|
+
/** Back button href - displays a back arrow link above the title */
|
|
13
|
+
backHref?: string;
|
|
14
|
+
/** Back button label (default: "Back") */
|
|
15
|
+
backLabel?: string;
|
|
16
|
+
/** Tabs to display below the header (typically TabsList) */
|
|
17
|
+
tabs?: React.ReactNode;
|
|
13
18
|
}
|
|
14
19
|
|
|
15
|
-
function PageHeader({ title,
|
|
20
|
+
function PageHeader({ title, actions, breadcrumbs, backHref, backLabel = 'Back', tabs, children, ...props }: PageHeaderProps) {
|
|
16
21
|
const childArray = React.Children.toArray(children);
|
|
17
22
|
const extractedActionChildren: React.ReactNode[] = [];
|
|
18
|
-
const nonActionChildren: React.ReactNode[] = [];
|
|
19
23
|
|
|
20
24
|
childArray.forEach((child) => {
|
|
21
25
|
if (
|
|
@@ -25,9 +29,7 @@ function PageHeader({ title, description, meta, actions, children, ...props }: P
|
|
|
25
29
|
(child.type as unknown as { __pageHeaderSlot?: string }).__pageHeaderSlot === 'actions'))
|
|
26
30
|
) {
|
|
27
31
|
extractedActionChildren.push((child.props as { children?: React.ReactNode }).children);
|
|
28
|
-
return;
|
|
29
32
|
}
|
|
30
|
-
nonActionChildren.push(child);
|
|
31
33
|
});
|
|
32
34
|
|
|
33
35
|
const resolvedActions =
|
|
@@ -35,46 +37,55 @@ function PageHeader({ title, description, meta, actions, children, ...props }: P
|
|
|
35
37
|
(extractedActionChildren.length > 0 ? extractedActionChildren : undefined);
|
|
36
38
|
|
|
37
39
|
return (
|
|
38
|
-
<div data-slot="page-header" className="flex
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
<
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
40
|
+
<div data-slot="page-header" className="flex flex-col gap-1" {...props}>
|
|
41
|
+
{/* Navigation: breadcrumbs or back button */}
|
|
42
|
+
{breadcrumbs && breadcrumbs.length > 0 ? (
|
|
43
|
+
<div className="overflow-hidden">
|
|
44
|
+
<Breadcrumb items={breadcrumbs} separator="chevron" />
|
|
45
|
+
</div>
|
|
46
|
+
) : backHref ? (
|
|
47
|
+
<a
|
|
48
|
+
href={backHref}
|
|
49
|
+
className="inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground hover:underline underline-offset-2 transition-colors w-fit"
|
|
50
|
+
>
|
|
51
|
+
<ArrowLeft className="size-4" />
|
|
52
|
+
<span>{backLabel}</span>
|
|
53
|
+
</a>
|
|
54
|
+
) : null}
|
|
55
|
+
|
|
56
|
+
{/* Main header row */}
|
|
57
|
+
<div className="flex items-center justify-between gap-4 min-w-0">
|
|
58
|
+
<div className="min-w-0 flex-1 truncate">
|
|
59
|
+
<Heading level="1">{title}</Heading>
|
|
60
|
+
</div>
|
|
61
|
+
{resolvedActions && (
|
|
62
|
+
<div className="shrink-0">
|
|
63
|
+
{React.isValidElement(resolvedActions) && resolvedActions.type === PageHeaderActions ? (
|
|
64
|
+
resolvedActions
|
|
65
|
+
) : (
|
|
66
|
+
<PageHeaderActions>{resolvedActions}</PageHeaderActions>
|
|
67
|
+
)}
|
|
68
|
+
</div>
|
|
50
69
|
)}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
{
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
{/* Tabs section */}
|
|
73
|
+
{tabs && (
|
|
74
|
+
<div className="mt-2 -mb-px">
|
|
75
|
+
{tabs}
|
|
76
|
+
</div>
|
|
77
|
+
)}
|
|
59
78
|
</div>
|
|
60
79
|
);
|
|
61
80
|
}
|
|
62
81
|
|
|
63
|
-
function PageHeaderTitle({ ...props }: Omit<React.ComponentProps<typeof Heading>, 'className'>) {
|
|
64
|
-
return <Heading data-slot="page-header-title" level="1" {...props} />;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function PageHeaderDescription({ ...props }: Omit<React.ComponentProps<typeof Text>, 'className'>) {
|
|
68
|
-
return <Text data-slot="page-header-description" size="sm" variant="muted" {...props} />;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
82
|
function PageHeaderActions({ ...props }: Omit<React.ComponentProps<'div'>, 'className'>) {
|
|
72
83
|
return (
|
|
73
|
-
<div data-slot="page-header-actions" className="flex shrink-0 items-center gap-
|
|
84
|
+
<div data-slot="page-header-actions" className="flex shrink-0 items-center gap-2" {...props} />
|
|
74
85
|
);
|
|
75
86
|
}
|
|
76
87
|
|
|
77
88
|
// Mark compound slots so PageHeader can detect them even if module instances differ.
|
|
78
89
|
(PageHeaderActions as unknown as { __pageHeaderSlot?: string }).__pageHeaderSlot = 'actions';
|
|
79
90
|
|
|
80
|
-
export { PageHeader, PageHeaderActions
|
|
91
|
+
export { PageHeader, PageHeaderActions };
|
|
@@ -63,7 +63,7 @@ function TableCell({ ...props }: Omit<React.ComponentProps<'td'>, 'className'>)
|
|
|
63
63
|
return (
|
|
64
64
|
<td
|
|
65
65
|
data-slot="table-cell"
|
|
66
|
-
className="px-3 py-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [[data-variant=bordered]_&]:border-r [[data-variant=bordered]_&]:last:border-r-0"
|
|
66
|
+
className="px-3 py-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [[data-variant=bordered]_&]:border-r [[data-variant=bordered]_&]:last:border-r-0 [&_[data-slot=button]]:relative [&_[data-slot=button]]:z-10"
|
|
67
67
|
{...props}
|
|
68
68
|
/>
|
|
69
69
|
);
|
|
@@ -12,14 +12,14 @@ const pageLayoutVariants = cva('min-h-full bg-background text-foreground', {
|
|
|
12
12
|
},
|
|
13
13
|
padding: {
|
|
14
14
|
none: '',
|
|
15
|
-
sm: 'px-
|
|
16
|
-
default: 'px-
|
|
17
|
-
lg: 'px-
|
|
15
|
+
sm: 'px-1.5 sm:px-2',
|
|
16
|
+
default: 'px-1.5 sm:px-2 md:px-3 lg:px-4',
|
|
17
|
+
lg: 'px-2 sm:px-3 md:px-4 lg:px-6',
|
|
18
18
|
},
|
|
19
19
|
},
|
|
20
20
|
defaultVariants: {
|
|
21
21
|
variant: 'default',
|
|
22
|
-
padding: '
|
|
22
|
+
padding: 'none',
|
|
23
23
|
},
|
|
24
24
|
});
|
|
25
25
|
|