@redsift/charts 6.1.0 → 6.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.
package/index.js CHANGED
@@ -1,20 +1,41 @@
1
- import React, { forwardRef } from 'react';
2
1
  import { scaleOrdinal, pie, arc, sum } from 'd3';
2
+ import React, { forwardRef, useState, useRef, useEffect, useImperativeHandle, useLayoutEffect } from 'react';
3
3
  import styled, { css } from 'styled-components';
4
+ import ReactDOM from 'react-dom';
4
5
 
5
- const neutral = '#B6DAEE';
6
+ const ColorTheme = {
7
+ default: 'default',
8
+ dark: 'dark',
9
+ darker: 'darker',
10
+ monochrome: 'monochrome'
11
+ };
12
+
13
+ const monochrome = '#B6DAEE';
6
14
  const scheme = {
7
15
  default: ['#C1AAEA', '#B6DAEE', '#B3E3C5', '#EAADAC', '#E2A7D7', '#AFF5F3', '#F2D39E', '#F6EFC7', '#E6C2A0', '#E5E5E5'],
8
16
  dark: ['#A78ADB', '#97C5DE', '#90D2A9', '#D18785', '#D185C3', '#8CEAE6', '#D8B475', '#DED4A0', '#CDA279', '#BDBDBD'],
9
17
  darker: ['#8D6CC9', '#73ADCC', '#6DBE8B', '#BA6361', '#BD63AC', '#6CDCD8', '#BD954F', '#C6BB7A', '#B58556', '#666666'],
10
18
  light: ['#D9CAF5', '#D8EDF8', '#D3F0DE', '#FFD3D2', '#EFC8E8', '#D4FCFA', '#FFE8C0', '#FFFBE1', '#FFE3C9', '#F5F5F5'],
11
19
  lighter: ['#F0E9FC', '#F6FBFE', '#EDFAF1', '#FFE5E5', '#F9E6F6', '#E1FFFF', '#FFF0D7', '#FFFDF0', '#FFEEDE', '#FFFFFF'],
12
- monochrome: [neutral]
20
+ monochrome: [monochrome],
21
+ empty: ['#BDBDBD']
13
22
  };
14
23
  const successDangerScheme = {
15
24
  success: '#90D2A9',
16
25
  warning: '#D8B475',
17
- danger: '#D18785'
26
+ danger: '#D18785',
27
+ neutral: '#BDBDBD'
28
+ };
29
+ const getColorScale = (theme, isEmpty) => {
30
+ let d3colors = scaleOrdinal(scheme.default);
31
+ if (isEmpty) {
32
+ d3colors = scaleOrdinal(scheme.empty);
33
+ } else if (typeof theme === 'string') {
34
+ d3colors = scaleOrdinal(scheme[theme]);
35
+ } else if (typeof theme === 'object') {
36
+ d3colors = scaleOrdinal().domain([theme.success, theme.warning, theme.danger, ...(theme.neutral ? [theme.neutral] : [])]).range([successDangerScheme.success, successDangerScheme.warning, successDangerScheme.danger, ...(theme.neutral ? [successDangerScheme.neutral] : [])]).unknown(monochrome);
37
+ }
38
+ return d3colors;
18
39
  };
19
40
 
20
41
  function ownKeys(object, enumerableOnly) {
@@ -51,8 +72,8 @@ function _defineProperty(obj, key, value) {
51
72
  }
52
73
  return obj;
53
74
  }
54
- function _extends() {
55
- _extends = Object.assign ? Object.assign.bind() : function (target) {
75
+ function _extends$1() {
76
+ _extends$1 = Object.assign ? Object.assign.bind() : function (target) {
56
77
  for (var i = 1; i < arguments.length; i++) {
57
78
  var source = arguments[i];
58
79
  for (var key in source) {
@@ -63,7 +84,7 @@ function _extends() {
63
84
  }
64
85
  return target;
65
86
  };
66
- return _extends.apply(this, arguments);
87
+ return _extends$1.apply(this, arguments);
67
88
  }
68
89
  function _objectWithoutPropertiesLoose(source, excluded) {
69
90
  if (source == null) return {};
@@ -123,11 +144,15 @@ const PieChartLabelVariant = {
123
144
  /**
124
145
  * Component theme.
125
146
  */
126
- const PieChartTheme = {
127
- default: 'default',
128
- dark: 'dark',
129
- darker: 'darker',
130
- monochrome: 'monochrome'
147
+ const PieChartTheme = ColorTheme;
148
+ /**
149
+ * Tooltip label variant.
150
+ */
151
+ const PieChartTooltipVariant = {
152
+ none: 'none',
153
+ label: 'label',
154
+ value: 'value',
155
+ percent: 'percent'
131
156
  };
132
157
 
133
158
  /**
@@ -151,6 +176,9 @@ const StyledPieChart = styled.div`
151
176
  position: relative;
152
177
  }
153
178
  }
179
+ svg {
180
+ display: block;
181
+ }
154
182
  `;
155
183
  const StyledPieChartTitle = styled.div`
156
184
  font-family: var(--redsift-typography-h4-font-family);
@@ -174,6 +202,7 @@ const StyledPieChartCenterText = styled.div`
174
202
  flex-direction: column;
175
203
  justify-content: center;
176
204
  align-items: center;
205
+ pointer-events: none;
177
206
 
178
207
  > * {
179
208
  max-width: ${_ref => {
@@ -185,19 +214,121 @@ const StyledPieChartCenterText = styled.div`
185
214
  }
186
215
 
187
216
  > b {
188
- margin-bottom: 8px;
189
217
  font-family: var(--redsift-typography-font-family-source-code-pro);
190
218
  color: var(--redsift-color-text-primary);
191
- font-weight: var(--redsift-typography-font-weight-semi-bold);
192
- font-size: 30px;
193
- line-height: 28px;
219
+ font-weight: var(--redsift-typography-font-weight-medium);
220
+ font-size: ${_ref2 => {
221
+ let {
222
+ $textSize
223
+ } = _ref2;
224
+ return $textSize;
225
+ }}px;
226
+ line-height: ${_ref3 => {
227
+ let {
228
+ $textSize
229
+ } = _ref3;
230
+ return $textSize;
231
+ }}px;
232
+
233
+ &:nth-child(2) {
234
+ font-weight: normal;
235
+ margin-top: 8px;
236
+ font-family: var(--redsift-typography-font-family-raleway);
237
+ font-size: ${_ref4 => {
238
+ let {
239
+ $smallTextSize
240
+ } = _ref4;
241
+ return $smallTextSize;
242
+ }}px;
243
+ line-height: ${_ref5 => {
244
+ let {
245
+ $smallTextSize
246
+ } = _ref5;
247
+ return $smallTextSize;
248
+ }}px;
249
+ }
194
250
  }
195
251
  > span {
252
+ color: var(--redsift-color-text-primary);
253
+ font-size: ${_ref6 => {
254
+ let {
255
+ $textSize
256
+ } = _ref6;
257
+ return $textSize;
258
+ }}px;
259
+ line-height: ${_ref7 => {
260
+ let {
261
+ $textSize
262
+ } = _ref7;
263
+ return $textSize;
264
+ }}px;
265
+ &:nth-child(3) {
266
+ margin-top: 4px;
267
+ font-size: ${_ref8 => {
268
+ let {
269
+ $smallTextSize
270
+ } = _ref8;
271
+ return $smallTextSize;
272
+ }}px;
273
+ line-height: ${_ref9 => {
274
+ let {
275
+ $smallTextSize
276
+ } = _ref9;
277
+ return $smallTextSize;
278
+ }}px;
279
+ }
280
+ }
281
+ > b + span {
196
282
  font-size: var(--redsift-typography-body-font-size);
283
+ font-family: var(--redsift-typography-font-family-raleway);
284
+ line-height: var(--redsift-typography-badge-line-height);
197
285
  color: rgba(0, 0, 0, 0.6);
198
286
  text-align: center;
199
287
  }
200
288
  `;
289
+ const StyledPieChartEmptyText = styled.div`
290
+ position: absolute;
291
+ top: 0;
292
+ left: 0;
293
+ height: 100%;
294
+ width: 100%;
295
+ display: flex;
296
+ flex-direction: column;
297
+ justify-content: center;
298
+ align-items: center;
299
+ pointer-events: none;
300
+
301
+ > * {
302
+ max-width: ${_ref10 => {
303
+ let {
304
+ $maxWidth
305
+ } = _ref10;
306
+ return $maxWidth;
307
+ }}px;
308
+ }
309
+
310
+ > span {
311
+ font-family: var(--redsift-typography-font-family-raleway);
312
+ color: ${_ref11 => {
313
+ let {
314
+ $isDonut
315
+ } = _ref11;
316
+ return $isDonut ? css`var(--redsift-color-text-secondary)` : css`var(--redsift-color-text-primary)`;
317
+ }};
318
+ font-size: ${_ref12 => {
319
+ let {
320
+ $textSize
321
+ } = _ref12;
322
+ return $textSize;
323
+ }}px;
324
+ line-height: ${_ref13 => {
325
+ let {
326
+ $textSize
327
+ } = _ref13;
328
+ return $textSize;
329
+ }}px;
330
+ }
331
+ `;
201
332
  const StyledPieChartLabel = styled.li`
202
333
  display: flex;
203
334
  align-items: center;
@@ -212,10 +343,10 @@ const StyledPieChartLabel = styled.li`
212
343
  height: 16px;
213
344
  width: 16px;
214
345
  min-width: 16px;
215
- background-color: ${_ref2 => {
346
+ background-color: ${_ref14 => {
216
347
  let {
217
348
  $color
218
- } = _ref2;
349
+ } = _ref14;
219
350
  return $color;
220
351
  }};
221
352
  }
@@ -227,10 +358,10 @@ const StyledPieChartLabel = styled.li`
227
358
  }
228
359
  `;
229
360
  const StyledPieChartArc = styled.g`
230
- ${_ref3 => {
361
+ ${_ref15 => {
231
362
  let {
232
363
  $spaced
233
- } = _ref3;
364
+ } = _ref15;
234
365
  return $spaced ? css`
235
366
  path {
236
367
  stroke-width: 2px;
@@ -239,20 +370,652 @@ const StyledPieChartArc = styled.g`
239
370
  ` : '';
240
371
  }}
241
372
 
242
- ${_ref4 => {
373
+ ${_ref16 => {
243
374
  let {
244
- $hover
245
- } = _ref4;
246
- return $hover ? css`
375
+ $clickable
376
+ } = _ref16;
377
+ return $clickable ? css`
247
378
  cursor: pointer;
248
379
  &:hover {
249
380
  opacity: 0.8;
250
381
  }
251
382
  ` : '';
252
- }}
383
+ }}}
384
+ `;
385
+ const Tooltip = styled.div`
386
+ font-family: var(--redsift-typography-font-family-raleway);
387
+ border: 1px solid rgb(0 0 0 / 20%);
388
+ padding: 10px;
389
+ box-shadow: 0 2px 1px -1px rgb(0 0 0 / 20%), 0 1px 1px 0 rgb(0 0 0 / 14%),
390
+ 0 1px 3px 0 rgb(0 0 0 / 12%);
391
+ background-color: var(--redsift-color-primary-contrast);
253
392
  `;
254
393
 
255
- const _excluded$1 = ["color", "data", "index", "onClick", "onMouseOver", "path", "spaced"];
394
+ function _extends() {
395
+ _extends = Object.assign || function (target) {
396
+ for (var i = 1; i < arguments.length; i++) {
397
+ var source = arguments[i];
398
+
399
+ for (var key in source) {
400
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
401
+ target[key] = source[key];
402
+ }
403
+ }
404
+ }
405
+
406
+ return target;
407
+ };
408
+
409
+ return _extends.apply(this, arguments);
410
+ }
411
+
412
+ var useOnEscape = function useOnEscape(handler, active) {
413
+ if (active === void 0) {
414
+ active = true;
415
+ }
416
+
417
+ useEffect(function () {
418
+ if (!active) return;
419
+
420
+ var listener = function listener(event) {
421
+ // check if key is an Escape
422
+ if (event.key === 'Escape') handler(event);
423
+ };
424
+
425
+ document.addEventListener('keyup', listener);
426
+ return function () {
427
+ if (!active) return;
428
+ document.removeEventListener('keyup', listener);
429
+ };
430
+ }, [handler, active]);
431
+ };
432
+ var useRepositionOnResize = function useRepositionOnResize(handler, active) {
433
+ if (active === void 0) {
434
+ active = true;
435
+ }
436
+
437
+ useEffect(function () {
438
+ if (!active) return;
439
+
440
+ var listener = function listener() {
441
+ handler();
442
+ };
443
+
444
+ window.addEventListener('resize', listener);
445
+ return function () {
446
+ if (!active) return;
447
+ window.removeEventListener('resize', listener);
448
+ };
449
+ }, [handler, active]);
450
+ };
451
+ var useOnClickOutside = function useOnClickOutside(ref, handler, active) {
452
+ if (active === void 0) {
453
+ active = true;
454
+ }
455
+
456
+ useEffect(function () {
457
+ if (!active) return;
458
+
459
+ var listener = function listener(event) {
460
+ // Do nothing if clicking ref's element or descendent elements
461
+ var refs = Array.isArray(ref) ? ref : [ref];
462
+ var contains = false;
463
+ refs.forEach(function (r) {
464
+ if (!r.current || r.current.contains(event.target)) {
465
+ contains = true;
466
+ return;
467
+ }
468
+ });
469
+ event.stopPropagation();
470
+ if (!contains) handler(event);
471
+ };
472
+
473
+ document.addEventListener('mousedown', listener);
474
+ document.addEventListener('touchstart', listener);
475
+ return function () {
476
+ if (!active) return;
477
+ document.removeEventListener('mousedown', listener);
478
+ document.removeEventListener('touchstart', listener);
479
+ };
480
+ }, [ref, handler, active]);
481
+ }; // Make sure that user is not able TAB out of the Modal content on Open
482
+
483
+ var useTabbing = function useTabbing(contentRef, active) {
484
+ if (active === void 0) {
485
+ active = true;
486
+ }
487
+
488
+ useEffect(function () {
489
+ if (!active) return;
490
+
491
+ var listener = function listener(event) {
492
+ // check if key is an Tab
493
+ if (event.keyCode === 9) {
494
+ var _contentRef$current;
495
+
496
+ var els = contentRef === null || contentRef === void 0 ? void 0 : (_contentRef$current = contentRef.current) === null || _contentRef$current === void 0 ? void 0 : _contentRef$current.querySelectorAll('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex="0"]');
497
+ var focusableEls = Array.prototype.slice.call(els);
498
+
499
+ if (focusableEls.length === 1) {
500
+ event.preventDefault();
501
+ return;
502
+ }
503
+
504
+ var firstFocusableEl = focusableEls[0];
505
+ var lastFocusableEl = focusableEls[focusableEls.length - 1];
506
+
507
+ if (event.shiftKey && document.activeElement === firstFocusableEl) {
508
+ event.preventDefault();
509
+ lastFocusableEl.focus();
510
+ } else if (document.activeElement === lastFocusableEl) {
511
+ event.preventDefault();
512
+ firstFocusableEl.focus();
513
+ }
514
+ }
515
+ };
516
+
517
+ document.addEventListener('keydown', listener);
518
+ return function () {
519
+ if (!active) return;
520
+ document.removeEventListener('keydown', listener);
521
+ };
522
+ }, [contentRef, active]);
523
+ };
524
+ var useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
525
+
526
+ var Style = {
527
+ popupContent: {
528
+ tooltip: {
529
+ position: 'absolute',
530
+ zIndex: 999
531
+ },
532
+ modal: {
533
+ position: 'relative',
534
+ margin: 'auto'
535
+ }
536
+ },
537
+ popupArrow: {
538
+ height: '8px',
539
+ width: '16px',
540
+ position: 'absolute',
541
+ background: 'transparent',
542
+ color: '#FFF',
543
+ zIndex: -1
544
+ },
545
+ overlay: {
546
+ tooltip: {
547
+ position: 'fixed',
548
+ top: '0',
549
+ bottom: '0',
550
+ left: '0',
551
+ right: '0',
552
+ zIndex: 999
553
+ },
554
+ modal: {
555
+ position: 'fixed',
556
+ top: '0',
557
+ bottom: '0',
558
+ left: '0',
559
+ right: '0',
560
+ display: 'flex',
561
+ zIndex: 999
562
+ }
563
+ }
564
+ };
565
+
566
+ var POSITION_TYPES = ['top left', 'top center', 'top right', 'right top', 'right center', 'right bottom', 'bottom left', 'bottom center', 'bottom right', 'left top', 'left center', 'left bottom'];
567
+
568
+ var getCoordinatesForPosition = function getCoordinatesForPosition(triggerBounding, ContentBounding, position, //PopupPosition | PopupPosition[],
569
+ arrow, _ref) {
570
+ var offsetX = _ref.offsetX,
571
+ offsetY = _ref.offsetY;
572
+ var margin = arrow ? 8 : 0;
573
+ var args = position.split(' '); // the step N 1 : center the popup content => ok
574
+
575
+ var CenterTop = triggerBounding.top + triggerBounding.height / 2;
576
+ var CenterLeft = triggerBounding.left + triggerBounding.width / 2;
577
+ var height = ContentBounding.height,
578
+ width = ContentBounding.width;
579
+ var top = CenterTop - height / 2;
580
+ var left = CenterLeft - width / 2;
581
+ var transform = '';
582
+ var arrowTop = '0%';
583
+ var arrowLeft = '0%'; // the step N 2 : => ok
584
+
585
+ switch (args[0]) {
586
+ case 'top':
587
+ top -= height / 2 + triggerBounding.height / 2 + margin;
588
+ transform = "rotate(180deg) translateX(50%)";
589
+ arrowTop = '100%';
590
+ arrowLeft = '50%';
591
+ break;
592
+
593
+ case 'bottom':
594
+ top += height / 2 + triggerBounding.height / 2 + margin;
595
+ transform = "rotate(0deg) translateY(-100%) translateX(-50%)";
596
+ arrowLeft = '50%';
597
+ break;
598
+
599
+ case 'left':
600
+ left -= width / 2 + triggerBounding.width / 2 + margin;
601
+ transform = " rotate(90deg) translateY(50%) translateX(-25%)";
602
+ arrowLeft = '100%';
603
+ arrowTop = '50%';
604
+ break;
605
+
606
+ case 'right':
607
+ left += width / 2 + triggerBounding.width / 2 + margin;
608
+ transform = "rotate(-90deg) translateY(-150%) translateX(25%)";
609
+ arrowTop = '50%';
610
+ break;
611
+ }
612
+
613
+ switch (args[1]) {
614
+ case 'top':
615
+ top = triggerBounding.top;
616
+ arrowTop = triggerBounding.height / 2 + "px";
617
+ break;
618
+
619
+ case 'bottom':
620
+ top = triggerBounding.top - height + triggerBounding.height;
621
+ arrowTop = height - triggerBounding.height / 2 + "px";
622
+ break;
623
+
624
+ case 'left':
625
+ left = triggerBounding.left;
626
+ arrowLeft = triggerBounding.width / 2 + "px";
627
+ break;
628
+
629
+ case 'right':
630
+ left = triggerBounding.left - width + triggerBounding.width;
631
+ arrowLeft = width - triggerBounding.width / 2 + "px";
632
+ break;
633
+ }
634
+
635
+ top = args[0] === 'top' ? top - offsetY : top + offsetY;
636
+ left = args[0] === 'left' ? left - offsetX : left + offsetX;
637
+ return {
638
+ top: top,
639
+ left: left,
640
+ transform: transform,
641
+ arrowLeft: arrowLeft,
642
+ arrowTop: arrowTop
643
+ };
644
+ };
645
+
646
+ var getTooltipBoundary = function getTooltipBoundary(keepTooltipInside) {
647
+ // add viewport
648
+ var boundingBox = {
649
+ top: 0,
650
+ left: 0,
651
+
652
+ /* eslint-disable-next-line no-undef */
653
+ width: window.innerWidth,
654
+
655
+ /* eslint-disable-next-line no-undef */
656
+ height: window.innerHeight
657
+ };
658
+
659
+ if (typeof keepTooltipInside === 'string') {
660
+ /* eslint-disable-next-line no-undef */
661
+ var selector = document.querySelector(keepTooltipInside);
662
+
663
+ if (process.env.NODE_ENV !== 'production') {
664
+ if (selector === null) throw new Error(keepTooltipInside + " selector does not exist : keepTooltipInside must be a valid html selector 'class' or 'Id' or a boolean value");
665
+ }
666
+
667
+ if (selector !== null) boundingBox = selector.getBoundingClientRect();
668
+ }
669
+
670
+ return boundingBox;
671
+ };
672
+
673
+ var calculatePosition = function calculatePosition(triggerBounding, ContentBounding, position, arrow, _ref2, keepTooltipInside) {
674
+ var offsetX = _ref2.offsetX,
675
+ offsetY = _ref2.offsetY;
676
+ var bestCoords = {
677
+ arrowLeft: '0%',
678
+ arrowTop: '0%',
679
+ left: 0,
680
+ top: 0,
681
+ transform: 'rotate(135deg)'
682
+ };
683
+ var i = 0;
684
+ var wrapperBox = getTooltipBoundary(keepTooltipInside);
685
+ var positions = Array.isArray(position) ? position : [position]; // keepTooltipInside would be activated if the keepTooltipInside exist or the position is Array
686
+
687
+ if (keepTooltipInside || Array.isArray(position)) positions = [].concat(positions, POSITION_TYPES); // add viewPort for WarpperBox
688
+ // wrapperBox.top = wrapperBox.top + window.scrollY;
689
+ // wrapperBox.left = wrapperBox.left + window.scrollX;
690
+
691
+ while (i < positions.length) {
692
+ bestCoords = getCoordinatesForPosition(triggerBounding, ContentBounding, positions[i], arrow, {
693
+ offsetX: offsetX,
694
+ offsetY: offsetY
695
+ });
696
+ var contentBox = {
697
+ top: bestCoords.top,
698
+ left: bestCoords.left,
699
+ width: ContentBounding.width,
700
+ height: ContentBounding.height
701
+ };
702
+
703
+ if (contentBox.top <= wrapperBox.top || contentBox.left <= wrapperBox.left || contentBox.top + contentBox.height >= wrapperBox.top + wrapperBox.height || contentBox.left + contentBox.width >= wrapperBox.left + wrapperBox.width) {
704
+ i++;
705
+ } else {
706
+ break;
707
+ }
708
+ }
709
+
710
+ return bestCoords;
711
+ };
712
+
713
+ var popupIdCounter = 0;
714
+
715
+ var getRootPopup = function getRootPopup() {
716
+ var PopupRoot = document.getElementById('popup-root');
717
+
718
+ if (PopupRoot === null) {
719
+ PopupRoot = document.createElement('div');
720
+ PopupRoot.setAttribute('id', 'popup-root');
721
+ document.body.appendChild(PopupRoot);
722
+ }
723
+
724
+ return PopupRoot;
725
+ };
726
+
727
+ var Popup = /*#__PURE__*/forwardRef(function (_ref, ref) {
728
+ var _ref$trigger = _ref.trigger,
729
+ trigger = _ref$trigger === void 0 ? null : _ref$trigger,
730
+ _ref$onOpen = _ref.onOpen,
731
+ onOpen = _ref$onOpen === void 0 ? function () {} : _ref$onOpen,
732
+ _ref$onClose = _ref.onClose,
733
+ onClose = _ref$onClose === void 0 ? function () {} : _ref$onClose,
734
+ _ref$defaultOpen = _ref.defaultOpen,
735
+ defaultOpen = _ref$defaultOpen === void 0 ? false : _ref$defaultOpen,
736
+ _ref$open = _ref.open,
737
+ open = _ref$open === void 0 ? undefined : _ref$open,
738
+ _ref$disabled = _ref.disabled,
739
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
740
+ _ref$nested = _ref.nested,
741
+ nested = _ref$nested === void 0 ? false : _ref$nested,
742
+ _ref$closeOnDocumentC = _ref.closeOnDocumentClick,
743
+ closeOnDocumentClick = _ref$closeOnDocumentC === void 0 ? true : _ref$closeOnDocumentC,
744
+ _ref$repositionOnResi = _ref.repositionOnResize,
745
+ repositionOnResize = _ref$repositionOnResi === void 0 ? true : _ref$repositionOnResi,
746
+ _ref$closeOnEscape = _ref.closeOnEscape,
747
+ closeOnEscape = _ref$closeOnEscape === void 0 ? true : _ref$closeOnEscape,
748
+ _ref$on = _ref.on,
749
+ on = _ref$on === void 0 ? ['click'] : _ref$on,
750
+ _ref$contentStyle = _ref.contentStyle,
751
+ contentStyle = _ref$contentStyle === void 0 ? {} : _ref$contentStyle,
752
+ _ref$arrowStyle = _ref.arrowStyle,
753
+ arrowStyle = _ref$arrowStyle === void 0 ? {} : _ref$arrowStyle,
754
+ _ref$overlayStyle = _ref.overlayStyle,
755
+ overlayStyle = _ref$overlayStyle === void 0 ? {} : _ref$overlayStyle,
756
+ _ref$className = _ref.className,
757
+ className = _ref$className === void 0 ? '' : _ref$className,
758
+ _ref$position = _ref.position,
759
+ position = _ref$position === void 0 ? 'bottom center' : _ref$position,
760
+ _ref$modal = _ref.modal,
761
+ modal = _ref$modal === void 0 ? false : _ref$modal,
762
+ _ref$lockScroll = _ref.lockScroll,
763
+ lockScroll = _ref$lockScroll === void 0 ? false : _ref$lockScroll,
764
+ _ref$arrow = _ref.arrow,
765
+ arrow = _ref$arrow === void 0 ? true : _ref$arrow,
766
+ _ref$offsetX = _ref.offsetX,
767
+ offsetX = _ref$offsetX === void 0 ? 0 : _ref$offsetX,
768
+ _ref$offsetY = _ref.offsetY,
769
+ offsetY = _ref$offsetY === void 0 ? 0 : _ref$offsetY,
770
+ _ref$mouseEnterDelay = _ref.mouseEnterDelay,
771
+ mouseEnterDelay = _ref$mouseEnterDelay === void 0 ? 100 : _ref$mouseEnterDelay,
772
+ _ref$mouseLeaveDelay = _ref.mouseLeaveDelay,
773
+ mouseLeaveDelay = _ref$mouseLeaveDelay === void 0 ? 100 : _ref$mouseLeaveDelay,
774
+ _ref$keepTooltipInsid = _ref.keepTooltipInside,
775
+ keepTooltipInside = _ref$keepTooltipInsid === void 0 ? false : _ref$keepTooltipInsid,
776
+ children = _ref.children;
777
+
778
+ var _useState = useState(open || defaultOpen),
779
+ isOpen = _useState[0],
780
+ setIsOpen = _useState[1];
781
+
782
+ var triggerRef = useRef(null);
783
+ var contentRef = useRef(null);
784
+ var arrowRef = useRef(null);
785
+ var focusedElBeforeOpen = useRef(null);
786
+ var popupId = useRef("popup-" + ++popupIdCounter);
787
+ var isModal = modal ? true : !trigger;
788
+ var timeOut = useRef(0);
789
+ useIsomorphicLayoutEffect(function () {
790
+ if (isOpen) {
791
+ focusedElBeforeOpen.current = document.activeElement;
792
+ setPosition();
793
+ focusContentOnOpen(); // for accessibility
794
+
795
+ lockScrolll();
796
+ } else {
797
+ resetScroll();
798
+ }
799
+
800
+ return function () {
801
+ clearTimeout(timeOut.current);
802
+ };
803
+ }, [isOpen]); // for uncontrolled popup we need to sync isOpen with open prop
804
+
805
+ useEffect(function () {
806
+ if (typeof open === 'boolean') {
807
+ if (open) openPopup();else closePopup();
808
+ }
809
+ }, [open, disabled]);
810
+
811
+ var openPopup = function openPopup(event) {
812
+ if (isOpen || disabled) return;
813
+ setIsOpen(true);
814
+ setTimeout(function () {
815
+ return onOpen(event);
816
+ }, 0);
817
+ };
818
+
819
+ var closePopup = function closePopup(event) {
820
+ var _focusedElBeforeOpen$;
821
+
822
+ if (!isOpen || disabled) return;
823
+ setIsOpen(false);
824
+ if (isModal) (_focusedElBeforeOpen$ = focusedElBeforeOpen.current) === null || _focusedElBeforeOpen$ === void 0 ? void 0 : _focusedElBeforeOpen$.focus();
825
+ setTimeout(function () {
826
+ return onClose(event);
827
+ }, 0);
828
+ };
829
+
830
+ var togglePopup = function togglePopup(event) {
831
+ event === null || event === void 0 ? void 0 : event.stopPropagation();
832
+ if (!isOpen) openPopup(event);else closePopup(event);
833
+ };
834
+
835
+ var onMouseEnter = function onMouseEnter(event) {
836
+ clearTimeout(timeOut.current);
837
+ timeOut.current = setTimeout(function () {
838
+ return openPopup(event);
839
+ }, mouseEnterDelay);
840
+ };
841
+
842
+ var onContextMenu = function onContextMenu(event) {
843
+ event === null || event === void 0 ? void 0 : event.preventDefault();
844
+ togglePopup();
845
+ };
846
+
847
+ var onMouseLeave = function onMouseLeave(event) {
848
+ clearTimeout(timeOut.current);
849
+ timeOut.current = setTimeout(function () {
850
+ return closePopup(event);
851
+ }, mouseLeaveDelay);
852
+ };
853
+
854
+ var lockScrolll = function lockScrolll() {
855
+ if (isModal && lockScroll) document.getElementsByTagName('body')[0].style.overflow = 'hidden'; // migrate to document.body
856
+ };
857
+
858
+ var resetScroll = function resetScroll() {
859
+ if (isModal && lockScroll) document.getElementsByTagName('body')[0].style.overflow = 'auto';
860
+ };
861
+
862
+ var focusContentOnOpen = function focusContentOnOpen() {
863
+ var _contentRef$current;
864
+
865
+ var focusableEls = contentRef === null || contentRef === void 0 ? void 0 : (_contentRef$current = contentRef.current) === null || _contentRef$current === void 0 ? void 0 : _contentRef$current.querySelectorAll('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex="0"]');
866
+ var firstEl = Array.prototype.slice.call(focusableEls)[0];
867
+ firstEl === null || firstEl === void 0 ? void 0 : firstEl.focus();
868
+ };
869
+
870
+ useImperativeHandle(ref, function () {
871
+ return {
872
+ open: function open() {
873
+ openPopup();
874
+ },
875
+ close: function close() {
876
+ closePopup();
877
+ },
878
+ toggle: function toggle() {
879
+ togglePopup();
880
+ }
881
+ };
882
+ }); // set Position
883
+
884
+ var setPosition = function setPosition() {
885
+ if (isModal || !isOpen) return;
886
+ if (!(triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current) || !(triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current) || !(contentRef === null || contentRef === void 0 ? void 0 : contentRef.current)) return; /// show error as one of ref is undefined
887
+
888
+ var trigger = triggerRef.current.getBoundingClientRect();
889
+ var content = contentRef.current.getBoundingClientRect();
890
+ var cords = calculatePosition(trigger, content, position, arrow, {
891
+ offsetX: offsetX,
892
+ offsetY: offsetY
893
+ }, keepTooltipInside);
894
+ contentRef.current.style.top = cords.top + window.scrollY + "px";
895
+ contentRef.current.style.left = cords.left + window.scrollX + "px";
896
+
897
+ if (arrow && !!arrowRef.current) {
898
+ var _arrowStyle$top, _arrowStyle$left;
899
+
900
+ arrowRef.current.style.transform = cords.transform;
901
+ arrowRef.current.style.setProperty('-ms-transform', cords.transform);
902
+ arrowRef.current.style.setProperty('-webkit-transform', cords.transform);
903
+ arrowRef.current.style.top = ((_arrowStyle$top = arrowStyle.top) === null || _arrowStyle$top === void 0 ? void 0 : _arrowStyle$top.toString()) || cords.arrowTop;
904
+ arrowRef.current.style.left = ((_arrowStyle$left = arrowStyle.left) === null || _arrowStyle$left === void 0 ? void 0 : _arrowStyle$left.toString()) || cords.arrowLeft;
905
+ }
906
+ }; // hooks
907
+
908
+
909
+ useOnEscape(closePopup, closeOnEscape); // can be optimized if we disabled for hover
910
+
911
+ useTabbing(contentRef, isOpen && isModal);
912
+ useRepositionOnResize(setPosition, repositionOnResize);
913
+ useOnClickOutside(!!trigger ? [contentRef, triggerRef] : [contentRef], closePopup, closeOnDocumentClick && !nested); // we need to add a ne
914
+ // render the trigger element and add events
915
+
916
+ var renderTrigger = function renderTrigger() {
917
+ var triggerProps = {
918
+ key: 'T',
919
+ ref: triggerRef,
920
+ 'aria-describedby': popupId.current
921
+ };
922
+ var onAsArray = Array.isArray(on) ? on : [on];
923
+
924
+ for (var i = 0, len = onAsArray.length; i < len; i++) {
925
+ switch (onAsArray[i]) {
926
+ case 'click':
927
+ triggerProps.onClick = togglePopup;
928
+ break;
929
+
930
+ case 'right-click':
931
+ triggerProps.onContextMenu = onContextMenu;
932
+ break;
933
+
934
+ case 'hover':
935
+ triggerProps.onMouseEnter = onMouseEnter;
936
+ triggerProps.onMouseLeave = onMouseLeave;
937
+ break;
938
+
939
+ case 'focus':
940
+ triggerProps.onFocus = onMouseEnter;
941
+ triggerProps.onBlur = onMouseLeave;
942
+ break;
943
+ }
944
+ }
945
+
946
+ if (typeof trigger === 'function') {
947
+ var comp = trigger(isOpen);
948
+ return !!trigger && React.cloneElement(comp, triggerProps);
949
+ }
950
+
951
+ return !!trigger && React.cloneElement(trigger, triggerProps);
952
+ };
953
+
954
+ var addWarperAction = function addWarperAction() {
955
+ var popupContentStyle = isModal ? Style.popupContent.modal : Style.popupContent.tooltip;
956
+ var childrenElementProps = {
957
+ className: "popup-content " + (className !== '' ? className.split(' ').map(function (c) {
958
+ return c + "-content";
959
+ }).join(' ') : ''),
960
+ style: _extends({}, popupContentStyle, contentStyle, {
961
+ pointerEvents: 'auto'
962
+ }),
963
+ ref: contentRef,
964
+ onClick: function onClick(e) {
965
+ e.stopPropagation();
966
+ }
967
+ };
968
+
969
+ if (!modal && on.indexOf('hover') >= 0) {
970
+ childrenElementProps.onMouseEnter = onMouseEnter;
971
+ childrenElementProps.onMouseLeave = onMouseLeave;
972
+ }
973
+
974
+ return childrenElementProps;
975
+ };
976
+
977
+ var renderContent = function renderContent() {
978
+ return React.createElement("div", Object.assign({}, addWarperAction(), {
979
+ key: "C",
980
+ role: isModal ? 'dialog' : 'tooltip',
981
+ id: popupId.current
982
+ }), arrow && !isModal && React.createElement("div", {
983
+ ref: arrowRef,
984
+ style: Style.popupArrow
985
+ }, React.createElement("svg", {
986
+ "data-testid": "arrow",
987
+ className: "popup-arrow " + (className !== '' ? className.split(' ').map(function (c) {
988
+ return c + "-arrow";
989
+ }).join(' ') : ''),
990
+ viewBox: "0 0 32 16",
991
+ style: _extends({
992
+ position: 'absolute'
993
+ }, arrowStyle)
994
+ }, React.createElement("path", {
995
+ d: "M16 0l16 16H0z",
996
+ fill: "currentcolor"
997
+ }))), children && typeof children === 'function' ? children(closePopup, isOpen) : children);
998
+ };
999
+
1000
+ var overlay = !(on.indexOf('hover') >= 0);
1001
+ var ovStyle = isModal ? Style.overlay.modal : Style.overlay.tooltip;
1002
+ var content = [overlay && React.createElement("div", {
1003
+ key: "O",
1004
+ "data-testid": "overlay",
1005
+ "data-popup": isModal ? 'modal' : 'tooltip',
1006
+ className: "popup-overlay " + (className !== '' ? className.split(' ').map(function (c) {
1007
+ return c + "-overlay";
1008
+ }).join(' ') : ''),
1009
+ style: _extends({}, ovStyle, overlayStyle, {
1010
+ pointerEvents: closeOnDocumentClick && nested || isModal ? 'auto' : 'none'
1011
+ }),
1012
+ onClick: closeOnDocumentClick && nested ? closePopup : undefined,
1013
+ tabIndex: -1
1014
+ }, isModal && renderContent()), !isModal && renderContent()];
1015
+ return React.createElement(React.Fragment, null, renderTrigger(), isOpen && ReactDOM.createPortal(content, getRootPopup()));
1016
+ });
1017
+
1018
+ const _excluded$1 = ["color", "data", "index", "onClick", "path", "spaced", "showTooltip", "tooltipPercent", "tooltipLabelOnly", "isEmpty"];
256
1019
  const COMPONENT_NAME$1 = 'RedSiftPieChartArc';
257
1020
  const CLASSNAME$1 = 'redsift-piechart-arc';
258
1021
  const DEFAULT_PROPS$1 = {};
@@ -262,39 +1025,55 @@ const PieChartArc = /*#__PURE__*/forwardRef((props, ref) => {
262
1025
  data,
263
1026
  index,
264
1027
  onClick,
265
- onMouseOver,
266
1028
  path,
267
- spaced
1029
+ spaced,
1030
+ showTooltip,
1031
+ tooltipPercent,
1032
+ tooltipLabelOnly,
1033
+ isEmpty
268
1034
  } = props,
269
1035
  forwardedProps = _objectWithoutProperties(props, _excluded$1);
270
- return /*#__PURE__*/React.createElement(StyledPieChartArc, _extends({
1036
+ const Arc = /*#__PURE__*/React.createElement(StyledPieChartArc, _extends$1({
271
1037
  ref: ref
272
1038
  }, forwardedProps, {
273
1039
  role: onClick ? 'button' : undefined,
274
1040
  className: `pie-slice _${index}`,
275
1041
  onClick: onClick,
276
- onMouseOver: onMouseOver,
277
- $hover: Boolean(onMouseOver),
1042
+ $clickable: Boolean(onClick),
278
1043
  $spaced: Boolean(spaced)
279
1044
  }), /*#__PURE__*/React.createElement("path", {
280
1045
  d: path,
281
1046
  fill: color
282
- }), /*#__PURE__*/React.createElement("title", null, `${data.name}: ${data.value}`));
1047
+ }), !showTooltip && !isEmpty && /*#__PURE__*/React.createElement("title", null, `${data.name}: ${data.value}`));
1048
+ if (showTooltip) {
1049
+ const tooltipValue = tooltipPercent !== null ? `${tooltipPercent}%` : data.value;
1050
+ return /*#__PURE__*/React.createElement(Popup, {
1051
+ on: "hover",
1052
+ arrow: false,
1053
+ position: "right center",
1054
+ trigger: Arc
1055
+ }, /*#__PURE__*/React.createElement(Tooltip, null, `${data.name}${tooltipLabelOnly ? '' : ` - ${tooltipValue}`}`));
1056
+ }
1057
+ return Arc;
283
1058
  });
284
1059
  PieChartArc.className = CLASSNAME$1;
285
1060
  PieChartArc.defaultProps = DEFAULT_PROPS$1;
286
1061
  PieChartArc.displayName = COMPONENT_NAME$1;
287
1062
 
288
- const _excluded = ["caping", "caption", "className", "data", "labelVariant", "onSliceClick", "onSliceHover", "others", "size", "subtext", "text", "theme", "title", "variant"];
1063
+ const _excluded = ["caping", "caption", "className", "data", "labelVariant", "onSliceClick", "others", "size", "text", "middleText", "subtext", "theme", "title", "variant", "tooltipVariant", "localeText"];
289
1064
  const COMPONENT_NAME = 'RedSiftPieChart';
290
1065
  const CLASSNAME = 'redsift-piechart';
291
1066
  const DEFAULT_PROPS = {
292
- labelVariant: PieChartLabelVariant.internal,
1067
+ labelVariant: PieChartLabelVariant.none,
293
1068
  others: true,
294
1069
  size: PieChartSize.medium,
295
1070
  theme: PieChartTheme.default,
296
1071
  title: 'Pie Chart',
297
- variant: PieChartVariant.plain
1072
+ variant: PieChartVariant.plain,
1073
+ tooltipVariant: PieChartTooltipVariant.value,
1074
+ localeText: {
1075
+ emptyChartText: 'No Data'
1076
+ }
298
1077
  };
299
1078
  const sizeToDimension = size => {
300
1079
  switch (size) {
@@ -311,20 +1090,42 @@ const sizeToDimension = size => {
311
1090
  case PieChartSize.medium:
312
1091
  default:
313
1092
  return {
314
- width: 250,
315
- height: 250
1093
+ width: 240,
1094
+ height: 240
316
1095
  };
317
1096
  }
318
1097
  };
1098
+ const sizeToSmallFontSize = size => {
1099
+ switch (size) {
1100
+ case PieChartSize.small:
1101
+ return 13;
1102
+ case PieChartSize.large:
1103
+ return 18;
1104
+ case PieChartSize.medium:
1105
+ default:
1106
+ return 14;
1107
+ }
1108
+ };
1109
+ const sizeToFontSize = size => {
1110
+ switch (size) {
1111
+ case PieChartSize.small:
1112
+ return 30;
1113
+ case PieChartSize.large:
1114
+ return 38;
1115
+ case PieChartSize.medium:
1116
+ default:
1117
+ return 34;
1118
+ }
1119
+ };
319
1120
  const sizeToInnerRadius = size => {
320
1121
  switch (size) {
321
1122
  case PieChartSize.small:
322
- return 50;
1123
+ return 55;
323
1124
  case PieChartSize.large:
324
- return 75;
1125
+ return 80;
325
1126
  case PieChartSize.medium:
326
1127
  default:
327
- return 66;
1128
+ return 65;
328
1129
  }
329
1130
  };
330
1131
  const PieChart = /*#__PURE__*/forwardRef((props, ref) => {
@@ -335,16 +1136,23 @@ const PieChart = /*#__PURE__*/forwardRef((props, ref) => {
335
1136
  data: propData,
336
1137
  labelVariant,
337
1138
  onSliceClick,
338
- onSliceHover,
339
1139
  others,
340
1140
  size,
341
- subtext,
342
1141
  text,
1142
+ middleText,
1143
+ subtext,
343
1144
  theme,
344
1145
  title,
345
- variant
1146
+ variant,
1147
+ tooltipVariant,
1148
+ localeText
346
1149
  } = props,
347
1150
  forwardedProps = _objectWithoutProperties(props, _excluded);
1151
+ const {
1152
+ emptyChartText
1153
+ } = _objectSpread2(_objectSpread2({}, DEFAULT_PROPS.localeText), localeText);
1154
+ const isEmpty = propData.every(d => d.value === 0);
1155
+ const isDonut = variant === PieChartVariant.donut || variant === PieChartVariant.spacedDonut;
348
1156
  let data = propData.sort((a, b) => a.value < b.value ? 1 : -1);
349
1157
  if (caping) {
350
1158
  if (typeof others === 'boolean' && !others) {
@@ -367,6 +1175,12 @@ const PieChart = /*#__PURE__*/forwardRef((props, ref) => {
367
1175
  }, []);
368
1176
  }
369
1177
  }
1178
+ if (isEmpty) {
1179
+ data = [{
1180
+ name: emptyChartText,
1181
+ value: 100
1182
+ }];
1183
+ }
370
1184
 
371
1185
  // Get charts dimensions based on the selected size.
372
1186
  const chartDimensions = sizeToDimension(size);
@@ -374,19 +1188,14 @@ const PieChart = /*#__PURE__*/forwardRef((props, ref) => {
374
1188
  const innerRadius = sizeToInnerRadius(size);
375
1189
 
376
1190
  // Set color scheme.
377
- let d3colors = scaleOrdinal(scheme.default);
378
- if (typeof theme === 'string') {
379
- d3colors = scaleOrdinal(scheme[theme]);
380
- } else if (typeof theme === 'object') {
381
- d3colors = scaleOrdinal().domain([theme.success, theme.warning, theme.danger]).range([successDangerScheme.success, successDangerScheme.warning, successDangerScheme.danger]).unknown(neutral);
382
- }
1191
+ const d3colors = getColorScale(theme, isEmpty);
383
1192
 
384
1193
  // Initialize the chart.
385
1194
  const createPie = pie().value(d => d.value).sort(null);
386
- const createArc = arc().innerRadius(variant === PieChartVariant.donut || variant === PieChartVariant.spacedDonut ? innerRadius : 0).outerRadius(chartDimensions.width / 2 - externalRadiusPadding);
1195
+ const createArc = arc().innerRadius(isDonut ? innerRadius : 0).outerRadius(chartDimensions.width / 2 - externalRadiusPadding);
387
1196
  const pieData = createPie(data);
388
1197
  const total = sum(data, d => d.value);
389
- return /*#__PURE__*/React.createElement(StyledPieChart, _extends({
1198
+ return /*#__PURE__*/React.createElement(StyledPieChart, _extends$1({
390
1199
  ref: ref
391
1200
  }, forwardedProps, {
392
1201
  className: className
@@ -396,32 +1205,44 @@ const PieChart = /*#__PURE__*/forwardRef((props, ref) => {
396
1205
  className: `${PieChart.className}__container`
397
1206
  }, /*#__PURE__*/React.createElement("div", {
398
1207
  className: `${PieChart.className}-container__chart`
399
- }, text ? /*#__PURE__*/React.createElement(StyledPieChartCenterText, {
400
- $maxWidth: innerRadius * 2
401
- }, /*#__PURE__*/React.createElement("b", null, text), /*#__PURE__*/React.createElement("span", null, subtext)) : null, /*#__PURE__*/React.createElement("svg", {
1208
+ }, text && !isEmpty ? /*#__PURE__*/React.createElement(StyledPieChartCenterText, {
1209
+ $maxWidth: innerRadius * 2,
1210
+ $textSize: sizeToFontSize(size),
1211
+ $smallTextSize: sizeToSmallFontSize(size)
1212
+ }, subtext ? /*#__PURE__*/React.createElement("b", null, text) : /*#__PURE__*/React.createElement("span", null, text), middleText ? /*#__PURE__*/React.createElement("b", null, middleText) : null, /*#__PURE__*/React.createElement("span", null, subtext)) : null, isEmpty ? /*#__PURE__*/React.createElement(StyledPieChartEmptyText, {
1213
+ $maxWidth: innerRadius * 2,
1214
+ $textSize: sizeToFontSize(size) / 2,
1215
+ $isDonut: isDonut
1216
+ }, /*#__PURE__*/React.createElement("span", null, emptyChartText)) : null, /*#__PURE__*/React.createElement("svg", {
402
1217
  width: chartDimensions.width,
403
1218
  height: chartDimensions.height
404
1219
  }, /*#__PURE__*/React.createElement("g", {
405
1220
  transform: `translate(${chartDimensions.width / 2} ${chartDimensions.height / 2})`
406
1221
  }, /*#__PURE__*/React.createElement("g", {
407
1222
  className: "pie-slice-group"
408
- }, pieData.map((datum, index) => /*#__PURE__*/React.createElement(PieChartArc, {
409
- color: d3colors(datum.data.name),
410
- data: datum.data,
411
- index: index,
412
- key: `pie-slice _${index}`,
413
- onClick: onSliceClick ? () => onSliceClick(data[index]) : undefined,
414
- onMouseOver: onSliceHover ? () => onSliceHover(data[index]) : undefined,
415
- path: createArc(datum),
416
- spaced: variant === PieChartVariant.spaced || variant === PieChartVariant.spacedDonut
417
- }))), labelVariant === PieChartLabelVariant.internal ? /*#__PURE__*/React.createElement("g", {
1223
+ }, pieData.map((datum, index) => {
1224
+ const percent = (datum.data.value / total * 100).toFixed(2);
1225
+ return /*#__PURE__*/React.createElement(PieChartArc, {
1226
+ color: d3colors(datum.data.name),
1227
+ data: datum.data,
1228
+ isEmpty: isEmpty,
1229
+ index: index,
1230
+ key: `pie-slice _${index}`,
1231
+ onClick: onSliceClick ? () => onSliceClick(data[index]) : undefined,
1232
+ showTooltip: tooltipVariant !== PieChartTooltipVariant.none && !isEmpty,
1233
+ tooltipLabelOnly: tooltipVariant == PieChartTooltipVariant.label,
1234
+ tooltipPercent: tooltipVariant === PieChartTooltipVariant.percent ? percent : null,
1235
+ path: createArc(datum),
1236
+ spaced: variant === PieChartVariant.spaced || variant === PieChartVariant.spacedDonut
1237
+ });
1238
+ })), labelVariant === PieChartLabelVariant.internal ? /*#__PURE__*/React.createElement("g", {
418
1239
  className: "pie-label-group"
419
1240
  }, pieData.map((datum, index) => /*#__PURE__*/React.createElement("text", {
420
1241
  className: `pie-slice pie-label _${index}`,
421
1242
  key: `pie-slice pie-label _${index}`,
422
1243
  textAnchor: "middle",
423
1244
  transform: `translate(${createArc.centroid(datum)})`
424
- }, index < 3 || caping ? datum.data.name : null))) : null))), labelVariant !== PieChartLabelVariant.none && labelVariant !== PieChartLabelVariant.internal ? /*#__PURE__*/React.createElement("ul", null, data.map((_ref, index) => {
1245
+ }, index < 2 || caping ? datum.data.name : null))) : null))), labelVariant !== PieChartLabelVariant.none && labelVariant !== PieChartLabelVariant.internal ? /*#__PURE__*/React.createElement("ul", null, data.map((_ref, index) => {
425
1246
  let {
426
1247
  name,
427
1248
  value
@@ -429,7 +1250,7 @@ const PieChart = /*#__PURE__*/forwardRef((props, ref) => {
429
1250
  return /*#__PURE__*/React.createElement(StyledPieChartLabel, {
430
1251
  key: `pie-external-label _${index}`,
431
1252
  $color: d3colors(name)
432
- }, /*#__PURE__*/React.createElement("div", null), /*#__PURE__*/React.createElement("span", null, name), labelVariant === PieChartLabelVariant.externalLabelValue ? /*#__PURE__*/React.createElement("b", null, value) : labelVariant === PieChartLabelVariant.externalLabelPercent ? /*#__PURE__*/React.createElement("b", null, `${(value * 100 / total).toFixed(2)}%`) : null);
1253
+ }, /*#__PURE__*/React.createElement("div", null), labelVariant === PieChartLabelVariant.externalLabelValue ? /*#__PURE__*/React.createElement("b", null, value) : labelVariant === PieChartLabelVariant.externalLabelPercent ? /*#__PURE__*/React.createElement("b", null, `${(value * 100 / total).toFixed(2)}%`) : null, /*#__PURE__*/React.createElement("span", null, name));
433
1254
  })) : null), caption ? /*#__PURE__*/React.createElement(StyledPieChartCaption, {
434
1255
  className: `${PieChart.className}__caption`
435
1256
  }, caption) : null);
@@ -438,5 +1259,5 @@ PieChart.className = CLASSNAME;
438
1259
  PieChart.defaultProps = DEFAULT_PROPS;
439
1260
  PieChart.displayName = COMPONENT_NAME;
440
1261
 
441
- export { PieChart, PieChartLabelVariant, PieChartSize, PieChartTheme, PieChartVariant, StyledPieChart, StyledPieChartArc, StyledPieChartCaption, StyledPieChartCenterText, StyledPieChartLabel, StyledPieChartTitle, neutral, scheme, successDangerScheme };
1262
+ export { ColorTheme, PieChart, PieChartLabelVariant, PieChartSize, PieChartTheme, PieChartTooltipVariant, PieChartVariant, StyledPieChart, StyledPieChartArc, StyledPieChartCaption, StyledPieChartCenterText, StyledPieChartEmptyText, StyledPieChartLabel, StyledPieChartTitle, Tooltip, getColorScale, monochrome, scheme, successDangerScheme };
442
1263
  //# sourceMappingURL=index.js.map