eleventy-plugin-uncharted 0.8.0 → 0.9.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.
- package/css/uncharted.css +421 -55
- package/package.json +1 -1
- package/src/columns.js +69 -1
- package/src/csv.js +9 -3
- package/src/renderers/bubble.js +269 -0
- package/src/renderers/dot.js +60 -40
- package/src/renderers/index.js +6 -2
- package/src/renderers/line.js +2 -1
- package/src/renderers/timeseries.js +503 -0
package/css/uncharted.css
CHANGED
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
--chart-column-width: 1rem;
|
|
45
45
|
--chart-donut-size: 20rem;
|
|
46
46
|
--chart-donut-hole: 30%;
|
|
47
|
-
--chart-dot-size: 0.
|
|
48
|
-
--chart-
|
|
49
|
-
--chart-
|
|
47
|
+
--chart-dot-size: 0.5rem;
|
|
48
|
+
--chart-bubble-size-min: 0.25rem;
|
|
49
|
+
--chart-bubble-size-max: 2rem;
|
|
50
50
|
--chart-height: 12rem;
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -145,10 +145,11 @@
|
|
|
145
145
|
margin-left: 0.125rem;
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
/* Dot/scatter/line charts use circular legend markers */
|
|
148
|
+
/* Dot/scatter/line/timeseries charts use circular legend markers */
|
|
149
149
|
.chart-dot &::before,
|
|
150
150
|
.chart-line &::before,
|
|
151
|
-
.chart-scatter &::before
|
|
151
|
+
.chart-scatter &::before,
|
|
152
|
+
.chart-timeseries &::before {
|
|
152
153
|
border-radius: 50%;
|
|
153
154
|
}
|
|
154
155
|
}
|
|
@@ -557,12 +558,12 @@
|
|
|
557
558
|
}
|
|
558
559
|
|
|
559
560
|
:is(.chart-dot, .chart-line) .dot-chart {
|
|
561
|
+
background: var(--chart-bg);
|
|
562
|
+
border-radius: 3px;
|
|
560
563
|
grid-row: 1;
|
|
561
564
|
position: relative;
|
|
562
565
|
min-height: var(--chart-height);
|
|
563
566
|
box-sizing: border-box;
|
|
564
|
-
background: var(--chart-bg);
|
|
565
|
-
border-radius: 3px;
|
|
566
567
|
}
|
|
567
568
|
|
|
568
569
|
/* Inner field sized to content area - dots position relative to this */
|
|
@@ -582,9 +583,17 @@
|
|
|
582
583
|
min-width: 1.5rem;
|
|
583
584
|
}
|
|
584
585
|
|
|
585
|
-
|
|
586
|
+
.chart-dot .dot {
|
|
586
587
|
width: var(--chart-dot-size);
|
|
587
588
|
height: var(--chart-dot-size);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
.chart-line .dot {
|
|
592
|
+
width: var(--chart-dot-size);
|
|
593
|
+
height: var(--chart-dot-size);
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
:is(.chart-dot, .chart-line) .dot {
|
|
588
597
|
border-radius: 50%;
|
|
589
598
|
position: absolute;
|
|
590
599
|
left: 50%;
|
|
@@ -600,31 +609,23 @@
|
|
|
600
609
|
}
|
|
601
610
|
|
|
602
611
|
/* Dots with icons */
|
|
603
|
-
:is(.chart-dot, .chart-line) .dot.has-icon {
|
|
612
|
+
:is(.chart-dot, .chart-line, .chart-timeseries) .dot.has-icon {
|
|
604
613
|
background: transparent;
|
|
605
614
|
display: flex;
|
|
606
615
|
align-items: center;
|
|
607
616
|
justify-content: center;
|
|
608
617
|
}
|
|
609
618
|
|
|
610
|
-
|
|
619
|
+
.chart-dot .dot.has-icon i {
|
|
611
620
|
color: var(--color);
|
|
612
621
|
font-size: var(--chart-dot-size);
|
|
613
622
|
line-height: 1;
|
|
614
623
|
}
|
|
615
624
|
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
to right,
|
|
621
|
-
transparent 0,
|
|
622
|
-
transparent var(--clip-size),
|
|
623
|
-
black var(--clip-size),
|
|
624
|
-
black calc(100% - var(--clip-size)),
|
|
625
|
-
transparent calc(100% - var(--clip-size)),
|
|
626
|
-
transparent 100%
|
|
627
|
-
);
|
|
625
|
+
:is(.chart-line, .chart-timeseries) .dot.has-icon i {
|
|
626
|
+
color: var(--color);
|
|
627
|
+
font-size: var(--chart-dot-size);
|
|
628
|
+
line-height: 1;
|
|
628
629
|
}
|
|
629
630
|
|
|
630
631
|
:is(.chart-dot, .chart-line) .dot-labels {
|
|
@@ -655,15 +656,198 @@
|
|
|
655
656
|
text-overflow: clip;
|
|
656
657
|
}
|
|
657
658
|
|
|
659
|
+
:is(.chart-dot, .chart-line) .dot-labels .axis-title {
|
|
660
|
+
flex-basis: 100%;
|
|
661
|
+
text-align: center;
|
|
662
|
+
font-size: 0.7rem;
|
|
663
|
+
opacity: 0.6;
|
|
664
|
+
white-space: nowrap;
|
|
665
|
+
margin-top: 0.5rem;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/* ==========================================================================
|
|
669
|
+
Bubble Chart (Categorical X, Continuous Y, Variable Dot Sizes)
|
|
670
|
+
========================================================================== */
|
|
671
|
+
|
|
672
|
+
/* Bubble chart uses same layout as dot/line charts */
|
|
673
|
+
.chart-bubble .chart-body {
|
|
674
|
+
display: grid;
|
|
675
|
+
grid-template-columns: auto 1fr;
|
|
676
|
+
grid-template-rows: 1fr auto;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
.chart-bubble .chart-y-axis {
|
|
680
|
+
grid-row: 1;
|
|
681
|
+
grid-column: 1;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
.chart-bubble .chart-scroll {
|
|
685
|
+
grid-row: 1 / -1;
|
|
686
|
+
grid-column: 2;
|
|
687
|
+
display: grid;
|
|
688
|
+
grid-template-rows: subgrid;
|
|
689
|
+
overflow-x: auto;
|
|
690
|
+
overflow-y: visible;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
.chart-bubble .dot-chart {
|
|
694
|
+
background: var(--chart-bg);
|
|
695
|
+
border-radius: 3px;
|
|
696
|
+
grid-row: 1;
|
|
697
|
+
position: relative;
|
|
698
|
+
min-height: var(--chart-height);
|
|
699
|
+
box-sizing: border-box;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
.chart-bubble .dot-field {
|
|
703
|
+
position: absolute;
|
|
704
|
+
top: 0.5rem;
|
|
705
|
+
right: 0.5rem;
|
|
706
|
+
bottom: 0;
|
|
707
|
+
left: 0.5rem;
|
|
708
|
+
display: flex;
|
|
709
|
+
align-items: stretch;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
.chart-bubble .dot-col {
|
|
713
|
+
flex: 1;
|
|
714
|
+
position: relative;
|
|
715
|
+
min-width: 1.5rem;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
.chart-bubble .dot {
|
|
719
|
+
border-radius: 50%;
|
|
720
|
+
position: absolute;
|
|
721
|
+
left: 50%;
|
|
722
|
+
bottom: var(--value);
|
|
723
|
+
transform: translate(-50%, 50%);
|
|
724
|
+
cursor: default;
|
|
725
|
+
background-color: var(--color);
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
/* Variable-sized dots for bubble charts */
|
|
729
|
+
.chart-bubble .dot[style*="--size-scale"] {
|
|
730
|
+
--computed-size: calc(
|
|
731
|
+
var(--chart-bubble-size-min) +
|
|
732
|
+
var(--size-scale) * (var(--chart-bubble-size-max) - var(--chart-bubble-size-min))
|
|
733
|
+
);
|
|
734
|
+
width: var(--computed-size);
|
|
735
|
+
height: var(--computed-size);
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/* Fallback size when no size-scale */
|
|
739
|
+
.chart-bubble .dot:not([style*="--size-scale"]) {
|
|
740
|
+
width: var(--chart-dot-size);
|
|
741
|
+
height: var(--chart-dot-size);
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
.chart-bubble .dot[title]:hover {
|
|
745
|
+
transform: translate(-50%, 50%) scale(1.3);
|
|
746
|
+
z-index: 1;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/* Bubble dots with icons */
|
|
750
|
+
.chart-bubble .dot.has-icon {
|
|
751
|
+
background: transparent;
|
|
752
|
+
display: flex;
|
|
753
|
+
align-items: center;
|
|
754
|
+
justify-content: center;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
.chart-bubble .dot.has-icon[style*="--size-scale"] i {
|
|
758
|
+
color: var(--color);
|
|
759
|
+
font-size: var(--computed-size);
|
|
760
|
+
line-height: 1;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
.chart-bubble .dot-labels {
|
|
764
|
+
grid-row: 2;
|
|
765
|
+
display: flex;
|
|
766
|
+
gap: 6px;
|
|
767
|
+
padding: 0 0.5rem;
|
|
768
|
+
margin-top: 0.5rem;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
.chart-bubble .dot-label {
|
|
772
|
+
flex: 1;
|
|
773
|
+
min-width: 1.5rem;
|
|
774
|
+
font-size: 0.7rem;
|
|
775
|
+
opacity: 0.6;
|
|
776
|
+
text-align: center;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
/* Rotated bubble labels (opt-in via rotateLabels config) */
|
|
780
|
+
.chart-bubble.rotate-labels .dot-labels {
|
|
781
|
+
padding-top: 0.5rem;
|
|
782
|
+
align-items: flex-start;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
.chart-bubble.rotate-labels .dot-label {
|
|
786
|
+
writing-mode: vertical-rl;
|
|
787
|
+
transform: rotate(180deg);
|
|
788
|
+
display: flex;
|
|
789
|
+
align-items: center;
|
|
790
|
+
overflow: visible;
|
|
791
|
+
text-overflow: clip;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
.chart-bubble .dot-labels .axis-title {
|
|
795
|
+
flex-basis: 100%;
|
|
796
|
+
text-align: center;
|
|
797
|
+
font-size: 0.7rem;
|
|
798
|
+
opacity: 0.6;
|
|
799
|
+
white-space: nowrap;
|
|
800
|
+
margin-top: 0.5rem;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
/* Bubble chart legend uses circular markers */
|
|
804
|
+
.chart-bubble .chart-legend-item::before {
|
|
805
|
+
border-radius: 50%;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
/* Bubble chart negative Y support */
|
|
809
|
+
.chart-bubble.has-negative-y .dot-field {
|
|
810
|
+
bottom: 0.5rem;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
.chart-bubble.has-negative-y .chart-y-axis {
|
|
814
|
+
padding-bottom: 0.5rem;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
.chart-bubble.has-negative-y .dot-field::after {
|
|
818
|
+
content: '';
|
|
819
|
+
position: absolute;
|
|
820
|
+
left: 0;
|
|
821
|
+
right: 0;
|
|
822
|
+
bottom: var(--zero-position, 0);
|
|
823
|
+
height: 1px;
|
|
824
|
+
background-color: currentColor;
|
|
825
|
+
opacity: 0.4;
|
|
826
|
+
pointer-events: none;
|
|
827
|
+
z-index: 0;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
.chart-bubble.has-negative-y .chart-y-axis {
|
|
831
|
+
position: relative;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
.chart-bubble.has-negative-y .chart-y-axis .axis-label:nth-child(2) {
|
|
835
|
+
position: absolute;
|
|
836
|
+
right: 0;
|
|
837
|
+
transform: translateY(50%);
|
|
838
|
+
bottom: calc(0.5rem + var(--zero-position, 50%) * 11 / 12);
|
|
839
|
+
}
|
|
840
|
+
|
|
658
841
|
/* ==========================================================================
|
|
659
842
|
Line Chart (CSS segments connecting dots)
|
|
660
843
|
========================================================================== */
|
|
661
844
|
|
|
662
|
-
|
|
845
|
+
/* Shared line segment styles for line and timeseries charts */
|
|
846
|
+
:is(.chart-line, .chart-timeseries) .dot-field {
|
|
663
847
|
container-type: size;
|
|
664
848
|
}
|
|
665
849
|
|
|
666
|
-
.chart-line .chart-line-segment {
|
|
850
|
+
:is(.chart-line, .chart-timeseries) .chart-line-segment {
|
|
667
851
|
position: absolute;
|
|
668
852
|
left: calc(var(--x1) * 1%);
|
|
669
853
|
bottom: calc(var(--y1) * 1%);
|
|
@@ -677,9 +861,18 @@
|
|
|
677
861
|
pointer-events: none;
|
|
678
862
|
}
|
|
679
863
|
|
|
680
|
-
/*
|
|
681
|
-
.chart-line.
|
|
682
|
-
|
|
864
|
+
/* Icon clipping: clip line ends around icons */
|
|
865
|
+
:is(.chart-line, .chart-timeseries):has(.dot.has-icon) .chart-line-segment {
|
|
866
|
+
--clip-size: calc(var(--chart-dot-size) * 0.75);
|
|
867
|
+
mask-image: linear-gradient(
|
|
868
|
+
to right,
|
|
869
|
+
transparent 0,
|
|
870
|
+
transparent var(--clip-size),
|
|
871
|
+
black var(--clip-size),
|
|
872
|
+
black calc(100% - var(--clip-size)),
|
|
873
|
+
transparent calc(100% - var(--clip-size)),
|
|
874
|
+
transparent 100%
|
|
875
|
+
);
|
|
683
876
|
}
|
|
684
877
|
|
|
685
878
|
/* ==========================================================================
|
|
@@ -760,8 +953,8 @@
|
|
|
760
953
|
/* Variable-sized dots (size column) */
|
|
761
954
|
.chart-scatter .dot[style*="--size-scale"] {
|
|
762
955
|
--computed-size: calc(
|
|
763
|
-
var(--chart-
|
|
764
|
-
var(--size-scale) * (var(--chart-
|
|
956
|
+
var(--chart-bubble-size-min) +
|
|
957
|
+
var(--size-scale) * (var(--chart-bubble-size-max) - var(--chart-bubble-size-min))
|
|
765
958
|
);
|
|
766
959
|
width: var(--computed-size);
|
|
767
960
|
height: var(--computed-size);
|
|
@@ -772,6 +965,126 @@
|
|
|
772
965
|
font-size: var(--computed-size);
|
|
773
966
|
}
|
|
774
967
|
|
|
968
|
+
/* ==========================================================================
|
|
969
|
+
Time-Series Chart (Continuous X axis with proportional positioning)
|
|
970
|
+
========================================================================== */
|
|
971
|
+
|
|
972
|
+
.chart-timeseries .chart-body {
|
|
973
|
+
display: grid;
|
|
974
|
+
grid-template-columns: auto 1fr;
|
|
975
|
+
grid-template-rows: 1fr auto;
|
|
976
|
+
overflow: visible;
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
.chart-timeseries .chart-y-axis {
|
|
980
|
+
grid-row: 1;
|
|
981
|
+
grid-column: 1;
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
.chart-timeseries .timeseries-container,
|
|
985
|
+
.chart-timeseries .dot-area,
|
|
986
|
+
.chart-timeseries .dot-field {
|
|
987
|
+
overflow: visible;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
.chart-timeseries .chart-scroll {
|
|
991
|
+
grid-row: 1 / -1;
|
|
992
|
+
grid-column: 2;
|
|
993
|
+
display: grid;
|
|
994
|
+
grid-template-rows: subgrid;
|
|
995
|
+
overflow-x: auto;
|
|
996
|
+
overflow-y: visible;
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
.chart-timeseries .timeseries-container {
|
|
1000
|
+
grid-row: 1 / -1;
|
|
1001
|
+
grid-column: 1;
|
|
1002
|
+
display: grid;
|
|
1003
|
+
grid-template-rows: subgrid;
|
|
1004
|
+
/* When dots shown, minimum width ensures scrollability */
|
|
1005
|
+
min-width: max(100%, calc(var(--point-count, 0) * 0.75rem));
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
.chart-timeseries .dot-area {
|
|
1009
|
+
grid-row: 1;
|
|
1010
|
+
position: relative;
|
|
1011
|
+
min-height: var(--chart-height);
|
|
1012
|
+
box-sizing: border-box;
|
|
1013
|
+
background: var(--chart-bg);
|
|
1014
|
+
border-radius: 3px;
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
.chart-timeseries .chart-x-axis {
|
|
1018
|
+
grid-row: 2;
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
/* Inner field sized to content area - dots position relative to this */
|
|
1022
|
+
.chart-timeseries .dot-field {
|
|
1023
|
+
position: absolute;
|
|
1024
|
+
inset: 0.5rem 1rem 0;
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
/* Dots positioned by --x and --value (like scatter) */
|
|
1028
|
+
.chart-timeseries .dot {
|
|
1029
|
+
position: absolute;
|
|
1030
|
+
width: var(--chart-dot-size);
|
|
1031
|
+
height: var(--chart-dot-size);
|
|
1032
|
+
border-radius: 50%;
|
|
1033
|
+
left: var(--x);
|
|
1034
|
+
bottom: var(--value);
|
|
1035
|
+
transform: translate(-50%, 50%);
|
|
1036
|
+
cursor: default;
|
|
1037
|
+
background-color: var(--color);
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
.chart-timeseries .dot[title]:hover {
|
|
1041
|
+
transform: translate(-50%, 50%) scale(1.3);
|
|
1042
|
+
z-index: 1;
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
/* Hide dots visually but keep them hoverable for tooltips */
|
|
1046
|
+
:is(.chart-line, .chart-timeseries).no-dots .dot {
|
|
1047
|
+
background: transparent;
|
|
1048
|
+
min-width: var(--chart-dot-size);
|
|
1049
|
+
min-height: var(--chart-dot-size);
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
:is(.chart-line, .chart-timeseries).no-dots .dot:hover {
|
|
1053
|
+
background-color: var(--color);
|
|
1054
|
+
transform: translate(-50%, 50%) scale(1.3);
|
|
1055
|
+
z-index: 1;
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
/* X-axis with positioned labels */
|
|
1059
|
+
.chart-timeseries .timeseries-x-axis {
|
|
1060
|
+
position: relative;
|
|
1061
|
+
padding: 0.25rem 1rem;
|
|
1062
|
+
margin-top: 0.25rem;
|
|
1063
|
+
min-height: 2.5em;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
.chart-timeseries .timeseries-x-axis .axis-label {
|
|
1067
|
+
position: absolute;
|
|
1068
|
+
font-size: 0.7rem;
|
|
1069
|
+
opacity: 0.6;
|
|
1070
|
+
font-variant-numeric: tabular-nums;
|
|
1071
|
+
/* Position labels to align with dot-field (inset 1rem from dot-area) */
|
|
1072
|
+
left: calc(1rem + var(--x) * (100% - 2rem));
|
|
1073
|
+
transform: translateX(-50%);
|
|
1074
|
+
text-align: center;
|
|
1075
|
+
line-height: 1.2;
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
|
|
1079
|
+
.chart-timeseries .timeseries-x-axis .axis-title {
|
|
1080
|
+
display: block;
|
|
1081
|
+
text-align: center;
|
|
1082
|
+
font-size: 0.7rem;
|
|
1083
|
+
opacity: 0.6;
|
|
1084
|
+
white-space: nowrap;
|
|
1085
|
+
margin-top: 1.25em;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
775
1088
|
/* Size legend */
|
|
776
1089
|
.chart-size-legend {
|
|
777
1090
|
display: flex;
|
|
@@ -799,13 +1112,13 @@
|
|
|
799
1112
|
}
|
|
800
1113
|
|
|
801
1114
|
.size-dot-min {
|
|
802
|
-
width: var(--chart-
|
|
803
|
-
height: var(--chart-
|
|
1115
|
+
width: var(--chart-bubble-size-min);
|
|
1116
|
+
height: var(--chart-bubble-size-min);
|
|
804
1117
|
}
|
|
805
1118
|
|
|
806
1119
|
.size-dot-max {
|
|
807
|
-
width: var(--chart-
|
|
808
|
-
height: var(--chart-
|
|
1120
|
+
width: var(--chart-bubble-size-max);
|
|
1121
|
+
height: var(--chart-bubble-size-max);
|
|
809
1122
|
}
|
|
810
1123
|
|
|
811
1124
|
.size-value {
|
|
@@ -1039,15 +1352,27 @@
|
|
|
1039
1352
|
}
|
|
1040
1353
|
}
|
|
1041
1354
|
|
|
1042
|
-
/* Line chart:
|
|
1043
|
-
.chart-animate.chart-line .
|
|
1044
|
-
clip-path: inset(
|
|
1045
|
-
animation:
|
|
1355
|
+
/* Line chart: animate scroll container */
|
|
1356
|
+
.chart-animate.chart-line .chart-scroll {
|
|
1357
|
+
clip-path: inset(0 100% 0 0);
|
|
1358
|
+
animation: container-reveal 1.5s cubic-bezier(0.25, 1, 0.5, 1) forwards;
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
/* Timeseries: animate dot-field only (so x-axis labels and background don't animate) */
|
|
1362
|
+
/* Negative insets allow dots to overflow the field bounds */
|
|
1363
|
+
.chart-animate.chart-timeseries .dot-field {
|
|
1364
|
+
clip-path: inset(-1rem 100% -1rem 0);
|
|
1365
|
+
animation: timeseries-reveal 1.5s cubic-bezier(0.25, 1, 0.5, 1) forwards;
|
|
1046
1366
|
}
|
|
1047
1367
|
|
|
1048
|
-
@keyframes
|
|
1049
|
-
from { clip-path: inset(
|
|
1050
|
-
to { clip-path: inset(
|
|
1368
|
+
@keyframes timeseries-reveal {
|
|
1369
|
+
from { clip-path: inset(-1rem 100% -1rem 0); }
|
|
1370
|
+
to { clip-path: inset(-1rem); }
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1373
|
+
@keyframes container-reveal {
|
|
1374
|
+
from { clip-path: inset(0 100% 0 0); }
|
|
1375
|
+
to { clip-path: inset(0); }
|
|
1051
1376
|
}
|
|
1052
1377
|
|
|
1053
1378
|
/* Donut chart: clockwise reveal using animated mask */
|
|
@@ -1093,6 +1418,44 @@
|
|
|
1093
1418
|
}
|
|
1094
1419
|
}
|
|
1095
1420
|
|
|
1421
|
+
/* Bubble chart: dots rise and scale from bottom */
|
|
1422
|
+
.chart-animate.chart-bubble .dot {
|
|
1423
|
+
animation: bubble-rise 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
|
|
1424
|
+
animation-delay: calc(var(--dot-index, 0) * var(--delay-step, 0.08s));
|
|
1425
|
+
opacity: 0;
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
@keyframes bubble-rise {
|
|
1429
|
+
from {
|
|
1430
|
+
bottom: 0;
|
|
1431
|
+
opacity: 0;
|
|
1432
|
+
transform: translate(-50%, 50%) scale(0.3);
|
|
1433
|
+
}
|
|
1434
|
+
to {
|
|
1435
|
+
opacity: 1;
|
|
1436
|
+
transform: translate(-50%, 50%) scale(1);
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
/* Bubble chart with negatives: dots move from zero axis */
|
|
1441
|
+
.chart-animate.chart-bubble.has-negative-y .dot {
|
|
1442
|
+
animation: bubble-from-zero 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
|
|
1443
|
+
animation-delay: calc(var(--dot-index, 0) * var(--delay-step, 0.08s));
|
|
1444
|
+
opacity: 0;
|
|
1445
|
+
}
|
|
1446
|
+
|
|
1447
|
+
@keyframes bubble-from-zero {
|
|
1448
|
+
from {
|
|
1449
|
+
bottom: var(--zero-position, 0%);
|
|
1450
|
+
opacity: 0;
|
|
1451
|
+
transform: translate(-50%, 50%) scale(0.3);
|
|
1452
|
+
}
|
|
1453
|
+
to {
|
|
1454
|
+
opacity: 1;
|
|
1455
|
+
transform: translate(-50%, 50%) scale(1);
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1096
1459
|
/* Sankey chart: SVG flows reveal from left to right */
|
|
1097
1460
|
.chart-animate.chart-sankey .chart-sankey-flow {
|
|
1098
1461
|
clip-path: inset(0 100% 0 0);
|
|
@@ -1111,28 +1474,29 @@
|
|
|
1111
1474
|
.chart-animate .column-track,
|
|
1112
1475
|
.chart-animate.chart-dot .dot,
|
|
1113
1476
|
.chart-animate.chart-scatter .dot,
|
|
1477
|
+
.chart-animate.chart-bubble .dot,
|
|
1114
1478
|
.chart-animate .donut-ring::before,
|
|
1115
1479
|
.chart-animate.chart-sankey .chart-sankey-flow,
|
|
1116
|
-
.chart-animate.chart-line .
|
|
1480
|
+
.chart-animate.chart-line .chart-scroll,
|
|
1481
|
+
.chart-animate.chart-timeseries .dot-field {
|
|
1117
1482
|
animation: none;
|
|
1118
1483
|
}
|
|
1119
1484
|
|
|
1120
1485
|
.chart-animate.chart-dot .dot,
|
|
1121
|
-
.chart-animate.chart-scatter .dot
|
|
1486
|
+
.chart-animate.chart-scatter .dot,
|
|
1487
|
+
.chart-animate.chart-bubble .dot {
|
|
1122
1488
|
opacity: 1;
|
|
1123
1489
|
transform: translate(-50%, 50%);
|
|
1124
1490
|
}
|
|
1125
1491
|
|
|
1126
|
-
.chart-animate.chart-line .
|
|
1492
|
+
.chart-animate.chart-line .chart-scroll,
|
|
1493
|
+
.chart-animate.has-negative-y .column-track,
|
|
1494
|
+
.chart-animate.chart-sankey .chart-sankey-flow {
|
|
1127
1495
|
clip-path: none;
|
|
1128
1496
|
}
|
|
1129
1497
|
|
|
1130
|
-
.chart-animate.
|
|
1131
|
-
clip-path:
|
|
1132
|
-
}
|
|
1133
|
-
|
|
1134
|
-
.chart-animate.chart-sankey .chart-sankey-flow {
|
|
1135
|
-
clip-path: none;
|
|
1498
|
+
.chart-animate.chart-timeseries .dot-field {
|
|
1499
|
+
clip-path: inset(-1rem);
|
|
1136
1500
|
}
|
|
1137
1501
|
}
|
|
1138
1502
|
|
|
@@ -1202,7 +1566,8 @@
|
|
|
1202
1566
|
|
|
1203
1567
|
/* Expand dot-field insets for negative values */
|
|
1204
1568
|
:is(.chart-dot, .chart-line).has-negative-y .dot-field,
|
|
1205
|
-
.chart-scatter.has-negative-y .dot-field
|
|
1569
|
+
.chart-scatter.has-negative-y .dot-field,
|
|
1570
|
+
.chart-timeseries.has-negative-y .dot-field {
|
|
1206
1571
|
bottom: 0.5rem;
|
|
1207
1572
|
}
|
|
1208
1573
|
|
|
@@ -1212,12 +1577,13 @@
|
|
|
1212
1577
|
|
|
1213
1578
|
/* Y-axis padding adjustment for negative values */
|
|
1214
1579
|
:is(.chart-dot, .chart-line).has-negative-y .chart-y-axis,
|
|
1215
|
-
.chart-scatter.has-negative-y .chart-y-axis
|
|
1580
|
+
.chart-scatter.has-negative-y .chart-y-axis,
|
|
1581
|
+
.chart-timeseries.has-negative-y .chart-y-axis {
|
|
1216
1582
|
padding-bottom: 0.5rem;
|
|
1217
1583
|
}
|
|
1218
1584
|
|
|
1219
1585
|
/* Zero axis lines - use dot-field for proper alignment */
|
|
1220
|
-
:is(.chart-dot, .chart-line).has-negative-y .dot-field::after {
|
|
1586
|
+
:is(.chart-dot, .chart-line, .chart-timeseries).has-negative-y .dot-field::after {
|
|
1221
1587
|
content: '';
|
|
1222
1588
|
position: absolute;
|
|
1223
1589
|
left: 0;
|
|
@@ -1262,20 +1628,20 @@
|
|
|
1262
1628
|
========================================================================== */
|
|
1263
1629
|
|
|
1264
1630
|
/* Y-axis needs relative positioning for absolute label */
|
|
1265
|
-
:is(.chart-dot, .chart-line).has-negative-y .chart-y-axis,
|
|
1631
|
+
:is(.chart-dot, .chart-line, .chart-timeseries).has-negative-y .chart-y-axis,
|
|
1266
1632
|
.chart-scatter.has-negative-y .chart-y-axis {
|
|
1267
1633
|
position: relative;
|
|
1268
1634
|
}
|
|
1269
1635
|
|
|
1270
1636
|
/* Position middle Y-axis label at zero */
|
|
1271
|
-
:is(.chart-dot, .chart-line).has-negative-y .chart-y-axis .axis-label:nth-child(2),
|
|
1637
|
+
:is(.chart-dot, .chart-line, .chart-timeseries).has-negative-y .chart-y-axis .axis-label:nth-child(2),
|
|
1272
1638
|
.chart-scatter.has-negative-y .chart-y-axis .axis-label:nth-child(2) {
|
|
1273
1639
|
position: absolute;
|
|
1274
1640
|
right: 0;
|
|
1275
1641
|
transform: translateY(50%);
|
|
1276
1642
|
}
|
|
1277
1643
|
|
|
1278
|
-
:is(.chart-dot, .chart-line).has-negative-y .chart-y-axis .axis-label:nth-child(2) {
|
|
1644
|
+
:is(.chart-dot, .chart-line, .chart-timeseries).has-negative-y .chart-y-axis .axis-label:nth-child(2) {
|
|
1279
1645
|
bottom: calc(0.5rem + var(--zero-position, 50%) * 11 / 12);
|
|
1280
1646
|
}
|
|
1281
1647
|
|