playbook_ui_docs 16.0.0.pre.alpha.PLAY2722advancedtableinlinerowloadingrails13598 → 16.0.0.pre.alpha.PLAY2744dropdownquickpickpt113758

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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_background/docs/_background_responsive.jsx +30 -0
  3. data/app/pb_kits/playbook/pb_background/docs/_background_responsive.md +1 -0
  4. data/app/pb_kits/playbook/pb_background/docs/example.yml +1 -0
  5. data/app/pb_kits/playbook/pb_background/docs/index.js +1 -0
  6. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection_rails.md +3 -0
  7. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection_react.md +3 -0
  8. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.html.erb +52 -0
  9. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.jsx +72 -0
  10. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.md +5 -0
  11. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.html.erb +9 -0
  12. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.jsx +33 -0
  13. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.md +3 -0
  14. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +4 -0
  15. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +3 -1
  16. data/app/pb_kits/playbook/pb_form/docs/_form_with_required_indicator.html.erb +3 -1
  17. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_input_display.html.erb +74 -0
  18. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_input_display.jsx +87 -0
  19. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_input_display.md +3 -0
  20. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +35 -33
  21. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +1 -0
  22. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_required_indicator.jsx +35 -0
  23. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_required_indicator.md +3 -0
  24. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_required_indicator.html.erb +10 -0
  25. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_required_indicator.jsx +21 -0
  26. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_required_indicator.md +3 -0
  27. data/app/pb_kits/playbook/pb_rich_text_editor/docs/example.yml +3 -0
  28. data/app/pb_kits/playbook/pb_rich_text_editor/docs/index.js +2 -0
  29. data/app/pb_kits/playbook/pb_table/docs/_sections.yml +68 -0
  30. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_input_options.html.erb +39 -0
  31. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_input_options.md +3 -0
  32. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_required_indicator.html.erb +5 -0
  33. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_required_indicator.jsx +25 -0
  34. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_required_indicator.md +3 -0
  35. data/app/pb_kits/playbook/pb_textarea/docs/example.yml +4 -1
  36. data/app/pb_kits/playbook/pb_textarea/docs/index.js +1 -0
  37. metadata +26 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 29354927436c796ae7baa3b87c13e829b6a4ebe898e9726c268652de0a34e586
4
- data.tar.gz: 3179fc9fa7cff40ef2c4aa08e4e624fc94185723b3c00b2442ef0049d08553f8
3
+ metadata.gz: 8237bdc8b6814deb10c38ac0ceae85a547317f0656e8c181a926200b73651d46
4
+ data.tar.gz: e824d0f4d6ce60e8c628b20d0e9a0d4904851e8da104087f1550871886d7f39a
5
5
  SHA512:
6
- metadata.gz: '049e8324f8769dea0031cdd58949de387823d86c48f853fb3100598822cddef8d87b95d8b340a154b685d57ee6db0551a956135f29e07ab8b02d821930b6145a'
7
- data.tar.gz: d21fe4352e541395ecaca6313eadc7ccf3e75d078aa4ce81ae6a3608e9f0b20f505be4d3c68aaa1d812714fd08c2edf922ab703e24e9f47a9a77b47b4ca9455a
6
+ metadata.gz: da439f58ae9c2dbeb906a924d155ed7bb3c6672d0fa492d6feec094a1295110759991059f3f20b1718ec07dc3018f99b3e8a0b24cde8ace1566f35bb1fdaaf3c
7
+ data.tar.gz: 5f839ec37945d4750c238b8c1b7919c2b36d1c890652477cb6ede775137c3ccddd9af640ca68a30f81923080af7a771bd0e4bbb2a5d34bce2791a88a3f719784
@@ -0,0 +1,30 @@
1
+ import React from 'react'
2
+ import Background from '../../pb_background/_background'
3
+
4
+ const BackgroundResponsive = (props) => (
5
+ <>
6
+ <Background
7
+ alt="colorful background"
8
+ backgroundColor={{ xs: "primary", sm: "warning", md: "success", lg: "error", xl: "category_1" }}
9
+ className="background lazyload"
10
+ padding="xl"
11
+ {...props}
12
+ />
13
+ <br/>
14
+ <Background
15
+ alt="colorful background"
16
+ className="background lazyload"
17
+ imageUrl={{
18
+ xs: "https://unsplash.it/500/400/?image=633",
19
+ sm: "https://images.unsplash.com/photo-1528459801416-a9e53bbf4e17?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1000&q=80",
20
+ md: "https://unsplash.it/500/400/?image=633",
21
+ lg: "https://images.unsplash.com/photo-1528459801416-a9e53bbf4e17?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1000&q=80",
22
+ xl: "https://unsplash.it/500/400/?image=633"
23
+ }}
24
+ padding="xl"
25
+ {...props}
26
+ />
27
+ </>
28
+ )
29
+
30
+ export default BackgroundResponsive
@@ -0,0 +1 @@
1
+ The `backgroundColor`, `backgroundSize`, `backgroundPosition`, `backgroundRepeat`, and `imageUrl` props support responsive sizes. To use them, pass an object to the prop containing your values relative to responsive break points. To test this here, resize your browser window to responsively change these Backgrounds' `backgroundColor` and `imageUrl`.
@@ -20,3 +20,4 @@ examples:
20
20
  - background_category: Category
21
21
  - background_size: Size
22
22
  - background_overlay: Overlay
23
+ - background_responsive: Responsive
@@ -7,3 +7,4 @@ export { default as BackgroundStatusSubtle } from './_background_status_subtle.j
7
7
  export { default as BackgroundCategory } from './_background_category.jsx'
8
8
  export { default as BackgroundSize } from './_background_size.jsx'
9
9
  export { default as BackgroundOverlay } from './_background_overlay.jsx'
10
+ export { default as BackgroundResponsive } from './_background_responsive.jsx'
@@ -0,0 +1,3 @@
1
+ The `blank_selection` prop adds a blank option at the top of the dropdown options list. This allows users to explicitly clear their selection by choosing the blank option.
2
+
3
+ The blank selection option appears as the first item in the dropdown and has an empty value (`id: ""`, `value: ""`). When selected, it effectively clears the dropdown selection.
@@ -0,0 +1,3 @@
1
+ The `blankSelection` prop adds a blank option at the top of the dropdown options list. This allows users to explicitly clear their selection by choosing the blank option.
2
+
3
+ The blank selection option appears as the first item in the dropdown and has an empty value (`id: ""`, `value: ""`). When selected, it effectively clears the dropdown selection.
@@ -0,0 +1,52 @@
1
+ <%
2
+ options = [
3
+ { label: 'United States', value: 'unitedStates', id: 'us' },
4
+ { label: 'Canada', value: 'canada', id: 'ca' },
5
+ { label: 'Pakistan', value: 'pakistan', id: 'pk' },
6
+ ]
7
+ %>
8
+
9
+ <%= pb_rails("dropdown", props: {
10
+ id: "date-range-quickpick-reset-closeable",
11
+ label: "Quick Pick",
12
+ variant: "quickpick",
13
+ clearable: false
14
+ }) %>
15
+
16
+ <%= pb_rails("button", props: {
17
+ margin_y: "md",
18
+ text: "Reset",
19
+ html_options: {
20
+ onclick: "handleReset()"
21
+ }
22
+ }) %>
23
+
24
+ <%= pb_rails("dropdown", props: {
25
+ id: "closeable-default",
26
+ options: options,
27
+ clearable: false,
28
+ default_value: options.last,
29
+ margin_bottom: "md",
30
+ label: "Default"
31
+ }) %>
32
+
33
+ <%= pb_rails("dropdown", props: {
34
+ id: "closeable-subtle",
35
+ options: options,
36
+ clearable: false,
37
+ default_value: options.second,
38
+ variant: "subtle",
39
+ separators: false,
40
+ label: "Subtle"
41
+ }) %>
42
+
43
+ <script>
44
+ function handleReset() {
45
+ const dropdown = document.querySelector("#date-range-quickpick-reset-closeable[data-pb-dropdown]");
46
+ const instance = dropdown?._pbDropdownInstance;
47
+
48
+ if (instance) {
49
+ instance.clearSelection();
50
+ }
51
+ }
52
+ </script>
@@ -0,0 +1,72 @@
1
+ import React, { useRef } from 'react'
2
+
3
+ import Button from '../../pb_button/_button'
4
+ import Dropdown from '../../pb_dropdown/_dropdown'
5
+
6
+ const DropdownWithClearable = (props) => {
7
+ const dropdownRef = useRef(null)
8
+
9
+ const options = [
10
+ {
11
+ label: "United States",
12
+ value: "unitedStates",
13
+ id: "us"
14
+ },
15
+ {
16
+ label: "Canada",
17
+ value: "canada",
18
+ id: "ca"
19
+ },
20
+ {
21
+ label: "Pakistan",
22
+ value: "pakistan",
23
+ id: "pk"
24
+ }
25
+ ]
26
+
27
+ const handleReset = () => {
28
+ if (dropdownRef.current) {
29
+ dropdownRef.current.clearSelected()
30
+ }
31
+ }
32
+
33
+ return (
34
+ <>
35
+ <Dropdown
36
+ clearable={false}
37
+ label="Quick Pick"
38
+ onSelect={() => {}}
39
+ ref={dropdownRef}
40
+ variant="quickpick"
41
+ {...props}
42
+ />
43
+ <Button
44
+ marginY="md"
45
+ onClick={handleReset}
46
+ text="Reset"
47
+ />
48
+
49
+ <Dropdown
50
+ clearable={false}
51
+ defaultValue={options[options.length - 1]}
52
+ label="Default"
53
+ marginBottom="md"
54
+ options={options}
55
+ variant="default"
56
+ {...props}
57
+ />
58
+
59
+ <Dropdown
60
+ clearable={false}
61
+ defaultValue={options[1]}
62
+ label="Subtle"
63
+ options={options}
64
+ separators={false}
65
+ variant="subtle"
66
+ {...props}
67
+ />
68
+ </>
69
+ )
70
+ }
71
+
72
+ export default DropdownWithClearable
@@ -0,0 +1,5 @@
1
+ The `clearable` prop controls whether the clear (X) button appears in the dropdown. When set to `false`, the clear button is hidden.
2
+
3
+ This is useful in two scenarios:
4
+ 1. When you have a separate "Reset" or "Defaults" button that handles clearing the selection (as shown in the Quick Pick example)
5
+ 2. When you don't want to provide any way to clear the selection (as shown in the Default and Subtle examples)
@@ -0,0 +1,9 @@
1
+ <%
2
+ options = [
3
+ { label: 'United States', value: 'unitedStates', id: 'us' },
4
+ { label: 'Canada', value: 'canada', id: 'ca' },
5
+ { label: 'Pakistan', value: 'pakistan', id: 'pk' },
6
+ ]
7
+ %>
8
+
9
+ <%= pb_rails("dropdown", props: { options: options, placeholder: "Choose a country" }) %>
@@ -0,0 +1,33 @@
1
+ import React from 'react'
2
+ import Dropdown from '../../pb_dropdown/_dropdown'
3
+
4
+ const DropdownWithPlaceholder = (props) => {
5
+
6
+ const options = [
7
+ {
8
+ label: "United States",
9
+ value: "unitedStates",
10
+ id: "us"
11
+ },
12
+ {
13
+ label: "Canada",
14
+ value: "canada",
15
+ id: "ca"
16
+ },
17
+ {
18
+ label: "Pakistan",
19
+ value: "pakistan",
20
+ id: "pk"
21
+ }
22
+ ];
23
+
24
+ return (
25
+ <Dropdown
26
+ options={options}
27
+ placeholder="Choose a country"
28
+ {...props}
29
+ />
30
+ )
31
+ }
32
+
33
+ export default DropdownWithPlaceholder
@@ -0,0 +1,3 @@
1
+ The `placeholder` prop allows you to customize the placeholder text that appears when no option is selected in the dropdown.
2
+
3
+ The placeholder prop works with all dropdown variants (`default`, `subtle`, and `quickpick`). When no option is selected, the placeholder text is displayed. When an option is selected, the placeholder is replaced by the selected option's label. The default placeholder text is "Select..." if no placeholder is provided.
@@ -21,7 +21,9 @@ examples:
21
21
  - dropdown_default_value: Default Value
22
22
  - dropdown_multi_select_with_default: Multi Select Default Value
23
23
  - dropdown_blank_selection: Blank Selection
24
+ - dropdown_with_placeholder: Placeholder
24
25
  - dropdown_separators_hidden: Separators Hidden
26
+ - dropdown_with_clearable: Clearable
25
27
  - dropdown_quickpick_rails: Quick Pick Variant
26
28
  - dropdown_quickpick_range_end_rails: Quick Pick Variant (Range Ends Today)
27
29
  - dropdown_quickpick_default_dates: Quick Pick Variant (Default Dates)
@@ -52,7 +54,9 @@ examples:
52
54
  - dropdown_default_value: Default Value
53
55
  - dropdown_multi_select_with_default: Multi Select Default Value
54
56
  - dropdown_blank_selection: Blank Selection
57
+ - dropdown_with_placeholder: Placeholder
55
58
  - dropdown_clear_selection: Clear Selection
59
+ - dropdown_with_clearable: Clearable
56
60
  - dropdown_separators_hidden: Separators Hidden
57
61
  - dropdown_with_external_control: useDropdown Hook
58
62
  - dropdown_quickpick: Quick Pick Variant
@@ -11,6 +11,7 @@ export { default as DropdownSubcomponentStructure } from './_dropdown_subcompone
11
11
  export { default as DropdownError } from './_dropdown_error.jsx'
12
12
  export { default as DropdownDefaultValue } from './_dropdown_default_value.jsx'
13
13
  export { default as DropdownBlankSelection } from './_dropdown_blank_selection.jsx'
14
+ export { default as DropdownWithPlaceholder } from './_dropdown_with_placeholder.jsx'
14
15
  export { default as DropdownClearSelection } from './_dropdown_clear_selection.jsx'
15
16
  export { default as DropdownSubtleVariant } from './_dropdown_subtle_variant.jsx'
16
17
  export { default as DropdownSeparatorsHidden } from './_dropdown_separators_hidden.jsx'
@@ -27,4 +28,5 @@ export { default as DropdownQuickpick } from './_dropdown_quickpick.jsx'
27
28
  export { default as DropdownQuickpickRangeEnd } from './_dropdown_quickpick_range_end.jsx'
28
29
  export { default as DropdownQuickpickDefaultDates } from './_dropdown_quickpick_default_dates.jsx'
29
30
  export { default as DropdownQuickpickWithDatePickers } from './_dropdown_quickpick_with_date_pickers.jsx'
30
- export { default as DropdownQuickpickCustom } from './_dropdown_quickpick_custom.jsx'
31
+ export { default as DropdownQuickpickCustom } from './_dropdown_quickpick_custom.jsx'
32
+ export { default as DropdownWithClearable } from './_dropdown_with_clearable.jsx'
@@ -1,6 +1,8 @@
1
1
  <%= pb_form_with(scope: :example, url: "", method: :get, validate: true) do |form| %>
2
2
  <%= form.text_field :example_text_field, props: { label: true, required: true, required_indicator: true } %>
3
3
  <%= form.text_field :example_text_field_2, props: { label: "Text Field Custom Label", required: true, required_indicator: true } %>
4
+ <%= form.text_area :example_text_area, props: { label: true, required: true, required_indicator: true } %>
5
+ <%= form.text_area :example_text_area_2, props: { label: "Textarea Custom Label", required: true, required_indicator: true } %>
4
6
  <%= form.email_field :example_email_field, props: { label: true, required: true, required_indicator: true } %>
5
7
  <%= form.number_field :example_number_field, props: { label: true, required: true, required_indicator: true } %>
6
8
  <%= form.search_field :example_search_field, props: { label: true, required: true, required_indicator: true } %>
@@ -11,4 +13,4 @@
11
13
  <%= action.submit %>
12
14
  <%= action.button props: { type: "reset", text: "Cancel", variant: "secondary" } %>
13
15
  <% end %>
14
- <% end %>
16
+ <% end %>
@@ -0,0 +1,74 @@
1
+ <% treeData = [{
2
+ label: "Power Home Remodeling",
3
+ value: "powerHomeRemodeling",
4
+ id: "100",
5
+ expanded: true,
6
+ children: [
7
+ {
8
+ label: "People",
9
+ value: "people",
10
+ id: "101",
11
+ expanded: true,
12
+ children: [
13
+ {
14
+ label: "Talent Acquisition",
15
+ value: "talentAcquisition",
16
+ id: "102",
17
+ },
18
+ {
19
+ label: "Business Affairs",
20
+ value: "businessAffairs",
21
+ id: "103",
22
+ children: [
23
+ {
24
+ label: "Initiatives",
25
+ value: "initiatives",
26
+ id: "104",
27
+ },
28
+ {
29
+ label: "Learning & Development",
30
+ value: "learningAndDevelopment",
31
+ id: "105",
32
+ },
33
+ ],
34
+ },
35
+ {
36
+ label: "People Experience",
37
+ value: "peopleExperience",
38
+ id: "106",
39
+ },
40
+ ],
41
+ },
42
+ {
43
+ label: "Contact Center",
44
+ value: "contactCenter",
45
+ id: "107",
46
+ children: [
47
+ {
48
+ label: "Appointment Management",
49
+ value: "appointmentManagement",
50
+ id: "108",
51
+ },
52
+ {
53
+ label: "Customer Service",
54
+ value: "customerService",
55
+ id: "109",
56
+ },
57
+ {
58
+ label: "Energy",
59
+ value: "energy",
60
+ id: "110",
61
+ },
62
+ ],
63
+ },
64
+ ],
65
+ }] %>
66
+
67
+ <%= pb_rails("multi_level_select", props: {
68
+ id: "multi-level-select-input-display-none",
69
+ name: :foo,
70
+ tree_data: treeData,
71
+ input_display: "none",
72
+ return_all_selected: true,
73
+ })
74
+ %>
@@ -0,0 +1,87 @@
1
+ import React from "react";
2
+ import MultiLevelSelect from "../_multi_level_select";
3
+
4
+ const treeData = [
5
+ {
6
+ label: "Power Home Remodeling",
7
+ value: "powerHomeRemodeling",
8
+ id: "powerhome1",
9
+ expanded: true,
10
+ children: [
11
+ {
12
+ label: "People",
13
+ value: "people",
14
+ id: "people1",
15
+ expanded: true,
16
+ children: [
17
+ {
18
+ label: "Talent Acquisition",
19
+ value: "talentAcquisition",
20
+ id: "talent1",
21
+ },
22
+ {
23
+ label: "Business Affairs",
24
+ value: "businessAffairs",
25
+ id: "business1",
26
+ children: [
27
+ {
28
+ label: "Initiatives",
29
+ value: "initiatives",
30
+ id: "initiative1",
31
+ },
32
+ {
33
+ label: "Learning & Development",
34
+ value: "learningAndDevelopment",
35
+ id: "development1",
36
+ },
37
+ ],
38
+ },
39
+ {
40
+ label: "People Experience",
41
+ value: "peopleExperience",
42
+ id: "experience1",
43
+ },
44
+ ],
45
+ },
46
+ {
47
+ label: "Contact Center",
48
+ value: "contactCenter",
49
+ id: "contact1",
50
+ children: [
51
+ {
52
+ label: "Appointment Management",
53
+ value: "appointmentManagement",
54
+ id: "appointment1",
55
+ },
56
+ {
57
+ label: "Customer Service",
58
+ value: "customerService",
59
+ id: "customer1",
60
+ },
61
+ {
62
+ label: "Energy",
63
+ value: "energy",
64
+ id: "energy1",
65
+ },
66
+ ],
67
+ },
68
+ ],
69
+ },
70
+ ];
71
+
72
+ const MultiLevelSelectInputDisplay = (props) => {
73
+ return (
74
+ <MultiLevelSelect
75
+ id="multi-level-select-input-display-none"
76
+ inputDisplay="none"
77
+ onSelect={(selectedNodes) =>
78
+ console.log("Selected Items", selectedNodes)
79
+ }
80
+ returnAllSelected
81
+ treeData={treeData}
82
+ {...props}
83
+ />
84
+ );
85
+ };
86
+
87
+ export default MultiLevelSelectInputDisplay;
@@ -0,0 +1,3 @@
1
+ Use the `inputDisplay`/`input_display` prop to optionally display only the count in the display as opposed to multiple pills. This prop is set to 'pills' by default.
2
+
3
+ **NOTE**: `inputDisplay`/`input_display` is particularly useful for larger trees that may return many pill selections, helping to keep the input field clean and compact. This prop should not be used with the Single Select variant.
@@ -1,37 +1,39 @@
1
1
  examples:
2
2
  rails:
3
- - multi_level_select_default: Default
4
- - multi_level_select_single: Single Select
5
- - multi_level_select_single_children_only: Single Select w/ Hidden Radios
6
- - multi_level_select_return_all_selected: Return All Selected
7
- - multi_level_select_selected_ids: Selected Ids
8
- - multi_level_select_with_form: With Form
9
- - multi_level_select_color: With Pills (Custom Color)
10
- - multi_level_select_reset: Reset Selection
11
- - multi_level_select_label: With Label
12
- - multi_level_select_error: Error
13
- - multi_level_select_disabled: Disabled Input
14
- - multi_level_select_disabled_options_default: Disabled Options (Default)
15
- - multi_level_select_disabled_options: Disabled Options (Return All Selected)
16
- - multi_level_select_disabled_options_parent_default: Disabled Parent Option (Default)
17
- - multi_level_select_disabled_options_parent: Disabled Parent Option (Return All Selected)
18
- - multi_level_select_single_disabled: Disabled Options (Single Select)
3
+ - multi_level_select_default: Default
4
+ - multi_level_select_single: Single Select
5
+ - multi_level_select_single_children_only: Single Select w/ Hidden Radios
6
+ - multi_level_select_return_all_selected: Return All Selected
7
+ - multi_level_select_input_display: With Input Display None
8
+ - multi_level_select_selected_ids: Selected Ids
9
+ - multi_level_select_with_form: With Form
10
+ - multi_level_select_color: With Pills (Custom Color)
11
+ - multi_level_select_reset: Reset Selection
12
+ - multi_level_select_label: With Label
13
+ - multi_level_select_error: Error
14
+ - multi_level_select_disabled: Disabled Input
15
+ - multi_level_select_disabled_options_default: Disabled Options (Default)
16
+ - multi_level_select_disabled_options: Disabled Options (Return All Selected)
17
+ - multi_level_select_disabled_options_parent_default: Disabled Parent Option (Default)
18
+ - multi_level_select_disabled_options_parent: Disabled Parent Option (Return All Selected)
19
+ - multi_level_select_single_disabled: Disabled Options (Single Select)
19
20
 
20
21
  react:
21
- - multi_level_select_default: Default
22
- - multi_level_select_react_hook: React Hook
23
- - multi_level_select_single: Single Select
24
- - multi_level_select_single_children_only: Single Select w/ Hidden Radios
25
- - multi_level_select_return_all_selected: Return All Selected
26
- - multi_level_select_selected_ids_react: Selected Ids
27
- - multi_level_select_color: With Pills (Custom Color)
28
- - multi_level_select_with_children: Checkboxes With Children
29
- - multi_level_select_with_children_with_radios: Single Select With Children
30
- - multi_level_select_label: With Label
31
- - multi_level_select_error: Error
32
- - multi_level_select_disabled: Disabled Input
33
- - multi_level_select_disabled_options_default: Disabled Options (Default)
34
- - multi_level_select_disabled_options: Disabled Options (Return All Selected)
35
- - multi_level_select_disabled_options_parent_default: Disabled Parent Option (Default)
36
- - multi_level_select_disabled_options_parent: Disabled Parent Option (Return All Selected)
37
- - multi_level_select_single_disabled: Disabled Options (Single Select)
22
+ - multi_level_select_default: Default
23
+ - multi_level_select_react_hook: React Hook
24
+ - multi_level_select_single: Single Select
25
+ - multi_level_select_single_children_only: Single Select w/ Hidden Radios
26
+ - multi_level_select_return_all_selected: Return All Selected
27
+ - multi_level_select_input_display: With Input Display None
28
+ - multi_level_select_selected_ids_react: Selected Ids
29
+ - multi_level_select_color: With Pills (Custom Color)
30
+ - multi_level_select_with_children: Checkboxes With Children
31
+ - multi_level_select_with_children_with_radios: Single Select With Children
32
+ - multi_level_select_label: With Label
33
+ - multi_level_select_error: Error
34
+ - multi_level_select_disabled: Disabled Input
35
+ - multi_level_select_disabled_options_default: Disabled Options (Default)
36
+ - multi_level_select_disabled_options: Disabled Options (Return All Selected)
37
+ - multi_level_select_disabled_options_parent_default: Disabled Parent Option (Default)
38
+ - multi_level_select_disabled_options_parent: Disabled Parent Option (Return All Selected)
39
+ - multi_level_select_single_disabled: Disabled Options (Single Select)
@@ -4,6 +4,7 @@ export { default as MultiLevelSelectSingleChildrenOnly } from './_multi_level_se
4
4
  export { default as MultiLevelSelectReturnAllSelected } from './_multi_level_select_return_all_selected.jsx'
5
5
  export { default as MultiLevelSelectSelectedIdsReact } from "./_multi_level_select_selected_ids_react.jsx"
6
6
  export { default as MultiLevelSelectColor } from './_multi_level_select_color.jsx'
7
+ export { default as MultiLevelSelectInputDisplay } from './_multi_level_select_input_display.jsx'
7
8
  export { default as MultiLevelSelectWithChildren } from './_multi_level_select_with_children.jsx'
8
9
  export { default as MultiLevelSelectWithChildrenWithRadios } from './_multi_level_select_with_children_with_radios.jsx'
9
10
  export { default as MultiLevelSelectDisabled } from './_multi_level_select_disabled.jsx'
@@ -0,0 +1,35 @@
1
+ import React from 'react'
2
+ import RichTextEditor from '../../pb_rich_text_editor/_rich_text_editor'
3
+ import { useEditor, EditorContent } from "@tiptap/react"
4
+ import StarterKit from "@tiptap/starter-kit"
5
+ import Link from '@tiptap/extension-link'
6
+
7
+
8
+ const RichTextEditorAdvancedRequiredIndicator = (props) => {
9
+
10
+ const editor = useEditor({
11
+ extensions: [
12
+ StarterKit,
13
+ Link
14
+ ],
15
+ content:"Add your text here. You can format your text, add links, quotes, and bullets."
16
+ })
17
+ if (!editor) {
18
+ return null
19
+ }
20
+
21
+ return (
22
+ <div>
23
+ <RichTextEditor
24
+ advancedEditor={editor}
25
+ label="Label"
26
+ requiredIndicator
27
+ {...props}
28
+ >
29
+ <EditorContent editor={editor}/>
30
+ </RichTextEditor>
31
+ </div>
32
+ )
33
+ }
34
+
35
+ export default RichTextEditorAdvancedRequiredIndicator
@@ -0,0 +1,3 @@
1
+ The `requiredIndicator`/`required_indicator` prop displays a red asterisk (*) next to the label, visually indicating that the field is required. This is purely visual and does not enforce validation.
2
+
3
+ You can use `requiredIndicator`/`required_indicator` with any validation approach: HTML5 validation via the `required` prop, client-side validation, or backend validation. For this reason, it works independently and doesn't need to be paired with the `required` prop.
@@ -0,0 +1,10 @@
1
+ <%= pb_rails("rich_text_editor", props: {
2
+ id: "required-indicator",
3
+ input_options: {
4
+ id: 'hidden_input_id',
5
+ name: "hidden_input_name"
6
+ },
7
+ label: "Label",
8
+ required_indicator: true,
9
+ value: "Add your text here. You can format your text, add links, quotes, and bullets."
10
+ }) %>
@@ -0,0 +1,21 @@
1
+ import React, { useState } from 'react'
2
+ import RichTextEditor from '../../pb_rich_text_editor/_rich_text_editor'
3
+
4
+ const RichTextEditorRequiredIndicator = (props) => {
5
+ const [value, setValue] = useState('Add your text here. You can format your text, add links, quotes, and bullets.'),
6
+ handleOnChange = (html) => setValue(html)
7
+
8
+ return (
9
+ <div>
10
+ <RichTextEditor
11
+ label="Label"
12
+ onChange={handleOnChange}
13
+ requiredIndicator
14
+ value={value}
15
+ {...props}
16
+ />
17
+ </div>
18
+ )
19
+ }
20
+
21
+ export default RichTextEditorRequiredIndicator
@@ -0,0 +1,3 @@
1
+ The `requiredIndicator`/`required_indicator` prop displays a red asterisk (*) next to the label, visually indicating that the field is required. This is purely visual and does not enforce validation.
2
+
3
+ You can use `requiredIndicator`/`required_indicator` with any validation approach: HTML5 validation via the `required` prop, client-side validation, or backend validation. For this reason, it works independently and doesn't need to be paired with the `required` prop.
@@ -9,6 +9,7 @@ examples:
9
9
  - rich_text_editor_templates: Templates
10
10
  # - rich_text_editor_toolbar_bottom: Toolbar Bottom
11
11
  - rich_text_editor_inline: Inline
12
+ - rich_text_editor_required_indicator: Required Indicator
12
13
  - rich_text_editor_preview: Preview
13
14
 
14
15
  react:
@@ -31,5 +32,7 @@ examples:
31
32
  - rich_text_editor_advanced_inline: Advanced (Inline)
32
33
  - rich_text_editor_advanced_height: Advanced Height
33
34
  - rich_text_editor_advanced_min_height: Advanced Min Height
35
+ - rich_text_editor_required_indicator: Required Indicator
36
+ - rich_text_editor_advanced_required_indicator: Advanced Required Indicator
34
37
  - rich_text_editor_preview: Preview
35
38
  - rich_text_editor_advanced_preview: Advanced Preview
@@ -19,3 +19,5 @@ export { default as RichTextEditorAdvancedSticky } from './_rich_text_editor_adv
19
19
  export { default as RichTextEditorAdvancedInline } from './_rich_text_editor_advanced_inline.jsx'
20
20
  export { default as RichTextEditorAdvancedHeight } from './_rich_text_editor_advanced_height.jsx'
21
21
  export { default as RichTextEditorAdvancedMinHeight } from './_rich_text_editor_advanced_min_height.jsx'
22
+ export { default as RichTextEditorRequiredIndicator } from './_rich_text_editor_required_indicator.jsx'
23
+ export { default as RichTextEditorAdvancedRequiredIndicator } from './_rich_text_editor_advanced_required_indicator.jsx'
@@ -0,0 +1,68 @@
1
+ sections:
2
+ - title: "Size & Density"
3
+ examples:
4
+ - table_sm
5
+ - table_md
6
+ - table_lg
7
+ - table_multiline
8
+ - table_single_line
9
+ - table_outer_padding
10
+
11
+ - title: "Layout & Structure"
12
+ examples:
13
+ - table_responsive_table
14
+ - table_with_subcomponents
15
+ - table_with_subcomponents_as_divs
16
+ - table_with_background_kit
17
+
18
+
19
+ - title: "Sticky & Positional Behaviors"
20
+ examples:
21
+ - table_sticky
22
+ - table_sticky_left_columns
23
+ - table_sticky_right_columns
24
+ - table_sticky_columns
25
+ - table_alignment_row
26
+ - table_alignment_column
27
+ - table_alignment_shift_row
28
+ - table_alignment_shift_data
29
+ - table_side_highlight
30
+ - table_container
31
+
32
+ - title: "Collapsible & Nested Behaviors"
33
+ examples:
34
+ - table_with_collapsible
35
+ - table_with_dynamic_collapsible
36
+ - table_with_collapsible_with_custom_click
37
+ - table_with_collapsible_with_custom_content
38
+ - table_with_collapsible_with_nested_rows
39
+ - table_with_collapsible_with_nested_table
40
+
41
+ - title: "Data Presentation"
42
+ examples:
43
+ - table_data_table
44
+ - table_vertical_border
45
+ - table_striped
46
+
47
+ - title: "Header Variants"
48
+ examples:
49
+ - table_header
50
+ - table_with_header_style_borderless
51
+ - table_with_header_style_floating
52
+
53
+ - title: "Interactive Tables"
54
+ examples:
55
+ - table_with_clickable_rows
56
+ - table_with_selectable_rows
57
+ - table_with_filter_variant
58
+ - table_with_filter_variant_with_pagination
59
+ - table_disable_hover
60
+
61
+ - title: "Table Actions"
62
+ examples:
63
+ - table_one_action
64
+ - table_two_actions
65
+ - table_two_plus_actions
66
+ - table_action_middle
67
+ - table_icon_buttons
68
+
@@ -0,0 +1,39 @@
1
+ <%= pb_rails("textarea", props: {
2
+ label: "ID on Container",
3
+ id: "container-id",
4
+ name: "comment",
5
+ rows: 4
6
+ }) %>
7
+
8
+ <br/>
9
+
10
+ <%= pb_rails("textarea", props: {
11
+ label: "ID on Textarea via input_options",
12
+ input_options: { id: "textarea-id" },
13
+ name: "comment",
14
+ rows: 4
15
+ }) %>
16
+
17
+ <br/>
18
+
19
+ <%= pb_rails("textarea", props: {
20
+ label: "Both Container and Textarea IDs",
21
+ id: "container-id-2",
22
+ input_options: { id: "textarea-id-2" },
23
+ name: "comment",
24
+ rows: 4
25
+ }) %>
26
+
27
+ <br/>
28
+
29
+ <%= pb_rails("textarea", props: {
30
+ label: "Data and ARIA Attributes",
31
+ name: "description",
32
+ rows: 4,
33
+ input_options: {
34
+ 'aria-label': "Enter description",
35
+ 'aria-describedby': "help-text",
36
+ data: { controller: "textarea", action: "focus->handleFocus" },
37
+ id: "description-textarea"
38
+ }
39
+ }) %>
@@ -0,0 +1,3 @@
1
+ Use the `input_options` / `inputOptions` prop to pass additional attributes directly to the underlying `<textarea>` element instead of the outer wrapper. This is useful for applying data attributes, custom IDs, ARIA attributes, or other HTML attributes that need to be on the textarea element itself.
2
+
3
+ Additional HTML attributes (e.g. data or ARIA attributes) can also be passed directly to the `<textarea>` via `input_options`.
@@ -0,0 +1,5 @@
1
+ <%= pb_rails("textarea", props: {
2
+ label: "Label",
3
+ placeholder: "Placeholder text",
4
+ required_indicator: true
5
+ }) %>
@@ -0,0 +1,25 @@
1
+ import React, {useState} from 'react'
2
+
3
+ import Textarea from '../_textarea'
4
+
5
+ const TextareaRequiredIndicator = (props) => {
6
+ const [value, setValue] = useState('Default value text')
7
+ const handleChange = (event) => {
8
+ setValue(event.target.value)
9
+ }
10
+ return (
11
+ <div>
12
+ <Textarea
13
+ label="Label"
14
+ name="comment"
15
+ onChange={(e) => handleChange(e)}
16
+ placeholder="Placeholder text"
17
+ requiredIndicator
18
+ value={value}
19
+ {...props}
20
+ />
21
+ </div>
22
+ )
23
+ }
24
+
25
+ export default TextareaRequiredIndicator
@@ -0,0 +1,3 @@
1
+ The `requiredIndicator`/`required_indicator` prop displays a red asterisk (*) next to the label, visually indicating that the field is required. This is purely visual and does not enforce validation.
2
+
3
+ You can use `requiredIndicator`/`required_indicator` with any validation approach: HTML5 validation via the `required` prop, client-side validation, or backend validation. For this reason, it works independently and doesn't need to be paired with the `required` prop.
@@ -8,6 +8,8 @@ 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
11
13
 
12
14
  react:
13
15
  - textarea_default: Default
@@ -17,8 +19,9 @@ examples:
17
19
  - textarea_character_counter: Character Counter
18
20
  - textarea_inline: Inline
19
21
  - textarea_emoji_mask: Emoji Mask
22
+ - textarea_required_indicator: Required Indicator
20
23
 
21
24
  swift:
22
25
  - textarea_default_swift: Default
23
26
  - textarea_error_swift: Textarea w/ Error
24
- - textarea_props_swift: ""
27
+ - textarea_props_swift: ""
@@ -5,3 +5,4 @@ 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'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: playbook_ui_docs
3
3
  version: !ruby/object:Gem::Version
4
- version: 16.0.0.pre.alpha.PLAY2722advancedtableinlinerowloadingrails13598
4
+ version: 16.0.0.pre.alpha.PLAY2744dropdownquickpickpt113758
5
5
  platform: ruby
6
6
  authors:
7
7
  - Power UX
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2026-01-19 00:00:00.000000000 Z
12
+ date: 2026-01-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: playbook_ui
@@ -231,6 +231,8 @@ files:
231
231
  - app/pb_kits/playbook/pb_background/docs/_background_light.md
232
232
  - app/pb_kits/playbook/pb_background/docs/_background_overlay.jsx
233
233
  - app/pb_kits/playbook/pb_background/docs/_background_overlay.md
234
+ - app/pb_kits/playbook/pb_background/docs/_background_responsive.jsx
235
+ - app/pb_kits/playbook/pb_background/docs/_background_responsive.md
234
236
  - app/pb_kits/playbook/pb_background/docs/_background_size.html.erb
235
237
  - app/pb_kits/playbook/pb_background/docs/_background_size.jsx
236
238
  - app/pb_kits/playbook/pb_background/docs/_background_size.md
@@ -838,6 +840,8 @@ files:
838
840
  - app/pb_kits/playbook/pb_draggable/docs/index.js
839
841
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection.html.erb
840
842
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection.jsx
843
+ - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection_rails.md
844
+ - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection_react.md
841
845
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_clear_selection.jsx
842
846
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_clear_selection.md
843
847
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.jsx
@@ -899,6 +903,9 @@ files:
899
903
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb
900
904
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.jsx
901
905
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md
906
+ - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.html.erb
907
+ - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.jsx
908
+ - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.md
902
909
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_active_style_options.jsx
903
910
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_active_style_options_react.md
904
911
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx
@@ -929,6 +936,9 @@ files:
929
936
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.html.erb
930
937
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.jsx
931
938
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.md
939
+ - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.html.erb
940
+ - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.jsx
941
+ - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.md
932
942
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx
933
943
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md
934
944
  - app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb
@@ -1409,6 +1419,9 @@ files:
1409
1419
  - app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.md
1410
1420
  - app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb
1411
1421
  - app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx
1422
+ - app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_input_display.html.erb
1423
+ - app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_input_display.jsx
1424
+ - app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_input_display.md
1412
1425
  - app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb
1413
1426
  - app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx
1414
1427
  - app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx
@@ -1909,6 +1922,8 @@ files:
1909
1922
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_min_height.jsx
1910
1923
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_min_height.md
1911
1924
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_preview.jsx
1925
+ - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_required_indicator.jsx
1926
+ - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_required_indicator.md
1912
1927
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_simple.jsx
1913
1928
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_sticky.jsx
1914
1929
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_advanced_sticky.md
@@ -1926,6 +1941,9 @@ files:
1926
1941
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_more_extensions.md
1927
1942
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_preview.html.erb
1928
1943
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_preview.jsx
1944
+ - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_required_indicator.html.erb
1945
+ - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_required_indicator.jsx
1946
+ - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_required_indicator.md
1929
1947
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_simple.html.erb
1930
1948
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_simple.jsx
1931
1949
  - app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_sticky.html.erb
@@ -2126,6 +2144,7 @@ files:
2126
2144
  - app/pb_kits/playbook/pb_stat_value/docs/example.yml
2127
2145
  - app/pb_kits/playbook/pb_stat_value/docs/index.js
2128
2146
  - app/pb_kits/playbook/pb_table/docs/_description.md
2147
+ - app/pb_kits/playbook/pb_table/docs/_sections.yml
2129
2148
  - app/pb_kits/playbook/pb_table/docs/_table_action_middle.html.erb
2130
2149
  - app/pb_kits/playbook/pb_table/docs/_table_action_middle.jsx
2131
2150
  - app/pb_kits/playbook/pb_table/docs/_table_action_middle.md
@@ -2324,7 +2343,12 @@ files:
2324
2343
  - app/pb_kits/playbook/pb_textarea/docs/_textarea_error_swift.md
2325
2344
  - app/pb_kits/playbook/pb_textarea/docs/_textarea_inline.html.erb
2326
2345
  - app/pb_kits/playbook/pb_textarea/docs/_textarea_inline.jsx
2346
+ - app/pb_kits/playbook/pb_textarea/docs/_textarea_input_options.html.erb
2347
+ - app/pb_kits/playbook/pb_textarea/docs/_textarea_input_options.md
2327
2348
  - app/pb_kits/playbook/pb_textarea/docs/_textarea_props_swift.md
2349
+ - app/pb_kits/playbook/pb_textarea/docs/_textarea_required_indicator.html.erb
2350
+ - app/pb_kits/playbook/pb_textarea/docs/_textarea_required_indicator.jsx
2351
+ - app/pb_kits/playbook/pb_textarea/docs/_textarea_required_indicator.md
2328
2352
  - app/pb_kits/playbook/pb_textarea/docs/_textarea_resize.html.erb
2329
2353
  - app/pb_kits/playbook/pb_textarea/docs/_textarea_resize.jsx
2330
2354
  - app/pb_kits/playbook/pb_textarea/docs/example.yml