playbook_ui 4.14.0 → 4.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +2 -0
  3. data/app/pb_kits/playbook/data/menu.yml +2 -0
  4. data/app/pb_kits/playbook/index.js +4 -1
  5. data/app/pb_kits/playbook/packs/examples.js +2 -0
  6. data/app/pb_kits/playbook/packs/kits/pb_progress_step.js +2 -0
  7. data/app/pb_kits/playbook/pb_button/_button.jsx +9 -1
  8. data/app/pb_kits/playbook/pb_contact/_contact.jsx +1 -0
  9. data/app/pb_kits/playbook/pb_contact/contact.rb +2 -0
  10. data/app/pb_kits/playbook/pb_contact/docs/_contact_default.html.erb +5 -0
  11. data/app/pb_kits/playbook/pb_contact/docs/_contact_default.jsx +4 -0
  12. data/app/pb_kits/playbook/pb_contact/docs/_contact_with_detail.html.erb +6 -0
  13. data/app/pb_kits/playbook/pb_contact/docs/_contact_with_detail.jsx +5 -0
  14. data/app/pb_kits/playbook/pb_date_year_stacked/_date_year_stacked.jsx +2 -2
  15. data/app/pb_kits/playbook/pb_filter/Filter/CurrentFilters.jsx +56 -0
  16. data/app/pb_kits/playbook/pb_filter/Filter/FilterBackground.jsx +26 -0
  17. data/app/pb_kits/playbook/pb_filter/Filter/FilterDouble.jsx +58 -0
  18. data/app/pb_kits/playbook/pb_filter/Filter/FilterSingle.jsx +46 -0
  19. data/app/pb_kits/playbook/pb_filter/Filter/FiltersPopover.jsx +37 -0
  20. data/app/pb_kits/playbook/pb_filter/Filter/ResultsCount.jsx +34 -0
  21. data/app/pb_kits/playbook/pb_filter/Filter/SortMenu.jsx +85 -0
  22. data/app/pb_kits/playbook/pb_filter/Filter/index.jsx +26 -0
  23. data/app/pb_kits/playbook/pb_filter/_filter.jsx +1 -222
  24. data/app/pb_kits/playbook/pb_filter/_filter.scss +16 -13
  25. data/app/pb_kits/playbook/pb_filter/docs/_filter_default.html.erb +34 -41
  26. data/app/pb_kits/playbook/pb_filter/docs/_filter_default.jsx +13 -9
  27. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_background.html.erb +69 -74
  28. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_background.jsx +12 -9
  29. data/app/pb_kits/playbook/pb_filter/docs/_filter_only.html.erb +28 -35
  30. data/app/pb_kits/playbook/pb_filter/docs/_filter_only.jsx +5 -6
  31. data/app/pb_kits/playbook/pb_filter/docs/_filter_single.html.erb +35 -41
  32. data/app/pb_kits/playbook/pb_filter/docs/_filter_single.jsx +12 -10
  33. data/app/pb_kits/playbook/pb_filter/docs/_sort_only.html.erb +12 -18
  34. data/app/pb_kits/playbook/pb_filter/docs/_sort_only.jsx +14 -44
  35. data/app/pb_kits/playbook/pb_filter/templates/_default.html.erb +1 -1
  36. data/app/pb_kits/playbook/pb_layout/_layout.jsx +66 -14
  37. data/app/pb_kits/playbook/pb_layout/docs/_layout_colors.jsx +63 -0
  38. data/app/pb_kits/playbook/pb_layout/docs/_layout_sizes.jsx +87 -0
  39. data/app/pb_kits/playbook/pb_layout/docs/_layout_sizes_dark.jsx +92 -0
  40. data/app/pb_kits/playbook/pb_layout/docs/_layout_transparent.jsx +24 -0
  41. data/app/pb_kits/playbook/pb_layout/docs/example.yml +4 -1
  42. data/app/pb_kits/playbook/pb_layout/docs/index.js +4 -1
  43. data/app/pb_kits/playbook/pb_online_status/_online_status.jsx +31 -14
  44. data/app/pb_kits/playbook/pb_online_status/docs/_online_status_default.jsx +19 -0
  45. data/app/pb_kits/playbook/pb_online_status/docs/example.yml +3 -3
  46. data/app/pb_kits/playbook/pb_online_status/docs/index.js +1 -0
  47. data/app/pb_kits/playbook/pb_popover/_popover.jsx +2 -2
  48. data/app/pb_kits/playbook/pb_popover/docs/example.yml +0 -2
  49. data/app/pb_kits/playbook/pb_popover/docs/index.js +0 -1
  50. data/app/pb_kits/playbook/pb_progress_step/_progress_step.html.erb +6 -0
  51. data/app/pb_kits/playbook/pb_progress_step/_progress_step.jsx +35 -0
  52. data/app/pb_kits/playbook/pb_progress_step/_progress_step.scss +388 -0
  53. data/app/pb_kits/playbook/pb_progress_step/_progress_step_item.html.erb +23 -0
  54. data/app/pb_kits/playbook/pb_progress_step/_progress_step_item.jsx +44 -0
  55. data/app/pb_kits/playbook/pb_progress_step/docs/_description.md +1 -0
  56. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_dark.html.erb +8 -0
  57. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_dark.jsx +18 -0
  58. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_default.html.erb +33 -0
  59. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_default.jsx +39 -0
  60. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_vertical.html.erb +33 -0
  61. data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_vertical.jsx +40 -0
  62. data/app/pb_kits/playbook/pb_progress_step/docs/example.yml +12 -0
  63. data/app/pb_kits/playbook/pb_progress_step/docs/index.js +3 -0
  64. data/app/pb_kits/playbook/pb_progress_step/progress_step.rb +33 -0
  65. data/app/pb_kits/playbook/pb_progress_step/progress_step_item.rb +19 -0
  66. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_default.html.erb +1 -1
  67. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_default.jsx +1 -1
  68. data/app/pb_kits/playbook/pb_stat_change/stat_change.rb +1 -1
  69. data/app/pb_kits/playbook/pb_timestamp/_timestamp.jsx +39 -14
  70. data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_default.jsx +8 -0
  71. data/app/pb_kits/playbook/pb_timestamp/docs/example.yml +3 -3
  72. data/app/pb_kits/playbook/pb_timestamp/docs/index.js +1 -0
  73. data/app/pb_kits/playbook/pb_title_detail/_title_detail.jsx +47 -14
  74. data/app/pb_kits/playbook/pb_title_detail/docs/_title_detail_default.jsx +26 -0
  75. data/app/pb_kits/playbook/pb_title_detail/docs/example.yml +3 -3
  76. data/app/pb_kits/playbook/pb_title_detail/docs/index.js +1 -0
  77. data/app/pb_kits/playbook/pb_tooltip/_tooltip.html.erb +10 -0
  78. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +105 -0
  79. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_default.html.erb +10 -0
  80. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_white.html.erb +9 -0
  81. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +5 -0
  82. data/app/pb_kits/playbook/pb_tooltip/index.js +80 -0
  83. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +34 -0
  84. data/app/pb_kits/playbook/tokens/_colors.scss +4 -0
  85. data/app/pb_kits/playbook/vendor.js +3 -0
  86. data/lib/playbook/version.rb +1 -1
  87. metadata +41 -6
  88. data/app/pb_kits/playbook/pb_layout/_body.jsx +0 -26
  89. data/app/pb_kits/playbook/pb_layout/_sidebar.jsx +0 -26
  90. data/app/pb_kits/playbook/pb_layout/docs/_layout_default.jsx +0 -14
  91. data/app/pb_kits/playbook/pb_popover/docs/_popover_with_button.html.erb +0 -4
@@ -0,0 +1,39 @@
1
+ import React from 'react'
2
+ import ProgressStep from '../_progress_step.jsx'
3
+ import ProgressStepItem from '../_progress_step_item.jsx'
4
+
5
+ const ProgressStepDefault = () => (
6
+ <div>
7
+ <ProgressStep icon>
8
+ <ProgressStepItem status="complete" />
9
+ <ProgressStepItem status="active" />
10
+ <ProgressStepItem status="inactive" />
11
+ </ProgressStep>
12
+
13
+ <br />
14
+ <br />
15
+
16
+ <ProgressStep>
17
+ <ProgressStepItem status="complete" />
18
+ <ProgressStepItem status="active" />
19
+ <ProgressStepItem status="inactive" />
20
+ </ProgressStep>
21
+
22
+ <br />
23
+ <br />
24
+
25
+ <ProgressStep>
26
+ <ProgressStepItem status="complete">
27
+ {'Child'}
28
+ </ProgressStepItem>
29
+ <ProgressStepItem status="active">
30
+ {'Child'}
31
+ </ProgressStepItem>
32
+ <ProgressStepItem status="inactive">
33
+ {'Child'}
34
+ </ProgressStepItem>
35
+ </ProgressStep>
36
+ </div>
37
+ )
38
+
39
+ export default ProgressStepDefault
@@ -0,0 +1,33 @@
1
+ <%= pb_rails("progress_step", props: {orientation: "vertical", icon: true}) do %>
2
+ <%= pb_rails("progress_step/progress_step_item", props: {status: "complete"}) do %>
3
+ <% end %>
4
+ <%= pb_rails("progress_step/progress_step_item", props: {status: "active"}) do %>
5
+ <% end %>
6
+ <%= pb_rails("progress_step/progress_step_item", props: {status: "inactive"}) do %>
7
+ <% end %>
8
+ <% end %>
9
+
10
+ <br />
11
+
12
+ <%= pb_rails("progress_step", props: {orientation: "vertical"}) do %>
13
+ <%= pb_rails("progress_step/progress_step_item", props: {status: "complete"}) do %>
14
+ <% end %>
15
+ <%= pb_rails("progress_step/progress_step_item", props: {status: "active"}) do %>
16
+ <% end %>
17
+ <%= pb_rails("progress_step/progress_step_item", props: {status: "inactive"}) do %>
18
+ <% end %>
19
+ <% end %>
20
+
21
+ <br />
22
+
23
+ <%= pb_rails("progress_step", props: {orientation: "vertical"}) do %>
24
+ <%= pb_rails("progress_step/progress_step_item", props: {status: "complete"}) do %>
25
+ Child
26
+ <% end %>
27
+ <%= pb_rails("progress_step/progress_step_item", props: {status: "active"}) do %>
28
+ Child
29
+ <% end %>
30
+ <%= pb_rails("progress_step/progress_step_item", props: {status: "inactive"}) do %>
31
+ Child
32
+ <% end %>
33
+ <% end %>
@@ -0,0 +1,40 @@
1
+ import React from 'react'
2
+ import ProgressStep from '../_progress_step.jsx'
3
+ import ProgressStepItem from '../_progress_step_item.jsx'
4
+
5
+ const ProgressStepVertical = () => (
6
+ <div>
7
+ <ProgressStep
8
+ icon
9
+ orientation="vertical"
10
+ >
11
+ <ProgressStepItem status="complete" />
12
+ <ProgressStepItem status="active" />
13
+ <ProgressStepItem status="inactive" />
14
+ </ProgressStep>
15
+
16
+ <br />
17
+
18
+ <ProgressStep orientation="vertical">
19
+ <ProgressStepItem status="complete" />
20
+ <ProgressStepItem status="active" />
21
+ <ProgressStepItem status="inactive" />
22
+ </ProgressStep>
23
+
24
+ <br />
25
+
26
+ <ProgressStep orientation="vertical">
27
+ <ProgressStepItem status="complete">
28
+ {'Child'}
29
+ </ProgressStepItem>
30
+ <ProgressStepItem status="active">
31
+ {'Child'}
32
+ </ProgressStepItem>
33
+ <ProgressStepItem status="inactive">
34
+ {'Child'}
35
+ </ProgressStepItem>
36
+ </ProgressStep>
37
+ </div>
38
+ )
39
+
40
+ export default ProgressStepVertical
@@ -0,0 +1,12 @@
1
+ examples:
2
+
3
+ rails:
4
+ - progress_step_default: Default
5
+ - progress_step_vertical: Vertical
6
+ - progress_step_dark: Dark
7
+
8
+
9
+ react:
10
+ - progress_step_default: Default
11
+ - progress_step_vertical: Vertical
12
+ - progress_step_dark: Dark
@@ -0,0 +1,3 @@
1
+ export { default as ProgressStepDefault } from './_progress_step_default.jsx'
2
+ export { default as ProgressStepVertical } from './_progress_step_vertical.jsx'
3
+ export { default as ProgressStepDark } from './_progress_step_dark.jsx'
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbProgressStep
5
+ class ProgressStep
6
+ include Playbook::Props
7
+
8
+ partial "pb_progress_step/progress_step"
9
+
10
+ prop :orientation, type: Playbook::Props::Enum,
11
+ values: %w[vertical horizontal],
12
+ default: "horizontal"
13
+ prop :icon, type: Playbook::Props::Boolean,
14
+ default: false
15
+ prop :dark, type: Playbook::Props::Boolean,
16
+ default: false
17
+
18
+ def classname
19
+ generate_classname("pb_progress_step_kit", orientation, icon_class, dark_class)
20
+ end
21
+
22
+ private
23
+
24
+ def icon_class
25
+ icon === true ? "icon" : nil
26
+ end
27
+
28
+ def dark_class
29
+ dark === true ? "dark" : nil
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbProgressStep
5
+ class ProgressStepItem
6
+ include Playbook::Props
7
+
8
+ partial "pb_progress_step/progress_step_item"
9
+
10
+ prop :status, type: Playbook::Props::Enum,
11
+ values: %w[complete active inactive],
12
+ default: "inactive"
13
+
14
+ def classname
15
+ generate_classname("pb_progress_step_item_kit", status)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -14,5 +14,5 @@
14
14
 
15
15
  <%= pb_rails("stat_change", props: {
16
16
  change: "neutral",
17
- value: 98
17
+ value: 102
18
18
  }) %>
@@ -20,7 +20,7 @@ const StatChangeDefault = () => {
20
20
 
21
21
  <StatChange
22
22
  change="neutral"
23
- value={98}
23
+ value={102}
24
24
  />
25
25
  </div>
26
26
  )
@@ -10,7 +10,7 @@ module Playbook
10
10
  prop :change, type: Playbook::Props::Enum,
11
11
  values: %w[neutral increase decrease],
12
12
  default: "neutral"
13
- prop :value, type: Playbook::Props::Percentage
13
+ prop :value, type: Playbook::Props::Numeric
14
14
 
15
15
  def status
16
16
  case change
@@ -1,21 +1,46 @@
1
+ /* @flow */
2
+
1
3
  import React from 'react'
2
- import PropTypes from 'prop-types'
4
+ import classnames from 'classnames'
3
5
 
4
- const propTypes = {
5
- className: PropTypes.string,
6
- id: PropTypes.string,
7
- }
6
+ import {
7
+ Caption,
8
+ } from '../'
9
+
10
+ import {
11
+ buildCss,
12
+ buildDataProps,
13
+ } from '../utilities/props'
8
14
 
9
- class Timestamp extends React.Component {
10
- render() {
11
- return (
12
- <div className="pb_timestamp">
13
- <span>{'TIMESTAMP CONTENT'}</span>
14
- </div>
15
- )
16
- }
15
+ type TimestampProps = {
16
+ id?: String,
17
+ data?: object,
18
+ className?: String,
19
+ text?: String,
17
20
  }
18
21
 
19
- Timestamp.propTypes = propTypes
22
+ const Timestamp = ({
23
+ id,
24
+ className,
25
+ data = {},
26
+ text,
27
+ }: TimestampProps) => {
28
+ const dataProps = buildDataProps(data)
29
+ const pbCss = buildCss('pb_timestamp_kit')
30
+
31
+ return (
32
+ <div
33
+ {...dataProps}
34
+ className={classnames(className, pbCss)}
35
+ id={id}
36
+ >
37
+ <Caption
38
+ size="xs"
39
+ tag="span"
40
+ text={text}
41
+ />
42
+ </div>
43
+ )
44
+ }
20
45
 
21
46
  export default Timestamp
@@ -0,0 +1,8 @@
1
+ import React from 'react'
2
+ import { Timestamp } from '../../'
3
+
4
+ const TimestampDefault = () => (
5
+ <Timestamp text="20 seconds ago" />
6
+ )
7
+
8
+ export default TimestampDefault
@@ -1,7 +1,7 @@
1
1
  examples:
2
-
2
+
3
3
  rails:
4
4
  - timestamp_default: Default
5
-
6
-
5
+
7
6
  react:
7
+ - timestamp_default: Default
@@ -0,0 +1 @@
1
+ export { default as TimestampDefault } from './_timestamp_default.jsx'
@@ -1,21 +1,54 @@
1
+ /* @flow */
2
+
1
3
  import React from 'react'
2
- import PropTypes from 'prop-types'
4
+ import classnames from 'classnames'
3
5
 
4
- const propTypes = {
5
- className: PropTypes.string,
6
- id: PropTypes.string,
7
- }
6
+ import {
7
+ Body,
8
+ Title,
9
+ } from '../'
10
+
11
+ import {
12
+ buildCss,
13
+ buildDataProps,
14
+ } from '../utilities/props'
8
15
 
9
- class TitleDetail extends React.Component {
10
- render() {
11
- return (
12
- <div className="pb_title_detail">
13
- <span>{'TITLE DETAIL CONTENT'}</span>
14
- </div>
15
- )
16
- }
16
+ type TitleDetailProps = {
17
+ align?: 'left' | 'center' | 'right',
18
+ className?: String,
19
+ data?: object,
20
+ detail: String,
21
+ id?: String,
22
+ title: String,
17
23
  }
18
24
 
19
- TitleDetail.propTypes = propTypes
25
+ const TitleDetail = ({
26
+ align = 'left',
27
+ className,
28
+ data = {},
29
+ detail,
30
+ id,
31
+ title,
32
+ }: TitleDetailProps) => {
33
+ const dataProps = buildDataProps(data)
34
+ const pbCss = buildCss('pb_title_detail_kit', align)
35
+
36
+ return (
37
+ <div
38
+ {...dataProps}
39
+ className={classnames(className, pbCss)}
40
+ id={id}
41
+ >
42
+ <Title
43
+ size={4}
44
+ text={title}
45
+ />
46
+ <Body
47
+ color="light"
48
+ text={detail}
49
+ />
50
+ </div>
51
+ )
52
+ }
20
53
 
21
54
  export default TitleDetail
@@ -0,0 +1,26 @@
1
+ import React from 'react'
2
+ import { TitleDetail } from '../../'
3
+
4
+ const TitleDetailDefault = () => (
5
+ <div>
6
+ <TitleDetail
7
+ detail="Commits data and history"
8
+ title="Email Notifications"
9
+ />
10
+
11
+ <TitleDetail
12
+ align="center"
13
+ detail="Commits data and history"
14
+ title="Email Notifications"
15
+ />
16
+
17
+ <TitleDetail
18
+ align="right"
19
+ detail="Commits data and history"
20
+ title="Email Notifications"
21
+ />
22
+
23
+ </div>
24
+ )
25
+
26
+ export default TitleDetailDefault
@@ -1,7 +1,7 @@
1
1
  examples:
2
-
2
+
3
3
  rails:
4
4
  - title_detail_default: Default
5
-
6
-
5
+
7
6
  react:
7
+ - title_detail_default: Default
@@ -0,0 +1 @@
1
+ export { default as TitleDetailDefault } from './_title_detail_default.jsx'
@@ -0,0 +1,10 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ class: object.classname) do %>
5
+ <div class="tooltip_tooltip" id="<%= object.tooltip_id %>" role="tooltip">
6
+ <%= capture(&object.children) %>
7
+ <div class="arrow" id="<%= object.tooltip_id %>-arrow"></div>
8
+ </div>
9
+
10
+ <% end %>
@@ -0,0 +1,105 @@
1
+ @import "../tokens/positioning";
2
+ @import "../tokens/colors";
3
+
4
+ @keyframes fadeIn {
5
+ from {
6
+ opacity: 0;
7
+ }
8
+
9
+ to {
10
+ opacity: 1;
11
+ }
12
+ }
13
+ @keyframes fadeOut {
14
+ from {
15
+ opacity: 1;
16
+ }
17
+
18
+ to {
19
+ opacity: 0;
20
+ }
21
+ }
22
+
23
+ [class^="pb_tooltip_kit"] {
24
+ .tooltip_tooltip {
25
+ display: none;
26
+ opacity: 0;
27
+ left: 0;
28
+ animation-name: fadeIn;
29
+ animation-duration: 150ms;
30
+ animation-timing-function: linear;
31
+ animation-fill-mode: forwards;
32
+
33
+ &.flipped {
34
+ margin-top: 15px;
35
+ .arrow {
36
+ top: -35%;
37
+ border-color: transparent transparent $white transparent;
38
+ }
39
+ }
40
+
41
+ &.react {
42
+ .arrow {
43
+ top: 78%;
44
+ }
45
+ &.flipped {
46
+ .arrow {
47
+ top: -8%;
48
+ }
49
+ }
50
+ }
51
+
52
+ .arrow {
53
+ content: " ";
54
+ position: absolute;
55
+ top: 100%;
56
+ left: 50%;
57
+ border-color: $white transparent transparent transparent;
58
+ border-style: solid;
59
+ border-width: 10px;
60
+ margin-bottom: 50px;
61
+ margin-left: -10px;
62
+ }
63
+ &.show {
64
+ opacity: 1;
65
+ display: block;
66
+ z-index: $z_9;
67
+ margin-bottom: $space_sm;
68
+ background-color: $white;
69
+ padding: $space_xs $space_sm $space_xs $space_sm;
70
+ box-shadow: $shadow_deeper;
71
+ border-radius: $border_rad_light;
72
+
73
+ &.fade_out {
74
+ animation-name: fadeOut;
75
+ animation-duration: 150ms;
76
+ animation-timing-function: linear;
77
+ animation-fill-mode: forwards;
78
+ }
79
+ }
80
+ }
81
+ &[class*=_dark]{
82
+ .tooltip_tooltip{
83
+ color: $white;
84
+ background-color: rgba($black, $opacity_9);
85
+
86
+
87
+ &.show {
88
+ }
89
+ .arrow {
90
+ border-color: $black transparent transparent transparent;
91
+ opacity: $opacity_9;
92
+ }
93
+ &.flipped {
94
+ .arrow {
95
+ border-color: transparent transparent $black transparent;
96
+ opacity: $opacity_9;
97
+ }
98
+ }
99
+ }
100
+ }
101
+ }
102
+
103
+ .tooltip_tooltip.top {
104
+ padding: ($space_xs - 3px) 0;
105
+ }
@@ -0,0 +1,10 @@
1
+ <span id='regular-tooltip-2'>Hover over me.</span>
2
+
3
+ <%= pb_rails("tooltip", props: {
4
+ trigger_element_id: "regular-tooltip-2",
5
+ tooltip_id: "tooltip-2",
6
+ position: 'top',
7
+ dark: true,
8
+ }) do %>
9
+ Whoa. I'm a tooltip.
10
+ <% end %>
@@ -0,0 +1,9 @@
1
+ <span id='regular-tooltip-1'>I am a white tooltip.</span>
2
+
3
+ <%= pb_rails("tooltip", props: {
4
+ trigger_element_id: "regular-tooltip-1",
5
+ tooltip_id: "tooltip-1",
6
+ position: 'top'
7
+ }) do %>
8
+ Whoa. I'm a white tooltip.
9
+ <% end %>
@@ -0,0 +1,5 @@
1
+ examples:
2
+
3
+ rails:
4
+ - tooltip_default: Default
5
+ - tooltip_white: White
@@ -0,0 +1,80 @@
1
+ import PbEnhancedElement from '../pb_enhanced_element'
2
+ import Popper from 'popper.js'
3
+
4
+ const TOOLTIP_OFFSET = '0,0'
5
+ const TOOLTIP_TIMEOUT = 250
6
+
7
+ export default class PbTooltip extends PbEnhancedElement {
8
+ static get selector() {
9
+ return '[data-pb-tooltip-kit]'
10
+ }
11
+
12
+ connect() {
13
+ this.popper = new Popper(this.triggerElement, this.tooltip, {
14
+ placement: this.position,
15
+ modifiers: {
16
+ offset: {
17
+ offset: TOOLTIP_OFFSET,
18
+ },
19
+ arrow: {
20
+ element: `#${this.tooltipId}-arrow`,
21
+ },
22
+ },
23
+ onUpdate: (p) => {
24
+ p.instance.popper.classList.toggle('flipped', p.flipped)
25
+ },
26
+ })
27
+
28
+ this.tooltip.addEventListener('mouseleave', () => {
29
+ this.hideTooltip()
30
+ })
31
+
32
+ this.triggerElement.addEventListener('mouseenter', () => {
33
+ this.mouseenterTimeout = setTimeout(() => {
34
+ this.popper.scheduleUpdate()
35
+ this.showTooltip()
36
+ }, TOOLTIP_TIMEOUT)
37
+
38
+ this.triggerElement.addEventListener('mouseleave', (event) => {
39
+ clearTimeout(this.mouseenterTimeout)
40
+ if (event.toElement.closest(`#${this.tooltipId}`) !== this.tooltip) {
41
+ setTimeout(() => {
42
+ this.hideTooltip()
43
+ }, 0)
44
+ }
45
+ }, { once: true })
46
+ })
47
+ }
48
+
49
+ showTooltip() {
50
+ this.tooltip.classList.add('show')
51
+ }
52
+
53
+ hideTooltip() {
54
+ this.tooltip.classList.remove('show')
55
+ }
56
+
57
+ toggleTooltip() {
58
+ this.tooltip.classList.toggle('show')
59
+ }
60
+
61
+ get triggerElement() {
62
+ return this._triggerElement = (this._triggerElement || document.querySelector(`#${this.triggerElementId}`))
63
+ }
64
+
65
+ get tooltip() {
66
+ return this._tooltip = (this._tooltip || this.element.querySelector(`#${this.tooltipId}`))
67
+ }
68
+
69
+ get position() {
70
+ return this.element.dataset.pbTooltipPosition
71
+ }
72
+
73
+ get triggerElementId() {
74
+ return this.element.dataset.pbTooltipTriggerElementId
75
+ }
76
+
77
+ get tooltipId() {
78
+ return this.element.dataset.pbTooltipTooltipId
79
+ }
80
+ }
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbTooltip
5
+ class Tooltip
6
+ include Playbook::Props
7
+ partial "pb_tooltip/tooltip"
8
+
9
+ prop :position
10
+ prop :trigger_element_id
11
+ prop :tooltip_id
12
+ prop :dark, type: Playbook::Props::Boolean,
13
+ default: false
14
+
15
+ def classname
16
+ generate_classname("pb_tooltip_kit", dark_class)
17
+ end
18
+
19
+ def data
20
+ Hash(values[:data]).merge(
21
+ pb_tooltip_kit: true,
22
+ pb_tooltip_position: position,
23
+ pb_tooltip_trigger_element_id: trigger_element_id,
24
+ pb_tooltip_tooltip_id: tooltip_id,
25
+ )
26
+ end
27
+
28
+ private
29
+ def dark_class
30
+ dark ? "dark" : nil
31
+ end
32
+ end
33
+ end
34
+ end