playbook_ui 9.12.0.pre.text.addon → 9.12.0

Sign up to get free protection for your applications and to get access to all the features.
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