@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 };
@@ -0,0 +1,6 @@
1
+ import type { ReactElement, ReactNode } from 'react';
2
+ export interface IProps {
3
+ children: ReactNode;
4
+ minHeight?: number;
5
+ }
6
+ export declare const MetricChartProvider: ({ children, minHeight }: IProps) => ReactElement;
@@ -0,0 +1 @@
1
+ export { MetricChartProvider } from './MetricChartProvider';
@@ -0,0 +1,15 @@
1
+ import { type CSSProperties } from 'react';
2
+ import type { BoxProps } from '@shopify/polaris';
3
+ import './GBlockCenter.scss';
4
+ export type SpaceScale = '0' | '025' | '050' | '100' | '150' | '200' | '300' | '400' | '500' | '600' | '800' | '1000' | '1200' | '1600' | '2000' | '2400' | '2800' | '3200';
5
+ export interface GBlockCenterProps extends Omit<BoxProps, 'insetInlineStart' | 'insetInlineEnd' | 'insetBlockStart' | 'insetBlockEnd'> {
6
+ height?: string;
7
+ align?: 'center' | 'start' | 'end';
8
+ inlineAlign?: 'center' | 'start' | 'end';
9
+ display?: CSSProperties['display'];
10
+ insetInlineStart?: SpaceScale;
11
+ insetInlineEnd?: SpaceScale;
12
+ insetBlockStart?: SpaceScale;
13
+ insetBlockEnd?: SpaceScale;
14
+ }
15
+ export declare const GBlockCenter: ({ height, align, inlineAlign, display, ...props }: GBlockCenterProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from './GBlockCenter';
@@ -0,0 +1,4 @@
1
+ export interface GSkeletonDisplayTextProps {
2
+ height?: `${number}ch` | `${number}%` | `${number}px`;
3
+ }
4
+ export declare const GSkeletonDisplayText: React.FC<GSkeletonDisplayTextProps>;
@@ -0,0 +1 @@
1
+ export * from './GSkeletonDisplayText';
@@ -0,0 +1,20 @@
1
+ import type { ThumbnailProps } from '@shopify/polaris';
2
+ export interface GThumbnailProps extends ThumbnailProps {
3
+ defaultSource?: string;
4
+ width?: string;
5
+ height?: string;
6
+ classRemoved?: boolean;
7
+ isInactive?: boolean;
8
+ /**
9
+ * @description Filter to apply grayscale to the image
10
+ */
11
+ grayscale?: `${number}%`;
12
+ }
13
+ /**
14
+ * Helper function to generate a variation class name.
15
+ * @param name - Base name of the class.
16
+ * @param value - Variation value to append.
17
+ * @returns Combined class name.
18
+ */
19
+ export declare function variationName(name: string, value: string): string;
20
+ export declare const GThumbnail: ({ source, alt, size, grayscale, defaultSource, width, height, classRemoved, }: GThumbnailProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export * from './GThumbnail';
@@ -0,0 +1,32 @@
1
+ import type { BoxProps } from '@shopify/polaris';
2
+ type CloseTarget = 'activator' | 'next-node';
3
+ export interface PopoverPublicAPI {
4
+ forceUpdatePosition(): void;
5
+ close(target?: CloseTarget): void;
6
+ }
7
+ export interface GTooltipCardPublicAPI {
8
+ onClose(): void;
9
+ }
10
+ type Width = 'default' | 'wide' | 'large';
11
+ export interface GTooltipCardData {
12
+ title: string;
13
+ content: string | TrustedHTML;
14
+ formula?: React.ReactNode;
15
+ contentList?: string[];
16
+ width?: Width;
17
+ }
18
+ export interface IProps {
19
+ children: React.ReactNode;
20
+ delay?: number;
21
+ tooltip?: GTooltipCardData;
22
+ activatorProps?: BoxProps;
23
+ wrapper?: 'span' | 'div';
24
+ isHideBorder?: boolean;
25
+ alignment?: 'start' | 'center' | 'end';
26
+ textDecoration?: 'underline' | 'none';
27
+ preferredAlignment?: 'left' | 'center' | 'right';
28
+ popoverRef?: React.RefObject<PopoverPublicAPI>;
29
+ showArrow?: boolean;
30
+ }
31
+ export declare const GTooltipCard: import("react").ForwardRefExoticComponent<IProps & import("react").RefAttributes<GTooltipCardPublicAPI>>;
32
+ export {};
@@ -0,0 +1,2 @@
1
+ export { GTooltipCard } from './GTooltipCard';
2
+ export type { GTooltipCardData, GTooltipCardPublicAPI, IProps as IGTooltipCardProps, PopoverPublicAPI, } from './GTooltipCard';
@@ -0,0 +1,4 @@
1
+ export * from './GSkeletonDisplayText';
2
+ export * from './GBlockCenter';
3
+ export * from './GThumbnail';
4
+ export * from './GTooltipCard';
@@ -0,0 +1 @@
1
+ export * from './components';
@@ -0,0 +1,19 @@
1
+ import type { Trend } from '@shopify/polaris-viz-core';
2
+ export interface IPAChartLabel {
3
+ value: string;
4
+ tooltipValue: string;
5
+ }
6
+ export type IPAChartLabels = IPAChartLabel[];
7
+ export interface IPAChartDataPoint {
8
+ key: string;
9
+ tooltipKey: string;
10
+ value: number;
11
+ trend?: {
12
+ value: string | undefined;
13
+ trend: Trend;
14
+ };
15
+ }
16
+ export type AllChartsDataMap = Record<string, {
17
+ current: IPAChartDataPoint[];
18
+ previous: IPAChartDataPoint[];
19
+ }>;
@@ -0,0 +1,2 @@
1
+ export * from './chart';
2
+ export * from './metric';
@@ -0,0 +1,27 @@
1
+ export declare enum EMetricKey {
2
+ SESSION = "sessions",
3
+ ORDERS = "orders",
4
+ PAGE_VIEWS = "pageviews",
5
+ VISITORS = "visitors",
6
+ BOUNCE_RATE = "bounce_rate",
7
+ CTR = "ctr",
8
+ CONVERSION_RATE = "conversion_rate",
9
+ AVG_TIME_ON_PAGE = "average_time_on_page",
10
+ ADDED_TO_CART = "added_to_cart",
11
+ ADD_TO_CART_RATE = "added_to_cart_rate",
12
+ REACHED_CHECKOUT = "sessions_that_reached_checkout",
13
+ COMPLETE_CHECKOUT = "sessions_that_completed_checkout",
14
+ CART_ADDITION = "sessions_with_cart_additions",
15
+ AOV = "aov",
16
+ REVENUE = "revenue",
17
+ RPV = "revenue_per_visitor"
18
+ }
19
+ export interface IMetricControl {
20
+ value: string | number | null;
21
+ change: string | number;
22
+ }
23
+ export interface IMetricCardItem {
24
+ key: EMetricKey;
25
+ title: string;
26
+ totalValue: IMetricControl;
27
+ }
@@ -0,0 +1,4 @@
1
+ type ClassDictionary = Record<string, boolean | undefined | null>;
2
+ type ClassValue = ClassDictionary | string | null | undefined;
3
+ export declare function cls(...classes: ClassValue[]): string;
4
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from './number';
2
+ export * from './percentage';
3
+ export * from './cls';
@@ -0,0 +1,5 @@
1
+ export declare const TRIM_DECIMAL_ZEROS_REGEX: RegExp;
2
+ export declare const DEFAULT_DECIMALS = 2;
3
+ export declare const trimDecimalZeros: (number?: string) => string;
4
+ export declare const cleanDecimal: (number: number, decimals?: number) => string;
5
+ export declare const semverToNum: (v: string) => number;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Utility function to calculate percentage and format it.
3
+ * @param part - The part value.
4
+ * @param total - The total value.
5
+ * @param decimals - The number of decimal places to format the percentage to.
6
+ * @returns The formatted percentage as a string.
7
+ */
8
+ export declare const calcPercentage: (part?: number, total?: number, decimals?: number) => number | undefined;
9
+ export declare const calcPercentageString: (part: number | undefined, total: number, decimals?: number) => string | undefined;
10
+ export declare const formatPercentage: (percentage: number, decimals?: number) => string;
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .sticky{position:sticky}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-\[20px\]{height:20px}.h-\[2px\]{height:2px}.h-\[80px\]{height:80px}.w-\[12px\]{width:12px}.w-\[20px\]{width:20px}.w-\[210px\]{width:210px}.w-\[320px\]{width:320px}.w-\[328px\]{width:328px}.w-\[80px\]{width:80px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-\[175px\]{min-width:175px}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.overflow-hidden,.truncate{overflow:hidden}.truncate{text-overflow:ellipsis;white-space:nowrap}.rounded-\[10px\]{border-radius:10px}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-dashed{border-style:dashed}.border-\[\#A1CAE7\]{--tw-border-opacity:1;border-color:rgb(161 202 231/var(--tw-border-opacity))}.bg-\[\#4FA9EA\]{--tw-bg-opacity:1;background-color:rgb(79 169 234/var(--tw-bg-opacity))}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.grayscale{--tw-grayscale:grayscale(100%)}.filter,.grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:cursor-pointer:hover{cursor:pointer}.hover\:text-\[--p-color-text-link-hover\]:hover{color:var(--p-color-text-link-hover)}