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 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.75rem;
48
- --chart-dot-size-min: 0.375rem;
49
- --chart-dot-size-max: 1.5rem;
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
- :is(.chart-dot, .chart-line) .dot {
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
- .chart-line .dot-field {
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
- /* Hide dots when dots: false */
640
- .chart-line.no-dots .dot {
641
- display: none;
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-dot-size-min) +
709
- var(--size-scale) * (var(--chart-dot-size-max) - var(--chart-dot-size-min))
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-dot-size-min);
743
- height: var(--chart-dot-size-min);
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-dot-size-max);
748
- height: var(--chart-dot-size-max);
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: clip-path sweep reveals lines and dots left-to-right */
983
- .chart-animate.chart-line .dot-field {
984
- clip-path: inset(calc(var(--chart-dot-size) * -0.5) 100% calc(var(--chart-dot-size) * -0.5) 0);
985
- animation: line-reveal 1.5s cubic-bezier(0.25, 1, 0.5, 1) forwards;
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 line-reveal {
989
- from { clip-path: inset(calc(var(--chart-dot-size) * -0.5) 100% calc(var(--chart-dot-size) * -0.5) 0); }
990
- to { clip-path: inset(calc(var(--chart-dot-size) * -0.5) 0 calc(var(--chart-dot-size) * -0.5) 0); }
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 .dot-field {
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 .dot-field {
1067
- clip-path: none;
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-sankey .chart-sankey-flow {
1075
- clip-path: none;
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eleventy-plugin-uncharted",
3
- "version": "0.7.5",
3
+ "version": "0.9.0",
4
4
  "description": "An Eleventy plugin that renders CSS-based charts from CSV data using shortcodes",
5
5
  "main": "eleventy.config.js",
6
6
  "type": "module",