playbook_ui 14.18.1.pre.rc.0 → 14.19.0.pre.alpha.PLAY1973formpillinternalsizing7728

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 (155) 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/Components/RegularTableView.tsx +11 -1
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +148 -15
  5. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +20 -3
  6. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +23 -13
  7. data/app/pb_kits/playbook/pb_advanced_table/Utilities/VisibilityTree.ts +47 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +313 -21
  9. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +12 -3
  10. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +6 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +0 -6
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.jsx +80 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color.md +3 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb +58 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.md +3 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.jsx +57 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.md +4 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.jsx +62 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.md +1 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.jsx +82 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.md +1 -0
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.jsx +65 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +1 -0
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +5 -1
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.jsx → _advanced_table_selectable_rows_no_subrows_react.jsx} +2 -2
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +3 -2
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +10 -5
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +7 -2
  29. data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +106 -0
  30. data/app/pb_kits/playbook/pb_advanced_table/index.js +228 -11
  31. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +1 -0
  32. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +9 -1
  33. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -3
  34. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -2
  35. data/app/pb_kits/playbook/pb_avatar/_avatar.scss +4 -0
  36. data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -0
  37. data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +3 -3
  38. data/app/pb_kits/playbook/pb_avatar/avatar.rb +2 -0
  39. data/app/pb_kits/playbook/pb_avatar/avatar.test.js +18 -0
  40. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.html.erb +5 -0
  41. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.jsx +16 -0
  42. data/app/pb_kits/playbook/pb_avatar/docs/example.yml +2 -0
  43. data/app/pb_kits/playbook/pb_avatar/docs/index.js +1 -0
  44. data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
  45. data/app/pb_kits/playbook/pb_card/card.rb +12 -0
  46. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +2 -2
  47. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +22 -1
  48. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line.html.erb +55 -0
  49. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line_rails.md +5 -0
  50. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_rails.md +5 -0
  51. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.jsx +59 -0
  52. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners_react.md +1 -0
  53. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
  54. data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
  55. data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +11 -1
  56. data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +11 -1
  57. data/app/pb_kits/playbook/pb_draggable/index.js +4 -2
  58. data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +33 -5
  59. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +5 -0
  60. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +5 -16
  61. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
  62. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
  63. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
  64. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
  65. data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
  66. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
  67. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
  68. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
  69. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
  70. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
  71. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
  72. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +7 -4
  73. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +2 -2
  74. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -2
  75. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +4 -0
  76. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +45 -1
  77. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
  78. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
  79. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +12 -2
  80. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +3 -1
  81. data/app/pb_kits/playbook/pb_dropdown/index.js +57 -0
  82. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +26 -0
  83. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +3 -4
  84. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +4 -4
  85. data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +8 -1
  86. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_alignment.html.erb +27 -0
  87. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_default.html.erb +7 -0
  88. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_orientation.html.erb +12 -0
  89. data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_size.html.erb +23 -0
  90. data/app/pb_kits/playbook/pb_empty_state/docs/example.yml +5 -1
  91. data/app/pb_kits/playbook/pb_empty_state/empty_state.html.erb +19 -0
  92. data/app/pb_kits/playbook/pb_empty_state/empty_state.rb +123 -0
  93. data/app/pb_kits/playbook/pb_file_upload/_file_upload.scss +13 -0
  94. data/app/pb_kits/playbook/pb_file_upload/_file_upload.tsx +11 -1
  95. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.html.erb +1 -0
  96. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.jsx +41 -0
  97. data/app/pb_kits/playbook/pb_file_upload/docs/example.yml +2 -0
  98. data/app/pb_kits/playbook/pb_file_upload/docs/index.js +1 -0
  99. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -0
  100. data/app/pb_kits/playbook/pb_file_upload/file_upload.rb +7 -1
  101. data/app/pb_kits/playbook/pb_file_upload/fileupload.test.js +18 -0
  102. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +19 -12
  103. data/app/pb_kits/playbook/pb_message/_message.tsx +3 -0
  104. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.html.erb +9 -0
  105. data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.jsx +21 -0
  106. data/app/pb_kits/playbook/pb_message/docs/example.yml +2 -0
  107. data/app/pb_kits/playbook/pb_message/docs/index.js +1 -0
  108. data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
  109. data/app/pb_kits/playbook/pb_message/message.rb +1 -0
  110. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +2 -1
  111. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +1 -1
  112. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +5 -4
  113. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +9 -9
  114. data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +2 -2
  115. data/app/pb_kits/playbook/pb_select/_select.scss +10 -0
  116. data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
  117. data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +7 -7
  118. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +5 -5
  119. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +4 -2
  120. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
  121. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
  122. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
  123. data/app/pb_kits/playbook/pb_user/_user.tsx +3 -0
  124. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.html.erb +6 -0
  125. data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.jsx +16 -0
  126. data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
  127. data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
  128. data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
  129. data/app/pb_kits/playbook/pb_user/user.rb +1 -0
  130. data/dist/chunks/{_typeahead-D8CsVBZO.js → _typeahead-BPSIWtFT.js} +3 -3
  131. data/dist/chunks/_weekday_stacked-PfWrqC3z.js +45 -0
  132. data/dist/chunks/{lib-BmTAc7Nc.js → lib-B20MXZcW.js} +2 -2
  133. data/dist/chunks/{pb_form_validation-BWjy4bFn.js → pb_form_validation-WWvUXPKD.js} +1 -1
  134. data/dist/chunks/vendor.js +1 -1
  135. data/dist/menu.yml +6 -14
  136. data/dist/playbook-doc.js +2 -2
  137. data/dist/playbook-rails-react-bindings.js +1 -1
  138. data/dist/playbook-rails.js +1 -1
  139. data/dist/playbook.css +1 -1
  140. data/lib/playbook/version.rb +2 -2
  141. metadata +54 -21
  142. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
  143. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
  144. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.scss +0 -3
  145. data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.tsx +0 -72
  146. data/app/pb_kits/playbook/pb_gantt_chart/docs/_gantt_chart_default.jsx +0 -53
  147. data/app/pb_kits/playbook/pb_gantt_chart/docs/example.yml +0 -7
  148. data/app/pb_kits/playbook/pb_gantt_chart/docs/index.js +0 -1
  149. data/app/pb_kits/playbook/pb_gantt_chart/gantt_chart.test.jsx +0 -19
  150. data/dist/chunks/_weekday_stacked-CHQsoCdP.js +0 -45
  151. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_react.md → _advanced_table_selectable_rows.md} +0 -0
  152. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.html.erb → _advanced_table_selectable_rows_no_subrows_rails.html.erb} +0 -0
  153. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.html.erb → _advanced_table_selectable_rows_rails.html.erb} +0 -0
  154. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_line.md → _draggable_drop_zones_line_react.md} +0 -0
  155. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_event_listeners.md → _draggable_event_listeners_rails.md} +0 -0
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbEmptyState
5
+ class EmptyState < Playbook::KitBase
6
+ prop :alignment, type: Playbook::Props::Enum,
7
+ values: %w[center left right],
8
+ default: "center"
9
+ prop :description
10
+ prop :header
11
+ prop :image
12
+ prop :link_button
13
+ prop :link_button_url
14
+ prop :orientation, type: Playbook::Props::Enum,
15
+ values: %w[horizontal vertical],
16
+ default: "vertical"
17
+ prop :primary_button
18
+ prop :primary_button_url
19
+ prop :size, type: Playbook::Props::Enum,
20
+ values: %w[sm md lg],
21
+ default: "md"
22
+
23
+ SIZE_CONFIGS = {
24
+ sm: {
25
+ vertical: {
26
+ image_width: "100px",
27
+ title_size: 4,
28
+ title_padding: "xxs",
29
+ description_pad: "sm",
30
+ button_size: "sm",
31
+ button_margin: "xs",
32
+ scss_class: "sm-state-vertical",
33
+ flex_direction: "column",
34
+ },
35
+ horizontal: {
36
+ image_width: "100px",
37
+ title_size: 4,
38
+ title_padding: "xxs",
39
+ description_pad: "sm",
40
+ button_size: "sm",
41
+ button_margin: "xs",
42
+ scss_class: "sm-state-horizontal",
43
+ flex_direction: "row",
44
+ },
45
+ },
46
+ md: {
47
+ vertical: {
48
+ image_width: "140px",
49
+ title_size: 3,
50
+ title_padding: "xs",
51
+ description_pad: "md",
52
+ button_size: "md",
53
+ button_margin: "sm",
54
+ scss_class: "md-state-vertical",
55
+ flex_direction: "column",
56
+ },
57
+ horizontal: {
58
+ image_width: "140px",
59
+ title_size: 3,
60
+ title_padding: "xs",
61
+ description_pad: "md",
62
+ button_size: "md",
63
+ button_margin: "sm",
64
+ scss_class: "md-state-horizontal",
65
+ flex_direction: "row",
66
+ },
67
+ },
68
+ lg: {
69
+ vertical: {
70
+ image_width: "100%",
71
+ title_size: 1,
72
+ title_padding: "sm",
73
+ description_pad: "lg",
74
+ button_size: "md",
75
+ button_margin: "md",
76
+ scss_class: "lg-state-vertical",
77
+ flex_direction: "column",
78
+ },
79
+ horizontal: {
80
+ image_width: "100%",
81
+ title_size: 2,
82
+ title_padding: "sm",
83
+ description_pad: "lg",
84
+ button_size: "md",
85
+ button_margin: "md",
86
+ scss_class: "lg-state-horizontal",
87
+ flex_direction: "row",
88
+ },
89
+ },
90
+ }.freeze
91
+
92
+ def classname
93
+ generate_classname("pb_empty_state_kit")
94
+ end
95
+
96
+ def config
97
+ SIZE_CONFIGS[size.to_sym][orientation.to_sym]
98
+ end
99
+
100
+ def default_image_data_uri
101
+ svg_path = __dir__.then { |d| File.join(d, "docs", "default_image", "computer_fly_no_branding.svg") }
102
+ svg = File.read(svg_path)
103
+ encoded = ERB::Util.url_encode(svg)
104
+ "data:image/svg+xml,#{encoded}"
105
+ end
106
+
107
+ def padding_size
108
+ size == "sm" ? "xs" : "xl"
109
+ end
110
+
111
+ def flex_align
112
+ case alignment
113
+ when "left"
114
+ "start"
115
+ when "right"
116
+ "end"
117
+ else
118
+ "center"
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -9,10 +9,23 @@
9
9
  border: none;
10
10
  width: 0;
11
11
  }
12
+ &.error {
13
+ [class^='pb_card_kit'] {
14
+ border-color: $error;
15
+ }
16
+ [class^='pb_body_kit'][status="negative"] {
17
+ margin-top: $space_xs;
18
+ }
19
+ }
12
20
  }
13
21
 
14
22
  .dark [class*='pb_file_upload_kit'] {
15
23
  [class*='pb_card_kit'] {
16
24
  border: 1px $text_dk_lighter dashed;
17
25
  }
26
+ &.error {
27
+ [class^='pb_card_kit'] {
28
+ border-color: $error_dark;
29
+ }
30
+ }
18
31
  }
@@ -22,6 +22,7 @@ type FileUploadProps = {
22
22
  maxSize?: number,
23
23
  onFilesAccepted: Callback<File, File>,
24
24
  onFilesRejected: (error: string, files: readonly FileRejection[]) => void,
25
+ error?: string,
25
26
  }
26
27
 
27
28
  const getFormattedFileSize = (fileSize: number): string => {
@@ -36,6 +37,7 @@ const FileUpload = (props: FileUploadProps): React.ReactElement => {
36
37
  customMessage,
37
38
  dark = false,
38
39
  data = {},
40
+ error,
39
41
  htmlOptions = {},
40
42
  maxSize,
41
43
  onFilesAccepted = noop,
@@ -100,7 +102,7 @@ const FileUpload = (props: FileUploadProps): React.ReactElement => {
100
102
 
101
103
  return (
102
104
  <div
103
- className={classnames(buildCss('pb_file_upload_kit'), globalProps(props), className)}
105
+ className={classnames(buildCss('pb_file_upload_kit'), { 'error': error }, globalProps(props), className)}
104
106
  {...dataProps}
105
107
  {...htmlProps}
106
108
  {...getRootProps()}
@@ -118,6 +120,14 @@ const FileUpload = (props: FileUploadProps): React.ReactElement => {
118
120
  }
119
121
  </Body>
120
122
  </Card>
123
+ {error && (
124
+ <Body
125
+ dark={dark}
126
+ marginTop="xxs"
127
+ status="negative"
128
+ text={error}
129
+ />
130
+ )}
121
131
  </div>
122
132
  )
123
133
  }
@@ -0,0 +1 @@
1
+ <%= pb_rails("file_upload", props: {id: "error", error: raw(pb_rails("icon", props: { icon: "warning" }) + " Please upload a valid file")}) %>
@@ -0,0 +1,41 @@
1
+ import React, { useState } from 'react'
2
+ import FileUpload from '../_file_upload'
3
+ import List from '../../pb_list/_list'
4
+ import ListItem from '../../pb_list/_list_item'
5
+ import Icon from '../../pb_icon/_icon'
6
+
7
+ const AcceptedFilesList = ({ files }) => (
8
+ <List>
9
+ {files.map((file) => (
10
+ <ListItem key={file.name}>{file.name}</ListItem>
11
+ ))}
12
+ </List>
13
+ )
14
+
15
+ const FileUploadError = (props) => {
16
+ const [filesToUpload, setFilesToUpload] = useState([])
17
+
18
+ const handleOnFilesAccepted = (files) => {
19
+ setFilesToUpload([...filesToUpload, ...files])
20
+ }
21
+
22
+ const error = (<>
23
+ <Icon icon="warning" /> Please upload a valid file
24
+ </>)
25
+
26
+ return (
27
+ <div>
28
+ <AcceptedFilesList
29
+ files={filesToUpload}
30
+ {...props}
31
+ />
32
+ <FileUpload
33
+ error={error}
34
+ onFilesAccepted={handleOnFilesAccepted}
35
+ {...props}
36
+ />
37
+ </div>
38
+ )
39
+ }
40
+
41
+ export default FileUploadError
@@ -3,6 +3,7 @@ examples:
3
3
  rails:
4
4
  - file_upload_default: File Upload
5
5
  - file_upload_custom: Custom
6
+ - file_upload_error: Error
6
7
 
7
8
  react:
8
9
  - file_upload_default: Default List of files to upload
@@ -10,3 +11,4 @@ examples:
10
11
  - file_upload_custom_message: Add a custom message
11
12
  - file_upload_custom_description: Add your one accepted files description
12
13
  - file_upload_max_size: Set a file size limit
14
+ - file_upload_error: Error
@@ -3,3 +3,4 @@ export { default as FileUploadAccept } from './_file_upload_accept.jsx'
3
3
  export { default as FileUploadCustomMessage } from './_file_upload_custom_message.jsx'
4
4
  export { default as FileUploadCustomDescription } from './_file_upload_custom_description.jsx'
5
5
  export { default as FileUploadMaxSize } from './_file_upload_max_size.jsx'
6
+ export { default as FileUploadError } from './_file_upload_error.jsx'
@@ -9,6 +9,7 @@
9
9
  <%= pb_rails("text_input", props: {
10
10
  type: "file",
11
11
  dark: object.dark,
12
+ error: object.error.presence,
12
13
  input_options: {
13
14
  id: "upload-#{object.id}",
14
15
  classname: "cursor_pointer",
@@ -21,14 +21,20 @@ module Playbook
21
21
  prop :input_options, type: Playbook::Props::HashProp,
22
22
  default: {}
23
23
 
24
+ prop :error, type: Playbook::Props::String
25
+
24
26
  def classname
25
27
  file_upload_class = generate_classname("pb_file_upload_kit")
26
- file_upload_class + full_width_class
28
+ file_upload_class + error_class + full_width_class
27
29
  end
28
30
 
29
31
  def full_width_class
30
32
  full_width ? " full_width" : ""
31
33
  end
34
+
35
+ def error_class
36
+ error.present? ? "_error" : ""
37
+ end
32
38
  end
33
39
  end
34
40
  end
@@ -50,3 +50,21 @@ test('displays custom message', () => {
50
50
  const kit = screen.getByTestId(testid)
51
51
  expect(kit).toHaveTextContent('Hello world!')
52
52
  })
53
+
54
+ test('handles error state with error prop', () => {
55
+ const errorText = "Test error message"
56
+ render(
57
+ <FileUpload
58
+ data={{ testid: testid }}
59
+ error={errorText}
60
+ />
61
+ )
62
+
63
+ const kit = screen.getByTestId(testid)
64
+
65
+ expect(kit).toHaveClass('pb_file_upload_kit')
66
+ expect(kit).toHaveClass('error')
67
+
68
+ const errorElement = screen.getByText(errorText)
69
+ expect(errorElement).toBeInTheDocument()
70
+ })
@@ -20,9 +20,12 @@ $form_pill_colors: map-merge($status_color_text, map-merge($data_colors, $produc
20
20
  margin-bottom: 2px;
21
21
  margin-top: 2px;
22
22
  cursor: pointer;
23
- .pb_form_pill_text, .pb_form_pill_close, .pb_form_pill_tag{
23
+ .pb_form_pill_text, .pb_form_pill_tag {
24
24
  font-size: $font_small !important;
25
25
  }
26
+ .pb_form_pill_close {
27
+ font-size: 17px;
28
+ }
26
29
 
27
30
  &[class*=wrapped] {
28
31
  height: max-content;
@@ -96,7 +99,9 @@ $form_pill_colors: map-merge($status_color_text, map-merge($data_colors, $produc
96
99
  display: flex;
97
100
  align-items: center;
98
101
  height: 17px;
99
- border-radius: calc(50%);
102
+ width: 17px;
103
+ justify-content: center;
104
+ border-radius: 50%;
100
105
  cursor: pointer;
101
106
  @if ($color_name == "neutral") {
102
107
  color: $text_lt_default;
@@ -146,8 +151,7 @@ $form_pill_colors: map-merge($status_color_text, map-merge($data_colors, $produc
146
151
  outline-offset: -1px;
147
152
  }
148
153
  .pb_form_pill_icon {
149
- height: 12px !important;
150
- width: 12px !important;
154
+ height: 0.875em;
151
155
  padding-right: $space_xs;
152
156
  + .pb_form_pill_text, + .pb_form_pill_tag,
153
157
  + .pb_tooltip_kit .pb_form_pill_text, + .pb_tooltip_kit .pb_form_pill_tag,
@@ -158,7 +162,7 @@ $form_pill_colors: map-merge($status_color_text, map-merge($data_colors, $produc
158
162
  &.small {
159
163
  height: 17px;
160
164
  padding: 0 $space-xs;
161
- .pb_form_pill_text, .pb_form_pill_close, .pb_form_pill_tag {
165
+ .pb_form_pill_text, .pb_form_pill_tag {
162
166
  font-size: $font_smallest !important;
163
167
  }
164
168
  .pb_form_pill_text, .pb_form_pill_tag {
@@ -166,17 +170,20 @@ $form_pill_colors: map-merge($status_color_text, map-merge($data_colors, $produc
166
170
  padding: 0 $space_xxs;
167
171
  }
168
172
  .pb_form_pill_close {
169
- height: 10px;
170
- border-radius: calc(50%);
173
+ height: 14px;
174
+ width: 14px;
175
+ font-size: 15px;
176
+ border-radius: 50%;
171
177
  }
172
178
  [class^=pb_avatar_kit] .avatar_wrapper {
173
- flex-basis: 16px;
174
- height: 16px;
175
- margin-top: 2px;
176
- width: 16px;
177
- &::before { line-height: 16.5px; }
179
+ flex-basis: 14px;
180
+ height: 14px;
181
+ margin-top: 3px;
182
+ width: 14px;
183
+ &::before { line-height: 15px; }
178
184
  }
179
185
  .pb_form_pill_icon {
186
+ height: 0.75em;
180
187
  padding-right: $space_xxs;
181
188
  + .pb_form_pill_text, + .pb_form_pill_tag,
182
189
  + .pb_tooltip_kit .pb_form_pill_text, + .pb_tooltip_kit .pb_form_pill_tag,
@@ -13,6 +13,7 @@ import MessageMention from './_message_mention'
13
13
 
14
14
  type MessageProps = {
15
15
  aria: { [key: string]: string },
16
+ avatarGrayscale?: boolean,
16
17
  avatarName?: string,
17
18
  avatarStatus?: "away" | "offline" | "online",
18
19
  avatarUrl?: string,
@@ -32,6 +33,7 @@ type MessageProps = {
32
33
  const Message = (props: MessageProps) => {
33
34
  const {
34
35
  aria = {},
36
+ avatarGrayscale = false,
35
37
  avatarName,
36
38
  avatarStatus = null,
37
39
  avatarUrl,
@@ -71,6 +73,7 @@ const Message = (props: MessageProps) => {
71
73
  >
72
74
  {shouldDisplayAvatar &&
73
75
  <Avatar
76
+ grayscale={avatarGrayscale}
74
77
  imageUrl={avatarUrl}
75
78
  name={avatarName}
76
79
  size="xs"
@@ -0,0 +1,9 @@
1
+ <%= pb_rails("message", props: {
2
+ label: "Mike Bishop",
3
+ message: "So long, and thanks for all the fish!",
4
+ timestamp: "3 months ago",
5
+ avatar_name: "Mike Bishop",
6
+ avatar_url: "https://randomuser.me/api/portraits/men/50.jpg",
7
+ avatar_status: "offline",
8
+ avatar_grayscale: true,
9
+ }) %>
@@ -0,0 +1,21 @@
1
+ import React from "react"
2
+
3
+ import Message from "../_message"
4
+
5
+ const MessageGrayscale = (props) => {
6
+ return (
7
+ <Message
8
+ avatarGrayscale
9
+ avatarName='Mike Bishop'
10
+ avatarStatus='offline'
11
+ avatarUrl='https://randomuser.me/api/portraits/men/50.jpg'
12
+ borderRadius='rounded'
13
+ label='Mike Bishop'
14
+ message='So long, and thanks for all the fish!'
15
+ timestamp='3 months ago'
16
+ {...props}
17
+ />
18
+ )
19
+ }
20
+
21
+ export default MessageGrayscale
@@ -5,12 +5,14 @@ examples:
5
5
  - message_timestamp: With Timestamp Hover
6
6
  - message_hover: Hover
7
7
  - message_mentions: Mentions
8
+ - message_grayscale: Grayscale Avatar
8
9
 
9
10
  react:
10
11
  - message_default: Default
11
12
  - message_timestamp: With Timestamp Hover
12
13
  - message_hover: Hover
13
14
  - message_mentions: Mentions
15
+ - message_grayscale: Grayscale Avatar
14
16
 
15
17
  swift:
16
18
  - message_default_swift: Default
@@ -2,3 +2,4 @@ export { default as MessageDefault } from './_message_default.jsx'
2
2
  export { default as MessageTimestamp } from './_message_timestamp.jsx'
3
3
  export { default as MessageHover } from './_message_hover.jsx'
4
4
  export { default as MessageMentions } from './_message_mentions.jsx'
5
+ export { default as MessageGrayscale } from './_message_grayscale.jsx'
@@ -4,7 +4,8 @@
4
4
  name: object.avatar_name,
5
5
  size: "xs",
6
6
  image_url: object.avatar_url,
7
- status: object.avatar_status
7
+ status: object.avatar_status,
8
+ grayscale: object.avatar_grayscale
8
9
  }) %>
9
10
  <% end %>
10
11
  <div class="content_wrapper">
@@ -6,6 +6,7 @@ module Playbook
6
6
  prop :avatar_name
7
7
  prop :avatar_status
8
8
  prop :avatar_url
9
+ prop :avatar_grayscale, type: Playbook::Props::Boolean, default: false
9
10
  prop :label
10
11
  prop :message
11
12
  prop :timestamp
@@ -78,7 +78,8 @@ $overlay_colors: (
78
78
  &.overlay-hide-scrollbar {
79
79
  & [class*="overflow_x_auto"],
80
80
  & [class*="overflow_y_auto"],
81
- & [class*="overflow_auto"] {
81
+ & [class*="overflow_auto"],
82
+ .overlay_token_container {
82
83
  &::-webkit-scrollbar {
83
84
  display: none !important;
84
85
  }
@@ -9,7 +9,7 @@ const InlineCardsExample = forwardRef(function InlineCardsExample(ref) {
9
9
  <Flex
10
10
  columnGap="lg"
11
11
  orientation="row"
12
- ref={ref}
12
+ ref={ref}
13
13
  >
14
14
  {Array.from({ length: 15 }, (_, index) => (
15
15
  <FlexItem key={index}>
@@ -30,7 +30,7 @@ const OverlayToken = (props: OverlayChildrenProps) => {
30
30
  if (container) {
31
31
  const { scrollLeft, scrollWidth, clientWidth } = container;
32
32
  const atStart = scrollLeft === 0;
33
- const atEnd = scrollLeft + clientWidth >= scrollWidth - 1;
33
+ const atEnd = scrollLeft + clientWidth >= scrollWidth - 1;
34
34
 
35
35
  setIsAtStart(atStart);
36
36
  setIsAtEnd(atEnd);
@@ -64,16 +64,17 @@ const OverlayToken = (props: OverlayChildrenProps) => {
64
64
  return (
65
65
  <>
66
66
  <div className={dynamic ? isAtStart ? '' : previousOverlayClassName : previousOverlayClassName} />
67
- {dynamic ?
67
+ {dynamic ?
68
68
  <div
69
+ className="overlay_token_container"
69
70
  ref={scrollContainerRef}
70
71
  style={{
71
- overflowX: 'auto',
72
+ overflowX: 'auto',
72
73
  }}
73
74
  >
74
75
  {children}
75
76
  </div>
76
- :
77
+ :
77
78
  children
78
79
  }
79
80
  {hasSubsequentOverlay &&
@@ -42,7 +42,7 @@ $flag-min-resolution: 192dpi;
42
42
  .iti__country-list {
43
43
  min-width: $dropdown-min-width;
44
44
  }
45
- // iti-spacer-horizontal's default is 8px, or $space_xs
45
+ // iti-spacer-horizontal's default is 8px, or $space_xs
46
46
  .iti__country-list .iti__flag, .iti__country-name {
47
47
  margin-right: $space_xs;
48
48
  }
@@ -60,7 +60,7 @@ $flag-min-resolution: 192dpi;
60
60
  color: $focus_input_light;
61
61
  }
62
62
 
63
- .dropdown_open {
63
+ .dropdown_open:not(.error) {
64
64
  .text_input {
65
65
  border-color: $primary !important;
66
66
  }
@@ -76,7 +76,7 @@ $flag-min-resolution: 192dpi;
76
76
  }
77
77
 
78
78
  .iti__divider {
79
- border-bottom: 1px solid $border_light !important;
79
+ border-bottom: 1px solid $border_light !important;
80
80
  }
81
81
 
82
82
  .iti__selected-country-primary {
@@ -96,7 +96,7 @@ $flag-min-resolution: 192dpi;
96
96
  justify-content: center;
97
97
  align-items: center;
98
98
  border-width: 0;
99
- border-radius: $space_xxs;
99
+ border-radius: $space_xxs;
100
100
 
101
101
  &[aria-expanded="true"] {
102
102
  color: $primary_action;
@@ -199,7 +199,7 @@ $flag-min-resolution: 192dpi;
199
199
  }
200
200
 
201
201
  .iti__dropdown-content {
202
- border-radius: $space_xs;
202
+ border-radius: $space_xs;
203
203
  border: 1px solid $border_light !important;
204
204
  position: absolute;
205
205
  top: 100%;
@@ -228,13 +228,13 @@ $flag-min-resolution: 192dpi;
228
228
  }
229
229
 
230
230
  .iti__dropdown-content {
231
- border-radius: $space_xs;
231
+ border-radius: $space_xs;
232
232
  border: 1px solid $border_dark !important;
233
233
  .iti__search-input {
234
234
  background-color: $bg_dark_card;
235
235
  &:hover {
236
236
  background-color: $bg_dark_card;
237
- }
237
+ }
238
238
  &:active,
239
239
  &:focus {
240
240
  background-color: $card_dark;
@@ -243,7 +243,7 @@ $flag-min-resolution: 192dpi;
243
243
  }
244
244
 
245
245
  .iti__divider {
246
- border-bottom: 1px solid $border_dark !important;
246
+ border-bottom: 1px solid $border_dark !important;
247
247
  }
248
248
 
249
249
  .iti__country-list {
@@ -278,7 +278,7 @@ $flag-min-resolution: 192dpi;
278
278
  color: $white;
279
279
  }
280
280
  }
281
-
281
+
282
282
  @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: $flag-min-resolution) {
283
283
  .iti__flag {
284
284
  background-image: url("https://unpkg.com/intl-tel-input@24.6.0/build/img/flags@2x.png");
@@ -2,7 +2,7 @@ import React from 'react'
2
2
  import classnames from 'classnames'
3
3
 
4
4
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
5
- import { globalProps, globalInlineProps } from '../utilities/globalProps'
5
+ import { globalProps, globalInlineProps, GlobalProps } from '../utilities/globalProps'
6
6
 
7
7
  import Caption from '../pb_caption/_caption'
8
8
 
@@ -19,7 +19,7 @@ type SectionSeparatorProps = {
19
19
  orientation?: "horizontal" | "vertical",
20
20
  text?: string,
21
21
  variant?: "card" | "background",
22
- }
22
+ } & GlobalProps
23
23
 
24
24
  const SectionSeparator = (props: SectionSeparatorProps): React.ReactElement => {
25
25
  const {
@@ -143,6 +143,16 @@
143
143
  select {
144
144
  font-size: 12px;
145
145
  }
146
+ .pb_select_kit_wrapper.error {
147
+ .pb_select_kit_caret {
148
+ top: 13.7px;
149
+ }
150
+ }
151
+ }
152
+ .pb_select_kit_wrapper.error {
153
+ .pb_select_kit_caret {
154
+ top: 16.2px;
155
+ }
146
156
  }
147
157
  }
148
158
  }
@@ -1,5 +1,5 @@
1
1
  <%= pb_rails("select", props: {
2
- error: "Please make a valid selection",
2
+ error: raw(pb_rails("icon", props: { icon: "warning" }) + " Please make a valid selection"),
3
3
  label: "Favorite Food",
4
4
  name: "food",
5
5
  options: [