@levi-gemcommerce/analytics 0.0.1-dev.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.
Files changed (126) hide show
  1. package/README.md +37 -0
  2. package/dist/esm/components/GMultipleMetricChartCard/GMultipleMetricChartCard.d.ts +14 -0
  3. package/dist/esm/components/GMultipleMetricChartCard/MetricCard.d.ts +10 -0
  4. package/dist/esm/components/GMultipleMetricChartCard/MetricChart.d.ts +12 -0
  5. package/dist/esm/components/GMultipleMetricChartCard/index.d.ts +2 -0
  6. package/dist/esm/components/GSelectableMetricChartCard/GSelectableMetricChartCard.d.ts +14 -0
  7. package/dist/esm/components/GSelectableMetricChartCard/MetricCard.d.ts +10 -0
  8. package/dist/esm/components/GSelectableMetricChartCard/MetricChart.d.ts +12 -0
  9. package/dist/esm/components/GSelectableMetricChartCard/MetricChartTab.d.ts +11 -0
  10. package/dist/esm/components/GSelectableMetricChartCard/MetricChartTabs.d.ts +11 -0
  11. package/dist/esm/components/GSelectableMetricChartCard/index.d.ts +2 -0
  12. package/dist/esm/components/GTooltipCard/GTooltipCard.d.ts +32 -0
  13. package/dist/esm/components/GTooltipCard/index.d.ts +2 -0
  14. package/dist/esm/components/PATrendBadge/PATrendBadge.d.ts +7 -0
  15. package/dist/esm/components/PATrendBadge/index.d.ts +1 -0
  16. package/dist/esm/components/SingleMetricChartCard/SingleMetricChartCard.d.ts +12 -0
  17. package/dist/esm/components/SingleMetricChartCard/index.d.ts +2 -0
  18. package/dist/esm/components/common/chart/ChartSkeleton.d.ts +1 -0
  19. package/dist/esm/components/common/chart/GChartSkeleton.d.ts +1 -0
  20. package/dist/esm/components/common/chart/MetricChart.d.ts +8 -0
  21. package/dist/esm/components/common/chart/MetricChartEmpty.d.ts +8 -0
  22. package/dist/esm/components/common/chart/MetricChartProvider.d.ts +6 -0
  23. package/dist/esm/components/common/chart/MetricChartTooltip.d.ts +6 -0
  24. package/dist/esm/components/common/chart/MetricInfoBlock.d.ts +13 -0
  25. package/dist/esm/components/common/chart/MetricInfoSkeleton.d.ts +4 -0
  26. package/dist/esm/components/common/chart/MetricTrend.d.ts +5 -0
  27. package/dist/esm/components/common/chart/MetricValueSummary.d.ts +8 -0
  28. package/dist/esm/components/common/chart/PAMetricInfoSkeleton.d.ts +4 -0
  29. package/dist/esm/components/common/chart/index.d.ts +7 -0
  30. package/dist/esm/components/common/icons/DownIcon8px.d.ts +1 -0
  31. package/dist/esm/components/common/icons/UpIcon8px.d.ts +1 -0
  32. package/dist/esm/components/common/icons/index.d.ts +2 -0
  33. package/dist/esm/components/common/percent/MetricPercentage.d.ts +4 -0
  34. package/dist/esm/components/common/percent/index.d.ts +1 -0
  35. package/dist/esm/components/index.d.ts +2 -0
  36. package/dist/esm/constants/analytic-metric-tooltip.d.ts +5 -0
  37. package/dist/esm/constants/chart.d.ts +13 -0
  38. package/dist/esm/constants/g-multiple-metric-chart-card.d.ts +13 -0
  39. package/dist/esm/constants/g-selectable-metric-chart-card.d.ts +13 -0
  40. package/dist/esm/constants/index.d.ts +3 -0
  41. package/dist/esm/constants/pa-trend-badge.d.ts +9 -0
  42. package/dist/esm/constants/thumbnail.d.ts +2 -0
  43. package/dist/esm/index.d.ts +2 -0
  44. package/dist/esm/index.js +391 -0
  45. package/dist/esm/index.mjs +391 -0
  46. package/dist/esm/providers/MetricChartProvider.d.ts +6 -0
  47. package/dist/esm/providers/index.d.ts +1 -0
  48. package/dist/esm/shared/components/GBlockCenter/GBlockCenter.d.ts +15 -0
  49. package/dist/esm/shared/components/GBlockCenter/index.d.ts +1 -0
  50. package/dist/esm/shared/components/GSkeletonDisplayText/GSkeletonDisplayText.d.ts +4 -0
  51. package/dist/esm/shared/components/GSkeletonDisplayText/index.d.ts +1 -0
  52. package/dist/esm/shared/components/GThumbnail/GThumbnail.d.ts +20 -0
  53. package/dist/esm/shared/components/GThumbnail/index.d.ts +1 -0
  54. package/dist/esm/shared/components/GTooltipCard/GTooltipCard.d.ts +32 -0
  55. package/dist/esm/shared/components/GTooltipCard/index.d.ts +2 -0
  56. package/dist/esm/shared/components/index.d.ts +4 -0
  57. package/dist/esm/shared/index.d.ts +1 -0
  58. package/dist/esm/types/chart.d.ts +19 -0
  59. package/dist/esm/types/index.d.ts +2 -0
  60. package/dist/esm/types/metric.d.ts +27 -0
  61. package/dist/esm/utils/cls.d.ts +4 -0
  62. package/dist/esm/utils/index.d.ts +3 -0
  63. package/dist/esm/utils/number.d.ts +5 -0
  64. package/dist/esm/utils/percentage.d.ts +10 -0
  65. package/dist/style.css +1 -0
  66. package/dist/umd/esm/components/GMultipleMetricChartCard/GMultipleMetricChartCard.d.ts +14 -0
  67. package/dist/umd/esm/components/GMultipleMetricChartCard/MetricCard.d.ts +10 -0
  68. package/dist/umd/esm/components/GMultipleMetricChartCard/MetricChart.d.ts +12 -0
  69. package/dist/umd/esm/components/GMultipleMetricChartCard/index.d.ts +2 -0
  70. package/dist/umd/esm/components/GSelectableMetricChartCard/GSelectableMetricChartCard.d.ts +14 -0
  71. package/dist/umd/esm/components/GSelectableMetricChartCard/MetricCard.d.ts +10 -0
  72. package/dist/umd/esm/components/GSelectableMetricChartCard/MetricChart.d.ts +12 -0
  73. package/dist/umd/esm/components/GSelectableMetricChartCard/MetricChartTab.d.ts +11 -0
  74. package/dist/umd/esm/components/GSelectableMetricChartCard/index.d.ts +2 -0
  75. package/dist/umd/esm/components/GTooltipCard/GTooltipCard.d.ts +32 -0
  76. package/dist/umd/esm/components/GTooltipCard/index.d.ts +2 -0
  77. package/dist/umd/esm/components/PATrendBadge/PATrendBadge.d.ts +7 -0
  78. package/dist/umd/esm/components/PATrendBadge/index.d.ts +1 -0
  79. package/dist/umd/esm/components/SingleMetricChartCard/SingleMetricChartCard.d.ts +12 -0
  80. package/dist/umd/esm/components/SingleMetricChartCard/index.d.ts +2 -0
  81. package/dist/umd/esm/components/common/chart/GChartSkeleton.d.ts +1 -0
  82. package/dist/umd/esm/components/common/chart/MetricChart.d.ts +8 -0
  83. package/dist/umd/esm/components/common/chart/MetricChartEmpty.d.ts +8 -0
  84. package/dist/umd/esm/components/common/chart/MetricChartProvider.d.ts +6 -0
  85. package/dist/umd/esm/components/common/chart/MetricChartTooltip.d.ts +6 -0
  86. package/dist/umd/esm/components/common/chart/MetricInfoBlock.d.ts +13 -0
  87. package/dist/umd/esm/components/common/chart/MetricInfoSkeleton.d.ts +4 -0
  88. package/dist/umd/esm/components/common/chart/MetricTrend.d.ts +5 -0
  89. package/dist/umd/esm/components/common/chart/MetricValueSummary.d.ts +8 -0
  90. package/dist/umd/esm/components/common/chart/PAMetricInfoSkeleton.d.ts +4 -0
  91. package/dist/umd/esm/components/common/chart/index.d.ts +7 -0
  92. package/dist/umd/esm/components/common/icons/DownIcon8px.d.ts +1 -0
  93. package/dist/umd/esm/components/common/icons/UpIcon8px.d.ts +1 -0
  94. package/dist/umd/esm/components/common/icons/index.d.ts +2 -0
  95. package/dist/umd/esm/components/common/percent/MetricPercentage.d.ts +4 -0
  96. package/dist/umd/esm/components/common/percent/index.d.ts +1 -0
  97. package/dist/umd/esm/components/index.d.ts +2 -0
  98. package/dist/umd/esm/constants/analytic-metric-tooltip.d.ts +5 -0
  99. package/dist/umd/esm/constants/chart.d.ts +13 -0
  100. package/dist/umd/esm/constants/g-multiple-metric-chart-card.d.ts +13 -0
  101. package/dist/umd/esm/constants/g-selectable-metric-chart-card.d.ts +12 -0
  102. package/dist/umd/esm/constants/index.d.ts +3 -0
  103. package/dist/umd/esm/constants/pa-trend-badge.d.ts +9 -0
  104. package/dist/umd/esm/constants/thumbnail.d.ts +2 -0
  105. package/dist/umd/esm/index.d.ts +2 -0
  106. package/dist/umd/esm/providers/MetricChartProvider.d.ts +6 -0
  107. package/dist/umd/esm/providers/index.d.ts +1 -0
  108. package/dist/umd/esm/shared/components/GBlockCenter/GBlockCenter.d.ts +15 -0
  109. package/dist/umd/esm/shared/components/GBlockCenter/index.d.ts +1 -0
  110. package/dist/umd/esm/shared/components/GSkeletonDisplayText/GSkeletonDisplayText.d.ts +4 -0
  111. package/dist/umd/esm/shared/components/GSkeletonDisplayText/index.d.ts +1 -0
  112. package/dist/umd/esm/shared/components/GThumbnail/GThumbnail.d.ts +20 -0
  113. package/dist/umd/esm/shared/components/GThumbnail/index.d.ts +1 -0
  114. package/dist/umd/esm/shared/components/GTooltipCard/GTooltipCard.d.ts +32 -0
  115. package/dist/umd/esm/shared/components/GTooltipCard/index.d.ts +2 -0
  116. package/dist/umd/esm/shared/components/index.d.ts +4 -0
  117. package/dist/umd/esm/shared/index.d.ts +1 -0
  118. package/dist/umd/esm/types/chart.d.ts +19 -0
  119. package/dist/umd/esm/types/index.d.ts +2 -0
  120. package/dist/umd/esm/types/metric.d.ts +27 -0
  121. package/dist/umd/esm/utils/cls.d.ts +4 -0
  122. package/dist/umd/esm/utils/index.d.ts +3 -0
  123. package/dist/umd/esm/utils/number.d.ts +5 -0
  124. package/dist/umd/esm/utils/percentage.d.ts +10 -0
  125. package/dist/umd/index.js +1 -0
  126. package/package.json +86 -0
@@ -0,0 +1,391 @@
1
+ "use client"
2
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
+ import { SkeletonDisplayText, Box, Popover, InlineStack, BlockStack, Text, List, Card, SkeletonBodyText, Icon } from '@shopify/polaris';
4
+ import { useMemo, forwardRef, useState, useRef, useImperativeHandle } from 'react';
5
+ import { PolarisVizProvider, LineChart } from '@shopify/polaris-viz';
6
+ import { ChevronRightIcon } from '@shopify/polaris-icons';
7
+
8
+ var EMetricKey;
9
+ (function (EMetricKey) {
10
+ EMetricKey["SESSION"] = "sessions";
11
+ EMetricKey["ORDERS"] = "orders";
12
+ EMetricKey["PAGE_VIEWS"] = "pageviews";
13
+ EMetricKey["VISITORS"] = "visitors";
14
+ EMetricKey["BOUNCE_RATE"] = "bounce_rate";
15
+ EMetricKey["CTR"] = "ctr";
16
+ EMetricKey["CONVERSION_RATE"] = "conversion_rate";
17
+ EMetricKey["AVG_TIME_ON_PAGE"] = "average_time_on_page";
18
+ EMetricKey["ADDED_TO_CART"] = "added_to_cart";
19
+ EMetricKey["ADD_TO_CART_RATE"] = "added_to_cart_rate";
20
+ EMetricKey["REACHED_CHECKOUT"] = "sessions_that_reached_checkout";
21
+ EMetricKey["COMPLETE_CHECKOUT"] = "sessions_that_completed_checkout";
22
+ EMetricKey["CART_ADDITION"] = "sessions_with_cart_additions";
23
+ EMetricKey["AOV"] = "aov";
24
+ EMetricKey["REVENUE"] = "revenue";
25
+ EMetricKey["RPV"] = "revenue_per_visitor";
26
+ })(EMetricKey || (EMetricKey = {}));
27
+
28
+ const ANALYTICS_METRIC_TOOLTIP = {
29
+ [EMetricKey.SESSION]: {
30
+ title: 'Sessions',
31
+ content: 'A period during which a visitor interacts with your online store',
32
+ },
33
+ [EMetricKey.VISITORS]: {
34
+ title: 'Visitors',
35
+ content: 'Number of unique individuals who visit your online store',
36
+ },
37
+ [EMetricKey.BOUNCE_RATE]: {
38
+ title: 'Bounce rate',
39
+ content: 'Percentage of visitors who leave your store after viewing only one page, without interacting further',
40
+ formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Bounce rate" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "sessions with a pageview" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total sessions" })] })),
41
+ },
42
+ [EMetricKey.CTR]: {
43
+ title: 'Click-through rate',
44
+ content: 'Percentage of clicks to open new page, compared to the number of times the page was viewed',
45
+ formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Click-through rate" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "total clicks" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total pageviews" })] })),
46
+ },
47
+ [EMetricKey.AVG_TIME_ON_PAGE]: {
48
+ title: 'Average time on page',
49
+ content: 'Average duration that visitors spend on a page before clicking to open new page',
50
+ formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Average time on page" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "total time on page" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "(total pageviews - total exits)" })] })),
51
+ },
52
+ [EMetricKey.PAGE_VIEWS]: {
53
+ title: 'Pageviews',
54
+ content: 'Number of times a page on your online store has been viewed by visitors',
55
+ },
56
+ [EMetricKey.RPV]: {
57
+ title: 'Revenue per visitor',
58
+ content: 'Average revenue generated from each visitor',
59
+ formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Revenue per visitor" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "total revenue" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total visitors" })] })),
60
+ },
61
+ [EMetricKey.ADDED_TO_CART]: {
62
+ title: 'Added to cart',
63
+ content: 'Total number of the event when a customer adds a product to their cart on your online store',
64
+ },
65
+ [EMetricKey.REACHED_CHECKOUT]: {
66
+ title: 'Sessions that reached checkout',
67
+ content: 'Sessions in your online store in which the checkout page was reached',
68
+ },
69
+ [EMetricKey.COMPLETE_CHECKOUT]: {
70
+ title: 'Sessions that completed checkout',
71
+ content: 'Sessions in your online store in which a purchase was completed',
72
+ },
73
+ [EMetricKey.ORDERS]: {
74
+ title: 'Orders',
75
+ content: 'Number of orders that went through this pages',
76
+ },
77
+ [EMetricKey.CONVERSION_RATE]: {
78
+ title: 'Conversion rate',
79
+ content: 'Percentage of online store sessions that completed an order',
80
+ formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Conversion rate" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "sessions that completed checkout" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total sessions" })] })),
81
+ },
82
+ [EMetricKey.AOV]: {
83
+ title: 'Average order value',
84
+ content: 'Average value of orders placed in your online store',
85
+ formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Average order value" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "total revenue" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total orders" })] })),
86
+ },
87
+ [EMetricKey.REVENUE]: {
88
+ title: 'Revenue',
89
+ content: 'Total income generated from sales after discounts',
90
+ formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Revenue" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "gross sales" }), jsx("span", { className: "formula-operator", children: " - " }), jsx("span", { className: "formula-input", children: "discounts" })] })),
91
+ },
92
+ [EMetricKey.ADD_TO_CART_RATE]: {
93
+ title: 'Add to cart rate',
94
+ content: 'Percentage of sessions in which the customer added item to the cart',
95
+ formula: (jsxs(Fragment, { children: [jsx("span", { className: "formula-variable", children: "Added to cart rate" }), jsx("span", { children: " = " }), jsx("span", { className: "formula-input", children: "sessions with cart additions" }), jsx("span", { className: "formula-operator", children: " / " }), jsx("span", { className: "formula-input", children: "total sessions" })] })),
96
+ },
97
+ [EMetricKey.CART_ADDITION]: {
98
+ title: 'Sessions with cart additions',
99
+ content: 'Sessions in your online store in which a visitor added item to the cart',
100
+ },
101
+ };
102
+
103
+ const DEFAULT_CURRENT_PERIOD_LABEL = 'Current';
104
+ const DEFAULT_PREVIOUS_PERIOD_LABEL = 'Previous';
105
+ const CHART_MIN_HEIGHT = 228;
106
+ const SERIES_COLORS = {
107
+ current: 'rgba(64, 176, 230, 1)',
108
+ comparison: 'rgba(161, 202, 231, 1)',
109
+ all: ['#2C7DFF', '#F34A70'],
110
+ };
111
+ const TREND_TONE = {
112
+ POSITIVE: '#007F5F',
113
+ NEUTRAL: '#4A4A4A',
114
+ };
115
+ const PLACEHOLDER_VALUE = '-';
116
+
117
+ var THUMB_PRODUCT_DEFAULT = "data:image/svg+xml;base64,PHN2ZwogIHdpZHRoPSI5MCIKICBoZWlnaHQ9IjcyIgogIHZpZXdCb3g9IjAgMCA5MCA3MiIKICBmaWxsPSJub25lIgogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKPgogIDxwYXRoCiAgICBkPSJNNDguNzUgMzQuNUM0OS45OTI2IDM0LjUgNTEgMzMuNDkyNiA1MSAzMi4yNUM1MSAzMS4wMDc0IDQ5Ljk5MjYgMzAgNDguNzUgMzBDNDcuNTA3NCAzMCA0Ni41IDMxLjAwNzQgNDYuNSAzMi4yNUM0Ni41IDMzLjQ5MjYgNDcuNTA3NCAzNC41IDQ4Ljc1IDM0LjVaIgogICAgZmlsbD0iIzYxNjE2MSIKICAvPgogIDxwYXRoCiAgICBmaWxsUnVsZT0iZXZlbm9kZCIKICAgIGNsaXBSdWxlPSJldmVub2RkIgogICAgZD0iTTQzLjUyNjggMjYuMjVINDYuNDczMkM0Ny42OTI0IDI2LjI1IDQ4LjY3NTggMjYuMjUgNDkuNDcyMiAyNi4zMTVDNTAuMjkyMiAyNi4zODIgNTEuMDEyNCAyNi41MjM2IDUxLjY3ODcgMjYuODYzMUM1Mi43MzcxIDI3LjQwMjQgNTMuNTk3NiAyOC4yNjI5IDU0LjEzNjkgMjkuMzIxM0M1NC40NzY0IDI5Ljk4NzYgNTQuNjE4IDMwLjcwNzggNTQuNjg1IDMxLjUyNzhDNTQuNzUgMzIuMzI0MiA1NC43NSAzMy4zMDc2IDU0Ljc1IDM0LjUyNjhWMzcuNDczMkM1NC43NSAzOC42OTI0IDU0Ljc1IDM5LjY3NTggNTQuNjg1IDQwLjQ3MjJDNTQuNjE4IDQxLjI5MjIgNTQuNDc2NCA0Mi4wMTI0IDU0LjEzNjkgNDIuNjc4N0M1My41OTc2IDQzLjczNzEgNTIuNzM3MSA0NC41OTc2IDUxLjY3ODcgNDUuMTM2OUM1MS4wMTI0IDQ1LjQ3NjQgNTAuMjkyMiA0NS42MTggNDkuNDcyMiA0NS42ODVDNDguNjc1OCA0NS43NSA0Ny42OTI0IDQ1Ljc1IDQ2LjQ3MzIgNDUuNzVINDMuNTI2OEM0Mi4zMDc2IDQ1Ljc1IDQxLjMyNDIgNDUuNzUgNDAuNTI3OCA0NS42ODVDMzkuNzA3OCA0NS42MTggMzguOTg3NiA0NS40NzY0IDM4LjMyMTMgNDUuMTM2OUMzNy4yNjI5IDQ0LjU5NzYgMzYuNDAyNCA0My43MzcxIDM1Ljg2MzEgNDIuNjc4N0MzNS41MjM2IDQyLjAxMjQgMzUuMzgyIDQxLjI5MjIgMzUuMzE1IDQwLjQ3MjJDMzUuMjUgMzkuNjc1OCAzNS4yNSAzOC42OTI0IDM1LjI1IDM3LjQ3MzJWMzQuNTI2OEMzNS4yNSAzMy4zMDc2IDM1LjI1IDMyLjMyNDIgMzUuMzE1IDMxLjUyNzhDMzUuMzgyIDMwLjcwNzggMzUuNTIzNiAyOS45ODc2IDM1Ljg2MzEgMjkuMzIxM0MzNi40MDI0IDI4LjI2MjkgMzcuMjYyOSAyNy40MDI0IDM4LjMyMTMgMjYuODYzMUMzOC45ODc2IDI2LjUyMzYgMzkuNzA3OCAyNi4zODIgNDAuNTI3OCAyNi4zMTVDNDEuMzI0MiAyNi4yNSA0Mi4zMDc2IDI2LjI1IDQzLjUyNjggMjYuMjVaTTQwLjcxMSAyOC41NTc2QzQwLjAzMDIgMjguNjEzMiAzOS42MzkxIDI4LjcxNjkgMzkuMzQyOCAyOC44Njc5QzM4LjcwNzcgMjkuMTkxNCAzOC4xOTE0IDI5LjcwNzcgMzcuODY3OSAzMC4zNDI4QzM3LjcxNjkgMzAuNjM5MSAzNy42MTMyIDMxLjAzMDIgMzcuNTU3NiAzMS43MTFDMzcuNTAwOSAzMi40MDUgMzcuNSAzMy4yOTYzIDM3LjUgMzQuNTc1VjM2LjcxNzdMMzguNTg0MiAzNS40MTY3QzM5LjU3MjQgMzQuMjMwOSA0MS4zNjU1IDM0LjE0OTYgNDIuNDU2OSAzNS4yNDFMNDYuNSAzOS4yODQxTDQ4LjI2OTQgMzcuNTE0NkM0OS4zNzU3IDM2LjQwODMgNTEuMTk4IDM2LjUwOTMgNTIuMTc1NCAzNy43MzA5TDUyLjQ5OTUgMzguMTM2MUM1Mi41IDM3LjkxMzEgNTIuNSAzNy42NzY1IDUyLjUgMzcuNDI1VjM0LjU3NUM1Mi41IDMzLjI5NjMgNTIuNDk5MSAzMi40MDUgNTIuNDQyNCAzMS43MTFDNTIuMzg2OCAzMS4wMzAyIDUyLjI4MzEgMzAuNjM5MSA1Mi4xMzIxIDMwLjM0MjhDNTEuODA4NiAyOS43MDc3IDUxLjI5MjMgMjkuMTkxNCA1MC42NTcyIDI4Ljg2NzlDNTAuMzYwOSAyOC43MTY5IDQ5Ljk2OTggMjguNjEzMiA0OS4yODkgMjguNTU3NkM0OC41OTUgMjguNTAwOSA0Ny43MDM3IDI4LjUgNDYuNDI1IDI4LjVINDMuNTc1QzQyLjI5NjMgMjguNSA0MS40MDUgMjguNTAwOSA0MC43MTEgMjguNTU3NlpNMzcuNTU3NiA0MC4yODlDMzcuNTU0MyA0MC4yNDkyIDM3LjU1MTMgNDAuMjA4OCAzNy41NDg0IDQwLjE2NzhDMzcuNTcxMSA0MC4xNDQ4IDM3LjU5MzEgNDAuMTIwNiAzNy42MTQyIDQwLjA5NTNMNDAuMzEyNyAzNi44NTcxQzQwLjQ1MzkgMzYuNjg3NyA0MC43MSAzNi42NzYxIDQwLjg2NTkgMzYuODMyTDQ1LjcwNDUgNDEuNjcwNkM0Ni4xNDM4IDQyLjEwOTkgNDYuODU2MSA0Mi4xMDk5IDQ3LjI5NTUgNDEuNjcwNkw0OS44NjA0IDM5LjEwNTZDNTAuMDE4NSAzOC45NDc2IDUwLjI3ODggMzguOTYyIDUwLjQxODQgMzkuMTM2NUw1Mi4yMzc3IDQxLjQxMDdDNTIuMjA1NiA0MS41MDEgNTIuMTcwNCA0MS41ODIyIDUyLjEzMjEgNDEuNjU3MkM1MS44MDg2IDQyLjI5MjMgNTEuMjkyMyA0Mi44MDg2IDUwLjY1NzIgNDMuMTMyMUM1MC4zNjA5IDQzLjI4MzEgNDkuOTY5OCA0My4zODY4IDQ5LjI4OSA0My40NDI0QzQ4LjU5NSA0My40OTkxIDQ3LjcwMzcgNDMuNSA0Ni40MjUgNDMuNUg0My41NzVDNDIuMjk2MyA0My41IDQxLjQwNSA0My40OTkxIDQwLjcxMSA0My40NDI0QzQwLjAzMDIgNDMuMzg2OCAzOS42MzkxIDQzLjI4MzEgMzkuMzQyOCA0My4xMzIxQzM4LjcwNzcgNDIuODA4NiAzOC4xOTE0IDQyLjI5MjMgMzcuODY3OSA0MS42NTcyQzM3LjcxNjkgNDEuMzYwOSAzNy42MTMyIDQwLjk2OTggMzcuNTU3NiA0MC4yODlaIgogICAgZmlsbD0iIzYxNjE2MSIKICAvPgo8L3N2Zz4K";
118
+
119
+ const GSkeletonDisplayText = (props) => {
120
+ const height = props.height ?? '50px';
121
+ return (jsxs("div", { className: "Polaris-GSkeletonDisplayText", children: [jsx("style", { children: `.Polaris-GSkeletonDisplayText .Polaris-SkeletonDisplayText__DisplayText { height: ${height} !important; }` }), jsx(SkeletonDisplayText, { maxWidth: "100%", size: "extraLarge" })] }));
122
+ };
123
+
124
+ const GBlockCenter = ({ height, align, inlineAlign, display, ...props }) => {
125
+ const stickyStyle = useMemo(() => {
126
+ if (props.position !== 'sticky')
127
+ return {};
128
+ const style = {
129
+ position: 'sticky',
130
+ };
131
+ if (props.insetInlineStart)
132
+ style.insetInlineStart = Number(props.insetInlineStart) * 4;
133
+ if (props.insetInlineEnd)
134
+ style.insetInlineEnd = Number(props.insetInlineEnd) * 4;
135
+ if (props.insetBlockStart)
136
+ style.insetBlockStart = Number(props.insetBlockStart) * 4;
137
+ if (props.insetBlockEnd)
138
+ style.insetBlockEnd = Number(props.insetBlockEnd) * 4;
139
+ return style;
140
+ }, [props.position, props.insetInlineStart, props.insetInlineEnd, props.insetBlockStart, props.insetBlockEnd]);
141
+ return (jsx("div", { className: "Polaris-GBlockCenter", style: {
142
+ ...stickyStyle,
143
+ '--gp-block-center-height': height,
144
+ '--gp-block-center-display': display,
145
+ '--gp-block-center-align': align,
146
+ '--gp-block-center-inline-align': inlineAlign,
147
+ '--gp-block-center-overflow-x': props.overflowX,
148
+ '--gp-block-center-overflow-y': props.overflowY,
149
+ }, children: jsx(Box, { ...props }) }));
150
+ };
151
+
152
+ const TRIM_DECIMAL_ZEROS_REGEX = /\.0+$/;
153
+ const DEFAULT_DECIMALS = 2;
154
+ const trimDecimalZeros = (number) => {
155
+ return `${number}`.replace(TRIM_DECIMAL_ZEROS_REGEX, '');
156
+ };
157
+ const cleanDecimal = (number, decimals = DEFAULT_DECIMALS) => {
158
+ return trimDecimalZeros(number.toFixed(decimals));
159
+ };
160
+
161
+ /**
162
+ * Utility function to calculate percentage and format it.
163
+ * @param part - The part value.
164
+ * @param total - The total value.
165
+ * @param decimals - The number of decimal places to format the percentage to.
166
+ * @returns The formatted percentage as a string.
167
+ */
168
+ const PERCENTAGE_THRESHOLD = 0.005;
169
+ const PERCENTAGE_THRESHOLD_STRING = '~0%';
170
+ const isLessThanThreshold = (percentage) => percentage > 0 && percentage < PERCENTAGE_THRESHOLD;
171
+ const formatPercentage = (percentage, decimals = DEFAULT_DECIMALS) => {
172
+ if (isLessThanThreshold(percentage)) {
173
+ return PERCENTAGE_THRESHOLD_STRING;
174
+ }
175
+ return `${cleanDecimal(percentage, decimals)}%`;
176
+ };
177
+
178
+ function toVal(mix) {
179
+ if (typeof mix === 'string') {
180
+ return mix;
181
+ }
182
+ else if (typeof mix === 'object' && mix !== null) {
183
+ return Object.keys(mix)
184
+ .filter((key) => mix[key])
185
+ .join(' ');
186
+ }
187
+ else {
188
+ return false;
189
+ }
190
+ }
191
+ function cls(...classes) {
192
+ return classes.map(toVal).filter(Boolean).join(' ');
193
+ }
194
+
195
+ /**
196
+ * Helper function to generate a variation class name.
197
+ * @param name - Base name of the class.
198
+ * @param value - Variation value to append.
199
+ * @returns Combined class name.
200
+ */
201
+ function variationName(name, value) {
202
+ return `${name}${value.charAt(0).toUpperCase()}${value.slice(1)}`;
203
+ }
204
+ const GThumbnail = ({ source, alt, size, grayscale, defaultSource = THUMB_PRODUCT_DEFAULT, width = '80', height = '80', classRemoved = false, }) => {
205
+ const sizeClass = size && variationName('Polaris-Thumbnail--size', size);
206
+ const filterClass = grayscale && 'Polaris-GThumbnail--filter';
207
+ const className = cls('Polaris-Thumbnail', sizeClass);
208
+ const thumbnail = (jsx("img", { onError: (e) => {
209
+ e.currentTarget.src = defaultSource;
210
+ }, alt: alt ?? 'Thumbnail', src: `${source ?? defaultSource}`, width: width, height: height, style: {
211
+ '--gp-grayscale-percentage': grayscale || '100%',
212
+ }, className: cls('Polaris-GThumbnail', filterClass) }));
213
+ if (classRemoved)
214
+ return thumbnail;
215
+ return jsx("span", { className: className, children: thumbnail });
216
+ };
217
+
218
+ const SIZE_CLASS = {
219
+ default: 'w-[210px]',
220
+ wide: 'w-[320px]',
221
+ large: 'w-[328px]',
222
+ };
223
+ const ALIGNMENT_MAP = {
224
+ start: 'flex justify-start',
225
+ center: 'flex justify-center',
226
+ end: 'flex justify-end',
227
+ };
228
+ const GTooltipCard = forwardRef((props, ref) => {
229
+ const { tooltip, wrapper = 'div', activatorProps, isHideBorder, alignment, delay = 500, textDecoration = 'none', popoverRef, preferredAlignment = 'left', showArrow = false, } = props;
230
+ const { width = 'default' } = tooltip ?? {};
231
+ const [isMouseEnter, setIsMouseEnter] = useState(false);
232
+ const TooltipCardWrapper = wrapper;
233
+ const sizeClass = SIZE_CLASS[width];
234
+ const timeoutRef = useRef(null);
235
+ const handleMouseEnter = () => {
236
+ timeoutRef.current = setTimeout(() => {
237
+ setIsMouseEnter(true);
238
+ }, delay);
239
+ };
240
+ const handleMouseLeave = () => {
241
+ if (timeoutRef.current) {
242
+ clearTimeout(timeoutRef.current);
243
+ timeoutRef.current = null;
244
+ }
245
+ setIsMouseEnter(false);
246
+ };
247
+ useImperativeHandle(ref, () => ({ onClose: handleMouseLeave }));
248
+ return (jsx(TooltipCardWrapper, { className: cls('GTooltipCard cursor-pointer', alignment && ALIGNMENT_MAP[alignment], {
249
+ 'GTooltipCard--text-underline': textDecoration === 'underline',
250
+ }), onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, children: jsx(Popover, { ref: popoverRef, activator: !isHideBorder ? (jsx(Box, { borderBlockEndWidth: "025", borderStyle: "dashed", borderColor: "border-tertiary", as: wrapper, ...activatorProps, children: props.children })) : (jsx(InlineStack, { children: props.children })), activatorWrapper: wrapper, onClose: () => { }, active: isMouseEnter, preferredPosition: "below", preferredAlignment: preferredAlignment, children: tooltip && (jsx("div", { className: cls(sizeClass, { 'GTooltipCard-arrow': showArrow }), children: jsx(Box, { padding: "400", children: jsxs(BlockStack, { gap: "200", children: [jsxs(BlockStack, { gap: "100", children: [jsx(Text, { as: "span", variant: "headingSm", fontWeight: "semibold", children: tooltip.title }), jsxs(BlockStack, { gap: "400", children: [jsx(Text, { as: "span", variant: "bodyMd", tone: "subdued", fontWeight: "medium", children: jsx("span", { dangerouslySetInnerHTML: { __html: tooltip.content } }) }), tooltip.contentList && (jsx(List, { type: "bullet", children: tooltip.contentList.map((item) => (jsx(List.Item, { children: jsx(Text, { as: "span", variant: "bodyMd", tone: "subdued", fontWeight: "medium", children: item }) }, item))) }))] })] }), tooltip.formula && (jsx("div", { className: "rounded-md font-mono", style: { fontSize: '12px' }, children: tooltip.formula }))] }) }) })) }) }));
251
+ });
252
+ GTooltipCard.displayName = 'GTooltipCard';
253
+
254
+ const GChartSkeleton = () => {
255
+ return jsx(GSkeletonDisplayText, { height: "188px" });
256
+ };
257
+
258
+ const MetricChartProvider = ({ children, minHeight = CHART_MIN_HEIGHT }) => {
259
+ return (jsx(PolarisVizProvider, { themes: {
260
+ Light: {
261
+ chartContainer: {
262
+ minHeight,
263
+ },
264
+ grid: {
265
+ horizontalOverflow: true,
266
+ verticalOverflow: true,
267
+ horizontalMargin: 0,
268
+ },
269
+ seriesColors: {
270
+ comparison: SERIES_COLORS.comparison,
271
+ single: SERIES_COLORS.current,
272
+ all: [...SERIES_COLORS.all],
273
+ },
274
+ },
275
+ }, children: children }));
276
+ };
277
+
278
+ const defaultFormatValue = (value) => String(value);
279
+ const MetricChart = ({ lineChartData, isLoading, isEmptyMetricData }) => {
280
+ if (isLoading) {
281
+ return jsx(GChartSkeleton, {});
282
+ }
283
+ if (isEmptyMetricData) {
284
+ return jsx(MetricChartEmpty, { title: "No data yet", description: "Data needs time to gather" });
285
+ }
286
+ return (jsx(MetricChartProvider, { children: jsx(LineChart, { data: lineChartData, yAxisOptions: { labelFormatter: (value) => defaultFormatValue(Number(value) || 0) }, theme: "Light", tooltipOptions: {
287
+ keyFormatter: (value) => value,
288
+ renderTooltipContent(data) {
289
+ return jsx(MetricChartTooltip, { data: data, formatValue: defaultFormatValue });
290
+ },
291
+ }, showLegend: true }) }));
292
+ };
293
+
294
+ var IMAGE_ANALYTIC_EMPTY = "data:image/png;base64,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";
295
+
296
+ const MetricChartEmpty = ({ boxProps, minHeight, description, title }) => {
297
+ return (jsx(Box, { minWidth: "100%", ...boxProps, children: jsx(GBlockCenter, { minHeight: minHeight, children: jsx(Box, { padding: '400', children: jsxs(BlockStack, { gap: "400", align: "center", inlineAlign: "center", children: [jsx("div", { className: "h-[80px] w-[80px]", children: jsx(GThumbnail, { source: IMAGE_ANALYTIC_EMPTY, width: "80px", height: "80px", alt: title, classRemoved: true }) }), jsxs(BlockStack, { gap: "200", align: "center", inlineAlign: "center", children: [jsx(Text, { as: "h4", variant: "headingSm", fontWeight: "semibold", children: title }), jsx(Text, { as: "h4", variant: "bodyMd", tone: "subdued", children: description })] })] }) }) }) }));
298
+ };
299
+
300
+ const DownIcon8px = () => {
301
+ return (jsxs("svg", { width: "8", height: "8", viewBox: "0 0 8 8", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [jsx("g", { clipPath: "url(#clip0_18114_1160)", children: jsx("path", { d: "M1 1L6.5 6.5M6.5 6.5V1.5M6.5 6.5H1.5", stroke: "#8A8A8A", strokeWidth: "1.5" }) }), jsx("defs", { children: jsx("clipPath", { id: "clip0_18114_1160", children: jsx("rect", { width: "8", height: "8", fill: "white" }) }) })] }));
302
+ };
303
+
304
+ const UpIcon8px = () => {
305
+ return (jsxs("svg", { width: "8", height: "8", viewBox: "0 0 8 8", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [jsx("g", { clipPath: "url(#clip0_18114_1146)", children: jsx("path", { d: "M1 7L6.5 1.5M6.5 1.5H1.5M6.5 1.5V6.5", stroke: "#29845A", strokeWidth: "1.5" }) }), jsx("defs", { children: jsx("clipPath", { id: "clip0_18114_1146", children: jsx("rect", { width: "8", height: "8", fill: "white", transform: "matrix(0 -1 1 0 0 8)" }) }) })] }));
306
+ };
307
+
308
+ const MetricPercentage = ({ change }) => {
309
+ if (typeof change !== 'number') {
310
+ return jsx("div", { style: { height: '2px', width: '11px', backgroundColor: '#8A8A8A' } });
311
+ }
312
+ return (jsxs("div", { style: {
313
+ display: 'flex',
314
+ maxHeight: '20px',
315
+ width: 'fit-content',
316
+ alignItems: 'center',
317
+ gap: '4px',
318
+ borderRadius: '8px',
319
+ fontSize: '12px',
320
+ color: change > 0 ? TREND_TONE.POSITIVE : TREND_TONE.NEUTRAL,
321
+ }, children: [change < 0 && (jsx(InlineStack, { align: "center", children: jsx(DownIcon8px, {}) })), change > 0 && (jsx(InlineStack, { align: "center", children: jsx(UpIcon8px, {}) })), jsx(Text, { as: "span", variant: "bodyXs", fontWeight: "semibold", children: formatPercentage(Math.abs(change || 0)) })] }));
322
+ };
323
+
324
+ const MetricChartTooltip = ({ data, formatValue }) => {
325
+ const { activeIndex } = data;
326
+ const currentData = data?.dataSeries[0]?.data[activeIndex];
327
+ const previousData = data?.dataSeries[1]?.data[activeIndex];
328
+ const formatPercent = () => {
329
+ const value = currentData.trend?.value;
330
+ if (!value)
331
+ return PLACEHOLDER_VALUE;
332
+ const valueNumber = Number(value.replace(/[%~]/g, ''));
333
+ if (currentData.trend?.trend === 'negative') {
334
+ return valueNumber * -1;
335
+ }
336
+ return valueNumber;
337
+ };
338
+ return (jsx("div", { className: "w-fit min-w-[175px]", children: jsx(Card, { padding: '200', children: jsxs(BlockStack, { gap: '100', children: [jsx(Text, { as: "p", variant: "bodySm", fontWeight: "semibold", children: data.formatters?.titleFormatter?.(data.title || '') || data.title }), jsxs(BlockStack, { gap: '100', children: [jsxs(InlineStack, { gap: '400', align: "space-between", blockAlign: "center", children: [jsxs(InlineStack, { gap: '100', blockAlign: "center", children: [jsx("div", { className: "h-[2px] w-[12px] rounded-[10px] bg-[#4FA9EA]" }), jsx(Text, { as: "p", variant: "bodySm", fontWeight: "medium", tone: "subdued", children: currentData.tooltipKey })] }), jsxs(InlineStack, { blockAlign: "center", gap: "100", children: [jsx(Text, { as: "span", variant: "bodySm", fontWeight: "semibold", children: formatValue(currentData.value) }), jsx(MetricPercentage, { change: formatPercent() })] })] }), jsxs(InlineStack, { gap: '400', align: "space-between", blockAlign: "center", children: [jsxs(InlineStack, { gap: '100', blockAlign: "center", children: [jsx("div", { className: "w-[12px] border border-dashed border-[#A1CAE7]" }), jsx(Text, { as: "p", variant: "bodySm", tone: "subdued", fontWeight: "medium", children: previousData.tooltipKey })] }), jsxs(InlineStack, { blockAlign: "center", gap: "100", children: [jsx(Text, { as: "span", variant: "bodySm", fontWeight: "semibold", children: formatValue(previousData.value) }), jsx("div", { className: "opacity-0", children: jsx(MetricPercentage, { change: formatPercent() }) })] })] })] })] }) }) }));
339
+ };
340
+
341
+ const MetricInfoSkeleton = ({ isShowOneLine }) => {
342
+ if (isShowOneLine) {
343
+ return (jsx(Box, { width: "40%", children: jsx(SkeletonBodyText, { lines: 1 }) }));
344
+ }
345
+ return (jsxs(BlockStack, { gap: "200", children: [jsx(Box, { width: "60%", children: jsx(SkeletonBodyText, { lines: 1 }) }), jsx(Box, { width: "40%", children: jsx(SkeletonBodyText, { lines: 1 }) })] }));
346
+ };
347
+
348
+ const MetricValueSummary = ({ totalValue, hideComparison }) => (jsx(BlockStack, { gap: "200", children: jsxs(InlineStack, { blockAlign: "center", gap: "200", wrap: false, children: [jsx(InlineStack, { blockAlign: "center", gap: "200", children: jsx(Text, { as: "span", variant: "headingSm", children: totalValue.value }) }), !hideComparison && jsx(MetricPercentage, { change: totalValue.change })] }) }));
349
+
350
+ const MetricInfoBlock = ({ item, isHovered, isLoading, hideComparison, titleVariant = 'headingMd', titleFontWeight, onClickTitle, }) => {
351
+ const { key, title, totalValue } = item;
352
+ const tooltip = ANALYTICS_METRIC_TOOLTIP[key];
353
+ if (isLoading)
354
+ return jsx(MetricInfoSkeleton, {});
355
+ return (jsxs(BlockStack, { gap: "200", children: [jsx("div", { className: "hover:cursor-pointer hover:text-[--p-color-text-link-hover]", onClick: (e) => {
356
+ e?.stopPropagation();
357
+ onClickTitle?.(key);
358
+ }, children: jsxs(InlineStack, { wrap: false, children: [jsx(Box, { maxWidth: "100%", overflowX: "hidden", children: jsx(GTooltipCard, { tooltip: tooltip, children: jsx(Text, { as: "span", variant: titleVariant, fontWeight: titleFontWeight, truncate: true, children: title }) }) }), isHovered && (jsx("div", { className: "flex h-[20px] w-[20px] items-center", children: jsx(Icon, { source: ChevronRightIcon, tone: "inherit" }) }))] }) }), jsx(MetricValueSummary, { totalValue: totalValue, hideComparison: hideComparison })] }));
359
+ };
360
+
361
+ const MetricChartTab = ({ item, isActive, isLoading, hideComparison, onSelect, onClickTitle, }) => {
362
+ const [isHovered, setIsHovered] = useState(false);
363
+ const isHighlighted = isActive || isHovered;
364
+ return (jsx("div", { className: "w-full cursor-pointer overflow-hidden", onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), onClick: () => onSelect(item.key), children: jsx(Box, { paddingBlock: "150", paddingInline: "300", borderRadius: "200", background: isHighlighted ? 'bg-surface-active' : undefined, children: jsx(MetricInfoBlock, { item: item, isHovered: isHovered, isLoading: isLoading, hideComparison: hideComparison, titleVariant: "headingSm", titleFontWeight: "semibold", onClickTitle: onClickTitle }) }) }));
365
+ };
366
+
367
+ const GSelectableMetricChartCard = ({ metricInfo, dataChart, defaultActiveTab, isLoading, isEmptyMetricData, hideComparison, currentPeriodLabel = DEFAULT_CURRENT_PERIOD_LABEL, previousPeriodLabel = DEFAULT_PREVIOUS_PERIOD_LABEL, }) => {
368
+ const [activeTab, setActiveTab] = useState(defaultActiveTab);
369
+ const lineChartData = useMemo(() => {
370
+ const chartData = activeTab ? dataChart[activeTab] : undefined;
371
+ if (!chartData)
372
+ return [];
373
+ const currentSeries = { name: currentPeriodLabel, data: chartData.current };
374
+ if (hideComparison)
375
+ return [currentSeries];
376
+ return [currentSeries, { name: previousPeriodLabel, data: chartData.previous, isComparison: true }];
377
+ }, [activeTab, dataChart, hideComparison, currentPeriodLabel, previousPeriodLabel]);
378
+ return (jsxs(Card, { children: [jsx("div", { style: {
379
+ display: 'grid',
380
+ gridTemplateColumns: `repeat(${metricInfo.length}, 1fr)`,
381
+ gap: '16px',
382
+ marginBottom: '16px',
383
+ }, children: metricInfo.map((item) => (jsx(MetricChartTab, { item: item, isActive: activeTab === item.key, isLoading: isLoading, hideComparison: hideComparison, onSelect: setActiveTab }, item.key))) }), jsx(MetricChart, { lineChartData: lineChartData, isLoading: isLoading, isEmptyMetricData: isEmptyMetricData })] }));
384
+ };
385
+
386
+ const SingleMetricChartCard = ({ metricInfo, lineChartData, isLoading, hideComparison, isEmptyMetricData, onClickTitle, }) => {
387
+ const [isHovered, setIsHovered] = useState(false);
388
+ return (jsx("div", { onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), children: jsx(Card, { children: jsxs(BlockStack, { gap: "200", children: [jsx(MetricInfoBlock, { item: metricInfo, isHovered: isHovered, isLoading: isLoading, hideComparison: hideComparison, onClickTitle: onClickTitle }), jsx(MetricChart, { lineChartData: lineChartData, isLoading: isLoading, isEmptyMetricData: isEmptyMetricData })] }) }) }));
389
+ };
390
+
391
+ export { EMetricKey, GSelectableMetricChartCard, SingleMetricChartCard };