playbook_ui 12.3.1 → 12.4.0.pre.alpha.map1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +1 -1
  3. data/app/pb_kits/playbook/data/menu.yml +1 -0
  4. data/app/pb_kits/playbook/index.js +5 -1
  5. data/app/pb_kits/playbook/pb_button/_button.tsx +2 -2
  6. data/app/pb_kits/playbook/pb_dashboard_value/{_dashboard_value.jsx → _dashboard_value.tsx} +12 -14
  7. data/app/pb_kits/playbook/pb_date_time_stacked/{_date_time_stacked.jsx → _date_time_stacked.tsx} +2 -6
  8. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.jsx +5 -2
  9. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +2 -0
  10. data/app/pb_kits/playbook/pb_map/_map.scss +114 -2
  11. data/app/pb_kits/playbook/pb_map/_map.tsx +42 -2
  12. data/app/pb_kits/playbook/pb_map/docs/_map_default.jsx +48 -24
  13. data/app/pb_kits/playbook/pb_map/docs/_map_default.md +4 -4
  14. data/app/pb_kits/playbook/pb_map/docs/_map_with_plugin.jsx +16 -14
  15. data/app/pb_kits/playbook/pb_map/docs/example.yml +0 -1
  16. data/app/pb_kits/playbook/pb_map/pbMapTheme.ts +23 -0
  17. data/app/pb_kits/playbook/pb_person/{_person.jsx → _person.tsx} +6 -8
  18. data/app/pb_kits/playbook/pb_person/person.test.js +43 -0
  19. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +102 -0
  20. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +155 -0
  21. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_default.jsx +10 -0
  22. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_default.md +1 -0
  23. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_initial_country.jsx +12 -0
  24. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_initial_country.md +1 -0
  25. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_only_countries.jsx +13 -0
  26. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_only_countries.md +1 -0
  27. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_preferred_countries.jsx +13 -0
  28. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_preferred_countries.md +1 -0
  29. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +7 -0
  30. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +4 -0
  31. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +74 -0
  32. data/app/pb_kits/playbook/pb_phone_number_input/types.d.ts +1 -0
  33. data/app/pb_kits/playbook/pb_radio/_radio.scss +19 -11
  34. data/app/pb_kits/playbook/pb_radio/_radio.tsx +1 -1
  35. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +1 -1
  36. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_add_on.html.erb +7 -6
  37. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_add_on.jsx +8 -8
  38. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +1 -1
  39. data/app/pb_kits/playbook/pb_title_count/{_title_count.jsx → _title_count.tsx} +7 -5
  40. data/app/pb_kits/playbook/pb_title_count/title_count.test.js +69 -0
  41. data/app/pb_kits/playbook/playbook-doc.js +2 -0
  42. data/app/pb_kits/playbook/tokens/_colors.scss +24 -24
  43. data/lib/playbook/version.rb +2 -2
  44. metadata +26 -9
  45. /data/app/pb_kits/playbook/pb_dashboard_value/{dashboardValueSettings.js → dashboardValueSettings.ts} +0 -0
@@ -0,0 +1,43 @@
1
+ import React from 'react'
2
+
3
+ import { render, screen } from '../utilities/test-utils'
4
+
5
+ import Person from './_person'
6
+
7
+ test('renders person classname', () => {
8
+ render(
9
+ <Person
10
+ data={{ testid: 'classname-test' }}
11
+ firstName="Kyle"
12
+ lastName="Fadigan"
13
+ />
14
+ )
15
+
16
+ const kit = screen.getByTestId('classname-test')
17
+ expect(kit).toHaveClass("pb_person_kit");
18
+ })
19
+
20
+
21
+ test('it renders the component with the first name', () => {
22
+ render(
23
+ <Person
24
+ firstName="Kyle"
25
+ lastName="Fadigan"
26
+ />
27
+ )
28
+
29
+ const kit = screen.getByText('Kyle')
30
+ expect(kit).toBeTruthy()
31
+ })
32
+
33
+ test('it renders the component with the last name', () => {
34
+ render(
35
+ <Person
36
+ firstName="Kyle"
37
+ lastName="Fadigan"
38
+ />
39
+ )
40
+
41
+ const kit = screen.getByText('Fadigan')
42
+ expect(kit).toBeTruthy()
43
+ })
@@ -0,0 +1,102 @@
1
+ @import "../tokens/colors";
2
+
3
+ .pb_phone_number_input {
4
+ input::placeholder {
5
+ color: $focus_input_light;
6
+ }
7
+
8
+ .iti__country {
9
+ padding: 5px 10px 5px 16px;
10
+ }
11
+
12
+ .iti__selected-flag {
13
+ padding: 0 6px 0 16px;
14
+ }
15
+
16
+ .iti__country.iti__highlight {
17
+ background-color: $hover_light;
18
+
19
+ .iti__country-name, .iti__dial-code {
20
+ color: $primary
21
+ }
22
+ }
23
+
24
+ .iti--allow-dropdown .iti__flag-container:hover .iti__selected-flag {
25
+ background-color: $focus_input_light;
26
+ }
27
+
28
+ .iti__flag-container:hover + .text_input {
29
+ background-color: $focus_input_light;
30
+ }
31
+
32
+ .iti__flag {
33
+ background-image: url("https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.19/img/flags.png");
34
+ }
35
+
36
+ .iti--separate-dial-code .iti__selected-flag {
37
+ background-color: rgba($white, $opacity_1);
38
+ }
39
+
40
+ .iti__arrow {
41
+ border-left: unset;
42
+ border-right: unset;
43
+ border-top: unset;
44
+ width: unset;
45
+ height: unset;
46
+ margin-bottom: $space_xxs;
47
+ }
48
+
49
+ .iti__arrow--up {
50
+ border-bottom: unset;
51
+ }
52
+
53
+ .iti__arrow::before {
54
+ border-style: solid;
55
+ border-width: 0.1em 0.1em 0 0;
56
+ content: '';
57
+ display: inline-block;
58
+ height: 0.6em;
59
+ left: 0.1em;
60
+ position: relative;
61
+ vertical-align: top;
62
+ width: 0.6em;
63
+ top: 10px;
64
+ transform: rotate(135deg);
65
+ font-size: 0.5em;
66
+ color: $slate;
67
+ }
68
+
69
+ .iti__arrow.iti__arrow--up::before {
70
+ transform: rotate(-45deg);
71
+ top: 12px;
72
+ }
73
+
74
+ .iti__active::after {
75
+ float: right;
76
+ content: "";
77
+ margin-top: 5px;
78
+ transform: rotate(45deg);
79
+ height: 12px;
80
+ width: 6px;
81
+ border-bottom: 2px solid;
82
+ border-right: 2px solid;
83
+ border-radius: 1px;
84
+ }
85
+
86
+ .iti__country-list {
87
+ min-width: 340px;
88
+ border-radius: $border_radius_md;
89
+ border: 1px solid $border_light;
90
+ box-shadow: $shadow_deep;
91
+ }
92
+
93
+ .iti__divider {
94
+ border-bottom: 1px solid $border_light;
95
+ }
96
+
97
+ @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
98
+ .iti__flag {
99
+ background-image: url("https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.19/img/flags@2x.png");
100
+ }
101
+ }
102
+ }
@@ -0,0 +1,155 @@
1
+ /* @flow */
2
+ import React, { useEffect, useRef, useState } from 'react'
3
+ import classnames from 'classnames'
4
+ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
5
+ import { globalProps } from '../utilities/globalProps'
6
+ import intlTelInput from 'intl-tel-input'
7
+ import 'intl-tel-input/build/css/intlTelInput.css'
8
+ import TextInput from '../pb_text_input/_text_input'
9
+
10
+ declare global {
11
+ interface Window {
12
+ intlTelInputGlobals: any,
13
+ }
14
+ }
15
+
16
+ type PhoneNumberInputProps = {
17
+ aria?: { [key: string]: string },
18
+ className?: string,
19
+ data?: { [key: string]: string },
20
+ disabled?: boolean,
21
+ id?: string,
22
+ initialCountry?: string,
23
+ isValid?: (valid: boolean) => void,
24
+ label?: string,
25
+ name?: string,
26
+ onChange?: (e: React.FormEvent<HTMLInputElement>) => void,
27
+ onlyCountries: string[],
28
+ preferredCountries?: string[],
29
+ value?: string,
30
+ }
31
+
32
+ enum ValidationError {
33
+ TooShort = 2,
34
+ TooLong = 3,
35
+ }
36
+
37
+ const formatToGlobalCountryName = (countryName: string) => {
38
+ return countryName.split('(')[0].trim()
39
+ }
40
+
41
+ const formatAllCountries = () => {
42
+ let countryData = window.intlTelInputGlobals.getCountryData()
43
+ for (let i = 0; i < countryData.length; i++) {
44
+ let country = countryData[i]
45
+ country.name = formatToGlobalCountryName(country.name)
46
+ }
47
+ }
48
+
49
+ const containOnlyNumbers = (value: string) => {
50
+ return /^(\++)*(\d+)$/.test(value)
51
+ }
52
+
53
+ const PhoneNumberInput = (props: PhoneNumberInputProps) => {
54
+ const {
55
+ aria = {},
56
+ className,
57
+ data = {},
58
+ disabled = false,
59
+ id = '',
60
+ initialCountry = '',
61
+ isValid = () => {void 0 },
62
+ label = '',
63
+ name = '',
64
+ onChange = () => { void 0 },
65
+ onlyCountries = [],
66
+ preferredCountries = [],
67
+ value = '',
68
+ } = props
69
+
70
+ const ariaProps = buildAriaProps(aria)
71
+ const dataProps = buildDataProps(data)
72
+ const classes = classnames(buildCss('pb_phone_number_input'), globalProps(props), className)
73
+
74
+ const inputRef = useRef<HTMLInputElement>()
75
+ const [inputValue, setInputValue] = useState(value)
76
+ const [itiInit, setItiInit] = useState<any>()
77
+ const [error, setError] = useState('')
78
+
79
+ const validateTooLongNumber = (itiInit: any) => {
80
+ const error = itiInit.getValidationError()
81
+
82
+ if (error === ValidationError.TooLong) {
83
+ const countryName = itiInit.getSelectedCountryData().name
84
+ setError(`Invalid ${countryName} phone number (too long)`)
85
+ } else {
86
+ setError('')
87
+ }
88
+ }
89
+
90
+ const validateTooShortNumber = () => {
91
+ const error = itiInit.getValidationError()
92
+
93
+ if (error === ValidationError.TooShort) {
94
+ const countryName = itiInit.getSelectedCountryData().name
95
+ setError(`Invalid ${countryName} phone number (too short)`)
96
+ }
97
+ }
98
+
99
+ const validateOnlyNumbers = () => {
100
+ if (inputValue && !containOnlyNumbers(inputValue)) {
101
+ setError('Invalid phone number. Enter numbers only.')
102
+ }
103
+ }
104
+
105
+ const validateErrors = () => {
106
+ validateTooShortNumber()
107
+ validateOnlyNumbers()
108
+ }
109
+
110
+ const handleOnChange = (evt: React.ChangeEvent<HTMLInputElement>) => {
111
+ setInputValue(evt.target.value)
112
+ validateTooLongNumber(itiInit)
113
+ onChange(evt)
114
+ isValid(itiInit.isValidNumber())
115
+ }
116
+
117
+ useEffect(() => {
118
+ formatAllCountries()
119
+
120
+ const telInputInit = new intlTelInput(inputRef.current, {
121
+ utilsScript: 'https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.19/js/utils.js',
122
+ separateDialCode: true,
123
+ preferredCountries,
124
+ allowDropdown: !disabled,
125
+ initialCountry,
126
+ onlyCountries,
127
+ }
128
+ )
129
+
130
+ inputRef.current.addEventListener("countrychange", () => validateTooLongNumber(telInputInit))
131
+ setItiInit(telInputInit)
132
+ }, [])
133
+
134
+ return (
135
+ <div
136
+ {...ariaProps}
137
+ {...dataProps}
138
+ className={classes}
139
+ >
140
+ <TextInput
141
+ disabled={disabled}
142
+ error={error}
143
+ id={id}
144
+ label={label}
145
+ name={name}
146
+ onBlur={() => validateErrors()}
147
+ onChange={handleOnChange}
148
+ ref={inputRef}
149
+ value={inputValue}
150
+ />
151
+ </div>
152
+ )
153
+ }
154
+
155
+ export default PhoneNumberInput
@@ -0,0 +1,10 @@
1
+ import React from 'react'
2
+ import { PhoneNumberInput } from '../../'
3
+
4
+ const PhoneNumberInputDefault = () => (
5
+ <>
6
+ <PhoneNumberInput id='default' />
7
+ </>
8
+ )
9
+
10
+ export default PhoneNumberInputDefault
@@ -0,0 +1 @@
1
+ NOTE: Error state is handled by default, validating length (too long or too short) relative to the selected country’s phone format and enforcing numeric-only values for all countries.
@@ -0,0 +1,12 @@
1
+ import React from 'react'
2
+ import { PhoneNumberInput } from '../../'
3
+
4
+ const PhoneNumberInitialCountry = () => (
5
+ <>
6
+ <PhoneNumberInput id='initial'
7
+ initialCountry='br'
8
+ />
9
+ </>
10
+ )
11
+
12
+ export default PhoneNumberInitialCountry
@@ -0,0 +1 @@
1
+ Setting an initial country preselects that country within the input as well as the country dropdown.
@@ -0,0 +1,13 @@
1
+ import React from 'react'
2
+ import { PhoneNumberInput } from '../../'
3
+
4
+ const PhoneNumberInputOnlyCountries = () => (
5
+ <>
6
+ <PhoneNumberInput
7
+ id='only'
8
+ onlyCountries={['us', 'br']}
9
+ />
10
+ </>
11
+ )
12
+
13
+ export default PhoneNumberInputOnlyCountries
@@ -0,0 +1 @@
1
+ Limiting countries removes all countries from the dropdown except your selections.
@@ -0,0 +1,13 @@
1
+ import React from 'react'
2
+ import { PhoneNumberInput } from '../../'
3
+
4
+ const PhoneNumberInputPreferredCountries = () => (
5
+ <>
6
+ <PhoneNumberInput
7
+ id='preferred'
8
+ preferredCountries={['us', 'br', 'ph', 'gb']}
9
+ />
10
+ </>
11
+ )
12
+
13
+ export default PhoneNumberInputPreferredCountries
@@ -0,0 +1 @@
1
+ Preferred countries will display in the order they are listed with the first country preselected, and all non-preferred countries listed alphabetically below a section separator within the remaining dropdown.
@@ -0,0 +1,7 @@
1
+ examples:
2
+
3
+ react:
4
+ - phone_number_input_default: Default
5
+ - phone_number_input_preferred_countries: Preferred Countries
6
+ - phone_number_input_initial_country: Initial Country
7
+ - phone_number_input_only_countries: Limited Countries
@@ -0,0 +1,4 @@
1
+ export { default as PhoneNumberInputDefault } from './_phone_number_input_default'
2
+ export { default as PhoneNumberInputPreferredCountries } from './_phone_number_input_preferred_countries'
3
+ export { default as PhoneNumberInputInitialCountry } from './_phone_number_input_initial_country'
4
+ export { default as PhoneNumberInputOnlyCountries } from './_phone_number_input_only_countries'
@@ -0,0 +1,74 @@
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+ import PhoneNumberInput from './_phone_number_input'
4
+
5
+ const testId = "phoneNumberInput"
6
+
7
+ test('should be disabled', () => {
8
+ const props = {
9
+ disabled: true,
10
+ id: testId,
11
+ }
12
+
13
+ render(<PhoneNumberInput {...props} />)
14
+ const kit = screen.getByRole("textbox")
15
+ expect(kit).toBeDisabled()
16
+ })
17
+
18
+ test('should be enabled by default', () => {
19
+ const props = {
20
+ id: testId,
21
+ }
22
+
23
+ render(<PhoneNumberInput {...props} />)
24
+ const kit = screen.getByRole("textbox")
25
+ expect(kit).not.toBeDisabled()
26
+ })
27
+
28
+ test('should have label', () => {
29
+ const label = 'Phone Number'
30
+ const props = {
31
+ id: testId,
32
+ label,
33
+ }
34
+
35
+ render(<PhoneNumberInput {...props} />)
36
+ const kit = screen.getByText(label)
37
+ expect(kit).toBeInTheDocument()
38
+ })
39
+
40
+ test('should pass data prop', () => {
41
+ const props = {
42
+ data: { testid: testId },
43
+ id: testId,
44
+ }
45
+
46
+ render(<PhoneNumberInput {...props} />)
47
+ const kit = screen.getByTestId(testId)
48
+ expect(kit).toBeInTheDocument()
49
+ })
50
+
51
+ test('should pass className prop', () => {
52
+ const className = 'custom-class-name'
53
+ const props = {
54
+ className,
55
+ data: { testid: testId },
56
+ id: testId,
57
+ }
58
+
59
+ render(<PhoneNumberInput {...props} />)
60
+ const kit = screen.getByTestId(testId)
61
+ expect(kit).toHaveClass(className)
62
+ })
63
+
64
+ test('should pass value prop', () => {
65
+ const value = '1234567890'
66
+ const props = {
67
+ id: testId,
68
+ value,
69
+ }
70
+
71
+ render(<PhoneNumberInput {...props} />)
72
+ const kit = screen.getByRole("textbox")
73
+ expect(kit).toHaveDisplayValue(value)
74
+ })
@@ -0,0 +1 @@
1
+ declare module 'intl-tel-input'
@@ -16,16 +16,13 @@
16
16
  border-radius: 1000px;
17
17
  border: 2px solid $border_light;
18
18
  margin-right: $space_xs;
19
- transition-property: border-color, border;
20
- transition-duration: $transition_short;
21
- transition-timing-function: $easeIn;
19
+ transition: background $transition_default ease, box-shadow $transition_default ease, border-color $transition_default ease;
22
20
  }
23
21
 
24
22
  @media (hover:hover) {
25
- &:hover, &:focus {
26
- .pb_radio_button {
27
- border-color: $primary_action;
28
- }
23
+ &:hover .pb_radio_button {
24
+ background-color: $bg_light;
25
+ border-color: $border_light;
29
26
  }
30
27
  }
31
28
 
@@ -33,7 +30,12 @@
33
30
  position: relative;
34
31
  width: 0;
35
32
  left: $offscreen;
36
- &:checked, &:focus {
33
+ &:focus-visible {
34
+ & ~ .pb_radio_button {
35
+ box-shadow: 0px 0px 0px 2px $white, 0px 0px 0px 4px $primary;
36
+ }
37
+ }
38
+ &:checked {
37
39
  & ~ .pb_radio_button {
38
40
  border: 6px solid $primary;
39
41
  }
@@ -54,7 +56,12 @@
54
56
  border-color: $border_dark;
55
57
  }
56
58
  input {
57
- &:checked, &:focus {
59
+ &:focus-visible {
60
+ & ~ .pb_radio_button {
61
+ box-shadow: 0px 0px 0px 2px $bg_dark_card, 0px 0px 0px 4px $primary;
62
+ }
63
+ }
64
+ &:checked {
58
65
  & ~ .pb_radio_button {
59
66
  border: 6px solid $primary;
60
67
  }
@@ -62,9 +69,10 @@
62
69
  }
63
70
 
64
71
  @media (hover:hover) {
65
- &:hover, &:focus {
72
+ &:hover {
66
73
  .pb_radio_button {
67
- border-color: $primary_action;
74
+ background-color: rgba($white,.10);
75
+ border-color: $border_dark;
68
76
  }
69
77
  }
70
78
  }
@@ -78,7 +78,7 @@ const Radio = ({
78
78
  status={error ? 'negative' : null}
79
79
  text={label}
80
80
  variant={null}
81
- />
81
+ />
82
82
  </label>
83
83
  )
84
84
  }
@@ -215,7 +215,7 @@
215
215
  }
216
216
  .text_input {
217
217
  border-left: 0;
218
- padding-left: 0;
218
+ padding-left: 16px;
219
219
  }
220
220
  }
221
221
  &_left_on {
@@ -8,6 +8,12 @@
8
8
  add_on: { icon: "user", alignment: 'right', border: true }
9
9
  }) %>
10
10
 
11
+
12
+ <%= pb_rails("text_input", props: {
13
+ label: "Right-Aligned Add On With No Border",
14
+ add_on: { icon: "percent", alignment: 'right', border: false }
15
+ }) %>
16
+
11
17
  <%= pb_rails("text_input", props: {
12
18
  label: "Left-Aligned Add On With No Border",
13
19
  add_on: { icon: "percent", alignment: 'left', border: false }
@@ -16,9 +22,4 @@
16
22
  <%= pb_rails("text_input", props: {
17
23
  label: "Left-Aligned Add On With Border",
18
24
  add_on: { icon: "user", alignment: 'left', border: true }
19
- }) %>
20
-
21
- <%= pb_rails("text_input", props: {
22
- label: "Right-Aligned Add On With No Border",
23
- add_on: { icon: "percent", alignment: 'right', border: false }
24
- }) %>
25
+ }) %>
@@ -51,19 +51,19 @@ const TextInputAddOn = (props) => {
51
51
  </div>
52
52
  <div>
53
53
  <TextInput
54
- addOn={{ icon: 'percent', alignment: 'left', border: false }}
55
- label="Left-Aligned Add On With No Border"
56
- onChange={handleUpdateSecondInput}
57
- value={secondInput}
54
+ addOn={{ icon: 'percent', alignment: 'right', border: false }}
55
+ label="Right-Aligned Add On With No Border"
56
+ onChange={handleUpdateThirdInput}
57
+ value={thirdInput}
58
58
  {...props}
59
59
  />
60
60
  </div>
61
61
  <div>
62
62
  <TextInput
63
- addOn={{ icon: 'percent', alignment: 'right', border: false }}
64
- label="Right-Aligned Add On With No Border"
65
- onChange={handleUpdateThirdInput}
66
- value={thirdInput}
63
+ addOn={{ icon: 'percent', alignment: 'left', border: false }}
64
+ label="Left-Aligned Add On With No Border"
65
+ onChange={handleUpdateSecondInput}
66
+ value={secondInput}
67
67
  {...props}
68
68
  />
69
69
  </div>
@@ -15,7 +15,7 @@ type TimeStackedProps = {
15
15
  data?: { [key: string]: string },
16
16
  date?: string,
17
17
  id?: string,
18
- time: number | Date,
18
+ time?: number | Date,
19
19
  timeZone?: string,
20
20
  }
21
21
 
@@ -11,17 +11,17 @@ import Title from '../pb_title/_title'
11
11
 
12
12
  type TitleCountProps = {
13
13
  align: "center" | "left" | "right",
14
- aria?: object,
14
+ aria?: { [key: string]: string },
15
15
  className?: string,
16
- count?: Numeric,
16
+ count?: number,
17
17
  dark?: boolean,
18
- data?: object,
18
+ data?: { [key: string]: string },
19
19
  id?: string,
20
20
  title?: string,
21
21
  size?: "lg" | "sm",
22
22
  };
23
23
 
24
- const TitleCount = (props: TitleCountProps) => {
24
+ const TitleCount = (props: TitleCountProps): React.ReactElement => {
25
25
  const {
26
26
  align = 'left',
27
27
  aria = {},
@@ -61,7 +61,9 @@ const TitleCount = (props: TitleCountProps) => {
61
61
  color="light"
62
62
  dark={dark}
63
63
  >
64
- <If condition={count}>{formatCount}</If>
64
+ {count &&
65
+ formatCount
66
+ }
65
67
  </Body>
66
68
 
67
69
  </div>