playbook_ui 8.0.3 → 8.1.0.pre.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -0
  3. data/app/pb_kits/playbook/_playbook.scss +10 -7
  4. data/app/pb_kits/playbook/data/menu.yml +3 -1
  5. data/app/pb_kits/playbook/index.js +3 -0
  6. data/app/pb_kits/playbook/pb_avatar/_avatar.jsx +14 -2
  7. data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +1 -1
  8. data/app/pb_kits/playbook/pb_avatar/avatar.rb +5 -2
  9. data/app/pb_kits/playbook/pb_avatar/avatar.test.js +5 -2
  10. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_default.html.erb +5 -0
  11. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_default.jsx +5 -0
  12. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_status.html.erb +4 -0
  13. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_status.jsx +4 -0
  14. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.jsx +6 -0
  15. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.html.erb +2 -1
  16. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.rb +2 -0
  17. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.html.erb +4 -0
  18. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.jsx +4 -0
  19. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.html.erb +2 -0
  20. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.jsx +2 -0
  21. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_on_click.jsx +2 -0
  22. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_onclick.html.erb +2 -0
  23. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.html.erb +8 -0
  24. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.jsx +8 -0
  25. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_tooltip.html.erb +2 -0
  26. data/app/pb_kits/playbook/pb_avatar_action_button/pb_avatar_action_button.test.js +31 -0
  27. data/app/pb_kits/playbook/pb_badge/_badge.jsx +26 -1
  28. data/app/pb_kits/playbook/pb_button/_button.jsx +6 -0
  29. data/app/pb_kits/playbook/pb_button/button.test.js +91 -0
  30. data/app/pb_kits/playbook/pb_button/docs/_button_default.jsx +0 -1
  31. data/app/pb_kits/playbook/pb_button_toolbar/button_toolbar.test.js +46 -0
  32. data/app/pb_kits/playbook/pb_caption/_caption.jsx +3 -2
  33. data/app/pb_kits/playbook/pb_caption/caption.rb +1 -1
  34. data/app/pb_kits/playbook/pb_card/_card.jsx +18 -3
  35. data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
  36. data/app/pb_kits/playbook/pb_card/card.rb +3 -0
  37. data/app/pb_kits/playbook/pb_card/card_header.rb +7 -7
  38. data/app/pb_kits/playbook/pb_card/docs/_card_tag.html.erb +25 -0
  39. data/app/pb_kits/playbook/pb_card/docs/_card_tag.jsx +59 -0
  40. data/app/pb_kits/playbook/pb_card/docs/example.yml +2 -0
  41. data/app/pb_kits/playbook/pb_card/docs/index.js +1 -0
  42. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.test.js +17 -0
  43. data/app/pb_kits/playbook/pb_collapsible/_collapsible.jsx +84 -0
  44. data/app/pb_kits/playbook/pb_collapsible/_collapsible.scss +15 -0
  45. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.jsx +40 -0
  46. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.jsx +59 -0
  47. data/app/pb_kits/playbook/pb_collapsible/collapsible.html.erb +7 -0
  48. data/app/pb_kits/playbook/pb_collapsible/collapsible.rb +11 -0
  49. data/app/pb_kits/playbook/pb_collapsible/collapsible.test.js +50 -0
  50. data/app/pb_kits/playbook/pb_collapsible/collapsible_content.html.erb +7 -0
  51. data/app/pb_kits/playbook/pb_collapsible/collapsible_content.rb +17 -0
  52. data/app/pb_kits/playbook/pb_collapsible/collapsible_main.html.erb +16 -0
  53. data/app/pb_kits/playbook/pb_collapsible/collapsible_main.rb +15 -0
  54. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.html.erb +10 -0
  55. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.jsx +19 -0
  56. data/app/pb_kits/playbook/pb_collapsible/docs/example.yml +9 -0
  57. data/app/pb_kits/playbook/pb_collapsible/docs/index.js +1 -0
  58. data/app/pb_kits/playbook/pb_collapsible/index.js +79 -0
  59. data/app/pb_kits/playbook/pb_dashboard/commonSettings.js +2 -2
  60. data/app/pb_kits/playbook/pb_dashboard/pbChartsLightTheme.js +2 -2
  61. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.jsx +6 -2
  62. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb +1 -1
  63. data/app/pb_kits/playbook/pb_dialog/_close_icon.jsx +23 -0
  64. data/app/pb_kits/playbook/pb_dialog/_dialog.html.erb +10 -0
  65. data/app/pb_kits/playbook/pb_dialog/_dialog.jsx +142 -0
  66. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +133 -0
  67. data/app/pb_kits/playbook/pb_dialog/_dialog_context.jsx +3 -0
  68. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_body.jsx +21 -0
  69. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_footer.jsx +36 -0
  70. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_header.jsx +68 -0
  71. data/app/pb_kits/playbook/pb_dialog/dialog.rb +47 -0
  72. data/app/pb_kits/playbook/pb_dialog/dialog.test.jsx +23 -0
  73. data/app/pb_kits/playbook/pb_dialog/dialog_header.rb +31 -0
  74. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_compound_components.jsx +53 -0
  75. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_compound_components.md +2 -0
  76. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_default.jsx +27 -0
  77. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_scrollable.jsx +27 -0
  78. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_scrollable.md +2 -0
  79. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_separators.jsx +119 -0
  80. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_separators.md +2 -0
  81. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_should_close_on_overlay.jsx +28 -0
  82. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_should_close_on_overlay.md +2 -0
  83. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_sizes.jsx +93 -0
  84. data/app/pb_kits/playbook/pb_dialog/docs/example.yml +10 -0
  85. data/app/pb_kits/playbook/pb_dialog/docs/index.js +6 -0
  86. data/app/pb_kits/playbook/pb_docs/kit_example.rb +1 -1
  87. data/app/pb_kits/playbook/pb_inline/_inline.jsx +83 -0
  88. data/app/pb_kits/playbook/pb_inline/_inline.scss +58 -0
  89. data/app/pb_kits/playbook/pb_inline/docs/_inline_default.jsx +36 -0
  90. data/app/pb_kits/playbook/pb_inline/docs/_inline_input_options.jsx +58 -0
  91. data/app/pb_kits/playbook/pb_inline/docs/_inline_text_options.jsx +99 -0
  92. data/app/pb_kits/playbook/pb_inline/docs/example.yml +5 -0
  93. data/app/pb_kits/playbook/pb_inline/docs/index.js +3 -0
  94. data/app/pb_kits/playbook/pb_inline/inline.test.jsx +21 -0
  95. data/app/pb_kits/playbook/pb_nav/_item.jsx +2 -0
  96. data/app/pb_kits/playbook/pb_nav/_nav.jsx +2 -2
  97. data/app/pb_kits/playbook/pb_nav/item.html.erb +2 -2
  98. data/app/pb_kits/playbook/pb_nav/nav.html.erb +1 -1
  99. data/app/pb_kits/playbook/pb_online_status/_online_status.jsx +2 -0
  100. data/app/pb_kits/playbook/pb_online_status/online_status.html.erb +1 -1
  101. data/app/pb_kits/playbook/pb_progress_simple/_progress_simple.jsx +1 -1
  102. data/app/pb_kits/playbook/pb_progress_simple/_progress_simple.scss +5 -0
  103. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_variants.html.erb +5 -0
  104. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_variants.jsx +7 -0
  105. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_variants.md +1 -1
  106. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.rb +1 -1
  107. data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.jsx +4 -3
  108. data/app/pb_kits/playbook/pb_text_input/_text_input.jsx +3 -0
  109. data/app/pb_kits/playbook/pb_textarea/_textarea.jsx +3 -0
  110. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.jsx +43 -26
  111. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.scss +18 -0
  112. data/app/pb_kits/playbook/pb_time_stacked/docs/_time_stacked_default.html.erb +18 -5
  113. data/app/pb_kits/playbook/pb_time_stacked/docs/_time_stacked_default.jsx +10 -5
  114. data/app/pb_kits/playbook/pb_time_stacked/time_stacked.html.erb +7 -3
  115. data/app/pb_kits/playbook/pb_time_stacked/time_stacked.rb +8 -30
  116. data/app/pb_kits/playbook/pb_time_stacked/time_stacked.test.js +33 -0
  117. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +4 -3
  118. data/app/pb_kits/playbook/pb_typeahead/_typeahead.jsx +6 -1
  119. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.jsx +25 -2
  120. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default.jsx +1 -0
  121. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills.jsx +7 -3
  122. data/app/pb_kits/playbook/plugins/pb_chart.js +1 -1
  123. data/app/pb_kits/playbook/react_rails_kits.js +4 -0
  124. data/app/pb_kits/playbook/tokens/_border_radius.scss +0 -10
  125. data/app/pb_kits/playbook/tokens/_colors.scss +0 -25
  126. data/app/pb_kits/playbook/tokens/_line_height.scss +0 -9
  127. data/app/pb_kits/playbook/tokens/_opacity.scss +0 -9
  128. data/app/pb_kits/playbook/tokens/_positioning.scss +0 -9
  129. data/app/pb_kits/playbook/tokens/_screen_sizes.scss +0 -9
  130. data/app/pb_kits/playbook/tokens/_shadows.scss +0 -9
  131. data/app/pb_kits/playbook/tokens/_spacing.scss +0 -10
  132. data/app/pb_kits/playbook/tokens/_typography.scss +0 -25
  133. data/app/pb_kits/playbook/tokens/exports/_border_radius.scss +10 -0
  134. data/app/pb_kits/playbook/tokens/exports/_colors.scss +26 -0
  135. data/app/pb_kits/playbook/tokens/exports/_line_height.scss +10 -0
  136. data/app/pb_kits/playbook/tokens/exports/_opacity.scss +10 -0
  137. data/app/pb_kits/playbook/tokens/exports/_positioning.scss +10 -0
  138. data/app/pb_kits/playbook/tokens/exports/_screen_sizes.scss +10 -0
  139. data/app/pb_kits/playbook/tokens/exports/_shadows.scss +10 -0
  140. data/app/pb_kits/playbook/tokens/exports/_spacing.scss +10 -0
  141. data/app/pb_kits/playbook/tokens/exports/_typography.scss +24 -0
  142. data/app/pb_kits/playbook/utilities/test-utils.js +6 -0
  143. data/app/pb_kits/playbook/vendor.js +3 -0
  144. data/dist/reset.css +1 -0
  145. data/lib/playbook/props/base.rb +1 -1
  146. data/lib/playbook/version.rb +1 -1
  147. metadata +74 -11
@@ -0,0 +1,5 @@
1
+ examples:
2
+ react:
3
+ - inline_default: Default
4
+ - inline_text_options: Text Options
5
+ - inline_input_options: Input Options
@@ -0,0 +1,3 @@
1
+ export { default as InlineDefault } from './_inline_default.jsx'
2
+ export { default as InlineTextOptions } from './_inline_text_options.jsx'
3
+ export { default as InlineInputOptions } from './_inline_input_options.jsx'
@@ -0,0 +1,21 @@
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+ import { Inline } from '../'
4
+
5
+ /* See these resources for more testing info:
6
+ - https://github.com/testing-library/jest-dom#usage for useage and examples
7
+ - https://jestjs.io/docs/en/using-matchers
8
+ */
9
+
10
+ test('generated scaffold test - update me', () => {
11
+ const testId = "test1"
12
+
13
+ render(
14
+ <Inline
15
+ data={{ testid: testId }}
16
+ />
17
+ )
18
+
19
+ const kit = screen.getByTestId(testId)
20
+ expect(kit).toBeInTheDocument()
21
+ })
@@ -75,6 +75,7 @@ const NavItem = (props: NavItemProps) => {
75
75
  key={iconLeft}
76
76
  >
77
77
  <Icon
78
+ aria={{ label: iconLeft }}
78
79
  className="pb_nav_list_item_icon_left"
79
80
  fixedWidth
80
81
  icon={iconLeft}
@@ -90,6 +91,7 @@ const NavItem = (props: NavItemProps) => {
90
91
  key={iconRight}
91
92
  >
92
93
  <Icon
94
+ aria={{ label: iconRight }}
93
95
  className="pb_nav_list_item_icon_right"
94
96
  fixedWidth
95
97
  icon={iconRight}
@@ -48,7 +48,7 @@ const Nav = (props: NavProps) => {
48
48
  )
49
49
 
50
50
  return (
51
- <div
51
+ <nav
52
52
  {...ariaProps}
53
53
  {...dataProps}
54
54
  className={cardCss}
@@ -69,7 +69,7 @@ const Nav = (props: NavProps) => {
69
69
  </div>
70
70
  </If>
71
71
  <ul>{children}</ul>
72
- </div>
72
+ </nav>
73
73
  )
74
74
  }
75
75
 
@@ -9,13 +9,13 @@
9
9
  <%= pb_rails("image", props: { url: object.image_url, classname: "pb_nav_img_wrapper" }) %>
10
10
  <% end %>
11
11
  <% if object.icon_left %>
12
- <%= pb_rails("icon", props: { icon: object.icon_left, classname: "pb_nav_list_item_icon_left", fixed_width: true}) %>
12
+ <%= pb_rails("icon", props: { aria: { label: object.icon_left }, icon: object.icon_left, classname: "pb_nav_list_item_icon_left", fixed_width: true}) %>
13
13
  <% end %>
14
14
  <span class="pb_nav_list_item_text">
15
15
  <%= object.text %><%= content.presence %>
16
16
  </span>
17
17
  <% if object.icon_right %>
18
- <%= pb_rails("icon", props: { icon: object.icon_right, classname: "pb_nav_list_item_icon_right", fixed_width: true}) %>
18
+ <%= pb_rails("icon", props: { aria: { label: object.icon_right }, icon: object.icon_right, classname: "pb_nav_list_item_icon_right", fixed_width: true}) %>
19
19
  <% end %>
20
20
  <% end %>
21
21
  <% end %>
@@ -1,4 +1,4 @@
1
- <%= content_tag(:div,
1
+ <%= content_tag(:nav,
2
2
  aria: object.aria,
3
3
  class: object.classname,
4
4
  data: object.data,
@@ -23,6 +23,8 @@ const OnlineStatus = (props: OnlineStatusProps) => {
23
23
  status = 'offline',
24
24
  } = props
25
25
 
26
+ aria.label = status
27
+
26
28
  const ariaProps = buildAriaProps(aria)
27
29
  const dataProps = buildDataProps(data)
28
30
  const classes = classnames(buildCss('pb_online_status_kit', status), globalProps(props), className)
@@ -1,5 +1,5 @@
1
1
  <%= content_tag(:div,
2
- aria: object.aria,
2
+ aria: object.aria.merge!(label: object.status),
3
3
  class: object.classname,
4
4
  data: object.data,
5
5
  id: object.id) do %>
@@ -14,7 +14,7 @@ type ProgressSimpleProps = {
14
14
  muted: boolean,
15
15
  percent: string,
16
16
  value: number,
17
- variant?: "default" | "positive" | "negative",
17
+ variant?: "default" | "positive" | "negative" | "warning",
18
18
  width: string,
19
19
  }
20
20
 
@@ -33,6 +33,11 @@ $pb_progress_simple_height: 4px;
33
33
  background: $error;
34
34
  }
35
35
  }
36
+ &[class*=_warning] {
37
+ .progress_simple_value {
38
+ background: $warning;
39
+ }
40
+ }
36
41
 
37
42
  [class^=progress_simple_value] {
38
43
  width: 0%;
@@ -7,3 +7,8 @@
7
7
  <br>
8
8
 
9
9
  <%= pb_rails("progress_simple", props: { percent: 10, variant: "negative" }) %>
10
+
11
+ <br>
12
+
13
+ <%= pb_rails("progress_simple", props: { percent: 40, variant: "warning" }) %>
14
+
@@ -19,6 +19,13 @@ const ProgressSimpleVariants = () => {
19
19
  percent={10}
20
20
  variant="negative"
21
21
  />
22
+
23
+ <br />
24
+
25
+ <ProgressSimple
26
+ percent={40}
27
+ variant="warning"
28
+ />
22
29
  </div>
23
30
  )
24
31
  }
@@ -1 +1 @@
1
- Progress Simple can pass colors - primary, green and red. Variants names are `default`, `positive`, and `negative` respectively.
1
+ Progress Simple can pass colors - primary, green, red, and yellow. Variants names are `default`, `positive`, `negative`, and `warning`, respectively.
@@ -18,7 +18,7 @@ module Playbook
18
18
  # could this possibly be [sm, md, lg]?
19
19
  prop :width, default: "100%"
20
20
  prop :variant, type: Playbook::Props::Enum,
21
- values: %w[default positive negative],
21
+ values: %w[default positive negative warning],
22
22
  default: "default"
23
23
 
24
24
  def number_value
@@ -1,6 +1,6 @@
1
1
  /* @flow */
2
2
 
3
- import React, { useEffect, useRef } from 'react'
3
+ import React, { forwardRef, useEffect, useRef } from 'react'
4
4
  import classnames from 'classnames'
5
5
  import useFocus from './useFocus.js'
6
6
  import Trix from 'trix'
@@ -22,7 +22,7 @@ type RichTextEditorProps = {
22
22
  value?: string,
23
23
  }
24
24
 
25
- const RichTextEditor = (props: RichTextEditorProps) => {
25
+ const RichTextEditor = (props: RichTextEditorProps, ref: React.ElementRef<"input">) => {
26
26
  const {
27
27
  aria = {},
28
28
  className,
@@ -120,6 +120,7 @@ const RichTextEditor = (props: RichTextEditorProps) => {
120
120
  <input
121
121
  id={id}
122
122
  name={name}
123
+ ref={ref}
123
124
  type="hidden"
124
125
  value={value}
125
126
  />
@@ -133,4 +134,4 @@ const RichTextEditor = (props: RichTextEditorProps) => {
133
134
  )
134
135
  }
135
136
 
136
- export default RichTextEditor
137
+ export default forwardRef(RichTextEditor)
@@ -19,6 +19,7 @@ type TextInputProps = {
19
19
  id?: string,
20
20
  name: string,
21
21
  label: string,
22
+ onBlur: (String) => void,
22
23
  onChange: (String) => void,
23
24
  placeholder: string,
24
25
  required?: boolean,
@@ -41,6 +42,7 @@ const TextInput = (
41
42
  id,
42
43
  name,
43
44
  label,
45
+ onBlur = () => {},
44
46
  onChange = () => {},
45
47
  placeholder,
46
48
  required,
@@ -79,6 +81,7 @@ const TextInput = (
79
81
  disabled={disabled}
80
82
  id={id}
81
83
  name={name}
84
+ onBlur={onBlur}
82
85
  onChange={onChange}
83
86
  placeholder={placeholder}
84
87
  ref={ref}
@@ -24,6 +24,7 @@ type TextareaProps = {
24
24
  required?: boolean,
25
25
  rows?: number,
26
26
  resize: 'none' | 'both' | 'horizontal' | 'vertical' | 'auto',
27
+ onBlur?: InputCallback<HTMLTextAreaElement>,
27
28
  onChange?: InputCallback<HTMLTextAreaElement>,
28
29
  }
29
30
 
@@ -37,6 +38,7 @@ const Textarea = ({
37
38
  label,
38
39
  maxCharacters,
39
40
  name,
41
+ onBlur = () => {},
40
42
  onChange = () => {},
41
43
  placeholder,
42
44
  required,
@@ -75,6 +77,7 @@ const Textarea = ({
75
77
  className="pb_textarea_kit"
76
78
  disabled={disabled}
77
79
  name={name}
80
+ onBlur={onBlur}
78
81
  onChange={onChange}
79
82
  placeholder={placeholder}
80
83
  ref={ref}
@@ -4,50 +4,67 @@ import React from 'react'
4
4
  import classnames from 'classnames'
5
5
 
6
6
  import DateTime from '../pb_kit/dateTime.js'
7
- import { buildCss } from '../utilities/props'
8
- import { Body, Caption } from '../'
7
+ import { buildCss, buildDataProps } from '../utilities/props'
9
8
  import { deprecatedProps, globalProps } from '../utilities/globalProps.js'
10
9
 
10
+ import { Body, Caption } from '../'
11
+
11
12
  type TimeStackedProps = {
12
13
  align?: 'left' | 'center' | 'right',
13
14
  className?: string | array<string>,
14
15
  dark?: boolean,
15
- data?: string,
16
- date: string,
16
+ data?: object,
17
+ date?: string,
17
18
  id?: string,
18
- tag?: 'body' | 'caption',
19
+ time: number | Date,
20
+ timeZone?: string,
19
21
  }
20
22
 
21
- const TimeStacked = (props: TimeStackedProps) => {
22
- const { align, className, dark, date } = props
23
- deprecatedProps('TimeStacked', ['tag'])
23
+ const TimeStackedDefault = (props: TimeStackedProps) => {
24
+ if (props.date) deprecatedProps('Time Stacked', ['date']) //date prop is deprecated, use time instead
25
+
26
+ const {
27
+ align = 'left',
28
+ className,
29
+ dark,
30
+ data = {},
31
+ date,
32
+ time,
33
+ timeZone,
34
+ } = props
35
+
24
36
  const classes = classnames(
25
37
  buildCss('pb_time_stacked_kit', align),
26
38
  globalProps(props),
27
- className,
39
+ className
28
40
  )
41
+ const dataProps = buildDataProps(data)
29
42
 
30
- const dateTimestamp = new DateTime({ value: date })
43
+ const dateTimestamp = new DateTime({ value: date ? date : new Date(time), zone: timeZone })
31
44
 
32
45
  return (
33
- <div className={classes}>
34
- <div
35
- align={align}
36
- className="pb_time_stacked_day_month"
46
+ <div
47
+ className={classes}
48
+ {...dataProps}
49
+ >
50
+ <Body
51
+ className={classnames('pb_time_stacked', 'time-spacing')}
52
+ color="light"
53
+ dark={dark}
37
54
  >
38
- <Body
39
- color="light"
40
- dark={dark}
41
- text={dateTimestamp.toTimeWithMeridian()}
42
- />
43
- <Caption
44
- color="light"
45
- dark={dark}
46
- text={dateTimestamp.toTimezone()}
47
- />
48
- </div>
55
+ <time>
56
+ {dateTimestamp.toTimeWithMeridian()}
57
+ <Caption
58
+ className="pb_time_stacked"
59
+ color="light"
60
+ dark={dark}
61
+ tag="span"
62
+ text={dateTimestamp.toTimezone()}
63
+ />
64
+ </time>
65
+ </Body>
49
66
  </div>
50
67
  )
51
68
  }
52
69
 
53
- export default TimeStacked
70
+ export default TimeStackedDefault
@@ -1,3 +1,21 @@
1
1
  @import "../pb_title/title";
2
2
  @import "../pb_caption/caption";
3
3
  @import "../tokens/colors";
4
+
5
+ [class^=pb_time_stacked_kit] {
6
+ &[class*=_center] {
7
+ text-align: center;
8
+ }
9
+
10
+ &[class*=_right] {
11
+ text-align: right;
12
+ }
13
+
14
+ }
15
+
16
+ .time-spacing {
17
+ time {
18
+ display: inline-grid;
19
+ margin-bottom: $space_xs - 6px;
20
+ }
21
+ }
@@ -1,5 +1,18 @@
1
- <%= pb_rails("time_stacked", props: { date: DateTime.now }) %>
2
- <br/>
3
- <%= pb_rails("time_stacked", props: { align: "center", date: DateTime.now }) %>
4
- <br/>
5
- <%= pb_rails("time_stacked", props: { align: "right", date: DateTime.now }) %>
1
+ <%= pb_rails("time_stacked", props: {
2
+ time: DateTime.now,
3
+ align: "left",
4
+ }) %>
5
+
6
+ <br>
7
+
8
+ <%= pb_rails("time_stacked", props: {
9
+ time: Time.now,
10
+ align: "center"
11
+ }) %>
12
+
13
+ <br>
14
+
15
+ <%= pb_rails("time_stacked", props: {
16
+ time: Time.now,
17
+ align: "right"
18
+ }) %>
@@ -5,18 +5,23 @@ const TimeStackedDefault = (props) => {
5
5
  return (
6
6
  <div>
7
7
  <TimeStacked
8
+ time={new Date()}
9
+ timeZone="America/New_York"
8
10
  {...props}
9
- date={new Date()}
10
11
  />
12
+ <br />
11
13
  <TimeStacked
12
- {...props}
13
14
  align="center"
14
- date={new Date()}
15
+ time={new Date()}
16
+ timeZone="America/New_York"
17
+ {...props}
15
18
  />
19
+ <br />
16
20
  <TimeStacked
17
- {...props}
18
21
  align="right"
19
- date={new Date()}
22
+ time={new Date()}
23
+ timeZone="America/New_York"
24
+ {...props}
20
25
  />
21
26
  </div>
22
27
  )
@@ -1,8 +1,12 @@
1
1
  <%= content_tag(:div,
2
- align: object.align,
3
2
  id: object.id,
4
3
  data: object.data,
5
4
  class: object.classname) do %>
6
- <%= pb_rails("body", props: { text: object.format_time_string, color: "light" }) %>
7
- <%= pb_rails("caption", props: { text: object.format_timezone, color: "light" }) %>
5
+
6
+ <%= pb_rails("body", props: { color: "light", classname: "pb_time_stacked time-spacing" }) do %>
7
+ <time>
8
+ <%= object.format_time_string %>
9
+ <%= pb_rails("caption", props: { color: "light", tag: "span", text: object.pb_date_time.to_timezone.upcase, classname: "pb_time_stacked" }) %>
10
+ </time>
11
+ <% end %>
8
12
  <% end %>
@@ -3,49 +3,27 @@
3
3
  module Playbook
4
4
  module PbTimeStacked
5
5
  class TimeStacked < Playbook::KitBase
6
+ prop :time, required: true
6
7
  prop :align, type: Playbook::Props::Enum,
7
8
  values: %w[left center right],
8
9
  default: "left"
9
- prop :classnames, type: Playbook::Props::String,
10
- default: nil
11
- prop :dark, type: Playbook::Props::Boolean,
12
- default: false
13
- prop :date, type: Playbook::Props::Date, required: true
10
+ prop :timezone, default: "America/New_York"
14
11
 
15
12
  def classname
16
- generate_classname("pb_time_stacked_kit", dark_class)
17
- end
18
-
19
- def day
20
- day = Playbook::PbKit::PbDateTime.new(date)
21
- content_tag(:time, datetime: day.to_iso) do
22
- day.to_day.to_s
23
- end
24
- end
25
-
26
- def month
27
- month = Playbook::PbKit::PbDateTime.new(date)
28
- content_tag(:time, datetime: month.to_iso) do
29
- month.to_month.to_s
30
- end
13
+ # convert deprecated prop values
14
+ generate_classname("pb_time_stacked_kit", align)
31
15
  end
32
16
 
33
17
  def format_time_string
34
- "#{pb_date_time.to_full_hour}:#{pb_date_time.to_minutes}#{pb_date_time.to_meridian}"
18
+ "#{pb_date_time.to_hour}:#{pb_date_time.to_minutes}#{pb_date_time.to_meridian}"
35
19
  end
36
20
 
37
- def format_timezone
38
- pb_date_time.to_timezone
39
- end
40
-
41
- private
42
-
43
- def dark_class
44
- dark ? "dark" : nil
21
+ def format_timezone_string
22
+ pb_date_time.to_timezone.to_s
45
23
  end
46
24
 
47
25
  def pb_date_time
48
- Playbook::PbKit::PbDateTime.new(date)
26
+ Playbook::PbKit::PbDateTime.new(time, timezone)
49
27
  end
50
28
  end
51
29
  end