playbook_ui 10.25.1 → 10.26.0.pre.alpha5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) 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 +2 -1
  5. data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -3
  6. data/app/pb_kits/playbook/pb_background/{_background.jsx → _background.tsx} +20 -13
  7. data/app/pb_kits/playbook/pb_badge/{_badge.jsx → _badge.tsx} +14 -15
  8. data/app/pb_kits/playbook/pb_badge/docs/_badge_colors.jsx +1 -1
  9. data/app/pb_kits/playbook/pb_badge/docs/_badge_default.jsx +1 -1
  10. data/app/pb_kits/playbook/pb_badge/docs/_badge_rounded.jsx +1 -1
  11. data/app/pb_kits/playbook/pb_badge/docs/index.js +3 -3
  12. data/app/pb_kits/playbook/pb_body/_body.tsx +9 -9
  13. data/app/pb_kits/playbook/pb_button/{_button.jsx → _button.tsx} +65 -46
  14. data/app/pb_kits/playbook/pb_button/docs/_button_default.html.erb +1 -0
  15. data/app/pb_kits/playbook/pb_button/docs/_button_options.jsx +1 -1
  16. data/app/pb_kits/playbook/pb_caption/{_caption.jsx → _caption.tsx} +7 -8
  17. data/app/pb_kits/playbook/pb_card/{_card.jsx → _card.tsx} +23 -21
  18. data/app/pb_kits/playbook/pb_card/_card_mixin.scss +1 -0
  19. data/app/pb_kits/playbook/pb_card/docs/_card_background.jsx +1 -1
  20. data/app/pb_kits/playbook/pb_card/docs/_card_border_none.jsx +1 -1
  21. data/app/pb_kits/playbook/pb_card/docs/_card_border_radius.jsx +1 -1
  22. data/app/pb_kits/playbook/pb_card/docs/_card_light.jsx +17 -2
  23. data/app/pb_kits/playbook/pb_card/docs/_card_selected.jsx +1 -1
  24. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.jsx +4 -2
  25. data/app/pb_kits/playbook/pb_collapsible/collapsible_main.html.erb +1 -1
  26. data/app/pb_kits/playbook/pb_dashboard/pbChartsDarkTheme.js +37 -0
  27. data/app/pb_kits/playbook/pb_dashboard/pbChartsLightTheme.js +37 -0
  28. data/app/pb_kits/playbook/pb_flex/{_flex.jsx → _flex.tsx} +5 -5
  29. data/app/pb_kits/playbook/pb_form_pill/_form_pill.jsx +2 -2
  30. data/app/pb_kits/playbook/pb_highlight/_highlight.tsx +1 -1
  31. data/app/pb_kits/playbook/pb_icon/{_icon.jsx → _icon.tsx} +40 -30
  32. data/app/pb_kits/playbook/pb_image/_image.tsx +1 -1
  33. data/app/pb_kits/playbook/pb_pill/{_pill.jsx → _pill.tsx} +6 -8
  34. data/app/pb_kits/playbook/pb_pill/docs/_pill_default.jsx +1 -1
  35. data/app/pb_kits/playbook/pb_pill/docs/_pill_variants.jsx +1 -1
  36. data/app/pb_kits/playbook/pb_table/_table.jsx +3 -0
  37. data/app/pb_kits/playbook/pb_table/docs/_table_sticky.html.erb +83 -0
  38. data/app/pb_kits/playbook/pb_table/docs/_table_sticky.jsx +94 -0
  39. data/app/pb_kits/playbook/pb_table/docs/_table_sticky.md +10 -0
  40. data/app/pb_kits/playbook/pb_table/docs/example.yml +2 -0
  41. data/app/pb_kits/playbook/pb_table/docs/index.js +1 -0
  42. data/app/pb_kits/playbook/pb_table/styles/_all.scss +1 -0
  43. data/app/pb_kits/playbook/pb_table/styles/_sticky_header.scss +23 -0
  44. data/app/pb_kits/playbook/pb_table/table.rb +7 -1
  45. data/app/pb_kits/playbook/pb_table/table.test.js +17 -0
  46. data/app/pb_kits/playbook/pb_title/{_title.jsx → _title.tsx} +10 -12
  47. data/app/pb_kits/playbook/pb_title/title.test.js +2 -2
  48. data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.jsx +79 -0
  49. data/app/pb_kits/playbook/pb_treemap_chart/docs/_description.md +5 -0
  50. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_colors.html.erb +37 -0
  51. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_colors.jsx +48 -0
  52. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_colors.md +2 -0
  53. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_default.html.erb +37 -0
  54. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_default.jsx +47 -0
  55. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_default.md +3 -0
  56. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_drillable.html.erb +79 -0
  57. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_drillable.jsx +90 -0
  58. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_drillable.md +1 -0
  59. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_grouped_data.html.erb +54 -0
  60. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_grouped_data.jsx +65 -0
  61. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_grouped_data.md +3 -0
  62. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_tooltip.html.erb +37 -0
  63. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_tooltip.jsx +48 -0
  64. data/app/pb_kits/playbook/pb_treemap_chart/docs/_treemap_chart_tooltip.md +3 -0
  65. data/app/pb_kits/playbook/pb_treemap_chart/docs/example.yml +15 -0
  66. data/app/pb_kits/playbook/pb_treemap_chart/docs/index.js +5 -0
  67. data/app/pb_kits/playbook/pb_treemap_chart/treemap_chart.html.erb +1 -0
  68. data/app/pb_kits/playbook/pb_treemap_chart/treemap_chart.rb +43 -0
  69. data/app/pb_kits/playbook/pb_user/{_user.jsx → _user.tsx} +20 -24
  70. data/app/pb_kits/playbook/playbook-doc.js +2 -0
  71. data/app/pb_kits/playbook/playbook-rails-react-bindings.js +2 -0
  72. data/app/pb_kits/playbook/plugins/pb_chart.js +34 -0
  73. data/app/pb_kits/playbook/tokens/_colors.scss +2 -1
  74. data/app/pb_kits/playbook/tokens/_display.scss +13 -0
  75. data/app/pb_kits/playbook/tokens/_screen_sizes.scss +36 -0
  76. data/app/pb_kits/playbook/utilities/_align_content.scss +10 -29
  77. data/app/pb_kits/playbook/utilities/_align_items.scss +11 -35
  78. data/app/pb_kits/playbook/utilities/_align_self.scss +10 -29
  79. data/app/pb_kits/playbook/utilities/_display.scss +26 -2
  80. data/app/pb_kits/playbook/utilities/_flex.scss +19 -14
  81. data/app/pb_kits/playbook/utilities/_flex_direction.scss +7 -18
  82. data/app/pb_kits/playbook/utilities/_flex_grow.scss +5 -8
  83. data/app/pb_kits/playbook/utilities/_flex_shrink.scss +5 -8
  84. data/app/pb_kits/playbook/utilities/_flex_wrap.scss +6 -13
  85. data/app/pb_kits/playbook/utilities/_justify_content.scss +10 -23
  86. data/app/pb_kits/playbook/utilities/_justify_self.scss +9 -19
  87. data/app/pb_kits/playbook/utilities/_mixins.scss +26 -0
  88. data/app/pb_kits/playbook/utilities/_order.scss +17 -55
  89. data/app/pb_kits/playbook/utilities/globalProps.ts +150 -121
  90. data/app/pb_kits/playbook/utilities/test/globalProps/alignContent.test.js +37 -0
  91. data/app/pb_kits/playbook/utilities/test/globalProps/alignItems.test.js +36 -0
  92. data/app/pb_kits/playbook/utilities/test/globalProps/alignSelf.test.js +37 -0
  93. data/app/pb_kits/playbook/utilities/test/globalProps/display.test.js +38 -0
  94. data/app/pb_kits/playbook/utilities/test/globalProps/flex.test.js +64 -0
  95. data/app/pb_kits/playbook/utilities/test/globalProps/flexDirection.test.js +37 -0
  96. data/app/pb_kits/playbook/utilities/test/globalProps/flexGrow.test.js +35 -0
  97. data/app/pb_kits/playbook/utilities/test/globalProps/flexShrink.test.js +35 -0
  98. data/app/pb_kits/playbook/utilities/test/globalProps/flexWrap.test.js +37 -0
  99. data/app/pb_kits/playbook/utilities/test/globalProps/justifyContent.test.js +37 -0
  100. data/app/pb_kits/playbook/utilities/test/globalProps/justifySelf.test.js +37 -0
  101. data/app/pb_kits/playbook/utilities/test/globalProps/order.test.js +35 -0
  102. data/app/pb_kits/playbook/utilities/test-utils.js +2 -0
  103. data/app/pb_kits/playbook/utilities/text.ts +22 -0
  104. data/dist/reset.css +60 -1
  105. data/lib/playbook/align_content.rb +11 -3
  106. data/lib/playbook/align_items.rb +10 -2
  107. data/lib/playbook/align_self.rb +9 -1
  108. data/lib/playbook/display.rb +19 -7
  109. data/lib/playbook/flex.rb +9 -1
  110. data/lib/playbook/flex_direction.rb +10 -2
  111. data/lib/playbook/flex_grow.rb +9 -1
  112. data/lib/playbook/flex_shrink.rb +9 -1
  113. data/lib/playbook/flex_wrap.rb +10 -2
  114. data/lib/playbook/justify_content.rb +10 -2
  115. data/lib/playbook/justify_self.rb +9 -1
  116. data/lib/playbook/order.rb +10 -2
  117. data/lib/playbook/version.rb +2 -2
  118. metadata +55 -15
  119. data/app/pb_kits/playbook/utilities/text.js +0 -15
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import Card from '../_card.jsx'
2
+ import Card from '../_card'
3
3
 
4
4
  const CardSelected = (props) => {
5
5
  return (
@@ -35,12 +35,14 @@ const Icon = ({ collapsed }: IconProps) => {
35
35
  const CollapsibleMain = ({
36
36
  children,
37
37
  className,
38
+ cursor = 'pointer',
38
39
  padding = 'md',
40
+
39
41
  ...props
40
42
  }: CollapsibleMainProps) => {
41
43
  const context = useContext(CollapsibleContext)
42
44
  const mainCSS = buildCss('pb_collapsible_main_kit')
43
- const mainSpacing = globalProps(props, { padding })
45
+ const mainSpacing = globalProps(props, { cursor, padding })
44
46
 
45
47
  return (
46
48
  <div className={classnames(mainCSS, className, mainSpacing)}>
@@ -50,7 +52,7 @@ const CollapsibleMain = ({
50
52
  vertical="center"
51
53
  >
52
54
  <FlexItem>{children}</FlexItem>
53
- <FlexItem><Icon collapsed={context.collapsed} /></FlexItem>
55
+ <FlexItem><Icon collapsed={context.collapsed}/></FlexItem>
54
56
  </Flex>
55
57
  </div>
56
58
  </div>
@@ -4,7 +4,7 @@
4
4
  class: object.classname,
5
5
  aria: object.aria) do %>
6
6
 
7
- <%= pb_rails("flex", props: {vertical: "center", spacing: "between"}) do %>
7
+ <%= pb_rails("flex", props: {vertical: "center", spacing: "between", cursor: "pointer"}) do %>
8
8
  <%= pb_rails("flex/flex_item") do %>
9
9
  <%= content.presence %>
10
10
  <% end %>
@@ -209,6 +209,43 @@ const highchartsDarkTheme = {
209
209
  threshold: null,
210
210
  },
211
211
  },
212
+
213
+ //TREEMAP CHART STYLES
214
+ treemap: {
215
+ layoutAlgorithm: "squarified",
216
+ allowTraversingTree: false,
217
+ animationLimit: 1000,
218
+ colors: [
219
+ colors.data_1,
220
+ colors.data_2,
221
+ colors.data_3,
222
+ colors.data_4,
223
+ colors.data_5,
224
+ colors.data_6,
225
+ colors.data_7,
226
+ colors.data_8,
227
+ ],
228
+ colorByPoint: true,
229
+ dataLabels: {
230
+ enabled: true,
231
+ style: {
232
+ fontFamily: typography.font_family_base,
233
+ fontWeight: typography.bold,
234
+ fontSize: typography.heading_4,
235
+ },
236
+ },
237
+ levels: [
238
+ {
239
+ level: 1,
240
+ dataLabels: {
241
+ enabled: false,
242
+ },
243
+ },
244
+ ],
245
+ traverseUpButton: {
246
+ position: { y: -40 },
247
+ }
248
+ },
212
249
  },
213
250
  }
214
251
 
@@ -209,6 +209,43 @@ const highchartsTheme = {
209
209
  threshold: null,
210
210
  },
211
211
  },
212
+
213
+ //TREEMAP CHART STYLES
214
+ treemap: {
215
+ layoutAlgorithm: "squarified",
216
+ allowTraversingTree: false,
217
+ animationLimit: 1000,
218
+ colors: [
219
+ colors.data_1,
220
+ colors.data_2,
221
+ colors.data_3,
222
+ colors.data_4,
223
+ colors.data_5,
224
+ colors.data_6,
225
+ colors.data_7,
226
+ colors.data_8,
227
+ ],
228
+ colorByPoint: true,
229
+ dataLabels: {
230
+ enabled: true,
231
+ style: {
232
+ fontFamily: typography.font_family_base,
233
+ fontWeight: typography.bold,
234
+ fontSize: typography.heading_4,
235
+ },
236
+ },
237
+ levels: [
238
+ {
239
+ level: 1,
240
+ dataLabels: {
241
+ enabled: false,
242
+ },
243
+ },
244
+ ],
245
+ traverseUpButton: {
246
+ position: { y: -40 },
247
+ }
248
+ },
212
249
  },
213
250
  }
214
251
 
@@ -1,11 +1,10 @@
1
- /* @flow */
2
-
3
1
  import React from 'react'
4
2
  import classnames from 'classnames'
5
3
  import { buildCss, buildDataProps } from '../utilities/props'
6
- import { globalProps } from '../utilities/globalProps'
4
+ import { GlobalProps, globalProps } from '../utilities/globalProps'
5
+
7
6
  type FlexProps = {
8
- children: array<React.ReactNode> | React.ReactNode,
7
+ children: React.ReactChild[] | React.ReactNode,
9
8
  className?: string,
10
9
  data?: object,
11
10
  horizontal?: "left" | "center" | "right" | "stretch" | "none",
@@ -22,7 +21,7 @@ type FlexProps = {
22
21
  columnGap?: "xs" | "sm" | "md" | "lg" | "xl" | "none",
23
22
  wrap?: boolean,
24
23
  alignSelf?: "start" | "end" | "center" | "stretch" | "none"
25
- }
24
+ } & GlobalProps
26
25
 
27
26
  const Flex = (props: FlexProps) => {
28
27
  const {
@@ -43,6 +42,7 @@ const Flex = (props: FlexProps) => {
43
42
  wrap = false,
44
43
  alignSelf = 'none',
45
44
  } = props
45
+
46
46
  const orientationClass =
47
47
  orientation !== undefined ? `orientation_${orientation}` : ''
48
48
  const justifyClass =
@@ -1,8 +1,8 @@
1
1
  /* @flow */
2
2
  import React from 'react'
3
3
  import classnames from 'classnames'
4
- import Title from '../pb_title/_title.jsx'
5
- import Icon from '../pb_icon/_icon.jsx'
4
+ import Title from '../pb_title/_title'
5
+ import Icon from '../pb_icon/_icon'
6
6
  import Avatar from '../pb_avatar/_avatar'
7
7
  import { globalProps } from '../utilities/globalProps'
8
8
 
@@ -8,7 +8,7 @@ type HighlightProps = {
8
8
  className?: string,
9
9
  data?: {[key: string]: string},
10
10
  id?: string,
11
- children?: React.ReactChild[] | string,
11
+ children?: React.ReactChild[] | React.ReactChild | string,
12
12
  text?: string,
13
13
  highlightedText?: string[],
14
14
  } & GlobalProps
@@ -1,16 +1,14 @@
1
- /* @flow */
2
-
3
1
  import React from 'react'
4
2
  import classnames from 'classnames'
5
3
  import { buildAriaProps, buildDataProps } from '../utilities/props'
6
- import { globalProps } from '../utilities/globalProps'
4
+ import { GlobalProps, globalProps } from '../utilities/globalProps'
7
5
 
8
6
  type IconProps = {
9
- aria?: object,
10
- border?: boolean,
7
+ aria?: {[key: string]: string},
8
+ border?: string,
11
9
  className?: string,
12
- customIcon?: SVGElement,
13
- data?: object,
10
+ customIcon?: {[key: string] :SVGElement},
11
+ data?: {[key: string]: string},
14
12
  fixedWidth?: boolean,
15
13
  flip?: "horizontal" | "vertical" | "both" | "none",
16
14
  icon: string,
@@ -34,12 +32,13 @@ type IconProps = {
34
32
  | "9x"
35
33
  | "10x",
36
34
  spin?: boolean,
37
- }
35
+ } & GlobalProps
38
36
 
39
37
  const flipMap = {
40
38
  horizontal: 'fa-flip-horizontal',
41
39
  vertical: 'fa-flip-vertical',
42
40
  both: 'fa-flip-horizontal fa-flip-vertical',
41
+ none: ""
43
42
  }
44
43
 
45
44
  const Icon = (props: IconProps) => {
@@ -50,7 +49,7 @@ const Icon = (props: IconProps) => {
50
49
  customIcon,
51
50
  data = {},
52
51
  fixedWidth = true,
53
- flip = false,
52
+ flip = "none",
54
53
  icon,
55
54
  id,
56
55
  inverse = false,
@@ -90,31 +89,42 @@ const Icon = (props: IconProps) => {
90
89
  )
91
90
 
92
91
  aria.label ? null : aria.label = `${icon} icon`
93
- const ariaProps = buildAriaProps(aria)
94
- const dataProps = buildDataProps(data)
92
+ const ariaProps: {[key: string]: any} = buildAriaProps(aria)
93
+ const dataProps: {[key: string]: any} = buildDataProps(data)
95
94
 
96
95
  // Add a conditional here to show only the SVG if custom
96
+ const displaySVG = (customIcon: any) => {
97
+ if (customIcon)
98
+ return (
99
+ <>
100
+ {
101
+ React.cloneElement(customIcon, {
102
+ ...dataProps,
103
+ className: classes,
104
+ id,
105
+ })
106
+ }
107
+ </>
108
+ )
109
+ else
110
+ return (
111
+ <>
112
+ <i
113
+ {...dataProps}
114
+ className={classes}
115
+ id={id}
116
+ />
117
+ <span
118
+ {...ariaProps}
119
+ hidden
120
+ />
121
+ </>
122
+ )
123
+ }
124
+
97
125
  return (
98
126
  <>
99
- <If condition={customIcon}>
100
- {
101
- React.cloneElement(customIcon, {
102
- ...dataProps,
103
- className: classes,
104
- id,
105
- })
106
- }
107
- <Else />
108
- <i
109
- {...dataProps}
110
- className={classes}
111
- id={id}
112
- />
113
- <span
114
- {...ariaProps}
115
- hidden
116
- />
117
- </If>
127
+ {displaySVG(customIcon)}
118
128
  </>
119
129
  )
120
130
  }
@@ -16,7 +16,7 @@ type ImageType = {
16
16
  url?: string,
17
17
  } & GlobalProps
18
18
 
19
- const Image = (props: ImageType) => {
19
+ const Image = (props: ImageType): React.ReactElement => {
20
20
  const {
21
21
  alt = '',
22
22
  aria = {},
@@ -1,21 +1,19 @@
1
- /* @flow */
2
-
3
1
  import React from 'react'
4
2
 
5
3
  import classnames from 'classnames'
6
- import Title from '../pb_title/_title.jsx'
4
+ import Title from '../pb_title/_title'
7
5
  import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
8
- import { globalProps } from '../utilities/globalProps'
6
+ import { GlobalProps, globalProps } from '../utilities/globalProps'
9
7
 
10
8
  type PillProps = {
11
- aria?: object,
9
+ aria?: {[key: string]: string},
12
10
  className?: string,
13
- data?: object,
11
+ data?: {[key: string]: string},
14
12
  id?: string,
15
13
  text: string,
16
14
  variant?: "success" | "warning" | "error" | "info" | "neutral",
17
15
  textTransform?: "none" | "lowercase"
18
- }
16
+ } & GlobalProps
19
17
 
20
18
  const Pill = (props: PillProps) => {
21
19
  const {
@@ -49,4 +47,4 @@ const Pill = (props: PillProps) => {
49
47
  )
50
48
  }
51
49
 
52
- export default Pill
50
+ export default Pill
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import Pill from '../_pill.jsx'
2
+ import Pill from '../_pill'
3
3
 
4
4
  const PillDefault = (props) => {
5
5
  return (
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import Pill from '../_pill.jsx'
2
+ import Pill from '../_pill'
3
3
 
4
4
  const PillVariants = (props) => {
5
5
  return (
@@ -20,6 +20,7 @@ type TableProps = {
20
20
  responsive: "collapse" | "scroll" | "none",
21
21
  singleLine: boolean,
22
22
  size: "sm" | "md" | "lg",
23
+ sticky?: boolean,
23
24
  }
24
25
 
25
26
  const Table = (props: TableProps) => {
@@ -37,6 +38,7 @@ const Table = (props: TableProps) => {
37
38
  responsive = 'collapse',
38
39
  singleLine = false,
39
40
  size = 'sm',
41
+ sticky = false,
40
42
  } = props
41
43
 
42
44
  const ariaProps = buildAriaProps(aria)
@@ -60,6 +62,7 @@ const Table = (props: TableProps) => {
60
62
  'data_table': dataTable,
61
63
  'single-line': singleLine,
62
64
  'no-hover': disableHover,
65
+ 'sticky-header': sticky,
63
66
  },
64
67
  globalProps(props),
65
68
  tableCollapseCss,
@@ -0,0 +1,83 @@
1
+ <%= pb_rails("table", props: { sticky: true }) do %>
2
+ <thead>
3
+ <tr>
4
+ <th>Column 1</th>
5
+ <th>Column 2</th>
6
+ <th>Column 3</th>
7
+ <th>Column 4</th>
8
+ <th>Column 5</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>Value 4</td>
17
+ <td>Value 5</td>
18
+ </tr>
19
+ <tr>
20
+ <td>Value 1</td>
21
+ <td>Value 2</td>
22
+ <td>Value 3</td>
23
+ <td>Value 4</td>
24
+ <td>Value 5</td>
25
+ </tr>
26
+ <tr>
27
+ <td>Value 1</td>
28
+ <td>Value 2</td>
29
+ <td>Value 3</td>
30
+ <td>Value 4</td>
31
+ <td>Value 5</td>
32
+ </tr>
33
+ <tr>
34
+ <td>Value 1</td>
35
+ <td>Value 2</td>
36
+ <td>Value 3</td>
37
+ <td>Value 4</td>
38
+ <td>Value 5</td>
39
+ </tr>
40
+ <tr>
41
+ <td>Value 1</td>
42
+ <td>Value 2</td>
43
+ <td>Value 3</td>
44
+ <td>Value 4</td>
45
+ <td>Value 5</td>
46
+ </tr>
47
+ <tr>
48
+ <td>Value 1</td>
49
+ <td>Value 2</td>
50
+ <td>Value 3</td>
51
+ <td>Value 4</td>
52
+ <td>Value 5</td>
53
+ </tr>
54
+ <tr>
55
+ <td>Value 1</td>
56
+ <td>Value 2</td>
57
+ <td>Value 3</td>
58
+ <td>Value 4</td>
59
+ <td>Value 5</td>
60
+ </tr>
61
+ <tr>
62
+ <td>Value 1</td>
63
+ <td>Value 2</td>
64
+ <td>Value 3</td>
65
+ <td>Value 4</td>
66
+ <td>Value 5</td>
67
+ </tr>
68
+ <tr>
69
+ <td>Value 1</td>
70
+ <td>Value 2</td>
71
+ <td>Value 3</td>
72
+ <td>Value 4</td>
73
+ <td>Value 5</td>
74
+ </tr>
75
+ <tr>
76
+ <td>Value 1</td>
77
+ <td>Value 2</td>
78
+ <td>Value 3</td>
79
+ <td>Value 4</td>
80
+ <td>Value 5</td>
81
+ </tr>
82
+ </tbody>
83
+ <% end %>
@@ -0,0 +1,94 @@
1
+ import React from "react"
2
+
3
+ import Table from "../_table"
4
+
5
+ const TableSticky = (props) => (
6
+ <Table
7
+ sticky
8
+ {...props}
9
+ >
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
+ <tr>
21
+ <td>{'Value 1'}</td>
22
+ <td>{'Value 2'}</td>
23
+ <td>{'Value 3'}</td>
24
+ <td>{'Value 4'}</td>
25
+ <td>{'Value 5'}</td>
26
+ </tr>
27
+ <tr>
28
+ <td>{'Value 1'}</td>
29
+ <td>{'Value 2'}</td>
30
+ <td>{'Value 3'}</td>
31
+ <td>{'Value 4'}</td>
32
+ <td>{'Value 5'}</td>
33
+ </tr>
34
+ <tr>
35
+ <td>{'Value 1'}</td>
36
+ <td>{'Value 2'}</td>
37
+ <td>{'Value 3'}</td>
38
+ <td>{'Value 4'}</td>
39
+ <td>{'Value 5'}</td>
40
+ </tr>
41
+ <tr>
42
+ <td>{'Value 1'}</td>
43
+ <td>{'Value 2'}</td>
44
+ <td>{'Value 3'}</td>
45
+ <td>{'Value 4'}</td>
46
+ <td>{'Value 5'}</td>
47
+ </tr>
48
+ <tr>
49
+ <td>{'Value 1'}</td>
50
+ <td>{'Value 2'}</td>
51
+ <td>{'Value 3'}</td>
52
+ <td>{'Value 4'}</td>
53
+ <td>{'Value 5'}</td>
54
+ </tr>
55
+ <tr>
56
+ <td>{'Value 1'}</td>
57
+ <td>{'Value 2'}</td>
58
+ <td>{'Value 3'}</td>
59
+ <td>{'Value 4'}</td>
60
+ <td>{'Value 5'}</td>
61
+ </tr>
62
+ <tr>
63
+ <td>{'Value 1'}</td>
64
+ <td>{'Value 2'}</td>
65
+ <td>{'Value 3'}</td>
66
+ <td>{'Value 4'}</td>
67
+ <td>{'Value 5'}</td>
68
+ </tr>
69
+ <tr>
70
+ <td>{'Value 1'}</td>
71
+ <td>{'Value 2'}</td>
72
+ <td>{'Value 3'}</td>
73
+ <td>{'Value 4'}</td>
74
+ <td>{'Value 5'}</td>
75
+ </tr>
76
+ <tr>
77
+ <td>{'Value 1'}</td>
78
+ <td>{'Value 2'}</td>
79
+ <td>{'Value 3'}</td>
80
+ <td>{'Value 4'}</td>
81
+ <td>{'Value 5'}</td>
82
+ </tr>
83
+ <tr>
84
+ <td>{'Value 1'}</td>
85
+ <td>{'Value 2'}</td>
86
+ <td>{'Value 3'}</td>
87
+ <td>{'Value 4'}</td>
88
+ <td>{'Value 5'}</td>
89
+ </tr>
90
+ </tbody>
91
+ </Table>
92
+ )
93
+
94
+ export default TableSticky
@@ -0,0 +1,10 @@
1
+ React: Use `sticky` on a table to allow the table header to be fixed in place when the user scrolls up and down on the page.
2
+
3
+ Rails: Pass `sticky: true` to props.
4
+
5
+ If the table header is not sticking in the right place you will need to pass a inline `top` style to the `thead`.
6
+ React Example: `<thead style={{ top: "-16px" }}>`
7
+ Rails Example: `<thead style="top: -16px">`
8
+
9
+ ### Troubleshooting CSS Problems
10
+ Sticky may not work if any parent/ancestor of the sticky element has any of the `overflow` properties set. Additionally, specifying a height on the overflowing container provides measurement for this feature to work properly. In some cases, it may be necessary to set the same parent/ancestor container to `position: static` as well.
@@ -3,6 +3,7 @@ examples:
3
3
  - table_sm: Small
4
4
  - table_md: Medium
5
5
  - table_lg: Large
6
+ - table_sticky: Sticky Header
6
7
  - table_alignment_row: Row Alignment
7
8
  - table_alignment_column: Column Alignment
8
9
  - table_alignment_shift_row: Shift Row
@@ -25,6 +26,7 @@ examples:
25
26
  - table_sm: Small
26
27
  - table_md: Medium
27
28
  - table_lg: Large
29
+ - table_sticky: Sticky Header
28
30
  - table_alignment_row: Row Alignment
29
31
  - table_alignment_column: Column Alignment
30
32
  - table_alignment_shift_row: Shift Row
@@ -1,6 +1,7 @@
1
1
  export { default as TableSm } from './_table_sm.jsx'
2
2
  export { default as TableMd } from './_table_md.jsx'
3
3
  export { default as TableLg } from './_table_lg.jsx'
4
+ export { default as TableSticky } from './_table_sticky.jsx'
4
5
  export { default as TableSideHighlight } from './_table_side_highlight.jsx'
5
6
  export { default as TableContainer } from './_table_container.jsx'
6
7
  export { default as TableDataTable } from './_table_data_table.jsx'
@@ -16,3 +16,4 @@
16
16
  @import "mobile_collapse";
17
17
  @import "tablet_collapse";
18
18
  @import "desktop_collapse";
19
+ @import "sticky_header";
@@ -0,0 +1,23 @@
1
+ @import "../../tokens/colors";
2
+
3
+ [class^="pb_table"] {
4
+ &.sticky-header {
5
+ thead {
6
+ background: $white;
7
+ position: sticky;
8
+ top: 0;
9
+ z-index: 1;
10
+ }
11
+ }
12
+
13
+ &.dark {
14
+ &.sticky-header {
15
+ thead {
16
+ background: $bg_dark;
17
+ position: sticky;
18
+ top: 0;
19
+ z-index: 1;
20
+ }
21
+ }
22
+ }
23
+ }
@@ -21,11 +21,13 @@ module Playbook
21
21
  values: %w[sm md lg],
22
22
  default: "sm"
23
23
  prop :text
24
+ prop :sticky, type: Playbook::Props::Boolean,
25
+ default: false
24
26
 
25
27
  def classname
26
28
  generate_classname(
27
29
  "pb_table", "table-#{size}", single_line_class, dark_class,
28
- disable_hover_class, container_class, data_table_class, collapse_class,
30
+ disable_hover_class, container_class, data_table_class, sticky_class, collapse_class,
29
31
  "table-responsive-#{responsive}", separator: " "
30
32
  )
31
33
  end
@@ -55,6 +57,10 @@ module Playbook
55
57
  def collapse_class
56
58
  responsive != "none" ? "table-collapse-#{collapse}" : ""
57
59
  end
60
+
61
+ def sticky_class
62
+ sticky ? "sticky-header" : nil
63
+ end
58
64
  end
59
65
  end
60
66
  end
@@ -0,0 +1,17 @@
1
+ import { ensureAccessible, renderKit } from "../utilities/test-utils"
2
+
3
+ import Table from "./_table"
4
+
5
+ const props = {
6
+ data: { testid: "table" },
7
+ sticky: false
8
+ }
9
+
10
+ it("should be accessible", async () => {
11
+ ensureAccessible(Table, props)
12
+ })
13
+
14
+ test("when sticky is true", () => {
15
+ const kit = renderKit(Table, props, { sticky: true })
16
+ expect(kit).toHaveClass("pb_table table-sm table-responsive-collapse table-card sticky-header table-collapse-sm")
17
+ })