playbook_ui 12.3.1 → 12.4.0.pre.alpha.map1

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 (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>