playbook_ui 7.4.0.pre.alpha2 → 7.4.0.pre.alpha4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +1 -1
  3. data/app/pb_kits/playbook/data/menu.yml +1 -1
  4. data/app/pb_kits/playbook/index.js +2 -1
  5. data/app/pb_kits/playbook/pb_checkbox/_checkbox.html.erb +3 -2
  6. data/app/pb_kits/playbook/pb_checkbox/_checkbox.jsx +2 -1
  7. data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +4 -1
  8. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_default.html.erb +5 -2
  9. data/app/pb_kits/playbook/pb_list/_list.jsx +9 -2
  10. data/app/pb_kits/playbook/pb_radio/_radio.jsx +0 -3
  11. data/app/pb_kits/playbook/pb_selectable_list/_item.jsx +90 -0
  12. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.html.erb +11 -0
  13. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.jsx +47 -0
  14. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.scss +17 -0
  15. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list_item.html.erb +18 -0
  16. data/app/pb_kits/playbook/pb_selectable_list/docs/_description.md +3 -0
  17. data/app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_checkbox.html.erb +44 -0
  18. data/app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_checkbox.jsx +44 -0
  19. data/app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_radio.html.erb +44 -0
  20. data/app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_radio.jsx +44 -0
  21. data/app/pb_kits/playbook/pb_selectable_list/docs/example.yml +12 -0
  22. data/app/pb_kits/playbook/pb_selectable_list/docs/index.js +2 -0
  23. data/app/pb_kits/playbook/pb_selectable_list/selectable_list.rb +24 -0
  24. data/app/pb_kits/playbook/pb_selectable_list/selectable_list_item.rb +28 -0
  25. data/app/pb_kits/playbook/vendor.js +0 -3
  26. data/lib/playbook/version.rb +2 -1
  27. metadata +17 -19
  28. data/app/pb_kits/playbook/pb_collapsible/_collapsible.html.erb +0 -9
  29. data/app/pb_kits/playbook/pb_collapsible/_collapsible.jsx +0 -77
  30. data/app/pb_kits/playbook/pb_collapsible/_collapsible.scss +0 -17
  31. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.jsx +0 -40
  32. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.jsx +0 -58
  33. data/app/pb_kits/playbook/pb_collapsible/child_kits/_collapsible_content.html.erb +0 -7
  34. data/app/pb_kits/playbook/pb_collapsible/child_kits/_collapsible_main.html.erb +0 -16
  35. data/app/pb_kits/playbook/pb_collapsible/collapsible.rb +0 -15
  36. data/app/pb_kits/playbook/pb_collapsible/collapsible_content.rb +0 -21
  37. data/app/pb_kits/playbook/pb_collapsible/collapsible_main.rb +0 -24
  38. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_dark.html.erb +0 -10
  39. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_dark.jsx +0 -17
  40. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.html.erb +0 -10
  41. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.jsx +0 -19
  42. data/app/pb_kits/playbook/pb_collapsible/docs/example.yml +0 -9
  43. data/app/pb_kits/playbook/pb_collapsible/docs/index.js +0 -2
  44. data/app/pb_kits/playbook/pb_collapsible/index.js +0 -82
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fc2cc41654667d4db62667450bd430b73beb0746bff14266498b5f99ec5909a3
4
- data.tar.gz: 89ec1b4304d12c8101ee5b61637e5ef22a8d3295e041633873a7a42892ddef56
3
+ metadata.gz: 8726cbbab00028f7806eb10818f34d7ddf96a2062eb5e622cafc48ed5fbb0f06
4
+ data.tar.gz: 5e3950f9f49b60f8352696d0fb65556c8bae22a5b98ee96e4b884436a1100dcd
5
5
  SHA512:
6
- metadata.gz: a5cba0cc9c3b7e04462251f81c75326a04a89960efe3dcbf8d811f1f28c2858bab565bdf53c11cb78ab3c86a95e6f78de41577ac3309d607f5021afd8ddcb90b
7
- data.tar.gz: 77bc046395a15e34958c54a2951862870e69a36413535d4ae53c0437857b91145eb7a2770c45026c0d0ef6b7c7fe0b427924edc931fff8f9770a05319984b726
6
+ metadata.gz: c2e71b8fa575342d64d0da90c8209419e5b285bd0448d70fc852feb3193b472fb4b90bfc43be07afaa82714e8cc9011b14742732dd90cee3eaa07a97dfed947f
7
+ data.tar.gz: 71f2eec168af57a379532750ec46fe547eec62826d4b4100b60bcf5215d56548dd43917c8bf7d188c1aa41fb0b9a3874b1cf0653ff07f7b7f16de70ee38f1b89
@@ -12,7 +12,6 @@
12
12
  @import 'pb_checkbox/checkbox';
13
13
  @import 'pb_circle_chart/circle_chart';
14
14
  @import 'pb_circle_icon_button/circle_icon_button';
15
- @import 'pb_collapsible/collapsible';
16
15
  @import 'pb_contact/contact';
17
16
  @import 'pb_currency/currency';
18
17
  @import 'pb_dashboard_value/dashboard_value';
@@ -63,6 +62,7 @@
63
62
  @import 'pb_selectable_card/selectable_card';
64
63
  @import 'pb_selectable_card_icon/selectable_card_icon';
65
64
  @import 'pb_selectable_icon/selectable_icon';
65
+ @import 'pb_selectable_list/selectable_list';
66
66
  @import 'pb_source/source';
67
67
  @import 'pb_star_rating/star_rating';
68
68
  @import 'pb_stat_change/stat_change';
@@ -13,7 +13,6 @@ kits:
13
13
  - circle_icon_button
14
14
  - card
15
15
  - checkbox
16
- - collapsible
17
16
  - charts_and_graphs:
18
17
  - bar_graph
19
18
  - circle_chart
@@ -35,6 +34,7 @@ kits:
35
34
  - selectable_card
36
35
  - selectable_card_icon
37
36
  - selectable_icon
37
+ - selectable_list
38
38
  - text_input
39
39
  - textarea
40
40
  - typeahead
@@ -15,7 +15,6 @@ export Card from './pb_card/_card.jsx'
15
15
  export Checkbox from './pb_checkbox/_checkbox.jsx'
16
16
  export CircleChart from './pb_circle_chart/_circle_chart.jsx'
17
17
  export CircleIconButton from './pb_circle_icon_button/_circle_icon_button.jsx'
18
- export Collapsible from './pb_collapsible/_collapsible.jsx'
19
18
  export Contact from './pb_contact/_contact.jsx'
20
19
  export Currency from './pb_currency/_currency.jsx'
21
20
  export DashboardValue from './pb_dashboard_value/_dashboard_value.jsx'
@@ -69,6 +68,8 @@ export Select from './pb_select/_select.jsx'
69
68
  export SelectableCard from './pb_selectable_card/_selectable_card.jsx'
70
69
  export SelectableCardIcon from './pb_selectable_card_icon/_selectable_card_icon.jsx'
71
70
  export SelectableIcon from './pb_selectable_icon/_selectable_icon.jsx'
71
+ export SelectableList from './pb_selectable_list/_selectable_list.jsx'
72
+ export SelectableListItem from './pb_selectable_list/_item.jsx'
72
73
  export Source from './pb_source/_source.jsx'
73
74
  export StarRating from './pb_star_rating/_star_rating.jsx'
74
75
  export StatChange from './pb_stat_change/_stat_change.jsx'
@@ -1,10 +1,11 @@
1
1
  <%= content_tag(:label, aria: object.aria,
2
2
  id: object.id,
3
3
  data: object.data,
4
- class: object.classname) do %>
4
+ class: object.classname,
5
+ for: object.for_attribute ) do %>
5
6
  <% if object.children %>
6
7
  <%= capture(&object.children) %>
7
- <% else %>
8
+ <% else %>
8
9
  <%= object.input %>
9
10
  <% end %>
10
11
  <span class="pb_checkbox_checkmark">
@@ -51,13 +51,14 @@ const Checkbox = (props: CheckboxProps) => {
51
51
  {...ariaProps}
52
52
  {...dataProps}
53
53
  className={classes}
54
- id={id}
54
+ htmlFor={id}
55
55
  >
56
56
  <If condition={children}>
57
57
  {children}
58
58
  <Else />
59
59
  <input
60
60
  defaultChecked={checked}
61
+ id={id}
61
62
  name={name}
62
63
  onChange={onChange}
63
64
  type="checkbox"
@@ -14,7 +14,6 @@ module Playbook
14
14
  prop :text
15
15
  prop :value
16
16
  prop :name
17
-
18
17
  prop :input_options, type: Playbook::Props::Hash,
19
18
  default: {}
20
19
  prop :required, type: Playbook::Props::Boolean,
@@ -34,6 +33,10 @@ module Playbook
34
33
  check_box_tag(name, value, checked, input_options)
35
34
  end
36
35
 
36
+ def for_attribute
37
+ input_options[:id]
38
+ end
39
+
37
40
  def checkbox_label_status
38
41
  error ? "negative" : nil
39
42
  end
@@ -1,5 +1,8 @@
1
1
  <%= pb_rails("checkbox" , props: {
2
2
  text: "Checkbox Label",
3
- value: "checkbox-value",
4
- name: "checkbox-name"
3
+ input_options: {
4
+ value: "checkbox-value",
5
+ name: "checkbox-name",
6
+ id: "label-id",
7
+ }
5
8
  }) %>
@@ -17,7 +17,9 @@ type ListProps = {
17
17
  ordered: boolean,
18
18
  role?: string,
19
19
  tabIndex?: string,
20
+ text?: string,
20
21
  size?: string,
22
+ variant?: string,
21
23
  xpadding: boolean,
22
24
  }
23
25
 
@@ -36,6 +38,8 @@ const List = (props: ListProps) => {
36
38
  size = '',
37
39
  tabIndex,
38
40
  xpadding = false,
41
+ variant,
42
+ text,
39
43
  } = props
40
44
 
41
45
  const layoutClass = {
@@ -44,6 +48,9 @@ const List = (props: ListProps) => {
44
48
  default: '',
45
49
  }
46
50
 
51
+ const childrenWithProps = React.Children.map(children, (child) => {
52
+ return React.cloneElement(child, { text, variant })
53
+ })
47
54
  const ariaProps = buildAriaProps(aria)
48
55
  const dataProps = buildDataProps(data)
49
56
  const classes = classnames(
@@ -70,7 +77,7 @@ const List = (props: ListProps) => {
70
77
  role={role}
71
78
  tabIndex={tabIndex}
72
79
  >
73
- {children}
80
+ {childrenWithProps}
74
81
  </ol>
75
82
  <Else />
76
83
  <ul
@@ -81,7 +88,7 @@ const List = (props: ListProps) => {
81
88
  role={role}
82
89
  tabIndex={tabIndex}
83
90
  >
84
- {children}
91
+ {childrenWithProps}
85
92
  </ul>
86
93
  </If>
87
94
  </div>
@@ -19,7 +19,6 @@ type RadioProps = {
19
19
  label: String,
20
20
  name: String,
21
21
  value: String,
22
- text: String,
23
22
  onChange: (Boolean)=>void,
24
23
  }
25
24
 
@@ -33,7 +32,6 @@ const Radio = ({
33
32
  id,
34
33
  label,
35
34
  name = 'radio_name',
36
- text = 'Radio Text',
37
35
  value = 'radio_text',
38
36
  onChange = () => {},
39
37
  ...props
@@ -57,7 +55,6 @@ const Radio = ({
57
55
  id={id}
58
56
  name={name}
59
57
  onChange={onChange}
60
- text={text}
61
58
  type="radio"
62
59
  value={value}
63
60
  />
@@ -0,0 +1,90 @@
1
+ /* @flow */
2
+ import React, { Node } from 'react'
3
+ import classnames from 'classnames'
4
+ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
5
+ import { globalProps } from '../utilities/globalProps.js'
6
+ import { Checkbox, ListItem, Radio } from '..'
7
+
8
+ type SelectableListItemProps = {
9
+ aria?: object,
10
+ children: array<Node> | Node,
11
+ checked?: boolean,
12
+ className?: string,
13
+ data?: object,
14
+ defaultChecked?: boolean,
15
+ id?: string,
16
+ label?: string,
17
+ text?: string,
18
+ name?: string,
19
+ value?: string,
20
+ variant?: string,
21
+ onChange: (boolean)=>void,
22
+ }
23
+
24
+ const SelectableListItem = ({
25
+ aria = {},
26
+ checked = false,
27
+ children,
28
+ className,
29
+ data = {},
30
+ defaultChecked,
31
+ id,
32
+ label,
33
+ text = '',
34
+ name = '',
35
+ value = '',
36
+ variant,
37
+ onChange = () => {},
38
+ ...props
39
+ }: SelectableListItemProps) => {
40
+ const ariaProps = buildAriaProps(aria)
41
+ const dataProps = buildDataProps(data)
42
+ const classes = classnames(
43
+ buildCss('pb_selectable_list_item_kit'),
44
+ globalProps(props),
45
+ className
46
+ )
47
+
48
+ return (
49
+ <ListItem {...props}>
50
+ <div
51
+ {...ariaProps}
52
+ {...dataProps}
53
+ className={classes}
54
+ >
55
+ <Choose>
56
+ <When condition={variant == 'checkbox'}>
57
+ <Checkbox
58
+ checked={checked}
59
+ id={id}
60
+ name={name}
61
+ onChange={onChange}
62
+ // eslint suppressor, text is needed to display on screen
63
+ text={label || (text && false)}
64
+ type="checkbox"
65
+ value={value}
66
+ {...props}
67
+ />
68
+ {children}
69
+ </When>
70
+ <When condition={variant == 'radio'}>
71
+ <Radio
72
+ defaultChecked={defaultChecked}
73
+ id={id}
74
+ label={label}
75
+ name={name}
76
+ onChange={onChange}
77
+ type="radio"
78
+ value={value}
79
+ {...props}
80
+ />
81
+ {children}
82
+ </When>
83
+ <Otherwise>{children}</Otherwise>
84
+ </Choose>
85
+ </div>
86
+ </ListItem>
87
+ )
88
+ }
89
+
90
+ export default SelectableListItem
@@ -0,0 +1,11 @@
1
+ <%= content_tag(:div,
2
+ aria: object.aria,
3
+ class: object.classname,
4
+ data: object.data,
5
+ id: object.id) do %>
6
+ <%= pb_rails("list") do %>
7
+ <% object.items.each do |item| %>
8
+ <%= pb_rails("selectable_list/selectable_list_item", props: item.merge(variant: object.variant) )%>
9
+ <% end %>
10
+ <% end %>
11
+ <% end %>
@@ -0,0 +1,47 @@
1
+ /* @flow */
2
+ import React from 'react'
3
+ import classnames from 'classnames'
4
+ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
5
+ import { globalProps } from '../utilities/globalProps.js'
6
+ import { List } from '..'
7
+ import SelectableListItem from './_item.jsx'
8
+
9
+ type SelectableListProps = {
10
+ aria?: object,
11
+ children?: Node,
12
+ className?: string,
13
+ data?: object,
14
+ id?: string,
15
+ variant?: 'checkbox' | 'radio',
16
+ }
17
+
18
+ const SelectableList = (props: SelectableListProps) => {
19
+ const {
20
+ aria = {},
21
+ children,
22
+ className,
23
+ data = {},
24
+ id,
25
+ } = props
26
+
27
+ const ariaProps = buildAriaProps(aria)
28
+ const classes = classnames(buildCss('pb_selectable_list_kit'), globalProps(props), className)
29
+ const dataProps = buildDataProps(data)
30
+
31
+ return (
32
+ <div
33
+ {...ariaProps}
34
+ {...dataProps}
35
+ className={classes}
36
+ id={id}
37
+ >
38
+ <List {...props}>
39
+ {children}
40
+ </List>
41
+ </div>
42
+ )
43
+ }
44
+
45
+ SelectableList.Item = SelectableListItem
46
+
47
+ export default SelectableList
@@ -0,0 +1,17 @@
1
+ @import "../tokens/colors";
2
+ @import "../tokens/spacing";
3
+
4
+ [class^=pb_selectable_list]{
5
+ margin-bottom: 0px;
6
+ [class^=pb_item_kit] {
7
+ &:hover {
8
+ background-color: $bg_light;
9
+ }
10
+ }
11
+ [class^=pb_radio_kit] {
12
+ margin-left: $space_xs;
13
+ }
14
+ [class^=pb_checkbox_kit] {
15
+ margin-left: $space_xs;
16
+ }
17
+ }
@@ -0,0 +1,18 @@
1
+ <%= content_tag(:li,
2
+ aria: object.aria,
3
+ class: object.classname,
4
+ data: object.data,
5
+ id: object.id) do %>
6
+ <% puts object.variant %>
7
+ <% if object.variant == "radio"%>
8
+ <%= pb_rails("radio", props: { text: object.text, checked: object.checked, input_options: object.input_options } ) %>
9
+ <% if object.children.present? %>
10
+ <%= capture(&object.children) %>
11
+ <% end %>
12
+ <% else %>
13
+ <%= pb_rails("checkbox", props: { text: object.text, checked: object.checked, input_options: object.input_options } ) %>
14
+ <% if object.children.present? %>
15
+ <%= capture(&object.children) %>
16
+ <% end %>
17
+ <% end %>
18
+ <% end %>
@@ -0,0 +1,3 @@
1
+ Selectable List Kit can take variants checkbox and radio. Regardless of which variant type, each selectable list item needs a `value`, `name`, and `id` (these props are `<input>` attributes).
2
+
3
+ The Selectable List Item`id` prop will provide the `for` attribute to `<label>` in the kit, so no additional attributes are needed for the association between `<label>` and `<input>`.
@@ -0,0 +1,44 @@
1
+ <%= pb_rails("selectable_list",
2
+ props: {
3
+ variant: "checkbox",
4
+ items: [
5
+ { text: "Monday",
6
+ input_options: {
7
+ value: "1",
8
+ name: "checkbox-name-1",
9
+ id: "checkbox-id-1",
10
+ }
11
+ },
12
+ { text: "Tuesday",
13
+ checked: true,
14
+ input_options: {
15
+ value: "2",
16
+ name: "checkbox-name-2",
17
+ id: "checkbox-id-2",
18
+ }
19
+ },
20
+ { text: "Wednesday",
21
+ input_options: {
22
+ value: "3",
23
+ name: "checkbox-name-3",
24
+ id: "checkbox-id-3",
25
+ }
26
+ },
27
+ { text: "Thursday",
28
+ input_options: {
29
+ value: "4",
30
+ name: "checkbox-name-4",
31
+ id: "checkbox-id-4",
32
+ }
33
+ },
34
+ { text: "Friday",
35
+ input_options: {
36
+ value: "5",
37
+ name: "checkbox-name-5",
38
+ id: "checkbox-id-5",
39
+ }
40
+ }
41
+ ]
42
+ }
43
+ )
44
+ %>
@@ -0,0 +1,44 @@
1
+ import React from 'react'
2
+ import { SelectableList } from '../..'
3
+
4
+ const SelectableListDefault = () => {
5
+ return (
6
+ <div>
7
+ <SelectableList variant="checkbox">
8
+ <SelectableList.Item
9
+ id="checkbox-id-1"
10
+ label="Monday"
11
+ name="checkbox-name-1"
12
+ value="1"
13
+ />
14
+ <SelectableList.Item
15
+ checked
16
+ id="checkbox-id-2"
17
+ label="Tuesday"
18
+ name="checkbox-name-2"
19
+ value="2"
20
+ />
21
+ <SelectableList.Item
22
+ id="checkbox-id-3"
23
+ label="Wednesday"
24
+ name="checkbox-name-3"
25
+ value="3"
26
+ />
27
+ <SelectableList.Item
28
+ id="checkbox-id-4"
29
+ label="Thursday"
30
+ name="checkbox-name-4"
31
+ value="4"
32
+ />
33
+ <SelectableList.Item
34
+ id="checkbox-id-5"
35
+ label="Friday"
36
+ name="checkbox-name-5"
37
+ value="5"
38
+ />
39
+ </SelectableList>
40
+ </div>
41
+ )
42
+ }
43
+
44
+ export default SelectableListDefault
@@ -0,0 +1,44 @@
1
+ <%= pb_rails("selectable_list",
2
+ props: {
3
+ variant: "radio",
4
+ items: [
5
+ { text: "Monday",
6
+ input_options: {
7
+ value: "1",
8
+ name: "radio-name",
9
+ id: "radio-id-1",
10
+ }
11
+ },
12
+ { text: "Tuesday",
13
+ checked: true,
14
+ input_options: {
15
+ value: "2",
16
+ name: "radio-name",
17
+ id: "radio-id-2",
18
+ }
19
+ },
20
+ { text: "Wednesday",
21
+ input_options: {
22
+ value: "3",
23
+ name: "radio-name",
24
+ id: "radio-id-3",
25
+ }
26
+ },
27
+ { text: "Thursday",
28
+ input_options: {
29
+ value: "4",
30
+ name: "radio-name",
31
+ id: "radio-id-4",
32
+ }
33
+ },
34
+ { text: "Friday",
35
+ input_options: {
36
+ value: "5",
37
+ name: "radio-name",
38
+ id: "radio-id-5",
39
+ }
40
+ }
41
+ ]
42
+ }
43
+ )
44
+ %>
@@ -0,0 +1,44 @@
1
+ import React from 'react'
2
+ import { SelectableList } from '../..'
3
+
4
+ const SelectableListDefault = () => {
5
+ return (
6
+ <div>
7
+ <SelectableList variant="radio">
8
+ <SelectableList.Item
9
+ id="radio-id-1"
10
+ label="Monday"
11
+ name="radio"
12
+ value="1"
13
+ />
14
+ <SelectableList.Item
15
+ defaultChecked
16
+ id="radio-id-2"
17
+ label="Tuesday"
18
+ name="radio"
19
+ value="2"
20
+ />
21
+ <SelectableList.Item
22
+ id="radio-id-3"
23
+ label="Wednesday"
24
+ name="radio"
25
+ value="3"
26
+ />
27
+ <SelectableList.Item
28
+ id="radio-id-4"
29
+ label="Thursday"
30
+ name="radio"
31
+ value="4"
32
+ />
33
+ <SelectableList.Item
34
+ id="radio-id-5"
35
+ label="Friday"
36
+ name="radio"
37
+ value="5"
38
+ />
39
+ </SelectableList>
40
+ </div>
41
+ )
42
+ }
43
+
44
+ export default SelectableListDefault
@@ -0,0 +1,12 @@
1
+ examples:
2
+
3
+ rails:
4
+ - selectable_list_checkbox: Selectable List Checkbox
5
+ - selectable_list_radio: Selectable List Radio
6
+
7
+
8
+ react:
9
+ - selectable_list_checkbox: Selectable List Checkbox
10
+ - selectable_list_radio: Selectable List Radio
11
+
12
+
@@ -0,0 +1,2 @@
1
+ export { default as SelectableListCheckbox } from './_selectable_list_checkbox.jsx'
2
+ export { default as SelectableListRadio } from './_selectable_list_radio.jsx'
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbSelectableList
5
+ class SelectableList
6
+ include Playbook::Props
7
+
8
+ partial "pb_selectable_list/selectable_list"
9
+
10
+ prop :variant, type: Playbook::Props::Enum,
11
+ values: %w[radio checkbox],
12
+ default: "radio"
13
+
14
+ prop :text, type: Playbook::Props::String
15
+
16
+ prop :items, type: Playbook::Props::Array,
17
+ default: []
18
+
19
+ def classname
20
+ generate_classname("pb_selectable_list_kit")
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbSelectableList
5
+ class SelectableListItem
6
+ include Playbook::Props
7
+
8
+ prop :tabindex
9
+
10
+ prop :checked, type: Playbook::Props::Boolean,
11
+ default: false
12
+ prop :name, type: Playbook::Props::String
13
+ prop :text, type: Playbook::Props::String
14
+ prop :value, type: Playbook::Props::String
15
+ prop :variant, type: Playbook::Props::Enum,
16
+ values: %w[radio checkbox],
17
+ default: "radio"
18
+ prop :input_options, type: Playbook::Props::Hash,
19
+ default: {}
20
+
21
+ partial "pb_selectable_list/selectable_list_item"
22
+
23
+ def classname
24
+ generate_classname("pb_selectable_list_item_kit")
25
+ end
26
+ end
27
+ end
28
+ end
@@ -12,9 +12,6 @@ window.datePickerHelper = datePickerHelper
12
12
  // Lazy image loading
13
13
  import 'lazysizes'
14
14
 
15
- import PbCollapsible from './pb_collapsible'
16
- PbCollapsible.start()
17
-
18
15
  import PbPopover from './pb_popover'
19
16
  PbPopover.start()
20
17
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Playbook
3
- VERSION = "7.4.0.pre.alpha2"
4
+ VERSION = "7.4.0.pre.alpha4"
4
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: playbook_ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.4.0.pre.alpha2
4
+ version: 7.4.0.pre.alpha4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Power UX
@@ -625,23 +625,6 @@ files:
625
625
  - app/pb_kits/playbook/pb_circle_icon_button/docs/_footer.md
626
626
  - app/pb_kits/playbook/pb_circle_icon_button/docs/example.yml
627
627
  - app/pb_kits/playbook/pb_circle_icon_button/docs/index.js
628
- - app/pb_kits/playbook/pb_collapsible/_collapsible.html.erb
629
- - app/pb_kits/playbook/pb_collapsible/_collapsible.jsx
630
- - app/pb_kits/playbook/pb_collapsible/_collapsible.scss
631
- - app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.jsx
632
- - app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.jsx
633
- - app/pb_kits/playbook/pb_collapsible/child_kits/_collapsible_content.html.erb
634
- - app/pb_kits/playbook/pb_collapsible/child_kits/_collapsible_main.html.erb
635
- - app/pb_kits/playbook/pb_collapsible/collapsible.rb
636
- - app/pb_kits/playbook/pb_collapsible/collapsible_content.rb
637
- - app/pb_kits/playbook/pb_collapsible/collapsible_main.rb
638
- - app/pb_kits/playbook/pb_collapsible/docs/_collapsible_dark.html.erb
639
- - app/pb_kits/playbook/pb_collapsible/docs/_collapsible_dark.jsx
640
- - app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.html.erb
641
- - app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.jsx
642
- - app/pb_kits/playbook/pb_collapsible/docs/example.yml
643
- - app/pb_kits/playbook/pb_collapsible/docs/index.js
644
- - app/pb_kits/playbook/pb_collapsible/index.js
645
628
  - app/pb_kits/playbook/pb_contact/_contact.html.erb
646
629
  - app/pb_kits/playbook/pb_contact/_contact.jsx
647
630
  - app/pb_kits/playbook/pb_contact/_contact.scss
@@ -1479,6 +1462,20 @@ files:
1479
1462
  - app/pb_kits/playbook/pb_selectable_icon/docs/example.yml
1480
1463
  - app/pb_kits/playbook/pb_selectable_icon/docs/index.js
1481
1464
  - app/pb_kits/playbook/pb_selectable_icon/selectable_icon.rb
1465
+ - app/pb_kits/playbook/pb_selectable_list/_item.jsx
1466
+ - app/pb_kits/playbook/pb_selectable_list/_selectable_list.html.erb
1467
+ - app/pb_kits/playbook/pb_selectable_list/_selectable_list.jsx
1468
+ - app/pb_kits/playbook/pb_selectable_list/_selectable_list.scss
1469
+ - app/pb_kits/playbook/pb_selectable_list/_selectable_list_item.html.erb
1470
+ - app/pb_kits/playbook/pb_selectable_list/docs/_description.md
1471
+ - app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_checkbox.html.erb
1472
+ - app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_checkbox.jsx
1473
+ - app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_radio.html.erb
1474
+ - app/pb_kits/playbook/pb_selectable_list/docs/_selectable_list_radio.jsx
1475
+ - app/pb_kits/playbook/pb_selectable_list/docs/example.yml
1476
+ - app/pb_kits/playbook/pb_selectable_list/docs/index.js
1477
+ - app/pb_kits/playbook/pb_selectable_list/selectable_list.rb
1478
+ - app/pb_kits/playbook/pb_selectable_list/selectable_list_item.rb
1482
1479
  - app/pb_kits/playbook/pb_source/_source.html.erb
1483
1480
  - app/pb_kits/playbook/pb_source/_source.jsx
1484
1481
  - app/pb_kits/playbook/pb_source/_source.scss
@@ -1887,7 +1884,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1887
1884
  - !ruby/object:Gem::Version
1888
1885
  version: 1.3.1
1889
1886
  requirements: []
1890
- rubygems_version: 3.1.4
1887
+ rubyforge_project:
1888
+ rubygems_version: 2.7.3
1891
1889
  signing_key:
1892
1890
  specification_version: 4
1893
1891
  summary: Playbook Design System
@@ -1,9 +0,0 @@
1
- <%= content_tag(:div,
2
- aria: object.aria,
3
- class: object.classname,
4
- data: object.data,
5
- id: object.id) do %>
6
- <% if object.children %>
7
- <%= capture(&object.children) %>
8
- <% end %>
9
- <% end %>
@@ -1,77 +0,0 @@
1
- /* @flow */
2
-
3
- import classnames from 'classnames'
4
- import React, { useState } from 'react'
5
- import { globalProps } from '../utilities/globalProps.js'
6
- import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
7
- import CollapsibleContent from './child_kits/CollapsibleContent'
8
- import CollapsibleMain from './child_kits/CollapsibleMain'
9
-
10
- export const CollapsibleContext = React.createContext({})
11
-
12
- type CollapsibleProps = {
13
- children: React.ChildrenArray<React.Element<typeof Main | Content>>,
14
- aria?: object,
15
- className?: string,
16
- collapsed?: boolean,
17
- data?: object,
18
- id?: string,
19
- padding?: string,
20
- }
21
-
22
- const useCollapsible = (initial = false) => {
23
- const [collapsed, setCollapsed] = useState(initial)
24
-
25
- return [
26
- collapsed,
27
- () => setCollapsed((t) => !t),
28
- ]
29
- }
30
-
31
- const Collapsible = ({
32
- aria = {},
33
- className,
34
- children = [],
35
- collapsed = true,
36
- data = {},
37
- id,
38
- padding = 'md',
39
- ...props
40
- }: CollapsibleProps) => {
41
- const [isCollapsed, collapse] = useCollapsible(collapsed)
42
- const Main = React.Children.toArray(children).find((child) => child.type === CollapsibleMain)
43
- const Content = React.Children.toArray(children).find((child) => child.type === CollapsibleContent)
44
- const { children: mainChildren, ...mainProps } = Main.props
45
- const { children: contentChildren, ...contentProps } = Content.props
46
- const ariaProps = buildAriaProps(aria)
47
- const dataProps = buildDataProps(data)
48
- const classes = classnames(
49
- buildCss('pb_collapsible'),
50
- className,
51
- globalProps(props, { padding })
52
- )
53
-
54
- return (
55
- <CollapsibleContext.Provider value={{ collapsed: isCollapsed, collapse }}>
56
- <div
57
- {...ariaProps}
58
- {...dataProps}
59
- className={classes}
60
- id={id}
61
- >
62
- <CollapsibleMain {...mainProps}>
63
- {mainChildren}
64
- </CollapsibleMain>
65
-
66
- <CollapsibleContent {...contentProps}>
67
- {contentChildren}
68
- </CollapsibleContent>
69
- </div>
70
- </CollapsibleContext.Provider>
71
- )
72
- }
73
-
74
- Collapsible.Main = CollapsibleMain
75
- Collapsible.Content = CollapsibleContent
76
-
77
- export default Collapsible
@@ -1,17 +0,0 @@
1
-
2
- [class^=pb_collapsible_kit] {
3
-
4
- .toggle-content {
5
- display: none;
6
- height: 0;
7
- padding-bottom: 0 !important;
8
- padding-top: 0 !important;
9
- overflow: hidden;
10
- transition: height 300ms, padding 300ms ease-in-out;
11
- }
12
-
13
- .toggle-content.is-visible {
14
- display: block;
15
- height: auto;
16
- }
17
- }
@@ -1,40 +0,0 @@
1
- /* @flow */
2
-
3
- import classnames from 'classnames'
4
- import React, { useContext } from 'react'
5
- import AnimateHeight from 'react-animate-height'
6
- import { buildCss } from '../../utilities/props'
7
- import { globalProps } from '../../utilities/globalProps.js'
8
-
9
- import { CollapsibleContext } from '../_collapsible.jsx'
10
-
11
- type CollapsibleContentProps = {
12
- children: array<React.ReactNode> | React.ReactNode | string,
13
- className?: string,
14
- padding?: string,
15
- }
16
-
17
- const CollapsibleContent = ({
18
- children,
19
- className,
20
- padding = 'md',
21
- ...props
22
- }: CollapsibleContentProps) => {
23
- const context = useContext(CollapsibleContext)
24
- const contentCSS = buildCss('pb_collapsible_content_kit')
25
- const contentSpacing = globalProps(props, { padding })
26
-
27
- return (
28
- <div className={classnames(contentCSS, className, contentSpacing)}>
29
- <AnimateHeight
30
- duration={300}
31
- height={context.collapsed ? 0 : 'auto'}
32
- id="bottom-section"
33
- >
34
- {children}
35
- </AnimateHeight>
36
- </div>
37
- )
38
- }
39
-
40
- export default CollapsibleContent
@@ -1,58 +0,0 @@
1
- /* @flow */
2
-
3
- import classnames from 'classnames'
4
- import { Flex, FlexItem } from '../../'
5
- import React, { useContext } from 'react'
6
- import { buildCss } from '../../utilities/props'
7
- import { globalProps } from '../../utilities/globalProps.js'
8
- import { CollapsibleContext } from '../_collapsible.jsx'
9
-
10
- type CollapsibleMainProps = {
11
- children: array<React.ReactNode> | React.ReactNode,
12
- className?: string,
13
- padding?: string,
14
- }
15
-
16
- type IconProps = {
17
- collapsed: boolean
18
- }
19
-
20
- const Icon = ({ collapsed }: IconProps) => {
21
- const direction = collapsed ? 'down' : 'up'
22
-
23
- return (
24
- <div
25
- key={direction}
26
- style={{ verticalAlign: 'middle' }}
27
- >
28
- <i className={`far fa-chevron-${direction} fa-fw`} />
29
- </div>
30
- )
31
- }
32
-
33
- const CollapsibleMain = ({
34
- children,
35
- className,
36
- padding = 'md',
37
- ...props
38
- }: CollapsibleMainProps) => {
39
- const context = useContext(CollapsibleContext)
40
- const mainCSS = buildCss('pb_collapsible_main_kit')
41
- const mainSpacing = globalProps(props, { padding })
42
-
43
- return (
44
- <div className={classnames(mainCSS, className, mainSpacing)}>
45
- <div onClick={() => context.collapse()}>
46
- <Flex
47
- spacing="between"
48
- vertical="center"
49
- >
50
- <FlexItem>{children}</FlexItem>
51
- <FlexItem><Icon collapsed={context.collapsed} /></FlexItem>
52
- </Flex>
53
- </div>
54
- </div>
55
- )
56
- }
57
-
58
- export default CollapsibleMain
@@ -1,7 +0,0 @@
1
- <%= content_tag(:div,
2
- id: object.id,
3
- data: object.data,
4
- class: object.classname,
5
- aria: object.aria) do %>
6
- <%= capture(&object.children) %>
7
- <% end %>
@@ -1,16 +0,0 @@
1
- <%= content_tag(:div,
2
- id: object.id,
3
- data: object.data,
4
- class: object.classname,
5
- aria: object.aria) do %>
6
-
7
- <%= pb_rails("flex", props: {vertical: "center", spacing: "between"}) do %>
8
- <%= pb_rails("flex/flex_item") do %>
9
- <%= capture(&object.children) %>
10
- <% end %>
11
- <%= pb_rails("flex/flex_item") do %>
12
- <i class="far fa-chevron-down"></i>
13
- <i class="far fa-chevron-up" style="display: none"></i>
14
- <% end %>
15
- <% end %>
16
- <% end %>
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Playbook
4
- module PbCollapsible
5
- class Collapsible
6
- include Playbook::Props
7
-
8
- partial "pb_collapsible/collapsible"
9
-
10
- def classname
11
- generate_classname("pb_collapsible_kit")
12
- end
13
- end
14
- end
15
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Playbook
4
- module PbCollapsible
5
- class CollapsibleContent
6
- include Playbook::Props
7
-
8
- partial "pb_collapsible/child_kits/collapsible_content"
9
-
10
- def data
11
- Hash(values[:data]).merge(
12
- collapsible_content: true
13
- )
14
- end
15
-
16
- def classname
17
- generate_classname("pb_collapsible_content_kit", "toggle-content", padding, separator: " ")
18
- end
19
- end
20
- end
21
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Playbook
4
- module PbCollapsible
5
- class CollapsibleMain
6
- include Playbook::Props
7
-
8
- partial "pb_collapsible/child_kits/collapsible_main"
9
-
10
- def data
11
- Hash(values[:data]).merge(
12
- collapsible_main: true
13
- )
14
- end
15
-
16
- def classname
17
- generate_classname("pb_collapsible_main_kit", padding, separator: " ")
18
- end
19
-
20
-
21
-
22
- end
23
- end
24
- end
@@ -1,10 +0,0 @@
1
- <%= pb_rails("collapsible", props: { dark: true }) do %>
2
- <%= pb_rails("collapsible/collapsible_main", props: { padding: "md", name: "dark-example" }) do %>
3
- <%= pb_rails("body", props: { text: "Main Section", dark: true}) %>
4
- <% end %>
5
- <%= pb_rails("collapsible/collapsible_content", props: { padding: "md" }) do %>
6
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec iaculis, risus a fringilla luctus, sapien eros sodales ex, quis molestie est nulla non turpis. Vestibulum aliquet at ipsum eget posuere. Morbi sed laoreet erat. Sed commodo posuere lectus, at porta nulla ornare a. Suspendisse quam est, sollicitudin ut enim sit amet, commodo placerat enim. Donec laoreet metus ac mauris pellentesque mattis. Pellentesque luctus vel mauris non aliquam. Mauris hendrerit mattis porttitor. Curabitur vehicula justo non ex consectetur commodo. Quisque posuere aliquet quam. Maecenas malesuada magna mauris, ac tempor metus euismod at.
7
- <br><br>
8
- Cras ornare fermentum magna mollis efficitur. Sed vitae nulla vel purus ultrices mollis. Maecenas id nulla id libero faucibus feugiat quis sit amet turpis. In commodo pellentesque risus at fringilla. Integer non interdum leo, non commodo ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut mi augue, dignissim at orci vel, egestas aliquam mi. Proin finibus aliquet tempor. Integer cursus, ex quis gravida rhoncus, nisi elit viverra ipsum, non efficitur est ex ac tortor. Praesent vitae odio massa.
9
- <% end %>
10
- <% end %>
@@ -1,17 +0,0 @@
1
- import React from 'react'
2
- import { Collapsible } from '../..'
3
-
4
- const CollapsibleDark = () => (
5
- <div>
6
- <Collapsible>
7
- <Collapsible.Main>
8
- <div>{'Main Section'}</div>
9
- </Collapsible.Main>
10
- <Collapsible.Content>
11
- <div>{'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel erat sed purus hendrerit viverra. Duis et vestibulum metus. Sed consequat ut ante non vehicula. Etiam nunc massa, pharetra vel quam id, posuere rhoncus quam. Quisque imperdiet arcu enim, nec aliquet justo auctor eget. Curabitur in metus nec nunc rhoncus faucibus vitae ac elit. Nulla facilisi. Vestibulum quis pretium nulla. Nulla ut accumsan velit. Duis varius urna sed sem tempor, sit amet fermentum nibh auctor. Praesent lorem arcu, egestas non ante quis, placerat pellentesque lectus.Vestibulum lacinia ipsum quis venenatis tristique. Vivamus suscipit, libero eu fringilla egestas, orci urna commodo arcu, vel gravida turpis ipsum molestie nibh. Donec cursus eu ante sagittis ultrices. Phasellus id sagittis risus. Mauris dapibus neque faucibus, tempor ligula vel, cursus ante. Donec faucibus gravida porta. Nullam egestas est quis aliquam feugiat. Sed eget metus diam. Cras eget placerat libero.'}</div>
12
- </Collapsible.Content>
13
- </Collapsible>
14
- </div>
15
- )
16
-
17
- export default CollapsibleDark
@@ -1,10 +0,0 @@
1
- <%= pb_rails("collapsible", props: { name: "default-example" }) do %>
2
- <%= pb_rails("collapsible/collapsible_main", props: { padding: "md", name: "default-main" }) do %>
3
- <%= pb_rails("body", props: { text: "Main Section"}) %>
4
- <% end %>
5
- <%= pb_rails("collapsible/collapsible_content", props: { padding: "md" }) do %>
6
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec iaculis, risus a fringilla luctus, sapien eros sodales ex, quis molestie est nulla non turpis. Vestibulum aliquet at ipsum eget posuere. Morbi sed laoreet erat. Sed commodo posuere lectus, at porta nulla ornare a. Suspendisse quam est, sollicitudin ut enim sit amet, commodo placerat enim. Donec laoreet metus ac mauris pellentesque mattis. Pellentesque luctus vel mauris non aliquam. Mauris hendrerit mattis porttitor. Curabitur vehicula justo non ex consectetur commodo. Quisque posuere aliquet quam. Maecenas malesuada magna mauris, ac tempor metus euismod at.
7
- <br><br>
8
- Cras ornare fermentum magna mollis efficitur. Sed vitae nulla vel purus ultrices mollis. Maecenas id nulla id libero faucibus feugiat quis sit amet turpis. In commodo pellentesque risus at fringilla. Integer non interdum leo, non commodo ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut mi augue, dignissim at orci vel, egestas aliquam mi. Proin finibus aliquet tempor. Integer cursus, ex quis gravida rhoncus, nisi elit viverra ipsum, non efficitur est ex ac tortor. Praesent vitae odio massa.
9
- <% end %>
10
- <% end %>
@@ -1,19 +0,0 @@
1
- import React from 'react'
2
- import { Collapsible } from '../..'
3
-
4
- const CollapsibleDefault = () => (
5
- <Collapsible>
6
- <Collapsible.Main>
7
- <div>{'Main Section'}</div>
8
- </Collapsible.Main>
9
- <Collapsible.Content>
10
- <div>
11
- {
12
- 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel erat sed purus hendrerit viverra. Duis et vestibulum metus. Sed consequat ut ante non vehicula. Etiam nunc massa, pharetra vel quam id, posuere rhoncus quam. Quisque imperdiet arcu enim, nec aliquet justo auctor eget. Curabitur in metus nec nunc rhoncus faucibus vitae ac elit. Nulla facilisi. Vestibulum quis pretium nulla. Nulla ut accumsan velit. Duis varius urna sed sem tempor, sit amet fermentum nibh auctor. Praesent lorem arcu, egestas non ante quis, placerat pellentesque lectus.Vestibulum lacinia ipsum quis venenatis tristique. Vivamus suscipit, libero eu fringilla egestas, orci urna commodo arcu, vel gravida turpis ipsum molestie nibh. Donec cursus eu ante sagittis ultrices. Phasellus id sagittis risus. Mauris dapibus neque faucibus, tempor ligula vel, cursus ante. Donec faucibus gravida porta. Nullam egestas est quis aliquam feugiat. Sed eget metus diam. Cras eget placerat libero.'
13
- }
14
- </div>
15
- </Collapsible.Content>
16
- </Collapsible>
17
- )
18
-
19
- export default CollapsibleDefault
@@ -1,9 +0,0 @@
1
- examples:
2
-
3
- rails:
4
- - collapsible_default: Light
5
- - collapsible_dark: Dark
6
-
7
- react:
8
- - collapsible_default: Light
9
- - collapsible_dark: Dark
@@ -1,2 +0,0 @@
1
- export { default as CollapsibleDefault } from './_collapsible_default.jsx'
2
- export { default as CollapsibleDark } from './_collapsible_dark.jsx'
@@ -1,82 +0,0 @@
1
- import PbEnhancedElement from '../pb_enhanced_element'
2
-
3
- const MAIN_SELECTOR = '[data-collapsible-main]'
4
- const CONTENT_SELECTOR = '[data-collapsible-content]'
5
- const DOWN_ARROW_SELECTOR = '.fa-chevron-down'
6
- const UP_ARROW_SELECTOR = '.fa-chevron-up'
7
-
8
- export default class PbCollapsible extends PbEnhancedElement {
9
- static get selector() {
10
- return MAIN_SELECTOR
11
- }
12
-
13
- connect() {
14
- this.element.addEventListener('click', () => {
15
- this.toggle(this.target)
16
- })
17
- this.displayDownArrow()
18
- }
19
-
20
- get target() {
21
- return this.element.parentNode.querySelector(CONTENT_SELECTOR)
22
- }
23
-
24
- // Show an element
25
- show(elem) {
26
- // Get the natural height of the element
27
- const getHeight = () => {
28
- elem.style.display = 'block' // Make it visible
29
- const height = elem.scrollHeight + 'px' // Get it's height
30
- elem.style.display = '' // Hide it again
31
- return height
32
- }
33
-
34
- const height = getHeight() // Get the natural height
35
- elem.classList.add('is-visible') // Make the element visible
36
- elem.style.height = height // Update the max-height
37
-
38
- // Once the transition is complete, remove the inline max-height so the content can scale responsively
39
- window.setTimeout(() => {
40
- elem.style.height = ''
41
- }, 300)
42
- }
43
- // Hide an element
44
- hide(elem) {
45
- // Give the element a height to change from
46
- elem.style.height = elem.scrollHeight + 'px'
47
- // Set the height back to 0
48
- window.setTimeout(() => {
49
- elem.style.height = '0'
50
- elem.style.paddingTop = '0'
51
- elem.style.paddingBottom = '0'
52
- }, 1)
53
-
54
- // When the transition is complete, hide it
55
- window.setTimeout(() => {
56
- elem.classList.remove('is-visible')
57
- }, 300)
58
- }
59
-
60
- // Toggle element visibility
61
- toggle(elem) {
62
- // If the element is visible, hide it
63
- if (elem.classList.contains('is-visible')) {
64
- this.hide(elem)
65
- this.displayDownArrow()
66
- return
67
- }
68
- // Otherwise, show it
69
- this.show(elem)
70
- this.displayUpArrow()
71
- }
72
-
73
- displayDownArrow() {
74
- this.element.querySelector(DOWN_ARROW_SELECTOR).style.display = 'inline-block'
75
- this.element.querySelector(UP_ARROW_SELECTOR).style.display = 'none'
76
- }
77
-
78
- displayUpArrow() {
79
- this.element.querySelector(UP_ARROW_SELECTOR).style.display = 'inline-block'
80
- this.element.querySelector(DOWN_ARROW_SELECTOR).style.display = 'none'
81
- }
82
- }