@ansiversa/components 0.0.21 → 0.0.23

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ansiversa/components",
3
- "version": "0.0.21",
3
+ "version": "0.0.23",
4
4
  "description": "Shared UI components and layouts for the Ansiversa ecosystem",
5
5
  "type": "module",
6
6
  "exports": {
@@ -2,10 +2,12 @@
2
2
  import AvButton from "./AvButton.astro";
3
3
  import AvContainer from "./AvContainer.astro";
4
4
 
5
+ type ButtonVariant = "primary" | "ghost" | "outline";
6
+
5
7
  interface Action {
6
8
  label: string;
7
9
  href: string;
8
- variant?: string;
10
+ variant?: ButtonVariant;
9
11
  }
10
12
 
11
13
  interface Props {
@@ -21,22 +23,26 @@ const { title, description, primaryAction, secondaryAction } = Astro.props as Pr
21
23
  <section class="av-page-header">
22
24
  <AvContainer className="av-page-header__container">
23
25
  <div class="av-page-header__body">
24
- <h1 class="av-page-header__title">{title}</h1>
26
+ <div class="av-page-header__top">
27
+ <h1 class="av-page-header__title">{title}</h1>
28
+
29
+ {(primaryAction || secondaryAction) && (
30
+ <div class="av-page-header__actions">
31
+ {primaryAction && (
32
+ <AvButton href={primaryAction.href} variant={primaryAction.variant ?? "primary"}>
33
+ {primaryAction.label}
34
+ </AvButton>
35
+ )}
36
+ {secondaryAction && (
37
+ <AvButton href={secondaryAction.href} variant={secondaryAction.variant ?? "ghost"}>
38
+ {secondaryAction.label}
39
+ </AvButton>
40
+ )}
41
+ </div>
42
+ )}
43
+ </div>
44
+
25
45
  {description && <p class="av-page-header__description">{description}</p>}
26
- {(primaryAction || secondaryAction) && (
27
- <div class="av-page-header__actions">
28
- {primaryAction && (
29
- <AvButton href={primaryAction.href} variant={primaryAction.variant ?? "primary"}>
30
- {primaryAction.label}
31
- </AvButton>
32
- )}
33
- {secondaryAction && (
34
- <AvButton href={secondaryAction.href} variant={secondaryAction.variant ?? "ghost"}>
35
- {secondaryAction.label}
36
- </AvButton>
37
- )}
38
- </div>
39
- )}
40
46
  </div>
41
47
  </AvContainer>
42
48
  </section>
@@ -30,10 +30,9 @@
30
30
  --av-text-soft: #6b7280;
31
31
  --av-text-strong: #f9fafb;
32
32
 
33
- --ans-primary: hsl(260, 100%, 70%); /* example */
34
-
35
- --ans-primary-rgb: 140, 100, 255; /* MUST match your primary color */
36
-
33
+ /* Ansiversa highlight (used by a few legacy utilities) */
34
+ --ans-primary: hsl(260, 100%, 70%);
35
+ --ans-primary-rgb: 140, 100, 255; /* MUST match --ans-primary */
37
36
 
38
37
  /* Layout & Radius */
39
38
  --av-radius-xs: 0.375rem;
@@ -195,7 +194,7 @@
195
194
  ========================================= */
196
195
 
197
196
  @layer components {
198
- /* Layout / Grid ---------------------------------- */
197
+ /* Layout ------------------------------------------------ */
199
198
 
200
199
  .av-page {
201
200
  @apply min-h-screen flex flex-col;
@@ -221,7 +220,7 @@
221
220
  @apply flex-1;
222
221
  }
223
222
 
224
- /* Brand / Logo ------------------------------------ */
223
+ /* Brand / Logo ----------------------------------------- */
225
224
 
226
225
  .av-navbar-brand {
227
226
  @apply flex items-center gap-3 text-slate-100 no-underline;
@@ -267,7 +266,7 @@
267
266
  @apply hidden md:inline;
268
267
  }
269
268
 
270
- /* Hero / Sections / Grid -------------------------- */
269
+ /* Hero / Sections -------------------------------------- */
271
270
 
272
271
  .av-hero {
273
272
  @apply py-16 md:py-24;
@@ -317,27 +316,7 @@
317
316
  @apply grid gap-5 md:gap-6 md:grid-cols-3;
318
317
  }
319
318
 
320
- .av-row {
321
- @apply flex flex-wrap -mx-3;
322
- }
323
-
324
- .av-col {
325
- @apply px-3;
326
- }
327
-
328
- .av-col-6 {
329
- @apply px-3 w-full md:w-1/2;
330
- }
331
-
332
- .av-col-4 {
333
- @apply px-3 w-full md:w-1/3;
334
- }
335
-
336
- .av-col-3 {
337
- @apply px-3 w-full md:w-1/4;
338
- }
339
-
340
- /* Steps / Timeline-ish ---------------------------- */
319
+ /* Steps / Timeline-ish --------------------------------- */
341
320
 
342
321
  .av-card-heading {
343
322
  @apply text-sm font-semibold text-slate-100 mb-2;
@@ -359,111 +338,14 @@
359
338
  @apply text-sm text-slate-400;
360
339
  }
361
340
 
362
- /* Pricing Grid ------------------------------------ */
363
-
364
- .av-pricing-grid {
365
- @apply grid gap-7 md:grid-cols-3;
366
- }
367
-
368
- .av-pricing-section {
369
- @apply py-16 border-t border-slate-800/80;
370
- }
371
-
372
- .av-pricing-table-wrapper {
373
- @apply overflow-x-auto mt-10;
374
- }
375
-
376
- .av-pricing-table {
377
- width: 100%;
378
- border-collapse: collapse;
379
- min-width: 720px;
380
- font-size: 0.9rem;
381
- }
382
-
383
- .av-pricing-table th,
384
- .av-pricing-table td {
385
- @apply border border-slate-800/80 p-3 text-left align-top;
386
- }
387
-
388
- .av-pricing-table th {
389
- @apply bg-slate-900/80 text-slate-200;
390
- }
391
-
392
- .av-pricing-table tbody tr:nth-child(even) {
393
- @apply bg-slate-900/40;
394
- }
395
-
396
- .av-pricing-chip {
397
- @apply inline-flex items-center rounded-full bg-slate-900/80 px-3 py-1 text-[0.7rem] uppercase tracking-[0.18em] text-slate-400;
398
- }
399
-
400
- /* Founder / About Layout -------------------------- */
401
-
402
- .av-founder-layout {
403
- @apply flex flex-col gap-6 md:flex-row md:items-start;
404
- }
405
-
406
- .av-founder-photo-wrap {
407
- @apply w-full md:w-1/3;
408
- }
409
-
410
- .av-founder-photo {
411
- @apply w-full rounded-2xl object-cover;
412
- box-shadow: var(--av-shadow-soft);
413
- }
414
-
415
- .av-founder-copy {
416
- @apply w-full md:w-2/3 space-y-4;
417
- }
418
-
419
- .av-quote {
420
- @apply border-l-4 pl-4 pr-4 py-3 rounded-xl text-base leading-relaxed;
421
-
422
- /* Background + border */
423
- background-color: rgba(255, 255, 255, 0.08);
424
- border-color: var(--av-primary);
425
-
426
- /* Contrast-safe text */
427
- color: var(--av-text);
428
- }
429
-
430
- /* Typography helpers ------------------------------ */
431
-
432
- .av-gradient-text {
433
- /* Fallback */
434
- color: var(--av-text-strong);
435
-
436
- /* Gradient text for modern browsers */
437
- background-image: linear-gradient(to right, #22d3ee, #a855f7);
438
- background-clip: text;
439
- -webkit-background-clip: text;
440
- color: transparent;
441
- -webkit-text-fill-color: transparent;
442
- }
443
-
444
- .av-caption {
445
- @apply text-[0.78rem] text-slate-500;
446
- }
447
-
448
- .av-kicker {
449
- @apply inline-flex items-center gap-2 rounded-full border border-slate-700/80
450
- bg-slate-900/80 px-3 py-1 text-[0.7rem] uppercase tracking-[0.18em] text-slate-400;
451
- }
452
-
453
- .av-mono {
454
- font-family: var(--av-font-mono);
455
- }
456
-
457
- /* Card (like Bootstrap .card) --------------------- */
341
+ /* Card -------------------------------------------------- */
458
342
 
459
343
  .av-card {
460
- @apply relative rounded-2xl border border-slate-800/70
461
- bg-slate-950/80 p-6 md:p-7 shadow-xl backdrop-blur-xl;
344
+ @apply relative rounded-2xl border border-slate-800/70 bg-slate-950/80 p-6 md:p-7 shadow-xl backdrop-blur-xl;
462
345
  }
463
346
 
464
347
  .av-card-soft {
465
- @apply rounded-xl border border-slate-800/60
466
- bg-slate-950/60 p-4 md:p-5;
348
+ @apply rounded-xl border border-slate-800/60 bg-slate-950/60 p-4 md:p-5;
467
349
  }
468
350
 
469
351
  .av-card-header {
@@ -482,20 +364,14 @@
482
364
  @apply text-sm text-slate-300;
483
365
  }
484
366
 
485
- /* Buttons (Bootstrap-ish) ------------------------- */
367
+ /* Buttons ---------------------------------------------- */
486
368
 
487
369
  .av-btn {
488
- @apply inline-flex items-center justify-center gap-2 rounded-full px-4 py-2
489
- text-xs md:text-sm font-medium transition-all duration-150 ease-out;
370
+ @apply inline-flex items-center justify-center gap-2 rounded-full px-4 py-2 text-xs md:text-sm font-medium transition-all duration-150 ease-out;
490
371
  }
491
372
 
492
373
  .av-btn-primary {
493
- @apply inline-flex items-center justify-center gap-2 rounded-full px-4 py-2
494
- text-xs md:text-sm font-medium transition-all duration-150 ease-out
495
- border border-cyan-400/80
496
- bg-cyan-500/20
497
- text-slate-50
498
- shadow-[0_0_30px_rgba(34,211,238,0.35)];
374
+ @apply inline-flex items-center justify-center gap-2 rounded-full px-4 py-2 text-xs md:text-sm font-medium transition-all duration-150 ease-out border border-cyan-400/80 bg-cyan-500/20 text-slate-50 shadow-[0_0_30px_rgba(34,211,238,0.35)];
499
375
  }
500
376
 
501
377
  .av-btn-primary:hover {
@@ -504,11 +380,7 @@
504
380
  }
505
381
 
506
382
  .av-btn-ghost {
507
- @apply inline-flex items-center justify-center gap-2 rounded-full px-4 py-2
508
- text-xs md:text-sm font-medium transition-all duration-150 ease-out
509
- border border-slate-700/70
510
- bg-slate-900/70
511
- text-slate-300;
383
+ @apply inline-flex items-center justify-center gap-2 rounded-full px-4 py-2 text-xs md:text-sm font-medium transition-all duration-150 ease-out border border-slate-700/70 bg-slate-900/70 text-slate-300;
512
384
  }
513
385
 
514
386
  .av-btn-ghost:hover {
@@ -516,11 +388,7 @@
516
388
  }
517
389
 
518
390
  .av-btn-outline {
519
- @apply inline-flex items-center justify-center gap-2 rounded-full px-4 py-2
520
- text-xs md:text-sm font-medium transition-all duration-150 ease-out
521
- border border-cyan-400/70
522
- bg-transparent
523
- text-cyan-300;
391
+ @apply inline-flex items-center justify-center gap-2 rounded-full px-4 py-2 text-xs md:text-sm font-medium transition-all duration-150 ease-out border border-cyan-400/70 bg-transparent text-cyan-300;
524
392
  }
525
393
 
526
394
  .av-btn-outline:hover {
@@ -539,7 +407,7 @@
539
407
  @apply w-full justify-center;
540
408
  }
541
409
 
542
- /* Forms ------------------------------------------- */
410
+ /* Forms ------------------------------------------------- */
543
411
 
544
412
  .av-form-group {
545
413
  @apply space-y-1.5;
@@ -556,11 +424,7 @@
556
424
  .av-input,
557
425
  .av-select,
558
426
  .av-textarea {
559
- @apply w-full rounded-lg border border-slate-700
560
- bg-slate-950/60 px-3 py-2.5 text-sm text-slate-100
561
- placeholder:text-slate-500
562
- focus-visible:outline-none
563
- focus-visible:ring-2 focus-visible:ring-cyan-400/80;
427
+ @apply w-full rounded-lg border border-slate-700 bg-slate-950/60 px-3 py-2.5 text-sm text-slate-100 placeholder:text-slate-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400/80;
564
428
  }
565
429
 
566
430
  .av-input-sm {
@@ -573,9 +437,7 @@
573
437
 
574
438
  .av-checkbox,
575
439
  .av-radio {
576
- @apply h-3.5 w-3.5 rounded border border-slate-600 bg-slate-950/60
577
- text-cyan-400
578
- focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/70;
440
+ @apply h-3.5 w-3.5 rounded border border-slate-600 bg-slate-950/60 text-cyan-400 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-cyan-400/70;
579
441
  }
580
442
 
581
443
  .av-inline-check {
@@ -590,7 +452,7 @@
590
452
  @apply text-xs text-slate-400;
591
453
  }
592
454
 
593
- /* Navbar / Nav ------------------------------------ */
455
+ /* Navbar / Nav ----------------------------------------- */
594
456
 
595
457
  .av-navbar {
596
458
  @apply border-b border-slate-800/60 bg-slate-950/60 backdrop-blur-xl;
@@ -612,55 +474,47 @@
612
474
  @apply text-slate-50;
613
475
  }
614
476
 
615
- /* Badges / Pills ---------------------------------- */
477
+ /* Badges / Pills --------------------------------------- */
616
478
 
617
479
  .av-badge {
618
- @apply inline-flex items-center rounded-full border border-slate-700/70
619
- bg-slate-900/80 px-2.5 py-0.5 text-[0.7rem] text-slate-300;
480
+ @apply inline-flex items-center rounded-full border border-slate-700/70 bg-slate-900/80 px-2.5 py-0.5 text-[0.7rem] text-slate-300;
620
481
  }
621
482
 
622
483
  .av-badge-primary {
623
- @apply inline-flex items-center rounded-full border border-cyan-400/80
624
- bg-cyan-500/15 px-2.5 py-0.5 text-[0.7rem] text-cyan-100;
484
+ @apply inline-flex items-center rounded-full border border-cyan-400/80 bg-cyan-500/15 px-2.5 py-0.5 text-[0.7rem] text-cyan-100;
625
485
  }
626
486
 
627
487
  .av-badge-secondary {
628
- @apply inline-flex items-center rounded-full border border-purple-500/80
629
- bg-purple-500/15 px-2.5 py-0.5 text-[0.7rem] text-purple-100;
488
+ @apply inline-flex items-center rounded-full border border-purple-500/80 bg-purple-500/15 px-2.5 py-0.5 text-[0.7rem] text-purple-100;
630
489
  }
631
490
 
632
491
  .av-badge-soft {
633
- @apply inline-flex items-center rounded-full border border-slate-700/50
634
- bg-slate-900/70 px-2.5 py-0.5 text-[0.7rem] text-slate-300;
492
+ @apply inline-flex items-center rounded-full border border-slate-700/50 bg-slate-900/70 px-2.5 py-0.5 text-[0.7rem] text-slate-300;
635
493
  }
636
494
 
637
- /* Alerts ------------------------------------------ */
495
+ /* Alerts ----------------------------------------------- */
638
496
 
639
497
  .av-alert {
640
498
  @apply rounded-lg border px-3.5 py-2.5 text-xs md:text-sm flex items-start gap-3;
641
499
  }
642
500
 
643
501
  .av-alert-info {
644
- @apply rounded-lg border px-3.5 py-2.5 text-xs md:text-sm flex items-start gap-3
645
- border-cyan-400/40 bg-cyan-500/10 text-cyan-50;
502
+ @apply rounded-lg border px-3.5 py-2.5 text-xs md:text-sm flex items-start gap-3 border-cyan-400/40 bg-cyan-500/10 text-cyan-50;
646
503
  }
647
504
 
648
505
  .av-alert-success {
649
- @apply rounded-lg border px-3.5 py-2.5 text-xs md:text-sm flex items-start gap-3
650
- border-emerald-400/40 bg-emerald-500/10 text-emerald-50;
506
+ @apply rounded-lg border px-3.5 py-2.5 text-xs md:text-sm flex items-start gap-3 border-emerald-400/40 bg-emerald-500/10 text-emerald-50;
651
507
  }
652
508
 
653
509
  .av-alert-warning {
654
- @apply rounded-lg border px-3.5 py-2.5 text-xs md:text-sm flex items-start gap-3
655
- border-amber-400/50 bg-amber-500/10 text-amber-50;
510
+ @apply rounded-lg border px-3.5 py-2.5 text-xs md:text-sm flex items-start gap-3 border-amber-400/50 bg-amber-500/10 text-amber-50;
656
511
  }
657
512
 
658
513
  .av-alert-danger {
659
- @apply rounded-lg border px-3.5 py-2.5 text-xs md:text-sm flex items-start gap-3
660
- border-rose-500/60 bg-rose-500/10 text-rose-50;
514
+ @apply rounded-lg border px-3.5 py-2.5 text-xs md:text-sm flex items-start gap-3 border-rose-500/60 bg-rose-500/10 text-rose-50;
661
515
  }
662
516
 
663
- /* Tables ------------------------------------------ */
517
+ /* Tables ----------------------------------------------- */
664
518
 
665
519
  .av-table {
666
520
  @apply w-full border-collapse text-sm text-left text-slate-300;
@@ -687,20 +541,13 @@
687
541
  @apply bg-slate-900/60;
688
542
  }
689
543
 
690
- /* Divider / Lines --------------------------------- */
544
+ /* Divider ---------------------------------------------- */
691
545
 
692
546
  .av-divider {
693
547
  @apply w-full h-px bg-gradient-to-r from-transparent via-slate-700 to-transparent my-7;
694
548
  }
695
549
 
696
- /* Hero overlay card option ------------------------ */
697
-
698
- .av-hero-card {
699
- @apply relative rounded-2xl border border-slate-800/70
700
- bg-slate-950/80 p-6 md:p-7 shadow-xl backdrop-blur-xl max-w-2xl;
701
- }
702
-
703
- /* Auth layouts ------------------------------------ */
550
+ /* Auth layouts ----------------------------------------- */
704
551
 
705
552
  .av-card-auth {
706
553
  @apply max-w-md w-full mx-auto;
@@ -714,25 +561,11 @@
714
561
  @apply text-sm;
715
562
  }
716
563
 
717
- .av-auth-stack-xs {
718
- @apply space-y-1;
719
- }
720
-
721
- .av-auth-stack-sm {
722
- @apply space-y-2;
723
- }
724
-
725
- .av-auth-stack-md {
726
- @apply space-y-3;
727
- }
728
-
729
- .av-auth-stack-lg {
730
- @apply space-y-4;
731
- }
732
-
733
- .av-auth-stack-xl {
734
- @apply space-y-6;
735
- }
564
+ .av-auth-stack-xs { @apply space-y-1; }
565
+ .av-auth-stack-sm { @apply space-y-2; }
566
+ .av-auth-stack-md { @apply space-y-3; }
567
+ .av-auth-stack-lg { @apply space-y-4; }
568
+ .av-auth-stack-xl { @apply space-y-6; }
736
569
 
737
570
  .av-auth-title {
738
571
  @apply text-xl font-semibold tracking-tight text-slate-100;
@@ -746,128 +579,92 @@
746
579
  @apply grid gap-3 sm:grid-cols-2;
747
580
  }
748
581
 
749
- .av-feature-list {
750
- @apply grid gap-3 text-sm text-slate-400;
751
- }
752
-
753
- .av-feature-item {
754
- @apply flex items-center gap-2;
755
- }
756
-
757
- .av-feature-dot {
758
- @apply h-1 w-1 rounded-full;
759
- }
760
-
761
- .av-feature-dot--primary {
762
- @apply bg-cyan-400/80;
763
- }
764
-
765
- .av-feature-dot--secondary {
766
- @apply bg-purple-500/80;
767
- }
768
-
769
- .av-muted-link {
770
- @apply text-cyan-300 hover:text-cyan-100;
771
- }
772
-
773
- /* Signout specifics ------------------------------- */
774
-
775
- .av-auth-signout {
776
- @apply flex justify-center;
777
- }
778
-
779
- .av-auth-signout__card {
780
- @apply w-full max-w-2xl space-y-6;
781
- }
782
-
783
- .av-auth-signout__header {
784
- @apply flex items-center gap-3;
785
- }
786
-
787
- .av-auth-signout__logo {
788
- @apply h-12 w-12 rounded-xl bg-white/10 p-2 flex items-center justify-center shadow-lg;
789
- }
582
+ /* Footer ----------------------------------------------- */
790
583
 
791
- .av-auth-signout__brand {
792
- @apply flex flex-col;
793
- }
794
-
795
- .av-auth-signout__brand-title {
796
- @apply uppercase tracking-[0.18em] text-sm font-semibold text-slate-100;
797
- }
798
-
799
- .av-auth-signout__brand-subtitle {
800
- @apply text-xs text-slate-400;
801
- }
802
-
803
- .av-auth-signout__status {
804
- @apply ml-auto inline-flex items-center gap-2 text-xs text-slate-400;
805
- }
806
-
807
- .av-auth-signout__status-dot {
808
- @apply h-2 w-2 rounded-full bg-green-400 animate-pulse;
809
- }
810
-
811
- .av-auth-signout__badge {
812
- @apply inline-flex items-center gap-2 px-4 py-2 rounded-full border border-white/10 bg-white/5 text-sm;
813
- }
814
-
815
- .av-auth-signout__heading {
816
- @apply text-3xl font-semibold text-slate-100;
817
- }
818
-
819
- .av-auth-signout__copy {
820
- @apply text-slate-400 leading-relaxed;
584
+ .av-footer {
585
+ @apply mt-10 border-t border-slate-800/70;
821
586
  }
822
587
 
823
- .av-auth-signout__actions {
824
- @apply flex flex-wrap gap-3 pt-2;
588
+ .av-footer-inner {
589
+ @apply w-full max-w-5xl mx-auto px-5 py-6 flex flex-col sm:flex-row items-center justify-between gap-3;
825
590
  }
826
591
 
827
- .av-auth-signout__primary-action {
828
- @apply text-black;
592
+ .av-footer-meta {
593
+ @apply flex items-center gap-4 text-[0.78rem] text-slate-500;
829
594
  }
830
595
 
831
- .av-auth-signout__status-grid {
832
- @apply grid grid-cols-1 sm:grid-cols-2 gap-3 pt-4;
596
+ .av-footer-separator {
597
+ @apply text-slate-600 hidden sm:inline;
833
598
  }
834
599
 
835
- .av-auth-signout__status-card {
836
- @apply flex items-start gap-3 p-3 rounded-xl border border-white/5 bg-white/5;
600
+ .av-footer-quote {
601
+ @apply text-[0.78rem] text-slate-500 hidden sm:inline;
837
602
  }
838
603
 
839
- .av-auth-signout__status-indicator {
840
- @apply h-2.5 w-2.5 rounded-full bg-[var(--ans-primary)] shadow;
841
- }
604
+ /* User menu / avatar ----------------------------------- */
842
605
 
843
- .av-auth-signout__status-title {
844
- @apply block text-sm text-white;
606
+ .av-user-menu-wrapper {
607
+ @apply relative;
845
608
  }
846
609
 
847
- .av-auth-signout__status-description {
848
- @apply block text-xs text-slate-400;
610
+ .av-user-avatar-button {
611
+ @apply inline-flex h-9 w-9 items-center justify-center rounded-full border border-slate-700 bg-slate-900 text-slate-100 shadow-sm hover:border-slate-500 transition;
612
+ position: relative;
613
+ cursor: pointer;
614
+ background: transparent;
615
+ border: none;
849
616
  }
850
617
 
851
- .av-auth-signout__footer {
852
- @apply pt-2 text-xs text-slate-400 flex justify-between;
618
+ .av-user-avatar-circle {
619
+ @apply text-sm font-medium;
620
+ width: 100%;
621
+ height: 100%;
622
+ border-radius: 50%;
623
+ background: rgba(255, 255, 255, 0.12);
624
+ backdrop-filter: blur(8px);
625
+ border: 1px solid rgba(255, 255, 255, 0.25);
626
+ display: flex;
627
+ align-items: center;
628
+ justify-content: center;
629
+ color: #fff;
630
+ font-size: 0.9rem;
631
+ transition: all 0.3s ease;
632
+ position: relative;
633
+ }
634
+
635
+ .av-user-avatar-button::before {
636
+ content: "";
637
+ position: absolute;
638
+ inset: 0;
639
+ border-radius: 50%;
640
+ background: radial-gradient(
641
+ circle at center,
642
+ rgba(var(--ans-primary-rgb), 0.6),
643
+ rgba(var(--ans-primary-rgb), 0.15) 40%,
644
+ transparent 70%
645
+ );
646
+ opacity: 0;
647
+ transform: scale(0.7);
648
+ transition: all 0.35s ease;
649
+ pointer-events: none;
853
650
  }
854
651
 
855
- .av-auth-signout__footer-links {
856
- @apply space-x-3;
652
+ .av-user-avatar-button:hover::before {
653
+ opacity: 1;
654
+ transform: scale(1);
857
655
  }
858
656
 
859
- /* User menu / avatar ------------------------------ */
860
-
861
- .av-user-menu-wrapper {
862
- @apply relative;
657
+ .av-user-avatar-button:hover .av-user-avatar-circle {
658
+ background: rgba(255, 255, 255, 0.18);
659
+ border-color: rgba(255, 255, 255, 0.35);
863
660
  }
864
661
 
865
- .av-user-avatar-button {
866
- @apply inline-flex h-9 w-9 items-center justify-center rounded-full border border-slate-700 bg-slate-900 text-slate-100 shadow-sm hover:border-slate-500 transition;
662
+ .av-user-avatar-button:active::before {
663
+ transform: scale(0.9);
867
664
  }
868
665
 
869
- .av-user-avatar-circle {
870
- @apply text-sm font-medium;
666
+ .av-user-avatar-button:active .av-user-avatar-circle {
667
+ transform: scale(0.96);
871
668
  }
872
669
 
873
670
  .av-user-menu {
@@ -912,237 +709,157 @@
912
709
  @apply text-red-400 hover:bg-red-950/40;
913
710
  }
914
711
 
915
- /* Auth brand tweaks ------------------------------- */
712
+ /* Password input helper (used in auth) ----------------- */
916
713
 
917
- .av-auth-brand--center {
918
- justify-content: center;
919
- text-align: center;
920
- }
714
+ .av-input-wrapper { position: relative; }
715
+ .av-input-password-container { position: relative; }
921
716
 
922
- .av-auth-brand img {
923
- filter: drop-shadow(0 0 12px rgba(255, 255, 255, 0.25))
924
- drop-shadow(0 0 24px rgba(255, 255, 255, 0.15));
925
- transition: transform 0.25s ease, filter 0.25s ease;
717
+ .av-password-toggle {
718
+ position: absolute;
719
+ right: 0.75rem;
720
+ top: 50%;
721
+ transform: translateY(-50%);
722
+ background: transparent;
723
+ border: none;
724
+ padding: 0;
725
+ cursor: pointer;
726
+ color: var(--av-text-soft);
926
727
  }
927
728
 
928
- .av-auth-brand:hover img {
929
- transform: scale(1.05);
930
- filter: drop-shadow(0 0 16px rgba(255, 255, 255, 0.35))
931
- drop-shadow(0 0 28px rgba(255, 255, 255, 0.25));
729
+ .av-password-toggle:hover {
730
+ color: var(--av-text);
932
731
  }
933
732
 
934
- /* Footer ------------------------------------------ */
935
-
936
- .av-footer {
937
- @apply mt-10 border-t border-slate-800/70;
733
+ .av-password-icon {
734
+ width: 20px;
735
+ height: 20px;
736
+ stroke-width: 1.75;
938
737
  }
939
738
 
940
- .av-footer-inner {
941
- @apply w-full max-w-5xl mx-auto px-5 py-6 flex flex-col sm:flex-row items-center justify-between gap-3;
942
- }
739
+ /* AvPageHeader (NEW) ----------------------------------- */
943
740
 
944
- .av-footer-meta {
945
- @apply flex items-center gap-4 text-[0.78rem] text-slate-500;
741
+ .av-page-header {
742
+ @apply border-b border-slate-800/60;
946
743
  }
947
744
 
948
- .av-footer-separator {
949
- @apply text-slate-600 hidden sm:inline;
745
+ .av-page-header__container {
746
+ @apply py-6 md:py-8;
950
747
  }
951
748
 
952
- .av-footer-quote {
953
- @apply text-[0.78rem] text-slate-500 hidden sm:inline;
954
- }
955
- }
956
-
957
- /* =========================================
958
- Utilities Layer
959
- ========================================= */
960
-
961
- @layer utilities {
962
- .av-shadow-soft {
963
- box-shadow: var(--av-shadow-soft);
964
- }
965
-
966
- .av-shadow-glow {
967
- box-shadow: var(--av-shadow-glow);
749
+ .av-page-header__body {
750
+ @apply space-y-3;
968
751
  }
969
752
 
970
- .av-text-soft {
971
- color: var(--av-text-soft);
753
+ .av-page-header__title {
754
+ @apply text-2xl md:text-3xl font-semibold text-slate-100;
972
755
  }
973
756
 
974
- .av-text-muted {
975
- color: var(--av-text-muted);
757
+ .av-page-header__description {
758
+ @apply text-sm md:text-base text-slate-400 max-w-3xl;
976
759
  }
977
760
 
978
- .av-text-strong {
979
- color: var(--av-text-strong);
761
+ /* Mobile-first: stacked */
762
+ .av-page-header__top {
763
+ display: flex;
764
+ flex-direction: column;
765
+ align-items: flex-start;
766
+ gap: 0.75rem;
980
767
  }
981
768
 
982
- .av-bg-surface {
983
- background-color: var(--av-surface);
769
+ .av-page-header__actions {
770
+ display: flex;
771
+ flex-direction: column;
772
+ gap: 0.5rem;
773
+ width: 100%;
984
774
  }
985
775
 
986
- .av-bg-surface-soft {
987
- background-color: var(--av-surface-soft);
776
+ .av-page-header__actions .av-btn {
777
+ width: 100%;
988
778
  }
989
779
 
990
- .av-border-subtle {
991
- border-color: var(--av-border-subtle);
992
- }
780
+ /* Desktop: title left, actions right */
781
+ @media (min-width: 640px) {
782
+ .av-page-header__top {
783
+ flex-direction: row;
784
+ align-items: flex-start;
785
+ justify-content: space-between;
786
+ }
993
787
 
994
- .av-border-strong {
995
- border-color: var(--av-border-strong);
996
- }
788
+ .av-page-header__actions {
789
+ flex-direction: row;
790
+ width: auto;
791
+ justify-content: flex-end;
792
+ flex-wrap: wrap;
793
+ }
997
794
 
998
- .av-text-center {
999
- @apply text-center;
795
+ .av-page-header__actions .av-btn {
796
+ width: auto;
797
+ }
1000
798
  }
1001
-
1002
- .av-nowrap {
1003
- @apply whitespace-nowrap;
1004
- }
1005
-
1006
- /* --- USER AVATAR BUTTON --- */
1007
- .av-user-avatar-button {
1008
- position: relative;
1009
- display: inline-flex;
1010
- align-items: center;
1011
- justify-content: center;
1012
- width: 38px;
1013
- height: 38px;
1014
- border-radius: 50%;
1015
- border: none;
1016
- background: transparent;
1017
- cursor: pointer;
1018
- transition: all 0.25s ease;
1019
- }
1020
-
1021
- /* Avatar circle */
1022
- .av-user-avatar-circle {
1023
- width: 100%;
1024
- height: 100%;
1025
- border-radius: 50%;
1026
- background: rgba(255, 255, 255, 0.12);
1027
- backdrop-filter: blur(8px);
1028
- border: 1px solid rgba(255,255,255,0.25);
1029
-
1030
- display: flex;
1031
- align-items: center;
1032
- justify-content: center;
1033
- font-weight: 600;
1034
- color: #fff;
1035
- font-size: 0.9rem;
1036
-
1037
- transition: all 0.3s ease;
1038
- position: relative;
1039
799
  }
1040
800
 
1041
- /* Glow ring */
1042
- .av-user-avatar-button::before {
1043
- content: "";
1044
- position: absolute;
1045
- inset: 0;
1046
- border-radius: 50%;
1047
- background: radial-gradient(
1048
- circle at center,
1049
- rgba(var(--ans-primary-rgb), 0.6),
1050
- rgba(var(--ans-primary-rgb), 0.15) 40%,
1051
- transparent 70%
1052
- );
1053
- opacity: 0;
1054
- transform: scale(0.7);
1055
- transition: all 0.35s ease;
1056
- pointer-events: none;
1057
- }
1058
-
1059
- /* Hover state */
1060
- .av-user-avatar-button:hover::before {
1061
- opacity: 1;
1062
- transform: scale(1);
1063
- }
1064
-
1065
- .av-user-avatar-button:hover .av-user-avatar-circle {
1066
- background: rgba(255, 255, 255, 0.18);
1067
- border-color: rgba(255,255,255,0.35);
1068
- }
1069
-
1070
- /* Active (click) */
1071
- .av-user-avatar-button:active::before {
1072
- transform: scale(0.9);
1073
- }
1074
-
1075
- .av-user-avatar-button:active .av-user-avatar-circle {
1076
- transform: scale(0.96);
1077
- }
801
+ /* =========================================
802
+ Utilities Layer
803
+ ========================================= */
1078
804
 
805
+ @layer utilities {
806
+ .av-shadow-soft { box-shadow: var(--av-shadow-soft); }
807
+ .av-shadow-glow { box-shadow: var(--av-shadow-glow); }
1079
808
 
1080
- .av-input-wrapper {
1081
- position: relative;
1082
- }
809
+ .av-text-soft { color: var(--av-text-soft); }
810
+ .av-text-muted { color: var(--av-text-muted); }
811
+ .av-text-strong { color: var(--av-text-strong); }
1083
812
 
1084
- .av-input-password-container {
1085
- position: relative;
1086
- }
813
+ .av-bg-surface { background-color: var(--av-surface); }
814
+ .av-bg-surface-soft { background-color: var(--av-surface-soft); }
1087
815
 
1088
- .av-password-toggle {
1089
- position: absolute;
1090
- right: 0.75rem;
1091
- top: 50%;
1092
- transform: translateY(-50%);
1093
- background: transparent;
1094
- border: none;
1095
- padding: 0;
1096
- cursor: pointer;
1097
- color: var(--av-text-soft);
1098
- }
816
+ .av-border-subtle { border-color: var(--av-border-subtle); }
817
+ .av-border-strong { border-color: var(--av-border-strong); }
1099
818
 
1100
- .av-password-toggle:hover {
1101
- color: var(--av-text);
1102
- }
819
+ .av-text-center { @apply text-center; }
820
+ .av-nowrap { @apply whitespace-nowrap; }
1103
821
 
1104
- .av-password-icon {
1105
- width: 20px;
1106
- height: 20px;
1107
- stroke-width: 1.75;
1108
- }
822
+ /* Vertical list utility */
823
+ .av-stack {
824
+ display: flex;
825
+ flex-direction: column;
826
+ gap: 1rem;
827
+ }
1109
828
 
1110
- /* Grid utility */
1111
- .av-card-grid {
1112
- display: grid;
1113
- gap: 1rem;
1114
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
1115
- }
1116
- /* Status pill utility */
1117
- .av-status-pill {
1118
- padding: 0.25rem 0.6rem;
1119
- border-radius: 999px;
1120
- background: rgba(148, 163, 184, 0.15);
1121
- color: var(--av-fg, #e2e8f0);
1122
- font-size: 0.85rem;
1123
- white-space: nowrap;
1124
- }
829
+ /* Grid utility (for galleries/dashboards) */
830
+ .av-card-grid {
831
+ display: grid;
832
+ gap: 1rem;
833
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
834
+ }
1125
835
 
1126
- .av-status-pill--primary {
1127
- background: rgba(34, 211, 238, 0.18);
1128
- color: var(--av-fg, #e2e8f0);
1129
- }
836
+ /* Status pill utility */
837
+ .av-status-pill {
838
+ padding: 0.25rem 0.6rem;
839
+ border-radius: 999px;
840
+ background: rgba(148, 163, 184, 0.15);
841
+ color: var(--av-text);
842
+ font-size: 0.85rem;
843
+ white-space: nowrap;
844
+ }
1130
845
 
1131
- /* Loading bar utility */
1132
- .av-loading-bar {
1133
- height: 4px;
1134
- width: 100%;
1135
- background: linear-gradient(90deg, #22d3ee, #6366f1);
1136
- animation: av-shimmer 1.6s linear infinite;
1137
- margin-bottom: 1rem;
1138
- background-size: 200% 100%;
1139
- }
846
+ .av-status-pill--primary {
847
+ background: rgba(34, 211, 238, 0.18);
848
+ color: var(--av-text);
849
+ }
1140
850
 
1141
- @keyframes av-shimmer {
1142
- 0% { background-position: 0 0; }
1143
- 100% { background-position: 200% 0; }
1144
- }
851
+ /* Loading bar utility */
852
+ .av-loading-bar {
853
+ height: 4px;
854
+ width: 100%;
855
+ background: linear-gradient(90deg, #22d3ee, #6366f1);
856
+ animation: av-shimmer 1.6s linear infinite;
857
+ margin-bottom: 1rem;
858
+ background-size: 200% 100%;
859
+ }
1145
860
 
861
+ @keyframes av-shimmer {
862
+ 0% { background-position: 0 0; }
863
+ 100% { background-position: 200% 0; }
864
+ }
1146
865
  }
1147
-
1148
-