@alpic-ai/ui 0.0.0-dev.eb518ba → 0.0.0-dev.ec0d7ef

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.
@@ -39,6 +39,9 @@
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
+
42
45
  /* sidebar */
43
46
  --color-sidebar: #f8fafa; /* Figma: bg-secondary-subtle */
44
47
  --color-sidebar-foreground: #3a4848; /* Figma: fg-secondary */
@@ -110,6 +113,24 @@
110
113
  --animate-beacon-ring-pulse: beacon-ring-pulse 2.2s ease-in-out infinite;
111
114
  }
112
115
 
116
+ @keyframes shimmer-text {
117
+ from {
118
+ background-position: 100% center;
119
+ }
120
+ to {
121
+ background-position: 0% center;
122
+ }
123
+ }
124
+
125
+ @keyframes alpic-ride {
126
+ 0% {
127
+ transform: translate(0px, 0px);
128
+ }
129
+ 100% {
130
+ transform: translate(237px, -64px);
131
+ }
132
+ }
133
+
113
134
  @keyframes accordion-down {
114
135
  from {
115
136
  height: 0;
@@ -143,14 +164,166 @@
143
164
  @keyframes beacon-ring-pulse {
144
165
  0%,
145
166
  100% {
146
- opacity: 0.88;
167
+ opacity: 0.55;
147
168
  transform: scale(1);
148
- filter: drop-shadow(0 0 0 rgba(59, 130, 246, 0));
149
169
  }
150
170
  50% {
151
- opacity: 1;
171
+ opacity: 0.9;
152
172
  transform: scale(1.02);
153
- filter: drop-shadow(0 0 8px rgba(59, 130, 246, 0.24));
173
+ }
174
+ }
175
+
176
+ /* ─── CTA button — animated conic gradient ring ───────────────────────────── */
177
+
178
+ @property --cta-angle {
179
+ syntax: "<angle>";
180
+ inherits: false;
181
+ initial-value: 135deg;
182
+ }
183
+
184
+ @keyframes cta-rotate {
185
+ to {
186
+ --cta-angle: 495deg;
187
+ }
188
+ }
189
+
190
+ .button-cta {
191
+ position: relative;
192
+ isolation: isolate;
193
+ /* light mode: whisper-of-gradient surface tint + soft rose drop-shadow */
194
+ background-image: linear-gradient(
195
+ 135deg,
196
+ color-mix(in oklab, var(--color-primary) 5%, transparent) 0%,
197
+ color-mix(in oklab, var(--color-cta-accent) 5%, transparent) 100%
198
+ );
199
+ box-shadow:
200
+ 0 6px 24px -10px color-mix(in oklab, var(--color-primary) 38%, transparent),
201
+ 0 2px 6px -4px color-mix(in oklab, var(--color-cta-accent) 30%, transparent);
202
+ transition:
203
+ box-shadow 400ms ease,
204
+ transform 300ms ease,
205
+ filter 300ms ease;
206
+ }
207
+
208
+ @media (hover: hover) {
209
+ .button-cta:hover {
210
+ box-shadow:
211
+ 0 10px 30px -8px color-mix(in oklab, var(--color-primary) 52%, transparent),
212
+ 0 3px 10px -3px color-mix(in oklab, var(--color-cta-accent) 40%, transparent);
213
+ }
214
+ }
215
+
216
+ /* dark mode: solid inverted surface, no tint or shadow — let the halo do the work */
217
+ .dark .button-cta {
218
+ background-image: none;
219
+ box-shadow: none;
220
+ }
221
+
222
+ .button-cta::before,
223
+ .button-cta::after {
224
+ content: "";
225
+ position: absolute;
226
+ inset: 0;
227
+ border-radius: inherit;
228
+ pointer-events: none;
229
+ /* Always "running" in browser terms, but paused at rest — freezes at current
230
+ angle on unhover instead of snapping back. */
231
+ animation: cta-rotate 3.2s linear infinite;
232
+ animation-play-state: paused;
233
+ }
234
+
235
+ /* Gradient ring (masked so only the border shows) */
236
+ .button-cta::before {
237
+ padding: 1.5px;
238
+ background: conic-gradient(
239
+ from var(--cta-angle),
240
+ var(--color-cta-accent) 0deg,
241
+ var(--color-primary) 150deg,
242
+ var(--color-cta-accent) 300deg,
243
+ var(--color-cta-accent) 360deg
244
+ );
245
+ -webkit-mask:
246
+ linear-gradient(#000 0 0) content-box,
247
+ linear-gradient(#000 0 0);
248
+ -webkit-mask-composite: xor;
249
+ mask-composite: exclude;
250
+ transition: filter 400ms ease;
251
+ }
252
+
253
+ /* Blurred glow halo behind the button — subtle in light, bolder in dark */
254
+ .button-cta::after {
255
+ z-index: -1;
256
+ background: conic-gradient(
257
+ from var(--cta-angle),
258
+ var(--color-cta-accent) 0deg,
259
+ var(--color-primary) 150deg,
260
+ var(--color-cta-accent) 300deg,
261
+ var(--color-cta-accent) 360deg
262
+ );
263
+ filter: blur(12px);
264
+ opacity: 0.05;
265
+ transition: opacity 400ms ease;
266
+ }
267
+
268
+ .dark .button-cta::after {
269
+ opacity: 0.14;
270
+ }
271
+
272
+ @media (hover: hover) {
273
+ .button-cta:hover::before,
274
+ .button-cta:hover::after {
275
+ animation-play-state: running;
276
+ }
277
+ .button-cta:hover::before {
278
+ filter: saturate(1.15) brightness(1.05);
279
+ }
280
+ .button-cta:hover::after {
281
+ opacity: 0.18;
282
+ }
283
+ .dark .button-cta:hover::after {
284
+ opacity: 0.32;
285
+ }
286
+ }
287
+
288
+ .button-cta:focus-visible::before,
289
+ .button-cta:focus-visible::after {
290
+ animation-play-state: running;
291
+ }
292
+
293
+ .button-cta:disabled::before,
294
+ .button-cta:disabled::after,
295
+ [aria-busy="true"].button-cta::before,
296
+ [aria-busy="true"].button-cta::after {
297
+ animation-play-state: paused;
298
+ }
299
+ .button-cta:disabled::after {
300
+ opacity: 0;
301
+ }
302
+
303
+ @media (prefers-reduced-motion: reduce) {
304
+ .button-cta::before,
305
+ .button-cta::after {
306
+ animation: none;
307
+ }
308
+ }
309
+
310
+ /* Icon slide on hover (applied to [data-cta-icon-trailing]) */
311
+ .button-cta [data-cta-icon-trailing] {
312
+ transition: transform 300ms cubic-bezier(0.2, 0.8, 0.2, 1);
313
+ }
314
+
315
+ @media (hover: hover) {
316
+ .button-cta:hover [data-cta-icon-trailing] {
317
+ transform: translateX(2px);
318
+ }
319
+ }
320
+
321
+ @media (prefers-reduced-motion: reduce) {
322
+ .button-cta [data-cta-icon-trailing] {
323
+ transition: none;
324
+ }
325
+ .button-cta:hover [data-cta-icon-trailing] {
326
+ transform: none;
154
327
  }
155
328
  }
156
329
 
@@ -191,6 +364,9 @@
191
364
 
192
365
  --color-ring: #f22b79; /* Figma: focus-ring */
193
366
 
367
+ /* cta — decorative gradient accent, used with --color-primary in the CTA button ring */
368
+ --color-cta-accent: #6eece7; /* Figma: CTA border accent (cyan) */
369
+
194
370
  /* sidebar */
195
371
  --color-sidebar: #0c1c1c; /* Figma: bg-secondary */
196
372
  --color-sidebar-foreground: #90a4a4; /* Figma: fg-secondary */
@@ -249,6 +425,14 @@
249
425
 
250
426
  @custom-variant dark (&:where(.dark, .dark *));
251
427
 
428
+ :root {
429
+ --gradient-sidebar: linear-gradient(0deg, #c9e2e280 0%, #ffffff 70%); /* Figma: bg-nav-gradiant-light */
430
+ }
431
+
432
+ .dark {
433
+ --gradient-sidebar: linear-gradient(0deg, #213535 0%, #121e1e 70%); /* Figma: bg-nav-gradiant-dark */
434
+ }
435
+
252
436
  @layer base {
253
437
  * {
254
438
  @apply border-border shadow-shadow;
@@ -302,6 +486,11 @@
302
486
 
303
487
  /* ─── Type preset utilities ───────────────────────────────────────────────── */
304
488
 
489
+ @utility bg-sidebar-surface {
490
+ background-color: var(--color-background);
491
+ background-image: var(--gradient-sidebar);
492
+ }
493
+
305
494
  @utility type-display-2xl {
306
495
  font-family: var(--font-display);
307
496
  font-size: var(--font-size-display-2xl);