playbook_ui 13.2.0 → 13.4.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +1 -0
  3. data/app/pb_kits/playbook/pb_body/_body.scss +5 -0
  4. data/app/pb_kits/playbook/pb_body/_body.tsx +4 -1
  5. data/app/pb_kits/playbook/pb_body/_body_mixins.scss +19 -0
  6. data/app/pb_kits/playbook/pb_body/body.rb +8 -1
  7. data/app/pb_kits/playbook/pb_button/button.html.erb +2 -2
  8. data/app/pb_kits/playbook/pb_button/button.rb +3 -0
  9. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.tsx +5 -1
  10. data/app/pb_kits/playbook/pb_kit/dateTime.ts +54 -23
  11. data/app/pb_kits/playbook/pb_table/docs/_table_header.html.erb +54 -0
  12. data/app/pb_kits/playbook/pb_table/docs/_table_header.md +1 -0
  13. data/app/pb_kits/playbook/pb_table/docs/_table_two_actions.jsx +3 -3
  14. data/app/pb_kits/playbook/pb_table/docs/example.yml +1 -0
  15. data/app/pb_kits/playbook/pb_table/styles/_all.scss +1 -0
  16. data/app/pb_kits/playbook/pb_table/styles/_table_header.scss +31 -0
  17. data/app/pb_kits/playbook/pb_table/table_header.html.erb +64 -0
  18. data/app/pb_kits/playbook/pb_table/table_header.rb +53 -0
  19. data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +14 -7
  20. data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_unstyled.html.erb +21 -0
  21. data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_unstyled.jsx +36 -0
  22. data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_unstyled.md +1 -0
  23. data/app/pb_kits/playbook/pb_timestamp/docs/example.yml +3 -1
  24. data/app/pb_kits/playbook/pb_timestamp/docs/index.js +1 -0
  25. data/app/pb_kits/playbook/pb_timestamp/timestamp.html.erb +5 -1
  26. data/app/pb_kits/playbook/pb_timestamp/timestamp.rb +3 -1
  27. data/app/pb_kits/playbook/pb_title/_title.scss +8 -4
  28. data/app/pb_kits/playbook/pb_title/_title.tsx +4 -1
  29. data/app/pb_kits/playbook/pb_title/_title_mixin.scss +19 -0
  30. data/app/pb_kits/playbook/pb_title/title.rb +9 -2
  31. data/app/pb_kits/playbook/tokens/_spacing.scss +1 -1
  32. data/app/pb_kits/playbook/tokens/_text_align.scss +18 -0
  33. data/app/pb_kits/playbook/utilities/_hover.scss +4 -0
  34. data/app/pb_kits/playbook/utilities/_max_width.scss +4 -0
  35. data/app/pb_kits/playbook/utilities/_spacing.scss +92 -49
  36. data/app/pb_kits/playbook/utilities/_text_align.scss +3 -0
  37. data/app/pb_kits/playbook/utilities/globalProps.ts +30 -2
  38. data/dist/playbook-rails.js +5 -5
  39. data/lib/playbook/classnames.rb +1 -0
  40. data/lib/playbook/hover.rb +6 -2
  41. data/lib/playbook/kit_base.rb +2 -0
  42. data/lib/playbook/spacing.rb +13 -4
  43. data/lib/playbook/text_align.rb +37 -0
  44. data/lib/playbook/version.rb +2 -2
  45. metadata +13 -2
@@ -21,6 +21,8 @@ module Playbook
21
21
  prop :show_user, type: Playbook::Props::Boolean,
22
22
  default: false
23
23
  prop :timezone, default: "America/New_York"
24
+ prop :unstyled, type: Playbook::Props::Boolean,
25
+ default: false
24
26
  prop :variant, type: Playbook::Props::Enum,
25
27
  values: %w[default elapsed updated],
26
28
  default: "default"
@@ -29,7 +31,7 @@ module Playbook
29
31
  generate_classname("pb_timestamp_kit", variant_class, align)
30
32
  end
31
33
 
32
- def caption_text
34
+ def timestamp_text
33
35
  case variant
34
36
  when "updated"
35
37
  format_updated_string
@@ -27,14 +27,14 @@
27
27
  @include title_colors;
28
28
  }
29
29
 
30
- &.dark {
31
- @include pb_title_dark;
32
- }
33
-
34
30
  &[class*=_thin] {
35
31
  @include pb_title_thin;
36
32
  }
37
33
 
34
+ &[class*=_truncate] {
35
+ @include title_truncate;
36
+ }
37
+
38
38
  @each $size, $size_value in $breakpoints_grid {
39
39
  @each $title_size_value in [1, 2, 3, 4] {
40
40
  $min_size: map-get($size_value, "min");
@@ -46,9 +46,13 @@
46
46
  @else if $title_size_value == 3 { @include pb_title_3; }
47
47
  @else if $title_size_value == 4 { @include pb_title_4; }
48
48
  @include title_colors;
49
+ @include title_truncate;
49
50
  @if $title_size_value != 4 { @include pb_title_bold; }
50
51
  }
51
52
  }
52
53
  }
53
54
  }
55
+ &.dark {
56
+ @include pb_title_dark;
57
+ }
54
58
  }
@@ -17,6 +17,7 @@ type TitleProps = {
17
17
  size?: SizeType | SizeResponsiveType,
18
18
  tag?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "div" | "span",
19
19
  text?: string,
20
+ truncate?: null | '1' | '2' | '3' | '4' | '5',
20
21
  variant?: null | "link",
21
22
  } & GlobalProps
22
23
 
@@ -33,12 +34,14 @@ const Title = (props: TitleProps): React.ReactElement => {
33
34
  bold = true,
34
35
  tag = 'h3',
35
36
  text,
37
+ truncate = null,
36
38
  variant = null,
37
39
  } = props
38
40
 
39
41
  const ariaProps: {[key: string]: string | number} = buildAriaProps(aria)
40
42
  const dataProps: {[key: string]: string | number} = buildDataProps(data)
41
43
  const getBold = bold ? '' : 'thin'
44
+ const isTruncated = truncate ? `truncate_${truncate}` : null
42
45
  const isSizeNumberOrString = typeof size === "number" || typeof size === "string"
43
46
 
44
47
  const buildResponsiveSizeCss = () => {
@@ -54,7 +57,7 @@ const Title = (props: TitleProps): React.ReactElement => {
54
57
  }
55
58
 
56
59
  const classes = classnames(
57
- buildCss('pb_title_kit', isSizeNumberOrString ? `size_${size}` : "", variant, color, getBold),
60
+ buildCss('pb_title_kit', isSizeNumberOrString ? `size_${size}` : "", variant, color, getBold, isTruncated),
58
61
  globalProps(props),
59
62
  buildResponsiveSizeCss(),
60
63
  className
@@ -15,4 +15,23 @@ $pb_title_colors: (
15
15
  color: $color
16
16
  }
17
17
  }
18
+ }
19
+
20
+ $pb_title_truncate: (
21
+ truncate_1: 1,
22
+ truncate_2: 2,
23
+ truncate_3: 3,
24
+ truncate_4: 4,
25
+ truncate_5: 5
26
+ );
27
+
28
+ @mixin title_truncate {
29
+ @each $name, $number in $pb_title_truncate {
30
+ &[class*=_#{$name}] {
31
+ overflow: hidden;
32
+ display: -webkit-box;
33
+ -webkit-line-clamp: $number;
34
+ -webkit-box-orient: vertical;
35
+ }
36
+ }
18
37
  }
@@ -16,12 +16,15 @@ module Playbook
16
16
  default: nil,
17
17
  deprecated: true
18
18
  prop :bold, type: Playbook::Props::Boolean, default: true
19
+ prop :truncate, type: Playbook::Props::Enum,
20
+ values: [nil, "1", "2", "3", "4", "5"],
21
+ default: nil
19
22
 
20
23
  def classname
21
24
  if is_size_responsive
22
- generate_classname("pb_title_kit", variant, color, is_bold) + generate_responsive_size_classname
25
+ generate_classname("pb_title_kit", variant, color, is_bold, is_truncated) + generate_responsive_size_classname
23
26
  else
24
- generate_classname("pb_title_kit", size, variant, color, is_bold)
27
+ generate_classname("pb_title_kit", size, variant, color, is_bold, is_truncated)
25
28
  end
26
29
  end
27
30
 
@@ -29,6 +32,10 @@ module Playbook
29
32
  bold ? nil : "thin"
30
33
  end
31
34
 
35
+ def is_truncated
36
+ truncate ? "truncate_#{truncate}" : nil
37
+ end
38
+
32
39
  def is_size_responsive
33
40
  try(:size).is_a?(::Hash)
34
41
  end
@@ -4,7 +4,7 @@ $space_sm: 16px !default;
4
4
  $space_md: 24px !default;
5
5
  $space_lg: 32px !default;
6
6
  $space_xl: 40px !default;
7
- $spaces:(
7
+ $spaces: (
8
8
  space_xxs: $space_xxs,
9
9
  space_xs: $space_xs,
10
10
  space_sm: $space_sm,
@@ -0,0 +1,18 @@
1
+ $text_align_start: start !default;
2
+ $text_align_end: end !default;
3
+ $text_align_left: left !default;
4
+ $text_align_right: right !default;
5
+ $text_align_center: center !default;
6
+ $text_align_justify: justify !default;
7
+ $text_align_justify_all: justify-all !default;
8
+ $text_align_match_parent: match-parent !default;
9
+ $text_align: (
10
+ start: $text_align_start,
11
+ end: $text_align_end,
12
+ left: $text_align_left,
13
+ right: $text_align_right,
14
+ center: $text_align_center,
15
+ justify: $text_align_justify,
16
+ justify_all: $text_align_justify_all,
17
+ match_parent: $text_align_match_parent
18
+ );
@@ -6,6 +6,10 @@
6
6
  background-color: $color !important;
7
7
  transition: background-color $transition-speed ease;
8
8
  }
9
+ .hover_color_#{$name}:hover {
10
+ color: $color !important;
11
+ transition: color $transition-speed ease;
12
+ }
9
13
  }
10
14
  }
11
15
 
@@ -23,3 +23,7 @@
23
23
  .max_width_xl {
24
24
  max-width: 1140px;
25
25
  }
26
+
27
+ .max_width_xxl {
28
+ max-width: 1320px;
29
+ }
@@ -1,69 +1,112 @@
1
1
  @import "../tokens/spacing";
2
2
 
3
3
  $space_classes: (
4
- xxs: $space_xxs,
5
- xs: $space_xs,
6
- sm: $space_sm,
7
- md: $space_md,
8
- lg: $space_lg,
9
- xl: $space_xl,
10
- none: 0,
4
+ xxs: $space_xxs,
5
+ xs: $space_xs,
6
+ sm: $space_sm,
7
+ md: $space_md,
8
+ lg: $space_lg,
9
+ xl: $space_xl,
10
+ none: 0,
11
11
  auto: auto,
12
12
  initial: initial,
13
13
  inherit: inherit
14
14
  );
15
15
 
16
16
  $positions: (
17
- m: "margin",
18
- mr: "margin-right",
19
- ml: "margin-left",
20
- mt: "margin-top",
21
- mb: "margin-bottom",
22
- mx: ("margin-left", "margin-right"),
23
- my: ("margin-top", "margin-bottom"),
24
- p: "padding",
25
- pr: "padding-right",
26
- pl: "padding-left",
27
- pt: "padding-top",
28
- pb: "padding-bottom",
29
- px: ("padding-left", "padding-right"),
30
- py: ("padding-top", "padding-bottom")
17
+ m: "margin",
18
+ mr: "margin-right",
19
+ ml: "margin-left",
20
+ mt: "margin-top",
21
+ mb: "margin-bottom",
22
+ mx: ("margin-left", "margin-right"),
23
+ my: ("margin-top", "margin-bottom"),
24
+ p: "padding",
25
+ pr: "padding-right",
26
+ pl: "padding-left",
27
+ pt: "padding-top",
28
+ pb: "padding-bottom",
29
+ px: ("padding-left", "padding-right"),
30
+ py: ("padding-top", "padding-bottom")
31
31
  );
32
32
 
33
- @each $position_name, $position in $positions {
34
- @each $space_name, $space in $space_classes {
35
- .#{$position_name}_#{$space_name} {
36
- @if type-of($position)=="list" {
37
- @each $coordinate in $position {
38
- #{$coordinate}: #{$space} !important;
39
- }
40
- }
41
- @else {
42
- #{$position}: #{$space} !important;
43
- }
44
- }
45
- }
33
+ $break_methods: (
34
+ at: "break_at",
35
+ on: "break_on",
36
+ );
37
+
38
+ @each $position_name,
39
+ $position in $positions {
40
+
41
+ @each $space_name,
42
+ $space in $space_classes {
43
+ .#{$position_name}_#{$space_name} {
44
+ @if type-of($position)=="list" {
45
+ @each $coordinate in $position {
46
+ #{$coordinate}: #{$space} !important;
47
+ }
48
+ }
49
+
50
+ @else {
51
+ #{$position}: #{$space} !important;
52
+ }
53
+ }
54
+ }
46
55
  }
47
56
 
48
- @each $size, $size_value in $breakpoints_max_only {
49
- @each $position_name, $position in $positions {
50
- @each $space_name, $space in $space_classes {
51
- $min_size: map-get($size_value, "min");
52
- $max_size: map-get($size_value, "max");
53
- .#{$position_name}_#{$size}_#{$space_name} {
54
- @if type-of($position)=="list" {
55
- @each $coordinate in $position {
56
- @include break_at( $max_size) {
57
- #{$coordinate}: #{$space} !important;
57
+ // Generate media queries
58
+ @each $size,
59
+ $size_value in $breakpoints_grid {
60
+
61
+ @each $position_name,
62
+ $position in $positions {
63
+
64
+ @each $break_method,
65
+ $method in $break_methods {
66
+
67
+ @each $space_name,
68
+ $space in $space_classes {
69
+ $min_size: map-get($size_value, "min");
70
+ $max_size: map-get($size_value, "max");
71
+
72
+ .break_#{$break_method}_#{$size}\:#{$position_name}_#{$space_name} {
73
+ @if type-of($position) == "list" {
74
+ @if $break_method == "on" {
75
+ @each $coordinate in $position {
76
+ @include break_on($min_size, $max_size) {
77
+ #{$coordinate}: #{$space} !important;
78
+ }
79
+ }
80
+ }
81
+
82
+ @else {
83
+ @each $coordinate in $position {
84
+ @if ($max_size != null) {
85
+ @include break_at($max_size) {
86
+ #{$coordinate}: #{$space} !important;
87
+ }
88
+ }
58
89
  }
59
90
  }
60
91
  }
92
+
61
93
  @else {
62
- @include break_at( $max_size) {
63
- #{$position}: #{$space} !important;
94
+ @if $break_method == "on" {
95
+ @include break_on($min_size, $max_size) {
96
+ #{$position}: #{$space} !important;
97
+ }
98
+ }
99
+
100
+ @else {
101
+ @if ($max_size != null) {
102
+ @include break_at($max_size) {
103
+ #{$position}: #{$space} !important;
104
+ }
105
+ }
64
106
  }
65
107
  }
66
- }
67
- }
68
- }
108
+ }
109
+ }
110
+ }
111
+ }
69
112
  }
@@ -0,0 +1,3 @@
1
+ @import "../tokens/text_align";
2
+
3
+ @include global_props_responsive_css($text_align, 'text_align', 'text-align');
@@ -62,6 +62,7 @@ type FlexWrap = {
62
62
 
63
63
  type Hover = Shadow & {
64
64
  background?: string,
65
+ color?: string,
65
66
  scale?: "sm" | "md" | "lg"
66
67
  }
67
68
 
@@ -85,6 +86,8 @@ type Margin = {
85
86
  marginX?: AllSizes,
86
87
  marginY?: AllSizes,
87
88
  margin?: AllSizes,
89
+ break?: string,
90
+ default?: string
88
91
  }
89
92
 
90
93
  type MaxWidth = {
@@ -107,6 +110,8 @@ type Padding = {
107
110
  paddingX?: AllSizes,
108
111
  paddingY?: AllSizes,
109
112
  padding?: AllSizes,
113
+ break?: string,
114
+ default?: string
110
115
  }
111
116
 
112
117
  type Position = {
@@ -119,6 +124,10 @@ type Shadow = {
119
124
 
120
125
  type Space = "spaceBetween" | "spaceAround" | "spaceEvenly"
121
126
 
127
+ type TextAlign = {
128
+ textAlign?: "start" | "end" | "left" | "right" | "center" | "justify" | "justifyAll" | "matchParent",
129
+ }
130
+
122
131
  type ZIndexType = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
123
132
  type ZIndexResponsiveType = {[key: string]: ZIndexType}
124
133
  type ZIndex = {
@@ -130,7 +139,7 @@ export type GlobalProps = AlignContent & AlignItems & AlignSelf &
130
139
  BorderRadius & Cursor & Dark & Display & DisplaySizes & Flex & FlexDirection &
131
140
  FlexGrow & FlexShrink & FlexWrap & JustifyContent & JustifySelf &
132
141
  LineHeight & Margin & MaxWidth & NumberSpacing & Order & Padding &
133
- Position & Shadow & ZIndex & { hover?: string };
142
+ Position & Shadow & TextAlign & ZIndex & { hover?: string };
134
143
 
135
144
  const getResponsivePropClasses = (prop: {[key: string]: string}, classPrefix: string) => {
136
145
  const keys: string[] = Object.keys(prop)
@@ -149,6 +158,7 @@ const PROP_CATEGORIES: {[key:string]: (props: {[key: string]: any}) => string} =
149
158
  css += hover.shadow ? `hover_shadow_${hover.shadow} ` : '';
150
159
  css += hover.background ? `hover_background_${hover.background } ` : '';
151
160
  css += hover.scale ? `hover_scale_${hover.scale} ` : '';
161
+ css += hover.color ? `hover_color_${hover.color } ` : '';
152
162
  return css;
153
163
  },
154
164
 
@@ -186,13 +196,24 @@ const PROP_CATEGORIES: {[key:string]: (props: {[key: string]: any}) => string} =
186
196
  padding,
187
197
  };
188
198
 
199
+ const screenSizeValues = ["xs", "sm", "md", "lg", "xl"]
200
+
189
201
  function handleObjectValue(properties: Margin | Padding, prefix: string) {
190
202
  let classResult = '';
191
203
 
204
+ const breakValue = properties.break || "on";
205
+ const defaultValue = properties.default || null;
206
+
192
207
  Object.entries(properties).forEach(([key, value]) => {
193
- classResult += `${prefix}_${key}_${value} `;
208
+ if (screenSizeValues.includes(key)) {
209
+ classResult += `break_${breakValue}_${key}:${prefix}_${value} `;
210
+ }
194
211
  });
195
212
 
213
+ if (defaultValue) {
214
+ classResult += `${prefix}_${defaultValue} `;
215
+ }
216
+
196
217
  return classResult;
197
218
  }
198
219
 
@@ -377,6 +398,13 @@ const PROP_CATEGORIES: {[key:string]: (props: {[key: string]: any}) => string} =
377
398
  css += position && position !== 'static' ? `position_${position}` : ''
378
399
  return css
379
400
  },
401
+ textAlignProps: ({ textAlign }: TextAlign) => {
402
+ if (typeof textAlign === 'object') {
403
+ return getResponsivePropClasses(textAlign, 'text_align')
404
+ } else {
405
+ return textAlign ? `text_align_${textAlign} ` : ''
406
+ }
407
+ }
380
408
  }
381
409
 
382
410
  type DefaultProps = {[key: string]: string} | Record<string, unknown>