playbook_ui 9.12.0.pre.text.addon → 9.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +1 -0
  3. data/app/pb_kits/playbook/data/menu.yml +1 -0
  4. data/app/pb_kits/playbook/index.js +1 -0
  5. data/app/pb_kits/playbook/pb_bread_crumbs/_bread_crumb_item.jsx +51 -0
  6. data/app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.jsx +49 -0
  7. data/app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.scss +55 -0
  8. data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumb_item.html.erb +9 -0
  9. data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumb_item.rb +12 -0
  10. data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.html.erb +7 -0
  11. data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.rb +11 -0
  12. data/app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.test.js +35 -0
  13. data/app/pb_kits/playbook/pb_bread_crumbs/docs/_bread_crumbs_default.html.erb +17 -0
  14. data/app/pb_kits/playbook/pb_bread_crumbs/docs/_bread_crumbs_default.jsx +56 -0
  15. data/app/pb_kits/playbook/pb_bread_crumbs/docs/_description.md +1 -0
  16. data/app/pb_kits/playbook/pb_bread_crumbs/docs/example.yml +7 -0
  17. data/app/pb_kits/playbook/pb_bread_crumbs/docs/index.js +1 -0
  18. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.jsx +45 -11
  19. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.html.erb +17 -6
  20. data/app/pb_kits/playbook/pb_date_stacked/date_stacked.rb +12 -5
  21. data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_bold.html.erb +5 -0
  22. data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_bold.jsx +38 -0
  23. data/app/pb_kits/playbook/pb_date_stacked/docs/example.yml +3 -1
  24. data/app/pb_kits/playbook/pb_date_stacked/docs/index.js +1 -0
  25. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.jsx +32 -16
  26. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.scss +23 -4
  27. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb +12 -8
  28. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.rb +9 -2
  29. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js +35 -0
  30. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.html.erb +8 -1
  31. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.jsx +19 -1
  32. data/app/pb_kits/playbook/pb_dialog/dialog.test.jsx +1 -1
  33. data/app/pb_kits/playbook/pb_flex/_flex.jsx +6 -1
  34. data/app/pb_kits/playbook/pb_passphrase/_passphrase.jsx +13 -11
  35. data/app/pb_kits/playbook/pb_passphrase/_passphrase.scss +18 -13
  36. data/app/pb_kits/playbook/pb_section_separator/_section_separator.jsx +7 -3
  37. data/app/pb_kits/playbook/pb_text_input/text_input.rb +2 -2
  38. data/app/pb_kits/playbook/pb_time_stacked/time_stacked.html.erb +2 -2
  39. data/lib/playbook/version.rb +1 -1
  40. metadata +20 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f94c4155e43cfcdf17c58b5afce6b032c570576aff59506dc1751cb4f0763010
4
- data.tar.gz: 24b67df04fa47777d4c4f8ec6d43c648e61e7b1f2325c15acd4b125045d45012
3
+ metadata.gz: b1460f77a2ef88bf84e6e7388b473d73517373e9ef0d690418f318bf13eb49f6
4
+ data.tar.gz: 814d426340141a35d9286a0df82747538023dde241b7ec662c68bdfe6ef59585
5
5
  SHA512:
6
- metadata.gz: f5bd3d916766662441b2e5ca737747554866e2ee519669bdb557da95faccab27a5dcaf1f28b8fa1764cdf5b5687f9972739323e2b97e8aa1bc3516893eb1e4a1
7
- data.tar.gz: c4ae6e848dbea60dcc6e6b990579223d65c10fb6fc1b30ceb22769e3d4c95d24338b4086cde2464743db270be9330fc4950cc3b801d0671894e8dac87f1a25e5
6
+ metadata.gz: e2c7ca89a529a1b173ac9cdd097813f342024c0428bac7830a6c0fa2fedc8e2951e6f7eea46bcaadbf85d8a65d5cd53d329c9d3c13abf5b0db0b001f11610bed
7
+ data.tar.gz: 73a48d081d1f1db44d7b788816ccc4e6c02657cf7e0b3107da11d18e1889bb716810717ab0259cb6385a31dd02b90c6ff8162896998732b97c2936f7f821a85f
@@ -1,6 +1,7 @@
1
1
  @import 'tokens/fonts';
2
2
  @import 'pb_background/background';
3
3
  @import 'pb_body/body';
4
+ @import 'pb_bread_crumbs/bread_crumbs';
4
5
  @import 'pb_button/button';
5
6
  @import 'pb_button_toolbar/button_toolbar';
6
7
  @import 'pb_caption/caption';
@@ -2,6 +2,7 @@ kits:
2
2
  - avatar
3
3
  - avatar_action_button
4
4
  - background
5
+ - bread_crumbs
5
6
  - buttons:
6
7
  - button
7
8
  - button_toolbar
@@ -10,6 +10,7 @@ export Background from './pb_background/_background.jsx'
10
10
  export Badge from './pb_badge/_badge.jsx'
11
11
  export BarGraph from './pb_bar_graph/_bar_graph.jsx'
12
12
  export Body from './pb_body/_body.jsx'
13
+ export BreadCrumbs from './pb_bread_crumbs/_bread_crumbs.jsx'
13
14
  export Button from './pb_button/_button.jsx'
14
15
  export ButtonToolbar from './pb_button_toolbar/_button_toolbar.jsx'
15
16
  export Caption from './pb_caption/_caption.jsx'
@@ -0,0 +1,51 @@
1
+ /* @flow */
2
+
3
+ import React from 'react'
4
+ import classnames from 'classnames'
5
+ import { globalProps } from '../utilities/globalProps.js'
6
+
7
+ import {
8
+ buildAriaProps,
9
+ buildCss,
10
+ buildDataProps,
11
+ } from '../utilities/props'
12
+
13
+ type BreadCrumbItemProps = {
14
+ aria?: object,
15
+ className?: string,
16
+ data?: object,
17
+ id?: string,
18
+ component?: element
19
+ }
20
+ const BreadCrumbItem = (props: BreadCrumbItemProps) => {
21
+ const {
22
+ aria = {},
23
+ className,
24
+ data = {},
25
+ id,
26
+ component = 'a',
27
+ ...rest
28
+ } = props
29
+ const ariaProps = buildAriaProps(aria)
30
+ const dataProps = buildDataProps(data)
31
+ const css = classnames(
32
+ buildCss('pb_bread_crumb_item_kit'),
33
+ globalProps(props),
34
+ className
35
+ )
36
+ const Component = component || 'span'
37
+ return (
38
+ <div
39
+ {...ariaProps}
40
+ {...dataProps}
41
+ className={css}
42
+ id={id}
43
+ >
44
+ <Component
45
+ className="pb_bread_crumb_item"
46
+ {...rest}
47
+ />
48
+ </div>
49
+ )
50
+ }
51
+ export default BreadCrumbItem
@@ -0,0 +1,49 @@
1
+ /* @flow */
2
+
3
+ import React from 'react'
4
+ import classnames from 'classnames'
5
+ import { globalProps } from '../utilities/globalProps.js'
6
+
7
+ import {
8
+ buildAriaProps,
9
+ buildCss,
10
+ buildDataProps,
11
+ } from '../utilities/props'
12
+
13
+ type BreadCrumbsProps = {
14
+ aria?: object,
15
+ className?: string,
16
+ data?: object,
17
+ id?: string,
18
+ text?: string,
19
+ children?: node
20
+ }
21
+ const BreadCrumbs = (props: BreadCrumbsProps) => {
22
+ const {
23
+ aria = { label: 'Breadcrumb Navigation' },
24
+ className,
25
+ data = {},
26
+ id,
27
+ children,
28
+ } = props
29
+ const ariaProps = buildAriaProps(aria)
30
+ const dataProps = buildDataProps(data)
31
+ const css = classnames(
32
+ buildCss('pb_bread_crumbs_kit'),
33
+ globalProps(props),
34
+ className
35
+ )
36
+
37
+ return (
38
+ <nav
39
+ {...ariaProps}
40
+ {...dataProps}
41
+ className={css}
42
+ id={id}
43
+ >
44
+ {children}
45
+ </nav>
46
+ )
47
+ }
48
+
49
+ export default BreadCrumbs
@@ -0,0 +1,55 @@
1
+ @import "../tokens/border_radius";
2
+ @import "../tokens/colors";
3
+ @import "../tokens/opacity";
4
+ @import "../tokens/spacing";
5
+ @import "../tokens/typography";
6
+
7
+ [class^=pb_bread_crumbs_kit] {
8
+ $pb_badge_height: 18px;
9
+
10
+ display: inline-flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ border-radius: $border_rad_light;
14
+ padding: 0 $space_xs/2;
15
+ border-width: 1px;
16
+ border-style: solid;
17
+ border-color: $card_light;
18
+
19
+ svg {
20
+ margin-right: 8px;
21
+ }
22
+ .pb_bread_crumb_item {
23
+ display: flex;
24
+ flex-direction: row;
25
+ align-items: center;
26
+
27
+ }
28
+ .pb_bread_crumb_item_kit {
29
+ display: flex;
30
+ flex-direction: row;
31
+ align-items: center;
32
+ }
33
+ .pb_bread_crumb_item_kit:not(:last-child):after {
34
+ content: '/';
35
+ padding-left: 8px;
36
+ padding-right: 8px;
37
+ }
38
+
39
+ @each $color_name, $color_value in $status_colors {
40
+ &[class*=_#{$color_name}] {
41
+ background: rgba($color_value, $opacity_1);
42
+ color: map-get($status_color_text, $color_name);
43
+ }
44
+ }
45
+
46
+ &.dark {
47
+ border-width: 0;
48
+
49
+ @each $color_name, $color_value in $status_colors {
50
+ &[class*=_#{$color_name}] {
51
+ background: rgba(mix($bg_dark, $color_value, 10%), $opacity_2);
52
+ }
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,9 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ class: object.classname,
5
+ aria: object.aria) do%>
6
+ <%= content_tag(object.link ? 'a' : 'span', class: 'bread_crumb_item', href: object.link) do %>
7
+ <%= content.presence %>
8
+ <% end %>
9
+ <%end%>
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbBreadCrumbs
5
+ class BreadCrumbItem < Playbook::KitBase
6
+ prop :link, type: Playbook::Props::String
7
+ def classname
8
+ generate_classname("pb_bread_crumb_item_kit")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ <%= content_tag(:nav,
2
+ aria: object.aria,
3
+ id: object.id,
4
+ data: object.data,
5
+ class: object.classname) do %>
6
+ <%= content.presence %>
7
+ <% end %>
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbBreadCrumbs
5
+ class BreadCrumbs < Playbook::KitBase
6
+ def classname
7
+ generate_classname("pb_bread_crumbs_kit")
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,35 @@
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+ import BreadCrumbs from './_bread_crumbs'
4
+ import BreadCrumbItem from './_bread_crumb_item'
5
+ import { Icon, Title } from '../'
6
+
7
+ it('should render bread crumbs', () => {
8
+ const testId = 'breadCrumbs'
9
+ render(
10
+ <BreadCrumbs
11
+ data={{ testid: testId }}
12
+ name={name}
13
+ >
14
+ <Icon
15
+ icon="home"
16
+ size="1x"
17
+ />
18
+ <BreadCrumbItem
19
+ dark
20
+ href="/home"
21
+ >
22
+ <Title
23
+ size="4"
24
+ tag="span"
25
+ text="Home"
26
+ />
27
+ </BreadCrumbItem>
28
+ </BreadCrumbs>
29
+ )
30
+ const kit = screen.getByTestId(testId)
31
+ const label = screen.getByText('Home')
32
+
33
+ expect(kit).toHaveClass('pb_bread_crumbs_kit')
34
+ expect(label).toHaveTextContent('Home')
35
+ })
@@ -0,0 +1,17 @@
1
+
2
+ <div>
3
+ <%= pb_rails("bread_crumbs", props: { aria: { label: "Breadcrumb Navigation" } }) do%>
4
+ <%= pb_rails("icon", props: { icon: "home"}) %>
5
+ <%= pb_rails("bread_crumbs/bread_crumb_item", props: { link: "/" }) do %>
6
+ <%= pb_rails("title", props: { size: 4, text: "Home", tag: "span" }) %>
7
+ <%end%>
8
+ <%= pb_rails("icon", props: { icon: 'users'}) %>
9
+ <%= pb_rails("bread_crumbs/bread_crumb_item", props: { link: "/users" }) do %>
10
+ <%= pb_rails("title", props: { size: 4, text: "Users", tag: "span" }) %>
11
+ <%end%>
12
+ <%= pb_rails("icon", props: { icon: "user"}) %>
13
+ <%= pb_rails("bread_crumbs/bread_crumb_item") do %>
14
+ <%= pb_rails("title", props: { size: 4, text: "User", tag: "span" }) %>
15
+ <%end%>
16
+ <%end%>
17
+ </div>
@@ -0,0 +1,56 @@
1
+ import React from 'react'
2
+ import BreadCrumbs from '../_bread_crumbs.jsx'
3
+ import { Icon, Title } from '../../'
4
+ import BreadCrumbItem from '../_bread_crumb_item'
5
+
6
+ const Link = (props) => <BreadCrumbItem {...props} />
7
+ const BreadCrumbsDefault = (props) => {
8
+ return (
9
+ <BreadCrumbs
10
+ text="+1"
11
+ {...props}
12
+ >
13
+ <Icon
14
+ icon="home"
15
+ size="1x"
16
+ />
17
+ <BreadCrumbItem
18
+ {...props}
19
+ href="/home"
20
+ >
21
+ <Title
22
+ size="4"
23
+ tag="span"
24
+ text="Home"
25
+ />
26
+ </BreadCrumbItem>
27
+ <Icon
28
+ icon="users"
29
+ size="1x"
30
+ />
31
+ <Link
32
+ {...props}
33
+ href="/users"
34
+ >
35
+ <Title
36
+ size="4"
37
+ tag="span"
38
+ text="Users"
39
+ />
40
+ </Link>
41
+ <Icon
42
+ icon="user"
43
+ size="1x"
44
+ />
45
+ <Link {...props}>
46
+ <Title
47
+ size="4"
48
+ tag="span"
49
+ text="User"
50
+ />
51
+ </Link>
52
+ </BreadCrumbs>
53
+ )
54
+ }
55
+
56
+ export default BreadCrumbsDefault
@@ -0,0 +1 @@
1
+ BreadCrumbs can be used for keeping a user aware of there route location.
@@ -0,0 +1,7 @@
1
+ examples:
2
+ rails:
3
+ - bread_crumbs_default: Default
4
+
5
+ react:
6
+ - bread_crumbs_default: Default
7
+
@@ -0,0 +1 @@
1
+ export { default as BreadCrumbsDefault } from './_bread_crumbs_default.jsx'
@@ -9,6 +9,7 @@ import { globalProps } from '../utilities/globalProps.js'
9
9
 
10
10
  type DateStackedProps = {
11
11
  align?: "left" | "center" | "right",
12
+ bold?: boolean,
12
13
  className?: string | array<string>,
13
14
  dark?: boolean,
14
15
  data?: string,
@@ -26,6 +27,7 @@ const sizes = {
26
27
  const DateStacked = (props: DateStackedProps) => {
27
28
  const {
28
29
  align = 'left',
30
+ bold = false,
29
31
  reverse = false,
30
32
  className,
31
33
  dark = false,
@@ -46,19 +48,51 @@ const DateStacked = (props: DateStackedProps) => {
46
48
  const inputYear = dateTimestamp.toYear().toString()
47
49
 
48
50
  return (
49
- <div className={classes}>
50
- <div className="pb_date_stacked_day_month">
51
- <Caption text={dateTimestamp.toMonth().toUpperCase()} />
52
- <Title
53
- dark={dark}
54
- size={sizes[size]}
55
- text={dateTimestamp.toDay()}
56
- />
57
- </div>
58
- <If condition={currentYear != inputYear}>
59
- <Caption size="xs">{inputYear}</Caption>
51
+
52
+ <div>
53
+ <If condition={bold == false}>
54
+
55
+ <div className={classes}>
56
+ <div className="pb_date_stacked_day_month">
57
+ <Caption text={dateTimestamp.toMonth().toUpperCase()} />
58
+ <Title
59
+ dark={dark}
60
+ size={sizes[size]}
61
+ text={dateTimestamp.toDay()}
62
+ />
63
+ </div>
64
+ <If condition={currentYear != inputYear}>
65
+ <Caption size="xs">{inputYear}</Caption>
66
+ </If>
67
+ </div>
68
+ <Else />
69
+ <>
70
+ <div className={classes}>
71
+ <div className="pb_date_stacked_day_month">
72
+
73
+ <Title
74
+ bold
75
+ dark={dark}
76
+ size="4"
77
+ text={dateTimestamp.toMonth()}
78
+ />
79
+ <Title
80
+ bold
81
+ dark={dark}
82
+ size="4"
83
+ text={dateTimestamp.toDay()}
84
+ />
85
+ <If condition={currentYear != inputYear}>
86
+ <Title size="4">{inputYear}</Title>
87
+ </If>
88
+ </div>
89
+
90
+ </div>
91
+
92
+ </>
60
93
  </If>
61
94
  </div>
95
+
62
96
  )
63
97
  }
64
98
 
@@ -3,11 +3,22 @@
3
3
  data: object.data,
4
4
  class: object.classname) do %>
5
5
 
6
- <div class="pb_date_stacked_day_month">
7
- <%= pb_rails("caption", props: { text: object.month }) %>
8
- <%= pb_rails("title", props: { text: object.day , size: object.title_size }) do %>
9
- <% end %>
10
- </div>
11
- <%= pb_rails("caption", props: { text: object.year, size:"xs" }) %>
6
+ <% if object.bold == false %>
7
+
8
+ <div class="pb_date_stacked_day_month">
9
+ <%= pb_rails("caption", props: { text: object.month }) %>
10
+ <%= pb_rails("title", props: { text: object.day , size: object.title_size }) do %><% end %>
11
+ <%= pb_rails("caption", props: { text: object.year, size:"xs" }) %>
12
+ </div>
13
+
14
+ <% else %>
15
+ <div class="pb_date_stacked_day_month">
16
+ <%= pb_rails("title", props: { text: object.month, size: 4 }) %>
17
+ <%= pb_rails("title", props: { text: object.day, size: 4 }) do %><% end %>
18
+ <%= pb_rails("title", props: { text: object.year, size:4 }) %>
19
+
20
+ </div>
21
+
22
+ <% end %>
12
23
 
13
24
  <% end %>
@@ -14,9 +14,11 @@ module Playbook
14
14
  default: false
15
15
  prop :dark, type: Playbook::Props::Boolean,
16
16
  default: false
17
+ prop :bold, type: Playbook::Props::Boolean,
18
+ default: false
17
19
 
18
20
  def classname
19
- generate_classname("pb_date_stacked_kit", align, size, reverse_class, dark_class)
21
+ generate_classname("pb_date_stacked_kit", align, size, bold, reverse_class, dark_class)
20
22
  end
21
23
 
22
24
  def title_size
@@ -31,10 +33,7 @@ module Playbook
31
33
  end
32
34
 
33
35
  def month
34
- month = Playbook::PbKit::PbDateTime.new(date)
35
- content_tag(:time, datetime: month.to_iso) do
36
- month.to_month.to_s
37
- end
36
+ pb_date_time.to_month.capitalize
38
37
  end
39
38
 
40
39
  def year
@@ -47,8 +46,16 @@ module Playbook
47
46
  end
48
47
  end
49
48
 
49
+ def bold_class
50
+ bold ? "bold" : nil
51
+ end
52
+
50
53
  private
51
54
 
55
+ def pb_date_time
56
+ Playbook::PbKit::PbDateTime.new(date)
57
+ end
58
+
52
59
  def reverse_class
53
60
  reverse ? "reverse" : nil
54
61
  end
@@ -0,0 +1,5 @@
1
+ <%= pb_rails("date_stacked", props: { date: DateTime.now, align: "left", bold: true }) %>
2
+ <br>
3
+ <%= pb_rails("date_stacked", props: { date: Date.new(2018, 03, 20), align: "center", bold: true }) %>
4
+ <br>
5
+ <%= pb_rails("date_stacked", props: { date: DateTime.now, align: "right", bold: true }) %>
@@ -0,0 +1,38 @@
1
+ import React from 'react'
2
+ import DateStacked from '../_date_stacked.jsx'
3
+
4
+ const DateStackedBold = (props) => {
5
+ return (
6
+ <div>
7
+ <DateStacked
8
+ align="left"
9
+ bold
10
+ date={new Date()}
11
+ {...props}
12
+ />
13
+
14
+ <br />
15
+
16
+ <DateStacked
17
+ align="center"
18
+ bold
19
+ date={new Date('20 Mar 2018')}
20
+ {...props}
21
+ />
22
+
23
+ <br />
24
+
25
+ <DateStacked
26
+ align="right"
27
+ bold
28
+ date={new Date()}
29
+ {...props}
30
+ />
31
+
32
+ <br />
33
+
34
+ </div>
35
+ )
36
+ }
37
+
38
+ export default DateStackedBold
@@ -6,10 +6,12 @@ examples:
6
6
  - date_stacked_reverse: Day & Month Reverse
7
7
  - date_stacked_sizes: Sizes
8
8
  - date_stacked_align: Alignment
9
+ - date_stacked_bold: Bold
10
+
9
11
 
10
12
  react:
11
13
  - date_stacked_default: Default
12
14
  - date_stacked_not_current_year: Not Current Year
13
15
  - date_stacked_reverse: Day & Month Reverse
14
16
  - date_stacked_sizes: Sizes
15
- - date_stacked_align: Alignment
17
+ - date_stacked_bold: Bold
@@ -1,3 +1,4 @@
1
+ export { default as DateStackedBold } from './_date_stacked_bold.jsx'
1
2
  export { default as DateStackedDefault } from './_date_stacked_default.jsx'
2
3
  export { default as DateStackedNotCurrentYear } from './_date_stacked_not_current_year.jsx'
3
4
  export { default as DateStackedReverse } from './_date_stacked_reverse.jsx'
@@ -1,43 +1,59 @@
1
+
1
2
  /* @flow */
2
3
 
3
4
  import React from 'react'
4
- import { DateStacked, Flex, FlexItem, TimeStacked } from '../'
5
- import { buildDataProps } from '../utilities/props'
6
- import { globalProps } from '../utilities/globalProps.js'
5
+ import { buildCss } from '../utilities/props'
6
+ import { deprecatedProps, globalProps } from '../utilities/globalProps.js'
7
+
8
+ import { DateStacked, Flex, FlexItem, SectionSeparator, TimeStacked } from '../'
7
9
 
8
10
  type DateTimeStackedProps = {
9
- data?: string,
10
11
  id?: string,
11
- date: date,
12
+ date: string,
13
+ datetime: string,
12
14
  dark: boolean,
15
+ timeZone?: string,
13
16
  }
14
17
 
15
18
  const DateTimeStacked = (props: DateTimeStackedProps) => {
16
- const { date, data = {}, dark } = props,
17
- dataProps = buildDataProps(data)
19
+ if (props.date) deprecatedProps('Date Time Stacked', ['date'])
20
+
21
+ const {
22
+ date,
23
+ datetime,
24
+ dark,
25
+ timeZone = 'America/New_York',
26
+ } = props
27
+
28
+ const classes = buildCss('pb_date_time_stacked_kit', globalProps(props))
18
29
 
19
30
  return (
20
31
  <Flex
21
- className={globalProps(props)}
22
- orientation="row"
23
- vertical="center"
24
- {...dataProps}
32
+ inline="flex-container"
33
+ vertical="stretch"
34
+ {...props}
25
35
  >
26
36
  <FlexItem>
27
37
  <DateStacked
28
38
  align="right"
39
+ bold
29
40
  dark={dark}
30
- date={date}
31
- reverse
32
- size="sm"
41
+ date={date || datetime}
42
+ timeZone={timeZone}
33
43
  />
34
44
  </FlexItem>
45
+
46
+ <SectionSeparator
47
+ className="date-time-padding"
48
+ orientation="vertical"
49
+ />
35
50
  <FlexItem>
36
51
  <TimeStacked
37
- className="pb_date_time_stacked_kit"
52
+ className={classes}
38
53
  dark={dark}
54
+ date={date || datetime}
39
55
  tag="caption"
40
- time={date}
56
+ timeZone={timeZone}
41
57
  />
42
58
  </FlexItem>
43
59
  </Flex>
@@ -1,6 +1,25 @@
1
- @import "../pb_title/title";
2
- @import "../pb_body/body";
1
+ [class^=pb_date_time_stacked] {
2
+
3
+ [class^=padding_month] {
4
+ padding-bottom: ($space_xs + 2) !important;
5
+ }
6
+
7
+ [class^=padding_day] {
8
+ padding-bottom: ($space_xs + 2) !important;
9
+ }
10
+
11
+ &[class*=_dark] {
12
+ & > * [class^=pb_title_kit] {
13
+ color: $text_dk_default;
14
+ }
15
+ & > * [class^=pb_caption_kit] {
16
+ color: $text_dk_light;
17
+ }
18
+ }
3
19
 
4
- .pb_date_time_stacked_kit {
5
- padding-left: $space-xs;
6
20
  }
21
+ .date-time-padding {
22
+ padding-right: ($space_xs / 2);
23
+ padding-left: ($space_xs / 2);
24
+ }
25
+
@@ -1,13 +1,17 @@
1
1
  <%= content_tag(:div,
2
2
  id: object.id,
3
3
  data: object.data,
4
- class: object.classname) do %>
5
- <%= pb_rails("flex", props: { orientation: "row", vertical: "center" }) do %>
6
- <%= pb_rails("flex/flex_item") do %>
7
- <%= pb_rails("date_stacked", props: { align: "right", date: object.date, reverse: true, size: "sm", dark: object.dark }) %>
4
+ class: object.classname,
5
+ aria: object.aria) do %>
6
+
7
+ <%= pb_rails("flex", props: {classname: "flex-container", vertical: "stretch"}) do %>
8
+ <%= pb_rails("body", props: {classname: "flex-item"}) do %>
9
+ <%= pb_rails("date_stacked", props: { date: object.date_time_value, size: "sm", align: "right", bold: true, dark: object.dark }) %>
8
10
  <% end %>
9
- <%= pb_rails("flex/flex_item") do %>
10
- <%= pb_rails("time_stacked", props: { classname: "pb_date_time_stacked_kit", time: object.date, tag: "caption" }) %>
11
+ <%= pb_rails("section_separator", props: { orientation: "vertical", classname: "date-time-padding" }) %>
12
+ <%= pb_rails("body", props: {classname: "flex-item"}) do %>
13
+ <%= pb_rails("time_stacked", props: { time: object.date_time_value, dark: object.dark, timezone: object.timezone }) %>
11
14
  <% end %>
12
- <% end %>
13
- <% end %>
15
+ <% end %>
16
+
17
+ <% end %>
@@ -3,10 +3,17 @@
3
3
  module Playbook
4
4
  module PbDateTimeStacked
5
5
  class DateTimeStacked < Playbook::KitBase
6
- prop :date, type: Playbook::Props::Date,
7
- default: ::DateTime.current
6
+ prop :date, deprecated: true
7
+ prop :date_time, type: Playbook::Props::Date,
8
+ default: ::DateTime.current
8
9
  prop :dark, type: Playbook::Props::Boolean,
9
10
  default: false
11
+ prop :timezone, type: Playbook::Props::String,
12
+ default: "America/New_York"
13
+
14
+ def date_time_value
15
+ date || date_time
16
+ end
10
17
  end
11
18
  end
12
19
  end
@@ -0,0 +1,35 @@
1
+ import { ensureAccessible, renderKit } from '../utilities/test-utils'
2
+ import { DateTimeStacked } from '../'
3
+
4
+ /* eslint-disable jsx-control-statements/jsx-jcs-no-undef */
5
+
6
+ const props = {
7
+ data: { testid: 'datetimestacked' },
8
+ datetime: new Date('Wed Mar 31 2021 12:00:00 GMT-0500'),
9
+ }
10
+
11
+ test('Kit renders date time', () => {
12
+ const kit = renderKit(DateTimeStacked, props)
13
+ expect(kit).toBeInTheDocument()
14
+ })
15
+
16
+ it('Should be accessible', async () => {
17
+ ensureAccessible(DateTimeStacked, props)
18
+ })
19
+
20
+ test('renders time in default timezone', () => {
21
+ const kit = renderKit(DateTimeStacked, props)
22
+ expect(kit).toHaveTextContent(/Mar311:00pEDT/i)
23
+ })
24
+
25
+ test('renders time in timezone', () => {
26
+ props.timeZone = 'Asia/Tokyo'
27
+ const kit = renderKit(DateTimeStacked, props)
28
+ expect(kit).toHaveTextContent(/Mar312:00aJST/i)
29
+ })
30
+
31
+ test('renders time in timezone', () => {
32
+ props.timeZone = 'America/Denver'
33
+ const kit = renderKit(DateTimeStacked, props)
34
+ expect(kit).toHaveTextContent(/Mar3111:00aMDT/i)
35
+ })
@@ -1 +1,8 @@
1
- <%= pb_rails("date_time_stacked") %>
1
+ <%= pb_rails("date_time_stacked", props: { date_time: DateTime.now }) %>
2
+ <br>
3
+ <%= pb_rails("date_time_stacked", props: { date_time: Date.new(2018, 03, 20) }) %>
4
+ <br>
5
+ <%= pb_rails("date_time_stacked", props: { date_time: DateTime.now, timezone: "Asia/Tokyo" }) %>
6
+ <br>
7
+ <%= pb_rails("date_time_stacked", props: { date_time: DateTime.now, timezone: "America/Denver" }) %>
8
+
@@ -4,10 +4,28 @@ import { DateTimeStacked } from '../../'
4
4
  const DateTimeStackedDefault = (props) => (
5
5
  <div>
6
6
  <DateTimeStacked
7
- date={new Date()}
7
+ datetime={new Date()}
8
8
  {...props}
9
9
  />
10
+ <br />
11
+ <DateTimeStacked
12
+ datetime={new Date()}
13
+ timeZone="Asia/Tokyo"
14
+
15
+ {...props}
16
+ />
17
+ <br />
18
+ <DateTimeStacked
19
+ datetime={new Date()}
20
+ timeZone="America/Denver"
21
+
22
+ {...props}
23
+ />
24
+
10
25
  </div>
11
26
  )
12
27
 
13
28
  export default DateTimeStackedDefault
29
+
30
+ // *Development Note* - We are reviewing this kit for a potential name change due to naming collisions when `new Date()` is used.
31
+ // To avoid this bug, please use name spacing as shown in the code examples. ie `import { Date as AliasedComponentName } from '../../'
@@ -9,7 +9,7 @@ import { Dialog } from '../'
9
9
  - https://jestjs.io/docs/en/using-matchers
10
10
  */
11
11
 
12
- test('generated scaffold test - update me', () => {
12
+ test('Kit renders Dialog', () => {
13
13
  const testId = 'test1'
14
14
 
15
15
  render(
@@ -2,11 +2,12 @@
2
2
 
3
3
  import React from 'react'
4
4
  import classnames from 'classnames'
5
- import { buildCss } from '../utilities/props'
5
+ import { buildCss, buildDataProps } from '../utilities/props'
6
6
  import { globalProps } from '../utilities/globalProps.js'
7
7
  type FlexProps = {
8
8
  children: array<React.ReactNode> | React.ReactNode,
9
9
  className?: string,
10
+ data?: object,
10
11
  horizontal?: "left" | "center" | "right" | "stretch" | "none",
11
12
  justify?: "start" | "center" | "end" | "around" | "between" | "evenly" | "none",
12
13
  id?: string,
@@ -27,6 +28,7 @@ const Flex = (props: FlexProps) => {
27
28
  align = 'none',
28
29
  children,
29
30
  className,
31
+ data = {},
30
32
  inline = false,
31
33
  horizontal = 'left',
32
34
  justify = 'none',
@@ -51,6 +53,8 @@ const Flex = (props: FlexProps) => {
51
53
  const columnGapClass = columnGap !== 'none' ? `columnGap_${columnGap}` : ''
52
54
  const wrapClass = wrap === true ? 'wrap' : ''
53
55
  const reverseClass = reverse === true ? 'reverse' : ''
56
+ const dataProps = buildDataProps(data)
57
+
54
58
  return (
55
59
  <div
56
60
  className={classnames(
@@ -70,6 +74,7 @@ const Flex = (props: FlexProps) => {
70
74
  globalProps(props),
71
75
  className
72
76
  )}
77
+ {...dataProps}
73
78
  >
74
79
  {children}
75
80
  </div>
@@ -7,7 +7,7 @@ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
7
7
  import { globalProps } from '../utilities/globalProps.js'
8
8
  import useZxcvbn from './useZxcvbn'
9
9
  import useHaveIBeenPwned from './useHaveIBeenPwned'
10
- import { Body, Caption, Flex, Icon, PbReactPopover, ProgressSimple, TextInput } from '../'
10
+ import { Body, Caption, CircleIconButton, Flex, Icon, PbReactPopover, ProgressSimple, TextInput } from '../'
11
11
 
12
12
  type PassphraseProps = {
13
13
  aria?: object,
@@ -69,6 +69,10 @@ const Passphrase = (props: PassphraseProps) => {
69
69
 
70
70
  const [showPopover, setShowPopover] = useState(false)
71
71
  const toggleShowPopover = () => setShowPopover(!showPopover)
72
+ const handleShouldClosePopover = (shouldClosePopover) => {
73
+ setShowPopover(!shouldClosePopover)
74
+ }
75
+
72
76
  const [showPassphrase, setShowPassphrase] = useState(false)
73
77
  const toggleShowPassphrase = () => setShowPassphrase(!showPassphrase)
74
78
 
@@ -85,7 +89,7 @@ const Passphrase = (props: PassphraseProps) => {
85
89
  }, [strength])
86
90
 
87
91
  const tipClass = classnames(
88
- (dark ? 'dark' : null),
92
+ 'passphrase-popover',
89
93
  (showTipsBelow === 'always' ? null : `show-below-${showTipsBelow}`),
90
94
  )
91
95
  const dataProps = useMemo(
@@ -94,17 +98,13 @@ const Passphrase = (props: PassphraseProps) => {
94
98
  )
95
99
 
96
100
  const popoverReference = (
97
- <a
101
+ <CircleIconButton
98
102
  className={tipClass}
103
+ dark={dark}
104
+ icon="info-circle"
99
105
  onClick={toggleShowPopover}
100
- >
101
- <Icon
102
- dark={dark}
103
- icon="info-circle"
104
- size="xs"
105
- variant="link"
106
- />
107
- </a>
106
+ variant="link"
107
+ />
108
108
  )
109
109
 
110
110
  return (
@@ -122,8 +122,10 @@ const Passphrase = (props: PassphraseProps) => {
122
122
  />
123
123
  <If condition={tips.length > 0 && !confirmation}>
124
124
  <PbReactPopover
125
+ closeOnClick="outside"
125
126
  placement="right"
126
127
  reference={popoverReference}
128
+ shouldClosePopover={handleShouldClosePopover}
127
129
  show={showPopover}
128
130
  >
129
131
  <Flex
@@ -9,20 +9,13 @@
9
9
  display: inline;
10
10
  }
11
11
 
12
- a.dark {
13
- color: $white;
12
+ [class*=show-below-] {
13
+ display: none;
14
14
  }
15
-
16
- a {
17
-
18
- &[class*=show-below-] {
19
- display: none;
20
- }
21
- @each $breakpoint_name, $breakpoint in $breakpoints {
22
- &.show-below-#{$breakpoint_name} {
23
- @include break_at($breakpoint) {
24
- display: inline;
25
- }
15
+ @each $breakpoint_name, $breakpoint in $breakpoints {
16
+ .show-below-#{$breakpoint_name} {
17
+ @include break_at($breakpoint) {
18
+ display: inline;
26
19
  }
27
20
  }
28
21
  }
@@ -70,4 +63,16 @@
70
63
  visibility: hidden;
71
64
  }
72
65
  }
66
+ .passphrase-popover {
67
+ position: relative;
68
+ left: -($space_xs * 1.25);
69
+ }
70
+ @-moz-document url-prefix() {
71
+ .passphrase-popover {
72
+ position: relative;
73
+ top: $space_sm;
74
+ left: -($space_xs * 1.5);
75
+ }
76
+ }
73
77
  }
78
+
@@ -38,9 +38,13 @@ const SectionSeparator = (props: SectionSeparatorProps) => {
38
38
  className={classes}
39
39
  id={id}
40
40
  >
41
- <span>
42
- <Caption text={text} />
43
- </span>
41
+
42
+ <If condition={text}>
43
+ <span>
44
+ <Caption text={text} />
45
+ </span>
46
+ </If>
47
+
44
48
  </div>
45
49
  )
46
50
  }
@@ -33,7 +33,7 @@ module Playbook
33
33
  end
34
34
 
35
35
  def add_on_class
36
- has_add_on? ? 'text_input_wrapper_add_on' : nil
36
+ has_add_on? ? "text_input_wrapper_add_on" : nil
37
37
  end
38
38
 
39
39
  def add_on_props
@@ -54,7 +54,7 @@ module Playbook
54
54
  placeholder: placeholder,
55
55
  required: required,
56
56
  type: type,
57
- value: value
57
+ value: value,
58
58
  }
59
59
  end
60
60
 
@@ -3,10 +3,10 @@
3
3
  data: object.data,
4
4
  class: object.classname) do %>
5
5
 
6
- <%= pb_rails("body", props: { color: "light", classname: "pb_time_stacked time-spacing" }) do %>
6
+ <%= pb_rails("body", props: { color: "light", dark: object.dark, classname: "pb_time_stacked time-spacing" }) do %>
7
7
  <time>
8
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" }) %>
9
+ <%= pb_rails("caption", props: { color: "light", tag: "span", text: object.pb_date_time.to_timezone.upcase, dark: object.dark, classname: "pb_time_stacked" }) %>
10
10
  </time>
11
11
  <% end %>
12
12
  <% end %>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playbook
4
- VERSION = "9.12.0.pre.text.addon"
4
+ VERSION = "9.12.0"
5
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: 9.12.0.pre.text.addon
4
+ version: 9.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Power UX
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-05-05 00:00:00.000000000 Z
12
+ date: 2021-05-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -516,6 +516,19 @@ files:
516
516
  - app/pb_kits/playbook/pb_body/docs/_footer.md
517
517
  - app/pb_kits/playbook/pb_body/docs/example.yml
518
518
  - app/pb_kits/playbook/pb_body/docs/index.js
519
+ - app/pb_kits/playbook/pb_bread_crumbs/_bread_crumb_item.jsx
520
+ - app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.jsx
521
+ - app/pb_kits/playbook/pb_bread_crumbs/_bread_crumbs.scss
522
+ - app/pb_kits/playbook/pb_bread_crumbs/bread_crumb_item.html.erb
523
+ - app/pb_kits/playbook/pb_bread_crumbs/bread_crumb_item.rb
524
+ - app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.html.erb
525
+ - app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.rb
526
+ - app/pb_kits/playbook/pb_bread_crumbs/bread_crumbs.test.js
527
+ - app/pb_kits/playbook/pb_bread_crumbs/docs/_bread_crumbs_default.html.erb
528
+ - app/pb_kits/playbook/pb_bread_crumbs/docs/_bread_crumbs_default.jsx
529
+ - app/pb_kits/playbook/pb_bread_crumbs/docs/_description.md
530
+ - app/pb_kits/playbook/pb_bread_crumbs/docs/example.yml
531
+ - app/pb_kits/playbook/pb_bread_crumbs/docs/index.js
519
532
  - app/pb_kits/playbook/pb_button/_button.jsx
520
533
  - app/pb_kits/playbook/pb_button/_button.scss
521
534
  - app/pb_kits/playbook/pb_button/_button_mixins.scss
@@ -809,6 +822,8 @@ files:
809
822
  - app/pb_kits/playbook/pb_date_stacked/date_stacked.rb
810
823
  - app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_align.html.erb
811
824
  - app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_align.jsx
825
+ - app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_bold.html.erb
826
+ - app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_bold.jsx
812
827
  - app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_default.html.erb
813
828
  - app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_default.jsx
814
829
  - app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_not_current_year.html.erb
@@ -838,6 +853,7 @@ files:
838
853
  - app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.scss
839
854
  - app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb
840
855
  - app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.rb
856
+ - app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js
841
857
  - app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.html.erb
842
858
  - app/pb_kits/playbook/pb_date_time_stacked/docs/_date_time_stacked_default.jsx
843
859
  - app/pb_kits/playbook/pb_date_time_stacked/docs/example.yml
@@ -2139,9 +2155,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
2139
2155
  version: '0'
2140
2156
  required_rubygems_version: !ruby/object:Gem::Requirement
2141
2157
  requirements:
2142
- - - ">"
2158
+ - - ">="
2143
2159
  - !ruby/object:Gem::Version
2144
- version: 1.3.1
2160
+ version: '0'
2145
2161
  requirements: []
2146
2162
  rubyforge_project:
2147
2163
  rubygems_version: 2.7.3