playbook_ui 12.30.1.pre.alpha.play846responsivespacingglobalpropsneedsdefault924 → 12.31.0.pre.alpha.customiconsfa928

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +2 -0
  3. data/app/pb_kits/playbook/custom-icons.js +355 -0
  4. data/app/pb_kits/playbook/index.js +2 -1
  5. data/app/pb_kits/playbook/pb_badge/_badge.scss +5 -0
  6. data/app/pb_kits/playbook/pb_badge/_badge.tsx +1 -1
  7. data/app/pb_kits/playbook/pb_badge/badge.rb +1 -1
  8. data/app/pb_kits/playbook/pb_badge/badge.test.js +13 -0
  9. data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.html.erb +12 -0
  10. data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.jsx +25 -0
  11. data/app/pb_kits/playbook/pb_badge/docs/example.yml +2 -1
  12. data/app/pb_kits/playbook/pb_badge/docs/index.js +1 -0
  13. data/app/pb_kits/playbook/pb_button/docs/_button_hover.jsx +40 -0
  14. data/app/pb_kits/playbook/pb_button/docs/example.yml +1 -0
  15. data/app/pb_kits/playbook/pb_button/docs/index.js +1 -0
  16. data/app/pb_kits/playbook/pb_card/_card.scss +0 -3
  17. data/app/pb_kits/playbook/pb_card/_card.tsx +6 -5
  18. data/app/pb_kits/playbook/pb_card/card.html.erb +3 -1
  19. data/app/pb_kits/playbook/pb_card/card.rb +96 -0
  20. data/app/pb_kits/playbook/pb_card/card_body.rb +1 -93
  21. data/app/pb_kits/playbook/pb_collapsible/_collapsible.scss +0 -11
  22. data/app/pb_kits/playbook/pb_collapsible/_collapsible.tsx +3 -1
  23. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.tsx +3 -1
  24. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.tsx +3 -1
  25. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.jsx +1 -1
  26. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +0 -12
  27. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_body.tsx +2 -2
  28. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_footer.tsx +4 -1
  29. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_header.tsx +2 -1
  30. data/app/pb_kits/playbook/pb_icon/_icon.tsx +9 -3
  31. data/app/pb_kits/playbook/pb_icon/icon.rb +8 -2
  32. data/app/pb_kits/playbook/pb_message/docs/_message_default.jsx +33 -45
  33. data/app/pb_kits/playbook/pb_message/docs/_message_hover.jsx +41 -0
  34. data/app/pb_kits/playbook/pb_message/docs/example.yml +1 -0
  35. data/app/pb_kits/playbook/pb_message/docs/index.js +2 -0
  36. data/app/pb_kits/playbook/pb_multi_level_select/_helper_functions.tsx +4 -1
  37. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +8 -3
  38. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +76 -0
  39. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.jsx +88 -0
  40. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +5 -0
  41. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +2 -0
  42. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +2 -1
  43. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +3 -0
  44. data/app/pb_kits/playbook/pb_section_separator/_section_separator.scss +7 -0
  45. data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +12 -7
  46. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_children.html.erb +14 -0
  47. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_children.jsx +30 -0
  48. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_children.md +3 -0
  49. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_dashed.html.erb +1 -0
  50. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_dashed.jsx +13 -0
  51. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text.html.erb +1 -1
  52. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text.jsx +1 -1
  53. data/app/pb_kits/playbook/pb_section_separator/docs/example.yml +6 -3
  54. data/app/pb_kits/playbook/pb_section_separator/docs/index.js +2 -0
  55. data/app/pb_kits/playbook/pb_section_separator/section_separator.html.erb +4 -2
  56. data/app/pb_kits/playbook/pb_section_separator/section_separator.rb +4 -1
  57. data/app/pb_kits/playbook/pb_title/_title.scss +18 -0
  58. data/app/pb_kits/playbook/pb_title/_title.tsx +20 -2
  59. data/app/pb_kits/playbook/pb_title/docs/_title_responsive.html.erb +1 -0
  60. data/app/pb_kits/playbook/pb_title/docs/_title_responsive.jsx +16 -0
  61. data/app/pb_kits/playbook/pb_title/docs/_title_responsive.md +1 -0
  62. data/app/pb_kits/playbook/pb_title/docs/example.yml +2 -0
  63. data/app/pb_kits/playbook/pb_title/docs/index.js +1 -0
  64. data/app/pb_kits/playbook/pb_title/title.rb +21 -4
  65. data/app/pb_kits/playbook/pb_title/title.test.js +42 -29
  66. data/app/pb_kits/playbook/tokens/_scale.scss +9 -0
  67. data/app/pb_kits/playbook/tokens/exports/_scale.scss +13 -0
  68. data/app/pb_kits/playbook/utilities/_border_radius.scss +31 -0
  69. data/app/pb_kits/playbook/utilities/_colors.scss +3 -0
  70. data/app/pb_kits/playbook/utilities/_hover.scss +47 -0
  71. data/app/pb_kits/playbook/utilities/globalProps.ts +22 -2
  72. data/dist/playbook-rails.js +7 -7
  73. data/lib/playbook/version.rb +2 -2
  74. metadata +22 -2
@@ -28,6 +28,7 @@ type MultiLevelSelectProps = {
28
28
  returnAllSelected?: boolean
29
29
  treeData?: { [key: string]: string }[]
30
30
  onSelect?: (prop: { [key: string]: any }) => void
31
+ selectedIds?: string[]
31
32
  } & GlobalProps
32
33
 
33
34
  const MultiLevelSelect = (props: MultiLevelSelectProps) => {
@@ -41,6 +42,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
41
42
  returnAllSelected = false,
42
43
  treeData,
43
44
  onSelect = () => {},
45
+ selectedIds
44
46
  } = props
45
47
 
46
48
  const ariaProps = buildAriaProps(aria)
@@ -64,14 +66,14 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
64
66
  //state for return for default
65
67
  const [defaultReturn, setDefaultReturn] = useState([])
66
68
  // Get expanded items from treeData.
67
- const initialExpandedItems = getExpandedItems(treeData);
69
+ const initialExpandedItems = getExpandedItems(treeData, selectedIds);
68
70
  // Initialize state with expanded items.
69
71
  const [expanded, setExpanded] = useState(initialExpandedItems);
70
72
 
71
73
 
72
74
  useEffect(() => {
73
- setFormattedData(addCheckedAndParentProperty(treeData))
74
- }, [treeData])
75
+ setFormattedData(addCheckedAndParentProperty(treeData, selectedIds))
76
+ }, [treeData, selectedIds])
75
77
 
76
78
  useEffect(() => {
77
79
  if (returnAllSelected) {
@@ -160,6 +162,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
160
162
  //function to map over data and add parent_id + depth property to each item
161
163
  const addCheckedAndParentProperty = (
162
164
  treeData: { [key: string]: any }[],
165
+ selectedIds: string[],
163
166
  parent_id: string = null,
164
167
  depth: number = 0,
165
168
  ) => {
@@ -169,6 +172,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
169
172
  return treeData.map((item: { [key: string]: any } | any) => {
170
173
  const newItem = {
171
174
  ...item,
175
+ checked: selectedIds && selectedIds.length && selectedIds.includes(item.id),
172
176
  parent_id,
173
177
  depth,
174
178
  }
@@ -179,6 +183,7 @@ const MultiLevelSelect = (props: MultiLevelSelectProps) => {
179
183
  : item.children
180
184
  newItem.children = addCheckedAndParentProperty(
181
185
  children,
186
+ selectedIds,
182
187
  newItem.id,
183
188
  depth + 1
184
189
  )
@@ -0,0 +1,76 @@
1
+ <% treeData = [{
2
+ label: "Power Home Remodeling",
3
+ value: "Power Home Remodeling",
4
+ id: "100",
5
+ expanded: true,
6
+ children: [
7
+ {
8
+ label: "People",
9
+ value: "People",
10
+ id: "101",
11
+ children: [
12
+ {
13
+ label: "Talent Acquisition",
14
+ value: "Talent Acquisition",
15
+ id: "102",
16
+ },
17
+ {
18
+ label: "Business Affairs",
19
+ value: "Business Affairs",
20
+ id: "103",
21
+ children: [
22
+ {
23
+ label: "Initiatives",
24
+ value: "Initiatives",
25
+ id: "104",
26
+ },
27
+ {
28
+ label: "Learning & Development",
29
+ value: "Learning & Development",
30
+ id: "105",
31
+ },
32
+ ],
33
+ },
34
+ {
35
+ label: "People Experience",
36
+ value: "People Experience",
37
+ id: "106",
38
+ },
39
+ ],
40
+ },
41
+ {
42
+ label: "Contact Center",
43
+ value: "Contact Center",
44
+ id: "107",
45
+ children: [
46
+ {
47
+ label: "Appointment Management",
48
+ value: "Appointment Management",
49
+ id: "108",
50
+ },
51
+ {
52
+ label: "Customer Service",
53
+ value: "Customer Service",
54
+ id: "109",
55
+ },
56
+ {
57
+ label: "Energy",
58
+ value: "Energy",
59
+ id: "110",
60
+ },
61
+ ],
62
+ },
63
+ ],
64
+ }] %>
65
+
66
+
67
+
68
+
69
+ <%= pb_rails("multi_level_select", props: {
70
+ id: "multi-level-select-seelcted_ids",
71
+ name: "my_data_array_selected",
72
+ return_all_selected: true,
73
+ selected_ids:["110","102"],
74
+ tree_data: treeData,
75
+ }) %>
76
+
@@ -0,0 +1,88 @@
1
+ import React from "react";
2
+ import MultiLevelSelect from "../_multi_level_select";
3
+
4
+ const treeData = [
5
+ {
6
+ label: "Power Home Remodeling",
7
+ value: "Power Home Remodeling",
8
+ id: "powerhome1",
9
+ expanded: true,
10
+ children: [
11
+ {
12
+ label: "People",
13
+ value: "People",
14
+ id: "people1",
15
+ children: [
16
+ {
17
+ label: "Talent Acquisition",
18
+ value: "Talent Acquisition",
19
+ id: "talent1",
20
+ },
21
+ {
22
+ label: "Business Affairs",
23
+ value: "Business Affairs",
24
+ id: "business1",
25
+ children: [
26
+ {
27
+ label: "Initiatives",
28
+ value: "Initiatives",
29
+ id: "initiative1",
30
+ },
31
+ {
32
+ label: "Learning & Development",
33
+ value: "Learning & Development",
34
+ id: "development1",
35
+ },
36
+ ],
37
+ },
38
+ {
39
+ label: "People Experience",
40
+ value: "People Experience",
41
+ id: "experience1",
42
+ },
43
+ ],
44
+ },
45
+ {
46
+ label: "Contact Center",
47
+ value: "Contact Center",
48
+ id: "contact1",
49
+ children: [
50
+ {
51
+ label: "Appointment Management",
52
+ value: "Appointment Management",
53
+ id: "appointment1",
54
+ },
55
+ {
56
+ label: "Customer Service",
57
+ value: "Customer Service",
58
+ id: "customer1",
59
+ },
60
+ {
61
+ label: "Energy",
62
+ value: "Energy",
63
+ id: "energy1",
64
+ },
65
+ ],
66
+ },
67
+ ],
68
+ },
69
+ ];
70
+
71
+ const MultiLevelSelectSelectedIds = (props) => {
72
+ return (
73
+ <div>
74
+ <MultiLevelSelect
75
+ id="multi-level-select-selected_ids"
76
+ onSelect={(selectedNodes) =>
77
+ console.log("Selected Items with Return All Selected Data", selectedNodes)
78
+ }
79
+ returnAllSelected
80
+ selectedIds={["energy1","talent1"]}
81
+ treeData={treeData}
82
+ {...props}
83
+ />
84
+ </div>
85
+ );
86
+ };
87
+
88
+ export default MultiLevelSelectSelectedIds;
@@ -0,0 +1,5 @@
1
+ `selected_ids` (Rails) / `selectedIds` (React) is an optional prop that accepts an array of ids that, if present, will mark the corresponding nodes on the treeData as checked on page load.
2
+
3
+ Items that include `checked:true` on the treeData itself will also be selected on page load, even without being passed to `selectedIds`.
4
+
5
+ When an item is marked as checked on page load by any means, the dropdown will expand to show the checked items for easier accessibility.
@@ -2,9 +2,11 @@ examples:
2
2
  rails:
3
3
  - multi_level_select_default: Default
4
4
  - multi_level_select_return_all_selected: Return All Selected
5
+ - multi_level_select_selected_ids: Selected Ids
5
6
  - multi_level_select_with_form: With Form
6
7
 
7
8
  react:
8
9
  - multi_level_select_default: Default
9
10
  - multi_level_select_return_all_selected: Return All Selected
11
+ - multi_level_select_selected_ids: Selected Ids
10
12
 
@@ -1,2 +1,3 @@
1
1
  export { default as MultiLevelSelectDefault } from './_multi_level_select_default.jsx'
2
- export { default as MultiLevelSelectReturnAllSelected } from './_multi_level_select_return_all_selected.jsx'
2
+ export { default as MultiLevelSelectReturnAllSelected } from './_multi_level_select_return_all_selected.jsx'
3
+ export { default as MultiLevelSelectSelectedIds } from "./_multi_level_select_selected_ids.jsx"
@@ -9,6 +9,8 @@ module Playbook
9
9
  default: []
10
10
  prop :return_all_selected, type: Playbook::Props::Boolean,
11
11
  default: false
12
+ prop :selected_ids, type: Playbook::Props::Array,
13
+ default: []
12
14
  prop :input_display, type: Playbook::Props::Enum,
13
15
  values: %w[pills none],
14
16
  default: "pills"
@@ -24,6 +26,7 @@ module Playbook
24
26
  name: name,
25
27
  treeData: tree_data,
26
28
  returnAllSelected: return_all_selected,
29
+ selectedIds: selected_ids,
27
30
  }
28
31
  end
29
32
  end
@@ -45,6 +45,13 @@ $section_colors_dark: (
45
45
  }
46
46
  }
47
47
 
48
+ &[class*=_dashed] {
49
+ &::before, &::after {
50
+ border: 1px dashed $border_light;
51
+ background: none;
52
+ }
53
+ }
54
+
48
55
  // Dark =========================
49
56
 
50
57
  &.dark {
@@ -8,10 +8,12 @@ import Caption from '../pb_caption/_caption'
8
8
 
9
9
  type SectionSeparatorProps = {
10
10
  aria?: { [key: string]: string; },
11
+ children?: React.ReactChild[] | React.ReactChild,
11
12
  className?: string,
12
13
  dark?: boolean,
13
14
  data?: { [key: string]: string; },
14
15
  id?: string,
16
+ lineStyle?: "solid" | "dashed",
15
17
  orientation?: "horizontal" | "vertical",
16
18
  text?: string,
17
19
  variant?: "card" | "background",
@@ -20,9 +22,11 @@ type SectionSeparatorProps = {
20
22
  const SectionSeparator = (props: SectionSeparatorProps) => {
21
23
  const {
22
24
  aria = {},
25
+ children,
23
26
  className,
24
27
  data = {},
25
28
  id,
29
+ lineStyle = 'solid',
26
30
  orientation = 'horizontal',
27
31
  text,
28
32
  dark = false,
@@ -30,21 +34,22 @@ const SectionSeparator = (props: SectionSeparatorProps) => {
30
34
  } = props
31
35
  const ariaProps = buildAriaProps(aria)
32
36
  const dataProps = buildDataProps(data)
33
- const classes = classnames(buildCss('pb_section_separator_kit', variant, orientation), globalProps(props), className)
37
+ const classes = classnames(buildCss('pb_section_separator_kit', variant, orientation, lineStyle === "dashed" ? lineStyle : ""), globalProps(props), className)
34
38
 
35
39
  return (
36
40
 
37
41
  <div
38
- {...ariaProps}
39
- {...dataProps}
40
- className={classes}
41
- id={id}
42
+ {...ariaProps}
43
+ {...dataProps}
44
+ className={classes}
45
+ id={id}
42
46
  >
43
47
  {
48
+ children && children ||
44
49
  text && (
45
50
  <span>
46
- <Caption text={text} dark={dark}/>
47
- </span>
51
+ <Caption text={text} dark={dark} />
52
+ </span>
48
53
  )
49
54
  }
50
55
  </div>
@@ -0,0 +1,14 @@
1
+ <%= pb_rails("section_separator", props: { line_style: "dashed" }) do %>
2
+ <%= pb_rails("card", props: {
3
+ border_radius: "rounded",
4
+ justify_content: "center",
5
+ padding: "none"
6
+ }) do %>
7
+ <%= pb_rails("caption", props: {
8
+ text: "TODAY",
9
+ size: "xs",
10
+ padding_left: "xs",
11
+ padding_right: "xs"
12
+ }) %>
13
+ <% end %>
14
+ <% end %>
@@ -0,0 +1,30 @@
1
+ import React from 'react'
2
+ import { SectionSeparator, Card, Caption } from '../../'
3
+
4
+ const children = (
5
+ <Card
6
+ borderRadius="rounded"
7
+ justifyContent="center"
8
+ padding="none"
9
+ >
10
+ <Caption
11
+ paddingLeft="xs"
12
+ paddingRight="xs"
13
+ size="xs"
14
+ text="TODAY"
15
+ />
16
+ </Card>
17
+ )
18
+
19
+ const SectionSeparatorChildren = (props) => {
20
+ return (
21
+ <SectionSeparator
22
+ {...props}
23
+ lineStyle='dashed'
24
+ >
25
+ {children}
26
+ </SectionSeparator>
27
+ )
28
+ }
29
+
30
+ export default SectionSeparatorChildren
@@ -0,0 +1,3 @@
1
+ Pass anything (including any of our kits) to the `children` prop to customize a separator's content.
2
+
3
+ **NOTE:** passing `children` overrides any content passed to `text`
@@ -0,0 +1 @@
1
+ <%= pb_rails("section_separator", props: { line_style: "dashed" }) %>
@@ -0,0 +1,13 @@
1
+ import React from 'react'
2
+ import { SectionSeparator } from '../../'
3
+
4
+ const SectionSeparatorDashed = (props) => {
5
+ return (
6
+ <SectionSeparator
7
+ {...props}
8
+ lineStyle='dashed'
9
+ />
10
+ )
11
+ }
12
+
13
+ export default SectionSeparatorDashed
@@ -1 +1 @@
1
- <%= pb_rails("section_separator", props: { text: "Title Separator" }) %>
1
+ <%= pb_rails("section_separator", props: { text: "Text Separator" }) %>
@@ -5,7 +5,7 @@ const SectionSeparatorText = (props) => {
5
5
  return (
6
6
  <SectionSeparator
7
7
  {...props}
8
- text="Title Separator"
8
+ text="Text Separator"
9
9
  />
10
10
  )
11
11
  }
@@ -1,12 +1,15 @@
1
1
  examples:
2
2
 
3
3
  rails:
4
- - section_separator_text: Text Separator
5
4
  - section_separator_line: Line Separator
5
+ - section_separator_dashed: Dashed Separator
6
+ - section_separator_text: Text Separator
6
7
  - section_separator_vertical: Vertical
7
-
8
+ - section_separator_children: Children
8
9
 
9
10
  react:
10
- - section_separator_text: Text Separator
11
11
  - section_separator_line: Line Separator
12
+ - section_separator_dashed: Dashed Separator
13
+ - section_separator_text: Text Separator
12
14
  - section_separator_vertical: Vertical
15
+ - section_separator_children: Children
@@ -1,3 +1,5 @@
1
1
  export { default as SectionSeparatorLine } from './_section_separator_line.jsx'
2
2
  export { default as SectionSeparatorText } from './_section_separator_text.jsx'
3
3
  export { default as SectionSeparatorVertical } from './_section_separator_vertical.jsx'
4
+ export { default as SectionSeparatorDashed } from './_section_separator_dashed.jsx'
5
+ export { default as SectionSeparatorChildren } from './_section_separator_children.jsx'
@@ -4,9 +4,11 @@
4
4
  data: object.data,
5
5
  class: object.classname) do %>
6
6
  <% if object.orientation === 'horizontal' %>
7
- <% if object.text %>
7
+ <% if content %>
8
+ <%= content %>
9
+ <% elsif object.text %>
8
10
  <span><%= pb_rails("caption", props: { text: object.text }) %></span>
9
- <%end%>
11
+ <% end %>
10
12
  <% end %>
11
13
  <% if object.orientation === 'vertical' %>
12
14
  <%= pb_rails("flex", props: { orientation: "column"}) do %>
@@ -12,9 +12,12 @@ module Playbook
12
12
  default: "horizontal"
13
13
  prop :dark, type: Playbook::Props::Boolean,
14
14
  default: false
15
+ prop :line_style, type: Playbook::Props::Enum,
16
+ values: %w[dashed solid],
17
+ default: "solid"
15
18
 
16
19
  def classname
17
- generate_classname("pb_section_separator_kit", variant, orientation)
20
+ generate_classname("pb_section_separator_kit", variant, orientation, line_style == "dashed" ? "dashed" : nil)
18
21
  end
19
22
 
20
23
  private
@@ -1,5 +1,6 @@
1
1
  @import "../tokens/titles";
2
2
  @import "../tokens/colors";
3
+ @import "../tokens/screen_sizes";
3
4
  @import './title_mixin';
4
5
 
5
6
  [class^=pb_title_kit]{
@@ -33,4 +34,21 @@
33
34
  &[class*=_thin] {
34
35
  @include pb_title_thin;
35
36
  }
37
+
38
+ @each $size, $size_value in $breakpoints_grid {
39
+ @each $title_size_value in [1, 2, 3, 4] {
40
+ $min_size: map-get($size_value, "min");
41
+ $max_size: map-get($size_value, "max");
42
+ &[class*=_#{$size}_#{$title_size_value}] {
43
+ @include break_on($min_size, $max_size) {
44
+ @if $title_size_value == 1 { @include pb_title_1; }
45
+ @else if $title_size_value == 2 { @include pb_title_2; }
46
+ @else if $title_size_value == 3 { @include pb_title_3; }
47
+ @else if $title_size_value == 4 { @include pb_title_4; }
48
+ @include title_colors;
49
+ @if $title_size_value != 4 { @include pb_title_bold; }
50
+ }
51
+ }
52
+ }
53
+ }
36
54
  }
@@ -3,6 +3,9 @@ import classnames from 'classnames'
3
3
  import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
4
4
  import { deprecatedProps, GlobalProps, globalProps } from '../utilities/globalProps'
5
5
 
6
+ type SizeType = 1 | 2 | 3 | 4 | "1" | "2" | "3" | "4"
7
+ type SizeResponsiveType = {[key: string]: SizeType}
8
+
6
9
  type TitleProps = {
7
10
  aria?: {[key: string]: string},
8
11
  bold?: boolean,
@@ -11,7 +14,7 @@ type TitleProps = {
11
14
  color?: "default" | "light" | "lighter" | "success" | "error" | "link",
12
15
  data?: {[key: string]: string},
13
16
  id?: string,
14
- size?: 1 | 2| 3| 4 | "1" | "2" | "3" | "4",
17
+ size?: SizeType | SizeResponsiveType,
15
18
  tag?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "div" | "span",
16
19
  text?: string,
17
20
  variant?: null | "link",
@@ -36,9 +39,24 @@ const Title = (props: TitleProps): React.ReactElement => {
36
39
  const ariaProps: {[key: string]: string | number} = buildAriaProps(aria)
37
40
  const dataProps: {[key: string]: string | number} = buildDataProps(data)
38
41
  const getBold = bold ? '' : 'thin'
42
+ const isSizeNumberOrString = typeof size === "number" || typeof size === "string"
43
+
44
+ const buildResponsiveSizeCss = () => {
45
+ let css = ''
46
+
47
+ if (!isSizeNumberOrString) {
48
+ Object.entries(size).forEach((sizeObj) => {
49
+ css += `pb_title_kit_${sizeObj[0]}_${sizeObj[1]} `
50
+ })
51
+ }
52
+
53
+ return css.trim()
54
+ }
55
+
39
56
  const classes = classnames(
40
- buildCss('pb_title_kit', `size_${size}`, variant, color, getBold),
57
+ buildCss('pb_title_kit', isSizeNumberOrString ? `size_${size}` : "", variant, color, getBold),
41
58
  globalProps(props),
59
+ buildResponsiveSizeCss(),
42
60
  className
43
61
  )
44
62
  const Tag: React.ReactElement | any = `${tag}`
@@ -0,0 +1 @@
1
+ <%= pb_rails("title", props: { text: "Responsive Title", tag: "h1", size: {xs: 3, sm: 2, md: 1} }) %>
@@ -0,0 +1,16 @@
1
+ import React from 'react'
2
+ import Title from '../_title'
3
+
4
+ const TitleResponsive = (props) => {
5
+ return (
6
+ <>
7
+ <Title
8
+ size={{xs: "3", sm: "2", md: "1"}}
9
+ text="Responsive Title"
10
+ {...props}
11
+ />
12
+ </>
13
+ )
14
+ }
15
+
16
+ export default TitleResponsive
@@ -0,0 +1 @@
1
+ The `size` prop supports responsive sizes. To use them, pass an object to the size prop containing your size values relative to responsive break points (show code below). To test this here, resize your browser window to responsively change this Title's size.
@@ -3,8 +3,10 @@ examples:
3
3
  - title_default: Default UI
4
4
  - title_light_weight: Light Weight UI
5
5
  - title_colors: Colors
6
+ - title_responsive: Responsive
6
7
 
7
8
  react:
8
9
  - title_default: Default UI
9
10
  - title_light_weight: Light Weight UI
10
11
  - title_colors: Colors
12
+ - title_responsive: Responsive
@@ -1,3 +1,4 @@
1
1
  export { default as TitleDefault } from './_title_default.jsx'
2
2
  export { default as TitleLightWeight } from './_title_light_weight.jsx'
3
3
  export { default as TitleColors } from './_title_colors.jsx'
4
+ export { default as TitleResponsive } from './_title_responsive.jsx'
@@ -6,9 +6,7 @@ module Playbook
6
6
  prop :color, type: Playbook::Props::Enum,
7
7
  values: [nil, "default", "light", "lighter", "success", "error", "link"],
8
8
  default: nil
9
- prop :size, type: Playbook::Props::Enum,
10
- values: [1, 2, 3, 4],
11
- default: 3
9
+ prop :size, default: 3
12
10
  prop :tag, type: Playbook::Props::Enum,
13
11
  values: %w[h1 h2 h3 h4 h5 h6 p div span],
14
12
  default: "h3"
@@ -20,12 +18,31 @@ module Playbook
20
18
  prop :bold, type: Playbook::Props::Boolean, default: true
21
19
 
22
20
  def classname
23
- generate_classname("pb_title_kit", size, variant, color, is_bold)
21
+ if is_size_responsive
22
+ generate_classname("pb_title_kit", variant, color, is_bold) + generate_responsive_size_classname
23
+ else
24
+ generate_classname("pb_title_kit", size, variant, color, is_bold)
25
+ end
24
26
  end
25
27
 
26
28
  def is_bold
27
29
  bold ? nil : "thin"
28
30
  end
31
+
32
+ def is_size_responsive
33
+ try(:size).is_a?(::Hash)
34
+ end
35
+
36
+ def generate_responsive_size_classname
37
+ css = ""
38
+ if is_size_responsive
39
+ size.each do |key, value|
40
+ css += " pb_title_kit_#{key}_#{value}"
41
+ end
42
+ end
43
+
44
+ css unless css.blank?
45
+ end
29
46
  end
30
47
  end
31
48
  end