playbook_ui 12.3.1 → 12.4.0.pre.alpha.devdocstest1

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 (38) 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 +1 -1
  5. data/app/pb_kits/playbook/pb_dashboard_value/{_dashboard_value.jsx → _dashboard_value.tsx} +12 -14
  6. data/app/pb_kits/playbook/pb_date_time_stacked/{_date_time_stacked.jsx → _date_time_stacked.tsx} +2 -6
  7. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.jsx +5 -2
  8. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +2 -0
  9. data/app/pb_kits/playbook/pb_lightbox/Carousel/index.tsx +7 -7
  10. data/app/pb_kits/playbook/pb_person/{_person.jsx → _person.tsx} +6 -8
  11. data/app/pb_kits/playbook/pb_person/person.test.js +43 -0
  12. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +102 -0
  13. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +155 -0
  14. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_default.jsx +10 -0
  15. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_default.md +1 -0
  16. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_initial_country.jsx +12 -0
  17. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_initial_country.md +1 -0
  18. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_only_countries.jsx +13 -0
  19. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_only_countries.md +1 -0
  20. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_preferred_countries.jsx +13 -0
  21. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_preferred_countries.md +1 -0
  22. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +7 -0
  23. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +4 -0
  24. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +74 -0
  25. data/app/pb_kits/playbook/pb_phone_number_input/types.d.ts +1 -0
  26. data/app/pb_kits/playbook/pb_radio/_radio.scss +19 -11
  27. data/app/pb_kits/playbook/pb_radio/_radio.tsx +1 -1
  28. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +1 -1
  29. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_add_on.html.erb +7 -6
  30. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_add_on.jsx +8 -8
  31. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +1 -1
  32. data/app/pb_kits/playbook/pb_title_count/{_title_count.jsx → _title_count.tsx} +7 -5
  33. data/app/pb_kits/playbook/pb_title_count/title_count.test.js +69 -0
  34. data/app/pb_kits/playbook/playbook-doc.js +2 -0
  35. data/app/pb_kits/playbook/tokens/_colors.scss +24 -24
  36. data/lib/playbook/version.rb +2 -2
  37. metadata +25 -9
  38. /data/app/pb_kits/playbook/pb_dashboard_value/{dashboardValueSettings.js → dashboardValueSettings.ts} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 03ffd4e3909a43dd2714dc9758a33fc752497e9094813c57184cfd8eab6c2425
4
- data.tar.gz: 5fe6360b001e357d6e211c16e36ec5ddaf30ff5bc6d88d3d07272cd52d305076
3
+ metadata.gz: 3663b6779408f8388e9eaf0cf9f6ff48d0e98e5f6ac6abc11c75c5360b6b5f76
4
+ data.tar.gz: 809146bf7a2354e0010a59f6672e36daf0dd547eedf5525dc584abb9c0fa0961
5
5
  SHA512:
6
- metadata.gz: '09002a0c8f9c2983ee3f5e484d75ef119bd874bcd85f39a6b23c8bb5b656b531543525ddbb83c1565eb308517f78c315918583ab5850966e3f5b33ab6583ea4d'
7
- data.tar.gz: af4db16c100917ba7fda5be538be2be422610c9bb41b8d6dc58e3ff54763171f6f48a6b6bf2a2302db52904863533b37137c560363cbaf65c148df304c969ec8
6
+ metadata.gz: 30fb6ffcbc0b0b0fe04cd8c5400ffa31ad39756ed9e9eb53a46b464898a9c4cdea4cf6784a9091b4f17b151b1e245672d5a7431ccaa9e02558acd62b5d9d0bc1
7
+ data.tar.gz: 71fe5fdce4763e7ef7fe6600a59549bfb2b74532460ef9bb29bcfb99aa8fe5d86de6585a3f44de9fb09827c410477f4e2200ce53b3a91d4614e7db8c4c5644c7
@@ -61,6 +61,7 @@
61
61
  @import 'pb_passphrase/passphrase';
62
62
  @import 'pb_person/person';
63
63
  @import 'pb_person_contact/person_contact';
64
+ @import 'pb_phone_number_input/phone_number_input';
64
65
  @import 'pb_pill/pill';
65
66
  @import 'pb_popover/popover';
66
67
  @import 'pb_progress_pills/progress_pills';
@@ -106,4 +107,3 @@
106
107
  @import './utilities/display';
107
108
  @import './utilities/flexbox';
108
109
  @import './utilities/focus';
109
-
@@ -32,6 +32,7 @@ kits:
32
32
  - form_group
33
33
  - form_pill
34
34
  - passphrase
35
+ - phone_number_input
35
36
  - radio
36
37
  - rich_text_editor
37
38
  - select
@@ -53,7 +53,6 @@ export { default as LabelPill } from './pb_label_pill/_label_pill'
53
53
  export { default as LabelValue } from './pb_label_value/_label_value'
54
54
  export { default as Layout } from './pb_layout/_layout'
55
55
  export { default as Legend } from './pb_legend/_legend'
56
- export { default as Lightbox } from './pb_lightbox/_lightbox'
57
56
  export { default as LineGraph } from './pb_line_graph/_line_graph'
58
57
  export { default as List } from './pb_list/_list'
59
58
  export { default as ListItem } from './pb_list/_list_item'
@@ -69,6 +68,7 @@ export { default as Passphrase } from './pb_passphrase/_passphrase'
69
68
  export { default as PbReactPopover } from './pb_popover/_popover'
70
69
  export { default as Person } from './pb_person/_person'
71
70
  export { default as PersonContact } from './pb_person_contact/_person_contact'
71
+ export { default as PhoneNumberInput} from './pb_phone_number_input/_phone_number_input'
72
72
  export { default as Pill } from './pb_pill/_pill'
73
73
  export { default as ProgressPills } from './pb_progress_pills/_progress_pills'
74
74
  export { default as ProgressSimple } from './pb_progress_simple/_progress_simple'
@@ -1,5 +1,3 @@
1
- /* @flow */
2
-
3
1
  import React from 'react'
4
2
  import classnames from 'classnames'
5
3
  import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
@@ -11,22 +9,22 @@ import StatValue from '../pb_stat_value/_stat_value'
11
9
 
12
10
  type DashboardValueProps = {
13
11
  align?: 'left' | 'center' | 'right',
14
- aria?: object,
12
+ aria?: { [key: string]: string },
15
13
  className?: string,
16
- data?: object,
14
+ data?: { [key: string]: string },
17
15
  id?: string,
18
16
  statChange?: {
19
- change?: string,
20
- value?: string | Number
17
+ change? : 'increase' | 'decrease' | 'neutral',
18
+ value?: string | number
21
19
  },
22
20
  statLabel?: string,
23
21
  statValue?: {
24
22
  unit?: string,
25
- value?: string | Number
23
+ value?: string | number
26
24
  }
27
25
  }
28
26
 
29
- const DashboardValue = (props: DashboardValueProps) => {
27
+ const DashboardValue = (props: DashboardValueProps): React.ReactElement => {
30
28
  const {
31
29
  align = 'left',
32
30
  aria = {},
@@ -53,21 +51,21 @@ const DashboardValue = (props: DashboardValueProps) => {
53
51
  className={classes}
54
52
  id={id}
55
53
  >
56
- <If condition={statLabel}>
54
+ { statLabel &&
57
55
  <Body color="light">{statLabel}</Body>
58
- </If>
59
- <If condition={statValue}>
56
+ }
57
+ { statValue &&
60
58
  <StatValue
61
59
  unit={statValue.unit}
62
60
  value={statValue.value}
63
61
  />
64
- </If>
65
- <If condition={statChange}>
62
+ }
63
+ { statChange &&
66
64
  <StatChange
67
65
  change={statChange.change}
68
66
  value={statChange.value}
69
67
  />
70
- </If>
68
+ }
71
69
  </div>
72
70
  )
73
71
  }
@@ -1,6 +1,4 @@
1
1
 
2
- /* @flow */
3
-
4
2
  import React from 'react'
5
3
 
6
4
  import { buildCss } from '../utilities/props'
@@ -20,7 +18,7 @@ type DateTimeStackedProps = {
20
18
  timeZone?: string,
21
19
  }
22
20
 
23
- const DateTimeStacked = (props: DateTimeStackedProps) => {
21
+ const DateTimeStacked = (props: DateTimeStackedProps): React.ReactElement => {
24
22
  if (props.date) deprecatedProps('Date Time Stacked', ['date'])
25
23
 
26
24
  const {
@@ -34,7 +32,7 @@ const DateTimeStacked = (props: DateTimeStackedProps) => {
34
32
 
35
33
  return (
36
34
  <Flex
37
- inline="flex-container"
35
+ inline={false}
38
36
  vertical="stretch"
39
37
  {...props}
40
38
  >
@@ -44,7 +42,6 @@ const DateTimeStacked = (props: DateTimeStackedProps) => {
44
42
  bold
45
43
  dark={dark}
46
44
  date={date || datetime}
47
- timeZone={timeZone}
48
45
  />
49
46
  </FlexItem>
50
47
 
@@ -57,7 +54,6 @@ const DateTimeStacked = (props: DateTimeStackedProps) => {
57
54
  className={classes}
58
55
  dark={dark}
59
56
  date={date || datetime}
60
- tag="caption"
61
57
  timeZone={timeZone}
62
58
  />
63
59
  </FlexItem>
@@ -9,17 +9,20 @@ const DateTimeStackedDefault = (props) => (
9
9
  {...props}
10
10
  />
11
11
  <br />
12
+ <DateTimeStacked
13
+ datetime={new Date(2018, 2, 20)}
14
+ {...props}
15
+ />
16
+ <br />
12
17
  <DateTimeStacked
13
18
  datetime={new Date()}
14
19
  timeZone="Asia/Tokyo"
15
-
16
20
  {...props}
17
21
  />
18
22
  <br />
19
23
  <DateTimeStacked
20
24
  datetime={new Date()}
21
25
  timeZone="America/Denver"
22
-
23
26
  {...props}
24
27
  />
25
28
 
@@ -5,6 +5,7 @@
5
5
  @import "../tokens/border_radius";
6
6
  @import "../tokens/spacing";
7
7
  @import "../tokens/animation-curves";
8
+ @import "../tokens/positioning";
8
9
 
9
10
 
10
11
 
@@ -119,6 +120,7 @@
119
120
  position: sticky;
120
121
  top: 0;
121
122
  background-color: $white;
123
+ z-index: $z_8;
122
124
  }
123
125
 
124
126
  // @include pb_card;
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable jsx-control-statements/jsx-use-if-tag */
2
- import React, { useEffect } from 'react'
2
+ import React from 'react'
3
3
  import Slides from './Slides'
4
4
  import Thumbnails from './Thumbnails'
5
5
 
@@ -24,13 +24,13 @@ export default function Carousel({
24
24
  onChange = ()=>{},
25
25
  setIndex,
26
26
  }: CarouselType): React.ReactElement {
27
- useEffect(() => {
28
- document.body.style.overflow = 'hidden'
27
+ // useEffect(() => {
28
+ // document.body.style.overflow = 'hidden'
29
29
 
30
- return () => {
31
- document.body.style.overflow = 'initial'
32
- }
33
- }, [])
30
+ // return () => {
31
+ // document.body.style.overflow = 'initial'
32
+ // }
33
+ // }, [])
34
34
 
35
35
  const handleChange = (index: number) => {
36
36
  onChange(index)
@@ -1,5 +1,3 @@
1
- /* @flow */
2
-
3
1
  import React from 'react'
4
2
  import classnames from 'classnames'
5
3
 
@@ -14,15 +12,15 @@ import Body from '../pb_body/_body'
14
12
  import Title from '../pb_title/_title'
15
13
 
16
14
  type PersonProps = {
17
- aria?: object,
18
- className?: string | array<string>,
19
- data?: object,
15
+ aria?: { [key: string]: string },
16
+ className?: string | string[],
17
+ data?: { [key: string]: string },
20
18
  firstName: string,
21
19
  id?: string,
22
20
  lastName: string,
23
21
  }
24
22
 
25
- const Person = (props: PersonProps) => {
23
+ const Person = (props: PersonProps): React.ReactElement => {
26
24
  const {
27
25
  aria = {},
28
26
  className,
@@ -52,13 +50,13 @@ const Person = (props: PersonProps) => {
52
50
  >
53
51
  {firstName}
54
52
  </Body>
55
- <If condition={lastName}>
53
+ {lastName &&
56
54
  <Title
57
55
  className="pb_person_first"
58
56
  size={4}
59
57
  text={` ${lastName}`}
60
58
  />
61
- </If>
59
+ }
62
60
  </div>
63
61
  )
64
62
  }
@@ -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>
@@ -0,0 +1,69 @@
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+
4
+ import TitleCount from './_title_count'
5
+
6
+ test('returns namespaced class name', () => {
7
+ render(
8
+ <TitleCount
9
+ count={35.78}
10
+ data={{ testid: 'primary-test' }}
11
+ title="Appointments"
12
+ />
13
+ )
14
+
15
+ const kit = screen.getByTestId('primary-test')
16
+ expect(kit).toHaveClass('pb_title_count_kit_left_sm')
17
+ })
18
+
19
+ test('size variant', () => {
20
+ render(
21
+ <TitleCount
22
+ count={35.78}
23
+ data={{ testid: 'large-test' }}
24
+ size="lg"
25
+ title="Appointments"
26
+ />
27
+ )
28
+
29
+ const kit = screen.getByTestId('large-test')
30
+ expect(kit).toHaveClass('pb_title_count_kit_left_lg')
31
+ })
32
+
33
+ test('align variant', () => {
34
+ render(
35
+ <TitleCount
36
+ align="right"
37
+ count={35.78}
38
+ data={{ testid: 'large-test' }}
39
+ title="Appointments"
40
+ />
41
+ )
42
+
43
+ const kit = screen.getByTestId('large-test')
44
+ expect(kit).toHaveClass('pb_title_count_kit_right_sm')
45
+ })
46
+
47
+ test('renders count correctly', () => {
48
+ render(
49
+ <TitleCount
50
+ count={35.78}
51
+ title="Appointments"
52
+ />
53
+ )
54
+
55
+ const kit = screen.getByText('35.78')
56
+ expect(kit).toBeTruthy()
57
+ })
58
+
59
+ test('renders title correctly', () => {
60
+ render(
61
+ <TitleCount
62
+ count={35.78}
63
+ title="Appointments"
64
+ />
65
+ )
66
+
67
+ const kit = screen.getByText('Appointments')
68
+ expect(kit).toBeTruthy()
69
+ })
@@ -65,6 +65,7 @@ import * as Passphrase from 'pb_passphrase/docs'
65
65
  import * as PbReactPopover from 'pb_popover/docs'
66
66
  import * as Person from 'pb_person/docs'
67
67
  import * as PersonContact from 'pb_person_contact/docs'
68
+ import * as PhoneNumberInput from 'pb_phone_number_input/docs'
68
69
  import * as Pill from 'pb_pill/docs'
69
70
  import * as ProgressPills from 'pb_progress_pills/docs'
70
71
  import * as ProgressSimple from 'pb_progress_simple/docs'
@@ -163,6 +164,7 @@ WebpackerReact.setup({
163
164
  ...PbReactPopover,
164
165
  ...Person,
165
166
  ...PersonContact,
167
+ ...PhoneNumberInput,
166
168
  ...Pill,
167
169
  ...ProgressPills,
168
170
  ...ProgressSimple,
@@ -59,7 +59,7 @@ $main_colors: (
59
59
  Background colors ------------------*/
60
60
  $bg_light: $silver !default;
61
61
  $bg_dark: #0a0527 !default;
62
- $bg_dark_card: #231E3D;
62
+ $bg_dark_card: #231E3D !default;
63
63
  $background_colors: (
64
64
  bg_light: $bg_light,
65
65
  bg_dark: $bg_dark,
@@ -68,7 +68,7 @@ $background_colors: (
68
68
 
69
69
  /* Card colors ------------------*/
70
70
  $card_light: $white !default;
71
- $card_dark: rgba($white, $opacity_1);
71
+ $card_dark: rgba($white, $opacity_1) !default;
72
72
  $card_colors: (
73
73
  card_light: $card_light,
74
74
  card_dark: $card_dark
@@ -80,7 +80,7 @@ $action_colors: (
80
80
  );
81
81
 
82
82
  /* Active colors ----------------------*/
83
- $active_light: lighten(#E5F2FF, 3.5%);
83
+ $active_light: lighten(#E5F2FF, 3.5%) !default;
84
84
  $active_dark: #0082ff !default;
85
85
  $active_colors: (
86
86
  active_light: $active_light,
@@ -88,17 +88,17 @@ $active_colors: (
88
88
  );
89
89
 
90
90
  /* Hover colors -----------------------*/
91
- $hover_light: darken($silver, 5%);
92
- $hover_dark: rgba($white, $opacity_2);
91
+ $hover_light: darken($silver, 5%) !default;
92
+ $hover_dark: rgba($white, $opacity_2) !default;
93
93
  $hover_colors: (
94
94
  hover_light: $hover_light,
95
95
  hover_dark: $hover_dark
96
96
  );
97
97
 
98
98
  /* Focus colors -----------------------*/
99
- $focus_color: $primary;
100
- $focus_input_light: rgba($active_light, $opacity_5);
101
- $focus_input_dark: rgba(#144075, $opacity_5);
99
+ $focus_color: $primary !default;
100
+ $focus_input_light: rgba($active_light, $opacity_5) !default;
101
+ $focus_input_dark: rgba(#144075, $opacity_5) !default;
102
102
  $focus_input_colors: (
103
103
  focus_input_light: $focus_input_light,
104
104
  focus_input_dark: $focus_input_dark,
@@ -107,14 +107,14 @@ $focus_input_colors: (
107
107
 
108
108
  /* Border colors ----------------------*/
109
109
  $border_light: #E4E8F0 !default;
110
- $border_dark: rgba($white, $opacity_1);
110
+ $border_dark: rgba($white, $opacity_1) !default;
111
111
  $border_colors: (
112
112
  border_light: $border_light,
113
113
  border_dark: $border_dark
114
114
  );
115
115
 
116
116
  /* Shadow colors ----------------------*/
117
- $shadow: rgba(#3C6AAC, $opacity_2);
117
+ $shadow: rgba(#3C6AAC, $opacity_2) !default;
118
118
  $shadow_colors: (
119
119
  shadow: $shadow,
120
120
  );
@@ -124,8 +124,8 @@ $text_lt_default: $charcoal !default;
124
124
  $text_lt_light: #687887 !default;
125
125
  $text_lt_lighter: $slate !default;
126
126
  $text_dk_default: $white !default;
127
- $text_dk_light: rgba($white, $opacity_6);
128
- $text_dk_lighter: rgba($white, $opacity_4);
127
+ $text_dk_light: rgba($white, $opacity_6) !default;
128
+ $text_dk_lighter: rgba($white, $opacity_4) !default;
129
129
  $text_colors: (
130
130
  text_lt_default: $text_lt_default,
131
131
  text_lt_light: $text_lt_light,
@@ -157,24 +157,24 @@ $data_colors: (
157
157
 
158
158
  /* Status colors ----------------------*/
159
159
  $success: $green !default;
160
- $success_secondary: lighten($success, 10%);
161
- $success_subtle: rgba($success, $opacity_1);
160
+ $success_secondary: lighten($success, 10%) !default;
161
+ $success_subtle: rgba($success, $opacity_1) !default;
162
162
  $warning: $yellow !default;
163
- $warning_secondary: lighten($warning, 10%);
164
- $warning_subtle: rgba($warning, $opacity_1);
163
+ $warning_secondary: lighten($warning, 10%) !default;
164
+ $warning_subtle: rgba($warning, $opacity_1) !default;
165
165
  $error: $red !default;
166
166
  $error_dark: $red_dark !default;
167
- $error_dark_body: $error_dark;
168
- $error_secondary: lighten($error, 10%);
169
- $error_subtle: rgba($error, $opacity_1);
167
+ $error_dark_body: $error_dark !default;
168
+ $error_secondary: lighten($error, 10%) !default;
169
+ $error_subtle: rgba($error, $opacity_1) !default;
170
170
  $info: $teal !default;
171
- $info_secondary : lighten($info, 10%);
172
- $info_subtle: rgba($info, $opacity_1);
171
+ $info_secondary : lighten($info, 10%) !default;
172
+ $info_subtle: rgba($info, $opacity_1) !default;
173
173
  $neutral: $slate !default;
174
- $neutral_secondary: lighten($neutral, 10%);
175
- $neutral_subtle: rgba($neutral, $opacity_1);
174
+ $neutral_secondary: lighten($neutral, 10%) !default;
175
+ $neutral_subtle: rgba($neutral, $opacity_1) !default;
176
176
  $primary: $primary !default;
177
- $primary_secondary: lighten($primary, 10%);
177
+ $primary_secondary: lighten($primary, 10%) !default;
178
178
 
179
179
  $status_colors: (
180
180
  success: $success,
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playbook
4
- PREVIOUS_VERSION = "12.3.0"
5
- VERSION = "12.3.1"
4
+ PREVIOUS_VERSION = "12.4.0"
5
+ VERSION = "12.4.0.pre.alpha.devdocstest1"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: playbook_ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.3.1
4
+ version: 12.4.0.pre.alpha.devdocstest1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Power UX
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-02-14 00:00:00.000000000 Z
12
+ date: 2023-02-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -660,10 +660,10 @@ files:
660
660
  - app/pb_kits/playbook/pb_dashboard/pbChartsDarkTheme.ts
661
661
  - app/pb_kits/playbook/pb_dashboard/pbChartsLightTheme.ts
662
662
  - app/pb_kits/playbook/pb_dashboard/themeTypes.ts
663
- - app/pb_kits/playbook/pb_dashboard_value/_dashboard_value.jsx
664
663
  - app/pb_kits/playbook/pb_dashboard_value/_dashboard_value.scss
664
+ - app/pb_kits/playbook/pb_dashboard_value/_dashboard_value.tsx
665
665
  - app/pb_kits/playbook/pb_dashboard_value/_dashboard_value_mixins.scss
666
- - app/pb_kits/playbook/pb_dashboard_value/dashboardValueSettings.js
666
+ - app/pb_kits/playbook/pb_dashboard_value/dashboardValueSettings.ts
667
667
  - app/pb_kits/playbook/pb_dashboard_value/dashboard_value.html.erb
668
668
  - app/pb_kits/playbook/pb_dashboard_value/dashboard_value.rb
669
669
  - app/pb_kits/playbook/pb_dashboard_value/docs/_dashboard_value_align.html.erb
@@ -812,8 +812,8 @@ files:
812
812
  - app/pb_kits/playbook/pb_date_time/docs/_description.md
813
813
  - app/pb_kits/playbook/pb_date_time/docs/example.yml
814
814
  - app/pb_kits/playbook/pb_date_time/docs/index.js
815
- - app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.jsx
816
815
  - app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.scss
816
+ - app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.tsx
817
817
  - app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb
818
818
  - app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.rb
819
819
  - app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js
@@ -1525,8 +1525,8 @@ files:
1525
1525
  - app/pb_kits/playbook/pb_passphrase/passphrase.html.erb
1526
1526
  - app/pb_kits/playbook/pb_passphrase/passphrase.rb
1527
1527
  - app/pb_kits/playbook/pb_passphrase/passphrase.test.jsx
1528
- - app/pb_kits/playbook/pb_person/_person.jsx
1529
1528
  - app/pb_kits/playbook/pb_person/_person.scss
1529
+ - app/pb_kits/playbook/pb_person/_person.tsx
1530
1530
  - app/pb_kits/playbook/pb_person/docs/_description.md
1531
1531
  - app/pb_kits/playbook/pb_person/docs/_footer.md
1532
1532
  - app/pb_kits/playbook/pb_person/docs/_person_default.html.erb
@@ -1536,6 +1536,7 @@ files:
1536
1536
  - app/pb_kits/playbook/pb_person/docs/index.js
1537
1537
  - app/pb_kits/playbook/pb_person/person.html.erb
1538
1538
  - app/pb_kits/playbook/pb_person/person.rb
1539
+ - app/pb_kits/playbook/pb_person/person.test.js
1539
1540
  - app/pb_kits/playbook/pb_person_contact/_person_contact.jsx
1540
1541
  - app/pb_kits/playbook/pb_person_contact/_person_contact.scss
1541
1542
  - app/pb_kits/playbook/pb_person_contact/docs/_description.md
@@ -1552,6 +1553,20 @@ files:
1552
1553
  - app/pb_kits/playbook/pb_person_contact/docs/index.js
1553
1554
  - app/pb_kits/playbook/pb_person_contact/person_contact.html.erb
1554
1555
  - app/pb_kits/playbook/pb_person_contact/person_contact.rb
1556
+ - app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss
1557
+ - app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx
1558
+ - app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_default.jsx
1559
+ - app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_default.md
1560
+ - app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_initial_country.jsx
1561
+ - app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_initial_country.md
1562
+ - app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_only_countries.jsx
1563
+ - app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_only_countries.md
1564
+ - app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_preferred_countries.jsx
1565
+ - app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_preferred_countries.md
1566
+ - app/pb_kits/playbook/pb_phone_number_input/docs/example.yml
1567
+ - app/pb_kits/playbook/pb_phone_number_input/docs/index.js
1568
+ - app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js
1569
+ - app/pb_kits/playbook/pb_phone_number_input/types.d.ts
1555
1570
  - app/pb_kits/playbook/pb_pill/_pill.scss
1556
1571
  - app/pb_kits/playbook/pb_pill/_pill.tsx
1557
1572
  - app/pb_kits/playbook/pb_pill/docs/_description.md
@@ -2075,8 +2090,8 @@ files:
2075
2090
  - app/pb_kits/playbook/pb_title/title.html.erb
2076
2091
  - app/pb_kits/playbook/pb_title/title.rb
2077
2092
  - app/pb_kits/playbook/pb_title/title.test.js
2078
- - app/pb_kits/playbook/pb_title_count/_title_count.jsx
2079
2093
  - app/pb_kits/playbook/pb_title_count/_title_count.scss
2094
+ - app/pb_kits/playbook/pb_title_count/_title_count.tsx
2080
2095
  - app/pb_kits/playbook/pb_title_count/docs/_description.md
2081
2096
  - app/pb_kits/playbook/pb_title_count/docs/_footer.md
2082
2097
  - app/pb_kits/playbook/pb_title_count/docs/_title_count_align.html.erb
@@ -2088,6 +2103,7 @@ files:
2088
2103
  - app/pb_kits/playbook/pb_title_count/docs/index.js
2089
2104
  - app/pb_kits/playbook/pb_title_count/title_count.html.erb
2090
2105
  - app/pb_kits/playbook/pb_title_count/title_count.rb
2106
+ - app/pb_kits/playbook/pb_title_count/title_count.test.js
2091
2107
  - app/pb_kits/playbook/pb_title_detail/_title_detail.jsx
2092
2108
  - app/pb_kits/playbook/pb_title_detail/_title_detail.scss
2093
2109
  - app/pb_kits/playbook/pb_title_detail/docs/_description.md
@@ -2406,9 +2422,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
2406
2422
  version: '0'
2407
2423
  required_rubygems_version: !ruby/object:Gem::Requirement
2408
2424
  requirements:
2409
- - - ">="
2425
+ - - ">"
2410
2426
  - !ruby/object:Gem::Version
2411
- version: '0'
2427
+ version: 1.3.1
2412
2428
  requirements: []
2413
2429
  rubygems_version: 3.3.7
2414
2430
  signing_key: