chartkick 5.2.1 → 5.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 024afe2a8bb53f76d9c1c41d6c8c50c97ebf7b44ad183b90bff03349f79cd559
4
- data.tar.gz: b1cad29c4a8620f16054e22613cfd1b1a67fcb602af5521eca1b39cd22a02306
3
+ metadata.gz: b3c5c4b473895a289ec899639732d9210619ac293385ca13c09cecd4ca5cd1a2
4
+ data.tar.gz: 44b51e504332b13da342cd05e3a21f02582f8324a219d634340c3414e1cbdbac
5
5
  SHA512:
6
- metadata.gz: 9417b3fcfc91dd7bf2db0463a5c78536802f63ad3ccfc2b8d124cffc1bba4aa9e27309666a75481192489e229f17fa215ddb1b8c9b5bc3d5bc73c952ddc66270
7
- data.tar.gz: 5297367118dbd50b3dccc12447f13233a481e86f3a4f303270891186c92aa72325c08e4d05adf4d38b918ae7092b92b12e62e643f1d1fe89fbba8de6ba95e3e9
6
+ metadata.gz: a93e4c961160448349ae36bdf1c2dad352f33868a2307ea65f7d609c68302859771a23d098f424505c6f1c3be6baeae73ac155850f46b60e069cae3b4d6ac9f8
7
+ data.tar.gz: ee57e9a69303c6607d160eb855cdef4c35dca47ac37269c90ef8084852994b314e80d400a427ed6e7a67fe02bbe45eb8cee540e80bb17e35ee9f721b99a9674d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 5.3.0 (2026-10-22)
2
+
3
+ - Updated Chart.js to 4.6.0
4
+ - Dropped support for Ruby < 3.3
5
+
1
6
  ## 5.2.1 (2025-10-13)
2
7
 
3
8
  - Updated Chart.js to 4.5.1
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013-2024 Andrew Kane
1
+ Copyright (c) 2013-2026 Andrew Kane
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -20,7 +20,7 @@ gem "chartkick"
20
20
 
21
21
  Then follow the instructions for your JavaScript setup:
22
22
 
23
- - [Importmap](#importmap) (Rails 7+ default)
23
+ - [Importmap](#importmap) (Rails default)
24
24
  - [Bun, esbuild, rollup.js, or Webpack](#bun-esbuild-rollupjs-or-webpack)
25
25
  - [Sprockets](#sprockets)
26
26
 
@@ -125,8 +125,8 @@ Multiple series
125
125
 
126
126
  ```erb
127
127
  <%= line_chart [
128
- {name: "Workout", data: {"2025-01-01" => 3, "2025-01-02" => 4}},
129
- {name: "Call parents", data: {"2025-01-01" => 5, "2025-01-02" => 3}}
128
+ {name: "Workout", data: {"2026-01-01" => 3, "2026-01-02" => 4}},
129
+ {name: "Call parents", data: {"2026-01-01" => 5, "2026-01-02" => 3}}
130
130
  ] %>
131
131
  ```
132
132
 
@@ -143,13 +143,13 @@ Data can be a hash, array, or URL.
143
143
  #### Hash
144
144
 
145
145
  ```erb
146
- <%= line_chart({"2025-01-01" => 2, "2025-01-02" => 3}) %>
146
+ <%= line_chart({"2026-01-01" => 2, "2026-01-02" => 3}) %>
147
147
  ```
148
148
 
149
149
  #### Array
150
150
 
151
151
  ```erb
152
- <%= line_chart [["2025-01-01", 2], ["2025-01-02", 3]] %>
152
+ <%= line_chart [["2026-01-01", 2], ["2026-01-02", 3]] %>
153
153
  ```
154
154
 
155
155
  #### URL
@@ -195,7 +195,7 @@ Min and max values
195
195
  Min and max for x-axis - *Chart.js*
196
196
 
197
197
  ```erb
198
- <%= line_chart data, xmin: "2025-01-01", xmax: "2025-02-01" %>
198
+ <%= line_chart data, xmin: "2026-01-01", xmax: "2026-02-01" %>
199
199
  ```
200
200
 
201
201
  Colors
@@ -437,7 +437,7 @@ In your layout or views, add:
437
437
  <%= javascript_include_tag "https://www.gstatic.com/charts/loader.js" %>
438
438
  ```
439
439
 
440
- For Importmap (Rails 7+ default), in `config/importmap.rb`, add:
440
+ For Importmap (Rails default), in `config/importmap.rb`, add:
441
441
 
442
442
  ```ruby
443
443
  pin "chartkick", to: "chartkick.js"
@@ -479,7 +479,7 @@ before your charts.
479
479
 
480
480
  ### Highcharts
481
481
 
482
- For Importmap (Rails 7+ default), run:
482
+ For Importmap (Rails default), run:
483
483
 
484
484
  ```sh
485
485
  bin/importmap pin highcharts --download
@@ -1,3 +1,3 @@
1
1
  module Chartkick
2
- VERSION = "5.2.1"
2
+ VERSION = "5.3.0"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * Chart.js v4.5.1
2
+ * Chart.js v4.6.1
3
3
  * https://www.chartjs.org
4
- * (c) 2025 Chart.js Contributors
4
+ * (c) 2026 Chart.js Contributors
5
5
  * Released under the MIT License
6
6
  *
7
7
  * @kurkle/color v0.3.2
@@ -231,15 +231,15 @@
231
231
  function _toConsumableArray(r) {
232
232
  return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray$1(r) || _nonIterableSpread();
233
233
  }
234
- function _toPrimitive(t, r) {
234
+ function _toPrimitive(t, e) {
235
235
  if ("object" != typeof t || !t) return t;
236
- var e = t[Symbol.toPrimitive];
237
- if (void 0 !== e) {
238
- var i = e.call(t, r || "default");
236
+ var r;
237
+ if ("undefined" != typeof Symbol && void 0 !== (r = t[Symbol.toPrimitive])) {
238
+ var i = r.call(t, e || "default");
239
239
  if ("object" != typeof i) return i;
240
240
  throw new TypeError("@@toPrimitive must return a primitive value.");
241
241
  }
242
- return ("string" === r ? String : Number)(t);
242
+ return ("string" === e ? String : Number)(t);
243
243
  }
244
244
  function _toPropertyKey(t) {
245
245
  var i = _toPrimitive(t, "string");
@@ -3577,10 +3577,12 @@
3577
3577
  canvas.style.height = "".concat(chart.height, "px");
3578
3578
  canvas.style.width = "".concat(chart.width, "px");
3579
3579
  }
3580
- if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) {
3580
+ var canvasHeight = Math.floor(deviceHeight);
3581
+ var canvasWidth = Math.floor(deviceWidth);
3582
+ if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== canvasHeight || canvas.width !== canvasWidth) {
3581
3583
  chart.currentDevicePixelRatio = pixelRatio;
3582
- canvas.height = deviceHeight;
3583
- canvas.width = deviceWidth;
3584
+ canvas.height = canvasHeight;
3585
+ canvas.width = canvasWidth;
3584
3586
  chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
3585
3587
  return true;
3586
3588
  }
@@ -4682,7 +4684,7 @@
4682
4684
  var parsed = _step2.value;
4683
4685
  var stacks = parsed._stacks;
4684
4686
  if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {
4685
- return;
4687
+ continue;
4686
4688
  }
4687
4689
  delete stacks[axis][datasetIndex];
4688
4690
  if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {
@@ -6430,14 +6432,15 @@
6430
6432
  circumference: 360,
6431
6433
  radius: '100%',
6432
6434
  spacing: 0,
6435
+ spacingMode: 'angular',
6433
6436
  indexAxis: 'r'
6434
6437
  });
6435
6438
  _defineProperty$1(DoughnutController, "descriptors", {
6436
6439
  _scriptable: function _scriptable(name) {
6437
- return name !== 'spacing';
6440
+ return name !== 'spacing' && name !== 'spacingMode';
6438
6441
  },
6439
6442
  _indexable: function _indexable(name) {
6440
- return name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash');
6443
+ return name !== 'spacing' && name !== 'spacingMode' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash');
6441
6444
  }
6442
6445
  });
6443
6446
  _defineProperty$1(DoughnutController, "overrides", {
@@ -6727,6 +6730,12 @@
6727
6730
  endAngle: endAngle,
6728
6731
  options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)
6729
6732
  };
6733
+ if (properties.options.spacing === 0) {
6734
+ properties.options.spacing = this.options.spacing;
6735
+ }
6736
+ if (properties.options.spacingMode === 'angular') {
6737
+ properties.options.spacingMode = this.options.spacingMode;
6738
+ }
6730
6739
  this.updateElement(arc, i, properties, mode);
6731
6740
  }
6732
6741
  }
@@ -6764,7 +6773,9 @@
6764
6773
  }
6765
6774
  },
6766
6775
  indexAxis: 'r',
6767
- startAngle: 0
6776
+ startAngle: 0,
6777
+ spacing: 0,
6778
+ spacingMode: 'proportional'
6768
6779
  });
6769
6780
  _defineProperty$1(PolarAreaController, "overrides", {
6770
6781
  aspectRatio: 1,
@@ -9653,7 +9664,9 @@
9653
9664
  rotation: rotation,
9654
9665
  textAlign: titleAlign(align, position, reverse),
9655
9666
  textBaseline: 'middle',
9656
- translation: [titleX, titleY]
9667
+ translation: [titleX, titleY],
9668
+ strokeColor: title.strokeColor,
9669
+ strokeWidth: title.strokeWidth
9657
9670
  });
9658
9671
  }
9659
9672
  }, {
@@ -10509,7 +10522,7 @@
10509
10522
  }
10510
10523
  return false;
10511
10524
  }
10512
- var version = "4.5.1";
10525
+ var version = "4.6.1";
10513
10526
  var KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];
10514
10527
  function positionIsHorizontal(position, axis) {
10515
10528
  return position === 'top' || position === 'bottom' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x';
@@ -11675,6 +11688,23 @@
11675
11688
  y: y + r * Math.sin(theta)
11676
11689
  };
11677
11690
  }
11691
+ function pathFullCircle(ctx, element, offset, spacing) {
11692
+ var x = element.x,
11693
+ y = element.y,
11694
+ start = element.startAngle,
11695
+ pixelMargin = element.pixelMargin,
11696
+ innerR = element.innerRadius;
11697
+ var outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);
11698
+ var innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;
11699
+ ctx.beginPath();
11700
+ ctx.arc(x, y, outerRadius, start, start + TAU);
11701
+ if (innerRadius > 0) {
11702
+ // Start the inner contour as a separate subpath to avoid a seam connector.
11703
+ ctx.moveTo(x + Math.cos(start) * innerRadius, y + Math.sin(start) * innerRadius);
11704
+ ctx.arc(x, y, innerRadius, start + TAU, start, true);
11705
+ }
11706
+ ctx.closePath();
11707
+ }
11678
11708
  /**
11679
11709
  * Path the arc, respecting border radius by separating into left and right halves.
11680
11710
  *
@@ -11695,37 +11725,73 @@
11695
11725
  start = element.startAngle,
11696
11726
  pixelMargin = element.pixelMargin,
11697
11727
  innerR = element.innerRadius;
11728
+ var _element$options$spac = element.options.spacingMode,
11729
+ spacingMode = _element$options$spac === void 0 ? 'angular' : _element$options$spac;
11730
+ var alpha = end - start;
11731
+ if (circular && element.options.selfJoin && Math.abs(alpha) >= TAU - 1e-4) {
11732
+ pathFullCircle(ctx, element, offset, spacing);
11733
+ return;
11734
+ }
11698
11735
  var outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);
11699
11736
  var innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;
11700
- var spacingOffset = 0;
11701
- var alpha = end - start;
11737
+ var outerSpacingOffset = 0;
11738
+ var innerSpacingOffset = 0;
11739
+ var beta = outerRadius > 0 ? Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius : 0.001;
11740
+ var angleOffset = (alpha - beta) / 2;
11702
11741
  if (spacing) {
11703
11742
  // When spacing is present, it is the same for all items
11704
11743
  // So we adjust the start and end angle of the arc such that
11705
11744
  // the distance is the same as it would be without the spacing
11706
11745
  var noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;
11707
11746
  var noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;
11708
- var avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;
11709
- var adjustedAngle = avNogSpacingRadius !== 0 ? alpha * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha;
11710
- spacingOffset = (alpha - adjustedAngle) / 2;
11747
+ var avgNoSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;
11748
+ var proportionalOffset = function () {
11749
+ var adjustedAngle = avgNoSpacingRadius !== 0 ? alpha * avgNoSpacingRadius / (avgNoSpacingRadius + spacing) : alpha;
11750
+ return (alpha - adjustedAngle) / 2;
11751
+ }();
11752
+ var angularOffset = avgNoSpacingRadius > 0 ? Math.asin(Math.min(1, spacing / avgNoSpacingRadius)) : 0;
11753
+ // Keep spacing trims below half the available span after base offset trimming.
11754
+ var maxOffset = Math.max(0, beta / 2 - 0.001);
11755
+ var maxOffsetSin = Math.sin(maxOffset);
11756
+ if (spacingMode === 'parallel') {
11757
+ if (innerRadius === 0 && maxOffsetSin > 0) {
11758
+ // A root radius of zero cannot realize a non-zero parallel separator width.
11759
+ // Raise the root just enough for the available angular span.
11760
+ var minInnerRadius = spacing / maxOffsetSin;
11761
+ var maxInnerRadius = Math.max(0, outerRadius - 0.001);
11762
+ innerRadius = Math.min(minInnerRadius, maxInnerRadius);
11763
+ }
11764
+ // Use one bounded spacing value for both radii so large spacing keeps stable geometry.
11765
+ var maxParallelSpacing = Math.min(outerRadius > 0 ? outerRadius * maxOffsetSin : Number.POSITIVE_INFINITY, innerRadius > 0 ? innerRadius * maxOffsetSin : Number.POSITIVE_INFINITY);
11766
+ var parallelSpacing = Math.min(spacing, maxParallelSpacing);
11767
+ outerSpacingOffset = outerRadius > 0 ? Math.asin(Math.min(1, parallelSpacing / outerRadius)) : Math.min(maxOffset, angularOffset);
11768
+ innerSpacingOffset = innerRadius > 0 ? Math.asin(Math.min(1, parallelSpacing / innerRadius)) : outerSpacingOffset;
11769
+ } else if (spacingMode === 'proportional') {
11770
+ outerSpacingOffset = Math.min(maxOffset, proportionalOffset);
11771
+ innerSpacingOffset = Math.min(maxOffset, proportionalOffset);
11772
+ } else {
11773
+ outerSpacingOffset = Math.min(maxOffset, angularOffset);
11774
+ innerSpacingOffset = Math.min(maxOffset, angularOffset);
11775
+ }
11711
11776
  }
11712
- var beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;
11713
- var angleOffset = (alpha - beta) / 2;
11714
- var startAngle = start + angleOffset + spacingOffset;
11715
- var endAngle = end - angleOffset - spacingOffset;
11716
- var _parseBorderRadius$ = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle),
11777
+ var outerStartAngle = start + angleOffset + outerSpacingOffset;
11778
+ var outerEndAngle = end - angleOffset - outerSpacingOffset;
11779
+ var innerStartAngle = start + angleOffset + innerSpacingOffset;
11780
+ var innerEndAngle = end - angleOffset - innerSpacingOffset;
11781
+ var angleDelta = Math.min(outerEndAngle - outerStartAngle, innerEndAngle - innerStartAngle);
11782
+ var _parseBorderRadius$ = parseBorderRadius$1(element, innerRadius, outerRadius, angleDelta),
11717
11783
  outerStart = _parseBorderRadius$.outerStart,
11718
11784
  outerEnd = _parseBorderRadius$.outerEnd,
11719
11785
  innerStart = _parseBorderRadius$.innerStart,
11720
11786
  innerEnd = _parseBorderRadius$.innerEnd;
11721
11787
  var outerStartAdjustedRadius = outerRadius - outerStart;
11722
11788
  var outerEndAdjustedRadius = outerRadius - outerEnd;
11723
- var outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;
11724
- var outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;
11789
+ var outerStartAdjustedAngle = outerStartAngle + outerStart / outerStartAdjustedRadius;
11790
+ var outerEndAdjustedAngle = outerEndAngle - outerEnd / outerEndAdjustedRadius;
11725
11791
  var innerStartAdjustedRadius = innerRadius + innerStart;
11726
11792
  var innerEndAdjustedRadius = innerRadius + innerEnd;
11727
- var innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;
11728
- var innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;
11793
+ var innerStartAdjustedAngle = innerStartAngle + innerStart / innerStartAdjustedRadius;
11794
+ var innerEndAdjustedAngle = innerEndAngle - innerEnd / innerEndAdjustedRadius;
11729
11795
  ctx.beginPath();
11730
11796
  if (circular) {
11731
11797
  // The first arc segments from point 1 to point a to point 2
@@ -11735,32 +11801,32 @@
11735
11801
  // The corner segment from point 2 to point 3
11736
11802
  if (outerEnd > 0) {
11737
11803
  var pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);
11738
- ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);
11804
+ ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, outerEndAngle + HALF_PI);
11739
11805
  }
11740
11806
  // The line from point 3 to point 4
11741
- var p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);
11807
+ var p4 = rThetaToXY(innerEndAdjustedRadius, innerEndAngle, x, y);
11742
11808
  ctx.lineTo(p4.x, p4.y);
11743
11809
  // The corner segment from point 4 to point 5
11744
11810
  if (innerEnd > 0) {
11745
11811
  var _pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);
11746
- ctx.arc(_pCenter.x, _pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);
11812
+ ctx.arc(_pCenter.x, _pCenter.y, innerEnd, innerEndAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);
11747
11813
  }
11748
11814
  // The inner arc from point 5 to point b to point 6
11749
- var innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2;
11750
- ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);
11751
- ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true);
11815
+ var innerMidAdjustedAngle = (innerEndAngle - innerEnd / innerRadius + (innerStartAngle + innerStart / innerRadius)) / 2;
11816
+ ctx.arc(x, y, innerRadius, innerEndAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);
11817
+ ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, innerStartAngle + innerStart / innerRadius, true);
11752
11818
  // The corner segment from point 6 to point 7
11753
11819
  if (innerStart > 0) {
11754
11820
  var _pCenter2 = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);
11755
- ctx.arc(_pCenter2.x, _pCenter2.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);
11821
+ ctx.arc(_pCenter2.x, _pCenter2.y, innerStart, innerStartAdjustedAngle + Math.PI, innerStartAngle - HALF_PI);
11756
11822
  }
11757
11823
  // The line from point 7 to point 8
11758
- var p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);
11824
+ var p8 = rThetaToXY(outerStartAdjustedRadius, outerStartAngle, x, y);
11759
11825
  ctx.lineTo(p8.x, p8.y);
11760
11826
  // The corner segment from point 8 to point 1
11761
11827
  if (outerStart > 0) {
11762
11828
  var _pCenter3 = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);
11763
- ctx.arc(_pCenter3.x, _pCenter3.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);
11829
+ ctx.arc(_pCenter3.x, _pCenter3.y, outerStart, outerStartAngle - HALF_PI, outerStartAdjustedAngle);
11764
11830
  }
11765
11831
  } else {
11766
11832
  ctx.moveTo(x, y);
@@ -11815,6 +11881,7 @@
11815
11881
  ctx.lineJoin = borderJoinStyle || 'bevel';
11816
11882
  }
11817
11883
  var endAngle = element.endAngle;
11884
+ var isFullCircle = Math.abs(endAngle - startAngle) >= TAU - 1e-4;
11818
11885
  if (fullCircles) {
11819
11886
  pathArc(ctx, element, offset, spacing, endAngle, circular);
11820
11887
  for (var i = 0; i < fullCircles; ++i) {
@@ -11827,7 +11894,8 @@
11827
11894
  if (inner) {
11828
11895
  clipArc(ctx, element, endAngle);
11829
11896
  }
11830
- if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {
11897
+ var skipSelfClip = isFullCircle && element.innerRadius > 0;
11898
+ if (!skipSelfClip && options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {
11831
11899
  clipSelf(ctx, element, endAngle);
11832
11900
  }
11833
11901
  if (!fullCircles) {
@@ -11847,6 +11915,7 @@
11847
11915
  _defineProperty$1(_this21, "outerRadius", void 0);
11848
11916
  _defineProperty$1(_this21, "pixelMargin", void 0);
11849
11917
  _defineProperty$1(_this21, "startAngle", void 0);
11918
+ _defineProperty$1(_this21, "circular", void 0);
11850
11919
  _this21.options = undefined;
11851
11920
  _this21.circumference = undefined;
11852
11921
  _this21.startAngle = undefined;
@@ -11855,6 +11924,7 @@
11855
11924
  _this21.outerRadius = undefined;
11856
11925
  _this21.pixelMargin = 0;
11857
11926
  _this21.fullCircles = 0;
11927
+ _this21.circular = false;
11858
11928
  if (cfg) {
11859
11929
  Object.assign(_this21, cfg);
11860
11930
  }
@@ -11946,6 +12016,7 @@
11946
12016
  borderWidth: 2,
11947
12017
  offset: 0,
11948
12018
  spacing: 0,
12019
+ spacingMode: 'angular',
11949
12020
  angle: undefined,
11950
12021
  circular: true,
11951
12022
  selfJoin: false
@@ -13350,7 +13421,7 @@
13350
13421
  var meta = chart.getDatasetMeta(index);
13351
13422
  var clip = getDatasetClipArea(chart, meta);
13352
13423
  if (target && line.points.length) {
13353
- clipArea(ctx, area);
13424
+ clipArea(ctx, clipToIndexBounds(area, meta.iScale));
13354
13425
  doFill(ctx, {
13355
13426
  line: line,
13356
13427
  target: target,
@@ -13364,6 +13435,22 @@
13364
13435
  unclipArea(ctx);
13365
13436
  }
13366
13437
  }
13438
+ function clipToIndexBounds(area, iScale) {
13439
+ if (!iScale || iScale.getPointPositionForValue) {
13440
+ return area;
13441
+ }
13442
+ var p1 = iScale.getPixelForValue(iScale.min);
13443
+ var p2 = iScale.getPixelForValue(iScale.max);
13444
+ var lo = Math.min(p1, p2);
13445
+ var hi = Math.max(p1, p2);
13446
+ return iScale.isHorizontal() ? _objectSpread2(_objectSpread2({}, area), {}, {
13447
+ left: Math.max(area.left, lo),
13448
+ right: Math.min(area.right, hi)
13449
+ }) : _objectSpread2(_objectSpread2({}, area), {}, {
13450
+ top: Math.max(area.top, lo),
13451
+ bottom: Math.min(area.bottom, hi)
13452
+ });
13453
+ }
13367
13454
  function doFill(ctx, cfg) {
13368
13455
  var line = cfg.line,
13369
13456
  target = cfg.target,
@@ -21137,15 +21224,15 @@
21137
21224
  if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
21138
21225
  }
21139
21226
 
21140
- function toPrimitive(t, r) {
21227
+ function toPrimitive(t, e) {
21141
21228
  if ("object" != _typeof(t) || !t) return t;
21142
- var e = t[Symbol.toPrimitive];
21143
- if (void 0 !== e) {
21144
- var i = e.call(t, r || "default");
21229
+ var r;
21230
+ if ("undefined" != typeof Symbol && void 0 !== (r = t[Symbol.toPrimitive])) {
21231
+ var i = r.call(t, e || "default");
21145
21232
  if ("object" != _typeof(i)) return i;
21146
21233
  throw new TypeError("@@toPrimitive must return a primitive value.");
21147
21234
  }
21148
- return ("string" === r ? String : Number)(t);
21235
+ return ("string" === e ? String : Number)(t);
21149
21236
  }
21150
21237
 
21151
21238
  function toPropertyKey(t) {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chartkick
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.1
4
+ version: 5.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
@@ -42,14 +42,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
42
42
  requirements:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- version: '3.2'
45
+ version: '3.3'
46
46
  required_rubygems_version: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - ">="
49
49
  - !ruby/object:Gem::Version
50
50
  version: '0'
51
51
  requirements: []
52
- rubygems_version: 3.6.9
52
+ rubygems_version: 4.0.20
53
53
  specification_version: 4
54
54
  summary: Create beautiful JavaScript charts with one line of Ruby
55
55
  test_files: []