playbook_ui 14.3.2 → 14.4.0.pre.alpha.PLAY1529removefaeasy3876

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/SortIconButton.tsx +23 -4
  3. data/app/pb_kits/playbook/pb_button/_button.tsx +6 -2
  4. data/app/pb_kits/playbook/pb_contact/_contact.tsx +17 -5
  5. data/app/pb_kits/playbook/pb_contact/contact.html.erb +14 -6
  6. data/app/pb_kits/playbook/pb_contact/contact.rb +4 -0
  7. data/app/pb_kits/playbook/pb_contact/contact.test.js +1 -1
  8. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +4 -3
  9. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +1 -1
  10. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +4 -0
  11. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +6 -3
  12. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_inline.html.erb +1 -1
  13. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_flatpickr_styles.scss +2 -3
  14. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_header_styles.scss +6 -2
  15. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +2 -0
  16. data/app/pb_kits/playbook/pb_dialog/dialog_header.html.erb +1 -1
  17. data/app/pb_kits/playbook/pb_filter/docs/_filter_default.html.erb +10 -2
  18. data/app/pb_kits/playbook/pb_filter/docs/_filter_max_height.html.erb +5 -1
  19. data/app/pb_kits/playbook/pb_filter/docs/_filter_max_width.html.erb +5 -1
  20. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_background.html.erb +5 -1
  21. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_sort.html.erb +5 -1
  22. data/app/pb_kits/playbook/pb_filter/docs/_filter_only.html.erb +5 -1
  23. data/app/pb_kits/playbook/pb_filter/docs/_filter_placement.html.erb +5 -1
  24. data/app/pb_kits/playbook/pb_filter/docs/_filter_single.html.erb +5 -1
  25. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +245 -23
  26. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +1 -1
  27. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.html.erb +117 -0
  28. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.jsx +227 -0
  29. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_colors.md +1 -0
  30. data/app/pb_kits/playbook/pb_form_pill/docs/example.yml +2 -0
  31. data/app/pb_kits/playbook/pb_form_pill/docs/index.js +1 -0
  32. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +1 -1
  33. data/app/pb_kits/playbook/pb_icon/icon.rb +1 -1
  34. data/app/pb_kits/playbook/pb_map/_map_controls.tsx +7 -1
  35. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +20 -5
  36. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +72 -0
  37. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +91 -0
  38. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color_rails.md +1 -0
  39. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color_react.md +1 -0
  40. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +2 -0
  41. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +1 -0
  42. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +4 -0
  43. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.scss +97 -21
  44. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.test.js +166 -0
  45. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.tsx +45 -6
  46. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_multiple_users_stacked_bubble.html.erb +73 -0
  47. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/_multiple_users_stacked_bubble.jsx +86 -0
  48. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/example.yml +2 -0
  49. data/app/pb_kits/playbook/pb_multiple_users_stacked/docs/index.js +1 -0
  50. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.html.erb +6 -2
  51. data/app/pb_kits/playbook/pb_multiple_users_stacked/multiple_users_stacked.rb +21 -1
  52. data/app/pb_kits/playbook/pb_pagination/docs/_pagination_page_change.jsx +12 -1
  53. data/app/pb_kits/playbook/pb_pagination/docs/_pagination_page_change_react.md +3 -1
  54. data/app/pb_kits/playbook/pb_passphrase/_passphrase.tsx +10 -2
  55. data/app/pb_kits/playbook/pb_popover/docs/_popover_list.html.erb +14 -13
  56. data/app/pb_kits/playbook/pb_popover/docs/_popover_list.jsx +4 -4
  57. data/app/pb_kits/playbook/pb_radio/_radio.tsx +92 -33
  58. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.html.erb +48 -0
  59. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.jsx +59 -0
  60. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_children.md +1 -0
  61. data/app/pb_kits/playbook/pb_radio/docs/example.yml +2 -0
  62. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  63. data/app/pb_kits/playbook/pb_radio/index.js +17 -0
  64. data/app/pb_kits/playbook/pb_radio/radio.html.erb +35 -13
  65. data/app/pb_kits/playbook/pb_radio/radio.rb +3 -1
  66. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/ToolbarDropdown.tsx +12 -5
  67. data/app/pb_kits/playbook/pb_select/_select.tsx +5 -2
  68. data/app/pb_kits/playbook/pb_select/select.html.erb +1 -1
  69. data/app/pb_kits/playbook/pb_select/select.rb +4 -0
  70. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +0 -1
  71. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +17 -13
  72. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +0 -1
  73. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +30 -0
  74. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +7 -0
  75. data/app/pb_kits/playbook/pb_typeahead/components/Control.tsx +6 -5
  76. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +26 -18
  77. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_margin_bottom.html.erb +88 -0
  78. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_margin_bottom.jsx +60 -0
  79. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.html.erb +31 -0
  80. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color.jsx +26 -0
  81. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color_rails.md +1 -0
  82. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_color_react.md +1 -0
  83. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +4 -0
  84. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +2 -0
  85. data/app/pb_kits/playbook/pb_typeahead/typeahead.html.erb +2 -1
  86. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +10 -1
  87. data/app/pb_kits/playbook/tokens/_colors.scss +2 -0
  88. data/app/pb_kits/playbook/utilities/icons/allicons.tsx +136 -13
  89. data/app/pb_kits/playbook/utilities/icons/angle-down.svg +3 -0
  90. data/app/pb_kits/playbook/utilities/icons/envelope.svg +3 -0
  91. data/dist/chunks/_typeahead-DnWoIeq6.js +22 -0
  92. data/dist/chunks/_weekday_stacked-C5Ls9JLc.js +45 -0
  93. data/dist/chunks/lib-CEpcaI8y.js +29 -0
  94. data/dist/chunks/{pb_form_validation-u2wnZ3oe.js → pb_form_validation-D9zkwt2b.js} +1 -1
  95. data/dist/chunks/vendor.js +1 -1
  96. data/dist/playbook-doc.js +1 -1
  97. data/dist/playbook-rails-react-bindings.js +1 -1
  98. data/dist/playbook-rails.js +1 -1
  99. data/dist/playbook.css +1 -1
  100. data/lib/playbook/pagination_renderer.rb +10 -2
  101. data/lib/playbook/version.rb +2 -2
  102. metadata +30 -9
  103. data/dist/chunks/_typeahead-DbAz2Okr.js +0 -22
  104. data/dist/chunks/_weekday_stacked-CZ5S17_d.js +0 -45
  105. data/dist/chunks/lib-D9uVVKnh.js +0 -16
@@ -0,0 +1,48 @@
1
+ <%
2
+ options = [
3
+ { label: "Orange", value: "Orange" },
4
+ { label: "Red", value: "Red" },
5
+ { label: "Green", value: "Green" },
6
+ { label: "Blue", value: "Blue" },
7
+ ]
8
+ %>
9
+
10
+ <%= pb_rails("radio", props: {
11
+ custom_children: true,
12
+ label: "Select",
13
+ name: "Group1",
14
+ value: "Select",
15
+ }) do %>
16
+ <%= pb_rails("select", props: {
17
+ min_width: "xs",
18
+ options: options,
19
+ }) %>
20
+ <% end %>
21
+
22
+ <%= pb_rails("radio", props: {
23
+ custom_children: true,
24
+ label: "Typeahead",
25
+ name: "Group1",
26
+ value: "Typeahead",
27
+ }) do %>
28
+ <%= pb_rails("typeahead", props: {
29
+ id: "typeahead-radio",
30
+ is_multi: false,
31
+ min_width: "xs",
32
+ options: options,
33
+ placeholder: "Select...",
34
+ })
35
+ %>
36
+ <% end %>
37
+
38
+ <%= pb_rails("radio", props: {
39
+ custom_children: true,
40
+ label: "Typography",
41
+ name: "Group1",
42
+ value: "Typography",
43
+ }) do %>
44
+ <%= pb_rails("title", props: {
45
+ text: "Custom Typography",
46
+ })
47
+ %>
48
+ <% end %>
@@ -0,0 +1,59 @@
1
+ import React from 'react'
2
+ import Radio from '../_radio'
3
+ import Select from '../../pb_select/_select'
4
+ import Typeahead from '../../pb_typeahead/_typeahead'
5
+ import Title from '../../pb_title/_title'
6
+
7
+ const RadioChildren = (props) => {
8
+
9
+
10
+ const options = [
11
+ { label: 'Orange', value: 'Orange' },
12
+ { label: 'Red', value: 'Red' },
13
+ { label: 'Green', value: 'Green' },
14
+ { label: 'Blue', value: 'Blue' },
15
+ ]
16
+
17
+ return (
18
+ <div>
19
+ <Radio
20
+ customChildren
21
+ label="Select"
22
+ name="Group1"
23
+ tabIndex={0}
24
+ value="Select"
25
+ {...props}
26
+ >
27
+ <Select
28
+ minWidth="xs"
29
+ options={options}
30
+ />
31
+ </Radio>
32
+ <Radio
33
+ customChildren
34
+ label="Typeahead"
35
+ name="Group1"
36
+ tabIndex={0}
37
+ value="Typeahead"
38
+ {...props}
39
+ >
40
+ <Typeahead
41
+ minWidth="xs"
42
+ options={options}
43
+ />
44
+ </Radio>
45
+ <br />
46
+ <Radio
47
+ customChildren
48
+ defaultChecked={false}
49
+ label="Typography"
50
+ name="Group1"
51
+ value="Typography"
52
+ {...props}
53
+ >
54
+ <Title text="Custom Typography" />
55
+ </Radio>
56
+ </div>
57
+ )
58
+ }
59
+ export default RadioChildren
@@ -0,0 +1 @@
1
+ Use the `custom_children` prop to enable the use of kits instead of text labels.
@@ -7,6 +7,7 @@ examples:
7
7
  - radio_options: With Options
8
8
  - radio_alignment: Alignment
9
9
  - radio_disabled: Disabled
10
+ - radio_custom_children: Custom Children
10
11
 
11
12
  react:
12
13
  - radio_default: Default
@@ -14,6 +15,7 @@ examples:
14
15
  - radio_error: With Error
15
16
  - radio_alignment: Alignment
16
17
  - radio_disabled: Disabled
18
+ - radio_custom_children: Custom Children
17
19
 
18
20
  swift:
19
21
  - radio_default_swift: Default
@@ -3,3 +3,4 @@ export { default as RadioCustom } from './_radio_custom.jsx'
3
3
  export { default as RadioError } from './_radio_error.jsx'
4
4
  export { default as RadioAlignment } from './_radio_alignment.jsx'
5
5
  export { default as RadioDisabled } from './_radio_disabled.jsx'
6
+ export { default as RadioCustomChildren } from './_radio_custom_children.jsx'
@@ -0,0 +1,17 @@
1
+ import PbEnhancedElement from "../pb_enhanced_element"
2
+
3
+ const RADIO_SELECTOR = "[data-pb-radio-children]"
4
+ const RADIO_WRAPPER_SELECTOR = "[data-pb-radio-children-wrapper]"
5
+
6
+ export default class PbRadio extends PbEnhancedElement {
7
+ static get selector() {
8
+ return RADIO_SELECTOR
9
+ }
10
+
11
+ connect() {
12
+ const radioWrapperElement = this.element.parentElement.querySelector(RADIO_WRAPPER_SELECTOR)
13
+ radioWrapperElement.addEventListener("click", () => {
14
+ this.element.querySelector("input[type='radio']").click()
15
+ })
16
+ }
17
+ }
@@ -1,18 +1,40 @@
1
- <%= content_tag(:label,
1
+ <% if object.custom_children %>
2
+ <%= pb_rails("flex", props: {
2
3
  aria: object.aria,
3
- checked: object.checked,
4
+ align: "center",
4
5
  class: object.classname,
6
+ cursor: "pointer",
5
7
  data: object.data,
6
- id: object.id,
7
- value: object.value,
8
- **combined_html_options) do %>
9
-
10
- <% if content.present? %>
11
- <%= content %>
12
- <% else %>
13
- <%= radio_button_tag object.name, object.value, object.selected, object.input_options %>
8
+ **combined_html_options
9
+ }) do %>
10
+ <%= content_tag(:label,
11
+ 'data-pb-radio-children': 'true',
12
+ checked: object.checked,
13
+ class: object.classname,
14
+ id: object.id,
15
+ value: object.value) do %>
16
+ <%= input %>
17
+ <span class="pb_radio_button"></span>
14
18
  <% end %>
19
+ <div data-pb-radio-children-wrapper="true"> <%= content %> </div>
20
+ <% end %>
21
+ <% else %>
22
+ <%= content_tag(:label,
23
+ aria: object.aria,
24
+ checked: object.checked,
25
+ class: object.classname,
26
+ data: object.data,
27
+ id: object.id,
28
+ value: object.value,
29
+ **combined_html_options) do %>
30
+
31
+ <% if content.present? %>
32
+ <%= content %>
33
+ <% else %>
34
+ <%= radio_button_tag object.name, object.value, object.selected, object.input_options %>
35
+ <% end %>
15
36
 
16
- <span class="pb_radio_button"></span>
17
- <%= pb_rails("body", props: { status: object.body_status, text: object.text, dark: object.dark }) %>
18
- <% end %>
37
+ <span class="pb_radio_button"></span>
38
+ <%= pb_rails("body", props: { status: object.body_status, text: object.text, dark: object.dark }) %>
39
+ <% end %>
40
+ <% end %>
@@ -20,6 +20,8 @@ module Playbook
20
20
  default: "Radio Text"
21
21
  prop :value, type: Playbook::Props::String,
22
22
  default: "radio_text"
23
+ prop :custom_children, type: Playbook::Props::Boolean,
24
+ default: false
23
25
 
24
26
  def classname
25
27
  generate_classname("pb_radio_kit") + error_class + alignment_class
@@ -34,7 +36,7 @@ module Playbook
34
36
  end
35
37
 
36
38
  def input
37
- radio_button_tag(name, value, checked, input_options.merge(disabled: disabled))
39
+ radio_button_tag(name, value, checked, input_options.merge(disabled: disabled || input_options[:disabled]))
38
40
  end
39
41
 
40
42
  private
@@ -1,5 +1,7 @@
1
1
  import React, { useState } from 'react'
2
2
 
3
+ import { getAllIcons } from "../../utilities/icons/allicons"
4
+
3
5
  import Flex from '../../pb_flex/_flex'
4
6
  import PbReactPopover from '../../pb_popover/_popover'
5
7
  import Button from '../../pb_button/_button'
@@ -65,6 +67,7 @@ const toolbarDropdownItems = [
65
67
  },
66
68
  ]
67
69
 
70
+ const angleDown = getAllIcons()["angleDown"].icon as unknown as { [key: string]: SVGElement }
68
71
 
69
72
  const handleTogglePopover = () => {
70
73
  setShowPopover(!showPopover)
@@ -92,8 +95,10 @@ for (const { text, isActive, icon } of toolbarDropdownItems) {
92
95
  <Flex className={showPopover ? "fa-flip-vertical" : ""}
93
96
  display="inline_flex"
94
97
  >
95
- <Icon fixedWidth
96
- icon="angle-down"
98
+ <Icon
99
+ className="svg-inline--fa"
100
+ customIcon={angleDown}
101
+ fixedWidth
97
102
  margin-left="xs"
98
103
  />
99
104
  </Flex>
@@ -125,8 +130,10 @@ const popoverReference = (
125
130
  <Flex className={showPopover ? "fa-flip-vertical" : ""}
126
131
  display="inline_flex"
127
132
  >
128
- <Icon fixedWidth
129
- icon="angle-down"
133
+ <Icon
134
+ className="svg-inline--fa"
135
+ customIcon={angleDown}
136
+ fixedWidth
130
137
  margin-left="xs"
131
138
  />
132
139
  </Flex>
@@ -169,4 +176,4 @@ const popoverReference = (
169
176
  )
170
177
  }
171
178
 
172
- export default ToolbarDropdown
179
+ export default ToolbarDropdown
@@ -4,6 +4,7 @@ import classnames from 'classnames'
4
4
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
5
5
  import { globalProps, GlobalProps, domSafeProps } from '../utilities/globalProps'
6
6
  import type { InputCallback } from '../types'
7
+ import { getAllIcons } from "../utilities/icons/allicons"
7
8
 
8
9
  import Body from '../pb_body/_body'
9
10
  import Caption from '../pb_caption/_caption'
@@ -90,6 +91,8 @@ const Select = ({
90
91
  compactClass
91
92
  );
92
93
 
94
+ const angleDown = getAllIcons()["angleDown"].icon as unknown as { [key: string]: SVGElement }
95
+
93
96
  const selectWrapperClass = classnames(buildCss('pb_select_kit_wrapper'), { error }, className)
94
97
  const selectBody =(() =>{
95
98
  if (children) return children
@@ -134,9 +137,9 @@ const Select = ({
134
137
  {selectBody}
135
138
  { multiple !== true ?
136
139
  <Icon
137
- className="pb_select_kit_caret"
140
+ className="pb_select_kit_caret svg-inline--fa"
141
+ customIcon={angleDown}
138
142
  fixedWidth
139
- icon="angle-down"
140
143
  />
141
144
  :
142
145
  null
@@ -26,7 +26,7 @@
26
26
  <%= pb_rails("body", props: { status: "negative", text: object.error }) %>
27
27
  <% end %>
28
28
  <% if object.multiple != true %>
29
- <%= pb_rails("icon", props: { icon: "angle-down", fixed_width: true, classname: "pb_select_kit_caret"}) %>
29
+ <%= pb_rails("icon", props: { custom_icon: Playbook::Engine::root.join(angle_down_path), fixed_width: true, classname: "pb_select_kit_caret"}) %>
30
30
  <% end %>
31
31
  </label>
32
32
  <% end %>
@@ -84,6 +84,10 @@ module Playbook
84
84
  end
85
85
  end
86
86
 
87
+ def angle_down_path
88
+ "app/pb_kits/playbook/utilities/icons/angle-down.svg"
89
+ end
90
+
87
91
  private
88
92
 
89
93
  def error_class
@@ -45,7 +45,6 @@
45
45
  }
46
46
  }
47
47
  .text_input_wrapper {
48
- margin-bottom: 1rem;
49
48
  input::placeholder,
50
49
  .text_input .placeholder {
51
50
  @include pb_body_light_dark;
@@ -1,14 +1,14 @@
1
1
  import React, { useRef, useState, forwardRef, ForwardedRef } from "react"
2
2
 
3
3
  import {
4
- arrow,
5
- flip,
6
- offset,
7
- Placement,
8
- safePolygon,
4
+ arrow,
5
+ flip,
6
+ offset,
7
+ Placement,
8
+ safePolygon,
9
9
  shift,
10
- useFloating,
11
- useHover,
10
+ useFloating,
11
+ useHover,
12
12
  useInteractions,
13
13
  } from "@floating-ui/react"
14
14
 
@@ -16,6 +16,8 @@ import classnames from "classnames"
16
16
  import { GlobalProps, globalProps } from "../utilities/globalProps"
17
17
  import { buildAriaProps, buildDataProps, buildHtmlProps } from "../utilities/props"
18
18
  import Flex from "../pb_flex/_flex"
19
+ import { getAllIcons } from "../utilities/icons/allicons"
20
+ import Icon from '../pb_icon/_icon'
19
21
 
20
22
  type TooltipProps = {
21
23
  aria?: { [key: string]: string },
@@ -53,7 +55,7 @@ const Tooltip = forwardRef((props: TooltipProps, ref: ForwardedRef<unknown>): Re
53
55
  const dataProps: { [key: string]: string } = buildDataProps(data)
54
56
  const ariaProps: { [key: string]: string } = buildAriaProps(aria)
55
57
  const htmlProps = buildHtmlProps(htmlOptions)
56
-
58
+
57
59
  const css = classnames(
58
60
  globalProps({...rest}),
59
61
  className,
@@ -61,7 +63,6 @@ const Tooltip = forwardRef((props: TooltipProps, ref: ForwardedRef<unknown>): Re
61
63
  const [open, setOpen] = useState(false)
62
64
  const arrowRef = useRef(null)
63
65
 
64
-
65
66
  const {
66
67
  context,
67
68
  middlewareData: { arrow: { x: arrowX, y: arrowY } = {}, },
@@ -95,7 +96,7 @@ const Tooltip = forwardRef((props: TooltipProps, ref: ForwardedRef<unknown>): Re
95
96
  placement: preferredPlacement
96
97
  })
97
98
 
98
-
99
+
99
100
  const { getFloatingProps } = useInteractions([
100
101
  useHover(context, {
101
102
  delay,
@@ -148,13 +149,16 @@ const Tooltip = forwardRef((props: TooltipProps, ref: ForwardedRef<unknown>): Re
148
149
  },
149
150
  })}
150
151
  >
151
- <Flex
152
+ <Flex
152
153
  align="center"
153
154
  gap="xs"
154
155
  >
155
156
  {icon && (
156
- <i className={`pb_icon_kit far fa-${icon} fa-fw`} />
157
- )}
157
+ <i className={`pb_icon_kit`}>
158
+ <Icon
159
+ icon={icon}
160
+ />
161
+ </i>)}
158
162
  {text}
159
163
  </Flex>
160
164
  <div
@@ -68,7 +68,6 @@
68
68
  opacity: 0;
69
69
  }
70
70
  [class^=pb_list_kit] {
71
- margin-top: -$space-sm;
72
71
  li {
73
72
  transition: background-color .25s ease-in-out;
74
73
  }
@@ -107,4 +107,34 @@ test('should pass className prop', () => {
107
107
 
108
108
  const kit = screen.getByTestId('typeahead-test')
109
109
  expect(kit).toHaveClass(className)
110
+ })
111
+
112
+ test('typeahead textinput has mb_sm class by default', () => {
113
+ render(
114
+ <Typeahead
115
+ data={{ testid: 'default-mb-test' }}
116
+ options={options}
117
+ />
118
+ )
119
+
120
+ const kit = screen.getByTestId('default-mb-test')
121
+ expect(kit).toHaveClass("pb_typeahead_kit mb_sm")
122
+ const textInput = kit.querySelector(".pb_text_input_kit")
123
+ expect(textInput).toHaveClass("mb_none")
124
+ })
125
+
126
+ test('typeahead with colored pills', () => {
127
+ render(
128
+ <Typeahead
129
+ data={{ testid: 'pills-color-test' }}
130
+ defaultValue={[options[0]]}
131
+ isMulti
132
+ options={options}
133
+ pillColor="neutral"
134
+ />
135
+ )
136
+
137
+ const kit = screen.getByTestId('pills-color-test')
138
+ const pill = kit.querySelector(".pb_form_pill_kit_neutral")
139
+ expect(pill).toBeInTheDocument()
110
140
  })
@@ -45,12 +45,15 @@ type TypeaheadProps = {
45
45
  getOptionLabel?: string | (() => any),
46
46
  getOptionValue?: string | (() => any),
47
47
  name?: string,
48
+ marginBottom?: "none" | "xxs" | "xs" | "sm" | "md" | "lg" | "xl",
49
+ 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",
48
50
  } & GlobalProps
49
51
 
50
52
  export type SelectValueType = {
51
53
  label: string,
52
54
  value: string,
53
55
  imageUrl?: string,
56
+ pillColor?: string,
54
57
  }
55
58
 
56
59
  type TagOnChangeValues = {
@@ -76,6 +79,8 @@ const Typeahead = ({
76
79
  htmlOptions = {},
77
80
  id,
78
81
  loadOptions = noop,
82
+ marginBottom = "sm",
83
+ pillColor,
79
84
  ...props
80
85
  }: TypeaheadProps) => {
81
86
  const selectProps = {
@@ -105,6 +110,7 @@ const Typeahead = ({
105
110
  onCreateOption: null as null,
106
111
  plusIcon: false,
107
112
  onMultiValueClick: (_option: SelectValueType): any => undefined,
113
+ pillColor: pillColor,
108
114
  ...props,
109
115
  }
110
116
 
@@ -134,6 +140,7 @@ const Typeahead = ({
134
140
  const htmlProps = buildHtmlProps(htmlOptions)
135
141
  const classes = classnames(
136
142
  'pb_typeahead_kit react-select',
143
+ `mb_${marginBottom}`,
137
144
  globalProps(props),
138
145
  className
139
146
  )
@@ -11,14 +11,15 @@ type Props = {
11
11
  const TypeaheadControl = (props: Props) => (
12
12
  <div className="pb_typeahead_wrapper">
13
13
  <TextInput
14
- dark={props.selectProps.dark}
15
- error={props.selectProps.error}
16
- label={props.selectProps.label}
14
+ dark={props.selectProps.dark}
15
+ error={props.selectProps.error}
16
+ label={props.selectProps.label}
17
+ marginBottom="none"
17
18
  >
18
19
  <Flex>
19
20
  <components.Control
20
- className="text_input"
21
- {...props}
21
+ className="text_input"
22
+ {...props}
22
23
  />
23
24
  </Flex>
24
25
  </TextInput>
@@ -8,6 +8,7 @@ import { SelectValueType } from '../_typeahead'
8
8
  type Props = {
9
9
  data: SelectValueType,
10
10
  multiValueTemplate: any,
11
+ 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",
11
12
  removeProps: any,
12
13
  selectProps: any,
13
14
  }
@@ -15,48 +16,55 @@ type Props = {
15
16
  const MultiValue = (props: Props) => {
16
17
  const { removeProps } = props
17
18
  const { imageUrl, label } = props.data
18
- const { multiKit } = props.selectProps
19
+ const { dark, multiKit, pillColor } = props.selectProps
19
20
 
20
21
  const formPillProps = {
21
22
  marginRight: 'xs',
22
23
  name: label,
23
24
  avatarUrl: '',
25
+ dark,
24
26
  }
25
27
 
26
28
  if (typeof imageUrl === 'string') formPillProps.avatarUrl = imageUrl
27
29
 
28
30
  return (
29
31
  <components.MultiValueContainer
30
- className="text_input_multivalue_container"
31
- {...props}
32
+ className="text_input_multivalue_container"
33
+ {...props}
32
34
  >
33
35
  {multiKit === 'badge' &&
34
36
  <Badge
35
- closeProps={removeProps}
36
- removeIcon
37
- text={label}
38
- variant="primary"
37
+ closeProps={removeProps}
38
+ removeIcon
39
+ text={label}
40
+ variant="primary"
39
41
  />
40
42
  }
41
43
 
42
44
  {multiKit !== 'badge' && imageUrl &&
43
45
  <FormPill
44
- avatarUrl={imageUrl}
45
- closeProps={removeProps}
46
- marginRight="xs"
47
- name={label}
48
- size={multiKit === 'smallPill' ? 'small' : ''}
49
- text=''
46
+ avatarUrl={imageUrl}
47
+ closeProps={removeProps}
48
+ color={pillColor}
49
+ dark={dark}
50
+ marginRight="xs"
51
+ name={label}
52
+ size={multiKit === 'smallPill' ? 'small' : ''}
53
+ text=''
54
+ {...props}
50
55
  />
51
56
  }
52
57
 
53
58
  {multiKit !== 'badge' && !imageUrl &&
54
59
  <FormPill
55
- closeProps={removeProps}
56
- marginRight="xs"
57
- name=''
58
- size={multiKit === 'smallPill' ? 'small' : ''}
59
- text={label}
60
+ closeProps={removeProps}
61
+ color={pillColor}
62
+ dark={dark}
63
+ marginRight="xs"
64
+ name=''
65
+ size={multiKit === 'smallPill' ? 'small' : ''}
66
+ text={label}
67
+ {...props}
60
68
  />
61
69
  }
62
70
  </components.MultiValueContainer>