@alpic-ai/ui 0.0.0-dev.ffc851f → 0.0.0-dev.fffc79a

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