@stigg/react-sdk 7.7.1-beta.0 → 7.7.1-beta.1

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 (286) hide show
  1. package/dist/index.d.ts +5 -2
  2. package/dist/react-sdk.cjs.js +298 -238
  3. package/dist/react-sdk.esm.js +5223 -3827
  4. package/package.json +2 -3
  5. package/src/assets/add.svg +0 -3
  6. package/src/assets/addons.svg +0 -12
  7. package/src/assets/arrow-forward.svg +0 -3
  8. package/src/assets/arrow-right.svg +0 -6
  9. package/src/assets/billing-info-customer.svg +0 -11
  10. package/src/assets/check-stigg.svg +0 -3
  11. package/src/assets/check.svg +0 -5
  12. package/src/assets/close.svg +0 -3
  13. package/src/assets/contact-support.svg +0 -13
  14. package/src/assets/coupon.svg +0 -6
  15. package/src/assets/credit-card.svg +0 -10
  16. package/src/assets/dollar-coin.svg +0 -13
  17. package/src/assets/edit-icon.svg +0 -3
  18. package/src/assets/entitlement-check.svg +0 -3
  19. package/src/assets/lottie/checkout-success.json +0 -1
  20. package/src/assets/mini-schedule.svg +0 -3
  21. package/src/assets/outlined-checked-circle-disabled.svg +0 -6
  22. package/src/assets/outlined-checked-circle.svg +0 -6
  23. package/src/assets/outlined-circle.svg +0 -3
  24. package/src/assets/pay-as-you-go-charge.svg +0 -11
  25. package/src/assets/payment-method.svg +0 -4
  26. package/src/assets/plus-icon.svg +0 -6
  27. package/src/assets/powered-by-stigg.svg +0 -13
  28. package/src/assets/promotions.svg +0 -13
  29. package/src/assets/remove.svg +0 -3
  30. package/src/assets/restore.svg +0 -3
  31. package/src/assets/sand-clock.svg +0 -4
  32. package/src/assets/schedule-box.svg +0 -9
  33. package/src/assets/schedule.svg +0 -3
  34. package/src/assets/subscription-renews-icon.svg +0 -14
  35. package/src/assets/trash.svg +0 -8
  36. package/src/components/StiggProvider.tsx +0 -170
  37. package/src/components/checkout/Checkout.tsx +0 -37
  38. package/src/components/checkout/CheckoutContainer.style.ts +0 -51
  39. package/src/components/checkout/CheckoutContainer.tsx +0 -193
  40. package/src/components/checkout/CheckoutProvider.tsx +0 -181
  41. package/src/components/checkout/components/Button.tsx +0 -35
  42. package/src/components/checkout/components/ChangePlanButton.tsx +0 -30
  43. package/src/components/checkout/components/ContentLoadingSkeleton.tsx +0 -41
  44. package/src/components/checkout/components/DowngradeToFreeContainer.tsx +0 -115
  45. package/src/components/checkout/components/InputField.tsx +0 -26
  46. package/src/components/checkout/components/Skeletons.style.ts +0 -30
  47. package/src/components/checkout/components/StyledArrow.tsx +0 -9
  48. package/src/components/checkout/components/index.ts +0 -3
  49. package/src/components/checkout/configurations/steps.ts +0 -1
  50. package/src/components/checkout/configurations/textOverrides.ts +0 -150
  51. package/src/components/checkout/configurations/theme.ts +0 -46
  52. package/src/components/checkout/configurations/typography.ts +0 -30
  53. package/src/components/checkout/formatting.ts +0 -12
  54. package/src/components/checkout/hooks/index.ts +0 -8
  55. package/src/components/checkout/hooks/useAddonsStepModel.ts +0 -92
  56. package/src/components/checkout/hooks/useCheckoutModel.ts +0 -53
  57. package/src/components/checkout/hooks/useCouponModel.ts +0 -28
  58. package/src/components/checkout/hooks/useLoadCheckout.ts +0 -48
  59. package/src/components/checkout/hooks/usePaymentStepModel.ts +0 -68
  60. package/src/components/checkout/hooks/usePlanStepModel.ts +0 -184
  61. package/src/components/checkout/hooks/usePreviewSubscription.ts +0 -165
  62. package/src/components/checkout/hooks/useProgressBarModel.ts +0 -211
  63. package/src/components/checkout/hooks/useSubscriptionModel.ts +0 -22
  64. package/src/components/checkout/hooks/useSubscriptionState.ts +0 -26
  65. package/src/components/checkout/index.ts +0 -8
  66. package/src/components/checkout/planHeader/PlanHeader.tsx +0 -41
  67. package/src/components/checkout/planHeader/index.ts +0 -1
  68. package/src/components/checkout/progressBar/CheckoutProgressBar.style.ts +0 -35
  69. package/src/components/checkout/progressBar/CheckoutProgressBar.tsx +0 -82
  70. package/src/components/checkout/promotionCode/AddPromotionCode.tsx +0 -107
  71. package/src/components/checkout/promotionCode/AddPromotionCodeButton.tsx +0 -43
  72. package/src/components/checkout/promotionCode/AppliedPromotionCode.tsx +0 -49
  73. package/src/components/checkout/promotionCode/PromotionCodeSection.tsx +0 -40
  74. package/src/components/checkout/promotionCode/index.ts +0 -1
  75. package/src/components/checkout/steps/addons/CheckoutAddonsStep.style.tsx +0 -34
  76. package/src/components/checkout/steps/addons/CheckoutAddonsStep.tsx +0 -144
  77. package/src/components/checkout/steps/addons/addon.utils.ts +0 -67
  78. package/src/components/checkout/steps/addons/components/AddonInputContainer.tsx +0 -84
  79. package/src/components/checkout/steps/addons/components/AddonTextContainer.tsx +0 -45
  80. package/src/components/checkout/steps/addons/index.ts +0 -1
  81. package/src/components/checkout/steps/payment/PaymentMethods.style.ts +0 -36
  82. package/src/components/checkout/steps/payment/PaymentMethods.tsx +0 -106
  83. package/src/components/checkout/steps/payment/PaymentStep.tsx +0 -63
  84. package/src/components/checkout/steps/payment/index.ts +0 -1
  85. package/src/components/checkout/steps/payment/stripe/StripePaymentForm.tsx +0 -79
  86. package/src/components/checkout/steps/payment/stripe/index.ts +0 -3
  87. package/src/components/checkout/steps/payment/stripe/stripe.utils.ts +0 -122
  88. package/src/components/checkout/steps/payment/stripe/useStripeIntegration.ts +0 -33
  89. package/src/components/checkout/steps/payment/stripe/useSubmit.ts +0 -135
  90. package/src/components/checkout/steps/payment/zuora/ZuoraPaymentForm.tsx +0 -128
  91. package/src/components/checkout/steps/payment/zuora/index.ts +0 -9
  92. package/src/components/checkout/steps/payment/zuora/useZuoraIntegration.ts +0 -57
  93. package/src/components/checkout/steps/payment/zuora/useZuoraSubmit.ts +0 -125
  94. package/src/components/checkout/steps/payment/zuora/zuora.utils.ts +0 -72
  95. package/src/components/checkout/steps/plan/BillingPeriodPicker.style.tsx +0 -69
  96. package/src/components/checkout/steps/plan/BillingPeriodPicker.tsx +0 -86
  97. package/src/components/checkout/steps/plan/CheckoutChargeList.tsx +0 -223
  98. package/src/components/checkout/steps/plan/CheckoutPlanStep.style.tsx +0 -6
  99. package/src/components/checkout/steps/plan/CheckoutPlanStep.tsx +0 -31
  100. package/src/components/checkout/steps/plan/index.ts +0 -1
  101. package/src/components/checkout/summary/CheckoutSuccess.tsx +0 -82
  102. package/src/components/checkout/summary/CheckoutSummary.tsx +0 -458
  103. package/src/components/checkout/summary/CheckoutSummarySkeleton.tsx +0 -38
  104. package/src/components/checkout/summary/components/CheckoutCaptions.tsx +0 -145
  105. package/src/components/checkout/summary/components/GraduatedPriceBreakdown.tsx +0 -70
  106. package/src/components/checkout/summary/components/LineItems.tsx +0 -275
  107. package/src/components/checkout/summary/components/WithSkeleton.tsx +0 -16
  108. package/src/components/checkout/summary/components/getPriceBreakdownString.ts +0 -66
  109. package/src/components/checkout/summary/index.ts +0 -2
  110. package/src/components/checkout/types.ts +0 -82
  111. package/src/components/common/CollapsableSectionIcon.tsx +0 -9
  112. package/src/components/common/Icon.tsx +0 -61
  113. package/src/components/common/InformationTooltip.tsx +0 -28
  114. package/src/components/common/LongText.tsx +0 -100
  115. package/src/components/common/PoweredByStigg.tsx +0 -59
  116. package/src/components/common/ProgressBar.tsx +0 -41
  117. package/src/components/common/StatusChip.tsx +0 -29
  118. package/src/components/common/TiersSelectContainer.tsx +0 -39
  119. package/src/components/common/Typography.tsx +0 -117
  120. package/src/components/common/VolumeBulkSelect.tsx +0 -74
  121. package/src/components/common/VolumePerUnitInput.tsx +0 -42
  122. package/src/components/common/chart/chartjs.helpers.ts +0 -17
  123. package/src/components/common/chart/chartjs.plugins.ts +0 -34
  124. package/src/components/common/chart/chartjs.theme.ts +0 -41
  125. package/src/components/common/chart/chartjs.tooltip.plugin.tsx +0 -224
  126. package/src/components/common/customIcons.ts +0 -24
  127. package/src/components/common/iconColor.ts +0 -15
  128. package/src/components/common/mapExternalTheme.ts +0 -147
  129. package/src/components/common/mediaQuery.ts +0 -19
  130. package/src/components/common/table/DataRows.tsx +0 -33
  131. package/src/components/common/table/EmptyState.tsx +0 -19
  132. package/src/components/common/table/ErrorState.tsx +0 -19
  133. package/src/components/common/table/GenericTable.tsx +0 -155
  134. package/src/components/common/table/LoadingRows.tsx +0 -33
  135. package/src/components/common/table/index.ts +0 -6
  136. package/src/components/common/table/types.ts +0 -30
  137. package/src/components/credits/balance/CreditBalance.tsx +0 -70
  138. package/src/components/credits/balance/CreditBalanceValue.tsx +0 -60
  139. package/src/components/credits/creditUsageChart/CreditUsage.chartjs.ts +0 -223
  140. package/src/components/credits/creditUsageChart/CreditUsageChart.tsx +0 -128
  141. package/src/components/credits/creditUsageChart/CreditUsageChartEmptyState.tsx +0 -29
  142. package/src/components/credits/creditUsageChart/CreditUsageChartErrorState.tsx +0 -19
  143. package/src/components/credits/creditUsageChart/CreditUsageChartHeader.tsx +0 -104
  144. package/src/components/credits/creditUsageChart/CreditUsageChartTooltip.tsx +0 -93
  145. package/src/components/credits/creditUsageChart/CreditUsageLegend.tsx +0 -141
  146. package/src/components/credits/creditUsageChart/types.ts +0 -4
  147. package/src/components/credits/grants/CreditGrants.tsx +0 -64
  148. package/src/components/credits/grants/CreditGrantsTable.tsx +0 -101
  149. package/src/components/credits/grants/types.ts +0 -38
  150. package/src/components/credits/grants/utils.ts +0 -25
  151. package/src/components/credits/hooks/useCreditBalance.ts +0 -75
  152. package/src/components/credits/hooks/useCreditGrants.ts +0 -40
  153. package/src/components/credits/hooks/useCreditUsage.ts +0 -50
  154. package/src/components/credits/index.ts +0 -15
  155. package/src/components/credits/localization.ts +0 -25
  156. package/src/components/credits/utilization/CreditUtilization.tsx +0 -74
  157. package/src/components/credits/utilization/CreditUtilizationValue.tsx +0 -113
  158. package/src/components/credits/utils/creditBalanceUtils.ts +0 -31
  159. package/src/components/credits/utils/creditGrantUtils.ts +0 -27
  160. package/src/components/customerPortal/CustomerPortal.style.ts +0 -20
  161. package/src/components/customerPortal/CustomerPortal.tsx +0 -37
  162. package/src/components/customerPortal/CustomerPortalContainer.tsx +0 -77
  163. package/src/components/customerPortal/CustomerPortalContext.ts +0 -32
  164. package/src/components/customerPortal/CustomerPortalHeader.tsx +0 -18
  165. package/src/components/customerPortal/CustomerPortalProvider.tsx +0 -49
  166. package/src/components/customerPortal/billing/InformationGrid.tsx +0 -54
  167. package/src/components/customerPortal/billing/InvoicesSection.tsx +0 -41
  168. package/src/components/customerPortal/billing/PaymentDetailsSection.tsx +0 -140
  169. package/src/components/customerPortal/common/ExternalLinkButton.tsx +0 -34
  170. package/src/components/customerPortal/common/SectionContainer.tsx +0 -22
  171. package/src/components/customerPortal/common/SectionHeader.ts +0 -15
  172. package/src/components/customerPortal/common/SectionTitle.tsx +0 -23
  173. package/src/components/customerPortal/common/SkeletonButton.tsx +0 -5
  174. package/src/components/customerPortal/common/StyledButton.tsx +0 -13
  175. package/src/components/customerPortal/customerPortalTextOverrides.ts +0 -39
  176. package/src/components/customerPortal/customerPortalTheme.ts +0 -35
  177. package/src/components/customerPortal/hooks/useCustomerPortal.ts +0 -39
  178. package/src/components/customerPortal/index.ts +0 -16
  179. package/src/components/customerPortal/paywall/CustomerPortalPaywall.style.ts +0 -33
  180. package/src/components/customerPortal/paywall/CustomerPortalPaywall.tsx +0 -36
  181. package/src/components/customerPortal/subscriptionOverview/ContactCustomerSupport.tsx +0 -50
  182. package/src/components/customerPortal/subscriptionOverview/SubscriptionOverviewLoader.tsx +0 -28
  183. package/src/components/customerPortal/subscriptionOverview/SubscriptionsOverview.tsx +0 -106
  184. package/src/components/customerPortal/subscriptionOverview/SubscriptionsOverviewHeader.tsx +0 -48
  185. package/src/components/customerPortal/subscriptionOverview/charges/ChargeItem.tsx +0 -74
  186. package/src/components/customerPortal/subscriptionOverview/charges/ChargeList.tsx +0 -65
  187. package/src/components/customerPortal/subscriptionOverview/subscriptionScheduledUpdates/SubscriptionScheduledUpdateRow.tsx +0 -110
  188. package/src/components/customerPortal/subscriptionOverview/subscriptionScheduledUpdates/SubscriptionScheduledUpdatesAlert.tsx +0 -158
  189. package/src/components/customerPortal/subscriptionOverview/subscriptionView/SubscriptionView.style.ts +0 -6
  190. package/src/components/customerPortal/subscriptionOverview/subscriptionView/SubscriptionView.tsx +0 -37
  191. package/src/components/customerPortal/subscriptionOverview/subscriptionView/TrialPanel.tsx +0 -58
  192. package/src/components/customerPortal/subscriptionOverview/tabs/AddonsList.tsx +0 -28
  193. package/src/components/customerPortal/subscriptionOverview/tabs/Promotions.tsx +0 -62
  194. package/src/components/customerPortal/subscriptionOverview/tabs/SubscriptionTabs.style.tsx +0 -32
  195. package/src/components/customerPortal/subscriptionOverview/tabs/SubscriptionTabs.tsx +0 -100
  196. package/src/components/customerPortal/subscriptionOverview/types/customerPortal.types.ts +0 -4
  197. package/src/components/customerPortal/subscriptionOverview/upcomingBilling/NextEstimatedBill.tsx +0 -29
  198. package/src/components/customerPortal/subscriptionOverview/upcomingBilling/NoUpcomingBilling.tsx +0 -18
  199. package/src/components/customerPortal/subscriptionOverview/upcomingBilling/UpcomingBilling.tsx +0 -89
  200. package/src/components/customerPortal/types.ts +0 -20
  201. package/src/components/customerPortal/usage/CustomerUsageData.style.tsx +0 -22
  202. package/src/components/customerPortal/usage/CustomerUsageData.tsx +0 -124
  203. package/src/components/customerPortal/usage/featureUsage/EntitlementCTAButton.tsx +0 -62
  204. package/src/components/customerPortal/usage/featureUsage/FeatureUsage.helper.ts +0 -45
  205. package/src/components/customerPortal/usage/featureUsage/FeatureUsage.style.ts +0 -13
  206. package/src/components/customerPortal/usage/featureUsage/FeatureUsage.tsx +0 -96
  207. package/src/components/customerPortal/usage/featureUsage/FeatureUsageProgressBar.tsx +0 -56
  208. package/src/components/guards/BooleanEntitlementGuard.tsx +0 -21
  209. package/src/components/guards/EnumEntitlementGuard.tsx +0 -17
  210. package/src/components/guards/MeteredEntitlementGuard.tsx +0 -21
  211. package/src/components/guards/NumericEntitlementGuard.tsx +0 -21
  212. package/src/components/hooks/index.ts +0 -1
  213. package/src/components/hooks/useChargeSort.ts +0 -17
  214. package/src/components/hooks/useIsScreenWiderThan.ts +0 -6
  215. package/src/components/hooks/useWaitForCheckoutCompleted.ts +0 -65
  216. package/src/components/paywall/BillingPeriodPicker.tsx +0 -90
  217. package/src/components/paywall/EntitlementRow.tsx +0 -127
  218. package/src/components/paywall/Paywall.tsx +0 -189
  219. package/src/components/paywall/PaywallContainer.tsx +0 -119
  220. package/src/components/paywall/PaywallLoader.tsx +0 -96
  221. package/src/components/paywall/PlanCompatibleAddons.tsx +0 -127
  222. package/src/components/paywall/PlanEntitlements.tsx +0 -75
  223. package/src/components/paywall/PlanOffering.tsx +0 -256
  224. package/src/components/paywall/PlanOfferingButton.tsx +0 -232
  225. package/src/components/paywall/PlanPrice.tsx +0 -154
  226. package/src/components/paywall/hooks/useLoadPaywallData.ts +0 -75
  227. package/src/components/paywall/index.ts +0 -5
  228. package/src/components/paywall/paywallTextOverrides.ts +0 -79
  229. package/src/components/paywall/types.ts +0 -80
  230. package/src/components/paywall/utils/calculateTrialDaysLeft.ts +0 -5
  231. package/src/components/paywall/utils/calculateUnitQuantityText.ts +0 -23
  232. package/src/components/paywall/utils/computeDefaultBillingPeriod.ts +0 -36
  233. package/src/components/paywall/utils/getPlansToDisplay.ts +0 -13
  234. package/src/components/paywall/utils/hasPricePoints.ts +0 -10
  235. package/src/components/paywall/utils/mapPaywallData.ts +0 -126
  236. package/src/components/utils/calculateDiscountRate.ts +0 -49
  237. package/src/components/utils/currencyUtils.ts +0 -38
  238. package/src/components/utils/dateUtils.ts +0 -17
  239. package/src/components/utils/fixtures/price.fixtures.ts +0 -42
  240. package/src/components/utils/formatNumber.ts +0 -5
  241. package/src/components/utils/getFeatureName.ts +0 -26
  242. package/src/components/utils/getPaidPriceText.ts +0 -77
  243. package/src/components/utils/getPlanPrice.ts +0 -62
  244. package/src/components/utils/getSubscriptionScheduleUpdateTexts.tsx +0 -88
  245. package/src/components/utils/numberUtils.ts +0 -6
  246. package/src/components/utils/onWheelBlur.ts +0 -3
  247. package/src/components/utils/planPrices.ts +0 -10
  248. package/src/components/utils/priceTierUtils.spec.ts +0 -84
  249. package/src/components/utils/priceTierUtils.ts +0 -250
  250. package/src/components/utils/priceUtils.ts +0 -11
  251. package/src/custom.d.ts +0 -6
  252. package/src/hooks/index.ts +0 -8
  253. package/src/hooks/useActiveSubscriptions.ts +0 -21
  254. package/src/hooks/useBooleanEntitlement.ts +0 -20
  255. package/src/hooks/useCustomerPortal.ts +0 -21
  256. package/src/hooks/useEnumEntitlement.ts +0 -20
  257. package/src/hooks/useFetch.ts +0 -32
  258. package/src/hooks/useMeteredEntitlement.ts +0 -20
  259. package/src/hooks/useNumericEntitlement.ts +0 -20
  260. package/src/hooks/usePaywall.ts +0 -21
  261. package/src/hooks/useStiggContext.ts +0 -13
  262. package/src/index.ts +0 -103
  263. package/src/services/logger.ts +0 -22
  264. package/src/stories/Checkout.stories.tsx +0 -123
  265. package/src/stories/CreditBalance.stories.tsx +0 -248
  266. package/src/stories/CreditGrants.stories.tsx +0 -210
  267. package/src/stories/CreditUsageChart.stories.tsx +0 -347
  268. package/src/stories/CreditUtilization.stories.tsx +0 -287
  269. package/src/stories/CustomTheme.ts +0 -57
  270. package/src/stories/CustomerPortal.stories.tsx +0 -265
  271. package/src/stories/GenericTable.stories.tsx +0 -263
  272. package/src/stories/Paywall.stories.tsx +0 -147
  273. package/src/stories/ProgressBar.stories.tsx +0 -103
  274. package/src/stories/StatusChip.stories.tsx +0 -154
  275. package/src/stories/baseArgs.ts +0 -10
  276. package/src/stories/mocks/checkout/consts.ts +0 -15
  277. package/src/stories/mocks/checkout/mockCheckoutPreview.ts +0 -152
  278. package/src/stories/mocks/checkout/mockCheckoutState.ts +0 -212
  279. package/src/styles.css +0 -46
  280. package/src/theme/Fonts.tsx +0 -80
  281. package/src/theme/Theme.tsx +0 -64
  282. package/src/theme/emotion.d.ts +0 -17
  283. package/src/theme/getResolvedTheme.ts +0 -135
  284. package/src/theme/types.ts +0 -85
  285. package/src/types.ts +0 -22
  286. package/src/utils/styledUtils.ts +0 -64
@@ -1,224 +0,0 @@
1
- import { Chart, ChartEvent, ChartType, TooltipModel } from 'chart.js';
2
- import React, { useCallback, useEffect, useRef, useState } from 'react';
3
- import styled from '@utils/style';
4
- import { Box } from '@mui/material';
5
- import { EventContext } from 'chartjs-plugin-annotation';
6
- import debounce from 'lodash/debounce';
7
-
8
- const CLOSE_DELAY = 300;
9
-
10
- export type ExternalTooltipHandler<TType extends ChartType> = (context: {
11
- chart: Chart;
12
- tooltip: TooltipModel<TType>;
13
- }) => void;
14
-
15
- export type AnnotationTooltipHandler = (isMouseOver: boolean, context: EventContext, event: ChartEvent) => void;
16
-
17
- export type ExternalTooltipInfo<TPayload> = {
18
- positionTop: number;
19
- positionLeft: number;
20
- isOpen: boolean;
21
- payload?: TPayload;
22
- };
23
-
24
- type ChartJsExternalTooltipProps = {
25
- tooltipInfo: ExternalTooltipInfo<unknown>;
26
- children: React.ReactElement<any, any>;
27
- $padding?: number;
28
- placement?: 'top' | 'bottom' | 'left' | 'right';
29
- };
30
-
31
- export type ExternalTooltipTranslateFunc<TType extends ChartType, TPayload> = (
32
- tooltip: TooltipModel<TType>,
33
- ) => TPayload | undefined;
34
- export type AnnotationTooltipTranslateFunc<TPayload> = (
35
- context: EventContext,
36
- event: ChartEvent,
37
- ) => TPayload | undefined;
38
-
39
- type TooltipPosition = { top: number; left: number };
40
- type ChartJsExternalTooltipPositioner<TType extends ChartType> = (
41
- chart: Chart,
42
- tooltip: TooltipModel<TType>,
43
- ) => TooltipPosition;
44
-
45
- export function bottomBarTooltipPositioner(chart: Chart, tooltip: TooltipModel<'bar'>): TooltipPosition {
46
- // For stacked bars, we need to calculate the center of the specific segment
47
- // The caretY gives us the top of the segment, so we need to find the center
48
- const dataPoint = tooltip.dataPoints[0];
49
-
50
- // Calculate the center of the specific segment
51
- // We'll estimate the segment height based on the parsed value and scale
52
- const parsedValue = dataPoint.parsed.y;
53
- const yScale = chart.scales.y;
54
-
55
- // Calculate the height of this segment in pixels
56
- const segmentHeight = (parsedValue / yScale.max) * (yScale.bottom - yScale.top);
57
- const segmentCenterY = tooltip.caretY + segmentHeight / 2;
58
-
59
- // Get the bar element to find its left edge
60
- const bar = chart.getDatasetMeta(dataPoint.datasetIndex).data[dataPoint.dataIndex];
61
- const barLeftEdge = bar.x - (bar as any).width / 2;
62
-
63
- const top = chart.canvas.offsetTop + segmentCenterY;
64
- const left = chart.canvas.offsetLeft + barLeftEdge;
65
-
66
- return { top, left };
67
- }
68
-
69
- function defaultExternalTooltipPosition<TType extends ChartType>(
70
- chart: Chart,
71
- tooltip: TooltipModel<TType>,
72
- ): TooltipPosition {
73
- const top = chart.canvas.offsetTop + tooltip.caretY;
74
- const left = chart.canvas.offsetLeft + tooltip.caretX;
75
-
76
- return { top, left };
77
- }
78
-
79
- export function useChartJsExternalTooltip<TType extends ChartType, TPayload>(
80
- translate: ExternalTooltipTranslateFunc<TType, TPayload>,
81
- positioner: ChartJsExternalTooltipPositioner<TType> = defaultExternalTooltipPosition,
82
- ) {
83
- const [positionTop, setPositionTop] = useState(0);
84
- const [positionLeft, setPositionLeft] = useState(0);
85
- const [isOpen, setIsOpen] = useState(false);
86
- const [payload, setPayload] = useState<TPayload>();
87
-
88
- const tooltipHandler: ExternalTooltipHandler<TType> = useCallback(
89
- (context: { chart: Chart; tooltip: TooltipModel<TType> }) => {
90
- const { chart, tooltip } = context;
91
-
92
- // Hide if no tooltip
93
- if (tooltip.opacity === 0) {
94
- setIsOpen(false);
95
- return;
96
- }
97
-
98
- const { top, left } = positioner(chart, tooltip);
99
-
100
- setPositionLeft(left);
101
- setPositionTop(top);
102
- setPayload(translate(tooltip));
103
- setIsOpen(true);
104
- },
105
- [translate, positioner],
106
- );
107
-
108
- const tooltipInfo: ExternalTooltipInfo<TPayload> = {
109
- positionTop,
110
- positionLeft,
111
- isOpen,
112
- payload,
113
- };
114
-
115
- return {
116
- tooltipInfo,
117
- tooltipHandler,
118
- };
119
- }
120
-
121
- export function useChartJsAnnotationExternalTooltip<TPayload>(translate: AnnotationTooltipTranslateFunc<TPayload>) {
122
- const [positionTop, setPositionTop] = useState(0);
123
- const [positionLeft, setPositionLeft] = useState(0);
124
- const [isOpen, setIsOpen] = useState(false);
125
- const [payload, setPayload] = useState<TPayload>();
126
-
127
- const tooltipHandler: AnnotationTooltipHandler = useCallback(
128
- (isMouseOver: boolean, context: EventContext, event: ChartEvent) => {
129
- const { chart } = context;
130
- const { x, y } = event;
131
-
132
- if (!isMouseOver || !x || !y) {
133
- setIsOpen(false);
134
- return;
135
- }
136
-
137
- setPositionLeft(chart.canvas.offsetLeft + context.element.x);
138
- setPositionTop(chart.canvas.offsetTop + context.element.y - context.element.height);
139
- setPayload(translate(context, event));
140
- setIsOpen(true);
141
- },
142
- [translate],
143
- );
144
-
145
- const tooltipInfo: ExternalTooltipInfo<TPayload> = {
146
- positionTop,
147
- positionLeft,
148
- isOpen,
149
- payload,
150
- };
151
-
152
- return {
153
- tooltipInfo,
154
- tooltipHandler,
155
- };
156
- }
157
-
158
- const AnchorBox = styled(Box)`
159
- position: absolute;
160
- `;
161
-
162
- const CustomTooltip = styled.div<{ $isOpen: boolean; $padding?: number }>`
163
- position: absolute;
164
- background-color: white;
165
- border-radius: 8px;
166
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
167
- padding: ${({ $padding = 16 }) => $padding}px;
168
- max-width: 500px;
169
- z-index: 1000;
170
- pointer-events: none;
171
- opacity: ${({ $isOpen }) => ($isOpen ? 1 : 0)};
172
- transition: opacity 0.2s ease-in-out;
173
- transform: translateY(-50%); /* Center vertically on the anchor point */
174
-
175
- &::before {
176
- content: '';
177
- position: absolute;
178
- width: 0;
179
- height: 0;
180
- border: 8px solid transparent;
181
- border-left-color: white;
182
- right: -16px;
183
- top: 50%;
184
- transform: translateY(-50%);
185
- filter: drop-shadow(2px 0 2px rgba(0, 0, 0, 0.1));
186
- }
187
- `;
188
-
189
- export const ChartJsExternalTooltip = ({
190
- children,
191
- tooltipInfo: { positionTop, positionLeft, payload, isOpen },
192
- $padding,
193
- }: ChartJsExternalTooltipProps) => {
194
- const [isTooltipHover, setIsTooltipHover] = useState(false);
195
- const [shouldBeOpened, setShouldBeOpened] = useState(false);
196
-
197
- const closeDebounce = useRef(debounce(() => setShouldBeOpened(false), CLOSE_DELAY));
198
-
199
- useEffect(() => {
200
- if (Boolean(payload) && (isTooltipHover || isOpen)) {
201
- closeDebounce.current.cancel();
202
- setShouldBeOpened(true);
203
- } else {
204
- closeDebounce.current();
205
- }
206
- }, [payload, isTooltipHover, isOpen]);
207
-
208
- return (
209
- <>
210
- <AnchorBox style={{ top: positionTop, left: positionLeft }} />
211
- <CustomTooltip
212
- $isOpen={shouldBeOpened}
213
- $padding={$padding}
214
- style={{
215
- top: positionTop, // Use the exact center of the bar segment
216
- left: positionLeft - 140, // Position close to the left of the bar
217
- }}
218
- onMouseEnter={() => setIsTooltipHover(true)}
219
- onMouseLeave={() => setIsTooltipHover(false)}>
220
- {children}
221
- </CustomTooltip>
222
- </>
223
- );
224
- };
@@ -1,24 +0,0 @@
1
- export { default as Addons } from '../../assets/addons.svg';
2
- export { default as BillingInfoCustomer } from '../../assets/billing-info-customer.svg';
3
- export { default as ContactSupport } from '../../assets/contact-support.svg';
4
- export { default as CreditCard } from '../../assets/credit-card.svg';
5
- export { default as DollarCoin } from '../../assets/dollar-coin.svg';
6
- export { default as MiniSchedule } from '../../assets/mini-schedule.svg';
7
- export { default as Promotions } from '../../assets/promotions.svg';
8
- export { default as Restore } from '../../assets/restore.svg';
9
- export { default as ScheduleBox } from '../../assets/schedule-box.svg';
10
- export { default as ScheduleClock } from '../../assets/schedule.svg';
11
- export { default as RenewSubscription } from '../../assets/subscription-renews-icon.svg';
12
- export { default as Trash } from '../../assets/trash.svg';
13
- export { default as PaymentMethod } from '../../assets/payment-method.svg';
14
- export { default as OutlinedCircle } from '../../assets/outlined-circle.svg';
15
- export { default as OutlinedCheckedCircle } from '../../assets/outlined-checked-circle.svg';
16
- export { default as OutlinedCheckedCircleDisabled } from '../../assets/outlined-checked-circle-disabled.svg';
17
- export { default as ArrowForward } from '../../assets/arrow-forward.svg';
18
- export { default as Close } from '../../assets/close.svg';
19
- export { default as Check } from '../../assets/check.svg';
20
- export { default as PayAsYouGoCharge } from '../../assets/pay-as-you-go-charge.svg';
21
- export { default as Coupon } from '../../assets/coupon.svg';
22
- export { default as Add } from '../../assets/add.svg';
23
- export { default as Remove } from '../../assets/remove.svg';
24
- export { default as EntitlementCheck } from '../../assets/entitlement-check.svg';
@@ -1,15 +0,0 @@
1
- import { Theme } from '@emotion/react';
2
- import { IconColorValue } from './Icon';
3
-
4
- export type IconColor = 'primary' | 'secondary';
5
-
6
- export const getIconColor = (color: IconColorValue | undefined, theme: Theme) => {
7
- switch (color) {
8
- case 'primary':
9
- return theme.stigg.palette.text.primary;
10
- case 'secondary':
11
- return theme.stigg.palette.text.secondary;
12
- default:
13
- return color;
14
- }
15
- };
@@ -1,147 +0,0 @@
1
- import {
2
- Alignment,
3
- CheckoutConfiguration,
4
- CustomerPortalConfiguration,
5
- FontWeight as JSFontWeight,
6
- PaywallConfiguration,
7
- TypographyConfiguration,
8
- } from '@stigg/js-client-sdk';
9
- import { CustomizedTheme } from '../../theme/Theme';
10
- import { HorizontalAlignment } from '../../theme/types';
11
- import { defaultCheckoutTypography } from '../checkout/configurations/typography';
12
-
13
- function addCssUnits(value?: number | null, unit = 'px') {
14
- if (!value) {
15
- return undefined;
16
- }
17
- return `${value}${unit}`;
18
- }
19
-
20
- function mapFontWeight(fontWeight?: JSFontWeight | null): 'bold' | 'normal' {
21
- if (!fontWeight) {
22
- return 'normal';
23
- }
24
-
25
- switch (fontWeight) {
26
- case JSFontWeight.Normal:
27
- return 'normal';
28
- case JSFontWeight.Bold:
29
- return 'bold';
30
- default:
31
- return 'normal';
32
- }
33
- }
34
-
35
- export function mapTypography(
36
- typography?: TypographyConfiguration | null,
37
- defaultTypography?: typeof defaultCheckoutTypography | null,
38
- ): CustomizedTheme['typography'] {
39
- const defaults = defaultTypography || {
40
- h1: { fontSize: '32px', fontWeight: 'bold' as const, semanticElement: 'h1' as const },
41
- h2: { fontSize: '24px', fontWeight: 'normal' as const, semanticElement: 'h2' as const },
42
- h3: { fontSize: '16px', fontWeight: 'normal' as const, semanticElement: 'h3' as const },
43
- body: { fontSize: '14px', fontWeight: 'normal' as const, semanticElement: 'p' as const },
44
- };
45
-
46
- return {
47
- fontFamilyUrl: typography?.fontFamily || undefined,
48
- h1: {
49
- fontSize: addCssUnits(typography?.h1?.fontSize) || defaults.h1.fontSize,
50
- fontWeight: mapFontWeight(typography?.h1?.fontWeight) || defaults.h1.fontWeight,
51
- semanticElement: defaults.h1.semanticElement,
52
- },
53
- h2: {
54
- fontSize: addCssUnits(typography?.h2?.fontSize) || defaults.h2.fontSize,
55
- fontWeight: mapFontWeight(typography?.h2?.fontWeight) || defaults.h2.fontWeight,
56
- semanticElement: defaults.h2.semanticElement,
57
- },
58
- h3: {
59
- fontSize: addCssUnits(typography?.h3?.fontSize) || defaults.h3.fontSize,
60
- fontWeight: mapFontWeight(typography?.h3?.fontWeight) || defaults.h3.fontWeight,
61
- semanticElement: defaults.h3.semanticElement,
62
- },
63
- body: {
64
- fontSize: addCssUnits(typography?.body?.fontSize) || defaults.body.fontSize,
65
- fontWeight: mapFontWeight(typography?.body?.fontWeight) || defaults.body.fontWeight,
66
- semanticElement: defaults.body.semanticElement,
67
- },
68
- };
69
- }
70
-
71
- function mapAlignment(alignment?: Alignment | null): HorizontalAlignment | undefined {
72
- if (!alignment) {
73
- return undefined;
74
- }
75
-
76
- switch (alignment) {
77
- case Alignment.Left:
78
- return 'left';
79
- case Alignment.Center:
80
- return 'center';
81
- case Alignment.Right:
82
- return 'right';
83
- default: {
84
- return undefined;
85
- }
86
- }
87
- }
88
-
89
- export function mapCustomerPortalConfiguration(configuration: CustomerPortalConfiguration): CustomizedTheme {
90
- const { palette, customCss, typography } = configuration;
91
- return {
92
- palette: {
93
- primary: palette?.primary || undefined,
94
- backgroundPaper: palette?.paywallBackgroundColor || undefined,
95
- outlinedBorder: palette?.borderColor || undefined,
96
- backgroundHighlight: palette?.currentPlanBackground || undefined,
97
- text: {
98
- primary: palette?.textColor || undefined,
99
- },
100
- },
101
- typography: mapTypography(typography),
102
- customCss: customCss || undefined,
103
- };
104
- }
105
-
106
- export function mapPaywallConfiguration(paywallConfiguration: PaywallConfiguration): CustomizedTheme {
107
- const { palette, layout, customCss, typography } = paywallConfiguration;
108
- return {
109
- customCss: customCss || undefined,
110
- palette: {
111
- primary: palette?.primary || undefined,
112
- backgroundPaper: palette?.backgroundColor || undefined,
113
- outlinedBorder: palette?.borderColor || undefined,
114
- backgroundHighlight: palette?.currentPlanBackground || undefined,
115
- text: {
116
- primary: palette?.textColor || undefined,
117
- },
118
- },
119
- typography: mapTypography(typography),
120
- layout: {
121
- ctaAlignment: mapAlignment(layout?.alignment),
122
- headerAlignment: mapAlignment(layout?.alignment),
123
- descriptionAlignment: mapAlignment(layout?.alignment),
124
- planMaxWidth: addCssUnits(layout?.planWidth),
125
- planMinWidth: addCssUnits(layout?.planWidth),
126
- planMargin: addCssUnits(layout?.planMargin),
127
- planPadding: addCssUnits(layout?.planPadding),
128
- },
129
- };
130
- }
131
-
132
- export function mapCheckoutConfiguration(configuration: CheckoutConfiguration): CustomizedTheme {
133
- const { palette, typography, customCss } = configuration;
134
- return {
135
- palette: {
136
- primary: palette?.primary || undefined,
137
- backgroundPaper: palette?.backgroundColor || undefined,
138
- outlinedBorder: palette?.borderColor || undefined,
139
- text: {
140
- primary: palette?.textColor || undefined,
141
- },
142
- backgroundHighlight: palette?.summaryBackgroundColor || undefined,
143
- },
144
- typography: mapTypography(typography, defaultCheckoutTypography),
145
- customCss: customCss || undefined,
146
- };
147
- }
@@ -1,19 +0,0 @@
1
- export const breakpoints = {
2
- xs: 320,
3
- sm: 640,
4
- md: 768,
5
- lg: 1024,
6
- xl: 1280,
7
- xxl: 1536,
8
- } as const;
9
-
10
- export type Breakpoints = typeof breakpoints;
11
-
12
- export type Breakpoint = keyof Breakpoints;
13
-
14
- export const mqMinWidth = (breakpoint: Breakpoint) => `(min-width: ${breakpoints[breakpoint]}px)`;
15
-
16
- export const mq = Object.keys(breakpoints).reduce(
17
- (obj, breakpoint) => ({ ...obj, [breakpoint]: `@media ${mqMinWidth(breakpoint as Breakpoint)}` }),
18
- {} as Record<Breakpoint, string>,
19
- );
@@ -1,33 +0,0 @@
1
- import { ClickableRow, StyledTableCell, CellContent } from './GenericTable';
2
- import { HeadCell } from './types';
3
-
4
- interface DataRowsProps<T> {
5
- data: T[];
6
- visibleHeadCells: Array<HeadCell<T>>;
7
- onRowClick?: (item: T) => void;
8
- hideLastRowBorder: boolean;
9
- }
10
-
11
- export function DataRows<T>({ data, visibleHeadCells, onRowClick, hideLastRowBorder }: DataRowsProps<T>) {
12
- return (
13
- <>
14
- {data.map((item, index) => (
15
- <ClickableRow key={index} $clickable={!!onRowClick} onClick={() => onRowClick && onRowClick(item)}>
16
- {visibleHeadCells.map((headCell) => (
17
- <StyledTableCell
18
- key={String(headCell.id)}
19
- $alignment={headCell.alignment}
20
- $width={headCell.width}
21
- $maxWidth={headCell.maxWidth}
22
- $minWidth={headCell.minWidth}
23
- $isLastRow={index === data.length - 1}
24
- $hideLastRowBorder={hideLastRowBorder}
25
- onClick={headCell.disableClick ? (e) => e.stopPropagation() : undefined}>
26
- <CellContent $alignment={headCell.alignment}>{headCell.render(item)}</CellContent>
27
- </StyledTableCell>
28
- ))}
29
- </ClickableRow>
30
- ))}
31
- </>
32
- );
33
- }
@@ -1,19 +0,0 @@
1
- import { ReactNode } from 'react';
2
- import { Typography } from '../Typography';
3
-
4
- interface EmptyStateProps {
5
- message?: ReactNode;
6
- className?: string;
7
- }
8
-
9
- export function EmptyState({ message, className }: EmptyStateProps) {
10
- if (message === undefined || typeof message === 'string') {
11
- return (
12
- <Typography variant="body1" color="secondary" className={className}>
13
- {message || 'No data available'}
14
- </Typography>
15
- );
16
- }
17
-
18
- return <>{message}</>;
19
- }
@@ -1,19 +0,0 @@
1
- import { ReactNode } from 'react';
2
- import { Typography } from '../Typography';
3
-
4
- interface ErrorStateProps {
5
- errorMessage?: ReactNode;
6
- className?: string;
7
- }
8
-
9
- export function ErrorState({ errorMessage, className }: ErrorStateProps) {
10
- if (errorMessage === undefined || typeof errorMessage === 'string') {
11
- return (
12
- <Typography variant="body1" color="error" className={className}>
13
- {errorMessage || 'An error occurred'}
14
- </Typography>
15
- );
16
- }
17
-
18
- return <>{errorMessage}</>;
19
- }
@@ -1,155 +0,0 @@
1
- import styled from '@utils/style';
2
- import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from '@mui/material';
3
- import { Typography } from '../Typography';
4
- import { GenericTableProps, TableAlignment, PixelWidth, HeadCell } from './types';
5
- import { LoadingRows } from './LoadingRows';
6
- import { DataRows } from './DataRows';
7
- import { ErrorState } from './ErrorState';
8
- import { EmptyState } from './EmptyState';
9
-
10
- const StyledTableContainer = styled(TableContainer)<{
11
- $hasMinHeight?: boolean;
12
- }>`
13
- border-radius: 8px;
14
- border: 1px solid ${({ theme }) => theme.stigg.palette.outlinedBorder};
15
- background-color: ${({ theme }) => theme.stigg.palette.backgroundPaper};
16
- min-width: 100%;
17
- overflow-x: auto;
18
-
19
- ${({ $hasMinHeight }) =>
20
- $hasMinHeight &&
21
- `
22
- min-height: 160px;
23
- display: flex;
24
- align-items: center;
25
- justify-content: center;
26
- `}
27
- `;
28
-
29
- const StyledTable = styled(Table)`
30
- min-width: 600px;
31
- table-layout: auto;
32
- width: 100%;
33
- `;
34
-
35
- export const StyledTableCell = styled(TableCell)<{
36
- $alignment?: TableAlignment;
37
- $width?: PixelWidth;
38
- $maxWidth?: PixelWidth;
39
- $minWidth?: PixelWidth;
40
- $isLastRow?: boolean;
41
- $hideLastRowBorder?: boolean;
42
- }>`
43
- padding: 8px 12px;
44
- border-bottom: 1px solid ${({ theme }) => theme.stigg.palette.outlinedBorder};
45
- text-align: ${({ $alignment }) => $alignment || 'left'};
46
- white-space: nowrap;
47
- overflow: hidden;
48
- text-overflow: ellipsis;
49
-
50
- ${({ $width }) => $width && `width: ${$width};`}
51
- ${({ $maxWidth }) => $maxWidth && `max-width: ${$maxWidth};`}
52
- ${({ $minWidth }) => $minWidth && `min-width: ${$minWidth};`}
53
-
54
- ${({ $isLastRow, $hideLastRowBorder }) => $isLastRow && $hideLastRowBorder && `border-bottom: none;`}
55
- `;
56
-
57
- const StyledHeaderCell = styled(StyledTableCell)`
58
- background-color: transparent;
59
- `;
60
-
61
- export const ClickableRow = styled(TableRow)<{ $clickable?: boolean }>`
62
- ${({ $clickable, theme }) =>
63
- $clickable &&
64
- `
65
- cursor: pointer;
66
- &:hover {
67
- background-color: ${theme.stigg.palette.backgroundHighlight};
68
- }
69
- `}
70
- `;
71
-
72
- export const CellContent = styled.div<{ $alignment?: TableAlignment }>`
73
- display: flex;
74
- align-items: center;
75
- justify-content: ${({ $alignment }) => {
76
- switch ($alignment) {
77
- case 'center':
78
- return 'center';
79
- case 'right':
80
- return 'flex-end';
81
- default:
82
- return 'flex-start';
83
- }
84
- }};
85
- width: 100%;
86
- `;
87
-
88
- interface TableHeaderProps<T> {
89
- visibleHeadCells: Array<HeadCell<T>>;
90
- }
91
-
92
- function TableHeader<T>({ visibleHeadCells }: TableHeaderProps<T>) {
93
- return (
94
- <TableHead>
95
- <TableRow>
96
- {visibleHeadCells.map((headCell) => (
97
- <StyledHeaderCell
98
- key={String(headCell.id)}
99
- $alignment={headCell.alignment}
100
- $width={headCell.width}
101
- $maxWidth={headCell.maxWidth}
102
- $minWidth={headCell.minWidth}>
103
- <Typography variant="caption">{headCell.label}</Typography>
104
- </StyledHeaderCell>
105
- ))}
106
- </TableRow>
107
- </TableHead>
108
- );
109
- }
110
-
111
- export function GenericTable<T>({
112
- data,
113
- headCells,
114
- isLoading = false,
115
- error = null,
116
- emptyMessage,
117
- errorMessage,
118
- onRowClick,
119
- className,
120
- skeletonRows = 3,
121
- hideLastRowBorder = true,
122
- }: GenericTableProps<T>) {
123
- const visibleHeadCells = headCells.filter((cell) => cell.visible !== false);
124
- const hasErrorOrEmptyState = !!error || (!isLoading && data.length === 0);
125
-
126
- return (
127
- <StyledTableContainer className={className} $hasMinHeight={hasErrorOrEmptyState}>
128
- {error ? (
129
- <ErrorState errorMessage={errorMessage} className={`${className}-error`} />
130
- ) : !isLoading && data.length === 0 ? (
131
- <EmptyState message={emptyMessage} className={`${className}-empty`} />
132
- ) : (
133
- <StyledTable>
134
- <TableHeader visibleHeadCells={visibleHeadCells} />
135
- <TableBody>
136
- {isLoading ? (
137
- <LoadingRows
138
- skeletonRows={skeletonRows}
139
- visibleHeadCells={visibleHeadCells}
140
- hideLastRowBorder={hideLastRowBorder}
141
- />
142
- ) : (
143
- <DataRows
144
- data={data}
145
- visibleHeadCells={visibleHeadCells}
146
- onRowClick={onRowClick}
147
- hideLastRowBorder={hideLastRowBorder}
148
- />
149
- )}
150
- </TableBody>
151
- </StyledTable>
152
- )}
153
- </StyledTableContainer>
154
- );
155
- }
@@ -1,33 +0,0 @@
1
- import { TableRow } from '@mui/material';
2
- import Skeleton from 'react-loading-skeleton';
3
- import { StyledTableCell } from './GenericTable';
4
- import { HeadCell } from './types';
5
-
6
- interface LoadingRowsProps<T> {
7
- skeletonRows: number;
8
- visibleHeadCells: Array<HeadCell<T>>;
9
- hideLastRowBorder: boolean;
10
- }
11
-
12
- export function LoadingRows<T>({ skeletonRows, visibleHeadCells, hideLastRowBorder }: LoadingRowsProps<T>) {
13
- return (
14
- <>
15
- {Array.from({ length: skeletonRows }).map((_, index) => (
16
- <TableRow key={index}>
17
- {visibleHeadCells.map((headCell) => (
18
- <StyledTableCell
19
- key={String(headCell.id)}
20
- $alignment={headCell.alignment}
21
- $width={headCell.width}
22
- $maxWidth={headCell.maxWidth}
23
- $minWidth={headCell.minWidth}
24
- $isLastRow={index === skeletonRows - 1}
25
- $hideLastRowBorder={hideLastRowBorder}>
26
- <Skeleton width={headCell.width ? parseInt(headCell.width.replace('px', '')) - 40 : 100} height={20} />
27
- </StyledTableCell>
28
- ))}
29
- </TableRow>
30
- ))}
31
- </>
32
- );
33
- }