playbook_ui 13.2.0 → 13.4.0

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