playbook_ui_docs 14.13.0.pre.alpha.play1754pbtagprogressradio6121 → 14.13.0.pre.alpha.play1834depupdatesass6024

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.
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: 14.13.0.pre.alpha.play1754pbtagprogressradio6121
4
+ version: 14.13.0.pre.alpha.play1834depupdatesass6024
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: 2025-02-13 00:00:00.000000000 Z
12
+ date: 2025-02-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: playbook_ui
@@ -716,8 +716,6 @@ files:
716
716
  - app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list_rails.md
717
717
  - app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table.html.erb
718
718
  - app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table.md
719
- - app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table_react.jsx
720
- - app/pb_kits/playbook/pb_draggable/docs/_draggable_with_table_react.md
721
719
  - app/pb_kits/playbook/pb_draggable/docs/example.yml
722
720
  - app/pb_kits/playbook/pb_draggable/docs/index.js
723
721
  - app/pb_kits/playbook/pb_drawer/docs/_drawer_behavior.jsx
@@ -1034,7 +1032,6 @@ files:
1034
1032
  - app/pb_kits/playbook/pb_icon/docs/example.yml
1035
1033
  - app/pb_kits/playbook/pb_icon/docs/index.js
1036
1034
  - app/pb_kits/playbook/pb_icon_button/docs/_icon_button_default.html.erb
1037
- - app/pb_kits/playbook/pb_icon_button/docs/_icon_button_sizes.html.erb
1038
1035
  - app/pb_kits/playbook/pb_icon_button/docs/example.yml
1039
1036
  - app/pb_kits/playbook/pb_icon_circle/docs/_description.md
1040
1037
  - app/pb_kits/playbook/pb_icon_circle/docs/_footer.md
@@ -1845,9 +1842,6 @@ files:
1845
1842
  - app/pb_kits/playbook/pb_table/docs/_table_vertical_border.jsx
1846
1843
  - app/pb_kits/playbook/pb_table/docs/_table_with_background_kit.html.erb
1847
1844
  - app/pb_kits/playbook/pb_table/docs/_table_with_background_kit.jsx
1848
- - app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.html.erb
1849
- - app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.jsx
1850
- - app/pb_kits/playbook/pb_table/docs/_table_with_clickable_rows.md
1851
1845
  - app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.html.erb
1852
1846
  - app/pb_kits/playbook/pb_table/docs/_table_with_collapsible.jsx
1853
1847
  - app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_rails.md
@@ -1866,9 +1860,6 @@ files:
1866
1860
  - app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table.md
1867
1861
  - app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table_rails.html.erb
1868
1862
  - app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_nested_table_rails.md
1869
- - app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.html.erb
1870
- - app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.jsx
1871
- - app/pb_kits/playbook/pb_table/docs/_table_with_selectable_rows.md
1872
1863
  - app/pb_kits/playbook/pb_table/docs/_table_with_subcomponents.jsx
1873
1864
  - app/pb_kits/playbook/pb_table/docs/_table_with_subcomponents.md
1874
1865
  - app/pb_kits/playbook/pb_table/docs/_table_with_subcomponents_as_divs.html.erb
@@ -1,90 +0,0 @@
1
- import React, { useState } from "react";
2
- import { Flex, Table, Body, Avatar, DraggableProvider } from "playbook-ui";
3
-
4
- // Initial items to be dragged
5
- const data = [
6
- {
7
- id: "1",
8
- task: "Task 1",
9
- assignee_name: "Terry Miles",
10
- assignee_img: "https://randomuser.me/api/portraits/men/44.jpg",
11
- },
12
- {
13
- id: "2",
14
- task: "Task 2",
15
- assignee_name: "Sophia Miles",
16
- assignee_img: "https://randomuser.me/api/portraits/women/8.jpg",
17
- },
18
- {
19
- id: "3",
20
- task: "Task 3",
21
- assignee_name: "Alice Jones",
22
- assignee_img: "https://randomuser.me/api/portraits/women/10.jpg",
23
- },
24
- {
25
- id: "4",
26
- task: "Task 4",
27
- assignee_name: "Mike James",
28
- assignee_img: "https://randomuser.me/api/portraits/men/8.jpg",
29
- },
30
- {
31
- id: "5",
32
- task: "Task 5",
33
- assignee_name: "James Guy",
34
- assignee_img: "https://randomuser.me/api/portraits/men/18.jpg",
35
- }
36
- ];
37
-
38
- const DraggableWithTableReact = (props) => {
39
- const [initialState, setInitialState] = useState(data);
40
-
41
- return (
42
- <>
43
- <DraggableProvider initialItems={data}
44
- onReorder={(items) => setInitialState(items)}
45
- >
46
- <Table
47
- responsive="none"
48
- size="sm"
49
- {...props}
50
- >
51
- <Table.Head>
52
- <Table.Row>
53
- <Table.Header>{"id"}</Table.Header>
54
- <Table.Header>{"name"}</Table.Header>
55
- <Table.Header>{"task number"}</Table.Header>
56
- </Table.Row>
57
- </Table.Head>
58
- <Table.Body draggableContainer>
59
- {initialState.map(({ id, task, assignee_name, assignee_img }) => (
60
- <Table.Row
61
- dragId={id}
62
- draggableItem
63
- key={id}
64
- >
65
- <Table.Cell>{id}</Table.Cell>
66
- <Table.Cell>
67
- <Flex align="center">
68
- <Avatar
69
- imageUrl={assignee_img}
70
- size="xs"
71
- />
72
- <Body
73
- paddingLeft="xxs"
74
- text={assignee_name}
75
- {...props}
76
- />
77
- </Flex>
78
- </Table.Cell>
79
- <Table.Cell>{task}</Table.Cell>
80
- </Table.Row>
81
- ))}
82
- </Table.Body>
83
- </Table>
84
- </DraggableProvider>
85
- </>
86
-
87
- );
88
- };
89
-
90
- export default DraggableWithTableReact;
@@ -1,5 +0,0 @@
1
- The draggable kit can also be used in conjunction with the table kit to create draggable table rows. To do this:
2
-
3
- - Wrap the Table with the `DraggableProvider` and manage state as shown.
4
- - use the `draggableContainer` prop on the Table.Body to designate it as the Draggable Container
5
- - use the `draggableItem` prop on the Table.Row to designate it as the Draggable Item. Make sure to also pass id to the `dragId` prop here.
@@ -1,27 +0,0 @@
1
- <%= pb_rails("flex", props: { align: "center"}) do %>
2
- <%= pb_rails("icon_button", props: {size: "lg"}) %> <span>Large</span>
3
- <% end %>
4
-
5
- <%= pb_rails("flex", props: { align: "center" }) do %>
6
- <%= pb_rails("icon_button", props: {size: "sm"}) %> <span>Small</span>
7
- <% end %>
8
-
9
- <%= pb_rails("flex", props: { align: "center" }) do %>
10
- <%= pb_rails("icon_button", props: {size: "xs"}) %> <span>XSmall</span>
11
- <% end %>
12
-
13
- <%= pb_rails("flex", props: { align: "center", margin_top: "md" }) do %>
14
- <%= pb_rails("icon_button", props: {size: "1x"}) %> <span>1x</span>
15
- <% end %>
16
-
17
- <%= pb_rails("flex", props: { align: "center" }) do %>
18
- <%= pb_rails("icon_button", props: {size: "2x"}) %> <span>2x</span>
19
- <% end %>
20
-
21
- <%= pb_rails("flex", props: { align: "center" }) do %>
22
- <%= pb_rails("icon_button", props: {size: "3x"}) %> <span>3x</span>
23
- <% end %>
24
-
25
- <%= pb_rails("flex", props: { align: "center" }) do %>
26
- <%= pb_rails("icon_button", props: {size: "4x"}) %> <span>4x</span>
27
- <% end %>
@@ -1,47 +0,0 @@
1
- <%= pb_rails("table", props: { size: "sm" }) do %>
2
- <%= pb_rails("table/table_head") do %>
3
- <%= pb_rails("table/table_row") do %>
4
- <%= pb_rails("table/table_header", props: { text: "Column 1" }) %>
5
- <%= pb_rails("table/table_header", props: { text: "Column 2" }) %>
6
- <%= pb_rails("table/table_header", props: { text: "Column 3" }) %>
7
- <%= pb_rails("table/table_header", props: { text: "Column 4" }) %>
8
- <%= pb_rails("table/table_header", props: { text: "Column 5" }) %>
9
- <%= pb_rails("table/table_header", props: { text: "" }) %>
10
- <% end %>
11
- <% end %>
12
- <%= pb_rails("table/table_body") do %>
13
- <%= pb_rails("table/table_row", props: { cursor: "pointer", html_options: { onclick: "alert('Row 1 clicked')" } }) do %>
14
- <%= pb_rails("table/table_cell", props: { text: "Value 1" }) %>
15
- <%= pb_rails("table/table_cell", props: { text: "Value 2" }) %>
16
- <%= pb_rails("table/table_cell", props: { text: "Value 3" }) %>
17
- <%= pb_rails("table/table_cell", props: { text: "Value 4" }) %>
18
- <%= pb_rails("table/table_cell", props: { text: "Value 5" }) %>
19
- <%= pb_rails("table/table_cell", props: { text_align: "right" }) do %>
20
- <%= pb_rails("icon", props: { color: "primary_action", fixed_width: true, icon: "chevron-right", size: "xs" }) %>
21
- <% end %>
22
- <% end %>
23
-
24
- <%= pb_rails("table/table_row", props: { cursor: "pointer", html_options: { onclick: "alert('Row 2 clicked')" } }) do %>
25
- <%= pb_rails("table/table_cell", props: { text: "Value 1" }) %>
26
- <%= pb_rails("table/table_cell", props: { text: "Value 2" }) %>
27
- <%= pb_rails("table/table_cell", props: { text: "Value 3" }) %>
28
- <%= pb_rails("table/table_cell", props: { text: "Value 4" }) %>
29
- <%= pb_rails("table/table_cell", props: { text: "Value 5" }) %>
30
- <%= pb_rails("table/table_cell", props: { text_align: "right" }) do %>
31
- <%= pb_rails("icon", props: { color: "primary_action", fixed_width: true, icon: "chevron-right", size: "xs" }) %>
32
- <% end %>
33
- <% end %>
34
-
35
- <%= pb_rails("table/table_row", props: { cursor: "pointer", html_options: { onclick: "alert('Row 3 clicked')" } }) do %>
36
- <%= pb_rails("table/table_cell", props: { text: "Value 1" }) %>
37
- <%= pb_rails("table/table_cell", props: { text: "Value 2" }) %>
38
- <%= pb_rails("table/table_cell", props: { text: "Value 3" }) %>
39
- <%= pb_rails("table/table_cell", props: { text: "Value 4" }) %>
40
- <%= pb_rails("table/table_cell", props: { text: "Value 5" }) %>
41
- <%= pb_rails("table/table_cell", props: { text_align: "right" }) do %>
42
- <%= pb_rails("icon", props: { color: "primary_action", fixed_width: true, icon: "chevron-right", size: "xs" }) %>
43
- <% end %>
44
- <% end %>
45
- <% end %>
46
- <% end %>
47
-
@@ -1,88 +0,0 @@
1
- import React from 'react'
2
- import { Table, Icon } from 'playbook-ui'
3
-
4
- const TableWithClickableRows = (props) => {
5
-
6
-
7
- return (
8
- <Table
9
- size="sm"
10
- {...props}
11
- >
12
- <Table.Head>
13
- <Table.Row>
14
- <Table.Header>{"Column 1"}</Table.Header>
15
- <Table.Header>{"Column 2"}</Table.Header>
16
- <Table.Header>{"Column 3"}</Table.Header>
17
- <Table.Header>{"Column 4"}</Table.Header>
18
- <Table.Header>{"Column 5"}</Table.Header>
19
- <Table.Header>{""}</Table.Header>
20
- </Table.Row>
21
- </Table.Head>
22
- <Table.Body>
23
- <Table.Row
24
- cursor="pointer"
25
- htmlOptions={{ onClick: () => alert("Row 1 clicked") }}
26
- {...props}
27
- >
28
- <Table.Cell>{"Value 1"}</Table.Cell>
29
- <Table.Cell>{"Value 2"}</Table.Cell>
30
- <Table.Cell>{"Value 3"}</Table.Cell>
31
- <Table.Cell>{"Value 4"}</Table.Cell>
32
- <Table.Cell>{"Value 5"}</Table.Cell>
33
- <Table.Cell textAlign="right">
34
- <Icon
35
- color="primary_action"
36
- fixedWidth
37
- icon="chevron-right"
38
- size="xs"
39
- {...props}
40
- />
41
- </Table.Cell>
42
- </Table.Row>
43
- <Table.Row
44
- cursor="pointer"
45
- htmlOptions={{ onClick: () => alert("Row 2 clicked") }}
46
- {...props}
47
- >
48
- <Table.Cell>{"Value 1"}</Table.Cell>
49
- <Table.Cell>{"Value 2"}</Table.Cell>
50
- <Table.Cell>{"Value 3"}</Table.Cell>
51
- <Table.Cell>{"Value 4"}</Table.Cell>
52
- <Table.Cell>{"Value 5"}</Table.Cell>
53
- <Table.Cell textAlign="right">
54
- <Icon
55
- color="primary_action"
56
- fixedWidth
57
- icon="chevron-right"
58
- size="xs"
59
- {...props}
60
- />
61
- </Table.Cell>
62
- </Table.Row>
63
- <Table.Row
64
- cursor="pointer"
65
- htmlOptions={{ onClick: () => alert("Row 3 clicked") }}
66
- {...props}
67
- >
68
- <Table.Cell>{"Value 1"}</Table.Cell>
69
- <Table.Cell>{"Value 2"}</Table.Cell>
70
- <Table.Cell>{"Value 3"}</Table.Cell>
71
- <Table.Cell>{"Value 4"}</Table.Cell>
72
- <Table.Cell>{"Value 5"}</Table.Cell>
73
- <Table.Cell textAlign="right">
74
- <Icon
75
- color="primary_action"
76
- fixedWidth
77
- icon="chevron-right"
78
- size="xs"
79
- {...props}
80
- />
81
- </Table.Cell>
82
- </Table.Row>
83
- </Table.Body>
84
- </Table>
85
- )
86
- }
87
-
88
- export default TableWithClickableRows
@@ -1 +0,0 @@
1
- Clickable table rows do not require any additional props. This doc example showcases how to set them up using `html_options`/`htmlOptions` and click events. Using the global prop for cursor to set it to "pointer" is also recommended for better UX.
@@ -1,96 +0,0 @@
1
- <% checkboxes = [
2
- { name: 'Coffee', id: 'coffee', checked: false },
3
- { name: 'Ice Cream', id: 'ice-cream', checked: false },
4
- { name: 'Chocolate', id: 'chocolate', checked: true }
5
- ] %>
6
-
7
- <%= pb_rails("flex", props: { justify: "end", margin_bottom: "sm" }) do %>
8
- <%= pb_rails("flex", props: { justify: "end", margin_bottom: "sm" }) do %>
9
- <%= pb_rails("button", props: { text: "Delete", id: "delete-button" }) %>
10
- <% end %>
11
- <% end %>
12
-
13
- <%= pb_rails("table", props: { size: "sm" }) do %>
14
- <%= pb_rails("table/table_head") do %>
15
- <%= pb_rails("table/table_row") do %>
16
- <%= pb_rails("table/table_header") do %>
17
- <%= pb_rails("checkbox", props: {
18
- checked: true,
19
- value: "checkbox-value",
20
- name: "main-checkbox-selectable",
21
- indeterminate: true,
22
- id: "checkbox-selectable"
23
- }) %>
24
- <% end %>
25
- <%= pb_rails("table/table_header", props: { text: "Column 1" }) %>
26
- <%= pb_rails("table/table_header", props: { text: "Column 2" }) %>
27
- <%= pb_rails("table/table_header", props: { text: "Column 3" }) %>
28
- <%= pb_rails("table/table_header", props: { text: "Column 4" }) %>
29
- <%= pb_rails("table/table_header", props: { text: "Column 5" }) %>
30
- <% end %>
31
- <% end %>
32
- <%= pb_rails("table/table_body") do %>
33
- <% checkboxes.each_with_index do |checkbox, index| %>
34
- <%= pb_rails("table/table_row") do %>
35
- <%= pb_rails("table/table_cell") do %>
36
- <%= pb_rails("checkbox", props: { checked: checkbox[:checked], id: "#{checkbox[:id]}-selectable-checkbox", name: "#{checkbox[:id]}-selectable-checkbox", on_change: "updateCheckboxes(#{index})", value: "check-box value" }) %>
37
- <% end %>
38
- <%= pb_rails("table/table_cell") do %>
39
- <%= pb_rails("image", props: { alt: "picture of a misty forest", size: "xs", url: "https://unsplash.it/500/400/?image=634" }) %>
40
- <% end %>
41
- <%= pb_rails("table/table_cell", props: { text: "Value 2" }) %>
42
- <%= pb_rails("table/table_cell", props: { text: "Value 3" }) %>
43
- <%= pb_rails("table/table_cell", props: { text: "Value 4" }) %>
44
- <%= pb_rails("table/table_cell", props: { text: "Value 5" }) %>
45
- <% end %>
46
- <% end %>
47
- <% end %>
48
- <% end %>
49
-
50
- <script>
51
- document.addEventListener('DOMContentLoaded', function() {
52
- const mainCheckboxWrapper = document.getElementById('checkbox-selectable');
53
- const mainCheckbox = document.getElementsByName("main-checkbox-selectable")[0];
54
- const childCheckboxes = document.querySelectorAll('input[type="checkbox"][id$="selectable-checkbox"]');
55
- const deleteButton = document.getElementById('delete-button');
56
-
57
- const updateDeleteButton = () => {
58
- const anyChecked = Array.from(childCheckboxes).some(checkbox => checkbox.checked);
59
- deleteButton.style.display = anyChecked ? 'block' : 'none';
60
- };
61
-
62
- const updateMainCheckbox = () => {
63
- // Count the number of checked child checkboxes
64
- const checkedCount = Array.from(childCheckboxes).filter(cb => cb.checked).length;
65
- // Determine if the main checkbox should be in an indeterminate state
66
- const indeterminate = checkedCount > 0 && checkedCount < childCheckboxes.length;
67
-
68
- // Set the main checkbox states
69
- mainCheckbox.indeterminate = indeterminate;
70
- mainCheckbox.checked = checkedCount > 0;
71
-
72
- // Determine the icon class to add and remove based on the number of checked checkboxes
73
- const iconClassToAdd = checkedCount === 0 ? 'pb_checkbox_checkmark' : 'pb_checkbox_indeterminate';
74
- const iconClassToRemove = checkedCount === 0 ? 'pb_checkbox_indeterminate' : 'pb_checkbox_checkmark';
75
-
76
- // Add and remove the icon class to the main checkbox wrapper
77
- mainCheckboxWrapper.querySelector('[data-pb-checkbox-icon-span]').classList.add(iconClassToAdd);
78
- mainCheckboxWrapper.querySelector('[data-pb-checkbox-icon-span]').classList.remove(iconClassToRemove);
79
-
80
- // Toggle the visibility of the checkbox icon based on the indeterminate state
81
- mainCheckboxWrapper.getElementsByClassName("indeterminate_icon")[0].classList.toggle('hidden', !indeterminate);
82
- mainCheckboxWrapper.getElementsByClassName("check_icon")[0].classList.toggle('hidden', indeterminate);
83
-
84
- updateDeleteButton();
85
- };
86
-
87
- mainCheckbox.addEventListener('change', function() {
88
- childCheckboxes.forEach(cb => cb.checked = this.checked);
89
- updateMainCheckbox();
90
- });
91
-
92
- childCheckboxes.forEach(cb => {
93
- cb.addEventListener('change', updateMainCheckbox);
94
- });
95
- });
96
- </script>
@@ -1,101 +0,0 @@
1
- import React, { useState } from 'react'
2
- import { Table, Checkbox, Image, Flex, Button } from 'playbook-ui'
3
-
4
- const TableWithSelectableRows = (props) => {
5
- const [checkboxes, setCheckboxes] = useState([
6
- { name: "Coffee", checked: false },
7
- { name: "Ice Cream", checked: false },
8
- { name: "Chocolate", checked: true },
9
- ]);
10
-
11
- const isAllChecked = !checkboxes.find((checkbox) => !checkbox.checked);
12
- const isNoneChecked = !checkboxes.find((checkbox) => checkbox.checked);
13
-
14
- const processCheckboxes = (checked) =>
15
- checkboxes.slice(0).map((checkbox) => {
16
- checkbox.checked = checked;
17
- return checkbox;
18
- });
19
-
20
- const onToggleAll = () => {
21
- setCheckboxes(
22
- isNoneChecked ? processCheckboxes(true) : processCheckboxes(false)
23
- );
24
- };
25
-
26
- const updateCheckboxes = (checkbox, index) => {
27
- const newCheckboxes = checkboxes.slice(0);
28
- newCheckboxes[index].checked = !checkbox.checked;
29
- setCheckboxes(newCheckboxes);
30
- };
31
-
32
- return (
33
- <>
34
- <Flex
35
- justify="end"
36
- marginBottom="sm"
37
- >
38
- {!isNoneChecked && (
39
- <Flex
40
- justify="end"
41
- marginBottom="sm"
42
- >
43
- <Button>Delete</Button>
44
- </Flex>
45
- )}
46
- </Flex>
47
- <Table
48
- size="sm"
49
- {...props}
50
- >
51
- <Table.Head>
52
- <Table.Row>
53
- <Table.Header>
54
- <Checkbox
55
- checked={isAllChecked}
56
- indeterminate={!isAllChecked && !isNoneChecked}
57
- name="checkbox-name"
58
- onChange={onToggleAll}
59
- value="check-box value"
60
- />
61
- </Table.Header>
62
- <Table.Header>{"Column 1"}</Table.Header>
63
- <Table.Header>{"Column 2"}</Table.Header>
64
- <Table.Header>{"Column 3"}</Table.Header>
65
- <Table.Header>{"Column 4"}</Table.Header>
66
- <Table.Header>{"Column 5"}</Table.Header>
67
- </Table.Row>
68
- </Table.Head>
69
- <Table.Body>
70
- {checkboxes.map((checkbox, index) => (
71
- <Table.Row key={index}>
72
- <Table.Cell>
73
- <Checkbox
74
- checked={checkbox.checked}
75
- name={checkbox.name}
76
- onChange={() => {
77
- updateCheckboxes(checkbox, index);
78
- }}
79
- value="check-box value"
80
- />
81
- </Table.Cell>
82
- <Table.Cell>
83
- <Image
84
- alt="picture of a misty forest"
85
- size="xs"
86
- url="https://unsplash.it/500/400/?image=634"
87
- />
88
- </Table.Cell>
89
- <Table.Cell>{"Value 2"}</Table.Cell>
90
- <Table.Cell>{"Value 3"}</Table.Cell>
91
- <Table.Cell>{"Value 4"}</Table.Cell>
92
- <Table.Cell>{"Value 5"}</Table.Cell>
93
- </Table.Row>
94
- ))}
95
- </Table.Body>
96
- </Table>
97
- </>
98
- )
99
- }
100
-
101
- export default TableWithSelectableRows
@@ -1 +0,0 @@
1
- Use the Checkbox kit with the Table to achieve the selectable row functionality seen here.