playbook_ui 16.2.0.pre.rc.3 → 16.2.0.pre.rc.4

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sort.md +1 -1
  3. data/app/pb_kits/playbook/pb_checkbox/_checkbox.scss +1 -1
  4. data/app/pb_kits/playbook/pb_checkbox/_checkbox.tsx +17 -0
  5. data/app/pb_kits/playbook/pb_checkbox/checkbox.html.erb +10 -1
  6. data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +2 -0
  7. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_required_indicator.html.erb +6 -0
  8. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_required_indicator.jsx +17 -0
  9. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_required_indicator.md +3 -0
  10. data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +2 -0
  11. data/app/pb_kits/playbook/pb_checkbox/docs/index.js +1 -0
  12. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +46 -11
  13. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +1 -1
  14. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.html.erb +6 -3
  15. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.jsx +1 -0
  16. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.md +3 -1
  17. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +11 -5
  18. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +9 -0
  19. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +15 -10
  20. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +4 -0
  21. data/app/pb_kits/playbook/pb_dropdown/index.js +132 -79
  22. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +16 -0
  23. data/app/pb_kits/playbook/pb_dropdown/utilities/clickOutsideHelper.tsx +6 -0
  24. data/app/pb_kits/playbook/pb_form/docs/_form_with_required_indicator.html.erb +5 -3
  25. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +7 -0
  26. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +638 -549
  27. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +3 -3
  28. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +4 -7
  29. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.md +3 -0
  30. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.test.jsx +4 -4
  31. data/app/pb_kits/playbook/pb_nav/_item.tsx +5 -3
  32. data/app/pb_kits/playbook/pb_nav/_nav.scss +82 -3
  33. data/app/pb_kits/playbook/pb_nav/docs/_collapsible_nav_disabled_item.html.erb +24 -0
  34. data/app/pb_kits/playbook/pb_nav/docs/_collapsible_nav_disabled_item.jsx +87 -0
  35. data/app/pb_kits/playbook/pb_nav/docs/example.yml +2 -6
  36. data/app/pb_kits/playbook/pb_nav/docs/index.js +2 -1
  37. data/app/pb_kits/playbook/pb_nav/item.html.erb +1 -1
  38. data/app/pb_kits/playbook/pb_nav/item.rb +1 -1
  39. data/app/pb_kits/playbook/pb_nav/navTypes.ts +1 -0
  40. data/app/pb_kits/playbook/pb_text_input/text_input.html.erb +10 -10
  41. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +29 -1
  42. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +411 -323
  43. data/app/pb_kits/playbook/pb_typeahead/components/Control.tsx +2 -0
  44. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_required_indicator.html.erb +16 -0
  45. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_required_indicator.jsx +23 -0
  46. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_required_indicator.md +3 -0
  47. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  48. data/app/pb_kits/playbook/pb_typeahead/docs/index.js +22 -21
  49. data/app/pb_kits/playbook/pb_typeahead/typeahead.html.erb +3 -2
  50. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +3 -1
  51. data/app/pb_kits/playbook/tokens/_colors.scss +3 -0
  52. data/app/pb_kits/playbook/tokens/_colors_accessible.scss +250 -0
  53. data/app/pb_kits/playbook/tokens/exports/_colors.module.scss +10 -0
  54. data/dist/chunks/{_pb_line_graph-CG2X7d4a.js → _pb_line_graph-CC2Ywwix.js} +1 -1
  55. data/dist/chunks/_typeahead-CmMqokN8.js +1 -0
  56. data/dist/chunks/{globalProps-B_OY_vR9.js → globalProps-DYr2qrIf.js} +1 -1
  57. data/dist/chunks/lib-DgqmX9CF.js +29 -0
  58. data/dist/chunks/vendor.js +2 -2
  59. data/dist/playbook-rails-react-bindings.js +1 -1
  60. data/dist/playbook-rails.js +1 -1
  61. data/dist/playbook.css +2 -2
  62. data/dist/reset.css +1 -1
  63. data/lib/playbook/forms/builder/form_field_builder.rb +1 -1
  64. data/lib/playbook/forms/builder/typeahead_field.rb +15 -1
  65. data/lib/playbook/forms/builder.rb +2 -2
  66. data/lib/playbook/version.rb +1 -1
  67. metadata +16 -6
  68. data/dist/chunks/_typeahead-DjDiMPdY.js +0 -1
  69. data/dist/chunks/lib-9vEH4omL.js +0 -29
@@ -65,7 +65,7 @@
65
65
  }] %>
66
66
 
67
67
  <%= pb_rails("multi_level_select", props: {
68
- id: "multi-level-select-label-rails",
69
- label: "Select a department",
70
- tree_data: treeData
68
+ id: "select_a_department",
69
+ label: "Select a Department",
70
+ tree_data: treeData
71
71
  }) %>
@@ -73,14 +73,11 @@ const MultiLevelSelectDefault = (props) => {
73
73
  return (
74
74
  <div>
75
75
  <MultiLevelSelect
76
- id='multiselect-label'
76
+ id="select_a_department"
77
77
  label="Select a Department"
78
78
  onSelect={(selectedNodes) =>
79
- console.log(
80
- "Selected Items",
81
- selectedNodes
82
- )
83
- }
79
+ console.log("Selected Items", selectedNodes)
80
+ }
84
81
  treeData={treeData}
85
82
  {...props}
86
83
  />
@@ -88,4 +85,4 @@ const MultiLevelSelectDefault = (props) => {
88
85
  )
89
86
  };
90
87
 
91
- export default MultiLevelSelectDefault;
88
+ export default MultiLevelSelectDefault;
@@ -0,0 +1,3 @@
1
+ The MultiLevelSelect component optionally accepts a `label` prop to produce a label above the input.
2
+
3
+ Add an `id` to wire the label to the input so that clicking the label will move focus directly to the input, and open the drop-down.
@@ -192,7 +192,7 @@ describe('MultiLevelSelect multi variant', () => {
192
192
  />
193
193
  )
194
194
  const kit = screen.getByTestId(testId)
195
- const input = kit.querySelector('#multiselect_input')
195
+ const input = kit.querySelector('#multi-disabled-test_input')
196
196
  fireEvent.click(input)
197
197
 
198
198
  const disabledCheckbox = kit.querySelector('input[type="checkbox"][disabled]')
@@ -227,7 +227,7 @@ describe('MultiLevelSelect single variant', () => {
227
227
  />
228
228
  )
229
229
  const kit = screen.getByTestId(testId)
230
- const input = kit.querySelector('#multiselect_input')
230
+ const input = kit.querySelector('#single-disabled-test_input')
231
231
  fireEvent.click(input)
232
232
 
233
233
  const disabledRadio = kit.querySelector('input[type="radio"][disabled]')
@@ -246,7 +246,7 @@ describe('MultiLevelSelect single variant', () => {
246
246
  />
247
247
  )
248
248
  const kit = screen.getByTestId(testId)
249
- const input = kit.querySelector('#multiselect_input')
249
+ const input = kit.querySelector('#single-disabled-click-test_input')
250
250
  fireEvent.click(input)
251
251
 
252
252
  const disabledRadio = kit.querySelector('input[type="radio"][disabled]')
@@ -267,7 +267,7 @@ describe('MultiLevelSelect single variant', () => {
267
267
  />
268
268
  )
269
269
  const kit = screen.getByTestId(testId)
270
- const input = kit.querySelector('#multiselect_input')
270
+ const input = kit.querySelector('#single-enabled-click-test_input')
271
271
  fireEvent.click(input)
272
272
 
273
273
  const enabledRadio = kit.querySelector('input[type="radio"]:not([disabled])')
@@ -91,6 +91,7 @@ const NavItem = (props: NavItemProps) => {
91
91
  marginX,
92
92
  marginY,
93
93
  disabled = false,
94
+
94
95
  } = props;
95
96
 
96
97
  const spacingMarginProps = {
@@ -197,13 +198,14 @@ const { filteredPadding, filteredMargin } = filterItemSpacing(itemSpacing);
197
198
  if (React.isValidElement(child)) {
198
199
  const childProps: NavChildProps = {
199
200
  itemSpacing: itemSpacing,
201
+ ...(disabled && { disabled: disabled })
200
202
  };
201
203
  return React.cloneElement(child, childProps);
202
204
  }
203
205
  return child;
204
206
  });
205
207
 
206
- const collapsibleClasses = buildCss("collapsible_nav_wrapper", activeClass, highlightedBorderClass, collapsibleTrailClass)
208
+ const collapsibleClasses = buildCss("collapsible_nav_wrapper", activeClass, highlightedBorderClass, collapsibleTrailClass, disabledClass)
207
209
 
208
210
  const handleKeyDown = (e: React.KeyboardEvent) => {
209
211
  if (!disabled && !isLink && (e.key === "Enter" || e.key === " ")) {
@@ -231,8 +233,8 @@ const { filteredPadding, filteredMargin } = filterItemSpacing(itemSpacing);
231
233
  icon={iconRight && iconRight}
232
234
  iconSize="xs"
233
235
  id={id}
234
- onClick={onClick}
235
- onIconClick={onIconRightClick}
236
+ onClick={disabled ? undefined : onClick}
237
+ onIconClick={disabled ? undefined : onIconRightClick}
236
238
  >
237
239
  <Collapsible.Main
238
240
  className={globalProps({ ...finalItemSpacing })}
@@ -7,8 +7,10 @@
7
7
  @import "./collapsible_nav";
8
8
 
9
9
  [class^="pb_nav_list"] {
10
+
10
11
  //classes for fontSize and fontWeight props
11
12
  .font_size_small {
13
+
12
14
  .pb_nav_list_item_text,
13
15
  .pb_nav_list_item_text_collapsible {
14
16
  font-size: $font_small;
@@ -16,6 +18,7 @@
16
18
  }
17
19
 
18
20
  .font_size_normal {
21
+
19
22
  .pb_nav_list_item_text,
20
23
  .pb_nav_list_item_text_collapsible {
21
24
  font-size: $font_normal;
@@ -23,6 +26,7 @@
23
26
  }
24
27
 
25
28
  .font_bolder {
29
+
26
30
  .pb_nav_list_item_text,
27
31
  .pb_nav_list_item_text_collapsible {
28
32
  font-weight: $bolder !important;
@@ -30,6 +34,7 @@
30
34
  }
31
35
 
32
36
  .font_bold {
37
+
33
38
  .pb_nav_list_item_text,
34
39
  .pb_nav_list_item_text_collapsible {
35
40
  font-weight: $bold !important;
@@ -37,6 +42,7 @@
37
42
  }
38
43
 
39
44
  .font_regular {
45
+
40
46
  .pb_nav_list_item_text,
41
47
  .pb_nav_list_item_text_collapsible {
42
48
  font-weight: $regular;
@@ -79,19 +85,22 @@
79
85
  }
80
86
 
81
87
  // Disabled scss
82
- .pb_nav_item_disabled {
88
+ .pb_nav_item_disabled{
83
89
  cursor: not-allowed !important;
84
- .pb_nav_list_item_text,
90
+
91
+ .pb_nav_list_item_text,
85
92
  .pb_nav_list_item_icon_left,
86
93
  .pb_nav_list_item_icon_right,
87
94
  .pb_nav_list_item_icon_section {
88
95
  color: $text_lt_lighter !important;
89
96
  cursor: not-allowed !important;
90
97
  }
98
+
91
99
  @media (hover: hover) {
92
100
  &:hover {
93
- background-color: unset !important;
101
+ background-color: $white !important;
94
102
  color: $text_lt_lighter !important;
103
+
95
104
  .pb_nav_list_item_text,
96
105
  .pb_nav_list_item_icon_left,
97
106
  .pb_nav_list_item_icon_right {
@@ -100,3 +109,73 @@
100
109
  }
101
110
  }
102
111
  }
112
+
113
+ .pb_nav_item_disabled {
114
+ cursor: not-allowed !important;
115
+
116
+ .pb_nav_list_item_text,
117
+ .pb_nav_list_item_text_collapsible,
118
+ .pb_nav_list_item_icon_left,
119
+ .pb_nav_list_item_icon_right,
120
+ .pb_nav_list_item_icon_section,
121
+ .pb_nav_list_item_link,
122
+ .pb_nav_list_item_link_collapsible,
123
+ .cursor_pointer {
124
+ color: $text_lt_lighter !important;
125
+ cursor: not-allowed !important;
126
+ }
127
+
128
+ .pb_collapsible_main_kit {
129
+ background-color: $white !important;
130
+ }
131
+
132
+ .icon_wrapper,
133
+ svg {
134
+ color: $text_lt_lighter !important;
135
+ cursor: not-allowed !important;
136
+ }
137
+
138
+ @media (hover: hover) {
139
+ &:hover {
140
+ background-color: $white !important;
141
+
142
+ .pb_collapsible_main_kit,
143
+ .pb_nav_list_item_link,
144
+ .icon_wrapper {
145
+ background-color: $white !important;
146
+ }
147
+
148
+ .pb_nav_list_item_icon_section_collapsible path,
149
+ .pb_nav_list_item_link_collapsible path {
150
+ color: $text_lt_lighter !important;
151
+ }
152
+ }
153
+ }
154
+ }
155
+
156
+ .collapsible_nav_wrapper_pb_nav_item_disabled {
157
+ .pb_collapsible_main_kit {
158
+ background-color: $white !important;
159
+ }
160
+
161
+ .pb_nav_list_item_link,
162
+ .pb_nav_list_item_text,
163
+ .pb_nav_list_item_icon_left,
164
+ .pb_nav_list_item_icon_right,
165
+ .icon_wrapper,
166
+ .pb_nav_list_item_icon_section {
167
+ color: $text_lt_lighter !important;
168
+ cursor: not-allowed !important;
169
+ }
170
+
171
+ .icon_wrapper svg {
172
+ color: $text_lt_lighter !important;
173
+ }
174
+
175
+ &:hover {
176
+ .icon_wrapper,
177
+ .pb_nav_list_item_link {
178
+ background-color: $white !important;
179
+ }
180
+ }
181
+ }
@@ -0,0 +1,24 @@
1
+ <%= pb_rails("nav", props: { variant: "bold" }) do %>
2
+ <%= pb_rails("nav/item", props: { text: "Overview", link: "#", collapsible: true, icon_left:"city", disabled: true }) do %>
3
+ <%= pb_rails("nav", props: { variant: "bold" }) do %>
4
+ <%= pb_rails("nav/item", props: { text: "City", link: "#" }) %>
5
+ <%= pb_rails("nav/item", props: { text: "People", link: "#" }) %>
6
+ <%= pb_rails("nav/item", props: { text: "Business", link: "#" }) %>
7
+ <% end %>
8
+ <% end %>
9
+ <%= pb_rails("nav/item", props: { text: "Albums", link: "#", active: true, collapsible: true, icon_left: "theater-masks" }) do %>
10
+ <%= pb_rails("nav", props: { variant: "bold" }) do %>
11
+ <%= pb_rails("nav/item", props: { text: "Entertainment", link: "#" }) %>
12
+ <%= pb_rails("nav/item", props: { text: "Food", link: "#" }) %>
13
+ <%= pb_rails("nav/item", props: { text: "Style", link: "#" }) %>
14
+ <% end %>
15
+ <% end %>
16
+ <%= pb_rails("nav/item", props: { text: "Similar Artists", link: "#", collapsible: true, icon_left: "city" }) do %>
17
+ <%= pb_rails("nav", props: { variant: "bold" }) do %>
18
+ <%= pb_rails("nav/item", props: { text: "City", link: "#", disabled: true }) %>
19
+ <%= pb_rails("nav/item", props: { text: "People", link: "#" }) %>
20
+ <%= pb_rails("nav/item", props: { text: "Business", link: "#" }) %>
21
+ <% end %>
22
+ <% end %>
23
+ <% end %>
24
+
@@ -0,0 +1,87 @@
1
+ import React from "react";
2
+ import Nav from '../../pb_nav/_nav'
3
+ import NavItem from '../../pb_nav/_item'
4
+
5
+ const CollapsibleNavDisabledItem = (props) => {
6
+ return (
7
+ <Nav
8
+ variant="bold"
9
+ {...props}
10
+ >
11
+ <NavItem
12
+ collapsed={false}
13
+ collapsible
14
+ disabled
15
+ iconLeft="city"
16
+ link="#"
17
+ text="Overview"
18
+ {...props}
19
+ >
20
+ <NavItem
21
+ link="#"
22
+ text="City"
23
+ {...props}
24
+ />
25
+ <NavItem
26
+ link="#"
27
+ text="People"
28
+ {...props}
29
+ />
30
+ <NavItem
31
+ link="#"
32
+ text="Business"
33
+ {...props}
34
+ />
35
+ </NavItem>
36
+ <NavItem
37
+ collapsible
38
+ iconLeft="theater-masks"
39
+ link="#"
40
+ text="Albums"
41
+ {...props}
42
+ >
43
+ <NavItem
44
+ disabled
45
+ link="#"
46
+ text="Entertainment"
47
+ {...props}
48
+ />
49
+ <NavItem
50
+ link="#"
51
+ text="Food"
52
+ {...props}
53
+ />
54
+ <NavItem
55
+ link="#"
56
+ text="Style"
57
+ {...props}
58
+ />
59
+ </NavItem>
60
+ <NavItem
61
+ collapsible
62
+ iconLeft="city"
63
+ link="#"
64
+ text="Similar Artists"
65
+ {...props}
66
+ >
67
+ <NavItem
68
+ link="#"
69
+ text="City"
70
+ {...props}
71
+ />
72
+ <NavItem
73
+ link="#"
74
+ text="People"
75
+ {...props}
76
+ />
77
+ <NavItem
78
+ link="#"
79
+ text="Business"
80
+ {...props}
81
+ />
82
+ </NavItem>
83
+ </Nav>
84
+ );
85
+ };
86
+
87
+ export default CollapsibleNavDisabledItem
@@ -14,6 +14,7 @@ examples:
14
14
  - collapsible_nav: Collapsible Nav
15
15
  - collapsible_nav_with_all_options: Collapsible Nav With Options
16
16
  - collapsible_nav_no_icon: Collapsible Nav No Icon
17
+ - collapsible_nav_disabled_item: Collapsible Nav With Disabled Item
17
18
  - horizontal_nav: Horizontal Nav
18
19
  - subtle_horizontal_nav: Subtle Horizontal Nav
19
20
  - bold_horizontal_nav: Bold Horizontal Nav
@@ -42,6 +43,7 @@ examples:
42
43
  - collapsible_nav_item_spacing: Collapsible Nav With ItemSpacing
43
44
  - collapsible_nav_custom: Collapsible Nav With Custom Toggling
44
45
  - collapsible_nav_no_icon: Collapsible Nav No Icon
46
+ - collapsible_nav_disabled_item: Collapsible Nav With Disabled Item
45
47
  - horizontal_nav: Horizontal Nav
46
48
  - subtle_horizontal_nav: Subtle Horizontal Nav
47
49
  - bold_horizontal_nav: Bold Horizontal Nav
@@ -62,9 +64,3 @@ examples:
62
64
  - nav_horizontal_subtle_no_highlight_swift: Horizontal Subtle No Highlight
63
65
  - nav_horizontal_bold_swift: Horizontal Bold
64
66
  - nav_props_swift: ""
65
-
66
-
67
-
68
-
69
-
70
-
@@ -22,4 +22,5 @@ export { default as CollapsibleNavItemSpacing } from "./_collapsible_nav_item_sp
22
22
  export { default as CollapsibleNavNoIcon } from "./_collapsible_nav_no_icon.jsx"
23
23
  export { default as HorizontalNavExtendedunderline } from './_horizontal_nav_extendedunderline.jsx'
24
24
  export { default as HorizontalNavDisabled } from './_horizontal_nav_disabled.jsx'
25
- export { default as VerticalNavDisabled } from './_vertical_nav_disabled.jsx'
25
+ export { default as VerticalNavDisabled } from './_vertical_nav_disabled.jsx'
26
+ export { default as CollapsibleNavDisabledItem } from './_collapsible_nav_disabled_item.jsx'
@@ -1,5 +1,5 @@
1
1
  <% if object.collapsible %>
2
- <%= pb_rails("collapsible", props: { name: "collapsible-nav-example", classname: object.collapsible_nav_classname }) do %>
2
+ <%= pb_rails("collapsible", props: { name: "collapsible-nav-example", classname: object.collapsible_nav_classname + (object.disabled ? " collapsible_nav_wrapper_pb_nav_item_disabled" : "") }) do %>
3
3
  <%= pb_rails("collapsible/collapsible_main", props: { name: "default-collapsible-nav", icon: object.collapsible_icons, size: "xs", dark: object.dark, classname:object.margin_classes }) do %>
4
4
  <%= pb_content_tag( object.tag,
5
5
  href: object.link && object.link,
@@ -25,7 +25,7 @@ module Playbook
25
25
  default: "_self"
26
26
  def classname
27
27
  if collapsible
28
- "#{generate_classname('pb_nav_list_kit_item', active_class, highlighted_border_class)} #{generate_classname('pb_collapsible_nav_item', active_class, collapsible_trail_class)} #{font_size_class} #{font_weight_class} pb_nav_list_item_link_collapsible"
28
+ "#{generate_classname('pb_nav_list_kit_item', active_class, highlighted_border_class)} #{generate_classname('pb_collapsible_nav_item', active_class, collapsible_trail_class)} #{font_size_class} #{font_weight_class} pb_nav_list_item_link_collapsible#{disabled_class}"
29
29
  else
30
30
  "#{generate_classname('pb_nav_list_kit_item', active_class, highlighted_border_class)} #{font_size_class} #{font_weight_class} pb_nav_list_item_link#{disabled_class}"
31
31
  end
@@ -21,5 +21,6 @@ export type NavChildProps = {
21
21
  orientation?: "vertical" | "horizontal";
22
22
  variant?: "normal" | "subtle";
23
23
  itemSpacing?: SpacingObject
24
+ disabled?: boolean
24
25
  };
25
26
 
@@ -1,15 +1,16 @@
1
- <%= pb_content_tag(:div, id: nil ) do %>
1
+ <%= pb_content_tag(:div, id: nil) do %>
2
2
  <% if object.label.present? %>
3
- <label for="<%= object.input_options[:id] || object.id %>" >
4
- <% if object.required_indicator %>
5
- <%= pb_rails("caption", props: { dark: object.dark, classname: "pb_text_input_kit_label" }) do %>
6
- <%= object.label %><span style="color: #DA0014;"> *</span>
3
+ <label for="<%= object.input_options[:id] || object.id %>">
4
+ <% if object.required_indicator %>
5
+ <%= pb_rails("caption", props: { dark: object.dark, classname: "pb_text_input_kit_label" }) do %>
6
+ <%= object.label %><span style="color: #DA0014;"> *</span>
7
+ <% end %>
8
+ <% else %>
9
+ <%= pb_rails("caption", props: { text: object.label, dark: object.dark, classname: "pb_text_input_kit_label" }) %>
7
10
  <% end %>
8
- <% else %>
9
- <%= pb_rails("caption", props: { text: object.label, dark: object.dark, classname: "pb_text_input_kit_label" }) %>
10
- <% end %>
11
- </label>
11
+ </label>
12
12
  <% end %>
13
+
13
14
  <%= content_tag(:div, class: "#{add_on_class} text_input_wrapper") do %>
14
15
  <% if content.present? %>
15
16
  <%= content %>
@@ -26,4 +27,3 @@
26
27
  <%= pb_rails("body", props: {dark: object.dark, status: "negative", text: object.error, id: object.error_id, aria: { atomic: "true", live: "polite" }, html_options: { role: "alert" }}) if object.error %>
27
28
  <% end %>
28
29
  <% end %>
29
-
@@ -289,7 +289,35 @@ test('input display none shows number of selected items', () => {
289
289
 
290
290
  const kit = screen.getByTestId('input-display-none-test')
291
291
  const inputDisplayDiv = kit.querySelector(".pb_typeahead_selection_count")
292
- expect(inputDisplayDiv).toHaveTextContent("2 items selected")
292
+ expect(inputDisplayDiv).toHaveTextContent("2 items selected")
293
+ })
294
+
295
+ test('input display none keeps selected options visible in dropdown with selected styling', async () => {
296
+ render(
297
+ <Typeahead
298
+ data={{ testid: 'input-display-none-dropdown-test' }}
299
+ defaultValue={[options[0], options[1]]}
300
+ inputDisplay="none"
301
+ isMulti
302
+ options={options}
303
+ />
304
+ )
305
+
306
+ const kit = screen.getByTestId('input-display-none-dropdown-test')
307
+ const control = kit.querySelector('.typeahead-kit-select__control')
308
+ fireEvent.mouseDown(control)
309
+
310
+ await waitFor(() => {
311
+ const menu = kit.querySelector('.typeahead-kit-select__menu')
312
+ expect(menu).toBeInTheDocument()
313
+ })
314
+
315
+ // Selected options (Orange, Red) should remain in the dropdown and be marked as selected
316
+ const selectedOptions = kit.querySelectorAll('.typeahead-kit-select__option--is-selected')
317
+ expect(selectedOptions.length).toBe(2)
318
+ const labels = Array.from(selectedOptions).map((el) => el.textContent)
319
+ expect(labels).toContain('Orange')
320
+ expect(labels).toContain('Red')
293
321
  })
294
322
 
295
323
  test('typeahead with pills that use name instead of label', () => {