playbook_ui 15.3.0.pre.alpha.PLAY2532flexboxdefaultresponsive12209 → 15.3.0.pre.alpha.PLAY2565formkitsubmitfix11681

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 (156) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +1 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +1 -3
  4. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableActions.ts +3 -18
  5. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +14 -71
  6. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +0 -3
  7. data/app/pb_kits/playbook/pb_advanced_table/Utilities/RowUtils.ts +1 -1
  8. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +4 -4
  9. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +3 -12
  10. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +5 -127
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_control_rails.html.erb +0 -4
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_control_rails.md +1 -1
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.md +1 -1
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.md +1 -1
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.jsx +1 -3
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.md +0 -2
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.jsx +1 -1
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.html.erb +0 -1
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.md +0 -2
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_inline_row_loading.jsx +0 -28
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_inline_row_loading.md +2 -11
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control.jsx +1 -9
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control.md +1 -1
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination_with_props.jsx +1 -4
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pagination_with_props.md +2 -3
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sticky_columns_and_header.md +1 -1
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_rails.md +1 -1
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_react.md +1 -1
  29. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header.jsx +0 -16
  30. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_rails.html.erb +1 -1
  31. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +0 -1
  32. data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +2 -2
  33. data/app/pb_kits/playbook/pb_advanced_table/index.js +7 -7
  34. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +2 -2
  35. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +20 -90
  36. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +3 -32
  37. data/app/pb_kits/playbook/pb_background/background.html.erb +2 -10
  38. data/app/pb_kits/playbook/pb_background/docs/_background_category.md +1 -1
  39. data/app/pb_kits/playbook/pb_badge/_badge.tsx +1 -4
  40. data/app/pb_kits/playbook/pb_badge/badge.test.js +0 -13
  41. data/app/pb_kits/playbook/pb_card/docs/_card_background.md +1 -1
  42. data/app/pb_kits/playbook/pb_card/docs/_card_header.md +1 -1
  43. data/app/pb_kits/playbook/pb_card/docs/_card_highlight.md +1 -1
  44. data/app/pb_kits/playbook/pb_card/docs/_card_light.md +1 -1
  45. data/app/pb_kits/playbook/pb_currency/_currency.tsx +7 -20
  46. data/app/pb_kits/playbook/pb_currency/currency.rb +8 -35
  47. data/app/pb_kits/playbook/pb_currency/currency.test.js +0 -47
  48. data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.html.erb +1 -1
  49. data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.jsx +1 -1
  50. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +0 -2
  51. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +4 -16
  52. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +1 -2
  53. data/app/pb_kits/playbook/pb_date_picker/docs/index.js +1 -2
  54. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_quick_pick_styles.scss +30 -11
  55. data/app/pb_kits/playbook/pb_distribution_bar/docs/_distribution_bar_custom_colors.md +1 -1
  56. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +0 -1
  57. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +6 -111
  58. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_active_style_options_react.md +1 -1
  59. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +0 -5
  60. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +1 -5
  61. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +2 -148
  62. data/app/pb_kits/playbook/pb_filter/docs/_filter_max_width.md +1 -1
  63. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_auto_close.html.erb +1 -15
  64. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_multi_line.html.erb +8 -9
  65. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_positions.html.erb +10 -11
  66. data/app/pb_kits/playbook/pb_form/pb_form_validation.js +11 -44
  67. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +1 -1
  68. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text_rails.md +1 -1
  69. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text_react.md +1 -1
  70. data/app/pb_kits/playbook/pb_icon/docs/_icon_color.md +1 -1
  71. data/app/pb_kits/playbook/pb_icon_circle/docs/_icon_circle_color.md +1 -1
  72. data/app/pb_kits/playbook/pb_icon_stat_value/docs/_icon_stat_value_color.html.erb +14 -7
  73. data/app/pb_kits/playbook/pb_icon_stat_value/docs/_icon_stat_value_color.jsx +15 -6
  74. data/app/pb_kits/playbook/pb_layout/docs/_layout_collection.md +1 -1
  75. data/app/pb_kits/playbook/pb_nav/docs/_collapsible_nav_item_spacing.md +1 -1
  76. data/app/pb_kits/playbook/pb_nav/docs/_nav_with_spacing_control.md +1 -1
  77. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_layout.md +1 -1
  78. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +17 -110
  79. data/app/pb_kits/playbook/pb_pill/docs/_description.md +1 -1
  80. data/app/pb_kits/playbook/pb_popover/_popover.tsx +34 -69
  81. data/app/pb_kits/playbook/pb_popover/docs/example.yml +0 -1
  82. data/app/pb_kits/playbook/pb_popover/docs/index.js +0 -1
  83. data/app/pb_kits/playbook/pb_popover/popover.test.js +0 -80
  84. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_description.md +1 -1
  85. data/app/pb_kits/playbook/pb_section_separator/docs/_description.md +1 -1
  86. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +0 -29
  87. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_border_radius_rails.md +1 -1
  88. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_border_radius_react.md +1 -1
  89. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_layout.md +1 -1
  90. data/app/pb_kits/playbook/pb_table/docs/_table_side_highlight.md +1 -1
  91. data/app/pb_kits/playbook/pb_table/docs/_table_sm.md +1 -1
  92. data/app/pb_kits/playbook/pb_table/docs/example.yml +0 -2
  93. data/app/pb_kits/playbook/pb_table/docs/index.js +0 -1
  94. data/app/pb_kits/playbook/pb_text_input/text_input.rb +2 -2
  95. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +0 -7
  96. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +1 -105
  97. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +9 -23
  98. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +1 -33
  99. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default_options.html.erb +1 -67
  100. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default_value.jsx +6 -68
  101. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.md +1 -1
  102. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +0 -2
  103. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -2
  104. data/app/pb_kits/playbook/utilities/globalProps.ts +8 -26
  105. data/app/pb_kits/playbook/utilities/test/globalProps/alignContent.test.js +0 -18
  106. data/app/pb_kits/playbook/utilities/test/globalProps/alignItems.test.js +0 -18
  107. data/app/pb_kits/playbook/utilities/test/globalProps/alignSelf.test.js +0 -18
  108. data/app/pb_kits/playbook/utilities/test/globalProps/display.test.js +0 -18
  109. data/app/pb_kits/playbook/utilities/test/globalProps/flex.test.js +0 -18
  110. data/app/pb_kits/playbook/utilities/test/globalProps/flexDirection.test.js +0 -18
  111. data/app/pb_kits/playbook/utilities/test/globalProps/flexGrow.test.js +0 -18
  112. data/app/pb_kits/playbook/utilities/test/globalProps/flexShrink.test.js +0 -18
  113. data/app/pb_kits/playbook/utilities/test/globalProps/flexWrap.test.js +0 -18
  114. data/app/pb_kits/playbook/utilities/test/globalProps/justifyContent.test.js +0 -18
  115. data/app/pb_kits/playbook/utilities/test/globalProps/justifySelf.test.js +0 -18
  116. data/app/pb_kits/playbook/utilities/test/globalProps/order.test.js +0 -18
  117. data/dist/chunks/{_line_graph-9bI76O2f.js → _line_graph-h5H-imfn.js} +1 -1
  118. data/dist/chunks/_typeahead-U8AjZIIW.js +6 -0
  119. data/dist/chunks/_weekday_stacked-CbCUYuuZ.js +37 -0
  120. data/dist/chunks/{lib-BXBHAZMY.js → lib-CGxXTQ75.js} +1 -1
  121. data/dist/chunks/pb_form_validation-DebqlUKZ.js +1 -0
  122. data/dist/chunks/vendor.js +1 -1
  123. data/dist/playbook-doc.js +2 -2
  124. data/dist/playbook-rails-react-bindings.js +1 -1
  125. data/dist/playbook-rails.js +1 -1
  126. data/dist/playbook.css +1 -1
  127. data/lib/playbook/version.rb +1 -1
  128. metadata +8 -32
  129. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header_rails.html.erb +0 -104
  130. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_with_custom_header_multi_header_rails.md +0 -1
  131. data/app/pb_kits/playbook/pb_advanced_table/docs/_mock_data_inline_loading_empty_children.js +0 -42
  132. data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.md +0 -1
  133. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_and_dropdown_range.jsx +0 -38
  134. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_and_dropdown_range.md +0 -14
  135. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick.jsx +0 -18
  136. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick.md +0 -4
  137. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_default_dates.jsx +0 -18
  138. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_default_dates.md +0 -1
  139. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end.jsx +0 -19
  140. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end.md +0 -1
  141. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers.jsx +0 -38
  142. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers.md +0 -14
  143. data/app/pb_kits/playbook/pb_dropdown/quickpick/index.ts +0 -60
  144. data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.jsx +0 -68
  145. data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to_react.md +0 -1
  146. data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible.html.erb +0 -63
  147. data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible.jsx +0 -89
  148. data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible_rails.md +0 -4
  149. data/app/pb_kits/playbook/pb_table/docs/_table_with_dynamic_collapsible_react.md +0 -3
  150. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_options.html.erb +0 -64
  151. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_options.jsx +0 -70
  152. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_custom_options.md +0 -1
  153. data/dist/chunks/_typeahead-By0NwDwL.js +0 -6
  154. data/dist/chunks/_weekday_stacked-ClJbIaDx.js +0 -37
  155. data/dist/chunks/pb_form_validation-BNfSnIUF.js +0 -1
  156. /data/app/pb_kits/playbook/pb_popover/docs/{_popover_append_to_rails.md → _popover_append_to.md} +0 -0
@@ -99,8 +99,8 @@ module Playbook
99
99
  # Convert camelCase (ex. notAllowed) to kebab-case (ex. not-allowed)
100
100
  cursor.to_s.gsub(/([a-z\d])([A-Z])/, '\1-\2').downcase
101
101
  else
102
- # Default to 'text'
103
- "text"
102
+ # Default to 'pointer'
103
+ "pointer"
104
104
  end
105
105
  end
106
106
 
@@ -165,13 +165,6 @@
165
165
  line-height: 16.5px;
166
166
  letter-spacing: normal;
167
167
  }
168
-
169
- // Add focus indicator for multi-value pills
170
- .pb_form_pill_or_badge_focused {
171
- outline: $primary solid 2px;
172
- outline-offset: -1px;
173
- }
174
-
175
168
  &.inline {
176
169
  &:not(:hover) {
177
170
  .text_input {
@@ -171,108 +171,4 @@ test('typeahead with defaultValue with focus behavior', async () => {
171
171
  expect(focusedOption).toBeInTheDocument()
172
172
  expect(focusedOption).toHaveTextContent('Red')
173
173
  })
174
- })
175
-
176
- test('typeahead with grouped options and defaultValue focus behavior', async () => {
177
- const groupedOptions = [
178
- {
179
- label: "Warm Colors",
180
- options: [
181
- { label: "Red", value: "#FF0000" },
182
- { label: "Orange", value: "#FFA500" },
183
- { label: "Yellow", value: "#FFFF00" }
184
- ]
185
- },
186
- {
187
- label: "Cool Colors",
188
- options: [
189
- { label: "Blue", value: "#0000FF" },
190
- { label: "Teal", value: "#008080" },
191
- { label: "Cyan", value: "#00FFFF" }
192
- ]
193
- },
194
- {
195
- label: "Fun Shades",
196
- options: [
197
- { label: "Pink", value: "#FFC0CB" },
198
- { label: "Magenta", value: "#FF00FF" },
199
- { label: "Purple", value: "#800080" }
200
- ]
201
- }
202
- ]
203
-
204
- render(
205
- <Typeahead
206
- data={{ testid: 'grouped-options-focus-test' }}
207
- defaultValue={[{ label: "Pink", value: "#FFC0CB" }]}
208
- options={groupedOptions}
209
- />
210
- )
211
-
212
- const kit = screen.getByTestId('grouped-options-focus-test')
213
- const inputDiv = kit.querySelector(".typeahead-kit-select__single-value")
214
- expect(inputDiv).toHaveTextContent("Pink")
215
- })
216
-
217
- test('multi-value pills have tabIndex for keyboard navigation', () => {
218
- render(
219
- <Typeahead
220
- data={{ testid: 'pill-tabindex-test' }}
221
- defaultValue={[options[0], options[1]]}
222
- isMulti
223
- options={options}
224
- />
225
- )
226
-
227
- const kit = screen.getByTestId('pill-tabindex-test')
228
- const pills = kit.querySelectorAll('.pb_form_pill_kit')
229
-
230
- expect(pills.length).toBe(2)
231
-
232
- pills.forEach(pill => {
233
- expect(pill).toHaveAttribute('tabIndex', '0')
234
- })
235
- })
236
-
237
- test('multi-value pills show focus indicator when focused', async () => {
238
- render(
239
- <Typeahead
240
- data={{ testid: 'pill-focus-indicator-test' }}
241
- defaultValue={[options[0], options[1], options[2]]}
242
- isMulti
243
- options={options}
244
- />
245
- )
246
-
247
- const kit = screen.getByTestId('pill-focus-indicator-test')
248
- const pills = kit.querySelectorAll('.pb_form_pill_kit')
249
-
250
- expect(pills.length).toBe(3)
251
-
252
- const firstPill = pills[0]
253
- firstPill.focus()
254
-
255
- expect(document.activeElement).toBe(firstPill)
256
- })
257
-
258
- test('multi-value badges have tabIndex and focus class when focused', () => {
259
- render(
260
- <Typeahead
261
- data={{ testid: 'badge-focus-test' }}
262
- defaultValue={[options[0], options[1]]}
263
- isMulti
264
- multiKit="badge"
265
- options={options}
266
- />
267
- )
268
-
269
- const kit = screen.getByTestId('badge-focus-test')
270
- const badges = kit.querySelectorAll('.pb_badge_kit_primary')
271
-
272
- expect(badges.length).toBe(2)
273
-
274
- badges.forEach(badge => {
275
- expect(badge).toHaveAttribute('tabIndex', '0')
276
- })
277
- })
278
-
174
+ })
@@ -144,18 +144,6 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({
144
144
  // Create a ref to access React Select instance
145
145
  const selectRef = useRef<any>(null)
146
146
 
147
- // Helper function to flatten grouped options if custom groups are used
148
- const flattenOptions = (options: any[]): any[] => {
149
- if (!options) return []
150
-
151
- return options.reduce((acc, option) => {
152
- if (option.options && Array.isArray(option.options)) {
153
- return [...acc, ...option.options]
154
- }
155
- return [...acc, option]
156
- }, [])
157
- }
158
-
159
147
  // Configure focus on selected option using React Select's API
160
148
  const handleMenuOpen = () => {
161
149
  setTimeout(() => {
@@ -171,18 +159,17 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({
171
159
 
172
160
  const options = props.options
173
161
  if (options) {
174
- // Flatten grouped options to find the matching option and find matching option
175
- const flatOptions = flattenOptions(options)
176
-
177
- const targetOption = flatOptions.find((option: any) => {
162
+ // Find the index of the current value
163
+ const focusedIndex = options.findIndex((option: any) => {
178
164
  const optionValue = props.getOptionValue ? props.getOptionValue(option) : option.value
179
165
  const currentOptionValue = props.getOptionValue ? props.getOptionValue(currentValue) : currentValue.value
180
166
  return optionValue === currentOptionValue
181
167
  })
182
168
 
183
- if (targetOption) {
169
+ if (focusedIndex >= 0 && options[focusedIndex]) {
184
170
  // Use React Select's internal state to set focused option
185
171
  if (selectRef.current && selectRef.current.setState) {
172
+ const targetOption = options[focusedIndex]
186
173
  selectRef.current.setState({
187
174
  focusedOption: targetOption,
188
175
  focusedValue: null
@@ -192,12 +179,11 @@ const Typeahead = forwardRef<HTMLInputElement, TypeaheadProps>(({
192
179
  setTimeout(() => {
193
180
  if (selectRef.current && selectRef.current.menuListRef) {
194
181
  const menuElement = selectRef.current.menuListRef
195
- // Find the focused option using React Select's class
196
- const focusedElement = menuElement.querySelector('.typeahead-kit-select__option--is-focused')
197
-
198
- if (focusedElement) {
199
- const optionTop = focusedElement.offsetTop
200
- const optionHeight = focusedElement.offsetHeight
182
+ if (menuElement && menuElement.children && menuElement.children[focusedIndex]) {
183
+ // Calculate the position of the selected option and scroll the menu container
184
+ const optionElement = menuElement.children[focusedIndex] as HTMLElement
185
+ const optionTop = optionElement.offsetTop
186
+ const optionHeight = optionElement.offsetHeight
201
187
  const menuHeight = menuElement.clientHeight
202
188
 
203
189
  // Set the menu's scrollTop to position the selected option in the middle
@@ -12,12 +12,11 @@ type Props = {
12
12
  pillColor?: "primary" | "neutral" | "success" | "warning" | "error" | "info" | "data_1" | "data_2" | "data_3" | "data_4" | "data_5" | "data_6" | "data_7" | "data_8" | "windows" | "siding" | "roofing" | "doors" | "gutters" | "solar" | "insulation" | "accessories",
13
13
  removeProps: any,
14
14
  selectProps: any,
15
- isFocused?: boolean,
16
15
  }
17
16
 
18
17
 
19
18
  const MultiValue = (props: Props) => {
20
- const { removeProps, isFocused } = props
19
+ const { removeProps } = props
21
20
  const { imageUrl, label } = props.data
22
21
  const { dark, multiKit, pillColor, truncate, wrapped } = props.selectProps
23
22
 
@@ -30,28 +29,6 @@ const MultiValue = (props: Props) => {
30
29
 
31
30
  if (typeof imageUrl === 'string') formPillProps.avatarUrl = imageUrl
32
31
 
33
- // Add className for focus state
34
- const pillClassName = isFocused ? 'pb_form_pill_or_badge_focused' : ''
35
-
36
- // Handle keyboard events on the pill itself to enable deletion when using tabIndex
37
- const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {
38
- if (event.key === 'Backspace' || event.key === 'Delete') {
39
- event.preventDefault()
40
- event.stopPropagation()
41
- // Trigger the remove action from react-select
42
- if (removeProps && removeProps.onClick) {
43
- removeProps.onClick(event as any)
44
- }
45
- }
46
- // if arrow keys used, transfer focus to input so react-select can take over
47
- else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
48
- const selectInput = event.currentTarget.closest('.pb_typeahead_kit')?.querySelector('input')
49
- if (selectInput instanceof HTMLInputElement) {
50
- selectInput.focus()
51
- }
52
- }
53
- }
54
-
55
32
  return (
56
33
  <components.MultiValueContainer
57
34
  className="text_input_multivalue_container"
@@ -59,11 +36,8 @@ const MultiValue = (props: Props) => {
59
36
  >
60
37
  {multiKit === 'badge' &&
61
38
  <Badge
62
- className={pillClassName}
63
39
  closeProps={removeProps}
64
- htmlOptions={{onKeyDown:handleKeyDown}}
65
40
  removeIcon
66
- tabIndex={0}
67
41
  text={label}
68
42
  variant="primary"
69
43
  />
@@ -72,15 +46,12 @@ const MultiValue = (props: Props) => {
72
46
  {multiKit !== 'badge' && imageUrl &&
73
47
  <FormPill
74
48
  avatarUrl={imageUrl}
75
- className={pillClassName}
76
49
  closeProps={removeProps}
77
50
  color={pillColor}
78
51
  dark={dark}
79
- htmlOptions={{onKeyDown:handleKeyDown}}
80
52
  marginRight="xs"
81
53
  name={label}
82
54
  size={multiKit === 'smallPill' ? 'small' : ''}
83
- tabIndex={0}
84
55
  text=''
85
56
  truncate={truncate}
86
57
  wrapped={wrapped}
@@ -90,15 +61,12 @@ const MultiValue = (props: Props) => {
90
61
 
91
62
  {multiKit !== 'badge' && !imageUrl &&
92
63
  <FormPill
93
- className={pillClassName}
94
64
  closeProps={removeProps}
95
65
  color={pillColor}
96
66
  dark={dark}
97
- htmlOptions={{onKeyDown:handleKeyDown}}
98
67
  marginRight="xs"
99
68
  name=''
100
69
  size={multiKit === 'smallPill' ? 'small' : ''}
101
- tabIndex={0}
102
70
  text={label}
103
71
  truncate={truncate}
104
72
  wrapped={wrapped}
@@ -25,77 +25,11 @@
25
25
  ]
26
26
  %>
27
27
 
28
- <%
29
- grouped_options = [
30
- {
31
- label: "Warm Colors",
32
- options: [
33
- { label: "Red", value: "#FF0000" },
34
- { label: "Orange", value: "#FFA500" },
35
- { label: "Yellow", value: "#FFFF00" },
36
- { label: "Coral", value: "#FF7F50" },
37
- { label: "Gold", value: "#FFD700" }
38
- ]
39
- },
40
- {
41
- label: "Cool Colors",
42
- options: [
43
- { label: "Blue", value: "#0000FF" },
44
- { label: "Teal", value: "#008080" },
45
- { label: "Cyan", value: "#00FFFF" },
46
- { label: "Navy", value: "#000080" },
47
- { label: "Turquoise", value: "#40E0D0" }
48
- ]
49
- },
50
- {
51
- label: "Neutrals",
52
- options: [
53
- { label: "White", value: "#FFFFFF" },
54
- { label: "Black", value: "#000000" },
55
- { label: "Gray", value: "#808080" },
56
- { label: "Beige", value: "#F5F5DC" },
57
- { label: "Silver", value: "#C0C0C0" }
58
- ]
59
- },
60
- {
61
- label: "Earth Tones",
62
- options: [
63
- { label: "Brown", value: "#A52A2A" },
64
- { label: "Olive", value: "#808000" },
65
- { label: "Forest Green", value: "#228B22" },
66
- { label: "Tan", value: "#D2B48C" },
67
- { label: "Maroon", value: "#800000" }
68
- ]
69
- },
70
- {
71
- label: "Fun Shades",
72
- options: [
73
- { label: "Pink", value: "#FFC0CB" },
74
- { label: "Magenta", value: "#FF00FF" },
75
- { label: "Lime", value: "#00FF00" },
76
- { label: "Purple", value: "#800080" },
77
- { label: "Indigo", value: "#4B0082" }
78
- ]
79
- }
80
- ]
81
- %>
82
-
83
-
84
28
  <%= pb_rails("typeahead", props: {
85
29
  default_options: [{ label: 'Gray', value: '#808080' }],
86
30
  id: "typeahead-default-value",
87
31
  options: options,
88
- label: "Default Value with basic options",
89
- name: :foo,
90
- is_multi: false
91
- })
92
- %>
93
-
94
- <%= pb_rails("typeahead", props: {
95
- default_options:[{ label: "Pink", value: "#FFC0CB" }],
96
- id: "typeahead-default-value-grouped-options",
97
- options: grouped_options,
98
- label: "Default Value with grouped options",
32
+ label: "Colors",
99
33
  name: :foo,
100
34
  is_multi: false
101
35
  })
@@ -27,76 +27,14 @@ const options = [
27
27
  { label: 'Coral', value: '#FF7F50' }
28
28
  ]
29
29
 
30
- const groupedOptions = [
31
- {
32
- label: "Warm Colors",
33
- options: [
34
- { label: "Red", value: "#FF0000" },
35
- { label: "Orange", value: "#FFA500" },
36
- { label: "Yellow", value: "#FFFF00" },
37
- { label: "Coral", value: "#FF7F50" },
38
- { label: "Gold", value: "#FFD700" }
39
- ]
40
- },
41
- {
42
- label: "Cool Colors",
43
- options: [
44
- { label: "Blue", value: "#0000FF" },
45
- { label: "Teal", value: "#008080" },
46
- { label: "Cyan", value: "#00FFFF" },
47
- { label: "Navy", value: "#000080" },
48
- { label: "Turquoise", value: "#40E0D0" }
49
- ]
50
- },
51
- {
52
- label: "Neutrals",
53
- options: [
54
- { label: "White", value: "#FFFFFF" },
55
- { label: "Black", value: "#000000" },
56
- { label: "Gray", value: "#808080" },
57
- { label: "Beige", value: "#F5F5DC" },
58
- { label: "Silver", value: "#C0C0C0" }
59
- ]
60
- },
61
- {
62
- label: "Earth Tones",
63
- options: [
64
- { label: "Brown", value: "#A52A2A" },
65
- { label: "Olive", value: "#808000" },
66
- { label: "Forest Green", value: "#228B22" },
67
- { label: "Tan", value: "#D2B48C" },
68
- { label: "Maroon", value: "#800000" }
69
- ]
70
- },
71
- {
72
- label: "Fun Shades",
73
- options: [
74
- { label: "Pink", value: "#FFC0CB" },
75
- { label: "Magenta", value: "#FF00FF" },
76
- { label: "Lime", value: "#00FF00" },
77
- { label: "Purple", value: "#800080" },
78
- { label: "Indigo", value: "#4B0082" }
79
- ]
80
- }
81
- ]
82
-
83
30
  const TypeaheadDefaultValue = (props) => {
84
31
  return (
85
- <>
86
- <Typeahead
87
- defaultValue={options[10]}
88
- label="Default Value with basic options"
89
- options={options}
90
- {...props}
91
- />
92
- <br />
93
- <Typeahead
94
- defaultValue={{ label: "Pink", value: "#FFC0CB" }}
95
- label="Default Value with grouped options"
96
- options={groupedOptions}
97
- {...props}
98
- />
99
- </>
32
+ <Typeahead
33
+ defaultValue={options[10]}
34
+ label="Colors"
35
+ options={options}
36
+ {...props}
37
+ />
100
38
  )
101
39
  }
102
40
 
@@ -1 +1 @@
1
- For Form Pills with longer text, the `truncate` global prop can be used to truncate the label within each Form Pill. Hover over the truncated Form Pill and a Tooltip containing the text or tag section of the Form Pill will appear. See [here](https://playbook.powerapp.cloud/global_props/truncate) for more information on the truncate global prop.
1
+ For Form Pills with longer text, the `truncate` global prop can be used to truncate the label within each Form Pill. Hover over the truncated Form Pill and a Tooltip containing the text or tag section of the Form Pill will appear. See [here](https://playbook.powerapp.cloud/visual_guidelines/truncate) for more information on the truncate global prop.
@@ -1,7 +1,6 @@
1
1
  examples:
2
2
  rails:
3
3
  - typeahead_default: Default
4
- - typeahead_custom_options: With Grouped Options
5
4
  - typeahead_default_options: With Default Options
6
5
  - typeahead_with_context: With Context
7
6
  - typeahead_with_pills: With Pills
@@ -21,7 +20,6 @@ examples:
21
20
 
22
21
  react:
23
22
  - typeahead_default: Default
24
- - typeahead_custom_options: With Grouped Options
25
23
  - typeahead_default_value: With Default Value
26
24
  - typeahead_react_hook: React Hook
27
25
  - typeahead_with_highlight: With Highlight
@@ -16,5 +16,4 @@ export { default as TypeaheadTruncatedText } from './_typeahead_truncated_text.j
16
16
  export { default as TypeaheadReactHook } from './_typeahead_react_hook.jsx'
17
17
  export { default as TypeaheadDisabled } from './_typeahead_disabled.jsx'
18
18
  export { default as TypeaheadPreserveInput } from './_typeahead_preserve_input.jsx'
19
- export { default as TypeaheadDefaultValue } from './_typeahead_default_value.jsx'
20
- export { default as TypeaheadCustomOptions } from './_typeahead_custom_options.jsx'
19
+ export { default as TypeaheadDefaultValue } from './_typeahead_default_value.jsx'
@@ -213,24 +213,10 @@ export type GlobalProps = AlignContent & AlignItems & AlignSelf &
213
213
 
214
214
  const getResponsivePropClasses = (prop: {[key: string]: string}, classPrefix: string) => {
215
215
  const keys: string[] = Object.keys(prop)
216
- const screenSizeValues = ["xs", "sm", "md", "lg", "xl"]
217
- let classResult = ''
218
-
219
- // Handle default value separately (generates base class without size prefix)
220
- if (prop.default !== undefined) {
221
- const defaultValue: string = typeof(prop.default) === 'string' ? camelToSnakeCase(prop.default) : prop.default
222
- classResult += `${classPrefix}_${defaultValue} `
223
- }
224
-
225
- // Handle responsive sizes (generates classes with size prefix)
226
- keys.forEach((key) => {
227
- if (screenSizeValues.includes(key)) {
228
- const propValue: string = typeof(prop[key]) === 'string' ? camelToSnakeCase(prop[key]) : prop[key]
229
- classResult += `${classPrefix}_${key}_${propValue} `
230
- }
231
- })
232
-
233
- return classResult.trim()
216
+ return keys.map((size: Sizes) => {
217
+ const propValue: string = typeof(prop[size]) === 'string' ? camelToSnakeCase(prop[size]) : prop[size]
218
+ return `${classPrefix}_${size}_${propValue}`
219
+ }).join(" ")
234
220
  }
235
221
 
236
222
  //reusable function for top, bottom, right and left props
@@ -450,11 +436,9 @@ const PROP_CATEGORIES: {[key:string]: (props: {[key: string]: any}) => string} =
450
436
  if (typeof zIndexEntry[1] == "number") {
451
437
  css += `z_index_${zIndexEntry[1]} `
452
438
  } else if (typeof zIndexEntry[1] == "object") {
453
- const responsiveObj: {[key: string]: string} = {}
454
- Object.entries(zIndexEntry[1]).forEach(([key, value]) => {
455
- responsiveObj[key] = value.toString()
439
+ Object.entries(zIndexEntry[1]).forEach((zIndexObj) => {
440
+ css += `z_index_${zIndexObj[0]}_${zIndexObj[1]} `
456
441
  })
457
- css += getResponsivePropClasses(responsiveObj, 'z_index')
458
442
  } else if (zIndexEntry[1] === 'max') {
459
443
  css += `z_index_max `
460
444
  }
@@ -479,11 +463,9 @@ const PROP_CATEGORIES: {[key:string]: (props: {[key: string]: any}) => string} =
479
463
  if (typeof displayEntry[1] == "string") {
480
464
  css += `display_${displayEntry[1]} `
481
465
  } else if (typeof displayEntry[1] == "object") {
482
- const responsiveObj: {[key: string]: string} = {}
483
- Object.entries(displayEntry[1]).forEach(([key, value]) => {
484
- responsiveObj[key] = typeof value === 'string' ? value : value.toString()
466
+ Object.entries(displayEntry[1]).forEach((displayObj) => {
467
+ css += `display_${displayObj[0]}_${displayObj[1]} `
485
468
  })
486
- css += getResponsivePropClasses(responsiveObj, 'display')
487
469
  } else {
488
470
  ' '
489
471
  }
@@ -35,21 +35,3 @@ test('Global Props: returns proper class name', () => {
35
35
  })
36
36
  }
37
37
  })
38
-
39
- test('Global Props: returns proper class name with default key', () => {
40
- const testId = `${testSubject}-default-responsive`
41
- render(
42
- <Body
43
- alignContent={{ default: "spaceAround", xs: "center", sm: "spaceAround", md: "center" }}
44
- data={{ testid: testId }}
45
- text="Hi"
46
- />
47
- )
48
- const kit = screen.getByTestId(testId)
49
- // Should have base class for default value
50
- expect(kit).toHaveClass(`align_content_space_around`)
51
- // Should have responsive classes for screen sizes
52
- expect(kit).toHaveClass(`align_content_xs_center`)
53
- expect(kit).toHaveClass(`align_content_sm_space_around`)
54
- expect(kit).toHaveClass(`align_content_md_center`)
55
- })
@@ -34,21 +34,3 @@ test('Global Props: returns proper class name', () => {
34
34
  })
35
35
  }
36
36
  })
37
-
38
- test('Global Props: returns proper class name with default key', () => {
39
- const testId = `${testSubject}-default-responsive`
40
- render(
41
- <Body
42
- alignItems={{ default: "end", xs: "center", sm: "end", md: "center" }}
43
- data={{ testid: testId }}
44
- text="Hi"
45
- />
46
- )
47
- const kit = screen.getByTestId(testId)
48
- // Should have base class for default value
49
- expect(kit).toHaveClass(`align_items_end`)
50
- // Should have responsive classes for screen sizes
51
- expect(kit).toHaveClass(`align_items_xs_center`)
52
- expect(kit).toHaveClass(`align_items_sm_end`)
53
- expect(kit).toHaveClass(`align_items_md_center`)
54
- })
@@ -35,21 +35,3 @@ test('Global Props: returns proper class name', () => {
35
35
  })
36
36
  }
37
37
  })
38
-
39
- test('Global Props: returns proper class name with default key', () => {
40
- const testId = `${testSubject}-default-responsive`
41
- render(
42
- <Body
43
- alignSelf={{ default: "end", xs: "center", sm: "end", md: "center" }}
44
- data={{ testid: testId }}
45
- text="Hi"
46
- />
47
- )
48
- const kit = screen.getByTestId(testId)
49
- // Should have base class for default value
50
- expect(kit).toHaveClass(`align_self_end`)
51
- // Should have responsive classes for screen sizes
52
- expect(kit).toHaveClass(`align_self_xs_center`)
53
- expect(kit).toHaveClass(`align_self_sm_end`)
54
- expect(kit).toHaveClass(`align_self_md_center`)
55
- })
@@ -36,21 +36,3 @@ test('Global Props: returns proper class name', () => {
36
36
  })
37
37
  }
38
38
  })
39
-
40
- test('Global Props: returns proper class name with default key', () => {
41
- const testId = `${testSubject}-default-responsive`
42
- render(
43
- <Body
44
- data={{ testid: testId }}
45
- display={{ default: "none", xs: "block", sm: "none", md: "block" }}
46
- text="Hi"
47
- />
48
- )
49
- const kit = screen.getByTestId(testId)
50
- // Should have base class for default value
51
- expect(kit).toHaveClass(`display_none`)
52
- // Should have responsive classes for screen sizes
53
- expect(kit).toHaveClass(`display_xs_block`)
54
- expect(kit).toHaveClass(`display_sm_none`)
55
- expect(kit).toHaveClass(`display_md_block`)
56
- })
@@ -62,21 +62,3 @@ test('Global Props: returns proper class name', () => {
62
62
  })
63
63
  }
64
64
  })
65
-
66
- test('Global Props: returns proper class name with default key', () => {
67
- const testId = `${testSubject}-default-responsive`
68
- render(
69
- <Body
70
- data={{ testid: testId }}
71
- flex={{ default: "3", xs: "1", sm: "3", md: "1" }}
72
- text="Hi"
73
- />
74
- )
75
- const kit = screen.getByTestId(testId)
76
- // Should have base class for default value
77
- expect(kit).toHaveClass(`flex_3`)
78
- // Should have responsive classes for screen sizes
79
- expect(kit).toHaveClass(`flex_xs_1`)
80
- expect(kit).toHaveClass(`flex_sm_3`)
81
- expect(kit).toHaveClass(`flex_md_1`)
82
- })
@@ -35,21 +35,3 @@ test('Global Props: returns proper class name', () => {
35
35
  })
36
36
  }
37
37
  })
38
-
39
- test('Global Props: returns proper class name with default key', () => {
40
- const testId = `${testSubject}-default-responsive`
41
- render(
42
- <Body
43
- data={{ testid: testId }}
44
- flexDirection={{ default: "column", xs: "row", sm: "column", md: "row" }}
45
- text="Hi"
46
- />
47
- )
48
- const kit = screen.getByTestId(testId)
49
- // Should have base class for default value
50
- expect(kit).toHaveClass(`flex_direction_column`)
51
- // Should have responsive classes for screen sizes
52
- expect(kit).toHaveClass(`flex_direction_xs_row`)
53
- expect(kit).toHaveClass(`flex_direction_sm_column`)
54
- expect(kit).toHaveClass(`flex_direction_md_row`)
55
- })