playbook_ui 14.13.0 → 14.14.0.pre.alpha.PBNTR890typeahead6390

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 (185) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +0 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +3 -0
  4. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +6 -5
  5. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +8 -1
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_custom_cell.jsx +75 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.html.erb +1 -1
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_rails.md +3 -1
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_react.md +1 -1
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +33 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header_rails.md +3 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -1
  14. data/app/pb_kits/playbook/pb_bar_graph/BarGraphStyles.scss +58 -0
  15. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.jsx +64 -0
  16. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_pb_styles.md +1 -0
  17. data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +1 -0
  18. data/app/pb_kits/playbook/pb_bar_graph/docs/index.js +1 -0
  19. data/app/pb_kits/playbook/pb_checkbox/_checkbox.tsx +17 -8
  20. data/app/pb_kits/playbook/pb_checkbox/checkbox.test.js +16 -0
  21. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.jsx +69 -0
  22. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_react_hook.md +1 -0
  23. data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +2 -1
  24. data/app/pb_kits/playbook/pb_checkbox/docs/index.js +1 -0
  25. data/app/pb_kits/playbook/pb_currency/_currency.tsx +46 -31
  26. data/app/pb_kits/playbook/pb_currency/currency.html.erb +15 -8
  27. data/app/pb_kits/playbook/pb_currency/currency.rb +17 -2
  28. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.html.erb +22 -0
  29. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display.jsx +34 -0
  30. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_rails.md +1 -0
  31. data/app/pb_kits/playbook/pb_currency/docs/_currency_null_display_react.md +1 -0
  32. data/app/pb_kits/playbook/pb_currency/docs/example.yml +2 -0
  33. data/app/pb_kits/playbook/pb_currency/docs/index.js +2 -1
  34. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +3 -1
  35. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table.html.erb +2 -2
  36. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table.md +4 -1
  37. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table_react.jsx +90 -0
  38. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table_react.md +5 -0
  39. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
  40. data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
  41. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableContainer.tsx +7 -4
  42. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +6 -3
  43. data/app/pb_kits/playbook/pb_drawer/_drawer.scss +32 -8
  44. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.html.erb +8 -0
  45. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_borders.html.erb +33 -0
  46. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.html.erb +0 -0
  47. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_default.html.erb +20 -1
  48. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.html.erb +24 -0
  49. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.html.erb +21 -0
  50. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_overlay.md +1 -0
  51. data/app/pb_kits/playbook/pb_drawer/docs/_drawer_sizes.html.erb +49 -0
  52. data/app/pb_kits/playbook/pb_drawer/docs/example.yml +5 -0
  53. data/app/pb_kits/playbook/pb_drawer/drawer.html.erb +20 -12
  54. data/app/pb_kits/playbook/pb_drawer/drawer.rb +49 -1
  55. data/app/pb_kits/playbook/pb_drawer/index.js +257 -0
  56. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  57. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +2 -1
  58. data/app/pb_kits/playbook/pb_icon_button/_icon_button.tsx +71 -0
  59. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.html.erb +1 -2
  60. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.jsx +17 -0
  61. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_sizes.html.erb +27 -0
  62. data/app/pb_kits/playbook/pb_icon_button/docs/_icon_button_sizes.jsx +61 -0
  63. data/app/pb_kits/playbook/pb_icon_button/docs/example.yml +5 -3
  64. data/app/pb_kits/playbook/pb_icon_button/docs/index.js +2 -0
  65. data/app/pb_kits/playbook/pb_icon_button/icon_button.html.erb +1 -1
  66. data/app/pb_kits/playbook/pb_icon_button/icon_button.rb +3 -0
  67. data/app/pb_kits/playbook/pb_icon_button/icon_button.test.jsx +39 -0
  68. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.html.erb +1 -6
  69. data/app/pb_kits/playbook/pb_nav/item.html.erb +7 -19
  70. data/app/pb_kits/playbook/pb_nav/nav.html.erb +3 -8
  71. data/app/pb_kits/playbook/pb_online_status/online_status.html.erb +1 -6
  72. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +4 -0
  73. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.html.erb +11 -0
  74. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +37 -0
  75. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.md +1 -0
  76. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional_react.md +1 -0
  77. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +2 -0
  78. data/app/pb_kits/playbook/pb_overlay/docs/index.js +1 -0
  79. data/app/pb_kits/playbook/pb_overlay/index.js +61 -0
  80. data/app/pb_kits/playbook/pb_overlay/overlay.html.erb +5 -3
  81. data/app/pb_kits/playbook/pb_overlay/overlay.rb +9 -0
  82. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +48 -10
  83. data/app/pb_kits/playbook/pb_popover/popover.html.erb +1 -6
  84. data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.scss +6 -1
  85. data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.tsx +7 -5
  86. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.html.erb +1 -0
  87. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.jsx +7 -0
  88. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_default.md +1 -0
  89. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width.html.erb +1 -0
  90. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width.jsx +18 -0
  91. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width_rails.md +1 -0
  92. data/app/pb_kits/playbook/pb_progress_pills/docs/_progress_pills_full_width_react.md +1 -0
  93. data/app/pb_kits/playbook/pb_progress_pills/docs/example.yml +2 -0
  94. data/app/pb_kits/playbook/pb_progress_pills/docs/index.js +1 -0
  95. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.html.erb +2 -7
  96. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.rb +6 -0
  97. data/app/pb_kits/playbook/pb_progress_pills/progress_pills.test.js +26 -1
  98. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.html.erb +1 -5
  99. data/app/pb_kits/playbook/pb_progress_step/progress_step.html.erb +1 -5
  100. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.html.erb +3 -7
  101. data/app/pb_kits/playbook/pb_radio/radio.html.erb +6 -11
  102. data/app/pb_kits/playbook/pb_select/index.js +38 -0
  103. data/app/pb_kits/playbook/pb_select/select.rb +8 -0
  104. data/app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.html.erb +47 -0
  105. data/app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.jsx +88 -0
  106. data/app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.md +1 -0
  107. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.jsx +1 -1
  108. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.html.erb +51 -0
  109. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click_rails.md +2 -0
  110. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.html.erb +96 -0
  111. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.jsx +101 -0
  112. data/app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.md +1 -0
  113. data/app/pb_kits/playbook/pb_table/docs/example.yml +5 -0
  114. data/app/pb_kits/playbook/pb_table/docs/index.js +3 -1
  115. data/app/pb_kits/playbook/pb_table/index.ts +41 -9
  116. data/app/pb_kits/playbook/pb_table/styles/_collapsible.scss +4 -0
  117. data/app/pb_kits/playbook/pb_table/subcomponents/_table_body.tsx +29 -2
  118. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +31 -3
  119. data/app/pb_kits/playbook/pb_table/table_body.html.erb +13 -7
  120. data/app/pb_kits/playbook/pb_table/table_body.rb +2 -0
  121. data/app/pb_kits/playbook/pb_table/table_row.html.erb +14 -7
  122. data/app/pb_kits/playbook/pb_table/table_row.rb +14 -1
  123. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_mask.html.erb +14 -0
  124. data/app/pb_kits/playbook/pb_text_input/index.js +9 -0
  125. data/app/pb_kits/playbook/pb_text_input/text_input.rb +5 -2
  126. data/app/pb_kits/playbook/pb_title/_title.scss +35 -0
  127. data/app/pb_kits/playbook/pb_title/_title.tsx +10 -1
  128. data/app/pb_kits/playbook/pb_title/docs/_title_default.html.erb +1 -2
  129. data/app/pb_kits/playbook/pb_title/docs/_title_default.jsx +1 -1
  130. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.html.erb +7 -0
  131. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.jsx +54 -0
  132. data/app/pb_kits/playbook/pb_title/docs/_title_display_size.md +1 -0
  133. data/app/pb_kits/playbook/pb_title/docs/example.yml +2 -0
  134. data/app/pb_kits/playbook/pb_title/docs/index.js +1 -0
  135. data/app/pb_kits/playbook/pb_title/title.rb +10 -1
  136. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +0 -3
  137. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.html.erb +39 -0
  138. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_delay_rails.md +3 -0
  139. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_interaction.html.erb +26 -0
  140. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +2 -0
  141. data/app/pb_kits/playbook/pb_tooltip/floating_ui.js +282 -0
  142. data/app/pb_kits/playbook/pb_tooltip/index.js +2 -2
  143. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +10 -2
  144. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +34 -1
  145. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.html.erb +45 -0
  146. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options.md +5 -0
  147. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.html.erb +33 -0
  148. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_dynamic_options_pure_rails.md +3 -0
  149. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +2 -0
  150. data/app/pb_kits/playbook/pb_typeahead/index.ts +61 -8
  151. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +13 -1
  152. data/dist/chunks/{_typeahead-btjo1UN5.js → _typeahead-DkFE6eZr.js} +4 -4
  153. data/dist/chunks/_weekday_stacked-BXq4AGmy.js +45 -0
  154. data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
  155. data/dist/chunks/{lib-DjpLC8uO.js → lib-Dmay5Z6U.js} +2 -2
  156. data/dist/chunks/{pb_form_validation-S56UaHZl.js → pb_form_validation-DdP7BnVX.js} +1 -1
  157. data/dist/chunks/vendor.js +1 -1
  158. data/dist/menu.yml +3 -10
  159. data/dist/playbook-doc.js +1 -1
  160. data/dist/playbook-rails-react-bindings.js +1 -1
  161. data/dist/playbook-rails.js +1 -1
  162. data/dist/playbook.css +1 -1
  163. data/lib/playbook/forms/builder/time_zone_select_field.rb +19 -0
  164. data/lib/playbook/forms/builder.rb +1 -0
  165. data/lib/playbook/version.rb +2 -2
  166. metadata +67 -24
  167. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.scss +0 -66
  168. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.tsx +0 -98
  169. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.html.erb +0 -28
  170. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.rb +0 -42
  171. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.html.erb +0 -19
  172. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.jsx +0 -26
  173. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.html.erb +0 -10
  174. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.jsx +0 -17
  175. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_on_click.jsx +0 -19
  176. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_onclick.html.erb +0 -16
  177. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.html.erb +0 -35
  178. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.jsx +0 -42
  179. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_tooltip.html.erb +0 -13
  180. data/app/pb_kits/playbook/pb_avatar_action_button/docs/example.yml +0 -15
  181. data/app/pb_kits/playbook/pb_avatar_action_button/docs/index.js +0 -4
  182. data/app/pb_kits/playbook/pb_avatar_action_button/pb_avatar_action_button.test.js +0 -31
  183. data/dist/chunks/_weekday_stacked-DeYS_l8v.js +0 -45
  184. data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
  185. /data/app/pb_kits/playbook/pb_table/docs/{_table_with_collapsible_with_custom_click.md → _table_with_collapsible_with_custom_click_react.md} +0 -0
@@ -2,6 +2,8 @@ examples:
2
2
 
3
3
  rails:
4
4
  - icon_button_default: Default
5
-
6
-
7
-
5
+ - icon_button_sizes: Sizes
6
+
7
+ react:
8
+ - icon_button_default: Default
9
+ - icon_button_sizes: Sizes
@@ -0,0 +1,2 @@
1
+ export { default as IconButtonDefault } from './_icon_button_default.jsx'
2
+ export { default as IconButtonSizes } from './_icon_button_sizes.jsx'
@@ -8,7 +8,7 @@
8
8
  <%= pb_rails("icon", props: { icon: object.icon,
9
9
  fixed_width: true,
10
10
  dark: object.dark,
11
- size: "2x",
11
+ size: object.size,
12
12
  color: "text_lt_default",
13
13
  classname: "icon_button_icon",
14
14
  padding_x: "xxs", padding_y: "xs" }) %>
@@ -14,6 +14,9 @@ module Playbook
14
14
  prop :variant, type: Playbook::Props::Enum,
15
15
  values: %w[default link],
16
16
  default: "default"
17
+ prop :size, type: Playbook::Props::Enum,
18
+ values: %w[1x 2x 3x 4x 5x 6x 7x 8x 9x 10x xs sm lg],
19
+ default: "2x"
17
20
  def classname
18
21
  generate_classname("pb_icon_button_kit", variant)
19
22
  end
@@ -0,0 +1,39 @@
1
+ import { ensureAccessible, renderKit } from '../utilities/test-utils'
2
+
3
+ import { IconButton } from 'playbook-ui'
4
+
5
+ const props = {
6
+ data: { testid: 'default', icon: 'plus' }
7
+ }
8
+
9
+ test('default test', () => {
10
+ const kit = renderKit(IconButton, props)
11
+
12
+ expect(kit).toBeInTheDocument()
13
+ expect(kit).toHaveClass('pb_icon_button_kit_default')
14
+
15
+ const iconElement = kit.querySelector('.icon_button_icon')
16
+ expect(iconElement).toBeInTheDocument()
17
+ })
18
+
19
+ it("should be accessible", async () => {
20
+ ensureAccessible(IconButton, props)
21
+ })
22
+
23
+ test('passes link variant prop', () => {
24
+ const kit = renderKit(IconButton, { ...props, variant: "link" })
25
+ expect(kit).toBeInTheDocument()
26
+ expect(kit).toHaveClass('pb_icon_button_kit_link')
27
+ })
28
+
29
+ test('should set button type to "submit" when htmlType prop is passed', () => {
30
+ const kit = renderKit(IconButton, { ...props, htmlType: 'submit' })
31
+ const buttonElement = kit.querySelector('button')
32
+ expect(buttonElement).toHaveAttribute('type', 'submit')
33
+ })
34
+
35
+ test('passes custom classname', () => {
36
+ const kit = renderKit(IconButton, { ...props, className: "extra_class" })
37
+ expect(kit).toBeInTheDocument()
38
+ expect(kit).toHaveClass('pb_icon_button_kit_default extra_class')
39
+ })
@@ -1,8 +1,3 @@
1
- <%= content_tag(:div,
2
- aria: object.aria,
3
- data: object.data,
4
- id: object.id,
5
- class: object.classname,
6
- **combined_html_options) do %>
1
+ <%= pb_content_tag do %>
7
2
  <%= react_component("MultiLevelSelect", object.multi_level_select_options) %>
8
3
  <% end %>
@@ -1,15 +1,9 @@
1
1
  <% if object.collapsible %>
2
2
  <%= pb_rails("collapsible", props: { name: "collapsible-nav-example", classname: object.collapsible_nav_classname }) 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
- <%= content_tag(object.tag,
5
- aria: object.aria,
6
- class: object.classname,
7
- data: object.data,
8
- dark: object.dark,
9
- id: object.id,
10
- href: object.link && object.link,
11
- target: object.link && object.target,
12
- **combined_html_options
4
+ <%= pb_content_tag( object.tag,
5
+ href: object.link && object.link,
6
+ target: object.link && object.target
13
7
  ) do %>
14
8
  <% if object.image_url %>
15
9
  <%= pb_rails("image", props: { url: object.image_url, classname: "pb_nav_img_wrapper_collapsible" }) %>
@@ -20,22 +14,16 @@
20
14
  <span class="pb_nav_list_item_text_collapsible">
21
15
  <%= object.text %>
22
16
  </span>
23
- <% end %>
17
+ <% end %>
24
18
  <% end %>
25
19
  <%= pb_rails("collapsible/collapsible_content", props: {collapsed: object.collapsed}) do %>
26
20
  <%= content.presence %>
27
21
  <% end %>
28
22
  <% end %>
29
23
  <% else %>
30
- <%= content_tag(object.tag,
31
- aria: object.aria,
32
- class: object.classname,
33
- **combined_html_options,
34
- data: object.data,
35
- dark: object.dark,
36
- id: object.id,
37
- href: object.link && object.link,
38
- target: object.link && object.target
24
+ <%= pb_content_tag( object.tag,
25
+ href: object.link && object.link,
26
+ target: object.link && object.target
39
27
  ) do %>
40
28
  <% if object.image_url %>
41
29
  <%= pb_rails("image", props: { url: object.image_url, classname: "pb_nav_img_wrapper" }) %>
@@ -1,12 +1,7 @@
1
- <%= content_tag(:nav,
2
- aria: object.aria,
3
- class: object.classname,
4
- data: object.data,
5
- id: object.id,
6
- **combined_html_options) do %>
1
+ <%= pb_content_tag(:nav) do %>
7
2
  <% if object.title %>
8
- <%= content_tag(:div, class: "pb_nav_list_title") do %>
9
- <%= content_tag(:a, class: "pb_nav_list_item_link_text", href: object.link) do %>
3
+ <%= pb_content_tag do %>
4
+ <%= pb_content_tag(:a) do %>
10
5
  <%= pb_rails("caption", props: { text: object.title, dark: dark }) %>
11
6
  <% end %>
12
7
  <% end %>
@@ -1,7 +1,2 @@
1
- <%= content_tag(:div,
2
- aria: object.aria.merge!(label: object.status),
3
- class: object.classname,
4
- data: object.data,
5
- id: object.id,
6
- **combined_html_options) do %>
1
+ <%= pb_content_tag do %>
7
2
  <% end %>
@@ -8,6 +8,7 @@ import OverlayToken from './subcomponents/_overlay_token'
8
8
  export type OverlayChildrenProps = {
9
9
  children: React.ReactNode[] | React.ReactNode,
10
10
  color: "card_light" | "bg_light" | "card_dark" | "bg_dark",
11
+ dynamic?: boolean,
11
12
  position: string,
12
13
  size: string,
13
14
  }
@@ -18,6 +19,7 @@ type OverlayProps = {
18
19
  children: React.ReactNode[] | React.ReactNode,
19
20
  color: "card_light" | "bg_light" | "card_dark" | "bg_dark",
20
21
  data?: { [key: string]: string },
22
+ dynamic?: false,
21
23
  htmlOptions?: { [key: string]: string | number | boolean | (() => void) },
22
24
  id?: string,
23
25
  layout: { [key: string]: string },
@@ -30,6 +32,7 @@ const Overlay = (props: OverlayProps) => {
30
32
  children,
31
33
  color = "card_light",
32
34
  data = {},
35
+ dynamic = false,
33
36
  htmlOptions = {},
34
37
  id,
35
38
  layout = { "bottom": "full" },
@@ -69,6 +72,7 @@ const Overlay = (props: OverlayProps) => {
69
72
  }) : OverlayToken({
70
73
  children,
71
74
  color,
75
+ dynamic: dynamic,
72
76
  position: getPosition(),
73
77
  size: getSize()
74
78
  })
@@ -0,0 +1,11 @@
1
+ <%= pb_rails("overlay", props: { layout: { "x": "xl" }, color: "card_light", dynamic: true }) do %>
2
+ <%= pb_rails("flex", props: { column_gap: "lg", orientation: "row", overflow_x: "auto" }) do %>
3
+ <% 15.times do %>
4
+ <%= pb_rails("flex/flex_item") do %>
5
+ <%= pb_rails("card") do %>
6
+ Card content
7
+ <% end %>
8
+ <% end %>
9
+ <% end %>
10
+ <% end %>
11
+ <% end %>
@@ -0,0 +1,37 @@
1
+ import React, { forwardRef } from 'react'
2
+ import {
3
+ Overlay,
4
+ Card,
5
+ Flex,
6
+ FlexItem,
7
+ } from 'playbook-ui'
8
+
9
+ const InlineCardsExample = forwardRef(function InlineCardsExample(ref) {
10
+ return (
11
+ <Flex
12
+ columnGap="lg"
13
+ orientation="row"
14
+ ref={ref}
15
+ >
16
+ {Array.from({ length: 15 }, (_, index) => (
17
+ <FlexItem key={index}>
18
+ <Card>{"Card Content"}</Card>
19
+ </FlexItem>
20
+ ))}
21
+ </Flex>
22
+ )
23
+ })
24
+
25
+ const OverlayVerticalDynamicMultiDirectional = () => (
26
+ <>
27
+ <Overlay
28
+ color="card_light"
29
+ dynamic
30
+ layout={{"x": "xl"}}
31
+ >
32
+ <InlineCardsExample />
33
+ </Overlay>
34
+ </>
35
+ )
36
+
37
+ export default OverlayVerticalDynamicMultiDirectional
@@ -0,0 +1 @@
1
+ Pass the `dynamic` prop to make the overlay render while the scrollbar isn't at either end on the scrollbar.
@@ -0,0 +1 @@
1
+ Pass the `dynamic` prop to make the overlay render while the scrollbar isn't at either end on the scrollbar. You must also add a `ref` to the child that's being passed through the Overlay.
@@ -2,9 +2,11 @@ examples:
2
2
  react:
3
3
  - overlay_default: Default
4
4
  - overlay_multi_directional: Multi-directional
5
+ - overlay_vertical_dynamic_multi_directional: Vertical Dynamic Multi-directional
5
6
  - overlay_toggle: Toggle
6
7
 
7
8
  rails:
8
9
  - overlay_default: Default
9
10
  - overlay_multi_directional: Multi-directional
11
+ - overlay_vertical_dynamic_multi_directional: Vertical Dynamic Multi-directional
10
12
  - overlay_toggle: Toggle
@@ -1,3 +1,4 @@
1
1
  export { default as OverlayDefault } from './_overlay_default.jsx'
2
2
  export { default as OverlayMultiDirectional } from './_overlay_multi_directional.jsx'
3
3
  export { default as OverlayToggle } from './_overlay_toggle.jsx'
4
+ export { default as OverlayVerticalDynamicMultiDirectional } from './_overlay_vertical_dynamic_multi_directional.jsx'
@@ -0,0 +1,61 @@
1
+ import PbEnhancedElement from '../pb_enhanced_element'
2
+
3
+ const OVERLAY_SELECTOR = '[data-pb-overlay]'
4
+ const OVERLAY_SCROLL_ELEMENT = '[data-overlay-scroll-element]'
5
+ const PREVIOUS_OVERLAY_CLASSNAME = '[data-previous-overlay-classname]'
6
+ const SUBSEQUENT_OVERLAY_CLASSNAME = '[data-subsequent-overlay-classname]'
7
+
8
+ export default class PbOverlay extends PbEnhancedElement {
9
+ static get selector() {
10
+ return OVERLAY_SELECTOR
11
+ }
12
+
13
+ get target() {
14
+ return this.element.querySelector(OVERLAY_SCROLL_ELEMENT).children[0]
15
+ }
16
+
17
+ connect() {
18
+ this.handleOverlayDynamic()
19
+ }
20
+
21
+ handleOverlayDynamic() {
22
+ const isOverlayDynamic = this.element.dataset?.overlayDynamic
23
+
24
+ if (isOverlayDynamic) {
25
+ const previousOverlayElement = this.element.querySelector(PREVIOUS_OVERLAY_CLASSNAME)
26
+ const previousOverlayClassname = previousOverlayElement?.dataset?.previousOverlayClassname
27
+ const subsequentOverlayElement = this.element.querySelector(SUBSEQUENT_OVERLAY_CLASSNAME)
28
+ const subsequentOverlayClassname = subsequentOverlayElement?.dataset?.subsequentOverlayClassname
29
+
30
+ const handleScrollChange = (target) => {
31
+ const { scrollLeft, scrollWidth, clientWidth } = target
32
+ const isScrollAtStart = scrollLeft === 0
33
+ const isScrollAtEnd = scrollLeft + clientWidth >= scrollWidth - 1
34
+
35
+ if (isScrollAtStart) {
36
+ previousOverlayElement.classList.remove(previousOverlayClassname)
37
+ } else {
38
+ previousOverlayElement.classList.add(previousOverlayClassname)
39
+ }
40
+
41
+ if (isScrollAtEnd) {
42
+ subsequentOverlayElement.classList.remove(subsequentOverlayClassname)
43
+ } else {
44
+ subsequentOverlayElement.classList.add(subsequentOverlayClassname)
45
+ }
46
+ }
47
+
48
+ this.target.addEventListener('scroll', (event) => {
49
+ handleScrollChange(event.target)
50
+ })
51
+
52
+ handleScrollChange(this.target)
53
+ }
54
+ }
55
+
56
+ disconnect() {
57
+ if (this.element.dataset?.overlayDynamic) {
58
+ this.target.removeEventListener('scroll')
59
+ }
60
+ }
61
+ }
@@ -16,12 +16,14 @@ id: object.id,
16
16
  <% end %>
17
17
 
18
18
  <% else %>
19
- <div class="<%= previous_overlay_class_name %>"></div>
19
+ <div class="<%= previous_overlay_class_name %>" data-previous-overlay-classname="<%= previous_overlay_class_name %>"></div>
20
20
 
21
- <%= content.presence %>
21
+ <div data-overlay-scroll-element="true">
22
+ <%= content.presence %>
23
+ </div>
22
24
 
23
25
  <% if has_subsequent_overlay %>
24
- <div class="<%= subsequent_overlay_class_name %>"></div>
26
+ <div class="<%= subsequent_overlay_class_name %>" data-subsequent-overlay-classname="<%= subsequent_overlay_class_name %>"></div>
25
27
  <% end %>
26
28
  <% end %>
27
29
  <% end %>
@@ -8,6 +8,8 @@ module Playbook
8
8
  default: "card_light"
9
9
  prop :layout, type: Playbook::Props::HashProp,
10
10
  default: { "bottom": "full" }
11
+ prop :dynamic, type: Playbook::Props::Boolean,
12
+ default: false
11
13
 
12
14
  def classname
13
15
  generate_classname("pb_overlay")
@@ -105,6 +107,13 @@ module Playbook
105
107
  "bg_dark": "#0a0527",
106
108
  }
107
109
  end
110
+
111
+ def data_attributes
112
+ data ||= {}
113
+ data.merge!("data-pb-overlay" => true)
114
+ data.merge!("data-overlay-dynamic" => true) if dynamic
115
+ data
116
+ end
108
117
  end
109
118
  end
110
119
  end
@@ -1,5 +1,5 @@
1
- import React from 'react'
2
- import { OverlayChildrenProps } from '../_overlay'
1
+ import React, { useRef, useEffect, useState } from 'react';
2
+ import { OverlayChildrenProps } from '../_overlay';
3
3
 
4
4
  const previousOverlayDirectionMap: { [key: string]: string } = {
5
5
  "x": "left",
@@ -15,11 +15,40 @@ const OverlayToken = (props: OverlayChildrenProps) => {
15
15
  const {
16
16
  children,
17
17
  color,
18
+ dynamic,
18
19
  position,
19
20
  size,
20
21
  } = props
21
22
 
22
- const hasSubsequentOverlay = position === "x" || position === "y"
23
+ const scrollContainerRef = useRef<HTMLDivElement>(null);
24
+ const [isAtStart, setIsAtStart] = useState(true);
25
+ const [isAtEnd, setIsAtEnd] = useState(false);
26
+
27
+
28
+ const handleScroll = () => {
29
+ const container = scrollContainerRef.current;
30
+ if (container) {
31
+ const { scrollLeft, scrollWidth, clientWidth } = container;
32
+ const atStart = scrollLeft === 0;
33
+ const atEnd = scrollLeft + clientWidth >= scrollWidth - 1;
34
+
35
+ setIsAtStart(atStart);
36
+ setIsAtEnd(atEnd);
37
+ }
38
+ };
39
+
40
+ useEffect(() => {
41
+ const container = scrollContainerRef.current;
42
+ if (container) {
43
+ container.addEventListener('scroll', handleScroll);
44
+ handleScroll();
45
+ return () => {
46
+ container.removeEventListener('scroll', handleScroll);
47
+ };
48
+ }
49
+ }, []);
50
+
51
+ const hasSubsequentOverlay = position === "x" || position === "y";
23
52
 
24
53
  const getPreviousOverlayDirection = () => {
25
54
  return hasSubsequentOverlay ? previousOverlayDirectionMap[position] : position
@@ -34,15 +63,24 @@ const OverlayToken = (props: OverlayChildrenProps) => {
34
63
 
35
64
  return (
36
65
  <>
37
- <div className={previousOverlayClassName} />
38
-
39
- {children}
40
-
41
- { hasSubsequentOverlay &&
42
- <div className={subsequentOverlayClassName} />
66
+ <div className={dynamic ? isAtStart ? '' : previousOverlayClassName : previousOverlayClassName} />
67
+ {dynamic ?
68
+ <div
69
+ ref={scrollContainerRef}
70
+ style={{
71
+ overflowX: 'auto',
72
+ }}
73
+ >
74
+ {children}
75
+ </div>
76
+ :
77
+ children
78
+ }
79
+ {hasSubsequentOverlay &&
80
+ <div className={dynamic ? isAtEnd ? '' : subsequentOverlayClassName : subsequentOverlayClassName} />
43
81
  }
44
82
  </>
45
83
  )
46
84
  }
47
85
 
48
- export default OverlayToken
86
+ export default OverlayToken;
@@ -1,9 +1,4 @@
1
- <%= content_tag(:div,
2
- aria: object.aria,
3
- class: object.classname,
4
- data: object.data,
5
- id: object.id,
6
- **combined_html_options) do %>
1
+ <%= pb_content_tag do %>
7
2
  <div class="pb_popover_tooltip hide" id="<%= object.tooltip_id %>" role="tooltip" style="<%= object.z_index_helper %>">
8
3
  <div class="pb_popover_body <%= object.width_height_class_helper %> <%= object.popover_spacing_helper %>" style="<%= object.width_height_helper %>">
9
4
  <%= content.presence %>
@@ -3,7 +3,8 @@
3
3
  @import "../tokens/border_radius";
4
4
 
5
5
  @mixin pb_progress_pill {
6
- width: 45px;
6
+ width: 100%;
7
+ max-width: 45px;
7
8
  height: 4px;
8
9
  border-radius: $border_rad_light;
9
10
  margin-right: $space_xs;
@@ -27,6 +28,10 @@
27
28
  [class*=pb_progress_pill] {
28
29
  @include pb_progress_pill;
29
30
 
31
+ &.full_width_pill {
32
+ max-width: none;
33
+ }
34
+
30
35
  &[class*=_inactive] {
31
36
  background-color: $border_light;
32
37
  &.dark {
@@ -13,6 +13,7 @@ type ProgressPillsProps = {
13
13
  className?: string,
14
14
  data?: { [key: string]: string },
15
15
  dark?: boolean,
16
+ fullWidthPill?: boolean,
16
17
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
17
18
  id?: string,
18
19
  steps?: number,
@@ -20,19 +21,19 @@ type ProgressPillsProps = {
20
21
  value?: string,
21
22
  }
22
23
 
23
- const ProgressPill = ({ active, dark, steps: step }: ProgressPillsProps) => (
24
+ const ProgressPill = ({ active, dark, steps: step, fullWidthPill }: ProgressPillsProps) => (
24
25
  <div
25
26
  className={`pb_progress_pill${step <= active ? '_active' : '_inactive'}${dark ? ' dark' : ''
26
- }`}
27
+ }${fullWidthPill ? ' full_width_pill' : ''}`}
27
28
  key={step}
28
29
  />
29
30
  )
30
31
 
31
- const showSteps = (steps: number, active: number, dark: boolean) => {
32
+ const showSteps = (steps: number, active: number, dark: boolean, fullWidthPill: boolean) => {
32
33
  const items = []
33
34
 
34
35
  for (let step = 1; step <= steps; step++) {
35
- items.push(ProgressPill({ steps: step, active, dark }))
36
+ items.push(ProgressPill({ steps: step, active, dark, fullWidthPill }))
36
37
  }
37
38
 
38
39
  return items
@@ -44,6 +45,7 @@ const ProgressPills = (props: ProgressPillsProps) => {
44
45
  aria = { hidden: 'true' },
45
46
  className,
46
47
  data = {},
48
+ fullWidthPill = false,
47
49
  htmlOptions = {},
48
50
  id,
49
51
  steps = 3,
@@ -79,7 +81,7 @@ const ProgressPills = (props: ProgressPillsProps) => {
79
81
  text={value}
80
82
  />
81
83
  </div>}
82
- <div className="progress_pills">{showSteps(steps, active, dark)}</div>
84
+ <div className="progress_pills">{showSteps(steps, active, dark, fullWidthPill)}</div>
83
85
  </div>
84
86
  )
85
87
  }
@@ -1 +1,2 @@
1
1
  <%= pb_rails("progress_pills", props: { aria: { label: "2 out of 3 steps complete" }, steps: 3, active: 2 }) %>
2
+ <%= pb_rails("progress_pills", props: { aria: { label: "9 out of 18 steps complete" }, steps: 18, active: 9, margin_top: "md" }) %>
@@ -10,6 +10,13 @@ const ProgressPillsDefault = (props) => {
10
10
  steps={3}
11
11
  {...props}
12
12
  />
13
+ <ProgressPills
14
+ active={9}
15
+ aria={{ label: '9 out of 18 steps complete' }}
16
+ marginTop="md"
17
+ steps={18}
18
+ {...props}
19
+ />
13
20
  </>
14
21
  )
15
22
  }
@@ -0,0 +1 @@
1
+ Progress pills start at `45px` wide if the container allows, but will shrink down to `1px` as the container gets smaller. Resize this window to see each pill shrink.
@@ -0,0 +1 @@
1
+ <%= pb_rails("progress_pills", props: { aria: { label: "2 out of 5 steps complete" }, steps: 5, active: 2, full_width_pill: true }) %>
@@ -0,0 +1,18 @@
1
+ import React from 'react'
2
+ import ProgressPills from '../_progress_pills'
3
+
4
+ const ProgressPillsFullWidth = (props) => {
5
+ return (
6
+ <>
7
+ <ProgressPills
8
+ active={2}
9
+ aria={{ label: '2 out of 5 steps complete' }}
10
+ fullWidthPill
11
+ steps={5}
12
+ {...props}
13
+ />
14
+ </>
15
+ )
16
+ }
17
+
18
+ export default ProgressPillsFullWidth
@@ -0,0 +1 @@
1
+ Pass `full_width_pill: true` to the Progress Pill kit to get true 100% full width pills. The kit will take up the full width of the container that it is in.
@@ -0,0 +1 @@
1
+ Pass `fullWidthPill` to the Progress Pill kit to get true 100% full width pills. The kit will take up the full width of the container that it is in.
@@ -3,9 +3,11 @@ examples:
3
3
  rails:
4
4
  - progress_pills_default: Default
5
5
  - progress_pills_status: Status
6
+ - progress_pills_full_width: Full Container Width
6
7
 
7
8
 
8
9
 
9
10
  react:
10
11
  - progress_pills_default: Default
11
12
  - progress_pills_status: Status
13
+ - progress_pills_full_width: Full Container Width
@@ -1,2 +1,3 @@
1
1
  export { default as ProgressPillsDefault } from './_progress_pills_default.jsx'
2
2
  export { default as ProgressPillsStatus } from './_progress_pills_status.jsx'
3
+ export { default as ProgressPillsFullWidth } from './_progress_pills_full_width.jsx'
@@ -1,9 +1,4 @@
1
- <%= content_tag(:div,
2
- aria: object.aria_attributes,
3
- id: object.id,
4
- data: object.data,
5
- class: object.classname,
6
- **combined_html_options) do %>
1
+ <%= pb_content_tag do %>
7
2
 
8
3
  <div class="progress_pills_status">
9
4
  <% object.with_status do |status| %>
@@ -14,7 +9,7 @@
14
9
 
15
10
  <div class="progress_pills">
16
11
  <% object.each_step do |step| %>
17
- <span class="pb_progress_pill<%= object.active_step(step) %><%= object.dark_pill %>"></span>
12
+ <span class="pb_progress_pill<%= object.active_step(step) %><%= object.make_full_width %><%= object.dark_pill %>"></span>
18
13
  <% end %>
19
14
  </div>
20
15
 
@@ -9,6 +9,8 @@ module Playbook
9
9
  prop :steps, type: Playbook::Props::Number,
10
10
  default: 3
11
11
  prop :title
12
+ prop :full_width_pill, type: Playbook::Props::Boolean,
13
+ default: false
12
14
 
13
15
  def classname
14
16
  generate_classname("pb_progress_pills_kit")
@@ -26,6 +28,10 @@ module Playbook
26
28
  step <= active ? "_active" : "_inactive"
27
29
  end
28
30
 
31
+ def make_full_width
32
+ full_width_pill ? " full_width_pill" : nil
33
+ end
34
+
29
35
  def aria_attributes
30
36
  return aria if aria.present?
31
37