@servicetitan/marketing-ui 5.9.0 → 5.10.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 (163) hide show
  1. package/dist/components/ads/ads-stat.js +21 -10
  2. package/dist/components/ads/ads-stat.js.map +1 -1
  3. package/dist/components/charts/funnel-chart/components/funnel-chart.js +118 -6
  4. package/dist/components/charts/funnel-chart/components/funnel-chart.js.map +1 -1
  5. package/dist/components/charts/funnel-chart/components/funnel-chart.module.less.d.ts +9 -0
  6. package/dist/components/charts/funnel-chart/components/funnel-svg.js +62 -12
  7. package/dist/components/charts/funnel-chart/components/funnel-svg.js.map +1 -1
  8. package/dist/components/charts/funnel-chart/index.js +1 -0
  9. package/dist/components/charts/funnel-chart/index.js.map +1 -1
  10. package/dist/components/charts/funnel-chart/utils/const.js +1 -0
  11. package/dist/components/charts/funnel-chart/utils/const.js.map +1 -1
  12. package/dist/components/charts/funnel-chart/utils/interface.js +2 -1
  13. package/dist/components/charts/funnel-chart/utils/interface.js.map +1 -1
  14. package/dist/components/charts/line-chart/components/body.js +105 -16
  15. package/dist/components/charts/line-chart/components/body.js.map +1 -1
  16. package/dist/components/charts/line-chart/components/body.module.less.d.ts +4 -0
  17. package/dist/components/charts/line-chart/components/container.js +12 -4
  18. package/dist/components/charts/line-chart/components/container.js.map +1 -1
  19. package/dist/components/charts/line-chart/components/hover-popover.js +56 -13
  20. package/dist/components/charts/line-chart/components/hover-popover.js.map +1 -1
  21. package/dist/components/charts/line-chart/components/hover-popover.module.less.d.ts +5 -0
  22. package/dist/components/charts/line-chart/components/sidebar.js +35 -5
  23. package/dist/components/charts/line-chart/components/sidebar.js.map +1 -1
  24. package/dist/components/charts/line-chart/components/sidebar.module.less.d.ts +13 -0
  25. package/dist/components/charts/line-chart/components/stuff.js +73 -32
  26. package/dist/components/charts/line-chart/components/stuff.js.map +1 -1
  27. package/dist/components/charts/line-chart/components/stuff.module.less.d.ts +6 -0
  28. package/dist/components/charts/line-chart/components/svg-bars.js +58 -26
  29. package/dist/components/charts/line-chart/components/svg-bars.js.map +1 -1
  30. package/dist/components/charts/line-chart/components/svg-body.js +52 -11
  31. package/dist/components/charts/line-chart/components/svg-body.js.map +1 -1
  32. package/dist/components/charts/line-chart/components/svg-lines.js +46 -27
  33. package/dist/components/charts/line-chart/components/svg-lines.js.map +1 -1
  34. package/dist/components/charts/line-chart/components/svg.module.less.d.ts +5 -0
  35. package/dist/components/charts/line-chart/index.js +1 -0
  36. package/dist/components/charts/line-chart/index.js.map +1 -1
  37. package/dist/components/charts/line-chart/stores/line-chart.store.js +98 -137
  38. package/dist/components/charts/line-chart/stores/line-chart.store.js.map +1 -1
  39. package/dist/components/charts/line-chart/stores/svg.store.js +66 -108
  40. package/dist/components/charts/line-chart/stores/svg.store.js.map +1 -1
  41. package/dist/components/charts/line-chart/utils/const.js +8 -7
  42. package/dist/components/charts/line-chart/utils/const.js.map +1 -1
  43. package/dist/components/charts/line-chart/utils/formatters.js +13 -11
  44. package/dist/components/charts/line-chart/utils/formatters.js.map +1 -1
  45. package/dist/components/charts/line-chart/utils/interfaces.js +2 -1
  46. package/dist/components/charts/line-chart/utils/interfaces.js.map +1 -1
  47. package/dist/components/charts/line-chart/utils/internal-interfaces.js +2 -1
  48. package/dist/components/charts/line-chart/utils/internal-interfaces.js.map +1 -1
  49. package/dist/components/charts/line-chart/utils/key.js +2 -1
  50. package/dist/components/charts/line-chart/utils/key.js.map +1 -1
  51. package/dist/components/charts/line-chart/utils/labels.js +50 -46
  52. package/dist/components/charts/line-chart/utils/labels.js.map +1 -1
  53. package/dist/components/charts/pie-chart/components/pie-chart.js +60 -6
  54. package/dist/components/charts/pie-chart/components/pie-chart.js.map +1 -1
  55. package/dist/components/charts/pie-chart/components/pie-chart.module.less.d.ts +3 -0
  56. package/dist/components/charts/pie-chart/components/pie.js +176 -39
  57. package/dist/components/charts/pie-chart/components/pie.js.map +1 -1
  58. package/dist/components/charts/pie-chart/index.js +2 -0
  59. package/dist/components/charts/pie-chart/index.js.map +1 -1
  60. package/dist/components/charts/pie-chart/utils/const.js +55 -39
  61. package/dist/components/charts/pie-chart/utils/const.js.map +1 -1
  62. package/dist/components/charts/pie-chart/utils/interface.js +2 -1
  63. package/dist/components/charts/pie-chart/utils/interface.js.map +1 -1
  64. package/dist/components/image-cropper/image-cropper.js +74 -88
  65. package/dist/components/image-cropper/image-cropper.js.map +1 -1
  66. package/dist/components/stat/stat-card.js +68 -22
  67. package/dist/components/stat/stat-card.js.map +1 -1
  68. package/dist/components/stat/stat-card.module.less.d.ts +5 -0
  69. package/dist/components/stat/stat-extended-card.js +76 -4
  70. package/dist/components/stat/stat-extended-card.js.map +1 -1
  71. package/dist/components/ui/action-button/action-button.js +33 -7
  72. package/dist/components/ui/action-button/action-button.js.map +1 -1
  73. package/dist/components/ui/action-button/action-button.module.less.d.ts +9 -0
  74. package/dist/components/ui/action-button/index.js +1 -0
  75. package/dist/components/ui/action-button/index.js.map +1 -1
  76. package/dist/components/ui/centered-spinner/centered-spinner.js +20 -2
  77. package/dist/components/ui/centered-spinner/centered-spinner.js.map +1 -1
  78. package/dist/components/ui/date-range-picker/date-range-picker.js +71 -35
  79. package/dist/components/ui/date-range-picker/date-range-picker.js.map +1 -1
  80. package/dist/components/ui/date-range-picker/date-range-picker.module.less.d.ts +4 -0
  81. package/dist/components/ui/disabled-button.js +12 -3
  82. package/dist/components/ui/disabled-button.js.map +1 -1
  83. package/dist/components/ui/label-with-hint/label-with-hint.js +23 -1
  84. package/dist/components/ui/label-with-hint/label-with-hint.js.map +1 -1
  85. package/dist/components/ui/line-text/index.js +1 -0
  86. package/dist/components/ui/line-text/index.js.map +1 -1
  87. package/dist/components/ui/line-text/line-text.js +71 -12
  88. package/dist/components/ui/line-text/line-text.js.map +1 -1
  89. package/dist/components/ui/line-text/line-text.module.less.d.ts +6 -0
  90. package/dist/components/ui/title-popover/index.js +1 -0
  91. package/dist/components/ui/title-popover/index.js.map +1 -1
  92. package/dist/components/ui/title-popover/title-popover.js +78 -69
  93. package/dist/components/ui/title-popover/title-popover.js.map +1 -1
  94. package/dist/components/ui/title-popover/title-popover.module.less.d.ts +3 -0
  95. package/dist/index.js +3 -1
  96. package/dist/index.js.map +1 -1
  97. package/dist/utils/ads-texts.js +2 -1
  98. package/dist/utils/ads-texts.js.map +1 -1
  99. package/dist/utils/date/date-range-picker-options.js +90 -68
  100. package/dist/utils/date/date-range-picker-options.js.map +1 -1
  101. package/dist/utils/date/date-range-picker-state.js +42 -43
  102. package/dist/utils/date/date-range-picker-state.js.map +1 -1
  103. package/dist/utils/date/date-tenant.js +4 -6
  104. package/dist/utils/date/date-tenant.js.map +1 -1
  105. package/dist/utils/date/date.js +5 -9
  106. package/dist/utils/date/date.js.map +1 -1
  107. package/dist/utils/date/index.js +1 -0
  108. package/dist/utils/date/index.js.map +1 -1
  109. package/dist/utils/format-big-numbers.js +11 -6
  110. package/dist/utils/format-big-numbers.js.map +1 -1
  111. package/dist/utils/formatters.js +8 -7
  112. package/dist/utils/formatters.js.map +1 -1
  113. package/dist/utils/helpers.js +9 -12
  114. package/dist/utils/helpers.js.map +1 -1
  115. package/dist/utils/marketing-parner-handlers.js +9 -12
  116. package/dist/utils/marketing-parner-handlers.js.map +1 -1
  117. package/dist/utils/string-case.js +1 -0
  118. package/dist/utils/string-case.js.map +1 -1
  119. package/dist/utils/use-client-rect.js +19 -19
  120. package/dist/utils/use-client-rect.js.map +1 -1
  121. package/dist/utils/use-target-range-store.js +7 -6
  122. package/dist/utils/use-target-range-store.js.map +1 -1
  123. package/package.json +11 -11
  124. package/dist/components/charts/funnel-chart/funnel-chart.stories.js +0 -76
  125. package/dist/components/charts/funnel-chart/funnel-chart.stories.js.map +0 -1
  126. package/dist/components/charts/line-chart/line-chart.stories.js +0 -225
  127. package/dist/components/charts/line-chart/line-chart.stories.js.map +0 -1
  128. package/dist/components/charts/pie-chart/pie-chart.stories.js +0 -22
  129. package/dist/components/charts/pie-chart/pie-chart.stories.js.map +0 -1
  130. package/dist/components/image-cropper/image-cropper.stories.js +0 -39
  131. package/dist/components/image-cropper/image-cropper.stories.js.map +0 -1
  132. package/dist/components/stat/stat-cards.stories.js +0 -16
  133. package/dist/components/stat/stat-cards.stories.js.map +0 -1
  134. package/dist/components/stat/stat-extended-card.stories.js +0 -12
  135. package/dist/components/stat/stat-extended-card.stories.js.map +0 -1
  136. package/dist/components/ui/action-button/action-button.stories.js +0 -11
  137. package/dist/components/ui/action-button/action-button.stories.js.map +0 -1
  138. package/dist/components/ui/centered-spinner/centered-spinner.stories.js +0 -12
  139. package/dist/components/ui/centered-spinner/centered-spinner.stories.js.map +0 -1
  140. package/dist/components/ui/date-range-picker/date-range-picker.stories.js +0 -18
  141. package/dist/components/ui/date-range-picker/date-range-picker.stories.js.map +0 -1
  142. package/dist/components/ui/label-with-hint/label-with-hint.stories.js +0 -12
  143. package/dist/components/ui/label-with-hint/label-with-hint.stories.js.map +0 -1
  144. package/dist/components/ui/line-text/line-text-body.stories.js +0 -11
  145. package/dist/components/ui/line-text/line-text-body.stories.js.map +0 -1
  146. package/dist/components/ui/line-text/line-text-head.stories.js +0 -11
  147. package/dist/components/ui/line-text/line-text-head.stories.js.map +0 -1
  148. package/dist/components/ui/title-popover/title-popover.stories.js +0 -17
  149. package/dist/components/ui/title-popover/title-popover.stories.js.map +0 -1
  150. package/dist/utils/__tests__/format-big-numbers.test.js +0 -16
  151. package/dist/utils/__tests__/format-big-numbers.test.js.map +0 -1
  152. package/dist/utils/__tests__/formatters.test.js +0 -45
  153. package/dist/utils/__tests__/formatters.test.js.map +0 -1
  154. package/dist/utils/__tests__/helpers.test.js +0 -31
  155. package/dist/utils/__tests__/helpers.test.js.map +0 -1
  156. package/dist/utils/__tests__/string-case.test.js +0 -20
  157. package/dist/utils/__tests__/string-case.test.js.map +0 -1
  158. package/dist/utils/date/__mocks__/date-mock.js +0 -19
  159. package/dist/utils/date/__mocks__/date-mock.js.map +0 -1
  160. package/dist/utils/date/__tests__/date-range-picker.test.js +0 -93
  161. package/dist/utils/date/__tests__/date-range-picker.test.js.map +0 -1
  162. package/dist/utils/date/__tests__/date-tenant.test.js +0 -29
  163. package/dist/utils/date/__tests__/date-tenant.test.js.map +0 -1
@@ -1,44 +1,51 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
14
+ function _ts_decorate(decorators, target, key, desc) {
2
15
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
16
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
17
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
18
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
19
+ }
20
+ function _ts_metadata(k, v) {
8
21
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
22
+ }
10
23
  import { jsx as _jsx } from "react/jsx-runtime";
11
24
  import { Component } from 'react';
12
25
  import { observable, action, makeObservable } from 'mobx';
13
26
  import { observer } from 'mobx-react';
14
- import ReactCrop from 'react-image-crop';
27
+ import ReactCrop, { Crop } from 'react-image-crop';
15
28
  import 'react-image-crop/dist/ReactCrop.css';
16
- let ImageCropper = class ImageCropper extends Component {
17
- constructor(props) {
18
- super(props);
19
- Object.defineProperty(this, "src", {
20
- enumerable: true,
21
- configurable: true,
22
- writable: true,
23
- value: void 0
24
- });
25
- Object.defineProperty(this, "crop", {
26
- enumerable: true,
27
- configurable: true,
28
- writable: true,
29
- value: void 0
30
- });
31
- Object.defineProperty(this, "image", {
32
- enumerable: true,
33
- configurable: true,
34
- writable: true,
35
- value: void 0
36
- });
37
- Object.defineProperty(this, "getCroppedImg", {
38
- enumerable: true,
39
- configurable: true,
40
- writable: true,
41
- value: (type, fileName) => new Promise(resolve => {
29
+ export class ImageCropper extends Component {
30
+ componentDidMount() {
31
+ return this.src = URL.createObjectURL(this.props.file);
32
+ }
33
+ componentWillUnmount() {
34
+ if (this.src) {
35
+ URL.revokeObjectURL(this.src);
36
+ }
37
+ }
38
+ render() {
39
+ return this.src ? /*#__PURE__*/ _jsx(ReactCrop, {
40
+ locked: true,
41
+ src: this.src,
42
+ crop: this.crop,
43
+ onChange: this.handleChange,
44
+ onImageLoaded: this.handleImageLoaded
45
+ }) : null;
46
+ }
47
+ constructor(props){
48
+ super(props), _define_property(this, "src", void 0), _define_property(this, "crop", void 0), _define_property(this, "image", void 0), _define_property(this, "getCroppedImg", (type, fileName)=>new Promise((resolve)=>{
42
49
  if (!this.image || !this.crop) {
43
50
  resolve(undefined);
44
51
  return;
@@ -58,77 +65,56 @@ let ImageCropper = class ImageCropper extends Component {
58
65
  return;
59
66
  }
60
67
  ctx.drawImage(this.image, x * (this.image.naturalWidth / this.image.width), y * (this.image.naturalHeight / this.image.height), width, height, 0, 0, width, height);
61
- canvas.toBlob(blob => {
62
- const result = blob ? new File([blob], fileName) : undefined;
68
+ canvas.toBlob((blob)=>{
69
+ const result = blob ? new File([
70
+ blob
71
+ ], fileName) : undefined;
63
72
  resolve(result);
64
73
  }, type, 1);
65
- })
66
- });
67
- Object.defineProperty(this, "handleChange", {
68
- enumerable: true,
69
- configurable: true,
70
- writable: true,
71
- value: (crop) => (this.crop = crop)
72
- });
73
- Object.defineProperty(this, "handleImageLoaded", {
74
- enumerable: true,
75
- configurable: true,
76
- writable: true,
77
- value: (image) => {
78
- this.image = image;
79
- this.crop = {
80
- unit: 'px',
81
- x: 0,
82
- y: 0,
83
- width: this.props.crop.width * (image.width / image.naturalWidth),
84
- height: this.props.crop.height * (image.height / image.naturalHeight),
85
- };
86
- return false;
87
- }
74
+ })), _define_property(this, "handleChange", (crop)=>this.crop = crop), _define_property(this, "handleImageLoaded", (image)=>{
75
+ this.image = image;
76
+ this.crop = {
77
+ unit: 'px',
78
+ x: 0,
79
+ y: 0,
80
+ width: this.props.crop.width * (image.width / image.naturalWidth),
81
+ height: this.props.crop.height * (image.height / image.naturalHeight)
82
+ };
83
+ return false;
88
84
  });
89
85
  makeObservable(this);
90
86
  }
91
- componentDidMount() {
92
- return (this.src = URL.createObjectURL(this.props.file));
93
- }
94
- componentWillUnmount() {
95
- if (this.src) {
96
- URL.revokeObjectURL(this.src);
97
- }
98
- }
99
- render() {
100
- return this.src ? (_jsx(ReactCrop, { locked: true, src: this.src, crop: this.crop, onChange: this.handleChange, onImageLoaded: this.handleImageLoaded })) : null;
101
- }
102
- };
103
- __decorate([
87
+ }
88
+ _ts_decorate([
104
89
  observable,
105
- __metadata("design:type", String)
90
+ _ts_metadata("design:type", String)
106
91
  ], ImageCropper.prototype, "src", void 0);
107
- __decorate([
92
+ _ts_decorate([
108
93
  observable,
109
- __metadata("design:type", Object)
94
+ _ts_metadata("design:type", typeof Crop === "undefined" ? Object : Crop)
110
95
  ], ImageCropper.prototype, "crop", void 0);
111
- __decorate([
96
+ _ts_decorate([
112
97
  observable,
113
- __metadata("design:type", HTMLImageElement)
98
+ _ts_metadata("design:type", typeof HTMLImageElement === "undefined" ? Object : HTMLImageElement)
114
99
  ], ImageCropper.prototype, "image", void 0);
115
- __decorate([
100
+ _ts_decorate([
116
101
  action,
117
- __metadata("design:type", Function),
118
- __metadata("design:paramtypes", []),
119
- __metadata("design:returntype", void 0)
102
+ _ts_metadata("design:type", Function),
103
+ _ts_metadata("design:paramtypes", []),
104
+ _ts_metadata("design:returntype", void 0)
120
105
  ], ImageCropper.prototype, "componentDidMount", null);
121
- __decorate([
122
- action,
123
- __metadata("design:type", Object)
106
+ _ts_decorate([
107
+ action
124
108
  ], ImageCropper.prototype, "handleChange", void 0);
125
- __decorate([
126
- action,
127
- __metadata("design:type", Object)
109
+ _ts_decorate([
110
+ action
128
111
  ], ImageCropper.prototype, "handleImageLoaded", void 0);
129
- ImageCropper = __decorate([
112
+ ImageCropper = _ts_decorate([
130
113
  observer,
131
- __metadata("design:paramtypes", [Object])
114
+ _ts_metadata("design:type", Function),
115
+ _ts_metadata("design:paramtypes", [
116
+ typeof ImageCropperProps === "undefined" ? Object : ImageCropperProps
117
+ ])
132
118
  ], ImageCropper);
133
- export { ImageCropper };
119
+
134
120
  //# sourceMappingURL=image-cropper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-cropper.js","sourceRoot":"","sources":["../../../src/components/image-cropper/image-cropper.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/image-cropper/image-cropper.tsx"],"sourcesContent":["import { Component } from 'react';\nimport { observable, action, makeObservable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport ReactCrop, { Crop } from 'react-image-crop';\nimport 'react-image-crop/dist/ReactCrop.css';\n\ninterface ImageCropperProps {\n file: File;\n crop: {\n width: number;\n height: number;\n };\n}\n\n@observer\nexport class ImageCropper extends Component<ImageCropperProps> {\n @observable private src?: string;\n @observable private crop?: Crop;\n @observable private image?: HTMLImageElement;\n\n constructor(props: ImageCropperProps) {\n super(props);\n makeObservable(this);\n }\n\n getCroppedImg = (type: string, fileName: string) =>\n new Promise<File | undefined>(resolve => {\n if (!this.image || !this.crop) {\n resolve(undefined);\n return;\n }\n\n const { x, y } = this.crop;\n if (x == null || y == null) {\n resolve(undefined);\n return;\n }\n\n const { width, height } = this.props.crop;\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n resolve(undefined);\n return;\n }\n\n ctx.drawImage(\n this.image,\n x * (this.image.naturalWidth / this.image.width),\n y * (this.image.naturalHeight / this.image.height),\n width,\n height,\n 0,\n 0,\n width,\n height\n );\n\n canvas.toBlob(\n blob => {\n const result = blob ? new File([blob], fileName) : undefined;\n resolve(result);\n },\n type,\n 1\n );\n });\n\n @action\n componentDidMount() {\n return (this.src = URL.createObjectURL(this.props.file));\n }\n\n componentWillUnmount() {\n if (this.src) {\n URL.revokeObjectURL(this.src);\n }\n }\n\n render() {\n return this.src ? (\n <ReactCrop\n locked\n src={this.src}\n crop={this.crop}\n onChange={this.handleChange}\n onImageLoaded={this.handleImageLoaded}\n />\n ) : null;\n }\n\n @action\n private handleChange = (crop: Crop) => (this.crop = crop);\n\n @action\n private handleImageLoaded = (image: HTMLImageElement) => {\n this.image = image;\n this.crop = {\n unit: 'px',\n x: 0,\n y: 0,\n width: this.props.crop.width * (image.width / image.naturalWidth),\n height: this.props.crop.height * (image.height / image.naturalHeight),\n };\n\n return false;\n };\n}\n"],"names":["Component","observable","action","makeObservable","observer","ReactCrop","Crop","ImageCropper","componentDidMount","src","URL","createObjectURL","props","file","componentWillUnmount","revokeObjectURL","render","locked","crop","onChange","handleChange","onImageLoaded","handleImageLoaded","constructor","image","getCroppedImg","type","fileName","Promise","resolve","undefined","x","y","width","height","canvas","document","createElement","ctx","getContext","drawImage","naturalWidth","naturalHeight","toBlob","blob","result","File","unit"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,SAAS,QAAQ,QAAQ;AAClC,SAASC,UAAU,EAAEC,MAAM,EAAEC,cAAc,QAAQ,OAAO;AAC1D,SAASC,QAAQ,QAAQ,aAAa;AACtC,OAAOC,aAAaC,IAAI,QAAQ,mBAAmB;AACnD,OAAO,sCAAsC;AAW7C,OAAO,MAAMC,qBAAqBP;IAwD9BQ,oBAAoB;QAChB,OAAQ,IAAI,CAACC,GAAG,GAAGC,IAAIC,eAAe,CAAC,IAAI,CAACC,KAAK,CAACC,IAAI;IAC1D;IAEAC,uBAAuB;QACnB,IAAI,IAAI,CAACL,GAAG,EAAE;YACVC,IAAIK,eAAe,CAAC,IAAI,CAACN,GAAG;QAChC;IACJ;IAEAO,SAAS;QACL,OAAO,IAAI,CAACP,GAAG,iBACX,KAACJ;YACGY,MAAM;YACNR,KAAK,IAAI,CAACA,GAAG;YACbS,MAAM,IAAI,CAACA,IAAI;YACfC,UAAU,IAAI,CAACC,YAAY;YAC3BC,eAAe,IAAI,CAACC,iBAAiB;aAEzC;IACR;IAvEAC,YAAYX,KAAwB,CAAE;QAClC,KAAK,CAACA,QALV,uBAAoBH,OAApB,KAAA,IACA,uBAAoBS,QAApB,KAAA,IACA,uBAAoBM,SAApB,KAAA,IAOAC,uBAAAA,iBAAgB,CAACC,MAAcC,WAC3B,IAAIC,QAA0BC,CAAAA;gBAC1B,IAAI,CAAC,IAAI,CAACL,KAAK,IAAI,CAAC,IAAI,CAACN,IAAI,EAAE;oBAC3BW,QAAQC;oBACR;gBACJ;gBAEA,MAAM,EAAEC,CAAC,EAAEC,CAAC,EAAE,GAAG,IAAI,CAACd,IAAI;gBAC1B,IAAIa,KAAK,QAAQC,KAAK,MAAM;oBACxBH,QAAQC;oBACR;gBACJ;gBAEA,MAAM,EAAEG,KAAK,EAAEC,MAAM,EAAE,GAAG,IAAI,CAACtB,KAAK,CAACM,IAAI;gBACzC,MAAMiB,SAASC,SAASC,aAAa,CAAC;gBACtCF,OAAOF,KAAK,GAAGA;gBACfE,OAAOD,MAAM,GAAGA;gBAChB,MAAMI,MAAMH,OAAOI,UAAU,CAAC;gBAC9B,IAAI,CAACD,KAAK;oBACNT,QAAQC;oBACR;gBACJ;gBAEAQ,IAAIE,SAAS,CACT,IAAI,CAAChB,KAAK,EACVO,IAAK,CAAA,IAAI,CAACP,KAAK,CAACiB,YAAY,GAAG,IAAI,CAACjB,KAAK,CAACS,KAAK,AAAD,GAC9CD,IAAK,CAAA,IAAI,CAACR,KAAK,CAACkB,aAAa,GAAG,IAAI,CAAClB,KAAK,CAACU,MAAM,AAAD,GAChDD,OACAC,QACA,GACA,GACAD,OACAC;gBAGJC,OAAOQ,MAAM,CACTC,CAAAA;oBACI,MAAMC,SAASD,OAAO,IAAIE,KAAK;wBAACF;qBAAK,EAAEjB,YAAYG;oBACnDD,QAAQgB;gBACZ,GACAnB,MACA;YAER,KAyBJ,uBACQN,gBAAe,CAACF,OAAgB,IAAI,CAACA,IAAI,GAAGA,OAEpD,uBACQI,qBAAoB,CAACE;YACzB,IAAI,CAACA,KAAK,GAAGA;YACb,IAAI,CAACN,IAAI,GAAG;gBACR6B,MAAM;gBACNhB,GAAG;gBACHC,GAAG;gBACHC,OAAO,IAAI,CAACrB,KAAK,CAACM,IAAI,CAACe,KAAK,GAAIT,CAAAA,MAAMS,KAAK,GAAGT,MAAMiB,YAAY,AAAD;gBAC/DP,QAAQ,IAAI,CAACtB,KAAK,CAACM,IAAI,CAACgB,MAAM,GAAIV,CAAAA,MAAMU,MAAM,GAAGV,MAAMkB,aAAa,AAAD;YACvE;YAEA,OAAO;QACX;QAtFIvC,eAAe,IAAI;IACvB;AAsFJ"}
@@ -1,66 +1,112 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import classNames from 'classnames';
4
- import { BodyText, Eyebrow, Popover, Stack, Tooltip, } from '@servicetitan/design-system';
4
+ import { BodyText, Eyebrow, Popover, Stack, Tooltip } from '@servicetitan/design-system';
5
5
  import * as Styles from './stat-card.module.less';
6
6
  import { formatValue } from '../../utils/formatters';
7
- const calculateDiff = (value, prev, percents) => {
7
+ const calculateDiff = (value, prev, percents)=>{
8
8
  const diff = (value - prev) * (percents ? 100 : 1);
9
9
  const absDiff = Math.abs(diff);
10
10
  let diffPercent = 0;
11
11
  if (percents) {
12
12
  diffPercent = diff;
13
+ } else if (absDiff) {
14
+ diffPercent = prev ? 100 * absDiff / prev : 100;
13
15
  }
14
- else if (absDiff) {
15
- diffPercent = prev ? (100 * absDiff) / prev : 100;
16
- }
17
- return [absDiff, diffPercent, diff >= 0];
16
+ return [
17
+ absDiff,
18
+ diffPercent,
19
+ diff >= 0
20
+ ];
18
21
  };
19
- const formatDifference = (value, isPlus, format) => {
22
+ const formatDifference = (value, isPlus, format)=>{
20
23
  return (isPlus ? '+' : '-') + formatValue(value, format);
21
24
  };
22
- const formatDifferencePercentage = (value, isPlus) => {
25
+ const formatDifferencePercentage = (value, isPlus)=>{
23
26
  if (!value) {
24
27
  return '';
25
28
  }
26
29
  return (isPlus ? '+' : '-') + formatValue(value, 'percent-100');
27
30
  };
28
- export const StatDiff = ({ value, prev, size, format, inverted, neutral, className, diffPercentOnly = false, }) => {
31
+ export const StatDiff = ({ value, prev, size, format, inverted, neutral, className, diffPercentOnly = false })=>{
29
32
  const percents = format === 'percent';
30
33
  const [absDiff, diffPercent, isIncrease] = calculateDiff(value !== null && value !== void 0 ? value : 0, prev !== null && prev !== void 0 ? prev : 0, percents);
31
34
  const diff = absDiff === 0 ? '' : isIncrease ? '▲ ' : '▼ ';
32
35
  let text = '';
33
36
  if (percents) {
34
37
  text += formatDifferencePercentage(absDiff, isIncrease);
35
- }
36
- else {
38
+ } else {
37
39
  const diffPercentage = formatDifferencePercentage(diffPercent, isIncrease);
38
40
  if (diffPercentOnly) {
39
41
  text += `${diffPercentage}`;
40
- }
41
- else {
42
+ } else {
42
43
  text += `${formatDifference(absDiff, isIncrease, format)}`;
43
44
  if (diffPercent !== 0) {
44
45
  text += ` (${diffPercentage})`;
45
46
  }
46
47
  }
47
48
  }
48
- return (_jsxs(BodyText, { className: classNames(Styles.statDiff, {
49
+ return /*#__PURE__*/ _jsxs(BodyText, {
50
+ className: classNames(Styles.statDiff, {
49
51
  'c-red-500': !neutral && (inverted ? isIncrease : !isIncrease),
50
52
  'c-green-500': !neutral && (inverted ? !isIncrease : isIncrease),
51
- 'c-neutral-200': !!neutral,
52
- }, className), size: size !== null && size !== void 0 ? size : 'small', "data-cy": "stat-diff-value", children: [_jsx("span", { children: diff }), value === undefined ? '\u00A0' : text] }));
53
+ 'c-neutral-200': !!neutral
54
+ }, className),
55
+ size: size !== null && size !== void 0 ? size : 'small',
56
+ "data-cy": "stat-diff-value",
57
+ children: [
58
+ /*#__PURE__*/ _jsx("span", {
59
+ children: diff
60
+ }),
61
+ value === undefined ? '\u00A0' : text
62
+ ]
63
+ });
53
64
  };
54
- export const StatCard = ({ title, description, popoverContent, value, percent, money, rate, prev, clean, inverted, neutral, fill, valueOnly, className, diffPercentOnly = false, }) => {
65
+ export const StatCard = ({ title, description, popoverContent, value, percent, money, rate, prev, clean, inverted, neutral, fill, valueOnly, className, diffPercentOnly = false })=>{
55
66
  const [popoverShown, setPopoverShown] = useState(false);
56
67
  const format = money ? 'money' : percent ? 'percent' : rate ? 'rate' : 'number';
57
68
  const val = value === undefined ? '\u00A0' : formatValue(value, format);
58
- const eyebrow = (_jsx(Eyebrow, { className: classNames(Styles.title, 'ta-center'), "data-cy": `marketing-stat-${title}-title`, onMouseEnter: () => {
69
+ const eyebrow = /*#__PURE__*/ _jsx(Eyebrow, {
70
+ className: classNames(Styles.title, 'ta-center'),
71
+ "data-cy": `marketing-stat-${title}-title`,
72
+ onMouseEnter: ()=>{
59
73
  setPopoverShown(true);
60
- }, children: title }));
61
- return (_jsxs(Stack, { direction: "column", alignItems: "center", className: classNames('p-y-3', {
74
+ },
75
+ children: title
76
+ });
77
+ return /*#__PURE__*/ _jsxs(Stack, {
78
+ direction: "column",
79
+ alignItems: "center",
80
+ className: classNames('p-y-3', {
62
81
  'bg-white border-radius-2 border': !clean,
63
- 'flex-grow-1 flex-basis-0': fill,
64
- }, className), onMouseLeave: () => setPopoverShown(false), children: [popoverContent ? (_jsx(Popover, { open: popoverShown, trigger: eyebrow, children: popoverContent })) : description ? (_jsx(Tooltip, { text: description, "data-cy": `marketing-stat-${title}-tooltip`, children: eyebrow })) : (eyebrow), _jsx(BodyText, { className: "fs-6-i ff-display", "data-cy": `marketing-stat-${title}-value`, children: val }), !valueOnly && (_jsx(StatDiff, { value: value, prev: prev, format: format, inverted: inverted, neutral: neutral, diffPercentOnly: diffPercentOnly }))] }));
82
+ 'flex-grow-1 flex-basis-0': fill
83
+ }, className),
84
+ onMouseLeave: ()=>setPopoverShown(false),
85
+ children: [
86
+ popoverContent ? /*#__PURE__*/ _jsx(Popover, {
87
+ open: popoverShown,
88
+ trigger: eyebrow,
89
+ children: popoverContent
90
+ }) : description ? /*#__PURE__*/ _jsx(Tooltip, {
91
+ text: description,
92
+ "data-cy": `marketing-stat-${title}-tooltip`,
93
+ children: eyebrow
94
+ }) : eyebrow,
95
+ /*#__PURE__*/ _jsx(BodyText, {
96
+ className: "fs-6-i ff-display",
97
+ "data-cy": `marketing-stat-${title}-value`,
98
+ children: val
99
+ }),
100
+ !valueOnly && /*#__PURE__*/ _jsx(StatDiff, {
101
+ value: value,
102
+ prev: prev,
103
+ format: format,
104
+ inverted: inverted,
105
+ neutral: neutral,
106
+ diffPercentOnly: diffPercentOnly
107
+ })
108
+ ]
109
+ });
65
110
  };
111
+
66
112
  //# sourceMappingURL=stat-card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stat-card.js","sourceRoot":"","sources":["../../../src/components/stat/stat-card.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/stat/stat-card.tsx"],"sourcesContent":["import { FC, ReactNode, useState } from 'react';\nimport classNames from 'classnames';\nimport {\n BodyText,\n BodyTextPropsStrict,\n Eyebrow,\n Popover,\n Stack,\n Tooltip,\n} from '@servicetitan/design-system';\nimport * as Styles from './stat-card.module.less';\nimport { formatValue, NumberFormatter } from '../../utils/formatters';\n\nconst calculateDiff = (\n value: number,\n prev: number,\n percents?: boolean\n): [number, number, boolean] => {\n const diff = (value - prev) * (percents ? 100 : 1);\n const absDiff = Math.abs(diff);\n let diffPercent = 0;\n\n if (percents) {\n diffPercent = diff;\n } else if (absDiff) {\n diffPercent = prev ? (100 * absDiff) / prev : 100;\n }\n\n return [absDiff, diffPercent, diff >= 0];\n};\n\nconst formatDifference = (value: number, isPlus: boolean, format: NumberFormatter): string => {\n return (isPlus ? '+' : '-') + formatValue(value, format);\n};\n\nconst formatDifferencePercentage = (value: number, isPlus: boolean): string => {\n if (!value) {\n return '';\n }\n\n return (isPlus ? '+' : '-') + formatValue(value, 'percent-100');\n};\n\ninterface StatDiffProps {\n value?: number;\n prev?: number;\n size?: BodyTextPropsStrict['size'];\n format: NumberFormatter;\n inverted?: boolean;\n neutral?: boolean;\n className?: string;\n diffPercentOnly?: boolean;\n}\n\nexport const StatDiff: FC<StatDiffProps> = ({\n value,\n prev,\n size,\n format,\n inverted,\n neutral,\n className,\n diffPercentOnly = false,\n}) => {\n const percents = format === 'percent';\n const [absDiff, diffPercent, isIncrease] = calculateDiff(value ?? 0, prev ?? 0, percents);\n const diff = absDiff === 0 ? '' : isIncrease ? '▲ ' : '▼ ';\n let text = '';\n\n if (percents) {\n text += formatDifferencePercentage(absDiff, isIncrease);\n } else {\n const diffPercentage = formatDifferencePercentage(diffPercent, isIncrease);\n\n if (diffPercentOnly) {\n text += `${diffPercentage}`;\n } else {\n text += `${formatDifference(absDiff, isIncrease, format)}`;\n\n if (diffPercent !== 0) {\n text += ` (${diffPercentage})`;\n }\n }\n }\n\n return (\n <BodyText\n className={classNames(\n Styles.statDiff,\n {\n 'c-red-500': !neutral && (inverted ? isIncrease : !isIncrease),\n 'c-green-500': !neutral && (inverted ? !isIncrease : isIncrease),\n 'c-neutral-200': !!neutral,\n },\n className\n )}\n size={size ?? 'small'}\n data-cy=\"stat-diff-value\"\n >\n <span>{diff}</span>\n {value === undefined ? '\\u00A0' : text}\n </BodyText>\n );\n};\n\nexport interface StatCardProps {\n title: string;\n description?: string;\n popoverContent?: ReactNode;\n value?: number;\n prev?: number;\n percent?: boolean;\n money?: boolean;\n rate?: boolean;\n clean?: boolean;\n inverted?: boolean;\n neutral?: boolean;\n fill?: boolean;\n valueOnly?: boolean;\n className?: string;\n diffPercentOnly?: boolean;\n}\n\nexport const StatCard: FC<StatCardProps> = ({\n title,\n description,\n popoverContent,\n value,\n percent,\n money,\n rate,\n prev,\n clean,\n inverted,\n neutral,\n fill,\n valueOnly,\n className,\n diffPercentOnly = false,\n}) => {\n const [popoverShown, setPopoverShown] = useState(false);\n const format = money ? 'money' : percent ? 'percent' : rate ? 'rate' : 'number';\n const val = value === undefined ? '\\u00A0' : formatValue(value, format);\n\n const eyebrow = (\n <Eyebrow\n className={classNames(Styles.title, 'ta-center')}\n data-cy={`marketing-stat-${title}-title`}\n onMouseEnter={() => {\n setPopoverShown(true);\n }}\n >\n {title}\n </Eyebrow>\n );\n\n return (\n <Stack\n direction=\"column\"\n alignItems=\"center\"\n className={classNames(\n 'p-y-3',\n {\n 'bg-white border-radius-2 border': !clean,\n 'flex-grow-1 flex-basis-0': fill,\n },\n className\n )}\n onMouseLeave={() => setPopoverShown(false)}\n >\n {popoverContent ? (\n <Popover open={popoverShown} trigger={eyebrow}>\n {popoverContent}\n </Popover>\n ) : description ? (\n <Tooltip text={description} data-cy={`marketing-stat-${title}-tooltip`}>\n {eyebrow}\n </Tooltip>\n ) : (\n eyebrow\n )}\n <BodyText className=\"fs-6-i ff-display\" data-cy={`marketing-stat-${title}-value`}>\n {val}\n </BodyText>\n {!valueOnly && (\n <StatDiff\n value={value}\n prev={prev}\n format={format}\n inverted={inverted}\n neutral={neutral}\n diffPercentOnly={diffPercentOnly}\n />\n )}\n </Stack>\n );\n};\n"],"names":["useState","classNames","BodyText","Eyebrow","Popover","Stack","Tooltip","Styles","formatValue","calculateDiff","value","prev","percents","diff","absDiff","Math","abs","diffPercent","formatDifference","isPlus","format","formatDifferencePercentage","StatDiff","size","inverted","neutral","className","diffPercentOnly","isIncrease","text","diffPercentage","statDiff","data-cy","span","undefined","StatCard","title","description","popoverContent","percent","money","rate","clean","fill","valueOnly","popoverShown","setPopoverShown","val","eyebrow","onMouseEnter","direction","alignItems","onMouseLeave","open","trigger"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export const __esModule: true;
2
+ export const statDiff: string;
3
+ export const statExtendedDiff: string;
4
+ export const title: string;
5
+
@@ -4,10 +4,82 @@ import { BodyText, Icon, Headline, Eyebrow, Stack, Tooltip } from '@servicetitan
4
4
  import { formatValue } from '../../utils/formatters';
5
5
  import { StatDiff } from './stat-card';
6
6
  import * as Styles from './stat-card.module.less';
7
- export const StatExtendedCard = ({ title, title2, description, value, goal, prev, percent, money, rate, inverted, neutral, fill, className, actions, }) => {
7
+ export const StatExtendedCard = ({ title, title2, description, value, goal, prev, percent, money, rate, inverted, neutral, fill, className, actions })=>{
8
8
  const format = money ? 'money' : percent ? 'percent' : rate ? 'rate' : 'number';
9
- return (_jsxs("div", { className: classNames('p-3 bg-white border border-radius-2', {
10
- 'flex-grow-1 flex-basis-0': fill,
11
- }, className), children: [_jsxs(Stack, { justifyContent: "space-between", alignItems: "center", children: [_jsx(Stack.Item, { fill: true, children: _jsxs(Stack, { children: [_jsx(Headline, { size: "small", children: title }), !!description && (_jsx(Tooltip, { text: description, "data-cy": `marketing-stat-card-${title}-info-tooltip`, children: _jsx(Icon, { name: "info", size: 18, className: "c-neutral-80 m-l-half", "data-cy": `marketing-stat-card-${title}-info-icon` }) }))] }) }), actions && _jsx(Stack.Item, { shrink: 0, children: actions })] }), _jsx(Eyebrow, { size: "small", className: "m-t-2 c-black", "data-cy": `marketing-stat-card-${title2}-title2`, children: title2 }), _jsx(Stack, { justifyContent: "space-between", className: "m-t-half", children: _jsxs(Stack, { alignItems: "flex-end", className: "flex-grow-1 flex-basis-0", children: [_jsx(Headline, { className: "m-b-0-i m-r-half fw-normal-i", size: "xlarge", children: formatValue(value, format) }), goal !== undefined ? (_jsxs(BodyText, { subdued: true, children: ["/ ", formatValue(goal, format), " (Goal)"] })) : prev !== undefined ? (_jsx(StatDiff, { value: value, prev: prev, format: format, inverted: inverted, neutral: neutral, className: classNames(Styles.statExtendedDiff, 'm-l-1') })) : undefined] }) })] }));
9
+ return /*#__PURE__*/ _jsxs("div", {
10
+ className: classNames('p-3 bg-white border border-radius-2', {
11
+ 'flex-grow-1 flex-basis-0': fill
12
+ }, className),
13
+ children: [
14
+ /*#__PURE__*/ _jsxs(Stack, {
15
+ justifyContent: "space-between",
16
+ alignItems: "center",
17
+ children: [
18
+ /*#__PURE__*/ _jsx(Stack.Item, {
19
+ fill: true,
20
+ children: /*#__PURE__*/ _jsxs(Stack, {
21
+ children: [
22
+ /*#__PURE__*/ _jsx(Headline, {
23
+ size: "small",
24
+ children: title
25
+ }),
26
+ !!description && /*#__PURE__*/ _jsx(Tooltip, {
27
+ text: description,
28
+ "data-cy": `marketing-stat-card-${title}-info-tooltip`,
29
+ children: /*#__PURE__*/ _jsx(Icon, {
30
+ name: "info",
31
+ size: 18,
32
+ className: "c-neutral-80 m-l-half",
33
+ "data-cy": `marketing-stat-card-${title}-info-icon`
34
+ })
35
+ })
36
+ ]
37
+ })
38
+ }),
39
+ actions && /*#__PURE__*/ _jsx(Stack.Item, {
40
+ shrink: 0,
41
+ children: actions
42
+ })
43
+ ]
44
+ }),
45
+ /*#__PURE__*/ _jsx(Eyebrow, {
46
+ size: "small",
47
+ className: "m-t-2 c-black",
48
+ "data-cy": `marketing-stat-card-${title2}-title2`,
49
+ children: title2
50
+ }),
51
+ /*#__PURE__*/ _jsx(Stack, {
52
+ justifyContent: "space-between",
53
+ className: "m-t-half",
54
+ children: /*#__PURE__*/ _jsxs(Stack, {
55
+ alignItems: "flex-end",
56
+ className: "flex-grow-1 flex-basis-0",
57
+ children: [
58
+ /*#__PURE__*/ _jsx(Headline, {
59
+ className: "m-b-0-i m-r-half fw-normal-i",
60
+ size: "xlarge",
61
+ children: formatValue(value, format)
62
+ }),
63
+ goal !== undefined ? /*#__PURE__*/ _jsxs(BodyText, {
64
+ subdued: true,
65
+ children: [
66
+ "/ ",
67
+ formatValue(goal, format),
68
+ " (Goal)"
69
+ ]
70
+ }) : prev !== undefined ? /*#__PURE__*/ _jsx(StatDiff, {
71
+ value: value,
72
+ prev: prev,
73
+ format: format,
74
+ inverted: inverted,
75
+ neutral: neutral,
76
+ className: classNames(Styles.statExtendedDiff, 'm-l-1')
77
+ }) : undefined
78
+ ]
79
+ })
80
+ })
81
+ ]
82
+ });
12
83
  };
84
+
13
85
  //# sourceMappingURL=stat-extended-card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stat-extended-card.js","sourceRoot":"","sources":["../../../src/components/stat/stat-extended-card.tsx"],"names":[],"mappings":";AACA,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAC;AAkBlD,MAAM,CAAC,MAAM,gBAAgB,GAA8B,CAAC,EACxD,KAAK,EACL,MAAM,EACN,WAAW,EACX,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,SAAS,EACT,OAAO,GACV,EAAE,EAAE;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEhF,OAAO,CACH,eACI,SAAS,EAAE,UAAU,CACjB,qCAAqC,EACrC;YACI,0BAA0B,EAAE,IAAI;SACnC,EACD,SAAS,CACZ,aAED,MAAC,KAAK,IAAC,cAAc,EAAC,eAAe,EAAC,UAAU,EAAC,QAAQ,aACrD,KAAC,KAAK,CAAC,IAAI,IAAC,IAAI,kBACZ,MAAC,KAAK,eACF,KAAC,QAAQ,IAAC,IAAI,EAAC,OAAO,YAAE,KAAK,GAAY,EACxC,CAAC,CAAC,WAAW,IAAI,CACd,KAAC,OAAO,IACJ,IAAI,EAAE,WAAW,aACR,uBAAuB,KAAK,eAAe,YAEpD,KAAC,IAAI,IACD,IAAI,EAAC,MAAM,EACX,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,uBAAuB,aACxB,uBAAuB,KAAK,YAAY,GACnD,GACI,CACb,IACG,GACC,EACZ,OAAO,IAAI,KAAC,KAAK,CAAC,IAAI,IAAC,MAAM,EAAE,CAAC,YAAG,OAAO,GAAc,IACrD,EACR,KAAC,OAAO,IACJ,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,eAAe,aAChB,uBAAuB,MAAM,SAAS,YAE9C,MAAM,GACD,EAEV,KAAC,KAAK,IAAC,cAAc,EAAC,eAAe,EAAC,SAAS,EAAC,UAAU,YACtD,MAAC,KAAK,IAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,0BAA0B,aAC7D,KAAC,QAAQ,IAAC,SAAS,EAAC,8BAA8B,EAAC,IAAI,EAAC,QAAQ,YAC3D,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,GACpB,EACV,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAClB,MAAC,QAAQ,IAAC,OAAO,yBAAI,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,eAAmB,CACpE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CACrB,KAAC,QAAQ,IACL,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,GACzD,CACL,CAAC,CAAC,CAAC,SAAS,IACT,GACJ,IACN,CACT,CAAC;AACN,CAAC,CAAC"}
1
+ {"version":3,"sources":["../../../src/components/stat/stat-extended-card.tsx"],"sourcesContent":["import { FC, ReactNode } from 'react';\nimport classNames from 'classnames';\nimport { BodyText, Icon, Headline, Eyebrow, Stack, Tooltip } from '@servicetitan/design-system';\nimport { formatValue } from '../../utils/formatters';\nimport { StatDiff } from './stat-card';\nimport * as Styles from './stat-card.module.less';\n\nexport interface StatExtendedCardProps {\n title: string;\n description?: string;\n title2: string;\n value: number;\n goal?: number;\n prev?: number;\n percent?: boolean;\n money?: boolean;\n rate?: boolean;\n inverted?: boolean;\n neutral?: boolean;\n fill?: boolean;\n className?: string;\n actions?: ReactNode;\n}\nexport const StatExtendedCard: FC<StatExtendedCardProps> = ({\n title,\n title2,\n description,\n value,\n goal,\n prev,\n percent,\n money,\n rate,\n inverted,\n neutral,\n fill,\n className,\n actions,\n}) => {\n const format = money ? 'money' : percent ? 'percent' : rate ? 'rate' : 'number';\n\n return (\n <div\n className={classNames(\n 'p-3 bg-white border border-radius-2',\n {\n 'flex-grow-1 flex-basis-0': fill,\n },\n className\n )}\n >\n <Stack justifyContent=\"space-between\" alignItems=\"center\">\n <Stack.Item fill>\n <Stack>\n <Headline size=\"small\">{title}</Headline>\n {!!description && (\n <Tooltip\n text={description}\n data-cy={`marketing-stat-card-${title}-info-tooltip`}\n >\n <Icon\n name=\"info\"\n size={18}\n className=\"c-neutral-80 m-l-half\"\n data-cy={`marketing-stat-card-${title}-info-icon`}\n />\n </Tooltip>\n )}\n </Stack>\n </Stack.Item>\n {actions && <Stack.Item shrink={0}>{actions}</Stack.Item>}\n </Stack>\n <Eyebrow\n size=\"small\"\n className=\"m-t-2 c-black\"\n data-cy={`marketing-stat-card-${title2}-title2`}\n >\n {title2}\n </Eyebrow>\n\n <Stack justifyContent=\"space-between\" className=\"m-t-half\">\n <Stack alignItems=\"flex-end\" className=\"flex-grow-1 flex-basis-0\">\n <Headline className=\"m-b-0-i m-r-half fw-normal-i\" size=\"xlarge\">\n {formatValue(value, format)}\n </Headline>\n {goal !== undefined ? (\n <BodyText subdued>/ {formatValue(goal, format)} (Goal)</BodyText>\n ) : prev !== undefined ? (\n <StatDiff\n value={value}\n prev={prev}\n format={format}\n inverted={inverted}\n neutral={neutral}\n className={classNames(Styles.statExtendedDiff, 'm-l-1')}\n />\n ) : undefined}\n </Stack>\n </Stack>\n </div>\n );\n};\n"],"names":["classNames","BodyText","Icon","Headline","Eyebrow","Stack","Tooltip","formatValue","StatDiff","Styles","StatExtendedCard","title","title2","description","value","goal","prev","percent","money","rate","inverted","neutral","fill","className","actions","format","div","justifyContent","alignItems","Item","size","text","data-cy","name","shrink","undefined","subdued","statExtendedDiff"],"mappings":";AACA,OAAOA,gBAAgB,aAAa;AACpC,SAASC,QAAQ,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,KAAK,EAAEC,OAAO,QAAQ,8BAA8B;AAChG,SAASC,WAAW,QAAQ,yBAAyB;AACrD,SAASC,QAAQ,QAAQ,cAAc;AACvC,YAAYC,YAAY,0BAA0B;AAkBlD,OAAO,MAAMC,mBAA8C,CAAC,EACxDC,KAAK,EACLC,MAAM,EACNC,WAAW,EACXC,KAAK,EACLC,IAAI,EACJC,IAAI,EACJC,OAAO,EACPC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,IAAI,EACJC,SAAS,EACTC,OAAO,EACV;IACG,MAAMC,SAASP,QAAQ,UAAUD,UAAU,YAAYE,OAAO,SAAS;IAEvE,qBACI,MAACO;QACGH,WAAWvB,WACP,uCACA;YACI,4BAA4BsB;QAChC,GACAC;;0BAGJ,MAAClB;gBAAMsB,gBAAe;gBAAgBC,YAAW;;kCAC7C,KAACvB,MAAMwB,IAAI;wBAACP,IAAI;kCACZ,cAAA,MAACjB;;8CACG,KAACF;oCAAS2B,MAAK;8CAASnB;;gCACvB,CAAC,CAACE,6BACC,KAACP;oCACGyB,MAAMlB;oCACNmB,WAAS,CAAC,oBAAoB,EAAErB,MAAM,aAAa,CAAC;8CAEpD,cAAA,KAACT;wCACG+B,MAAK;wCACLH,MAAM;wCACNP,WAAU;wCACVS,WAAS,CAAC,oBAAoB,EAAErB,MAAM,UAAU,CAAC;;;;;;oBAMpEa,yBAAW,KAACnB,MAAMwB,IAAI;wBAACK,QAAQ;kCAAIV;;;;0BAExC,KAACpB;gBACG0B,MAAK;gBACLP,WAAU;gBACVS,WAAS,CAAC,oBAAoB,EAAEpB,OAAO,OAAO,CAAC;0BAE9CA;;0BAGL,KAACP;gBAAMsB,gBAAe;gBAAgBJ,WAAU;0BAC5C,cAAA,MAAClB;oBAAMuB,YAAW;oBAAWL,WAAU;;sCACnC,KAACpB;4BAASoB,WAAU;4BAA+BO,MAAK;sCACnDvB,YAAYO,OAAOW;;wBAEvBV,SAASoB,0BACN,MAAClC;4BAASmC,OAAO;;gCAAC;gCAAG7B,YAAYQ,MAAMU;gCAAQ;;6BAC/CT,SAASmB,0BACT,KAAC3B;4BACGM,OAAOA;4BACPE,MAAMA;4BACNS,QAAQA;4BACRL,UAAUA;4BACVC,SAASA;4BACTE,WAAWvB,WAAWS,OAAO4B,gBAAgB,EAAE;6BAEnDF;;;;;;AAKxB,EAAE"}
@@ -1,12 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useRef } from 'react';
3
3
  import classnames from 'classnames';
4
- import { Icon, BodyText, Tooltip, useFocusVisible, } from '@servicetitan/design-system';
4
+ import { Icon, BodyText, Tooltip, useFocusVisible } from '@servicetitan/design-system';
5
5
  import * as Styles from './action-button.module.less';
6
- export const ActionButton = ({ onClick, disabled, children, iconName, hover, qaPrefix, active, tooltip, }) => {
6
+ export const ActionButton = ({ onClick, disabled, children, iconName, hover, qaPrefix, active, tooltip })=>{
7
7
  const buttonRef = useRef(null);
8
8
  const { isFocusVisible, focusFunction, blurFunction } = useFocusVisible(buttonRef);
9
- const handleClick = () => {
9
+ const handleClick = ()=>{
10
10
  if (disabled) {
11
11
  return;
12
12
  }
@@ -14,19 +14,45 @@ export const ActionButton = ({ onClick, disabled, children, iconName, hover, qaP
14
14
  onClick();
15
15
  }
16
16
  };
17
- const getButton = () => {
17
+ const getButton = ()=>{
18
18
  const classes = classnames(Styles.actionButton, qaPrefix, {
19
19
  [Styles.primary]: hover === 'primary' && !disabled,
20
20
  [Styles.negative]: hover === 'negative' && !disabled,
21
21
  [Styles.active]: active && !disabled,
22
22
  [Styles.disabled]: disabled,
23
- [Styles.focusVisible]: isFocusVisible,
23
+ [Styles.focusVisible]: isFocusVisible
24
+ });
25
+ return /*#__PURE__*/ _jsxs("button", {
26
+ type: "button",
27
+ ref: buttonRef,
28
+ className: classes,
29
+ onClick: handleClick,
30
+ disabled: disabled,
31
+ onFocus: focusFunction,
32
+ onBlur: blurFunction,
33
+ children: [
34
+ iconName && /*#__PURE__*/ _jsx(Icon, {
35
+ name: iconName,
36
+ size: "20px",
37
+ className: "m-r-1"
38
+ }),
39
+ /*#__PURE__*/ _jsx(BodyText, {
40
+ className: classnames(Styles.text, `${qaPrefix}-text`),
41
+ children: children
42
+ })
43
+ ]
24
44
  });
25
- return (_jsxs("button", { type: "button", ref: buttonRef, className: classes, onClick: handleClick, disabled: disabled, onFocus: focusFunction, onBlur: blurFunction, children: [iconName && _jsx(Icon, { name: iconName, size: "20px", className: "m-r-1" }), _jsx(BodyText, { className: classnames(Styles.text, `${qaPrefix}-text`), children: children })] }));
26
45
  };
27
46
  if (!tooltip) {
28
47
  return getButton();
29
48
  }
30
- return (_jsx(Tooltip, { text: tooltip, direction: "l", el: "div", className: `${qaPrefix}-tooltip`, children: getButton() }));
49
+ return /*#__PURE__*/ _jsx(Tooltip, {
50
+ text: tooltip,
51
+ direction: "l",
52
+ el: "div",
53
+ className: `${qaPrefix}-tooltip`,
54
+ children: getButton()
55
+ });
31
56
  };
57
+
32
58
  //# sourceMappingURL=action-button.js.map