playbook_ui 13.29.0 → 13.30.0.pre.alpha.PLAY1328fixtimelinekitglobalpropsreact3096

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/index.js +1 -0
  4. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_horizontal.html.erb +58 -0
  5. data/app/pb_kits/playbook/pb_bar_graph/docs/_bar_graph_horizontal.jsx +68 -0
  6. data/app/pb_kits/playbook/pb_bar_graph/docs/example.yml +2 -0
  7. data/app/pb_kits/playbook/pb_bar_graph/docs/index.js +1 -0
  8. data/app/pb_kits/playbook/pb_card/_card.scss +5 -0
  9. data/app/pb_kits/playbook/pb_card/_card.tsx +56 -9
  10. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +9 -5
  11. data/app/pb_kits/playbook/pb_collapsible/_collapsible.tsx +2 -6
  12. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +2 -3
  13. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +2 -2
  14. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default.jsx +1 -1
  15. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default.md +1 -1
  16. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers.jsx +8 -7
  17. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_multiple_containers.md +1 -0
  18. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards.jsx +13 -32
  19. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards.md +3 -0
  20. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list.jsx +5 -5
  21. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list.md +1 -1
  22. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_selectable_list.jsx +5 -5
  23. data/app/pb_kits/playbook/pb_draggable/draggable.test.jsx +1 -3
  24. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +72 -0
  25. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +78 -0
  26. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_default.jsx +40 -0
  27. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_default.md +7 -0
  28. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_multi_directional.jsx +36 -0
  29. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_multi_directional.md +5 -0
  30. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +4 -0
  31. data/app/pb_kits/playbook/pb_overlay/docs/index.js +2 -0
  32. data/app/pb_kits/playbook/pb_overlay/overlay.test.jsx +66 -0
  33. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_percentage.tsx +57 -0
  34. data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +48 -0
  35. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +43 -25
  36. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_column_rails.html.erb +32 -33
  37. data/app/pb_kits/playbook/pb_table/table_header.html.erb +0 -2
  38. data/app/pb_kits/playbook/pb_timeline/_item.tsx +11 -10
  39. data/app/pb_kits/playbook/pb_timeline/_timeline.tsx +8 -6
  40. data/app/pb_kits/playbook/playbook-doc.js +2 -0
  41. data/dist/menu.yml +5 -1
  42. data/dist/playbook-rails.js +6 -6
  43. data/lib/playbook/kit_base.rb +19 -0
  44. data/lib/playbook/version.rb +2 -2
  45. metadata +20 -5
@@ -0,0 +1,72 @@
1
+ @import "../tokens/colors";
2
+ @import "../tokens/spacing";
3
+
4
+ $overlay_sizes: (
5
+ full: 100%,
6
+ xxs: $space_xxs,
7
+ xs: $space_xs,
8
+ sm: $space_sm,
9
+ md: $space_md,
10
+ lg: $space_lg,
11
+ xl: $space_xl,
12
+ );
13
+
14
+ $overlay_positions: left, right, top, bottom, x, y;
15
+
16
+ $overlay_colors: (
17
+ card_light: $card_light,
18
+ card_dark: $card_dark,
19
+ bg_dark: $bg_dark,
20
+ bg_light: $bg_light,
21
+ );
22
+
23
+ @mixin overlay($direction, $size, $color) {
24
+ display: block;
25
+ position: absolute;
26
+ pointer-events: none;
27
+ z-index: 1;
28
+ content: "";
29
+
30
+ @if $direction == "left" {
31
+ inset: 0 auto 0 0;
32
+ background: linear-gradient(to right, $color 0%, transparent 100%);
33
+ width: $size;
34
+ }
35
+ @if $direction == "right" {
36
+ inset: 0 0 0 auto;
37
+ background: linear-gradient(to left, $color 0%, transparent 100%);
38
+ width: $size;
39
+ }
40
+ @if $direction == "top" {
41
+ inset: 0 0 auto 0;
42
+ background: linear-gradient(to bottom, $color 0%, transparent 100%);
43
+ height: $size;
44
+ }
45
+ @if $direction == "bottom" {
46
+ inset: auto 0 0 0;
47
+ background: linear-gradient(to top, $color 0%, transparent 100%);
48
+ height: $size;
49
+ }
50
+ }
51
+
52
+ [class^=pb_overlay] {
53
+ position: relative;
54
+ @each $color_name, $color in $overlay_colors {
55
+ .overlay_#{$color_name} {
56
+ @each $name, $size in $overlay_sizes {
57
+ @each $position in $overlay_positions {
58
+ &_#{$position}_#{$name} {
59
+ @include overlay($position, $size, $color);
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+
66
+ .overlay_linear_gradient {
67
+ inset: 0;
68
+ position: absolute;
69
+ pointer-events: none;
70
+ z-index: 1;
71
+ }
72
+ }
@@ -0,0 +1,78 @@
1
+ import React from 'react'
2
+ import classnames from 'classnames'
3
+ import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
4
+ import { globalProps } from '../utilities/globalProps'
5
+ import OverlayPercentage from './subcomponents/_overlay_percentage'
6
+ import OverlayToken from './subcomponents/_overlay_token'
7
+
8
+ export type OverlayChildrenProps = {
9
+ children: React.ReactNode[] | React.ReactNode,
10
+ color: "card_light" | "bg_light" | "card_dark" | "bg_dark",
11
+ position: string,
12
+ size: string,
13
+ }
14
+
15
+ type OverlayProps = {
16
+ aria?: { [key: string]: string },
17
+ className?: string,
18
+ children: React.ReactNode[] | React.ReactNode,
19
+ color: "card_light" | "bg_light" | "card_dark" | "bg_dark",
20
+ data?: { [key: string]: string },
21
+ htmlOptions?: { [key: string]: string | number | boolean | (() => void) },
22
+ id?: string,
23
+ layout: { [key: string]: string },
24
+ }
25
+
26
+ const Overlay = (props: OverlayProps) => {
27
+ const {
28
+ aria = {},
29
+ className,
30
+ children,
31
+ color = "card_light",
32
+ data = {},
33
+ htmlOptions = {},
34
+ id,
35
+ layout = { "bottom": "full" },
36
+ } = props
37
+
38
+ const ariaProps = buildAriaProps(aria)
39
+ const dataProps = buildDataProps(data)
40
+ const classes = classnames(buildCss('pb_overlay'), globalProps(props), className)
41
+ const htmlProps = buildHtmlProps(htmlOptions)
42
+
43
+ const getPosition = () => {
44
+ return Object.keys(layout)[0]
45
+ }
46
+
47
+ const getSize = () => {
48
+ return Object.values(layout)[0]
49
+ }
50
+
51
+ const isSizePercentage = getSize().includes("%")
52
+
53
+ return (
54
+ <div
55
+ {...ariaProps}
56
+ {...dataProps}
57
+ {...htmlProps}
58
+ className={classes}
59
+ id={id}
60
+ >
61
+ {isSizePercentage ?
62
+ OverlayPercentage({
63
+ children,
64
+ color,
65
+ position: getPosition(),
66
+ size: getSize()
67
+ }) : OverlayToken({
68
+ children,
69
+ color,
70
+ position: getPosition(),
71
+ size: getSize()
72
+ })
73
+ }
74
+ </div>
75
+ )
76
+ }
77
+
78
+ export default Overlay
@@ -0,0 +1,40 @@
1
+ import React from 'react'
2
+ import {
3
+ Overlay,
4
+ Table,
5
+ } from '../..'
6
+
7
+ const TableExample = () => {
8
+ return (
9
+ <Table size="sm">
10
+ <thead>
11
+ <tr>
12
+ <th>{'Column 1'}</th>
13
+ <th>{'Column 2'}</th>
14
+ <th>{'Column 3'}</th>
15
+ <th>{'Column 4'}</th>
16
+ <th>{'Column 5'}</th>
17
+ </tr>
18
+ </thead>
19
+ <tbody>
20
+ {Array.from({ length: 7 }, (_, index) => (
21
+ <tr key={index}>
22
+ {Array.from({ length: 5 }, (_, columnIndex) => (
23
+ <td key={columnIndex}>{`Value ${columnIndex + 1}`}</td>
24
+ ))}
25
+ </tr>
26
+ ))}
27
+ </tbody>
28
+ </Table>
29
+ )
30
+ }
31
+
32
+ const OverlayDefault = () => (
33
+ <>
34
+ <Overlay>
35
+ <TableExample />
36
+ </Overlay>
37
+ </>
38
+ )
39
+
40
+ export default OverlayDefault
@@ -0,0 +1,7 @@
1
+ Overlays require a `color`, which sets the "start" (opaque) color of a gradient mask. Because this overlay is intended to reveal underlying content, the "end" color is fixed to transparent.
2
+
3
+ The optional `layout` prop accepts a `position` and a `size` as a key:value pair object.
4
+
5
+ The `position` key accepts `top`, `bottom`, `y` (for both top and bottom) `right`, `left`, or `x` (for both left and right), which sets the side(s) where the `color` overlay starts. The direction of the overlay is always toward the opposite side of the position. For example, the default position of `bottom` starts the overlay on the bottom edge of your container and extends it toward the opposite side: the top.
6
+
7
+ The `size` value accepts our [spacing tokens](https://playbook.powerapp.cloud/visual_guidelines/spacing) or a percentage value as a string, and literally translates to how much of the container is covered by the overlay. By default, `size` is set to `full` (100%) so that your overlay covers the entire container with a smooth fade from `color` at its starting edge, fading to transparent and ending at the containers opposite edge.
@@ -0,0 +1,36 @@
1
+ import React from 'react'
2
+ import {
3
+ Overlay,
4
+ Card,
5
+ Flex,
6
+ FlexItem,
7
+ } from '../..'
8
+
9
+ const InlineCardsExample = () => {
10
+ return (
11
+ <Flex
12
+ columnGap="lg"
13
+ orientation="row"
14
+ overflowX="auto"
15
+ >
16
+ {Array.from({ length: 15 }, (_, index) => (
17
+ <FlexItem key={index}>
18
+ <Card>{"Card Content"}</Card>
19
+ </FlexItem>
20
+ ))}
21
+ </Flex>
22
+ )
23
+ }
24
+
25
+ const OverlayMultiDirectional = () => (
26
+ <>
27
+ <Overlay
28
+ color="card_light"
29
+ layout={{"x": "xl"}}
30
+ >
31
+ <InlineCardsExample />
32
+ </Overlay>
33
+ </>
34
+ )
35
+
36
+ export default OverlayMultiDirectional
@@ -0,0 +1,5 @@
1
+ Optionally, you can pass multi-directional options (`x` or `y`) to the `position` key, which creates multiple overlays.
2
+
3
+ Your `color` is still applied as the starting edge to both overlays, and each mask will fade to transparent moving toward its opposite edge, ending at the `size` value you set.
4
+
5
+ NOTE: Multi-directional overlays share the available container space, so passing `full` or a percentage string greater than 50% to a multi-directional overlay will cause your masks to overlap at the midline of your container. As a best practice, we do not recommend exceeding a percentage size of 25% when using multi-directional overlays.
@@ -0,0 +1,4 @@
1
+ examples:
2
+ react:
3
+ - overlay_default: Default
4
+ - overlay_multi_directional: Multi-directional
@@ -0,0 +1,2 @@
1
+ export { default as OverlayDefault } from './_overlay_default.jsx'
2
+ export { default as OverlayMultiDirectional } from './_overlay_multi_directional.jsx'
@@ -0,0 +1,66 @@
1
+ import React from 'react'
2
+
3
+ import { render, screen } from '../utilities/test-utils'
4
+ import { Overlay } from '..'
5
+
6
+ const testId = "overlay"
7
+ const children = "This is the Overlay children"
8
+
9
+ test('should pass data prop', () => {
10
+ const props = {
11
+ children,
12
+ data: { testid: testId }
13
+ }
14
+
15
+ render(<Overlay {...props} />)
16
+ const kit = screen.getByTestId(testId)
17
+ expect(kit).toBeInTheDocument()
18
+ })
19
+
20
+ test("should pass className prop", () => {
21
+ const className = "custom-class-name"
22
+ const props = {
23
+ className,
24
+ children,
25
+ data: { testid: testId },
26
+ }
27
+
28
+ render(<Overlay {...props} />)
29
+ const kit = screen.getByTestId(testId)
30
+ expect(kit).toHaveClass(className)
31
+ })
32
+
33
+ test('should pass aria prop', () => {
34
+ const props = {
35
+ aria: { label: testId },
36
+ children,
37
+ data: { testid: testId },
38
+ }
39
+
40
+ render(<Overlay {...props} />)
41
+ const kit = screen.getByTestId(testId)
42
+ expect(kit).toHaveAttribute('aria-label', testId)
43
+ })
44
+
45
+ test('should pass id prop', () => {
46
+ const props = {
47
+ children,
48
+ data: { testid: testId },
49
+ id: testId
50
+ }
51
+
52
+ render(<Overlay {...props} />)
53
+ const kit = screen.getByTestId(testId)
54
+ expect(kit).toHaveAttribute('id', testId)
55
+ })
56
+
57
+ test('should render children', () => {
58
+ const props = {
59
+ children,
60
+ data: { testid: testId }
61
+ }
62
+
63
+ render(<Overlay {...props} />)
64
+ const kit = screen.getByTestId(testId)
65
+ expect(kit).toHaveTextContent(props.children)
66
+ })
@@ -0,0 +1,57 @@
1
+ import React from 'react'
2
+ import defaultColors from "../../tokens/exports/_colors.scss";
3
+ import { OverlayChildrenProps } from '../_overlay';
4
+
5
+
6
+ const previousOverlayDirectionMap: { [key: string]: string } = {
7
+ "bottom": "to top",
8
+ "top": "to bottom",
9
+ "left": "to right",
10
+ "right": "to left",
11
+ "x": "to right",
12
+ "y": "to top",
13
+ }
14
+
15
+ const subsequentOverlayDirectionMap: { [key: string]: string } = {
16
+ ...previousOverlayDirectionMap,
17
+ "x": "to left",
18
+ "y": "to bottom",
19
+ }
20
+
21
+ const OverlayPercentage = (props: OverlayChildrenProps) => {
22
+ const {
23
+ children,
24
+ color,
25
+ position,
26
+ size,
27
+ } = props
28
+
29
+ const getPreviousOverlayDirection = () => {
30
+ return previousOverlayDirectionMap[position]
31
+ }
32
+
33
+ const getSubsequentOverlayDirection = () => {
34
+ return subsequentOverlayDirectionMap[position]
35
+ }
36
+
37
+ const hasSubsequentOverlay = position === "x" || position === "y"
38
+
39
+ const previousOverlay = `linear-gradient(${getPreviousOverlayDirection()}, ${defaultColors[color]} 0%, transparent ${size})`
40
+ const subsequentOverlay = `linear-gradient(${getSubsequentOverlayDirection()}, ${defaultColors[color]} 0%, transparent ${size})`
41
+
42
+ return (
43
+ <>
44
+ <div className="overlay_linear_gradient"
45
+ style={{ background: previousOverlay }} />
46
+
47
+ {children}
48
+
49
+ { hasSubsequentOverlay &&
50
+ <div className="overlay_linear_gradient"
51
+ style={{ background: subsequentOverlay }} />
52
+ }
53
+ </>
54
+ )
55
+ }
56
+
57
+ export default OverlayPercentage
@@ -0,0 +1,48 @@
1
+ import React from 'react'
2
+ import { OverlayChildrenProps } from '../_overlay'
3
+
4
+ const previousOverlayDirectionMap: { [key: string]: string } = {
5
+ "x": "left",
6
+ "y": "top",
7
+ }
8
+
9
+ const subsequentOverlayDirectionMap: { [key: string]: string } = {
10
+ "x": "right",
11
+ "y": "bottom",
12
+ }
13
+
14
+ const OverlayToken = (props: OverlayChildrenProps) => {
15
+ const {
16
+ children,
17
+ color,
18
+ position,
19
+ size,
20
+ } = props
21
+
22
+ const hasSubsequentOverlay = position === "x" || position === "y"
23
+
24
+ const getPreviousOverlayDirection = () => {
25
+ return hasSubsequentOverlay ? previousOverlayDirectionMap[position] : position
26
+ }
27
+
28
+ const getSubsequentOverlayDirection = () => {
29
+ return hasSubsequentOverlay ? subsequentOverlayDirectionMap[position] : position
30
+ }
31
+
32
+ const previousOverlayClassName = `overlay_${color}_${getPreviousOverlayDirection()}_${size}`
33
+ const subsequentOverlayClassName = `overlay_${color}_${getSubsequentOverlayDirection()}_${size}`
34
+
35
+ return (
36
+ <>
37
+ <div className={previousOverlayClassName} />
38
+
39
+ {children}
40
+
41
+ { hasSubsequentOverlay &&
42
+ <div className={subsequentOverlayClassName} />
43
+ }
44
+ </>
45
+ )
46
+ }
47
+
48
+ export default OverlayToken
@@ -24,8 +24,13 @@ $flag-min-resolution: 192dpi;
24
24
  transition: $transition_default;
25
25
  }
26
26
 
27
+ .iti__divider {
28
+ border-bottom: 1px solid $border_light !important;
29
+ }
30
+
27
31
  .iti__selected-flag {
28
32
  padding: 0 $space_xxs 0 $space_sm;
33
+ border-radius: $space_xxs;
29
34
 
30
35
  &[aria-expanded="true"] {
31
36
  color: $primary_action;
@@ -33,7 +38,6 @@ $flag-min-resolution: 192dpi;
33
38
 
34
39
  &:focus-visible {
35
40
  outline-style: solid;
36
- border-radius: $space_xxs 0px 0px $space_xxs;
37
41
  outline-color: $primary;
38
42
  }
39
43
  }
@@ -55,7 +59,7 @@ $flag-min-resolution: 192dpi;
55
59
  }
56
60
 
57
61
  .iti__flag {
58
- background-image: url("https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.19/img/flags.png");
62
+ background-image: url("https://intl-tel-input.com/intl-tel-input/img/flags.png");
59
63
  border-radius: 1px;
60
64
  }
61
65
 
@@ -101,28 +105,36 @@ $flag-min-resolution: 192dpi;
101
105
  color: $primary_action;
102
106
  }
103
107
 
104
- .iti__active::after {
105
- float: right;
108
+ .iti__country-list .iti__country {
109
+ display: flex;
110
+ align-items: center;
111
+ }
112
+
113
+ .iti__flag-box,
114
+ .iti__country-name,
115
+ .iti__dial-code {
116
+ flex-grow: 0;
117
+ }
118
+
119
+ .iti__dial-code {
120
+ margin-right: $space_sm;
121
+ }
122
+
123
+
124
+ .iti__country-list .iti__country.iti__active::after {
106
125
  content: "";
107
- margin-top: $space_xxs + 1px;
108
- transform: rotate($transform-rotate-deg/3);
109
- height: $space_xs + 4px;
110
- width: $space_xxs + 2px;
126
+ margin-left: auto;
127
+ transform: rotate(45deg);
128
+ height: 12px;
129
+ width: 6px;
111
130
  border-bottom: 2px solid;
112
131
  border-right: 2px solid;
113
132
  border-radius: 1px;
114
133
  }
115
134
 
116
- .iti__country-list {
117
- min-width: $dropdown-min-width;
118
- border-radius: $border_radius_md;
119
- border: 1px solid $border_light;
120
- box-shadow: $shadow_deep;
121
- margin-top: 1px;
122
- }
123
-
124
- .iti__divider {
125
- border-bottom: 1px solid $border_light;
135
+ .iti__dropdown-content {
136
+ border-radius: $space_xs;
137
+ border: 1px solid $border_light !important;
126
138
  }
127
139
 
128
140
  &.dark {
@@ -147,6 +159,15 @@ $flag-min-resolution: 192dpi;
147
159
  color: $white;
148
160
  }
149
161
 
162
+ .iti__dropdown-content {
163
+ border-radius: $space_xs;
164
+ border: 1px solid $border_dark !important;
165
+ }
166
+
167
+ .iti__divider {
168
+ border-bottom: 1px solid $border_dark !important;
169
+ }
170
+
150
171
  .iti__country-list {
151
172
  background-color: $bg_dark;
152
173
  border: 1px solid $border_dark;
@@ -157,17 +178,14 @@ $flag-min-resolution: 192dpi;
157
178
  .iti__country-name {
158
179
  color: $text_dk_default;
159
180
  }
160
-
181
+
161
182
  .iti__dial-code {
162
183
  color: $text_lt_lighter;
184
+ margin-right: $space_sm;
163
185
  }
164
186
  }
165
187
  }
166
188
 
167
- .iti__divider {
168
- border-bottom: 1px solid $border_dark;
169
- }
170
-
171
189
  .iti__arrow.iti__arrow--up::before {
172
190
  color: $slate;
173
191
  }
@@ -178,10 +196,10 @@ $flag-min-resolution: 192dpi;
178
196
  }
179
197
  }
180
198
  }
181
-
199
+
182
200
  @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: $flag-min-resolution) {
183
201
  .iti__flag {
184
- background-image: url("https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.19/img/flags@2x.png");
202
+ background-image: url("https://intl-tel-input.com/intl-tel-input/img/flags.png");
185
203
  }
186
204
  }
187
205
  }
@@ -1,34 +1,33 @@
1
- <%= pb_rails("table") do %>
2
- <thead>
3
- <tr>
4
- <th>Column 1</th>
5
- <th>Column 2</th>
6
- <th>Column 3</th>
7
- <th align="center">Rating</th>
8
- <th align="right">Money</th>
9
- </tr>
10
- </thead>
11
- <tbody>
12
- <tr>
13
- <td>Value 1</td>
14
- <td>Value 2</td>
15
- <td>Value 3</td>
16
- <td align="center">3</td>
17
- <td align="right">$57.32</td>
18
- </tr>
19
- <tr>
20
- <td>Value 1</td>
21
- <td>Value 2</td>
22
- <td>Value 3</td>
23
- <td align="center">2</td>
24
- <td align="right">$5,657.08</td>
25
- </tr>
26
- <tr>
27
- <td>Value 1</td>
28
- <td>Value 2</td>
29
- <td>Value 3</td>
30
- <td align="center">4</td>
31
- <td align="right">$358.77</td>
32
- </tr>
33
- </tbody>
1
+ <%= pb_rails("table") do %> <%= pb_rails("table/table_head") do %>
2
+ <%= pb_rails("table/table_row") do %>
3
+ <%= pb_rails("table/table_header", props: { text: "Column 1"}) %>
4
+ <%= pb_rails("table/table_header", props: { text: "Column 2"}) %>
5
+ <%= pb_rails("table/table_header", props: { text: "Column 3"}) %>
6
+ <%= pb_rails("table/table_header", props: { text: "Rating", text_align: "center" }) %>
7
+ <%= pb_rails("table/table_header", props: { text: "Money", text_align: "right" }) %>
8
+ <% end %>
9
+ <% end %>
10
+ <%= pb_rails("table/table_body") do %>
11
+ <%= pb_rails("table/table_row") do %>
12
+ <%= pb_rails("table/table_cell", props: { text: "Value 1"}) %>
13
+ <%= pb_rails("table/table_cell", props: { text: "Value 2"}) %>
14
+ <%= pb_rails("table/table_cell", props: { text: "Value 3"}) %>
15
+ <%= pb_rails("table/table_cell", props: { text: "3", text_align: "center" }) %>
16
+ <%= pb_rails("table/table_cell", props: { text: "$57.32", text_align: "right" }) %>
17
+ <% end %>
18
+ <%= pb_rails("table/table_row") do %>
19
+ <%= pb_rails("table/table_cell", props: { text: "Value 1"}) %>
20
+ <%= pb_rails("table/table_cell", props: { text: "Value 2"}) %>
21
+ <%= pb_rails("table/table_cell", props: { text: "Value 3"}) %>
22
+ <%= pb_rails("table/table_cell", props: { text: "2", text_align: "center" }) %>
23
+ <%= pb_rails("table/table_cell", props: { text: "$5,657.08", text_align: "right" }) %>
24
+ <% end %>
25
+ <%= pb_rails("table/table_row") do %>
26
+ <%= pb_rails("table/table_cell", props: { text: "Value 1"}) %>
27
+ <%= pb_rails("table/table_cell", props: { text: "Value 2"}) %>
28
+ <%= pb_rails("table/table_cell", props: { text: "Value 3"}) %>
29
+ <%= pb_rails("table/table_cell", props: { text: "4", text_align: "center" }) %>
30
+ <%= pb_rails("table/table_cell", props: { text: "$358.77", text_align: "right" }) %>
31
+ <% end %>
32
+ <% end %>
34
33
  <% end %>
@@ -7,9 +7,7 @@
7
7
  id: "pb-th#{object.id}",
8
8
  **combined_html_options) do %>
9
9
  <% unless sorting_style? %>
10
- <%= pb_rails("flex", props:{ align: object.align_content, justify: object.justify_sort_icon, classname: "pb_th_nolink" }) do %>
11
10
  <%= content.presence || object.text %>
12
- <% end %>
13
11
  <% else %>
14
12
  <%= link_to next_link, style: link_style do %>
15
13
  <%= pb_rails("flex", props:{ align: object.align_content, justify: object.justify_sort_icon, classname: "pb_th_link" }) do %>