playbook_ui 8.0.0.pre.alpha5 → 8.1.0.pre.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -0
  3. data/app/pb_kits/playbook/_playbook.scss +10 -7
  4. data/app/pb_kits/playbook/data/menu.yml +3 -1
  5. data/app/pb_kits/playbook/index.js +3 -0
  6. data/app/pb_kits/playbook/pb_avatar/_avatar.jsx +14 -2
  7. data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +1 -1
  8. data/app/pb_kits/playbook/pb_avatar/avatar.rb +5 -2
  9. data/app/pb_kits/playbook/pb_avatar/avatar.test.js +5 -2
  10. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_default.html.erb +5 -0
  11. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_default.jsx +5 -0
  12. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_status.html.erb +4 -0
  13. data/app/pb_kits/playbook/pb_avatar/docs/_avatar_status.jsx +4 -0
  14. data/app/pb_kits/playbook/pb_avatar_action_button/_avatar_action_button.jsx +6 -0
  15. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.html.erb +2 -1
  16. data/app/pb_kits/playbook/pb_avatar_action_button/avatar_action_button.rb +2 -0
  17. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.html.erb +4 -0
  18. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_actions.jsx +4 -0
  19. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.html.erb +2 -0
  20. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_default.jsx +2 -0
  21. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_on_click.jsx +2 -0
  22. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_onclick.html.erb +2 -0
  23. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.html.erb +8 -0
  24. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_placement.jsx +8 -0
  25. data/app/pb_kits/playbook/pb_avatar_action_button/docs/_avatar_action_button_tooltip.html.erb +2 -0
  26. data/app/pb_kits/playbook/pb_avatar_action_button/pb_avatar_action_button.test.js +31 -0
  27. data/app/pb_kits/playbook/pb_badge/_badge.jsx +26 -1
  28. data/app/pb_kits/playbook/pb_button/_button.jsx +6 -0
  29. data/app/pb_kits/playbook/pb_button/button.test.js +91 -0
  30. data/app/pb_kits/playbook/pb_button/docs/_button_default.jsx +0 -1
  31. data/app/pb_kits/playbook/pb_button_toolbar/button_toolbar.test.js +46 -0
  32. data/app/pb_kits/playbook/pb_caption/_caption.jsx +3 -2
  33. data/app/pb_kits/playbook/pb_caption/caption.rb +1 -1
  34. data/app/pb_kits/playbook/pb_card/_card.jsx +18 -3
  35. data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
  36. data/app/pb_kits/playbook/pb_card/card.rb +3 -0
  37. data/app/pb_kits/playbook/pb_card/card_header.rb +7 -7
  38. data/app/pb_kits/playbook/pb_card/docs/_card_tag.html.erb +25 -0
  39. data/app/pb_kits/playbook/pb_card/docs/_card_tag.jsx +59 -0
  40. data/app/pb_kits/playbook/pb_card/docs/example.yml +2 -0
  41. data/app/pb_kits/playbook/pb_card/docs/index.js +1 -0
  42. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.test.js +17 -0
  43. data/app/pb_kits/playbook/pb_collapsible/_collapsible.jsx +84 -0
  44. data/app/pb_kits/playbook/pb_collapsible/_collapsible.scss +15 -0
  45. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleContent.jsx +40 -0
  46. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.jsx +59 -0
  47. data/app/pb_kits/playbook/pb_collapsible/collapsible.html.erb +7 -0
  48. data/app/pb_kits/playbook/pb_collapsible/collapsible.rb +11 -0
  49. data/app/pb_kits/playbook/pb_collapsible/collapsible.test.js +50 -0
  50. data/app/pb_kits/playbook/pb_collapsible/collapsible_content.html.erb +7 -0
  51. data/app/pb_kits/playbook/pb_collapsible/collapsible_content.rb +17 -0
  52. data/app/pb_kits/playbook/pb_collapsible/collapsible_main.html.erb +16 -0
  53. data/app/pb_kits/playbook/pb_collapsible/collapsible_main.rb +15 -0
  54. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.html.erb +10 -0
  55. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default.jsx +19 -0
  56. data/app/pb_kits/playbook/pb_collapsible/docs/example.yml +9 -0
  57. data/app/pb_kits/playbook/pb_collapsible/docs/index.js +1 -0
  58. data/app/pb_kits/playbook/pb_collapsible/index.js +79 -0
  59. data/app/pb_kits/playbook/pb_dashboard/commonSettings.js +2 -2
  60. data/app/pb_kits/playbook/pb_dashboard/pbChartsLightTheme.js +2 -2
  61. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.jsx +6 -2
  62. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.html.erb +1 -1
  63. data/app/pb_kits/playbook/pb_dialog/_close_icon.jsx +23 -0
  64. data/app/pb_kits/playbook/pb_dialog/_dialog.html.erb +10 -0
  65. data/app/pb_kits/playbook/pb_dialog/_dialog.jsx +142 -0
  66. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +133 -0
  67. data/app/pb_kits/playbook/pb_dialog/_dialog_context.jsx +3 -0
  68. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_body.jsx +21 -0
  69. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_footer.jsx +36 -0
  70. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_header.jsx +68 -0
  71. data/app/pb_kits/playbook/pb_dialog/dialog.rb +47 -0
  72. data/app/pb_kits/playbook/pb_dialog/dialog.test.jsx +23 -0
  73. data/app/pb_kits/playbook/pb_dialog/dialog_header.rb +31 -0
  74. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_compound_components.jsx +53 -0
  75. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_compound_components.md +2 -0
  76. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_default.jsx +27 -0
  77. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_scrollable.jsx +27 -0
  78. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_scrollable.md +2 -0
  79. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_separators.jsx +119 -0
  80. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_separators.md +2 -0
  81. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_should_close_on_overlay.jsx +28 -0
  82. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_should_close_on_overlay.md +2 -0
  83. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_sizes.jsx +93 -0
  84. data/app/pb_kits/playbook/pb_dialog/docs/example.yml +10 -0
  85. data/app/pb_kits/playbook/pb_dialog/docs/index.js +6 -0
  86. data/app/pb_kits/playbook/pb_docs/kit_example.rb +1 -1
  87. data/app/pb_kits/playbook/pb_form/_form.scss +5 -1
  88. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +2 -2
  89. data/app/pb_kits/playbook/pb_form/form.rb +11 -2
  90. data/app/pb_kits/playbook/pb_form/form_builder.rb +4 -2
  91. data/app/pb_kits/playbook/pb_form/form_builder/action_area.rb +14 -7
  92. data/app/pb_kits/playbook/pb_form/form_with.html.erb +7 -14
  93. data/app/pb_kits/playbook/pb_form/form_with.rb +13 -6
  94. data/app/pb_kits/playbook/pb_form/simple_form.html.erb +2 -4
  95. data/app/pb_kits/playbook/pb_form/simple_form.rb +4 -0
  96. data/app/pb_kits/playbook/pb_inline/_inline.jsx +83 -0
  97. data/app/pb_kits/playbook/pb_inline/_inline.scss +58 -0
  98. data/app/pb_kits/playbook/pb_inline/docs/_inline_default.jsx +36 -0
  99. data/app/pb_kits/playbook/pb_inline/docs/_inline_input_options.jsx +58 -0
  100. data/app/pb_kits/playbook/pb_inline/docs/_inline_text_options.jsx +99 -0
  101. data/app/pb_kits/playbook/pb_inline/docs/example.yml +5 -0
  102. data/app/pb_kits/playbook/pb_inline/docs/index.js +3 -0
  103. data/app/pb_kits/playbook/pb_inline/inline.test.jsx +21 -0
  104. data/app/pb_kits/playbook/pb_nav/_item.jsx +2 -0
  105. data/app/pb_kits/playbook/pb_nav/_nav.jsx +2 -2
  106. data/app/pb_kits/playbook/pb_nav/item.html.erb +2 -2
  107. data/app/pb_kits/playbook/pb_nav/nav.html.erb +1 -1
  108. data/app/pb_kits/playbook/pb_online_status/_online_status.jsx +2 -0
  109. data/app/pb_kits/playbook/pb_online_status/online_status.html.erb +1 -1
  110. data/app/pb_kits/playbook/pb_progress_simple/_progress_simple.jsx +1 -1
  111. data/app/pb_kits/playbook/pb_progress_simple/_progress_simple.scss +5 -0
  112. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_variants.html.erb +5 -0
  113. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_variants.jsx +7 -0
  114. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_variants.md +1 -1
  115. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.rb +1 -1
  116. data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.jsx +4 -3
  117. data/app/pb_kits/playbook/pb_text_input/_text_input.jsx +3 -0
  118. data/app/pb_kits/playbook/pb_textarea/_textarea.jsx +3 -0
  119. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.jsx +43 -26
  120. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.scss +18 -0
  121. data/app/pb_kits/playbook/pb_time_stacked/docs/_time_stacked_default.html.erb +18 -5
  122. data/app/pb_kits/playbook/pb_time_stacked/docs/_time_stacked_default.jsx +10 -5
  123. data/app/pb_kits/playbook/pb_time_stacked/time_stacked.html.erb +7 -3
  124. data/app/pb_kits/playbook/pb_time_stacked/time_stacked.rb +8 -30
  125. data/app/pb_kits/playbook/pb_time_stacked/time_stacked.test.js +33 -0
  126. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +4 -3
  127. data/app/pb_kits/playbook/pb_typeahead/_typeahead.jsx +6 -1
  128. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.jsx +25 -2
  129. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default.jsx +1 -0
  130. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills.jsx +7 -3
  131. data/app/pb_kits/playbook/pb_user_badge/_user_badge.jsx +1 -1
  132. data/app/pb_kits/playbook/plugins/pb_chart.js +1 -1
  133. data/app/pb_kits/playbook/react_rails_kits.js +4 -0
  134. data/app/pb_kits/playbook/tokens/_border_radius.scss +0 -10
  135. data/app/pb_kits/playbook/tokens/_colors.scss +0 -25
  136. data/app/pb_kits/playbook/tokens/_line_height.scss +0 -9
  137. data/app/pb_kits/playbook/tokens/_opacity.scss +0 -9
  138. data/app/pb_kits/playbook/tokens/_positioning.scss +0 -9
  139. data/app/pb_kits/playbook/tokens/_screen_sizes.scss +0 -9
  140. data/app/pb_kits/playbook/tokens/_shadows.scss +0 -9
  141. data/app/pb_kits/playbook/tokens/_spacing.scss +0 -10
  142. data/app/pb_kits/playbook/tokens/_typography.scss +0 -25
  143. data/app/pb_kits/playbook/tokens/exports/_border_radius.scss +10 -0
  144. data/app/pb_kits/playbook/tokens/exports/_colors.scss +26 -0
  145. data/app/pb_kits/playbook/tokens/exports/_line_height.scss +10 -0
  146. data/app/pb_kits/playbook/tokens/exports/_opacity.scss +10 -0
  147. data/app/pb_kits/playbook/tokens/exports/_positioning.scss +10 -0
  148. data/app/pb_kits/playbook/tokens/exports/_screen_sizes.scss +10 -0
  149. data/app/pb_kits/playbook/tokens/exports/_shadows.scss +10 -0
  150. data/app/pb_kits/playbook/tokens/exports/_spacing.scss +10 -0
  151. data/app/pb_kits/playbook/tokens/exports/_typography.scss +24 -0
  152. data/app/pb_kits/playbook/utilities/test-utils.js +6 -0
  153. data/app/pb_kits/playbook/vendor.js +3 -0
  154. data/dist/reset.css +1 -0
  155. data/lib/playbook/props/base.rb +1 -1
  156. data/lib/playbook/version.rb +1 -1
  157. metadata +73 -12
  158. data/app/pb_kits/playbook/pb_form/form.html.erb +0 -7
  159. data/app/pb_kits/playbook/pb_form/form_builder/action_area.html.erb +0 -3
@@ -0,0 +1,7 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ class: object.classname,
5
+ aria: object.aria) do %>
6
+ <%= content.presence %>
7
+ <% end %>
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbCollapsible
5
+ class CollapsibleContent < Playbook::KitBase
6
+ def data
7
+ Hash(values[:data]).merge(
8
+ collapsible_content: true
9
+ )
10
+ end
11
+
12
+ def classname
13
+ generate_classname("pb_collapsible_content_kit", "toggle-content", padding, separator: " ")
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ class: object.classname,
5
+ aria: object.aria) do %>
6
+
7
+ <%= pb_rails("flex", props: {vertical: "center", spacing: "between"}) do %>
8
+ <%= pb_rails("flex/flex_item") do %>
9
+ <%= content.presence %>
10
+ <% end %>
11
+ <%= pb_rails("flex/flex_item") do %>
12
+ <i class="far fa-chevron-down"></i>
13
+ <i class="far fa-chevron-up" style="display: none"></i>
14
+ <% end %>
15
+ <% end %>
16
+ <% end %>
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbCollapsible
5
+ class CollapsibleMain < Playbook::KitBase
6
+ def data
7
+ Hash(prop(:data)).merge(collapsible_main: true)
8
+ end
9
+
10
+ def classname
11
+ generate_classname("pb_collapsible_main_kit", padding, separator: " ")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ <%= pb_rails("collapsible", props: { name: "default-example" }) do %>
2
+ <%= pb_rails("collapsible/collapsible_main", props: { padding: "md", name: "default-main" }) do %>
3
+ <%= pb_rails("body", props: { text: "Main Section"}) %>
4
+ <% end %>
5
+ <%= pb_rails("collapsible/collapsible_content", props: { padding: "md" }) do %>
6
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec iaculis, risus a fringilla luctus, sapien eros sodales ex, quis molestie est nulla non turpis. Vestibulum aliquet at ipsum eget posuere. Morbi sed laoreet erat. Sed commodo posuere lectus, at porta nulla ornare a. Suspendisse quam est, sollicitudin ut enim sit amet, commodo placerat enim. Donec laoreet metus ac mauris pellentesque mattis. Pellentesque luctus vel mauris non aliquam. Mauris hendrerit mattis porttitor. Curabitur vehicula justo non ex consectetur commodo. Quisque posuere aliquet quam. Maecenas malesuada magna mauris, ac tempor metus euismod at.
7
+ <br><br>
8
+ Cras ornare fermentum magna mollis efficitur. Sed vitae nulla vel purus ultrices mollis. Maecenas id nulla id libero faucibus feugiat quis sit amet turpis. In commodo pellentesque risus at fringilla. Integer non interdum leo, non commodo ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut mi augue, dignissim at orci vel, egestas aliquam mi. Proin finibus aliquet tempor. Integer cursus, ex quis gravida rhoncus, nisi elit viverra ipsum, non efficitur est ex ac tortor. Praesent vitae odio massa.
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,19 @@
1
+ import React from 'react'
2
+ import { Collapsible } from '../..'
3
+
4
+ const CollapsibleDefault = () => (
5
+ <Collapsible>
6
+ <Collapsible.Main>
7
+ <div>{'Main Section'}</div>
8
+ </Collapsible.Main>
9
+ <Collapsible.Content>
10
+ <div>
11
+ {
12
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In vel erat sed purus hendrerit viverra. Duis et vestibulum metus. Sed consequat ut ante non vehicula. Etiam nunc massa, pharetra vel quam id, posuere rhoncus quam. Quisque imperdiet arcu enim, nec aliquet justo auctor eget. Curabitur in metus nec nunc rhoncus faucibus vitae ac elit. Nulla facilisi. Vestibulum quis pretium nulla. Nulla ut accumsan velit. Duis varius urna sed sem tempor, sit amet fermentum nibh auctor. Praesent lorem arcu, egestas non ante quis, placerat pellentesque lectus.Vestibulum lacinia ipsum quis venenatis tristique. Vivamus suscipit, libero eu fringilla egestas, orci urna commodo arcu, vel gravida turpis ipsum molestie nibh. Donec cursus eu ante sagittis ultrices. Phasellus id sagittis risus. Mauris dapibus neque faucibus, tempor ligula vel, cursus ante. Donec faucibus gravida porta. Nullam egestas est quis aliquam feugiat. Sed eget metus diam. Cras eget placerat libero.'
13
+ }
14
+ </div>
15
+ </Collapsible.Content>
16
+ </Collapsible>
17
+ )
18
+
19
+ export default CollapsibleDefault
@@ -0,0 +1,9 @@
1
+ examples:
2
+
3
+ rails:
4
+ - collapsible_default: Light
5
+
6
+ react:
7
+ - collapsible_default: Light
8
+
9
+
@@ -0,0 +1 @@
1
+ export { default as CollapsibleDefault } from './_collapsible_default.jsx'
@@ -0,0 +1,79 @@
1
+ import PbEnhancedElement from '../pb_enhanced_element'
2
+
3
+ const MAIN_SELECTOR = '[data-collapsible-main]'
4
+ const CONTENT_SELECTOR = '[data-collapsible-content]'
5
+ const DOWN_ARROW_SELECTOR = '.fa-chevron-down'
6
+ const UP_ARROW_SELECTOR = '.fa-chevron-up'
7
+
8
+ export default class PbCollapsible extends PbEnhancedElement {
9
+ static get selector() {
10
+ return MAIN_SELECTOR
11
+ }
12
+
13
+ connect() {
14
+ this.element.addEventListener('click', () => {
15
+ this.toggleElement(this.target)
16
+ })
17
+ this.displayDownArrow()
18
+ }
19
+
20
+ get target() {
21
+ return this.element.parentNode.querySelector(CONTENT_SELECTOR)
22
+ }
23
+
24
+ showElement(elem) {
25
+ // Get the natural height of the element
26
+ const getHeight = () => {
27
+ elem.style.display = 'block'
28
+ const height = elem.scrollHeight + 'px' // Get it's height
29
+ elem.style.display = '' // Hide it again
30
+ return height
31
+ }
32
+
33
+ const height = getHeight()
34
+ elem.classList.add('is-visible')
35
+ elem.style.height = height // Update the max-height
36
+
37
+ // Once the transition is complete, remove the inline max-height so the content can scale responsively
38
+ window.setTimeout(() => {
39
+ elem.style.height = ''
40
+ }, 300)
41
+ }
42
+
43
+ hideElement(elem) {
44
+ // Give the element a height to change from
45
+ elem.style.height = elem.scrollHeight + 'px'
46
+
47
+ window.setTimeout(() => {
48
+ elem.style.height = '0'
49
+ elem.style.paddingTop = '0'
50
+ elem.style.paddingBottom = '0'
51
+ }, 1)
52
+
53
+ // When the transition is complete, hide it
54
+ window.setTimeout(() => {
55
+ elem.classList.remove('is-visible')
56
+ }, 300)
57
+ }
58
+
59
+ toggleElement(elem) {
60
+ if (elem.classList.contains('is-visible')) {
61
+ this.hideElement(elem)
62
+ this.displayDownArrow()
63
+ return
64
+ }
65
+ // Otherwise, show it
66
+ this.showElement(elem)
67
+ this.displayUpArrow()
68
+ }
69
+
70
+ displayDownArrow() {
71
+ this.element.querySelector(DOWN_ARROW_SELECTOR).style.display = 'inline-block'
72
+ this.element.querySelector(UP_ARROW_SELECTOR).style.display = 'none'
73
+ }
74
+
75
+ displayUpArrow() {
76
+ this.element.querySelector(UP_ARROW_SELECTOR).style.display = 'inline-block'
77
+ this.element.querySelector(DOWN_ARROW_SELECTOR).style.display = 'none'
78
+ }
79
+ }
@@ -1,5 +1,5 @@
1
- import colors from '../tokens/_colors.scss'
2
- import typography from '../tokens/_typography.scss'
1
+ import colors from '../tokens/exports/_colors.scss'
2
+ import typography from '../tokens/exports/_typography.scss'
3
3
 
4
4
  const dataColors = [
5
5
  colors.data_1,
@@ -1,5 +1,5 @@
1
- import colors from '../tokens/_colors.scss'
2
- import typography from '../tokens/_typography.scss'
1
+ import colors from '../tokens/exports/_colors.scss'
2
+ import typography from '../tokens/exports/_typography.scss'
3
3
 
4
4
  import Highcharts from 'highcharts'
5
5
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  import React from 'react'
4
4
  import { DateStacked, Flex, FlexItem, TimeStacked } from '../'
5
+ import { buildDataProps } from '../utilities/props'
5
6
  import { globalProps } from '../utilities/globalProps.js'
6
7
 
7
8
  type DateTimeStackedProps = {
@@ -12,12 +13,15 @@ type DateTimeStackedProps = {
12
13
  }
13
14
 
14
15
  const DateTimeStacked = (props: DateTimeStackedProps) => {
15
- const { date, dark } = props
16
+ const { date, data = {}, dark } = props,
17
+ dataProps = buildDataProps(data)
18
+
16
19
  return (
17
20
  <Flex
18
21
  className={globalProps(props)}
19
22
  orientation="row"
20
23
  vertical="center"
24
+ {...dataProps}
21
25
  >
22
26
  <FlexItem>
23
27
  <DateStacked
@@ -32,8 +36,8 @@ const DateTimeStacked = (props: DateTimeStackedProps) => {
32
36
  <TimeStacked
33
37
  className="pb_date_time_stacked_kit"
34
38
  dark={dark}
35
- date={date}
36
39
  tag="caption"
40
+ time={date}
37
41
  />
38
42
  </FlexItem>
39
43
  </Flex>
@@ -7,7 +7,7 @@
7
7
  <%= pb_rails("date_stacked", props: { align: "right", date: object.date, reverse: true, size: "sm", dark: object.dark }) %>
8
8
  <% end %>
9
9
  <%= pb_rails("flex/flex_item") do %>
10
- <%= pb_rails("time_stacked", props: { classname: "pb_date_time_stacked_kit", date: object.date, tag: "caption" }) %>
10
+ <%= pb_rails("time_stacked", props: { classname: "pb_date_time_stacked_kit", time: object.date, tag: "caption" }) %>
11
11
  <% end %>
12
12
  <% end %>
13
13
  <% end %>
@@ -0,0 +1,23 @@
1
+ /* @flow */
2
+
3
+ import React from 'react'
4
+ import { Icon } from '../'
5
+
6
+ type CloseIconProps = {
7
+ onClose: () => mixed,
8
+ }
9
+
10
+ export const CloseIcon = (props: CloseIconProps) => {
11
+ const { onClose } = props
12
+ return (
13
+ <div
14
+ className="pb_dialog_close_icon"
15
+ onClick={onClose}
16
+ >
17
+ <Icon
18
+ fixedWidth
19
+ icon="times"
20
+ />
21
+ </div>
22
+ )
23
+ }
@@ -0,0 +1,10 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ class: object.classname,
5
+ aria: object.aria,
6
+ dark: object.dark) do %>
7
+ <% if object.children %>
8
+ <%= pb_rails("dialog/dialog_header", props: { children: object.children }) %>
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,142 @@
1
+ /* @flow */
2
+
3
+ import React, { useState } from 'react'
4
+ import classnames from 'classnames'
5
+ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
6
+ import { globalProps } from '../utilities/globalProps.js'
7
+ import Modal from 'react-modal'
8
+ import { Button } from '../'
9
+ import DialogHeader from './child_kits/_dialog_header'
10
+ import DialogFooter from './child_kits/_dialog_footer'
11
+ import DialogBody from './child_kits/_dialog_body'
12
+ import { DialogContext } from './_dialog_context'
13
+
14
+ type DialogProps = {
15
+ aria?: object,
16
+ cancelButton?: string,
17
+ children: array<React.ReactNode> | React.ReactNode | string,
18
+ className?: string,
19
+ closeable: boolean,
20
+ confirmButton?: string,
21
+ data?: object,
22
+ id?: string,
23
+ onCancel?: () => void,
24
+ onChange?: () => void,
25
+ onClose?: () => void,
26
+ onConfirm?: () => void,
27
+ opened: boolean,
28
+ shouldCloseOnOverlayClick: boolean,
29
+ size?: "sm" | "md" | "lg" | "content",
30
+ text?: string,
31
+ title?: string,
32
+ trigger?: string
33
+ }
34
+
35
+ const Dialog = (props: DialogProps) => {
36
+ const {
37
+ aria = {},
38
+ cancelButton,
39
+ confirmButton,
40
+ className,
41
+ data = {},
42
+ id,
43
+ size = 'md',
44
+ children,
45
+ opened,
46
+ onCancel = () => {},
47
+ onConfirm = () => {},
48
+ onClose = () => {},
49
+ shouldCloseOnOverlayClick = true,
50
+ text,
51
+ title,
52
+ trigger,
53
+ } = props
54
+ const ariaProps = buildAriaProps(aria)
55
+ const dataProps = buildDataProps(data)
56
+
57
+ const dialogClassNames = {
58
+ base: classnames('pb_dialog', buildCss('pb_dialog', size)),
59
+ afterOpen: 'pb_dialog_after_open',
60
+ beforeClose: 'pb_dialog_before_close',
61
+ }
62
+
63
+ const overlayClassNames = {
64
+ base: 'pb_dialog_overlay',
65
+ afterOpen: 'pb_dialog_overlay_after_open',
66
+ beforeClose: 'pb_dialog_overlay_before_close',
67
+ }
68
+
69
+ const classes = classnames(
70
+ buildCss('pb_dialog_wrapper'),
71
+ globalProps(props),
72
+ className
73
+ )
74
+
75
+ const api = {
76
+ onClose: trigger ? function(){
77
+ setTriggerOpened(false)
78
+ } : onClose,
79
+ }
80
+
81
+ const [triggerOpened, setTriggerOpened] = useState(false),
82
+ modalIsOpened = trigger ? triggerOpened : opened
83
+
84
+ if (trigger) {
85
+ const modalTrigger = document.querySelector(trigger)
86
+ modalTrigger.addEventListener('click', () => {
87
+ setTriggerOpened(true)
88
+ document.querySelector('#cancel-button').addEventListener('click', () => {
89
+ setTriggerOpened(false)
90
+ })
91
+ }, { once: true })
92
+ }
93
+
94
+ return (
95
+ <DialogContext.Provider value={api}>
96
+ <div
97
+ {...ariaProps}
98
+ {...dataProps}
99
+ className={classes}
100
+ id={id}
101
+ >
102
+ <Modal
103
+ ariaHideApp={false}
104
+ className={dialogClassNames}
105
+ closeTimeoutMS={200}
106
+ contentLabel="Minimal Modal Example"
107
+ isOpen={modalIsOpened}
108
+ onRequestClose={onClose}
109
+ overlayClassName={overlayClassNames}
110
+ shouldCloseOnOverlayClick={shouldCloseOnOverlayClick}
111
+ >
112
+ <If condition={title}>
113
+ <Dialog.Header>{title}</Dialog.Header>
114
+ </If>
115
+ <If condition={text}>
116
+ <Dialog.Body>{text}</Dialog.Body>
117
+ </If>
118
+
119
+ <If condition={cancelButton && confirmButton}>
120
+ <Dialog.Footer>
121
+ <Button onClick={onConfirm}>{confirmButton}</Button>
122
+ <Button
123
+ id="cancel-button"
124
+ onClick={onCancel}
125
+ variant="link"
126
+ >
127
+ {cancelButton}
128
+ </Button>
129
+ </Dialog.Footer>
130
+ </If>
131
+
132
+ {children}
133
+ </Modal>
134
+ </div>
135
+ </DialogContext.Provider>
136
+ )
137
+ }
138
+ Dialog.Header = DialogHeader
139
+ Dialog.Body = DialogBody
140
+ Dialog.Footer = DialogFooter
141
+
142
+ export default Dialog
@@ -0,0 +1,133 @@
1
+ @import "../tokens/positioning";
2
+ @import "../tokens/colors";
3
+ @import "../pb_card/card_mixin";
4
+ @import "../tokens/shadows";
5
+ @import "../tokens/border_radius";
6
+ @import "../tokens/spacing";
7
+ @import "../tokens/animation-curves";
8
+
9
+
10
+
11
+ // Dialog Animations
12
+
13
+ @keyframes modalFadeIn {
14
+ from {
15
+ transform: translate3d(0, -100%, 0);
16
+ opacity: 0;
17
+ }
18
+ to {
19
+ transform: translate3d(0, 0, 0);
20
+ opacity: 1;
21
+ }
22
+ }
23
+
24
+ @keyframes modalFadeOut {
25
+ from {
26
+ transform: translate3d(0, 0, 0);
27
+ opacity: 1;
28
+ }
29
+ to {
30
+ transform: translate3d(0, -50%, 0);
31
+ opacity: 0;
32
+ }
33
+ }
34
+
35
+ @keyframes overlayFade {
36
+ from {
37
+ opacity: 0;
38
+ transform: translateY(0);
39
+ }
40
+ to {
41
+ opacity: 1;
42
+ transform: translateY(0);
43
+ }
44
+ }
45
+
46
+ @keyframes overlayFadeOut {
47
+ from {
48
+ opacity: 1;
49
+ }
50
+ to {
51
+ opacity: 0;
52
+ }
53
+ }
54
+
55
+ // Dialog Styles
56
+
57
+ .pb_dialog {
58
+
59
+ // Local Variables
60
+ $gutter: $space_lg;
61
+ $small: 300px;
62
+ $medium: 500px;
63
+ $large: 800px;
64
+ $animation-duration: 0.2s;
65
+ $z-index: 100;
66
+ $opacity_visible: 1;
67
+ $opacity_hidden: 0;
68
+
69
+ @include pb_card;
70
+ box-shadow: $shadow_deepest;
71
+ border: 0;
72
+ max-height: calc(100vh - #{$gutter * 2});
73
+ max-width: calc(100vw - #{$gutter * 2});
74
+ overflow: scroll;
75
+ animation-name: modalFadeIn;
76
+ animation-duration: $animation-duration;
77
+ outline: none;
78
+ animation-timing-function: $easeInOutQuint;
79
+
80
+ &[class*="_sm"] {
81
+ width: $small;
82
+ }
83
+
84
+ &[class*="_md"] {
85
+ width: $medium;
86
+ }
87
+
88
+ &[class*="_lg"] {
89
+ width: $large;
90
+ }
91
+
92
+ &_body_open {
93
+ overflow: hidden;
94
+ }
95
+
96
+ &_after_open {
97
+ opacity: $opacity_visible;
98
+ }
99
+
100
+ &_before_close {
101
+ animation-name: modalFadeOut;
102
+ animation-duration: $animation-duration;
103
+ opacity: $opacity_hidden;
104
+ }
105
+
106
+ &_close_icon {
107
+ cursor: pointer;
108
+ }
109
+
110
+ &_overlay {
111
+ position: fixed;
112
+ top: 0;
113
+ left: 0;
114
+ right: 0;
115
+ bottom: 0;
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ background-color: rgba($bg_dark, $opacity_4);
120
+ z-index: $z-index;
121
+ animation-name: overlayFade;
122
+ animation-duration: $animation-duration;
123
+
124
+ &_after_open {
125
+ opacity: $opacity_visible;
126
+ }
127
+ &_before_close {
128
+ animation-name: overlayFadeOut;
129
+ animation-duration: $animation-duration;
130
+ opacity: $opacity_hidden;
131
+ }
132
+ }
133
+ }