playbook_ui 13.34.1.pre.alpha.powerfontsexternal3403 → 14.0.0.pre.alpha.PLAY14113475

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +5 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +24 -20
  4. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +17 -12
  5. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +86 -1
  6. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +5 -1
  7. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +30 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_responsive.jsx +67 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_responsive.md +1 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +1 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -1
  12. data/app/pb_kits/playbook/pb_avatar/_avatar.scss +0 -30
  13. data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +19 -1
  14. data/app/pb_kits/playbook/pb_avatar/avatar.rb +44 -1
  15. data/app/pb_kits/playbook/pb_avatar/avatar.test.js +17 -0
  16. data/app/pb_kits/playbook/pb_badge/_badge.scss +6 -0
  17. data/app/pb_kits/playbook/pb_badge/_badge.tsx +4 -2
  18. data/app/pb_kits/playbook/pb_badge/badge.rb +1 -1
  19. data/app/pb_kits/playbook/pb_badge/badge.test.js +17 -11
  20. data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.html.erb +13 -0
  21. data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.jsx +31 -12
  22. data/app/pb_kits/playbook/pb_date_picker/docs/_description.md +3 -1
  23. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.scss +1 -1
  24. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  25. data/app/pb_kits/playbook/pb_icon/_icon.tsx +3 -0
  26. data/app/pb_kits/playbook/pb_icon/icon.rb +2 -0
  27. data/app/pb_kits/playbook/pb_icon_circle/_icon_circle.tsx +2 -1
  28. data/app/pb_kits/playbook/pb_icon_circle/icon_circle.rb +2 -2
  29. data/app/pb_kits/playbook/pb_icon_stat_value/_icon_stat_value.scss +0 -11
  30. data/app/pb_kits/playbook/pb_icon_stat_value/_icon_stat_value.tsx +3 -2
  31. data/app/pb_kits/playbook/pb_icon_stat_value/docs/_icon_stat_value_color.html.erb +1 -0
  32. data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.rb +2 -2
  33. data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.test.js +5 -4
  34. data/app/pb_kits/playbook/pb_nav/_horizontal_nav.scss +1 -1
  35. data/app/pb_kits/playbook/pb_online_status/_online_status.scss +52 -5
  36. data/app/pb_kits/playbook/pb_online_status/_online_status.tsx +6 -1
  37. data/app/pb_kits/playbook/pb_online_status/docs/_online_status_no_border.html.erb +1 -0
  38. data/app/pb_kits/playbook/pb_online_status/docs/_online_status_no_border.jsx +14 -0
  39. data/app/pb_kits/playbook/pb_online_status/docs/_online_status_size.html.erb +3 -0
  40. data/app/pb_kits/playbook/pb_online_status/docs/_online_status_size.jsx +25 -0
  41. data/app/pb_kits/playbook/pb_online_status/docs/example.yml +6 -2
  42. data/app/pb_kits/playbook/pb_online_status/docs/index.js +2 -0
  43. data/app/pb_kits/playbook/pb_online_status/online_status.rb +11 -1
  44. data/app/pb_kits/playbook/pb_online_status/online_status.test.js +31 -0
  45. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.html.erb +61 -0
  46. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.jsx +70 -0
  47. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.md +1 -0
  48. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +4 -2
  49. data/app/pb_kits/playbook/pb_overlay/docs/index.js +1 -0
  50. data/app/pb_kits/playbook/pb_star_rating/_star_rating.scss +83 -6
  51. data/app/pb_kits/playbook/pb_star_rating/docs/example.yml +3 -1
  52. data/app/pb_kits/playbook/pb_star_rating/index.js +73 -4
  53. data/app/pb_kits/playbook/pb_star_rating/star_rating.html.erb +1 -1
  54. data/app/pb_kits/playbook/pb_star_rating/star_rating.rb +2 -2
  55. data/app/pb_kits/playbook/pb_star_rating/stars/utils.tsx +5 -1
  56. data/app/pb_kits/playbook/pb_star_rating/subcomponents/_star_rating_interactive.tsx +50 -21
  57. data/app/pb_kits/playbook/pb_table/_table.tsx +1 -1
  58. data/app/pb_kits/playbook/pb_table/index.ts +4 -4
  59. data/app/pb_kits/playbook/pb_table/subcomponents/_table_body.tsx +1 -1
  60. data/app/pb_kits/playbook/pb_table/subcomponents/_table_cell.tsx +1 -1
  61. data/app/pb_kits/playbook/pb_table/subcomponents/_table_head.tsx +1 -1
  62. data/app/pb_kits/playbook/pb_table/subcomponents/_table_header.tsx +1 -1
  63. data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +1 -1
  64. data/app/pb_kits/playbook/pb_table/table.test.js +2 -0
  65. data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +1 -1
  66. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_default.jsx +1 -1
  67. data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +45 -27
  68. data/app/pb_kits/playbook/pb_textarea/index.ts +3 -3
  69. data/app/pb_kits/playbook/pb_time/_time.tsx +3 -3
  70. data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +1 -1
  71. data/app/pb_kits/playbook/pb_timeline/_item.tsx +1 -1
  72. data/app/pb_kits/playbook/pb_timeline/_timeline.tsx +1 -1
  73. data/app/pb_kits/playbook/pb_title_detail/_title_detail.tsx +10 -10
  74. data/app/pb_kits/playbook/pb_toggle/_toggle.tsx +1 -1
  75. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +2 -2
  76. data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +1 -2
  77. data/app/pb_kits/playbook/pb_treemap_chart/treemapChart.test.js +2 -0
  78. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +2 -2
  79. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_multi_kit.html.erb +1 -1
  80. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +1 -0
  81. data/app/pb_kits/playbook/pb_user/_user.tsx +1 -1
  82. data/app/pb_kits/playbook/pb_user_badge/_user_badge.tsx +6 -6
  83. data/app/pb_kits/playbook/pb_user_badge/badges/million-dollar.tsx +236 -235
  84. data/app/pb_kits/playbook/pb_user_badge/badges/veteran.tsx +1 -1
  85. data/app/pb_kits/playbook/pb_walkthrough/_walkthrough.tsx +68 -63
  86. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +1 -1
  87. data/app/pb_kits/playbook/utilities/_positioning.scss +26 -15
  88. data/dist/chunks/{_typeahead-COUJ88EA.js → _typeahead-eBLGedV-.js} +2 -2
  89. data/dist/chunks/{_weekday_stacked-BZu4elIU.js → _weekday_stacked-Bw_5qEUW.js} +2 -2
  90. data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
  91. data/dist/chunks/{lib-Bf_E03gc.js → lib-BE0Z3F7x.js} +1 -1
  92. data/dist/chunks/{pb_form_validation-D0dhqeN2.js → pb_form_validation-TzZQ0Flx.js} +1 -1
  93. data/dist/chunks/vendor.js +1 -1
  94. data/dist/playbook-doc.js +1 -1
  95. data/dist/playbook-rails-react-bindings.js +1 -1
  96. data/dist/playbook-rails.js +1 -1
  97. data/dist/playbook.css +1 -1
  98. data/lib/playbook/version.rb +2 -2
  99. metadata +17 -8
  100. data/app/pb_kits/playbook/pb_online_status/_online_status_mixins.scss +0 -32
  101. data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
@@ -10,3 +10,16 @@
10
10
  variant: "notification"
11
11
  }) %>
12
12
  </div>
13
+
14
+ <div>
15
+ <%= pb_rails("badge", props: {
16
+ text: "1",
17
+ variant: "notification_error",
18
+ rounded: true
19
+ }) %>
20
+
21
+ <%= pb_rails("badge", props: {
22
+ text: "4",
23
+ variant: "notification_error"
24
+ }) %>
25
+ </div>
@@ -4,20 +4,39 @@ import Badge from '../_badge'
4
4
  const BadgeNotification = (props) => {
5
5
  return (
6
6
  <>
7
- <Badge
8
- rounded
9
- text="1"
10
- variant="notification"
11
- {...props}
12
- />
7
+ <div>
8
+ <Badge
9
+ rounded
10
+ text="1"
11
+ variant="notification"
12
+ {...props}
13
+ />
13
14
 
14
- &nbsp;
15
+ &nbsp;
15
16
 
16
- <Badge
17
- text="4"
18
- variant="notification"
19
- {...props}
20
- />
17
+ <Badge
18
+ text="4"
19
+ variant="notification"
20
+ {...props}
21
+ />
22
+ </div>
23
+
24
+ <div>
25
+ <Badge
26
+ rounded
27
+ text="1"
28
+ variant="notificationError"
29
+ {...props}
30
+ />
31
+
32
+ &nbsp;
33
+
34
+ <Badge
35
+ text="4"
36
+ variant="notificationError"
37
+ {...props}
38
+ />
39
+ </div>
21
40
  </>
22
41
  )
23
42
  }
@@ -6,4 +6,6 @@ Playbook's date picker is built using [flatpickr](https://flatpickr.js.org/), a
6
6
 
7
7
  To learn more [visit flatpickr's docs](https://flatpickr.js.org/instance-methods-properties-elements/) or see the hook doc section below for an applied example.
8
8
 
9
- The Date Picker works best with Javascript Date Objects or ISO Date strings. If you're programming in js use Date Objects. If you're using rails convert your date object (with timezone) to UTC and then to an ISO Date string. For example, `DateTime.now.utc.iso8601`. This ensures that the string passed to the Date Picker kit behaves as expected.
9
+ The Date Picker works best with Javascript Date Objects or ISO Date strings. If you're programming in js use Date Objects. If you're using rails convert your date object (with timezone) to UTC and then to an ISO Date string. For example, `DateTime.now.utc.iso8601`. This ensures that the string passed to the Date Picker kit behaves as expected.
10
+
11
+ The Date Picker expects a date format of `MM/DD/YYYY` by default. If a different date format (e.g. `DD/MM/YYYY`, `m/d/y`, etc.) is used, the component will not know how to handle it and use a default date instead. To change the date format used, read more [here](#format).
@@ -33,7 +33,7 @@ $confirmation_toast_colors: (
33
33
 
34
34
  &.positioned_toast {
35
35
  position: fixed;
36
- z-index: $z_9;
36
+ z-index: $z_10 !important;
37
37
  display: flex;
38
38
  justify-content: space-around;
39
39
  max-width: max-content;
@@ -45,6 +45,7 @@
45
45
  class: "checkbox-class"
46
46
  %>
47
47
  <%= form.date_picker :example_date_picker_1, props: { label: true } %>
48
+ <%= form.star_rating_field :example_star_rating, props: { variant: "interactive", label: true } %>
48
49
 
49
50
  <%= form.actions do |action| %>
50
51
  <%= action.submit %>
@@ -39,6 +39,7 @@ type IconProps = {
39
39
  size?: IconSizes,
40
40
  fontStyle?: 'far' | 'fas' | 'fab' | 'fak',
41
41
  spin?: boolean,
42
+ tabIndex?: number,
42
43
  } & GlobalProps
43
44
 
44
45
  const flipMap = {
@@ -138,6 +139,7 @@ const Icon = (props: IconProps) => {
138
139
  size,
139
140
  fontStyle = 'far',
140
141
  spin = false,
142
+ tabIndex,
141
143
  } = props
142
144
 
143
145
  let iconElement: ReactSVGElement | null = typeof(icon) === "object" ? icon : null
@@ -226,6 +228,7 @@ const Icon = (props: IconProps) => {
226
228
  id,
227
229
  width: 'auto',
228
230
  height: 'auto',
231
+ ...(props.tabIndex !== undefined && { tabIndex }),
229
232
  })
230
233
  }
231
234
  </>
@@ -37,6 +37,7 @@ module Playbook
37
37
  prop :spin, type: Playbook::Props::Boolean,
38
38
  default: false
39
39
  prop :color, type: Playbook::Props::String
40
+ prop :tabindex
40
41
 
41
42
  def valid_emoji?
42
43
  emoji_regex = /\p{Emoji}/
@@ -107,6 +108,7 @@ module Playbook
107
108
  svg["aria"] = object.aria
108
109
  svg["height"] = "auto"
109
110
  svg["width"] = "auto"
111
+ svg["tabindex"] = object.tabindex
110
112
  fill_color = object.color || "currentColor"
111
113
  doc.at_css("path")["fill"] = fill_color
112
114
  raw doc
@@ -24,7 +24,8 @@ type IconCircleProps = {
24
24
  | "red"
25
25
  | "yellow"
26
26
  | "orange"
27
- | "green",
27
+ | "green"
28
+ | "lighter",
28
29
  }
29
30
 
30
31
  const IconCircle = (props: IconCircleProps) => {
@@ -10,8 +10,8 @@ module Playbook
10
10
  values: %w[xxs xs sm md base lg xl],
11
11
  default: "md"
12
12
  prop :variant, type: Playbook::Props::Enum,
13
- values: %w[default royal blue orange purple teal red yellow green orange],
14
- default: "default"
13
+ values: %w[default royal blue orange purple teal red yellow green orange lighter],
14
+ default: "lighter"
15
15
 
16
16
  def classname
17
17
  generate_classname("pb_icon_circle_kit", "size_#{size}", variant)
@@ -50,15 +50,4 @@
50
50
  margin-right: $space-sm;
51
51
  }
52
52
  }
53
- [class^=pb_title_kit_1] + [class^=pb_body_kit] {
54
- font-size: 36px;
55
- }
56
-
57
- [class^=pb_title_kit_2] + [class^=pb_body_kit] {
58
- font-size: 24px
59
- }
60
-
61
- [class^=pb_title_kit_3] + [class^=pb_body_kit] {
62
- font-size: 20px;
63
- }
64
53
  }
@@ -32,7 +32,8 @@ type IconStatValueProps = {
32
32
  | "red"
33
33
  | "yellow"
34
34
  | "orange"
35
- | "green",
35
+ | "green"
36
+ | "lighter",
36
37
  }
37
38
 
38
39
  const IconStatValue = (props: IconStatValueProps): React.ReactElement => {
@@ -49,7 +50,7 @@ const IconStatValue = (props: IconStatValueProps): React.ReactElement => {
49
50
  text = '',
50
51
  unit = '',
51
52
  value = 0,
52
- variant = 'default',
53
+ variant = 'lighter',
53
54
  } = props
54
55
  const ariaProps = buildAriaProps(aria)
55
56
  const dataProps = buildDataProps(data)
@@ -47,6 +47,7 @@
47
47
  value: 19.18,
48
48
  variant:"green"
49
49
  }) %>
50
+ <br>
50
51
  <%= pb_rails("icon_stat_value", props: { icon: "globe",
51
52
  text: "Uranus",
52
53
  unit: "AU",
@@ -9,8 +9,8 @@ module Playbook
9
9
  values: %w[sm md lg],
10
10
  default: "sm"
11
11
  prop :variant, type: Playbook::Props::Enum,
12
- values: %w[default royal blue purple teal red yellow green orange],
13
- default: "default"
12
+ values: %w[default royal blue purple teal red yellow green orange lighter],
13
+ default: "lighter"
14
14
 
15
15
  prop :orientation, type: Playbook::Props::Enum,
16
16
  values: %w[vertical horizontal],
@@ -18,7 +18,7 @@ describe("IconStatValue Kit", () => {
18
18
  )
19
19
 
20
20
  const kit = screen.getByTestId(testId)
21
- expect(kit).toHaveClass("pb_icon_stat_value_kit_horizontal_sm_default")
21
+ expect(kit).toHaveClass("pb_icon_stat_value_kit_horizontal_sm_lighter")
22
22
  })
23
23
 
24
24
  test("renders icon", () => {
@@ -101,7 +101,7 @@ describe("IconStatValue Kit", () => {
101
101
  )
102
102
 
103
103
  const kit = screen.getByTestId(testId)
104
- expect(kit).toHaveClass(`pb_icon_stat_value_kit_horizontal_${sizeProp}_default`)
104
+ expect(kit).toHaveClass(`pb_icon_stat_value_kit_horizontal_${sizeProp}_lighter`)
105
105
 
106
106
  cleanup()
107
107
  })
@@ -115,7 +115,8 @@ describe("IconStatValue Kit", () => {
115
115
  "teal",
116
116
  "red",
117
117
  "yellow",
118
- "green"].forEach(
118
+ "green",
119
+ "lighter"].forEach(
119
120
  (colorProp) => {
120
121
  render(
121
122
  <IconStatValue
@@ -148,7 +149,7 @@ describe("IconStatValue Kit", () => {
148
149
  )
149
150
 
150
151
  const kit = screen.getByTestId(testId)
151
- expect(kit).toHaveClass("pb_icon_stat_value_kit_vertical_sm_default")
152
+ expect(kit).toHaveClass("pb_icon_stat_value_kit_vertical_sm_lighter")
152
153
  })
153
154
 
154
155
  })
@@ -11,7 +11,7 @@ $selector: ".pb_nav_list";
11
11
  [class^="pb_nav_list"][class*="_horizontal"] {
12
12
  .pb_nav_wrapper {
13
13
  display: flex;
14
- align-items: center;
14
+ align-items: end;
15
15
  padding: 0;
16
16
  margin: 0;
17
17
  list-style: none;
@@ -1,11 +1,58 @@
1
- @import "online_status_mixins";
1
+ @import "../tokens/colors";
2
+
3
+ $pb_online_status_size: 8px;
4
+ $pb_online_status_border: 2px;
5
+ $pb_online_status_sizes: (
6
+ "sm": 8px,
7
+ "md": 10px,
8
+ "lg": 12px,
9
+ );
10
+
11
+ $pb_online_status_statuses: (
12
+ online: $success,
13
+ away: $warning,
14
+ offline: $neutral,
15
+ success: $success,
16
+ warning: $warning,
17
+ error: $error,
18
+ info: $info,
19
+ neutral: $neutral,
20
+ primary: $primary,
21
+ );
2
22
 
3
23
  [class^=pb_online_status_kit] {
4
- @include pb_online_status;
24
+ box-sizing: content-box;
25
+ width: $pb_online_status_size;
26
+ height: $pb_online_status_size;
27
+ flex-basis: $pb_online_status_size;
28
+ flex-grow: 0;
29
+ flex-shrink: 0;
30
+ border-width: $pb_online_status_border;
31
+ border-color: $white;
32
+ border-style: solid;
33
+ border-radius: 50%;
34
+ background: $neutral;
35
+
36
+ &.dark {
37
+ border-color: $bg_dark;
38
+ }
5
39
 
6
40
  @each $status_name, $status_value in $pb_online_status_statuses {
7
- &[class*=_#{$status_name}] {
8
- @include pb_online_status($status_value);
41
+ &[class*=_#{$status_name}] {
42
+ background: $status_value;
9
43
  }
10
44
  }
11
- }
45
+
46
+ @each $size, $value in $pb_online_status_sizes {
47
+ &[class*=_size_#{$size}] {
48
+ width: $value;
49
+ height: $value;
50
+ flex-basis: $value;
51
+ }
52
+ }
53
+
54
+ &[class*=_no_border] {
55
+ border-width: 0;
56
+ border-style: none;
57
+ }
58
+ }
@@ -11,6 +11,8 @@ type OnlineStatusProps = {
11
11
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
12
12
  id?: string,
13
13
  status?: "away" | "error" | "info" | "neutral" | "offline" |"online" | "primary"| "success" | "warning",
14
+ size?: "sm" | "md" | "lg",
15
+ noBorder?: boolean,
14
16
  } & GlobalProps
15
17
 
16
18
  const OnlineStatus = (props: OnlineStatusProps) => {
@@ -21,6 +23,8 @@ const OnlineStatus = (props: OnlineStatusProps) => {
21
23
  htmlOptions = {},
22
24
  id,
23
25
  status = 'offline',
26
+ size = 'sm',
27
+ noBorder = false,
24
28
  } = props
25
29
 
26
30
  aria.label = status
@@ -28,7 +32,8 @@ const OnlineStatus = (props: OnlineStatusProps) => {
28
32
  const ariaProps = buildAriaProps(aria)
29
33
  const dataProps = buildDataProps(data)
30
34
  const htmlProps = buildHtmlProps(htmlOptions)
31
- const classes = classnames(buildCss('pb_online_status_kit', status), globalProps(props), className)
35
+ const getBorder = noBorder ? 'no_border' : ''
36
+ const classes = classnames(buildCss('pb_online_status_kit', status, getBorder, "size", size), globalProps(props), className)
32
37
 
33
38
  return (
34
39
  <div
@@ -0,0 +1 @@
1
+ <%= pb_rails("online_status", props: { no_border: true }) %>
@@ -0,0 +1,14 @@
1
+ import React from 'react'
2
+
3
+ import OnlineStatus from '../_online_status'
4
+
5
+ const OnlineStatusNoBorder = (props) => (
6
+ <>
7
+ <OnlineStatus
8
+ noBorder
9
+ {...props}
10
+ />
11
+ </>
12
+ )
13
+
14
+ export default OnlineStatusNoBorder
@@ -0,0 +1,3 @@
1
+ <%= pb_rails("online_status", props: { size: "sm", margin_y: "xs" }) %>
2
+ <%= pb_rails("online_status", props: { size: "md", margin_y: "xs" }) %>
3
+ <%= pb_rails("online_status", props: { size: "lg", margin_y: "xs" }) %>
@@ -0,0 +1,25 @@
1
+ import React from 'react'
2
+
3
+ import OnlineStatus from '../_online_status'
4
+
5
+ const OnlineStatusSize = (props) => (
6
+ <>
7
+ <OnlineStatus
8
+ marginY="xs"
9
+ size="sm"
10
+ {...props}
11
+ />
12
+ <OnlineStatus
13
+ marginY="xs"
14
+ size="md"
15
+ {...props}
16
+ />
17
+ <OnlineStatus
18
+ marginY="xs"
19
+ size="lg"
20
+ {...props}
21
+ />
22
+ </>
23
+ )
24
+
25
+ export default OnlineStatusSize
@@ -1,8 +1,12 @@
1
1
  examples:
2
2
 
3
3
  rails:
4
- - online_status_default: Default
4
+ - online_status_default: Colors
5
+ - online_status_size: Size
6
+ - online_status_no_border: No Border
5
7
 
6
8
 
7
9
  react:
8
- - online_status_default: Default
10
+ - online_status_default: Colors
11
+ - online_status_size: Size
12
+ - online_status_no_border: No Border
@@ -1 +1,3 @@
1
1
  export { default as OnlineStatusDefault } from './_online_status_default.jsx'
2
+ export { default as OnlineStatusSize } from './_online_status_size.jsx'
3
+ export { default as OnlineStatusNoBorder } from './_online_status_no_border.jsx'
@@ -7,8 +7,18 @@ module Playbook
7
7
  values: %w[online offline away success warning error info neutral primary],
8
8
  default: "offline"
9
9
 
10
+ prop :size, type: Playbook::Props::Enum,
11
+ values: %w[sm md lg],
12
+ default: "sm"
13
+
14
+ prop :no_border, type: Playbook::Props::Boolean, default: false
15
+
10
16
  def classname
11
- generate_classname("pb_online_status_kit", status)
17
+ generate_classname("pb_online_status_kit", status, is_no_border, "size", size)
18
+ end
19
+
20
+ def is_no_border
21
+ no_border ? "no_border" : nil
12
22
  end
13
23
  end
14
24
  end
@@ -0,0 +1,31 @@
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+
4
+ import OnlineStatus from './_online_status'
5
+
6
+ const testId = 'online-status'
7
+
8
+ test('renders online status with defaults', () => {
9
+ render(
10
+ <OnlineStatus data={{ testid: testId }} />
11
+ )
12
+
13
+ const kit = screen.getByTestId(testId)
14
+ expect(kit).toHaveClass('pb_online_status_kit_offline_size_sm')
15
+ })
16
+
17
+ test('renders online status with props', () => {
18
+ render(
19
+ <OnlineStatus
20
+ className="additional_class"
21
+ dark
22
+ data={{ testid: testId }}
23
+ noBorder
24
+ size="lg"
25
+ status="online"
26
+ />
27
+ )
28
+
29
+ const kit = screen.getByTestId(testId)
30
+ expect(kit).toHaveClass('pb_online_status_kit_online_no_border_size_lg dark additional_class')
31
+ })
@@ -0,0 +1,61 @@
1
+ <div id="outer-container">
2
+ <%= pb_rails("overlay", props: { id: "overlay-container", overflow: "hidden" }) do %>
3
+ <div id="underlying-table">
4
+ <%= pb_rails("table", props: { size: "sm" }) do %>
5
+ <thead>
6
+ <tr>
7
+ <th>Column 1</th>
8
+ <th>Column 2</th>
9
+ <th>Column 3</th>
10
+ <th>Column 4</th>
11
+ <th>Column 5</th>
12
+ </tr>
13
+ </thead>
14
+ <tbody>
15
+ <% 7.times do %>
16
+ <tr>
17
+ <td>Value 1</td>
18
+ <td>Value 2</td>
19
+ <td>Value 3</td>
20
+ <td>Value 4</td>
21
+ <td>Value 5</td>
22
+ </tr>
23
+ <% end %>
24
+ </tbody>
25
+ <% end %>
26
+ </div>
27
+ <% end %>
28
+ <%= pb_rails("button", props: { text: "Show More", id: "show-more-button", variant: "link", full_width: true, icon: "chevron-down", icon_right: true }) %>
29
+ <%= pb_rails("button", props: { text: "Show Less", id: "show-less-button", variant: "link", full_width: true, icon: "chevron-up", icon_right: true }) %>
30
+ </div>
31
+
32
+ <script type="text/javascript">
33
+ document.addEventListener("DOMContentLoaded", () => {
34
+ const showMoreButton = document.getElementById("show-more-button");
35
+ const showLessButton = document.getElementById("show-less-button");
36
+ const overlayContainer = document.getElementById("overlay-container");
37
+ const underlyingTable = document.getElementById("underlying-table");
38
+ const outerContainer = document.getElementById("outer-container");
39
+
40
+ showLessButton.style.display = "none";
41
+ underlyingTable.style.height = "200px";
42
+
43
+ const showMore = () => {
44
+ outerContainer.appendChild(underlyingTable);
45
+ outerContainer.appendChild(showLessButton);
46
+ showMoreButton.style.display = "none";
47
+ showLessButton.style.display = "flex";
48
+ underlyingTable.style.height = "auto";
49
+ };
50
+
51
+ const showLess = () => {
52
+ overlayContainer.appendChild(underlyingTable);
53
+ showMoreButton.style.display = "flex";
54
+ showLessButton.style.display = "none";
55
+ underlyingTable.style.height = "200px";
56
+ };
57
+
58
+ showMoreButton.addEventListener("click", showMore);
59
+ showLessButton.addEventListener("click", showLess);
60
+ });
61
+ </script>
@@ -0,0 +1,70 @@
1
+ /* eslint-disable react/no-multi-comp */
2
+ import React, { useState } from "react";
3
+ import { Overlay, Table, Button } from "playbook-ui";
4
+
5
+ const TableExample = () => {
6
+ return (
7
+ <Table size="sm">
8
+ <thead>
9
+ <tr>
10
+ <th>{"Column 1"}</th>
11
+ <th>{"Column 2"}</th>
12
+ <th>{"Column 3"}</th>
13
+ <th>{"Column 4"}</th>
14
+ <th>{"Column 5"}</th>
15
+ </tr>
16
+ </thead>
17
+ <tbody>
18
+ {Array.from({ length: 7 }, (_, index) => (
19
+ <tr key={index}>
20
+ {Array.from({ length: 5 }, (_, columnIndex) => (
21
+ <td key={columnIndex}>{`Value ${columnIndex + 1}`}</td>
22
+ ))}
23
+ </tr>
24
+ ))}
25
+ </tbody>
26
+ </Table>
27
+ );
28
+ };
29
+
30
+ const OverlayToggle = () => {
31
+ const [showOverlay, setShowOverlay] = useState(true);
32
+
33
+ return (
34
+ <>
35
+ {showOverlay ? (
36
+ <>
37
+ <Overlay overflow="hidden">
38
+ <div style={{ height: 200 }}>
39
+ <TableExample />
40
+ </div>
41
+ </Overlay>
42
+ <Button
43
+ fullWidth
44
+ icon="chevron-down"
45
+ iconRight
46
+ key="chevron-down"
47
+ onClick={() => setShowOverlay(false)}
48
+ text="Show More"
49
+ variant="link"
50
+ />
51
+ </>
52
+ ) : (
53
+ <>
54
+ <TableExample />
55
+ <Button
56
+ fullWidth
57
+ icon="chevron-up"
58
+ iconRight
59
+ key="chevron-up"
60
+ onClick={() => setShowOverlay(true)}
61
+ text="Show Less"
62
+ variant="link"
63
+ />
64
+ </>
65
+ )}
66
+ </>
67
+ );
68
+ };
69
+
70
+ export default OverlayToggle;
@@ -0,0 +1 @@
1
+ To toggle an overlay, add a button with an event handler. Remove the overlay container to reveal the underlying content. Re-wrap the overlay container to add the overlay back.
@@ -2,7 +2,9 @@ examples:
2
2
  react:
3
3
  - overlay_default: Default
4
4
  - overlay_multi_directional: Multi-directional
5
+ - overlay_toggle: Toggle
5
6
 
6
7
  rails:
7
- - overlay_default: Default
8
- - overlay_multi_directional: Multi-directional
8
+ - overlay_default: Default
9
+ - overlay_multi_directional: Multi-directional
10
+ - overlay_toggle: Toggle
@@ -1,2 +1,3 @@
1
1
  export { default as OverlayDefault } from './_overlay_default.jsx'
2
2
  export { default as OverlayMultiDirectional } from './_overlay_multi_directional.jsx'
3
+ export { default as OverlayToggle } from './_overlay_toggle.jsx'