playbook_ui 16.1.0.pre.alpha.play277814027 → 16.1.0.pre.rc.0

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 (178) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +2 -12
  3. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +2 -2
  4. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +0 -4
  5. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +0 -33
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_inline_row_loading.md +2 -2
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +0 -2
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -2
  9. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +1 -51
  10. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +1 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -34
  12. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +1 -1
  13. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +0 -19
  14. data/app/pb_kits/playbook/pb_background/docs/example.yml +0 -1
  15. data/app/pb_kits/playbook/pb_background/docs/index.js +0 -1
  16. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +5 -14
  17. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +6 -8
  18. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +0 -6
  19. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +2 -37
  20. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +0 -6
  21. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +1 -4
  22. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -2
  23. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +0 -6
  24. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +0 -94
  25. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +1 -5
  26. data/app/pb_kits/playbook/pb_dropdown/index.js +4 -59
  27. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +0 -3
  28. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +1 -2
  29. data/app/pb_kits/playbook/pb_filter/Filter/SortMenu.tsx +1 -1
  30. data/app/pb_kits/playbook/pb_filter/docs/_filter_default.html.erb +2 -2
  31. data/app/pb_kits/playbook/pb_filter/docs/_filter_default.jsx +9 -16
  32. data/app/pb_kits/playbook/pb_filter/filter.rb +2 -2
  33. data/app/pb_kits/playbook/pb_form/docs/_form_with_required_indicator.html.erb +1 -5
  34. data/app/pb_kits/playbook/pb_form/pb_form_validation.js +2 -9
  35. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text.html.erb +5 -5
  36. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text.jsx +4 -4
  37. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +0 -4
  38. data/app/pb_kits/playbook/pb_icon/icon.rb +1 -6
  39. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +33 -35
  40. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +0 -1
  41. data/app/pb_kits/playbook/pb_multiple_users/docs/_multiple_users_with_tooltip.jsx +1 -1
  42. data/app/pb_kits/playbook/pb_multiple_users/docs/_multiple_users_with_tooltip.md +1 -1
  43. data/app/pb_kits/playbook/pb_multiple_users/docs/example.yml +0 -1
  44. data/app/pb_kits/playbook/pb_multiple_users/multiple_users.html.erb +7 -51
  45. data/app/pb_kits/playbook/pb_multiple_users/multiple_users.rb +0 -1
  46. data/app/pb_kits/playbook/pb_passphrase/_passphrase.tsx +5 -20
  47. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_meter_settings.jsx +0 -1
  48. data/app/pb_kits/playbook/pb_passphrase/docs/example.yml +0 -2
  49. data/app/pb_kits/playbook/pb_passphrase/docs/index.js +0 -1
  50. data/app/pb_kits/playbook/pb_passphrase/passphrase.rb +0 -2
  51. data/app/pb_kits/playbook/pb_passphrase/passphrase.test.jsx +1 -30
  52. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +0 -3
  53. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +0 -2
  54. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +0 -1
  55. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +0 -3
  56. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +3 -34
  57. data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.tsx +6 -33
  58. data/app/pb_kits/playbook/pb_rich_text_editor/docs/example.yml +0 -3
  59. data/app/pb_kits/playbook/pb_rich_text_editor/docs/index.js +0 -2
  60. data/app/pb_kits/playbook/pb_rich_text_editor/rich_text_editor.rb +0 -5
  61. data/app/pb_kits/playbook/pb_rich_text_editor/rich_text_editor.test.js +18 -33
  62. data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +11 -39
  63. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_default.html.erb +3 -3
  64. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_default.jsx +0 -3
  65. data/app/pb_kits/playbook/pb_textarea/docs/example.yml +1 -4
  66. data/app/pb_kits/playbook/pb_textarea/docs/index.js +0 -1
  67. data/app/pb_kits/playbook/pb_textarea/index.ts +5 -12
  68. data/app/pb_kits/playbook/pb_textarea/textarea.html.erb +14 -30
  69. data/app/pb_kits/playbook/pb_textarea/textarea.rb +0 -36
  70. data/app/pb_kits/playbook/pb_textarea/textarea.test.js +1 -18
  71. data/app/pb_kits/playbook/pb_time_picker/_time_picker.tsx +11 -97
  72. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_on_handler.jsx +2 -5
  73. data/app/pb_kits/playbook/pb_time_picker/docs/example.yml +0 -2
  74. data/app/pb_kits/playbook/pb_time_picker/docs/index.js +0 -1
  75. data/app/pb_kits/playbook/pb_time_picker/time_picker.rb +0 -3
  76. data/app/pb_kits/playbook/pb_time_picker/time_picker.test.jsx +1 -47
  77. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +1 -24
  78. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +1 -2
  79. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +1 -4
  80. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.html.erb +1 -1
  81. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.jsx +1 -1
  82. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +0 -4
  83. data/dist/chunks/{_pb_line_graph-BgKF_zz1.js → _pb_line_graph-hxi01lk7.js} +1 -1
  84. data/dist/chunks/_typeahead-BgLnlhzP.js +1 -0
  85. data/dist/chunks/{globalProps-BhVYCqRf.js → globalProps-DgYwLYNx.js} +1 -1
  86. data/dist/chunks/{lib-DD34ZrWL.js → lib-NLxTo8OB.js} +1 -1
  87. data/dist/chunks/vendor.js +3 -3
  88. data/dist/menu.yml +2 -2
  89. data/dist/playbook-rails-react-bindings.js +1 -1
  90. data/dist/playbook-rails.js +1 -1
  91. data/dist/playbook.css +1 -1
  92. data/lib/playbook/align_content.rb +3 -13
  93. data/lib/playbook/align_items.rb +3 -13
  94. data/lib/playbook/align_self.rb +3 -13
  95. data/lib/playbook/display.rb +0 -5
  96. data/lib/playbook/flex.rb +3 -13
  97. data/lib/playbook/flex_direction.rb +3 -13
  98. data/lib/playbook/flex_grow.rb +3 -13
  99. data/lib/playbook/flex_shrink.rb +3 -13
  100. data/lib/playbook/flex_wrap.rb +3 -13
  101. data/lib/playbook/forms/builder/phone_number_field.rb +0 -9
  102. data/lib/playbook/justify_content.rb +3 -13
  103. data/lib/playbook/justify_self.rb +3 -13
  104. data/lib/playbook/order.rb +3 -13
  105. data/lib/playbook/spacing.rb +9 -39
  106. data/lib/playbook/text_align.rb +3 -13
  107. data/lib/playbook/truncate.rb +1 -1
  108. data/lib/playbook/version.rb +2 -2
  109. data/lib/playbook/vertical_align.rb +3 -13
  110. data/lib/playbook/z_index.rb +0 -5
  111. metadata +6 -72
  112. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background_custom.jsx +0 -71
  113. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background_custom.md +0 -4
  114. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_inline_row_loading_rails.html.erb +0 -64
  115. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_inline_row_loading_rails.md +0 -18
  116. data/app/pb_kits/playbook/pb_background/docs/_background_responsive.jsx +0 -30
  117. data/app/pb_kits/playbook/pb_background/docs/_background_responsive.md +0 -1
  118. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default.md +0 -1
  119. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection_rails.md +0 -3
  120. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection_react.md +0 -3
  121. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.html.erb +0 -52
  122. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.jsx +0 -72
  123. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.md +0 -5
  124. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_constrain_height.jsx +0 -33
  125. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_constrain_height_rails.html.erb +0 -20
  126. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_constrain_height_rails.md +0 -8
  127. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_constrain_height_react.md +0 -8
  128. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.html.erb +0 -9
  129. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.jsx +0 -33
  130. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.md +0 -3
  131. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_input_display.html.erb +0 -74
  132. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_input_display.jsx +0 -87
  133. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_input_display.md +0 -3
  134. data/app/pb_kits/playbook/pb_multiple_users/docs/_multiple_users_with_tooltip.html.erb +0 -30
  135. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_required_indicator.html.erb +0 -7
  136. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_required_indicator.jsx +0 -24
  137. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_required_indicator.md +0 -3
  138. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_required_indicator.html.erb +0 -5
  139. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_required_indicator.jsx +0 -14
  140. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_required_indicator.md +0 -3
  141. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_required_indicator.jsx +0 -35
  142. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_required_indicator.md +0 -3
  143. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_required_indicator.html.erb +0 -10
  144. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_required_indicator.jsx +0 -21
  145. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_required_indicator.md +0 -3
  146. data/app/pb_kits/playbook/pb_table/docs/_sections.yml +0 -68
  147. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_default.md +0 -1
  148. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_input_options.html.erb +0 -39
  149. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_input_options.md +0 -3
  150. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_required_indicator.html.erb +0 -5
  151. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_required_indicator.jsx +0 -25
  152. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_required_indicator.md +0 -3
  153. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_required_indicator.html.erb +0 -6
  154. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_required_indicator.jsx +0 -16
  155. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_required_indicator.md +0 -3
  156. data/app/pb_kits/playbook/utilities/test/globalProps/borderRadius.test.js +0 -33
  157. data/app/pb_kits/playbook/utilities/test/globalProps/bottom.test.js +0 -60
  158. data/app/pb_kits/playbook/utilities/test/globalProps/cursor.test.js +0 -42
  159. data/app/pb_kits/playbook/utilities/test/globalProps/dark.test.js +0 -33
  160. data/app/pb_kits/playbook/utilities/test/globalProps/gap.test.js +0 -87
  161. data/app/pb_kits/playbook/utilities/test/globalProps/globalProps.integration.test.js +0 -936
  162. data/app/pb_kits/playbook/utilities/test/globalProps/height.test.js +0 -68
  163. data/app/pb_kits/playbook/utilities/test/globalProps/htmlOptions.test.js +0 -510
  164. data/app/pb_kits/playbook/utilities/test/globalProps/left.test.js +0 -60
  165. data/app/pb_kits/playbook/utilities/test/globalProps/lineHeight.test.js +0 -33
  166. data/app/pb_kits/playbook/utilities/test/globalProps/margin.test.js +0 -95
  167. data/app/pb_kits/playbook/utilities/test/globalProps/numberSpacing.test.js +0 -33
  168. data/app/pb_kits/playbook/utilities/test/globalProps/overflow.test.js +0 -68
  169. data/app/pb_kits/playbook/utilities/test/globalProps/padding.test.js +0 -95
  170. data/app/pb_kits/playbook/utilities/test/globalProps/position.test.js +0 -33
  171. data/app/pb_kits/playbook/utilities/test/globalProps/right.test.js +0 -60
  172. data/app/pb_kits/playbook/utilities/test/globalProps/shadow.test.js +0 -33
  173. data/app/pb_kits/playbook/utilities/test/globalProps/textAlign.test.js +0 -41
  174. data/app/pb_kits/playbook/utilities/test/globalProps/top.test.js +0 -60
  175. data/app/pb_kits/playbook/utilities/test/globalProps/verticalAlign.test.js +0 -40
  176. data/app/pb_kits/playbook/utilities/test/globalProps/width.test.js +0 -66
  177. data/app/pb_kits/playbook/utilities/test/globalProps/zIndex.test.js +0 -50
  178. data/dist/chunks/_typeahead-CWA5wlah.js +0 -1
@@ -13,7 +13,6 @@ import Body from '../pb_body/_body'
13
13
  import Caption from '../pb_caption/_caption'
14
14
  import Flex from '../pb_flex/_flex'
15
15
  import FlexItem from '../pb_flex/_flex_item'
16
- import colors from '../tokens/exports/_colors.module.scss'
17
16
 
18
17
  import { stripEmojisForPaste, applyEmojiMask } from '../utilities/emojiMask'
19
18
 
@@ -37,7 +36,6 @@ type TextareaProps = {
37
36
  value?: string,
38
37
  name?: string,
39
38
  required?: boolean,
40
- requiredIndicator?: boolean,
41
39
  rows?: number,
42
40
  resize: "none" | "both" | "horizontal" | "vertical" | "auto",
43
41
  onChange?: InputCallback<HTMLTextAreaElement>,
@@ -52,7 +50,6 @@ const Textarea = ({
52
50
  disabled,
53
51
  emojiMask = false,
54
52
  htmlOptions = {},
55
- id,
56
53
  inline = false,
57
54
  resize = 'none',
58
55
  error,
@@ -63,7 +60,6 @@ const Textarea = ({
63
60
  onChange = () => {},
64
61
  placeholder,
65
62
  required,
66
- requiredIndicator = false,
67
63
  rows = 4,
68
64
  value,
69
65
  ...props
@@ -88,7 +84,7 @@ const Textarea = ({
88
84
  if (emojiMask) {
89
85
  const pastedText = e.clipboardData.getData('text')
90
86
  const filteredText = stripEmojisForPaste(pastedText)
91
-
87
+
92
88
  if (pastedText !== filteredText) {
93
89
  e.preventDefault()
94
90
  const textarea = e.currentTarget
@@ -97,10 +93,10 @@ const Textarea = ({
97
93
  const currentValue = textarea.value
98
94
  const newValue = currentValue.slice(0, start) + filteredText + currentValue.slice(end)
99
95
  const newCursorPosition = start + filteredText.length
100
-
96
+
101
97
  textarea.value = newValue
102
98
  textarea.selectionStart = textarea.selectionEnd = newCursorPosition
103
-
99
+
104
100
  onChange({ ...e, target: textarea, currentTarget: textarea } as unknown as ChangeEvent<HTMLTextAreaElement>)
105
101
  }
106
102
  }
@@ -120,7 +116,6 @@ const Textarea = ({
120
116
  const characterCounter = () => {
121
117
  return maxCharacters && characterCount ? `${checkIfZero(characterCount)} / ${maxCharacters}` : `${checkIfZero(characterCount)}`
122
118
  }
123
- const errorId = error ? `${id}-error` : undefined
124
119
 
125
120
  return (
126
121
  <div
@@ -129,27 +124,10 @@ const Textarea = ({
129
124
  {...htmlProps}
130
125
  className={classes}
131
126
  >
132
- {label && (
133
- <label htmlFor={id}>
134
- {
135
- requiredIndicator ? (
136
- <Caption className="pb_text_input_kit_label">
137
- {label} <span style={{ color: `${colors.error}` }}>*</span>
138
- </Caption>
139
- ) : (
140
- <Caption className="pb_text_input_kit_label"
141
- text={label}
142
- />
143
- )
144
- }
145
- </label>
146
- )}
127
+ <Caption text={label} />
147
128
  {children || (
148
129
  <textarea
149
- aria-describedby={errorId}
150
- aria-invalid={!!error}
151
130
  disabled={disabled}
152
- id={id}
153
131
  name={name}
154
132
  onChange={emojiMask ? handleChange : onChange}
155
133
  onPaste={emojiMask ? handlePaste : undefined}
@@ -165,22 +143,19 @@ const Textarea = ({
165
143
  {error ? (
166
144
  <>
167
145
  {characterCount ? (
168
- <Flex
169
- spacing="between"
146
+ <Flex
147
+ spacing="between"
170
148
  vertical="center"
171
149
  >
172
150
  <FlexItem>
173
- <Body
174
- aria={{ atomic: "true", live: "polite" }}
175
- htmlOptions={{ role: "alert" }}
176
- id={errorId}
151
+ <Body
177
152
  margin="none"
178
153
  status="negative"
179
- text={error}
154
+ text={error}
180
155
  />
181
156
  </FlexItem>
182
157
  <FlexItem>
183
- <Caption
158
+ <Caption
184
159
  margin="none"
185
160
  size="xs"
186
161
  text={characterCounter()}
@@ -188,10 +163,7 @@ const Textarea = ({
188
163
  </FlexItem>
189
164
  </Flex>
190
165
  ) : (
191
- <Body
192
- aria={{ atomic: "true", live: "polite" }}
193
- htmlOptions={{ role: "alert" }}
194
- id={errorId}
166
+ <Body
195
167
  status="negative"
196
168
  text={error}
197
169
  />
@@ -199,7 +171,7 @@ const Textarea = ({
199
171
  </>
200
172
  ) : (
201
173
  noCount && (
202
- <Caption
174
+ <Caption
203
175
  margin="none"
204
176
  size="xs"
205
177
  text={characterCounter()}
@@ -1,9 +1,9 @@
1
- <%= pb_rails("textarea", props: { label: "Label", rows: 4, id: "default-example-1" }) %>
1
+ <%= pb_rails("textarea", props: { label: "Label", rows: 4}) %>
2
2
 
3
3
  <br/>
4
4
 
5
- <%= pb_rails("textarea", props: { label: "Label", placeholder: "Placeholder text", id: "default-example-2" }) %>
5
+ <%= pb_rails("textarea", props: { label: "Label", placeholder: "Placeholder text" }) %>
6
6
 
7
7
  <br/>
8
8
 
9
- <%= pb_rails("textarea", props: { label: "Label", name: "comment", value: "Default value text", id: "default-example-3" }) %>
9
+ <%= pb_rails("textarea", props: { label: "Label", name: "comment", value: "Default value text" }) %>
@@ -13,7 +13,6 @@ const TextareaDefault = (props) => {
13
13
  label="Label"
14
14
  rows={4}
15
15
  {...props}
16
- id="default-example-1"
17
16
  />
18
17
 
19
18
  <br />
@@ -22,7 +21,6 @@ const TextareaDefault = (props) => {
22
21
  label="Label"
23
22
  placeholder="Placeholder text"
24
23
  {...props}
25
- id="default-example-2"
26
24
  />
27
25
 
28
26
  <br />
@@ -34,7 +32,6 @@ const TextareaDefault = (props) => {
34
32
  placeholder="Placeholder text"
35
33
  value={value}
36
34
  {...props}
37
- id="default-example-3"
38
35
  />
39
36
 
40
37
  </div>
@@ -8,8 +8,6 @@ examples:
8
8
  - textarea_character_counter: Character Counter
9
9
  - textarea_inline: Inline
10
10
  - textarea_emoji_mask: Emoji Mask
11
- - textarea_required_indicator: Required Indicator
12
- - textarea_input_options: Input Options
13
11
 
14
12
  react:
15
13
  - textarea_default: Default
@@ -19,9 +17,8 @@ examples:
19
17
  - textarea_character_counter: Character Counter
20
18
  - textarea_inline: Inline
21
19
  - textarea_emoji_mask: Emoji Mask
22
- - textarea_required_indicator: Required Indicator
23
20
 
24
21
  swift:
25
22
  - textarea_default_swift: Default
26
23
  - textarea_error_swift: Textarea w/ Error
27
- - textarea_props_swift: ""
24
+ - textarea_props_swift: ""
@@ -5,4 +5,3 @@ export { default as TextareaError } from './_textarea_error.jsx'
5
5
  export { default as TextareaCharacterCounter } from './_textarea_character_counter.jsx'
6
6
  export { default as TextareaInline } from './_textarea_inline.jsx'
7
7
  export { default as TextareaEmojiMask } from './_textarea_emoji_mask.jsx'
8
- export { default as TextareaRequiredIndicator } from './_textarea_required_indicator.jsx'
@@ -11,21 +11,18 @@ export default class PbTextarea extends PbEnhancedElement {
11
11
  }
12
12
 
13
13
  hasEmojiMask(): boolean {
14
- if (!this.element) return false
15
14
  return (this.element as HTMLElement).dataset.pbEmojiMask === "true"
16
15
  }
17
16
 
18
- onInput = (): void => {
19
- if (!this.element) return
20
-
17
+ onInput(): void {
21
18
  if ((this.element as HTMLElement).closest('.resize_auto')) {
22
- (this.element as HTMLTextAreaElement).style.height = 'auto';
23
- (this.element as HTMLTextAreaElement).style.height = (this.element as HTMLTextAreaElement).scrollHeight + 'px'
19
+ this.style.height = 'auto'
20
+ this.style.height = (this.scrollHeight) + 'px'
24
21
  }
25
22
  }
26
23
 
27
24
  handleEmojiInput = (): void => {
28
- if (!this.element || !this.hasEmojiMask()) return
25
+ if (!this.hasEmojiMask()) return
29
26
 
30
27
  if (this.skipNextEmojiFilter) {
31
28
  this.skipNextEmojiFilter = false
@@ -36,7 +33,7 @@ export default class PbTextarea extends PbEnhancedElement {
36
33
  }
37
34
 
38
35
  handleEmojiPaste = (event: ClipboardEvent): void => {
39
- if (!this.element || !this.hasEmojiMask()) return
36
+ if (!this.hasEmojiMask()) return
40
37
 
41
38
  const pastedText = event.clipboardData?.getData('text') || ''
42
39
  const filteredText = stripEmojisForPaste(pastedText)
@@ -60,8 +57,6 @@ export default class PbTextarea extends PbEnhancedElement {
60
57
  }
61
58
 
62
59
  connect(): void {
63
- if (!this.element) return
64
-
65
60
  if ((this.element as HTMLElement).closest('.resize_auto')) {
66
61
  this.element.setAttribute('style', 'height:' + (this.element as HTMLTextAreaElement).scrollHeight + 'px;overflow-y:hidden;')
67
62
  this.element.addEventListener('input', this.onInput, false)
@@ -74,8 +69,6 @@ export default class PbTextarea extends PbEnhancedElement {
74
69
  }
75
70
 
76
71
  disconnect(): void {
77
- if (!this.element) return
78
-
79
72
  this.element.removeEventListener('input', this.onInput, false)
80
73
  this.element.removeEventListener('input', this.handleEmojiInput, false)
81
74
  this.element.removeEventListener('paste', this.handleEmojiPaste as EventListener, false)
@@ -1,14 +1,6 @@
1
- <%= pb_content_tag(:div, id: nil) do %>
1
+ <%= pb_content_tag 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: { text: object.label, dark: object.dark }) do %>
6
- <%= object.label %><span style="color: #DA0014;"> *</span>
7
- <% end %>
8
- <% else %>
9
- <%= pb_rails("caption", props: {text: object.label, dark: object.dark}) %>
10
- <% end %>
11
- </label>
3
+ <%= pb_rails("caption", props: {text: object.label, dark: object.dark}) %>
12
4
  <% end %>
13
5
  <% if content.present? %>
14
6
  <%= content %>
@@ -16,36 +8,28 @@
16
8
  <%= pb_rails("body", props: { dark: object.dark, status: "negative", text: object.error }) %>
17
9
  <% end %>
18
10
  <% else %>
19
- <%= text_area_tag(
20
- object.name,
21
- object.value,
22
- object.all_textarea_attributes) %>
11
+ <%= text_area(
12
+ :object,
13
+ :method,
14
+ :data => object.textarea_options[:data],
15
+ :max_characters => object.max_characters,
16
+ :name => object.name,
17
+ :onkeyup => object.onkeyup,
18
+ :placeholder => object.placeholder,
19
+ :rows => object.rows,
20
+ :value => object.value) %>
23
21
  <% if object.error %>
24
22
  <% if object.character_count %>
25
23
  <%= pb_rails("flex", props: { spacing: "between", vertical: "center" }) do %>
26
24
  <%= pb_rails("flex/flex_item") do %>
27
- <%= pb_rails("body", props: {
28
- dark: object.dark,
29
- status: "negative",
30
- text: object.error,
31
- id: object.error_id,
32
- aria: { atomic: "true", live: "polite" },
33
- html_options: { role: "alert" },
34
- }) %>
25
+ <%= pb_rails("body", props: { dark: object.dark, status: "negative", text: object.error }) %>
35
26
  <% end %>
36
27
  <%= pb_rails("flex/flex_item") do %>
37
28
  <%= pb_rails("caption", props: { margin: "none", size: "xs", text: object.character_counter }) %>
38
29
  <% end %>
39
30
  <% end %>
40
31
  <% else %>
41
- <%= pb_rails("body", props: {
42
- dark: object.dark,
43
- status: "negative",
44
- text: object.error,
45
- id: object.error_id,
46
- aria: { atomic: "true", live: "polite" },
47
- html_options: { role: "alert" },
48
- }) %>
32
+ <%= pb_rails("body", props: { dark: object.dark, status: "negative", text: object.error }) %>
49
33
  <% end %>
50
34
  <% else %>
51
35
  <%= pb_rails("caption", props: { margin: "none", size: "xs", text: object.character_counter }) %>
@@ -8,8 +8,6 @@ module Playbook
8
8
  prop :error
9
9
  prop :inline, type: Playbook::Props::Boolean,
10
10
  default: false
11
- prop :input_options, type: Playbook::Props::HashProp,
12
- default: {}
13
11
  prop :label
14
12
  prop :method
15
13
  prop :name
@@ -23,8 +21,6 @@ module Playbook
23
21
  prop :character_count
24
22
  prop :onkeyup
25
23
  prop :max_characters
26
- prop :required_indicator, type: Playbook::Props::Boolean,
27
- default: false
28
24
 
29
25
  def classname
30
26
  generate_classname("pb_textarea_kit") + error_class + resize_class + inline_class
@@ -40,38 +36,6 @@ module Playbook
40
36
  }
41
37
  end
42
38
 
43
- def all_textarea_attributes
44
- # Merge data attributes: emoji_mask data + input_options data
45
- data_attrs = textarea_options[:data] || {}
46
- input_data = input_options[:data] || {}
47
- merged_data = data_attrs.merge(input_data)
48
-
49
- base_attributes = {
50
- 'aria-describedby': error.present? ? error_id : nil,
51
- 'aria-invalid': error.present?,
52
- id: input_options[:id] || id || "object_method",
53
- max_characters: max_characters,
54
- name: name,
55
- onkeyup: onkeyup,
56
- placeholder: placeholder,
57
- rows: rows,
58
- value: value,
59
- }
60
-
61
- # Merge input_options (excluding data to handle separately)
62
- input_options_without_data = input_options.except(:data)
63
- result = base_attributes.merge(input_options_without_data)
64
-
65
- # Add merged data if present (input_options data takes precedence over emoji_mask data)
66
- result[:data] = merged_data unless merged_data.empty?
67
-
68
- result
69
- end
70
-
71
- def error_id
72
- "#{id}-error" if error.present?
73
- end
74
-
75
39
  private
76
40
 
77
41
  def error_class
@@ -1,5 +1,5 @@
1
1
  import React, { useState } from "react"
2
- import { render, screen, fireEvent, within } from "../utilities/test-utils"
2
+ import { render, screen, fireEvent } from "../utilities/test-utils"
3
3
 
4
4
  import Textarea from "./_textarea"
5
5
 
@@ -265,21 +265,4 @@ describe("Textarea Emoji Mask", () => {
265
265
  fireEvent.change(textarea, { target: { value: 'àëǒüñ' } })
266
266
  expect(textarea.value).toBe('àëǒüñ')
267
267
  })
268
-
269
- test('renders required indicator asterisk when requiredIndicator is true', () => {
270
- render(
271
- <Textarea
272
- data={{ testid: testId }}
273
- label="Name"
274
- required
275
- requiredIndicator
276
- />
277
- )
278
-
279
- const kit = screen.getByTestId(testId)
280
- const label = within(kit).getByText(/Name/)
281
-
282
- expect(label).toBeInTheDocument()
283
- expect(kit).toHaveTextContent('*')
284
- })
285
268
  })
@@ -5,12 +5,12 @@ import { globalProps, GlobalProps } from '../utilities/globalProps'
5
5
  import Caption from '../pb_caption/_caption'
6
6
  import SelectableCard from '../pb_selectable_card/_selectable_card'
7
7
  import TextInput from '../pb_text_input/_text_input'
8
- import colors from '../tokens/exports/_colors.module.scss'
9
8
 
10
9
  import {
11
10
  parseTime,
12
11
  parseTimeToMinutes,
13
12
  isTimeInRange as isTimeInRangeHelper,
13
+ isHourDisabled as isHourDisabledHelper,
14
14
  isAnyAMTimeValid as isAnyAMTimeValidHelper,
15
15
  isAnyPMTimeValid as isAnyPMTimeValidHelper,
16
16
  getDisplayTime,
@@ -48,7 +48,6 @@ type TimePickerProps = {
48
48
  onChange?: (time: string) => void,
49
49
  onClose?: (time: string) => void,
50
50
  required?: boolean,
51
- requiredIndicator?: boolean,
52
51
  showTimezone?: boolean,
53
52
  timeFormat?: TimeFormat,
54
53
  validationMessage?: string,
@@ -73,7 +72,6 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
73
72
  onChange,
74
73
  onClose,
75
74
  required = false,
76
- requiredIndicator = false,
77
75
  showTimezone = false,
78
76
  timeFormat = 'AMPM',
79
77
  validationMessage,
@@ -116,6 +114,10 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
116
114
  return isTimeInRangeHelper(h, m, mer, timeFormat, minTimeMinutes, maxTimeMinutes)
117
115
  }
118
116
 
117
+ const isHourDisabled = (h: number, mer?: 'AM' | 'PM'): boolean => {
118
+ return isHourDisabledHelper(h, mer, timeFormat, minTimeMinutes, maxTimeMinutes)
119
+ }
120
+
119
121
  const isCurrentTimeValid = (h: number, m: number, mer: 'AM' | 'PM'): boolean => {
120
122
  return isTimeInRange(h, m, mer)
121
123
  }
@@ -185,28 +187,6 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
185
187
  const [showHourDropdown, setShowHourDropdown] = useState(false)
186
188
  const [showMinuteDropdown, setShowMinuteDropdown] = useState(false)
187
189
 
188
- // Clicking the clock add-on opens the dropdown
189
- useEffect(() => {
190
- if (disabled) return
191
-
192
- const addOnCard = document.querySelector(`#${uniqueId}-input`)?.closest('.text_input_wrapper_add_on')?.querySelector('.add-on-card') as HTMLElement
193
-
194
- if (addOnCard) {
195
- const handleAddOnClick = (e: Event) => {
196
- e.preventDefault()
197
- e.stopPropagation()
198
- setShowDropdown(true)
199
- }
200
-
201
- addOnCard.addEventListener('click', handleAddOnClick)
202
- addOnCard.style.cursor = 'pointer'
203
-
204
- return () => {
205
- addOnCard.removeEventListener('click', handleAddOnClick)
206
- }
207
- }
208
- }, [uniqueId, disabled, setShowDropdown])
209
-
210
190
  // Input dropdown scrolling
211
191
  const scrollDropdownToSelected = (dropdownRef: React.RefObject<HTMLDivElement>) => {
212
192
  if (dropdownRef.current) {
@@ -389,10 +369,6 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
389
369
  }
390
370
  }
391
371
 
392
- const handleHourFocus = (e: React.FocusEvent<HTMLInputElement>) => {
393
- e.target.select()
394
- }
395
-
396
372
  const handleHourBlur = () => {
397
373
  const result = normalizeHourOnBlur(hourInputValue, hour, timeFormat)
398
374
  setHour(result.hour)
@@ -417,10 +393,6 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
417
393
  }
418
394
  }
419
395
 
420
- const handleMinuteFocus = (e: React.FocusEvent<HTMLInputElement>) => {
421
- e.target.select()
422
- }
423
-
424
396
  const handleMinuteBlur = () => {
425
397
  const result = normalizeMinuteOnBlur(minuteInputValue, minute)
426
398
  setMinute(result.minute)
@@ -510,30 +482,6 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
510
482
  e.preventDefault()
511
483
  setShowHourDropdown(false)
512
484
  closeDropdown()
513
- } else if (e.key === 'ArrowDown') {
514
- // ArrowDown increases value (like scrolling down a list)
515
- e.preventDefault()
516
- const { maxHour, minHour } = getHourConstraints(timeFormat)
517
- const newHour = hour >= maxHour ? minHour : hour + 1
518
- setHour(newHour)
519
- setHourInputValue(timeFormat === '24hour' ? newHour.toString().padStart(2, '0') : newHour.toString())
520
- setHasSelectedTime(true)
521
- const timeString = get24HourTime(newHour, minute, meridiem, timeFormat)
522
- if (onChange) {
523
- onChange(timeString)
524
- }
525
- } else if (e.key === 'ArrowUp') {
526
- // ArrowUp decreases value (like scrolling up a list)
527
- e.preventDefault()
528
- const { maxHour, minHour } = getHourConstraints(timeFormat)
529
- const newHour = hour <= minHour ? maxHour : hour - 1
530
- setHour(newHour)
531
- setHourInputValue(timeFormat === '24hour' ? newHour.toString().padStart(2, '0') : newHour.toString())
532
- setHasSelectedTime(true)
533
- const timeString = get24HourTime(newHour, minute, meridiem, timeFormat)
534
- if (onChange) {
535
- onChange(timeString)
536
- }
537
485
  }
538
486
  }
539
487
 
@@ -565,28 +513,6 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
565
513
  e.preventDefault()
566
514
  setShowMinuteDropdown(false)
567
515
  closeDropdown()
568
- } else if (e.key === 'ArrowDown') {
569
- // ArrowDown increases value (like scrolling down a list)
570
- e.preventDefault()
571
- const newMinute = minute >= 59 ? 0 : minute + 1
572
- setMinute(newMinute)
573
- setMinuteInputValue(newMinute.toString().padStart(2, '0'))
574
- setHasSelectedTime(true)
575
- const timeString = get24HourTime(hour, newMinute, meridiem, timeFormat)
576
- if (onChange) {
577
- onChange(timeString)
578
- }
579
- } else if (e.key === 'ArrowUp') {
580
- // ArrowUp decreases value (like scrolling up a list)
581
- e.preventDefault()
582
- const newMinute = minute <= 0 ? 59 : minute - 1
583
- setMinute(newMinute)
584
- setMinuteInputValue(newMinute.toString().padStart(2, '0'))
585
- setHasSelectedTime(true)
586
- const timeString = get24HourTime(hour, newMinute, meridiem, timeFormat)
587
- if (onChange) {
588
- onChange(timeString)
589
- }
590
516
  }
591
517
  }
592
518
 
@@ -699,22 +625,12 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
699
625
  >
700
626
  {label && (
701
627
  <label htmlFor={`${uniqueId}-input`}>
702
- {requiredIndicator ? (
703
- <Caption
704
- className="pb_time_picker_kit_label"
705
- marginBottom="xs"
706
- size="md"
707
- >
708
- {label} <span style={{ color: `${colors.error}` }}>{'*'}</span>
709
- </Caption>
710
- ) : (
711
- <Caption
712
- className="pb_time_picker_kit_label"
713
- marginBottom="xs"
714
- size="md"
715
- text={label}
716
- />
717
- )}
628
+ <Caption
629
+ className="pb_time_picker_kit_label"
630
+ marginBottom="xs"
631
+ size="md"
632
+ text={label}
633
+ />
718
634
  </label>
719
635
  )}
720
636
  <div className="time_picker_wrapper">
@@ -773,7 +689,6 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
773
689
  onBlur={handleHourBlur}
774
690
  onChange={handleHourChange}
775
691
  onClick={() => { setShowHourDropdown(!showHourDropdown); setShowMinuteDropdown(false) }}
776
- onFocus={handleHourFocus}
777
692
  onKeyDown={handleHourKeyDown}
778
693
  pattern="[0-9]*"
779
694
  ref={hourInputRef}
@@ -819,7 +734,6 @@ const TimePicker = (props: TimePickerProps): JSX.Element => {
819
734
  onBlur={handleMinuteBlur}
820
735
  onChange={handleMinuteChange}
821
736
  onClick={() => { setShowMinuteDropdown(!showMinuteDropdown); setShowHourDropdown(false) }}
822
- onFocus={handleMinuteFocus}
823
737
  onKeyDown={handleMinuteKeyDown}
824
738
  pattern="[0-9]*"
825
739
  ref={minuteInputRef}
@@ -1,7 +1,6 @@
1
1
  import React, { useState } from 'react'
2
2
  import TimePicker from '../../pb_time_picker/_time_picker'
3
3
  import Body from '../../pb_body/_body'
4
- import Flex from '../../pb_flex/_flex'
5
4
 
6
5
  const TimePickerOnHandler = (props) => {
7
6
  const [selectedTime, setSelectedTime] = useState('')
@@ -18,9 +17,7 @@ const TimePickerOnHandler = (props) => {
18
17
  return (
19
18
  <div>
20
19
  {(selectedTime || closedTime) && (
21
- <Flex marginBottom="sm"
22
- orientation="column"
23
- >
20
+ <div style={{ marginBottom: '16px' }}>
24
21
  {selectedTime && (
25
22
  <Body
26
23
  text={`onChange: ${selectedTime}`}
@@ -32,7 +29,7 @@ const TimePickerOnHandler = (props) => {
32
29
  text={`onClose: ${closedTime}`}
33
30
  />
34
31
  )}
35
- </Flex>
32
+ </div>
36
33
  )}
37
34
  <TimePicker
38
35
  id="time-picker-on-handler"
@@ -9,7 +9,6 @@ examples:
9
9
  - time_picker_min_max_time: Min & Max Time
10
10
  - time_picker_error: Error
11
11
  - time_picker_disabled: Disabled
12
- - time_picker_required_indicator: Required Indicator
13
12
  - time_picker_input_options: Input Options
14
13
 
15
14
 
@@ -22,5 +21,4 @@ examples:
22
21
  - time_picker_min_max_time: Min & Max Time
23
22
  - time_picker_error: Error
24
23
  - time_picker_disabled: Disabled
25
- - time_picker_required_indicator: Required Indicator
26
24
  - time_picker_on_handler: onChange & onClose Handlers
@@ -7,4 +7,3 @@ export { default as TimePickerOnHandler } from './_time_picker_on_handler.jsx'
7
7
  export { default as TimePickerMinMaxTime } from './_time_picker_min_max_time.jsx'
8
8
  export { default as TimePickerError } from './_time_picker_error.jsx'
9
9
  export { default as TimePickerDisabled } from './_time_picker_disabled.jsx'
10
- export { default as TimePickerRequiredIndicator } from './_time_picker_required_indicator.jsx'
@@ -16,8 +16,6 @@ module Playbook
16
16
  prop :name, type: Playbook::Props::String
17
17
  prop :required, type: Playbook::Props::Boolean,
18
18
  default: false
19
- prop :required_indicator, type: Playbook::Props::Boolean,
20
- default: false
21
19
  prop :show_timezone, type: Playbook::Props::Boolean,
22
20
  default: false
23
21
  prop :time_format, type: Playbook::Props::Enum,
@@ -70,7 +68,6 @@ module Playbook
70
68
  minTime: min_time,
71
69
  name: name,
72
70
  required: required,
73
- requiredIndicator: required_indicator,
74
71
  showTimezone: show_timezone,
75
72
  timeFormat: time_format,
76
73
  validationMessage: validation_message,