@birdapi/velinstyle 0.6.1 → 0.8.0

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.
Files changed (64) hide show
  1. package/README.de.md +337 -316
  2. package/README.md +33 -12
  3. package/cli/blueprint.js +8 -0
  4. package/cli/blueprints/bottom-nav-mobile.html +17 -0
  5. package/cli/blueprints/cookie-consent.html +9 -0
  6. package/cli/blueprints/empty-state.html +5 -0
  7. package/cli/blueprints/filter-bar.html +15 -0
  8. package/cli/blueprints/notification-center.html +13 -0
  9. package/cli/blueprints/onboarding.html +23 -0
  10. package/cli/blueprints/pricing-table.html +20 -0
  11. package/cli/blueprints/settings-panel.html +20 -0
  12. package/cli/index.js +119 -3
  13. package/cli/layout-audit.js +325 -0
  14. package/cli/scaffold-recipes.json +70 -0
  15. package/cli/scaffold.js +155 -0
  16. package/cli/scanner.js +114 -0
  17. package/components/focus-manager.js +106 -80
  18. package/components/index.js +20 -1
  19. package/components/sanitize.js +29 -3
  20. package/components/shadow-a11y-styles.js +18 -0
  21. package/components/velin-accordion.js +112 -98
  22. package/components/velin-announcer.js +35 -0
  23. package/components/velin-bottom-nav.js +89 -0
  24. package/components/velin-carousel.js +40 -5
  25. package/components/velin-collapse.js +95 -65
  26. package/components/velin-combobox.js +149 -0
  27. package/components/velin-command.js +127 -0
  28. package/components/velin-counter.js +152 -0
  29. package/components/velin-drawer.js +6 -3
  30. package/components/velin-dropdown.js +33 -2
  31. package/components/velin-flip.js +220 -0
  32. package/components/velin-icon.js +43 -9
  33. package/components/velin-live-dot.js +85 -0
  34. package/components/velin-menubar.js +83 -0
  35. package/components/velin-modal.js +3 -1
  36. package/components/velin-popover.js +61 -21
  37. package/components/velin-rating.js +91 -0
  38. package/components/velin-reveal.js +80 -0
  39. package/components/velin-segmented-control.js +108 -0
  40. package/components/velin-sheet.js +107 -0
  41. package/components/velin-sparkline.js +207 -0
  42. package/components/velin-theme-toggle.js +277 -60
  43. package/components/velin-tooltip-wc.js +26 -2
  44. package/dist/velinstyle-components.iife.js +1849 -120
  45. package/dist/velinstyle-components.js +1871 -120
  46. package/dist/velinstyle-components.min.js +434 -91
  47. package/dist/velinstyle.css +640 -44
  48. package/dist/velinstyle.min.css +1 -1
  49. package/package.json +7 -3
  50. package/src/a11y/focus-not-obscured.css +21 -0
  51. package/src/a11y/forced-colors.css +86 -38
  52. package/src/a11y/high-contrast-aaa.css +37 -0
  53. package/src/a11y/preferences.css +106 -85
  54. package/src/a11y/security.css +119 -104
  55. package/src/a11y/target-size.css +32 -0
  56. package/src/base/reset.css +12 -1
  57. package/src/base/root.css +4 -4
  58. package/src/components/nav.css +152 -151
  59. package/src/tokens/motion.css +7 -0
  60. package/src/utilities/animation.css +97 -1
  61. package/src/utilities/chart-animation.css +101 -0
  62. package/src/utilities/filter-effects.css +103 -0
  63. package/src/utilities/safe-area.css +39 -0
  64. package/src/velinstyle.css +9 -1
@@ -196,11 +196,18 @@
196
196
  --velin-duration-normal: .2s;
197
197
  --velin-duration-slow: .3s;
198
198
  --velin-duration-slower: .5s;
199
+ --velin-duration-slowest: .8s;
200
+ --velin-duration-cinematic: 1.2s;
199
201
  --velin-ease-default: cubic-bezier(.4, 0, .2, 1);
200
202
  --velin-ease-in: cubic-bezier(.4, 0, 1, 1);
201
203
  --velin-ease-out: cubic-bezier(0, 0, .2, 1);
202
204
  --velin-ease-in-out: cubic-bezier(.4, 0, .2, 1);
203
205
  --velin-ease-bounce: cubic-bezier(.34, 1.56, .64, 1);
206
+ --velin-ease-spring: cubic-bezier(.34, 1.56, .64, 1.4);
207
+ --velin-ease-elastic: cubic-bezier(.68, -.6, .32, 1.6);
208
+ --velin-ease-expo-out: cubic-bezier(.16, 1, .3, 1);
209
+ --velin-ease-back-out: cubic-bezier(.34, 1.4, .64, 1);
210
+ --velin-ease-snappy: cubic-bezier(.2, .8, .2, 1);
204
211
  --velin-transition-colors: color var(--velin-duration-normal) var(--velin-ease-default),
205
212
  background-color var(--velin-duration-normal) var(--velin-ease-default),
206
213
  border-color var(--velin-duration-normal) var(--velin-ease-default);
@@ -334,7 +341,7 @@
334
341
  display: none !important;
335
342
  }
336
343
 
337
- velin-modal:not(:defined), velin-drawer:not(:defined), velin-tabs:not(:defined), velin-accordion:not(:defined), velin-dropdown:not(:defined), velin-toast:not(:defined), velin-dialog:not(:defined), velin-popover:not(:defined), velin-tooltip-wc:not(:defined), velin-lightbox:not(:defined), velin-carousel:not(:defined), velin-collapse:not(:defined), velin-stepper-wc:not(:defined), velin-countdown:not(:defined), velin-progress-ring:not(:defined), velin-persist:not(:defined), velin-copy:not(:defined), velin-scroll-top:not(:defined), velin-scrollspy:not(:defined), velin-theme-toggle:not(:defined), velin-icon:not(:defined) {
344
+ velin-modal:not(:defined), velin-drawer:not(:defined), velin-tabs:not(:defined), velin-accordion:not(:defined), velin-dropdown:not(:defined), velin-toast:not(:defined), velin-dialog:not(:defined), velin-popover:not(:defined), velin-tooltip-wc:not(:defined), velin-lightbox:not(:defined), velin-carousel:not(:defined), velin-collapse:not(:defined), velin-stepper-wc:not(:defined), velin-countdown:not(:defined), velin-progress-ring:not(:defined), velin-persist:not(:defined), velin-copy:not(:defined), velin-scroll-top:not(:defined), velin-scrollspy:not(:defined), velin-theme-toggle:not(:defined), velin-icon:not(:defined), velin-combobox:not(:defined), velin-bottom-nav:not(:defined), velin-sheet:not(:defined), velin-segmented-control:not(:defined), velin-rating:not(:defined), velin-menubar:not(:defined), velin-command:not(:defined), velin-announcer:not(:defined), velin-sparkline:not(:defined), velin-counter:not(:defined), velin-live-dot:not(:defined) {
338
345
  opacity: 0;
339
346
  visibility: hidden;
340
347
  }
@@ -616,6 +623,51 @@
616
623
  .velin-nav__link[aria-current="page"] {
617
624
  border-block-end: 2px solid highlight;
618
625
  }
626
+
627
+ .velin-switch__track {
628
+ border: 1px solid buttontext;
629
+ }
630
+
631
+ .velin-switch__input:checked + .velin-switch__track {
632
+ background-color: highlight;
633
+ border-color: highlight;
634
+ }
635
+
636
+ .velin-pagination__link {
637
+ border: 1px solid buttontext;
638
+ }
639
+
640
+ .velin-pagination__link--active, .velin-pagination__link[aria-current="page"] {
641
+ color: highlighttext;
642
+ background-color: highlight;
643
+ border-color: highlight;
644
+ }
645
+
646
+ .velin-chip {
647
+ border: 1px solid buttontext;
648
+ }
649
+
650
+ .velin-stepper .step__marker {
651
+ border: 2px solid buttontext;
652
+ }
653
+
654
+ .velin-stepper .step--active .step__marker, .velin-stepper .step[aria-current="step"] .step__marker {
655
+ color: highlighttext;
656
+ background-color: highlight;
657
+ }
658
+
659
+ .velin-modal__backdrop, .velin-drawer__backdrop {
660
+ opacity: 1;
661
+ background-color: canvas;
662
+ }
663
+
664
+ .velin-progress__bar {
665
+ border: 1px solid buttontext;
666
+ }
667
+
668
+ .velin-progress__fill {
669
+ background-color: highlight;
670
+ }
619
671
  }
620
672
 
621
673
  .velin-skeleton {
@@ -702,6 +754,22 @@
702
754
  .velin-divider {
703
755
  border-width: 2px;
704
756
  }
757
+
758
+ .velin-nav__link {
759
+ font-weight: var(--velin-weight-semibold);
760
+ }
761
+
762
+ .velin-pagination__link, .velin-table th, .velin-table td {
763
+ border-width: 2px;
764
+ }
765
+
766
+ .velin-stepper .step__connector {
767
+ block-size: 3px;
768
+ }
769
+
770
+ .velin-stepper .step__label {
771
+ font-weight: var(--velin-weight-semibold);
772
+ }
705
773
  }
706
774
 
707
775
  @media (prefers-contrast: less) {
@@ -739,67 +807,68 @@
739
807
  }
740
808
  }
741
809
 
742
- .velin-secure-frame {
743
- display: none;
810
+ :root {
811
+ --velin-nav-height: 4rem;
812
+ scroll-padding-block-start: var(--velin-nav-height);
744
813
  }
745
814
 
746
- @media all {
747
- .velin-secure-frame {
748
- display: block;
749
- }
815
+ .velin-scroll-pt-nav {
816
+ scroll-padding-block-start: var(--velin-nav-height);
750
817
  }
751
818
 
752
- a[target="_blank"]:not([rel~="noopener"]) {
753
- &:after {
754
- content: " ↗";
755
- vertical-align: super;
756
- font-size: .75em;
757
- }
819
+ .velin-scroll-pt-none {
820
+ scroll-padding-block-start: 0;
758
821
  }
759
822
 
760
- .velin-user-content {
761
- all: initial;
762
- font-family: inherit;
763
- font-size: inherit;
764
- line-height: inherit;
765
- color: inherit;
766
- contain: layout style paint;
767
- word-break: break-word;
768
- overflow-wrap: break-word;
769
- display: block;
770
- overflow: hidden;
823
+ main:target, [id="main"]:target {
824
+ scroll-margin-block-start: var(--velin-nav-height);
771
825
  }
772
826
 
773
- .velin-user-content img, .velin-user-content video {
774
- max-width: 100%;
775
- height: auto;
827
+ .velin-target-min {
828
+ min-block-size: 1.5rem;
829
+ min-inline-size: 1.5rem;
776
830
  }
777
831
 
778
- .velin-user-content a {
779
- color: var(--velin-color-primary, #2563eb);
780
- text-decoration: underline;
832
+ .velin-target-touch, .velin-alert__close, .velin-toast-close, .velin-btn--sm {
833
+ min-block-size: 2.75rem;
834
+ min-inline-size: 2.75rem;
781
835
  }
782
836
 
783
- .velin-user-content script, .velin-user-content iframe, .velin-user-content object, .velin-user-content embed, .velin-user-content applet, .velin-user-content form[action], .velin-user-content [onload], .velin-user-content [onerror], .velin-user-content [onclick] {
784
- display: none !important;
837
+ .velin-pagination__ellipsis {
838
+ min-inline-size: 2.75rem;
785
839
  }
786
840
 
787
- input[type="password"], input[type="email"], input[type="tel"], input[type="number"][inputmode="numeric"] {
788
- -webkit-text-security: disc;
841
+ .velin-pagination--sm .velin-pagination__link {
842
+ min-block-size: 2.75rem;
843
+ min-inline-size: 2.75rem;
789
844
  }
790
845
 
791
- input[type="password"]:after, input[type="password"]:before {
792
- content: normal !important;
846
+ :root[data-velin-contrast="aaa"] {
847
+ --velin-color-text: oklch(8% .01 250);
848
+ --velin-color-text-muted: oklch(28% .01 250);
849
+ --velin-color-text-subtle: oklch(38% .01 250);
850
+ --velin-color-border: oklch(35% .01 250);
851
+ --velin-color-border-strong: oklch(20% .01 250);
852
+ --velin-color-primary: oklch(38% .18 250);
853
+ --velin-color-primary-hover: oklch(32% .18 250);
854
+ --velin-color-on-primary: oklch(100% 0 0);
855
+ --velin-color-focus: oklch(35% .22 250);
793
856
  }
794
857
 
795
- input:not([data-velin-no-paste]), textarea:not([data-velin-no-paste]) {
796
- -webkit-user-modify: read-write;
858
+ :root[data-velin-contrast="aaa"][data-velin-theme="dark"], :root[data-velin-contrast="aaa"]:not([data-velin-theme="light"]) {
859
+ @media (prefers-color-scheme: dark) {
860
+ --velin-color-text: oklch(98% .005 250);
861
+ --velin-color-text-muted: oklch(82% .005 250);
862
+ --velin-color-text-subtle: oklch(72% .005 250);
863
+ --velin-color-border: oklch(55% .01 250);
864
+ --velin-color-border-strong: oklch(70% .01 250);
865
+ --velin-color-primary: oklch(78% .14 250);
866
+ --velin-color-on-primary: oklch(8% .01 250);
867
+ }
797
868
  }
798
869
 
799
- input:-webkit-autofill {
800
- -webkit-box-shadow: 0 0 0 1000px var(--velin-color-surface-bright, #fff) inset;
801
- -webkit-text-fill-color: var(--velin-color-text, #1a1a2e);
802
- transition: background-color 600000s, color 600000s;
870
+ :root[data-velin-contrast="aaa"] .velin-btn, :root[data-velin-contrast="aaa"] .velin-input, :root[data-velin-contrast="aaa"] .velin-select, :root[data-velin-contrast="aaa"] .velin-textarea {
871
+ border-width: 2px;
803
872
  }
804
873
  }
805
874
 
@@ -6364,8 +6433,414 @@
6364
6433
  animation-play-state: paused;
6365
6434
  }
6366
6435
 
6367
- .velin-animate-hover:hover {
6368
- animation-play-state: running;
6436
+ @media (hover: hover) and (pointer: fine) {
6437
+ .velin-animate-hover:hover {
6438
+ animation-play-state: running;
6439
+ }
6440
+ }
6441
+
6442
+ .velin-animate-blur-in {
6443
+ animation: velin-blur-in var(--velin-duration-normal) var(--velin-ease-out) both;
6444
+ }
6445
+
6446
+ .velin-animate-blur-out {
6447
+ animation: velin-blur-out var(--velin-duration-normal) var(--velin-ease-in) both;
6448
+ }
6449
+
6450
+ .velin-animate-rotate-in {
6451
+ animation: velin-rotate-in var(--velin-duration-normal) var(--velin-ease-out) both;
6452
+ }
6453
+
6454
+ .velin-animate-float {
6455
+ animation: velin-float 3s var(--velin-ease-in-out) infinite;
6456
+ }
6457
+
6458
+ .velin-animate-flash {
6459
+ animation: velin-flash .6s var(--velin-ease-default) both;
6460
+ }
6461
+
6462
+ .velin-animate-reveal-up {
6463
+ animation: velin-reveal-up var(--velin-duration-normal) var(--velin-ease-out) both;
6464
+ }
6465
+
6466
+ .velin-animate-reveal-down {
6467
+ animation: velin-reveal-down var(--velin-duration-normal) var(--velin-ease-out) both;
6468
+ }
6469
+
6470
+ .velin-animate-glow {
6471
+ animation: velin-glow 2s var(--velin-ease-in-out) infinite;
6472
+ }
6473
+
6474
+ .velin-animate-slide-fade-left {
6475
+ animation: velin-slide-fade-left var(--velin-duration-normal) var(--velin-ease-out) both;
6476
+ }
6477
+
6478
+ .velin-animate-slide-fade-right {
6479
+ animation: velin-slide-fade-right var(--velin-duration-normal) var(--velin-ease-out) both;
6480
+ }
6481
+
6482
+ @keyframes velin-blur-in {
6483
+ from {
6484
+ opacity: 0;
6485
+ filter: blur(8px);
6486
+ }
6487
+
6488
+ to {
6489
+ opacity: 1;
6490
+ filter: blur();
6491
+ }
6492
+ }
6493
+
6494
+ @keyframes velin-blur-out {
6495
+ from {
6496
+ opacity: 1;
6497
+ filter: blur();
6498
+ }
6499
+
6500
+ to {
6501
+ opacity: 0;
6502
+ filter: blur(8px);
6503
+ }
6504
+ }
6505
+
6506
+ @keyframes velin-rotate-in {
6507
+ from {
6508
+ opacity: 0;
6509
+ transform: rotate(-8deg) scale(.95);
6510
+ }
6511
+
6512
+ to {
6513
+ opacity: 1;
6514
+ transform: rotate(0) scale(1);
6515
+ }
6516
+ }
6517
+
6518
+ @keyframes velin-float {
6519
+ 0%, 100% {
6520
+ transform: translateY(0);
6521
+ }
6522
+
6523
+ 50% {
6524
+ transform: translateY(-.35rem);
6525
+ }
6526
+ }
6527
+
6528
+ @keyframes velin-flash {
6529
+ 0%, 50%, 100% {
6530
+ opacity: 1;
6531
+ }
6532
+
6533
+ 25%, 75% {
6534
+ opacity: .35;
6535
+ }
6536
+ }
6537
+
6538
+ @keyframes velin-reveal-up {
6539
+ from {
6540
+ clip-path: inset(100% 0 0);
6541
+ opacity: 0;
6542
+ }
6543
+
6544
+ to {
6545
+ clip-path: inset(0);
6546
+ opacity: 1;
6547
+ }
6548
+ }
6549
+
6550
+ @keyframes velin-reveal-down {
6551
+ from {
6552
+ clip-path: inset(0 0 100%);
6553
+ opacity: 0;
6554
+ }
6555
+
6556
+ to {
6557
+ clip-path: inset(0);
6558
+ opacity: 1;
6559
+ }
6560
+ }
6561
+
6562
+ @keyframes velin-glow {
6563
+ 0%, 100% {
6564
+ box-shadow: 0 0 #0000;
6565
+ }
6566
+
6567
+ 50% {
6568
+ box-shadow: 0 0 1rem 0 color-mix(in oklch, var(--velin-color-primary, #2563eb) 35%, transparent);
6569
+ }
6570
+ }
6571
+
6572
+ @keyframes velin-slide-fade-left {
6573
+ from {
6574
+ opacity: 0;
6575
+ transform: translateX(1rem);
6576
+ }
6577
+
6578
+ to {
6579
+ opacity: 1;
6580
+ transform: translateX(0);
6581
+ }
6582
+ }
6583
+
6584
+ @keyframes velin-slide-fade-right {
6585
+ from {
6586
+ opacity: 0;
6587
+ transform: translateX(-1rem);
6588
+ }
6589
+
6590
+ to {
6591
+ opacity: 1;
6592
+ transform: translateX(0);
6593
+ }
6594
+ }
6595
+
6596
+ @media (prefers-reduced-motion: reduce) {
6597
+ .velin-animate-blur-in, .velin-animate-blur-out, .velin-animate-rotate-in, .velin-animate-reveal-up, .velin-animate-reveal-down, .velin-animate-slide-fade-left, .velin-animate-slide-fade-right {
6598
+ opacity: 1;
6599
+ filter: none;
6600
+ clip-path: none;
6601
+ animation: none;
6602
+ transform: none;
6603
+ }
6604
+
6605
+ .velin-animate-float, .velin-animate-glow, .velin-animate-flash {
6606
+ animation: none;
6607
+ }
6608
+ }
6609
+
6610
+ .velin-saturate-0 {
6611
+ filter: saturate(0);
6612
+ }
6613
+
6614
+ .velin-saturate-50 {
6615
+ filter: saturate(.5);
6616
+ }
6617
+
6618
+ .velin-saturate-100 {
6619
+ filter: saturate();
6620
+ }
6621
+
6622
+ .velin-saturate-150 {
6623
+ filter: saturate(1.5);
6624
+ }
6625
+
6626
+ .velin-saturate-200 {
6627
+ filter: saturate(2);
6628
+ }
6629
+
6630
+ .velin-hue-rotate-15 {
6631
+ filter: hue-rotate(15deg);
6632
+ }
6633
+
6634
+ .velin-hue-rotate-30 {
6635
+ filter: hue-rotate(30deg);
6636
+ }
6637
+
6638
+ .velin-hue-rotate-60 {
6639
+ filter: hue-rotate(60deg);
6640
+ }
6641
+
6642
+ .velin-hue-rotate-90 {
6643
+ filter: hue-rotate(90deg);
6644
+ }
6645
+
6646
+ .velin-hue-rotate-180 {
6647
+ filter: hue-rotate(180deg);
6648
+ }
6649
+
6650
+ .velin-contrast-50 {
6651
+ filter: contrast(.5);
6652
+ }
6653
+
6654
+ .velin-contrast-75 {
6655
+ filter: contrast(.75);
6656
+ }
6657
+
6658
+ .velin-contrast-100 {
6659
+ filter: contrast();
6660
+ }
6661
+
6662
+ .velin-contrast-125 {
6663
+ filter: contrast(1.25);
6664
+ }
6665
+
6666
+ .velin-contrast-150 {
6667
+ filter: contrast(1.5);
6668
+ }
6669
+
6670
+ .velin-invert {
6671
+ filter: invert();
6672
+ }
6673
+
6674
+ .velin-invert-0 {
6675
+ filter: invert(0);
6676
+ }
6677
+
6678
+ .velin-sepia {
6679
+ filter: sepia();
6680
+ }
6681
+
6682
+ .velin-sepia-50 {
6683
+ filter: sepia(.5);
6684
+ }
6685
+
6686
+ .velin-sepia-0 {
6687
+ filter: sepia(0);
6688
+ }
6689
+
6690
+ .velin-drop-shadow-sm {
6691
+ filter: drop-shadow(0 1px 1px oklch(0% 0 0 / .18));
6692
+ }
6693
+
6694
+ .velin-drop-shadow-md {
6695
+ filter: drop-shadow(0 4px 6px oklch(0% 0 0 / .18));
6696
+ }
6697
+
6698
+ .velin-drop-shadow-lg {
6699
+ filter: drop-shadow(0 12px 24px oklch(0% 0 0 / .22));
6700
+ }
6701
+
6702
+ .velin-drop-shadow-glow {
6703
+ filter: drop-shadow(0 0 1.5rem color-mix(in oklch, var(--velin-color-primary, #2563eb) 60%, transparent));
6704
+ }
6705
+
6706
+ .velin-backdrop-saturate {
6707
+ -webkit-backdrop-filter: saturate(180%);
6708
+ }
6709
+
6710
+ .velin-backdrop-brightness-90 {
6711
+ -webkit-backdrop-filter: brightness(.9);
6712
+ }
6713
+
6714
+ .velin-backdrop-brightness-110 {
6715
+ -webkit-backdrop-filter: brightness(1.1);
6716
+ }
6717
+
6718
+ .velin-backdrop-grayscale {
6719
+ -webkit-backdrop-filter: grayscale();
6720
+ }
6721
+
6722
+ .velin-glass {
6723
+ background: color-mix(in oklch, var(--velin-color-surface-bright, #fff) 70%, transparent);
6724
+ -webkit-backdrop-filter: blur(12px) saturate(160%);
6725
+ border: 1px solid color-mix(in oklch, var(--velin-color-border, #ddd) 60%, transparent);
6726
+ }
6727
+
6728
+ .velin-glass-strong {
6729
+ background: color-mix(in oklch, var(--velin-color-surface-bright, #fff) 55%, transparent);
6730
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
6731
+ border: 1px solid color-mix(in oklch, var(--velin-color-border, #ddd) 70%, transparent);
6732
+ }
6733
+
6734
+ @media (prefers-reduced-motion: reduce) {
6735
+ .velin-saturate-0, .velin-saturate-50, .velin-saturate-100, .velin-saturate-150, .velin-saturate-200, .velin-hue-rotate-15, .velin-hue-rotate-30, .velin-hue-rotate-60, .velin-hue-rotate-90, .velin-hue-rotate-180 {
6736
+ filter: none;
6737
+ }
6738
+ }
6739
+
6740
+ @keyframes velin-stroke-draw {
6741
+ from {
6742
+ stroke-dashoffset: var(--velin-chart-len, 1000);
6743
+ }
6744
+
6745
+ to {
6746
+ stroke-dashoffset: 0;
6747
+ }
6748
+ }
6749
+
6750
+ @keyframes velin-sparkline-glow {
6751
+ 0%, 100% {
6752
+ filter: drop-shadow(0 0 #0000);
6753
+ }
6754
+
6755
+ 50% {
6756
+ filter: drop-shadow(0 0 .5rem color-mix(in oklch, var(--velin-chart-glow-color, var(--velin-color-primary, #2563eb)) 50%, transparent));
6757
+ }
6758
+ }
6759
+
6760
+ @keyframes velin-value-bump {
6761
+ 0% {
6762
+ transform: scale(1);
6763
+ }
6764
+
6765
+ 35% {
6766
+ color: var(--velin-chart-bump-color, var(--velin-color-primary, #2563eb));
6767
+ transform: scale(1.06);
6768
+ }
6769
+
6770
+ 100% {
6771
+ transform: scale(1);
6772
+ }
6773
+ }
6774
+
6775
+ @keyframes velin-live-pulse {
6776
+ 0% {
6777
+ box-shadow: 0 0 0 0 color-mix(in oklch, var(--velin-live-color, var(--velin-color-success, oklch(60% .16 145))) 65%, transparent);
6778
+ }
6779
+
6780
+ 70% {
6781
+ box-shadow: 0 0 0 .65rem color-mix(in oklch, var(--velin-live-color, var(--velin-color-success, oklch(60% .16 145))) 0%, transparent);
6782
+ }
6783
+
6784
+ 100% {
6785
+ box-shadow: 0 0 #0000;
6786
+ }
6787
+ }
6788
+
6789
+ @keyframes velin-count-fade {
6790
+ from {
6791
+ opacity: 0;
6792
+ transform: translateY(.4rem);
6793
+ }
6794
+
6795
+ to {
6796
+ opacity: 1;
6797
+ transform: translateY(0);
6798
+ }
6799
+ }
6800
+
6801
+ .velin-chart-line {
6802
+ fill: none;
6803
+ stroke: currentColor;
6804
+ stroke-width: 2px;
6805
+ stroke-linecap: round;
6806
+ stroke-linejoin: round;
6807
+ stroke-dasharray: var(--velin-chart-len, 1000);
6808
+ stroke-dashoffset: 0;
6809
+ animation: velin-stroke-draw var(--velin-duration-cinematic, 1.2s) var(--velin-ease-expo-out, ease-out) both;
6810
+ }
6811
+
6812
+ .velin-chart-area {
6813
+ fill: var(--velin-chart-area-fill, currentColor);
6814
+ opacity: 0;
6815
+ animation: velin-count-fade var(--velin-duration-slowest, .8s) var(--velin-ease-expo-out, ease-out) .2s forwards;
6816
+ }
6817
+
6818
+ .velin-chart-glow {
6819
+ animation: velin-sparkline-glow 2.4s var(--velin-ease-in-out, ease-in-out) infinite;
6820
+ }
6821
+
6822
+ .velin-spark-tick {
6823
+ animation: velin-value-bump var(--velin-duration-slow, .3s) var(--velin-ease-spring, ease-out) both;
6824
+ }
6825
+
6826
+ .velin-live-pulse {
6827
+ animation: velin-live-pulse 1.8s var(--velin-ease-out, ease-out) infinite;
6828
+ border-radius: 50%;
6829
+ }
6830
+
6831
+ .velin-count-fade {
6832
+ animation: velin-count-fade var(--velin-duration-slow, .3s) var(--velin-ease-expo-out, ease-out) both;
6833
+ }
6834
+
6835
+ @media (prefers-reduced-motion: reduce) {
6836
+ .velin-chart-line, .velin-chart-area, .velin-chart-glow, .velin-spark-tick, .velin-live-pulse, .velin-count-fade {
6837
+ stroke-dashoffset: 0;
6838
+ opacity: 1;
6839
+ filter: none;
6840
+ box-shadow: none;
6841
+ animation: none;
6842
+ transform: none;
6843
+ }
6369
6844
  }
6370
6845
 
6371
6846
  .velin-gradient-primary {
@@ -7426,6 +7901,44 @@
7426
7901
  }
7427
7902
  }
7428
7903
 
7904
+ .velin-pt-safe {
7905
+ padding-block-start: max(var(--velin-space-4, 1rem), env(safe-area-inset-top, 0px));
7906
+ }
7907
+
7908
+ .velin-pb-safe {
7909
+ padding-block-end: max(var(--velin-space-4, 1rem), env(safe-area-inset-bottom, 0px));
7910
+ }
7911
+
7912
+ .velin-px-safe {
7913
+ padding-inline: max(var(--velin-space-4, 1rem), env(safe-area-inset-left, 0px))
7914
+ max(var(--velin-space-4, 1rem), env(safe-area-inset-right, 0px));
7915
+ }
7916
+
7917
+ .velin-p-safe {
7918
+ padding-block: max(var(--velin-space-4, 1rem), env(safe-area-inset-top, 0px))
7919
+ max(var(--velin-space-4, 1rem), env(safe-area-inset-bottom, 0px));
7920
+ padding-inline: max(var(--velin-space-4, 1rem), env(safe-area-inset-left, 0px))
7921
+ max(var(--velin-space-4, 1rem), env(safe-area-inset-right, 0px));
7922
+ }
7923
+
7924
+ .velin-mobile-only {
7925
+ display: block;
7926
+ }
7927
+
7928
+ .velin-desktop-only {
7929
+ display: none;
7930
+ }
7931
+
7932
+ @media (width >= 48rem) {
7933
+ .velin-mobile-only {
7934
+ display: none;
7935
+ }
7936
+
7937
+ .velin-desktop-only {
7938
+ display: block;
7939
+ }
7940
+ }
7941
+
7429
7942
  .velin-divide-y > * + * {
7430
7943
  border-block-start: 1px solid var(--velin-color-border);
7431
7944
  }
@@ -8557,4 +9070,87 @@
8557
9070
  }
8558
9071
  }
8559
9072
 
9073
+ @layer security {
9074
+ .velin-secure-frame {
9075
+ display: none;
9076
+ }
9077
+
9078
+ @media all {
9079
+ .velin-secure-frame {
9080
+ display: block;
9081
+ }
9082
+ }
9083
+
9084
+ a[target="_blank"]:not([rel~="noopener"]) {
9085
+ &:after {
9086
+ content: " ↗";
9087
+ vertical-align: super;
9088
+ font-size: .75em;
9089
+ }
9090
+ }
9091
+
9092
+ .velin-user-content {
9093
+ all: initial;
9094
+ font-family: inherit;
9095
+ font-size: inherit;
9096
+ line-height: inherit;
9097
+ color: inherit;
9098
+ contain: layout style paint;
9099
+ word-break: break-word;
9100
+ overflow-wrap: break-word;
9101
+ display: block;
9102
+ overflow: hidden;
9103
+ }
9104
+
9105
+ .velin-user-content img, .velin-user-content video {
9106
+ max-width: 100%;
9107
+ height: auto;
9108
+ }
9109
+
9110
+ .velin-user-content a {
9111
+ color: var(--velin-color-primary, #2563eb);
9112
+ text-decoration: underline;
9113
+ }
9114
+
9115
+ .velin-user-content script, .velin-user-content iframe, .velin-user-content object, .velin-user-content embed, .velin-user-content applet, .velin-user-content form[action], .velin-user-content [onload], .velin-user-content [onerror], .velin-user-content [onclick] {
9116
+ display: none !important;
9117
+ }
9118
+
9119
+ input[type="password"] {
9120
+ -webkit-text-security: disc;
9121
+ }
9122
+
9123
+ input[type="password"]:after, input[type="password"]:before {
9124
+ content: normal !important;
9125
+ }
9126
+
9127
+ input:not([data-velin-no-paste]), textarea:not([data-velin-no-paste]) {
9128
+ -webkit-user-modify: read-write;
9129
+ }
9130
+
9131
+ input:-webkit-autofill {
9132
+ -webkit-box-shadow: 0 0 0 1000px var(--velin-color-surface-bright, #fff) inset;
9133
+ -webkit-text-fill-color: var(--velin-color-text, #1a1a2e);
9134
+ transition: background-color 600000s, color 600000s;
9135
+ }
9136
+
9137
+ .velin-isolate {
9138
+ isolation: isolate;
9139
+ contain: layout style paint;
9140
+ }
9141
+
9142
+ .velin-sensitive {
9143
+ -webkit-user-select: none;
9144
+ user-select: none;
9145
+ }
9146
+
9147
+ .velin-overlay-lock {
9148
+ overscroll-behavior: contain;
9149
+ }
9150
+
9151
+ .velin-user-content img[src^="data:"] {
9152
+ max-inline-size: 100%;
9153
+ }
9154
+ }
9155
+
8560
9156
  @layer themes;