playbook_ui 14.9.0.pre.alpha.PBNTR746datepickerdefaultbug4901 → 14.9.0.pre.alpha.PBNTR775formmatingmaskdefaultvalue5120

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/CollapsibleTrail.tsx +1 -6
  3. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +11 -3
  4. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +1 -1
  5. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +2 -2
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_collapsible_trail_rails.html.erb +36 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_collapsible_trail_rails.md +1 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +1 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +4 -2
  10. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +8 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +2 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.html.erb +8 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.rb +2 -0
  14. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_custom.jsx +53 -49
  15. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_custom_rails.html.erb +29 -36
  16. data/app/pb_kits/playbook/pb_card/_card.tsx +7 -7
  17. data/app/pb_kits/playbook/pb_card/_card_mixin.scss +1 -1
  18. data/app/pb_kits/playbook/pb_card/docs/_card_header.html.erb +21 -1
  19. data/app/pb_kits/playbook/pb_card/docs/_card_header.jsx +50 -0
  20. data/app/pb_kits/playbook/pb_card/docs/_card_header.md +1 -1
  21. data/app/pb_kits/playbook/pb_collapsible/_collapsible.tsx +9 -4
  22. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.tsx +2 -2
  23. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.tsx +2 -2
  24. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +2 -4
  25. data/app/pb_kits/playbook/pb_drawer/_drawer.tsx +2 -2
  26. data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +57 -0
  27. data/app/pb_kits/playbook/pb_form_group/_form_group.scss +11 -2
  28. data/app/pb_kits/playbook/pb_gauge/_gauge.scss +31 -1
  29. data/app/pb_kits/playbook/pb_gauge/_gauge.tsx +3 -3
  30. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_complex.jsx +25 -5
  31. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +17 -1
  32. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_emphasis.html.erb +17 -1
  33. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_emphasis.jsx +15 -0
  34. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_emphasis.md +2 -1
  35. data/app/pb_kits/playbook/pb_home_address_street/home_address_street.rb +15 -1
  36. data/app/pb_kits/playbook/pb_home_address_street/none_emphasis.html.erb +32 -0
  37. data/app/pb_kits/playbook/pb_home_address_street/none_emphasis.rb +29 -0
  38. data/app/pb_kits/playbook/pb_layout/_layout.tsx +30 -11
  39. data/app/pb_kits/playbook/pb_link/_link.scss +3 -3
  40. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_filter.jsx +166 -0
  41. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_height_width.jsx +2 -0
  42. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_user.jsx +89 -0
  43. data/app/pb_kits/playbook/pb_skeleton_loading/docs/example.yml +2 -1
  44. data/app/pb_kits/playbook/pb_skeleton_loading/docs/index.js +2 -0
  45. data/app/pb_kits/playbook/pb_table/_table.tsx +6 -6
  46. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns.html.erb +30 -48
  47. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_rails.md +1 -0
  48. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.jsx +75 -0
  49. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.md +1 -0
  50. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +108 -0
  51. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.md +2 -0
  52. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_content.jsx +94 -0
  53. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_content.md +0 -0
  54. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_rows.jsx +83 -0
  55. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_rows.md +3 -0
  56. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table.jsx +120 -0
  57. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table.md +1 -0
  58. data/app/pb_kits/playbook/pb_table/docs/example.yml +7 -0
  59. data/app/pb_kits/playbook/pb_table/docs/index.js +5 -0
  60. data/app/pb_kits/playbook/pb_table/index.ts +5 -3
  61. data/app/pb_kits/playbook/pb_table/styles/_all.scss +2 -1
  62. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +35 -0
  63. data/app/pb_kits/playbook/pb_table/styles/_scroll.scss +28 -3
  64. data/app/pb_kits/playbook/pb_table/styles/_sticky_columns.scss +0 -1
  65. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +106 -1
  66. data/app/pb_kits/playbook/pb_table/table.html.erb +7 -1
  67. data/app/pb_kits/playbook/pb_table/table.rb +4 -0
  68. data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +41 -4
  69. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask.jsx +88 -0
  70. data/app/pb_kits/playbook/pb_text_input/docs/example.yml +1 -0
  71. data/app/pb_kits/playbook/pb_text_input/docs/index.js +1 -0
  72. data/app/pb_kits/playbook/pb_text_input/inputMask.ts +64 -0
  73. data/app/pb_kits/playbook/pb_text_input/text_input.test.js +139 -2
  74. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +115 -46
  75. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_highlight.jsx +9 -2
  76. data/app/pb_kits/playbook/pb_typeahead/typeahead.html.erb +3 -2
  77. data/dist/chunks/_typeahead-BdFkerD3.js +22 -0
  78. data/dist/chunks/_weekday_stacked-BiePMYeU.js +45 -0
  79. data/dist/chunks/lib-sMFo2JZy.js +29 -0
  80. data/dist/chunks/{pb_form_validation-CpZ6iNar.js → pb_form_validation-CgvjWbOK.js} +1 -1
  81. data/dist/chunks/vendor.js +1 -1
  82. data/dist/menu.yml +1 -1
  83. data/dist/playbook-doc.js +1 -1
  84. data/dist/playbook-rails-react-bindings.js +1 -1
  85. data/dist/playbook-rails.js +1 -1
  86. data/dist/playbook.css +1 -1
  87. data/lib/playbook/version.rb +1 -1
  88. metadata +27 -6
  89. data/dist/chunks/_typeahead-DzDn3x6q.js +0 -22
  90. data/dist/chunks/_weekday_stacked-BUDMgWLS.js +0 -45
  91. data/dist/chunks/lib-ByNfnFq7.js +0 -29
@@ -1,4 +1,4 @@
1
- import React, { forwardRef } from 'react'
1
+ import React, { forwardRef, ChangeEvent } from 'react'
2
2
  import classnames from 'classnames'
3
3
 
4
4
  import { globalProps, GlobalProps, domSafeProps } from '../utilities/globalProps'
@@ -10,6 +10,8 @@ import Caption from '../pb_caption/_caption'
10
10
  import Body from '../pb_body/_body'
11
11
  import Icon from '../pb_icon/_icon'
12
12
 
13
+ import { INPUTMASKS } from './inputMask'
14
+
13
15
  type TextInputProps = {
14
16
  aria?: { [key: string]: string },
15
17
  className?: string,
@@ -22,6 +24,7 @@ type TextInputProps = {
22
24
  inline?: boolean,
23
25
  name: string,
24
26
  label: string,
27
+ mask?: 'currency' | 'zipCode' | 'postalCode' | 'ssn',
25
28
  onChange: (e: React.FormEvent<HTMLInputElement>) => void,
26
29
  placeholder: string,
27
30
  required?: boolean,
@@ -47,6 +50,7 @@ const TextInput = (props: TextInputProps, ref: React.LegacyRef<HTMLInputElement>
47
50
  htmlOptions = {},
48
51
  id,
49
52
  inline = false,
53
+ mask = null,
50
54
  name,
51
55
  label,
52
56
  onChange = () => { void 0 },
@@ -90,8 +94,40 @@ const TextInput = (props: TextInputProps, ref: React.LegacyRef<HTMLInputElement>
90
94
  />
91
95
  )
92
96
 
97
+ const isMaskedInput = mask && mask in INPUTMASKS
98
+
99
+ const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
100
+ if (isMaskedInput) {
101
+ const inputValue = e.target.value
102
+
103
+ let cursorPosition = e.target.selectionStart;
104
+ const isAtEnd = cursorPosition === inputValue.length;
105
+
106
+ const formattedValue = INPUTMASKS[mask].format(inputValue)
107
+ e.target.value = formattedValue
108
+
109
+ // Keep cursor position
110
+ if (!isAtEnd) {
111
+ // Account for extra characters (e.g., commas added/removed in currency)
112
+ if (formattedValue.length - inputValue.length === 1) {
113
+ cursorPosition = cursorPosition + 1
114
+ } else if (mask === "currency" && formattedValue.length - inputValue.length === -1) {
115
+ cursorPosition = cursorPosition - 1
116
+ }
117
+ e.target.selectionStart = e.target.selectionEnd = cursorPosition
118
+ }
119
+ }
120
+
121
+ onChange(e)
122
+ }
123
+
93
124
  const childInput = children ? children.type === "input" : undefined
94
125
 
126
+ let formattedValue = value.toString()
127
+ if (isMaskedInput) {
128
+ formattedValue = INPUTMASKS[mask].format(formattedValue)
129
+ }
130
+
95
131
  const textInput = (
96
132
  childInput ? React.cloneElement(children, { className: "text_input" }) :
97
133
  (<input
@@ -101,12 +137,13 @@ const TextInput = (props: TextInputProps, ref: React.LegacyRef<HTMLInputElement>
101
137
  id={id}
102
138
  key={id}
103
139
  name={name}
104
- onChange={onChange}
105
- placeholder={placeholder}
140
+ onChange={isMaskedInput ? handleChange : onChange}
141
+ pattern={isMaskedInput ? INPUTMASKS[mask]?.pattern : undefined}
142
+ placeholder={placeholder || (isMaskedInput ? INPUTMASKS[mask]?.placeholder : undefined)}
106
143
  ref={ref}
107
144
  required={required}
108
145
  type={type}
109
- value={value}
146
+ value={formattedValue}
110
147
  />)
111
148
  )
112
149
 
@@ -0,0 +1,88 @@
1
+ import React, { useState } from 'react'
2
+
3
+ import Caption from '../../pb_caption/_caption'
4
+ import TextInput from '../../pb_text_input/_text_input'
5
+ import Title from '../../pb_title/_title'
6
+
7
+ const TextInputMask = (props) => {
8
+ const [ssn, setSSN] = useState('')
9
+ const handleOnChangeSSN = ({ target }) => {
10
+ setSSN(target.value)
11
+ }
12
+ const ref = React.createRef()
13
+
14
+ const [formFields, setFormFields] = useState({
15
+ currency: '',
16
+ zipCode: '',
17
+ postalCode: '',
18
+ ssn: '',
19
+ })
20
+
21
+ const handleOnChangeFormField = ({ target }) => {
22
+ const { name, value } = target
23
+ setFormFields({ ...formFields, [name]: value })
24
+ }
25
+
26
+ return (
27
+ <div>
28
+ <TextInput
29
+ label="Currency"
30
+ mask="currency"
31
+ name="currency"
32
+ onChange={handleOnChangeFormField}
33
+ value={formFields.currency}
34
+ {...props}
35
+ />
36
+ <TextInput
37
+ label="Zip Code"
38
+ mask="zipCode"
39
+ name="zipCode"
40
+ onChange={handleOnChangeFormField}
41
+ value={formFields.zipCode}
42
+ {...props}
43
+ />
44
+ <TextInput
45
+ label="Postal Code"
46
+ mask="postalCode"
47
+ name="postalCode"
48
+ onChange={handleOnChangeFormField}
49
+ value={formFields.postalCode}
50
+ {...props}
51
+ />
52
+ <TextInput
53
+ label="SSN"
54
+ mask="ssn"
55
+ name="ssn"
56
+ onChange={handleOnChangeFormField}
57
+ value={formFields.ssn}
58
+ {...props}
59
+ />
60
+
61
+ <br />
62
+ <br />
63
+
64
+ <Title>{'Event Handler Props'}</Title>
65
+
66
+ <br />
67
+ <Caption>{'onChange'}</Caption>
68
+
69
+ <br />
70
+
71
+ <TextInput
72
+ label="SSN"
73
+ mask="ssn"
74
+ onChange={handleOnChangeSSN}
75
+ placeholder="Enter SSN"
76
+ ref={ref}
77
+ value={ssn}
78
+ {...props}
79
+ />
80
+
81
+ {ssn !== '' && (
82
+ <React.Fragment>{`SSN is: ${ssn}`}</React.Fragment>
83
+ )}
84
+ </div>
85
+ )
86
+ }
87
+
88
+ export default TextInputMask
@@ -16,6 +16,7 @@ examples:
16
16
  - text_input_add_on: Add On
17
17
  - text_input_inline: Inline
18
18
  - text_input_no_label: No Label
19
+ - text_input_mask: Mask
19
20
 
20
21
  swift:
21
22
  - text_input_default_swift: Default
@@ -5,3 +5,4 @@ export { default as TextInputDisabled } from './_text_input_disabled.jsx'
5
5
  export { default as TextInputAddOn } from './_text_input_add_on.jsx'
6
6
  export { default as TextInputInline } from './_text_input_inline.jsx'
7
7
  export { default as TextInputNoLabel } from './_text_input_no_label.jsx'
8
+ export { default as TextInputMask } from './_text_input_mask.jsx'
@@ -0,0 +1,64 @@
1
+ type InputMask = {
2
+ format: (value: string) => string
3
+ pattern: string
4
+ placeholder: string
5
+ }
6
+
7
+ type InputMaskDictionary = {
8
+ [key in 'currency' | 'zipCode' | 'postalCode' | 'ssn']: InputMask
9
+ }
10
+
11
+ const formatCurrency = (value: string): string => {
12
+ const numericValue = value.replace(/[^0-9]/g, '').slice(0, 15)
13
+
14
+ if (!numericValue) return ''
15
+
16
+ const dollars = parseFloat((parseInt(numericValue) / 100).toFixed(2))
17
+ if (dollars === 0) return ''
18
+
19
+ return new Intl.NumberFormat('en-US', {
20
+ style: 'currency',
21
+ currency: 'USD',
22
+ maximumFractionDigits: 2,
23
+ }).format(dollars)
24
+ }
25
+
26
+ const formatBasicPostal = (value: string): string => {
27
+ return value.replace(/\D/g, '').slice(0, 5)
28
+ }
29
+
30
+ const formatExtendedPostal = (value: string): string => {
31
+ const cleaned = value.replace(/\D/g, '').slice(0, 9)
32
+ return cleaned.replace(/(\d{5})(?=\d)/, '$1-')
33
+ }
34
+
35
+ const formatSSN = (value: string): string => {
36
+ const cleaned = value.replace(/\D/g, '').slice(0, 9)
37
+ return cleaned
38
+ .replace(/(\d{5})(?=\d)/, '$1-')
39
+ .replace(/(\d{3})(?=\d)/, '$1-')
40
+ }
41
+
42
+ export const INPUTMASKS: InputMaskDictionary = {
43
+ currency: {
44
+ format: formatCurrency,
45
+ // eslint-disable-next-line no-useless-escape
46
+ pattern: '^\\$\\d{1,3}(?:,\\d{3})*(?:\\.\\d{2})?$',
47
+ placeholder: '$0.00',
48
+ },
49
+ zipCode: {
50
+ format: formatBasicPostal,
51
+ pattern: '\\d{5}',
52
+ placeholder: '12345',
53
+ },
54
+ postalCode: {
55
+ format: formatExtendedPostal,
56
+ pattern: '\\d{5}-\\d{4}',
57
+ placeholder: '12345-6789',
58
+ },
59
+ ssn: {
60
+ format: formatSSN,
61
+ pattern: '\\d{3}-\\d{2}-\\d{4}',
62
+ placeholder: '123-45-6789',
63
+ },
64
+ }
@@ -1,5 +1,5 @@
1
- import React from 'react'
2
- import { render, screen } from '../utilities/test-utils'
1
+ import React, { useState } from 'react'
2
+ import { render, screen, fireEvent, within } from '../utilities/test-utils'
3
3
 
4
4
  import TextInput from './_text_input'
5
5
 
@@ -89,3 +89,140 @@ test('returns additional class name', () => {
89
89
  const kit = screen.getByTestId(testId)
90
90
  expect(kit).toHaveClass(`${kitClass} mb_lg`)
91
91
  })
92
+
93
+
94
+ const TextInputCurrencyMask = (props) => {
95
+ const [currency, setValue] = useState('')
96
+ const handleOnChange = ({ target }) => {
97
+ setValue(target.value)
98
+ }
99
+
100
+ return (
101
+ <TextInput
102
+ mask="currency"
103
+ onChange={handleOnChange}
104
+ value={currency}
105
+ {...props}
106
+ />
107
+ )
108
+ }
109
+
110
+ test('returns masked currency value', () => {
111
+ render(
112
+ <TextInputCurrencyMask
113
+ data={{ testid: testId }}
114
+ />
115
+ )
116
+
117
+ const kit = screen.getByTestId(testId)
118
+
119
+ const input = within(kit).getByRole('textbox');
120
+
121
+ fireEvent.change(input, { target: { value: '123456' } });
122
+
123
+ expect(input.value).toBe('$1,234.56')
124
+
125
+ fireEvent.change(input, { target: { value: '1' } });
126
+
127
+ expect(input.value).toBe('$0.01')
128
+
129
+ fireEvent.change(input, { target: { value: '' } });
130
+
131
+ expect(input.value).toBe('')
132
+ })
133
+
134
+ const TextInputZipCodeMask = (props) => {
135
+ const [zipCode, setValue] = useState('')
136
+ const handleOnChange = ({ target }) => {
137
+ setValue(target.value)
138
+ }
139
+
140
+ return (
141
+ <TextInput
142
+ mask="zipCode"
143
+ onChange={handleOnChange}
144
+ value={zipCode}
145
+ {...props}
146
+ />
147
+ )
148
+ }
149
+
150
+ test('returns masked zip code value', () => {
151
+ render(
152
+ <TextInputZipCodeMask
153
+ data={{ testid: testId }}
154
+ />
155
+ )
156
+
157
+ const kit = screen.getByTestId(testId)
158
+
159
+ const input = within(kit).getByRole('textbox');
160
+
161
+ fireEvent.change(input, { target: { value: '123456' } });
162
+
163
+ expect(input.value).toBe('12345')
164
+ })
165
+
166
+ const TextInputPostalCodeMask = (props) => {
167
+ const [postalCode, setValue] = useState('')
168
+ const handleOnChange = ({ target }) => {
169
+ setValue(target.value)
170
+ }
171
+
172
+ return (
173
+ <TextInput
174
+ mask="postalCode"
175
+ onChange={handleOnChange}
176
+ value={postalCode}
177
+ {...props}
178
+ />
179
+ )
180
+ }
181
+
182
+ test('returns masked postal code value', () => {
183
+ render(
184
+ <TextInputPostalCodeMask
185
+ data={{ testid: testId }}
186
+ />
187
+ )
188
+
189
+ const kit = screen.getByTestId(testId)
190
+
191
+ const input = within(kit).getByRole('textbox');
192
+
193
+ fireEvent.change(input, { target: { value: '123456789' } });
194
+
195
+ expect(input.value).toBe('12345-6789')
196
+ })
197
+
198
+ const TextInputSSNMask = (props) => {
199
+ const [ssn, setValue] = useState('')
200
+ const handleOnChange = ({ target }) => {
201
+ setValue(target.value)
202
+ }
203
+
204
+ return (
205
+ <TextInput
206
+ mask="ssn"
207
+ onChange={handleOnChange}
208
+ value={ssn}
209
+ {...props}
210
+ />
211
+ )
212
+ }
213
+
214
+ test('returns masked ssn value', () => {
215
+ render(
216
+ <TextInputSSNMask
217
+ data={{ testid: testId }}
218
+ />
219
+ )
220
+
221
+ const kit = screen.getByTestId(testId)
222
+
223
+ const input = within(kit).getByRole('textbox');
224
+
225
+ fireEvent.change(input, { target: { value: '123456789' } });
226
+
227
+ expect(input.value).toBe('123-45-6789')
228
+ })
@@ -90,50 +90,7 @@
90
90
  }
91
91
  }
92
92
  }
93
- &[class*=dark] {
94
- .pb_typeahead_wrapper .pb_typeahead_loading_indicator {
95
- color: $text_dk_light;
96
- }
97
- [class^=pb_text_input_kit].dark .text_input_wrapper .text_input {
98
- display: inherit !important;
99
- }
100
- .typeahead-kit-select__menu {
101
- background-color: $bg_dark;
102
- color: $white;
103
- z-index: $z_1;
104
- }
105
- .typeahead-kit-select__option:hover {
106
- background-color: $active_dark;
107
- }
108
- .typeahead-kit-select__indicator:hover {
109
- color: $white;
110
- }
111
- .typeahead-kit-select__input {
112
- color: white;
113
- input:focus {
114
- box-shadow: none;
115
- }
116
- }
117
- .typeahead-kit-select__single-value {
118
- color: white;
119
- }
120
- .typeahead-kit-select__option--is-focused {
121
- background-color: $active_dark;
122
- }
123
- [class^=pb_list_kit] {
124
- background-color: $bg_dark;
125
- }
126
- .pb_item_kit {
127
- button {
128
- color: white !important;
129
- }
130
- @media (hover:hover) {
131
- &:hover {
132
- background-color: rgba($white,.1);
133
- }
134
- }
135
- }
136
- }
93
+
137
94
  &.react-select, &.react-select .dark {
138
95
  .text_input {
139
96
  display: inherit;
@@ -182,7 +139,7 @@
182
139
  }
183
140
  }
184
141
  }
185
-
142
+
186
143
  .typeahead-kit-select__menu {
187
144
  z-index: $z_1;
188
145
  .typeahead-kit-select__menu-list {
@@ -215,5 +172,117 @@
215
172
  }
216
173
  }
217
174
  }
218
- }
219
175
 
176
+ &[class*=dark] {
177
+ .pb_typeahead_wrapper .pb_typeahead_loading_indicator {
178
+ color: $text_dk_light;
179
+ }
180
+ .pb_text_input_kit_label {
181
+ color: $text_dk_light;
182
+ }
183
+ [class^=pb_text_input_kit].dark .text_input_wrapper .text_input {
184
+ display: inherit !important;
185
+ }
186
+ .typeahead-kit-select__menu {
187
+ background-color: $bg_dark;
188
+ color: $white;
189
+ z-index: $z_1;
190
+ .typeahead-kit-select__menu-list {
191
+ padding: 0;
192
+ }
193
+ .typeahead-kit-select__single-value {
194
+ color: white;
195
+ }
196
+
197
+ .typeahead-kit-select__option {
198
+ &.typeahead-kit-select__option--is-focused {
199
+ background-color: $hover_dark;
200
+ }
201
+ &.typeahead-kit-select__option--is-selected {
202
+ background-color: $active_dark;
203
+ }
204
+ }
205
+ }
206
+ .text_input_wrapper{
207
+ color: text_dk_default;
208
+ }
209
+ .typeahead-kit-select__option:hover {
210
+ background-color: $active_dark;
211
+ }
212
+ .typeahead-kit-select__indicator {
213
+ color: $text_dk_default;
214
+ }
215
+ .typeahead-kit-select__indicator:hover {
216
+ color: $text_dk_lighter;
217
+ }
218
+ .typeahead-kit-select__input {
219
+ color: white;
220
+ input:focus {
221
+ box-shadow: none;
222
+ }
223
+ }
224
+ .typeahead-kit-select__option--is-focused {
225
+ background-color: $active_dark;
226
+ }
227
+ [class^=pb_list_kit] {
228
+ background-color: $bg_dark;
229
+ }
230
+ .pb_item_kit {
231
+ button {
232
+ color: white !important;
233
+ }
234
+ @media (hover:hover) {
235
+ &:hover {
236
+ background-color: $hover_dark;
237
+ }
238
+ }
239
+ }
240
+
241
+ .text_input {
242
+ .typeahead-kit-select__input-container{
243
+ color: $text_dk_default
244
+ }
245
+ .typeahead-kit-select {
246
+ &__single-value{
247
+ color: $text_dk_default;
248
+ }
249
+ }
250
+ &.typeahead-kit-select {
251
+ &__single-value{
252
+ color: $text_dk_default;
253
+ }
254
+ &__control {
255
+ &--is-focused {
256
+ @include pb_textarea_focus;
257
+ @include transition_default;
258
+ border-color: $active_dark;
259
+ background-color: rgba($focus_input_dark,$opacity_5);
260
+ box-shadow: none;
261
+ .typeahead-plus-icon {
262
+ display: none;
263
+ }
264
+ }
265
+ }
266
+ }
267
+ }
268
+
269
+ &.inline {
270
+ &:not(:hover) {
271
+ .text_input {
272
+ background-color: transparent;
273
+ border-color: transparent;
274
+ }
275
+ .typeahead-kit-select__indicator {
276
+ color: transparent;
277
+ }
278
+ }
279
+
280
+ &:hover {
281
+ .text_input {
282
+ background-color: $hover_dark;
283
+ }
284
+ }
285
+ }
286
+
287
+ }
288
+ }
@@ -55,11 +55,18 @@ const TypeaheadWithHighlight = (props) => {
55
55
  marginRight="sm"
56
56
  name={name}
57
57
  size="sm"
58
+ {...props}
58
59
  />
59
60
  </FlexItem>
60
61
  <FlexItem>
61
- <Title size={4}><span dangerouslySetInnerHTML={{ __html: highlighted(name) }} /></Title>
62
- <Body color="light">
62
+ <Title
63
+ size={4}
64
+ {...props}
65
+ >
66
+ <span dangerouslySetInnerHTML={{ __html: highlighted(name) }} /></Title>
67
+ <Body color="light"
68
+ {...props}
69
+ >
63
70
  <span dangerouslySetInnerHTML={{ __html: highlighted(title) }} />{" • "}
64
71
  {territory}
65
72
  </Body>
@@ -25,8 +25,9 @@
25
25
  validation: object.validation,
26
26
  label: object.label,
27
27
  id: object.input_options[:id],
28
+ dark: object.dark,
28
29
  }) %>
29
- <%= pb_rails("list", props: { ordered: false, borderless: false, xpadding: true, role: "status", aria: { live: "polite" }, data: { pb_typeahead_kit_results: true } }) do %>
30
+ <%= pb_rails("list", props: { ordered: false, borderless: true, xpadding: true, role: "status", aria: { live: "polite" }, data: { pb_typeahead_kit_results: true } }) do %>
30
31
  <% end %>
31
32
  </div>
32
33
 
@@ -36,4 +37,4 @@
36
37
  <% end %>
37
38
  </template>
38
39
  <% end %>
39
- <% end %>
40
+ <% end %>