eleventy-plugin-uncharted 0.7.5 → 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 +468 -42
- 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 +72 -31
- package/src/renderers/index.js +6 -2
- package/src/renderers/line.js +2 -1
- package/src/renderers/scatter.js +23 -4
- 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
|
}
|
|
@@ -160,6 +161,20 @@
|
|
|
160
161
|
margin-bottom: 0.375rem;
|
|
161
162
|
}
|
|
162
163
|
|
|
164
|
+
/* ==========================================================================
|
|
165
|
+
Icons (Font Awesome support for dots and legends)
|
|
166
|
+
========================================================================== */
|
|
167
|
+
|
|
168
|
+
/* Legend items with icons - hide the default ::before marker */
|
|
169
|
+
.chart-legend-item.has-icon::before {
|
|
170
|
+
display: none;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.chart-legend-item.has-icon i {
|
|
174
|
+
color: var(--color);
|
|
175
|
+
margin-inline-end: 0.35em;
|
|
176
|
+
}
|
|
177
|
+
|
|
163
178
|
/* ==========================================================================
|
|
164
179
|
Axes
|
|
165
180
|
========================================================================== */
|
|
@@ -543,12 +558,12 @@
|
|
|
543
558
|
}
|
|
544
559
|
|
|
545
560
|
:is(.chart-dot, .chart-line) .dot-chart {
|
|
561
|
+
background: var(--chart-bg);
|
|
562
|
+
border-radius: 3px;
|
|
546
563
|
grid-row: 1;
|
|
547
564
|
position: relative;
|
|
548
565
|
min-height: var(--chart-height);
|
|
549
566
|
box-sizing: border-box;
|
|
550
|
-
background: var(--chart-bg);
|
|
551
|
-
border-radius: 3px;
|
|
552
567
|
}
|
|
553
568
|
|
|
554
569
|
/* Inner field sized to content area - dots position relative to this */
|
|
@@ -560,7 +575,6 @@
|
|
|
560
575
|
left: 0.5rem;
|
|
561
576
|
display: flex;
|
|
562
577
|
align-items: stretch;
|
|
563
|
-
gap: 6px;
|
|
564
578
|
}
|
|
565
579
|
|
|
566
580
|
:is(.chart-dot, .chart-line) .dot-col {
|
|
@@ -569,9 +583,17 @@
|
|
|
569
583
|
min-width: 1.5rem;
|
|
570
584
|
}
|
|
571
585
|
|
|
572
|
-
|
|
586
|
+
.chart-dot .dot {
|
|
587
|
+
width: var(--chart-dot-size);
|
|
588
|
+
height: var(--chart-dot-size);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
.chart-line .dot {
|
|
573
592
|
width: var(--chart-dot-size);
|
|
574
593
|
height: var(--chart-dot-size);
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
:is(.chart-dot, .chart-line) .dot {
|
|
575
597
|
border-radius: 50%;
|
|
576
598
|
position: absolute;
|
|
577
599
|
left: 50%;
|
|
@@ -586,6 +608,26 @@
|
|
|
586
608
|
z-index: 1;
|
|
587
609
|
}
|
|
588
610
|
|
|
611
|
+
/* Dots with icons */
|
|
612
|
+
:is(.chart-dot, .chart-line, .chart-timeseries) .dot.has-icon {
|
|
613
|
+
background: transparent;
|
|
614
|
+
display: flex;
|
|
615
|
+
align-items: center;
|
|
616
|
+
justify-content: center;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
.chart-dot .dot.has-icon i {
|
|
620
|
+
color: var(--color);
|
|
621
|
+
font-size: var(--chart-dot-size);
|
|
622
|
+
line-height: 1;
|
|
623
|
+
}
|
|
624
|
+
|
|
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;
|
|
629
|
+
}
|
|
630
|
+
|
|
589
631
|
:is(.chart-dot, .chart-line) .dot-labels {
|
|
590
632
|
grid-row: 2;
|
|
591
633
|
display: flex;
|
|
@@ -614,15 +656,198 @@
|
|
|
614
656
|
text-overflow: clip;
|
|
615
657
|
}
|
|
616
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
|
+
|
|
617
841
|
/* ==========================================================================
|
|
618
842
|
Line Chart (CSS segments connecting dots)
|
|
619
843
|
========================================================================== */
|
|
620
844
|
|
|
621
|
-
|
|
845
|
+
/* Shared line segment styles for line and timeseries charts */
|
|
846
|
+
:is(.chart-line, .chart-timeseries) .dot-field {
|
|
622
847
|
container-type: size;
|
|
623
848
|
}
|
|
624
849
|
|
|
625
|
-
.chart-line .chart-line-segment {
|
|
850
|
+
:is(.chart-line, .chart-timeseries) .chart-line-segment {
|
|
626
851
|
position: absolute;
|
|
627
852
|
left: calc(var(--x1) * 1%);
|
|
628
853
|
bottom: calc(var(--y1) * 1%);
|
|
@@ -636,9 +861,18 @@
|
|
|
636
861
|
pointer-events: none;
|
|
637
862
|
}
|
|
638
863
|
|
|
639
|
-
/*
|
|
640
|
-
.chart-line.
|
|
641
|
-
|
|
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
|
+
);
|
|
642
876
|
}
|
|
643
877
|
|
|
644
878
|
/* ==========================================================================
|
|
@@ -702,16 +936,155 @@
|
|
|
702
936
|
z-index: 1;
|
|
703
937
|
}
|
|
704
938
|
|
|
939
|
+
/* Scatter dots with icons */
|
|
940
|
+
.chart-scatter .dot.has-icon {
|
|
941
|
+
background: transparent;
|
|
942
|
+
display: flex;
|
|
943
|
+
align-items: center;
|
|
944
|
+
justify-content: center;
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
.chart-scatter .dot.has-icon i {
|
|
948
|
+
color: var(--color);
|
|
949
|
+
font-size: var(--chart-dot-size);
|
|
950
|
+
line-height: 1;
|
|
951
|
+
}
|
|
952
|
+
|
|
705
953
|
/* Variable-sized dots (size column) */
|
|
706
954
|
.chart-scatter .dot[style*="--size-scale"] {
|
|
707
955
|
--computed-size: calc(
|
|
708
|
-
var(--chart-
|
|
709
|
-
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))
|
|
710
958
|
);
|
|
711
959
|
width: var(--computed-size);
|
|
712
960
|
height: var(--computed-size);
|
|
713
961
|
}
|
|
714
962
|
|
|
963
|
+
/* Variable-sized dots with icons */
|
|
964
|
+
.chart-scatter .dot.has-icon[style*="--size-scale"] i {
|
|
965
|
+
font-size: var(--computed-size);
|
|
966
|
+
}
|
|
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
|
+
|
|
715
1088
|
/* Size legend */
|
|
716
1089
|
.chart-size-legend {
|
|
717
1090
|
display: flex;
|
|
@@ -739,13 +1112,13 @@
|
|
|
739
1112
|
}
|
|
740
1113
|
|
|
741
1114
|
.size-dot-min {
|
|
742
|
-
width: var(--chart-
|
|
743
|
-
height: var(--chart-
|
|
1115
|
+
width: var(--chart-bubble-size-min);
|
|
1116
|
+
height: var(--chart-bubble-size-min);
|
|
744
1117
|
}
|
|
745
1118
|
|
|
746
1119
|
.size-dot-max {
|
|
747
|
-
width: var(--chart-
|
|
748
|
-
height: var(--chart-
|
|
1120
|
+
width: var(--chart-bubble-size-max);
|
|
1121
|
+
height: var(--chart-bubble-size-max);
|
|
749
1122
|
}
|
|
750
1123
|
|
|
751
1124
|
.size-value {
|
|
@@ -979,15 +1352,27 @@
|
|
|
979
1352
|
}
|
|
980
1353
|
}
|
|
981
1354
|
|
|
982
|
-
/* Line chart:
|
|
983
|
-
.chart-animate.chart-line .
|
|
984
|
-
clip-path: inset(
|
|
985
|
-
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;
|
|
986
1366
|
}
|
|
987
1367
|
|
|
988
|
-
@keyframes
|
|
989
|
-
from { clip-path: inset(
|
|
990
|
-
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); }
|
|
991
1376
|
}
|
|
992
1377
|
|
|
993
1378
|
/* Donut chart: clockwise reveal using animated mask */
|
|
@@ -1033,6 +1418,44 @@
|
|
|
1033
1418
|
}
|
|
1034
1419
|
}
|
|
1035
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
|
+
|
|
1036
1459
|
/* Sankey chart: SVG flows reveal from left to right */
|
|
1037
1460
|
.chart-animate.chart-sankey .chart-sankey-flow {
|
|
1038
1461
|
clip-path: inset(0 100% 0 0);
|
|
@@ -1051,28 +1474,29 @@
|
|
|
1051
1474
|
.chart-animate .column-track,
|
|
1052
1475
|
.chart-animate.chart-dot .dot,
|
|
1053
1476
|
.chart-animate.chart-scatter .dot,
|
|
1477
|
+
.chart-animate.chart-bubble .dot,
|
|
1054
1478
|
.chart-animate .donut-ring::before,
|
|
1055
1479
|
.chart-animate.chart-sankey .chart-sankey-flow,
|
|
1056
|
-
.chart-animate.chart-line .
|
|
1480
|
+
.chart-animate.chart-line .chart-scroll,
|
|
1481
|
+
.chart-animate.chart-timeseries .dot-field {
|
|
1057
1482
|
animation: none;
|
|
1058
1483
|
}
|
|
1059
1484
|
|
|
1060
1485
|
.chart-animate.chart-dot .dot,
|
|
1061
|
-
.chart-animate.chart-scatter .dot
|
|
1486
|
+
.chart-animate.chart-scatter .dot,
|
|
1487
|
+
.chart-animate.chart-bubble .dot {
|
|
1062
1488
|
opacity: 1;
|
|
1063
1489
|
transform: translate(-50%, 50%);
|
|
1064
1490
|
}
|
|
1065
1491
|
|
|
1066
|
-
.chart-animate.chart-line .
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
.chart-animate.has-negative-y .column-track {
|
|
1492
|
+
.chart-animate.chart-line .chart-scroll,
|
|
1493
|
+
.chart-animate.has-negative-y .column-track,
|
|
1494
|
+
.chart-animate.chart-sankey .chart-sankey-flow {
|
|
1071
1495
|
clip-path: none;
|
|
1072
1496
|
}
|
|
1073
1497
|
|
|
1074
|
-
.chart-animate.chart-
|
|
1075
|
-
clip-path:
|
|
1498
|
+
.chart-animate.chart-timeseries .dot-field {
|
|
1499
|
+
clip-path: inset(-1rem);
|
|
1076
1500
|
}
|
|
1077
1501
|
}
|
|
1078
1502
|
|
|
@@ -1142,7 +1566,8 @@
|
|
|
1142
1566
|
|
|
1143
1567
|
/* Expand dot-field insets for negative values */
|
|
1144
1568
|
:is(.chart-dot, .chart-line).has-negative-y .dot-field,
|
|
1145
|
-
.chart-scatter.has-negative-y .dot-field
|
|
1569
|
+
.chart-scatter.has-negative-y .dot-field,
|
|
1570
|
+
.chart-timeseries.has-negative-y .dot-field {
|
|
1146
1571
|
bottom: 0.5rem;
|
|
1147
1572
|
}
|
|
1148
1573
|
|
|
@@ -1152,12 +1577,13 @@
|
|
|
1152
1577
|
|
|
1153
1578
|
/* Y-axis padding adjustment for negative values */
|
|
1154
1579
|
:is(.chart-dot, .chart-line).has-negative-y .chart-y-axis,
|
|
1155
|
-
.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 {
|
|
1156
1582
|
padding-bottom: 0.5rem;
|
|
1157
1583
|
}
|
|
1158
1584
|
|
|
1159
1585
|
/* Zero axis lines - use dot-field for proper alignment */
|
|
1160
|
-
: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 {
|
|
1161
1587
|
content: '';
|
|
1162
1588
|
position: absolute;
|
|
1163
1589
|
left: 0;
|
|
@@ -1202,20 +1628,20 @@
|
|
|
1202
1628
|
========================================================================== */
|
|
1203
1629
|
|
|
1204
1630
|
/* Y-axis needs relative positioning for absolute label */
|
|
1205
|
-
: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,
|
|
1206
1632
|
.chart-scatter.has-negative-y .chart-y-axis {
|
|
1207
1633
|
position: relative;
|
|
1208
1634
|
}
|
|
1209
1635
|
|
|
1210
1636
|
/* Position middle Y-axis label at zero */
|
|
1211
|
-
: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),
|
|
1212
1638
|
.chart-scatter.has-negative-y .chart-y-axis .axis-label:nth-child(2) {
|
|
1213
1639
|
position: absolute;
|
|
1214
1640
|
right: 0;
|
|
1215
1641
|
transform: translateY(50%);
|
|
1216
1642
|
}
|
|
1217
1643
|
|
|
1218
|
-
: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) {
|
|
1219
1645
|
bottom: calc(0.5rem + var(--zero-position, 50%) * 11 / 12);
|
|
1220
1646
|
}
|
|
1221
1647
|
|