@alpic-ai/ui 0.0.0-dev.cfc1427 → 0.0.0-dev.d0c2830
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/components/avatar.d.mts +1 -1
- package/dist/components/badge.d.mts +1 -1
- package/dist/components/button.d.mts +2 -4
- package/dist/components/button.mjs +3 -17
- package/dist/components/sidebar.mjs +4 -4
- package/dist/components/spinner.d.mts +1 -1
- package/package.json +1 -1
- package/src/components/button.tsx +0 -10
- package/src/components/sidebar.tsx +4 -4
- package/src/stories/button.stories.tsx +1 -23
- package/src/styles/tokens.css +0 -173
|
@@ -6,7 +6,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
|
|
|
6
6
|
|
|
7
7
|
//#region src/components/avatar.d.ts
|
|
8
8
|
declare const avatarVariants: (props?: ({
|
|
9
|
-
size?: "sm" | "lg" | "md" | "
|
|
9
|
+
size?: "sm" | "lg" | "md" | "xl" | "xs" | null | undefined;
|
|
10
10
|
} & _$class_variance_authority_types0.ClassProp) | undefined) => string;
|
|
11
11
|
type AvatarSize = NonNullable<VariantProps<typeof avatarVariants>["size"]>;
|
|
12
12
|
type AvatarStatus = "online";
|
|
@@ -4,7 +4,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
|
|
|
4
4
|
|
|
5
5
|
//#region src/components/badge.d.ts
|
|
6
6
|
declare const badgeVariants: (props?: ({
|
|
7
|
-
variant?: "warning" | "success" | "
|
|
7
|
+
variant?: "warning" | "success" | "primary" | "secondary" | "error" | null | undefined;
|
|
8
8
|
size?: "sm" | "md" | null | undefined;
|
|
9
9
|
} & _$class_variance_authority_types0.ClassProp) | undefined) => string;
|
|
10
10
|
interface BadgeProps extends React.ComponentProps<"span">, VariantProps<typeof badgeVariants> {}
|
|
@@ -5,14 +5,13 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
|
|
|
5
5
|
|
|
6
6
|
//#region src/components/button.d.ts
|
|
7
7
|
declare const buttonVariants: (props?: ({
|
|
8
|
-
variant?: "destructive" | "
|
|
9
|
-
size?: "default" | "
|
|
8
|
+
variant?: "destructive" | "link" | "primary" | "secondary" | "tertiary" | "link-muted" | null | undefined;
|
|
9
|
+
size?: "default" | "icon" | "icon-rounded" | "pill" | null | undefined;
|
|
10
10
|
} & _$class_variance_authority_types0.ClassProp) | undefined) => string;
|
|
11
11
|
interface ButtonProps extends React.ComponentProps<"button">, VariantProps<typeof buttonVariants> {
|
|
12
12
|
asChild?: boolean;
|
|
13
13
|
loading?: boolean;
|
|
14
14
|
icon?: React.ReactNode;
|
|
15
|
-
iconTrailing?: React.ReactNode;
|
|
16
15
|
}
|
|
17
16
|
declare function Button({
|
|
18
17
|
className,
|
|
@@ -22,7 +21,6 @@ declare function Button({
|
|
|
22
21
|
asChild,
|
|
23
22
|
loading,
|
|
24
23
|
icon,
|
|
25
|
-
iconTrailing,
|
|
26
24
|
disabled,
|
|
27
25
|
children,
|
|
28
26
|
...props
|
|
@@ -35,14 +35,7 @@ const buttonVariants = cva([
|
|
|
35
35
|
"[@media(hover:hover)]:hover:underline",
|
|
36
36
|
"focus-visible:bg-background"
|
|
37
37
|
].join(" "),
|
|
38
|
-
destructive: ["bg-destructive text-destructive-foreground", "[@media(hover:hover)]:hover:bg-destructive-hover"].join(" ")
|
|
39
|
-
cta: [
|
|
40
|
-
"button-cta",
|
|
41
|
-
"h-9 px-4 gap-2 rounded-md",
|
|
42
|
-
"dark:bg-inverted text-foreground",
|
|
43
|
-
"transition-[transform,filter] duration-300 ease-out",
|
|
44
|
-
"active:scale-[0.99]"
|
|
45
|
-
].join(" ")
|
|
38
|
+
destructive: ["bg-destructive text-destructive-foreground", "[@media(hover:hover)]:hover:bg-destructive-hover"].join(" ")
|
|
46
39
|
},
|
|
47
40
|
size: {
|
|
48
41
|
default: "type-text-sm",
|
|
@@ -56,7 +49,7 @@ const buttonVariants = cva([
|
|
|
56
49
|
size: "default"
|
|
57
50
|
}
|
|
58
51
|
});
|
|
59
|
-
function Button({ className, variant, size, type = "button", asChild = false, loading = false, icon,
|
|
52
|
+
function Button({ className, variant, size, type = "button", asChild = false, loading = false, icon, disabled, children, ...props }) {
|
|
60
53
|
return /* @__PURE__ */ jsxs(asChild ? Slot : "button", {
|
|
61
54
|
"data-slot": "button",
|
|
62
55
|
className: cn(buttonVariants({
|
|
@@ -67,14 +60,7 @@ function Button({ className, variant, size, type = "button", asChild = false, lo
|
|
|
67
60
|
disabled: disabled || loading,
|
|
68
61
|
"aria-busy": loading || void 0,
|
|
69
62
|
...props,
|
|
70
|
-
children: [
|
|
71
|
-
loading ? /* @__PURE__ */ jsx(Loader2, { className: "motion-safe:animate-spin" }) : icon,
|
|
72
|
-
asChild ? /* @__PURE__ */ jsx(Slottable, { children }) : children,
|
|
73
|
-
!loading && iconTrailing ? /* @__PURE__ */ jsx("span", {
|
|
74
|
-
"data-cta-icon-trailing": true,
|
|
75
|
-
children: iconTrailing
|
|
76
|
-
}) : null
|
|
77
|
-
]
|
|
63
|
+
children: [loading ? /* @__PURE__ */ jsx(Loader2, { className: "motion-safe:animate-spin" }) : icon, asChild ? /* @__PURE__ */ jsx(Slottable, { children }) : children]
|
|
78
64
|
});
|
|
79
65
|
}
|
|
80
66
|
//#endregion
|
|
@@ -105,7 +105,7 @@ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas"
|
|
|
105
105
|
}
|
|
106
106
|
if (collapsible === "none") return /* @__PURE__ */ jsx("div", {
|
|
107
107
|
"data-slot": "sidebar",
|
|
108
|
-
className: cn("bg-sidebar
|
|
108
|
+
className: cn("bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col", className),
|
|
109
109
|
...props,
|
|
110
110
|
children
|
|
111
111
|
});
|
|
@@ -117,7 +117,7 @@ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas"
|
|
|
117
117
|
"data-sidebar": "sidebar",
|
|
118
118
|
"data-slot": "sidebar",
|
|
119
119
|
"data-mobile": "true",
|
|
120
|
-
className: "bg-sidebar
|
|
120
|
+
className: "bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden",
|
|
121
121
|
style: { "--sidebar-width": SIDEBAR_WIDTH_MOBILE },
|
|
122
122
|
side,
|
|
123
123
|
children: [/* @__PURE__ */ jsxs(SheetHeader, {
|
|
@@ -141,12 +141,12 @@ function Sidebar({ side = "left", variant = "sidebar", collapsible = "offcanvas"
|
|
|
141
141
|
className: cn("relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-out", "group-data-[collapsible=offcanvas]:w-0", "group-data-[side=right]:rotate-180", variant === "floating" || variant === "inset" ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)")
|
|
142
142
|
}), /* @__PURE__ */ jsx("div", {
|
|
143
143
|
"data-slot": "sidebar-container",
|
|
144
|
-
className: cn("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-out md:flex", side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]", variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "
|
|
144
|
+
className: cn("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-out md:flex", side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]", variant === "floating" || variant === "inset" ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l", className),
|
|
145
145
|
...props,
|
|
146
146
|
children: /* @__PURE__ */ jsx("div", {
|
|
147
147
|
"data-sidebar": "sidebar",
|
|
148
148
|
"data-slot": "sidebar-inner",
|
|
149
|
-
className: "bg-sidebar
|
|
149
|
+
className: "bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full cursor-pointer flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm",
|
|
150
150
|
onClickCapture: handleSurfaceClickCapture,
|
|
151
151
|
children
|
|
152
152
|
})
|
|
@@ -4,7 +4,7 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
|
|
|
4
4
|
|
|
5
5
|
//#region src/components/spinner.d.ts
|
|
6
6
|
declare const spinnerVariants: (props?: ({
|
|
7
|
-
variant?: "
|
|
7
|
+
variant?: "primary" | "secondary" | null | undefined;
|
|
8
8
|
size?: "sm" | "lg" | "md" | "xl" | null | undefined;
|
|
9
9
|
} & _$class_variance_authority_types0.ClassProp) | undefined) => string;
|
|
10
10
|
interface SpinnerProps extends Omit<React.ComponentProps<"svg">, "children">, VariantProps<typeof spinnerVariants> {}
|
package/package.json
CHANGED
|
@@ -46,13 +46,6 @@ const buttonVariants = cva(
|
|
|
46
46
|
"bg-destructive text-destructive-foreground",
|
|
47
47
|
"[@media(hover:hover)]:hover:bg-destructive-hover",
|
|
48
48
|
].join(" "),
|
|
49
|
-
cta: [
|
|
50
|
-
"button-cta",
|
|
51
|
-
"h-9 px-4 gap-2 rounded-md",
|
|
52
|
-
"dark:bg-inverted text-foreground",
|
|
53
|
-
"transition-[transform,filter] duration-300 ease-out",
|
|
54
|
-
"active:scale-[0.99]",
|
|
55
|
-
].join(" "),
|
|
56
49
|
},
|
|
57
50
|
size: {
|
|
58
51
|
default: "type-text-sm",
|
|
@@ -72,7 +65,6 @@ interface ButtonProps extends React.ComponentProps<"button">, VariantProps<typeo
|
|
|
72
65
|
asChild?: boolean;
|
|
73
66
|
loading?: boolean;
|
|
74
67
|
icon?: React.ReactNode;
|
|
75
|
-
iconTrailing?: React.ReactNode;
|
|
76
68
|
}
|
|
77
69
|
|
|
78
70
|
function Button({
|
|
@@ -83,7 +75,6 @@ function Button({
|
|
|
83
75
|
asChild = false,
|
|
84
76
|
loading = false,
|
|
85
77
|
icon,
|
|
86
|
-
iconTrailing,
|
|
87
78
|
disabled,
|
|
88
79
|
children,
|
|
89
80
|
...props
|
|
@@ -101,7 +92,6 @@ function Button({
|
|
|
101
92
|
>
|
|
102
93
|
{loading ? <Loader2 className="motion-safe:animate-spin" /> : icon}
|
|
103
94
|
{asChild ? <Slottable>{children}</Slottable> : children}
|
|
104
|
-
{!loading && iconTrailing ? <span data-cta-icon-trailing>{iconTrailing}</span> : null}
|
|
105
95
|
</Comp>
|
|
106
96
|
);
|
|
107
97
|
}
|
|
@@ -179,7 +179,7 @@ function Sidebar({
|
|
|
179
179
|
return (
|
|
180
180
|
<div
|
|
181
181
|
data-slot="sidebar"
|
|
182
|
-
className={cn("bg-sidebar
|
|
182
|
+
className={cn("bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col", className)}
|
|
183
183
|
{...props}
|
|
184
184
|
>
|
|
185
185
|
{children}
|
|
@@ -194,7 +194,7 @@ function Sidebar({
|
|
|
194
194
|
data-sidebar="sidebar"
|
|
195
195
|
data-slot="sidebar"
|
|
196
196
|
data-mobile="true"
|
|
197
|
-
className="bg-sidebar
|
|
197
|
+
className="bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden"
|
|
198
198
|
style={
|
|
199
199
|
{
|
|
200
200
|
"--sidebar-width": SIDEBAR_WIDTH_MOBILE,
|
|
@@ -243,7 +243,7 @@ function Sidebar({
|
|
|
243
243
|
// Adjust the padding for floating and inset variants.
|
|
244
244
|
variant === "floating" || variant === "inset"
|
|
245
245
|
? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]"
|
|
246
|
-
: "
|
|
246
|
+
: "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",
|
|
247
247
|
className,
|
|
248
248
|
)}
|
|
249
249
|
{...props}
|
|
@@ -251,7 +251,7 @@ function Sidebar({
|
|
|
251
251
|
<div
|
|
252
252
|
data-sidebar="sidebar"
|
|
253
253
|
data-slot="sidebar-inner"
|
|
254
|
-
className="bg-sidebar
|
|
254
|
+
className="bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full cursor-pointer flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm"
|
|
255
255
|
onClickCapture={handleSurfaceClickCapture}
|
|
256
256
|
>
|
|
257
257
|
{children}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Plus } from "lucide-react";
|
|
2
2
|
|
|
3
3
|
import { Button } from "../components/button";
|
|
4
4
|
|
|
@@ -323,28 +323,6 @@ export const AllVariants = () => {
|
|
|
323
323
|
</Button>
|
|
324
324
|
</div>
|
|
325
325
|
|
|
326
|
-
{/* ── CTA (animated gradient ring) ────────────────────────────────── */}
|
|
327
|
-
<span className={SECTION_HEADER}>CTA — animated</span>
|
|
328
|
-
<p className="type-text-xs text-muted-foreground -mt-2 max-w-md">
|
|
329
|
-
Hover to rotate the conic gradient around the border and ignite the soft halo.
|
|
330
|
-
</p>
|
|
331
|
-
|
|
332
|
-
<div className="flex items-center gap-6">
|
|
333
|
-
<Button variant="cta" iconTrailing={<ArrowRight />}>
|
|
334
|
-
Get started
|
|
335
|
-
</Button>
|
|
336
|
-
<Button variant="cta" icon={<Sparkles />} iconTrailing={<ArrowRight />}>
|
|
337
|
-
Launch server
|
|
338
|
-
</Button>
|
|
339
|
-
<Button variant="cta">Deploy now</Button>
|
|
340
|
-
<Button variant="cta" iconTrailing={<ArrowRight />} disabled>
|
|
341
|
-
Disabled
|
|
342
|
-
</Button>
|
|
343
|
-
<Button variant="cta" iconTrailing={<ArrowRight />} loading>
|
|
344
|
-
Deploying
|
|
345
|
-
</Button>
|
|
346
|
-
</div>
|
|
347
|
-
|
|
348
326
|
{/* ── asChild ─────────────────────────────────────────────────────── */}
|
|
349
327
|
<span className={SECTION_HEADER}>asChild</span>
|
|
350
328
|
|
package/src/styles/tokens.css
CHANGED
|
@@ -39,9 +39,6 @@
|
|
|
39
39
|
|
|
40
40
|
--color-ring: #f22b79; /* Figma: focus-ring */
|
|
41
41
|
|
|
42
|
-
/* cta — decorative gradient accent, used with --color-primary in the CTA button ring */
|
|
43
|
-
--color-cta-accent: #6eece7; /* Figma: CTA border accent (cyan) */
|
|
44
|
-
|
|
45
42
|
/* sidebar */
|
|
46
43
|
--color-sidebar: #f8fafa; /* Figma: bg-secondary-subtle */
|
|
47
44
|
--color-sidebar-foreground: #3a4848; /* Figma: fg-secondary */
|
|
@@ -157,160 +154,6 @@
|
|
|
157
154
|
}
|
|
158
155
|
}
|
|
159
156
|
|
|
160
|
-
/* ─── CTA button — animated conic gradient ring ───────────────────────────── */
|
|
161
|
-
|
|
162
|
-
@property --cta-angle {
|
|
163
|
-
syntax: "<angle>";
|
|
164
|
-
inherits: false;
|
|
165
|
-
initial-value: 135deg;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
@keyframes cta-rotate {
|
|
169
|
-
to {
|
|
170
|
-
--cta-angle: 495deg;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
.button-cta {
|
|
175
|
-
position: relative;
|
|
176
|
-
isolation: isolate;
|
|
177
|
-
/* light mode: whisper-of-gradient surface tint + soft rose drop-shadow */
|
|
178
|
-
background-image: linear-gradient(
|
|
179
|
-
135deg,
|
|
180
|
-
color-mix(in oklab, var(--color-primary) 5%, transparent) 0%,
|
|
181
|
-
color-mix(in oklab, var(--color-cta-accent) 5%, transparent) 100%
|
|
182
|
-
);
|
|
183
|
-
box-shadow:
|
|
184
|
-
0 6px 24px -10px color-mix(in oklab, var(--color-primary) 38%, transparent),
|
|
185
|
-
0 2px 6px -4px color-mix(in oklab, var(--color-cta-accent) 30%, transparent);
|
|
186
|
-
transition:
|
|
187
|
-
box-shadow 400ms ease,
|
|
188
|
-
transform 300ms ease,
|
|
189
|
-
filter 300ms ease;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
@media (hover: hover) {
|
|
193
|
-
.button-cta:hover {
|
|
194
|
-
box-shadow:
|
|
195
|
-
0 10px 30px -8px color-mix(in oklab, var(--color-primary) 52%, transparent),
|
|
196
|
-
0 3px 10px -3px color-mix(in oklab, var(--color-cta-accent) 40%, transparent);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/* dark mode: solid inverted surface, no tint or shadow — let the halo do the work */
|
|
201
|
-
.dark .button-cta {
|
|
202
|
-
background-image: none;
|
|
203
|
-
box-shadow: none;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
.button-cta::before,
|
|
207
|
-
.button-cta::after {
|
|
208
|
-
content: "";
|
|
209
|
-
position: absolute;
|
|
210
|
-
inset: 0;
|
|
211
|
-
border-radius: inherit;
|
|
212
|
-
pointer-events: none;
|
|
213
|
-
/* Always "running" in browser terms, but paused at rest — freezes at current
|
|
214
|
-
angle on unhover instead of snapping back. */
|
|
215
|
-
animation: cta-rotate 3.2s linear infinite;
|
|
216
|
-
animation-play-state: paused;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/* Gradient ring (masked so only the border shows) */
|
|
220
|
-
.button-cta::before {
|
|
221
|
-
padding: 1.5px;
|
|
222
|
-
background: conic-gradient(
|
|
223
|
-
from var(--cta-angle),
|
|
224
|
-
var(--color-cta-accent) 0deg,
|
|
225
|
-
var(--color-primary) 150deg,
|
|
226
|
-
var(--color-cta-accent) 300deg,
|
|
227
|
-
var(--color-cta-accent) 360deg
|
|
228
|
-
);
|
|
229
|
-
-webkit-mask:
|
|
230
|
-
linear-gradient(#000 0 0) content-box,
|
|
231
|
-
linear-gradient(#000 0 0);
|
|
232
|
-
-webkit-mask-composite: xor;
|
|
233
|
-
mask-composite: exclude;
|
|
234
|
-
transition: filter 400ms ease;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/* Blurred glow halo behind the button — subtle in light, bolder in dark */
|
|
238
|
-
.button-cta::after {
|
|
239
|
-
z-index: -1;
|
|
240
|
-
background: conic-gradient(
|
|
241
|
-
from var(--cta-angle),
|
|
242
|
-
var(--color-cta-accent) 0deg,
|
|
243
|
-
var(--color-primary) 150deg,
|
|
244
|
-
var(--color-cta-accent) 300deg,
|
|
245
|
-
var(--color-cta-accent) 360deg
|
|
246
|
-
);
|
|
247
|
-
filter: blur(12px);
|
|
248
|
-
opacity: 0.05;
|
|
249
|
-
transition: opacity 400ms ease;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
.dark .button-cta::after {
|
|
253
|
-
opacity: 0.14;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
@media (hover: hover) {
|
|
257
|
-
.button-cta:hover::before,
|
|
258
|
-
.button-cta:hover::after {
|
|
259
|
-
animation-play-state: running;
|
|
260
|
-
}
|
|
261
|
-
.button-cta:hover::before {
|
|
262
|
-
filter: saturate(1.15) brightness(1.05);
|
|
263
|
-
}
|
|
264
|
-
.button-cta:hover::after {
|
|
265
|
-
opacity: 0.18;
|
|
266
|
-
}
|
|
267
|
-
.dark .button-cta:hover::after {
|
|
268
|
-
opacity: 0.32;
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
.button-cta:focus-visible::before,
|
|
273
|
-
.button-cta:focus-visible::after {
|
|
274
|
-
animation-play-state: running;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
.button-cta:disabled::before,
|
|
278
|
-
.button-cta:disabled::after,
|
|
279
|
-
[aria-busy="true"].button-cta::before,
|
|
280
|
-
[aria-busy="true"].button-cta::after {
|
|
281
|
-
animation-play-state: paused;
|
|
282
|
-
}
|
|
283
|
-
.button-cta:disabled::after {
|
|
284
|
-
opacity: 0;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
@media (prefers-reduced-motion: reduce) {
|
|
288
|
-
.button-cta::before,
|
|
289
|
-
.button-cta::after {
|
|
290
|
-
animation: none;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
/* Icon slide on hover (applied to [data-cta-icon-trailing]) */
|
|
295
|
-
.button-cta [data-cta-icon-trailing] {
|
|
296
|
-
transition: transform 300ms cubic-bezier(0.2, 0.8, 0.2, 1);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
@media (hover: hover) {
|
|
300
|
-
.button-cta:hover [data-cta-icon-trailing] {
|
|
301
|
-
transform: translateX(2px);
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
@media (prefers-reduced-motion: reduce) {
|
|
306
|
-
.button-cta [data-cta-icon-trailing] {
|
|
307
|
-
transition: none;
|
|
308
|
-
}
|
|
309
|
-
.button-cta:hover [data-cta-icon-trailing] {
|
|
310
|
-
transform: none;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
157
|
/* ─── Dark mode ───────────────────────────────────────────────────────────── */
|
|
315
158
|
|
|
316
159
|
.dark {
|
|
@@ -348,9 +191,6 @@
|
|
|
348
191
|
|
|
349
192
|
--color-ring: #f22b79; /* Figma: focus-ring */
|
|
350
193
|
|
|
351
|
-
/* cta — decorative gradient accent, used with --color-primary in the CTA button ring */
|
|
352
|
-
--color-cta-accent: #6eece7; /* Figma: CTA border accent (cyan) */
|
|
353
|
-
|
|
354
194
|
/* sidebar */
|
|
355
195
|
--color-sidebar: #0c1c1c; /* Figma: bg-secondary */
|
|
356
196
|
--color-sidebar-foreground: #90a4a4; /* Figma: fg-secondary */
|
|
@@ -409,14 +249,6 @@
|
|
|
409
249
|
|
|
410
250
|
@custom-variant dark (&:where(.dark, .dark *));
|
|
411
251
|
|
|
412
|
-
:root {
|
|
413
|
-
--gradient-sidebar: linear-gradient(0deg, #c9e2e280 0%, #ffffff 70%); /* Figma: bg-nav-gradiant-light */
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
.dark {
|
|
417
|
-
--gradient-sidebar: linear-gradient(0deg, #213535 0%, #121e1e 70%); /* Figma: bg-nav-gradiant-dark */
|
|
418
|
-
}
|
|
419
|
-
|
|
420
252
|
@layer base {
|
|
421
253
|
* {
|
|
422
254
|
@apply border-border shadow-shadow;
|
|
@@ -470,11 +302,6 @@
|
|
|
470
302
|
|
|
471
303
|
/* ─── Type preset utilities ───────────────────────────────────────────────── */
|
|
472
304
|
|
|
473
|
-
@utility bg-sidebar-surface {
|
|
474
|
-
background-color: var(--color-background);
|
|
475
|
-
background-image: var(--gradient-sidebar);
|
|
476
|
-
}
|
|
477
|
-
|
|
478
305
|
@utility type-display-2xl {
|
|
479
306
|
font-family: var(--font-display);
|
|
480
307
|
font-size: var(--font-size-display-2xl);
|