playbook_ui 14.16.0.pre.alpha.PLAY1938completetooltipfloatinguitransition6830 → 14.16.0.pre.alpha.play1957inlinedatepickericonbugfix6872

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +34 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +2 -2
  4. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +10 -0
  5. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows.html.erb +39 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows.html.erb +33 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +1 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +6 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/index.js +1 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +4 -2
  12. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +19 -9
  13. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +38 -1
  14. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +49 -37
  15. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +39 -0
  16. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +34 -34
  17. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +2 -2
  18. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +16 -0
  19. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_inline.html.erb +0 -11
  20. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_inline.jsx +0 -7
  21. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_inline_styles.scss +28 -24
  22. data/app/pb_kits/playbook/pb_tooltip/floating_ui.js +282 -0
  23. data/app/pb_kits/playbook/pb_tooltip/index.js +57 -184
  24. data/dist/chunks/{_typeahead-BEyzuDQy.js → _typeahead-BniHPQq8.js} +3 -3
  25. data/dist/chunks/_weekday_stacked-CuaFaMk8.js +45 -0
  26. data/dist/chunks/lib-UIelzz2O.js +29 -0
  27. data/dist/chunks/{pb_form_validation-CJD-PyIw.js → pb_form_validation-EUv1tqtI.js} +1 -1
  28. data/dist/chunks/vendor.js +1 -1
  29. data/dist/playbook-doc.js +1 -1
  30. data/dist/playbook-rails-react-bindings.js +1 -1
  31. data/dist/playbook-rails.js +1 -1
  32. data/dist/playbook.css +1 -1
  33. data/lib/playbook/version.rb +1 -1
  34. metadata +13 -8
  35. data/dist/chunks/_weekday_stacked-BWYgED9z.js +0 -45
  36. data/dist/chunks/lib-BgzBJfYr.js +0 -29
  37. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.md → _advanced_table_selectable_rows_no_subrows_react.md} +0 -0
  38. /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.md → _advanced_table_selectable_rows_react.md} +0 -0
@@ -1,26 +1,22 @@
1
1
  import PbEnhancedElement from '../pb_enhanced_element'
2
- import { computePosition, offset, flip, shift, arrow, autoUpdate } from '@floating-ui/dom'
3
-
4
- const TOOLTIP_OFFSET = 20
2
+ import {
3
+ createPopperLite as createPopper,
4
+ flip,
5
+ offset,
6
+ preventOverflow,
7
+ } from '@popperjs/core'
8
+
9
+ const TOOLTIP_OFFSET = [0, 20]
5
10
  const TOOLTIP_TIMEOUT = 250
6
- const SAFE_ZONE_MARGIN = 1
7
11
 
8
- export default class PbTooltipFloatingUi extends PbEnhancedElement {
12
+ export default class PbTooltip extends PbEnhancedElement {
9
13
  static get selector() {
10
- return '[data-pb-tooltip-kit]'
14
+ return '[data-pb-tooltip-kit="true"][data-pb-tooltip-interaction="false"]:not([data-pb-tooltip-delay-open]):not([data-pb-tooltip-delay-close])'
11
15
  }
12
16
 
13
17
  connect() {
14
- if (this.tooltipInteraction) {
15
- document.addEventListener('mousemove', (e) => {
16
- this.lastMouseX = e.clientX
17
- this.lastMouseY = e.clientY
18
- })
19
- }
20
-
21
18
  this.triggerElements.forEach((trigger) => {
22
19
  const method = this.triggerMethod
23
- const interactionEnabled = this.tooltipInteraction
24
20
 
25
21
  if (method === 'click') {
26
22
  trigger.addEventListener('click', () => {
@@ -28,66 +24,29 @@ export default class PbTooltipFloatingUi extends PbEnhancedElement {
28
24
  })
29
25
  } else {
30
26
  trigger.addEventListener('mouseenter', () => {
31
- clearSafeZoneListener(this)
32
- clearTimeout(this.mouseleaveTimeout)
33
- this.currentTrigger = trigger
34
- const delayOpen = this.delayOpen ? parseInt(this.delayOpen) : TOOLTIP_TIMEOUT
35
27
  this.mouseenterTimeout = setTimeout(() => {
36
28
  this.showTooltip(trigger)
37
- if (interactionEnabled) {
38
- this.checkCloseTooltip(trigger)
39
- }
40
- }, delayOpen)
41
- })
29
+ this.checkCloseTooltip(trigger)
30
+ }, TOOLTIP_TIMEOUT)
42
31
 
43
- trigger.addEventListener('mouseleave', () => {
44
- clearTimeout(this.mouseenterTimeout)
45
- if (this.delayClose) {
46
- const delayClose = parseInt(this.delayClose)
47
- this.mouseleaveTimeout = setTimeout(() => {
48
- if (interactionEnabled) {
49
- this.attachSafeZoneListener()
50
- } else {
51
- this.hideTooltip()
52
- }
53
- }, delayClose)
54
- } else {
55
- if (interactionEnabled) {
56
- this.attachSafeZoneListener()
57
- } else {
32
+ trigger.addEventListener('mouseleave', () => {
33
+ clearTimeout(this.mouseenterTimeout)
34
+ setTimeout(() => {
58
35
  this.hideTooltip()
59
- }
60
- }
36
+ }, 0)
37
+ }, { once: true })
61
38
  })
62
39
 
63
- if (interactionEnabled) {
64
- this.tooltip.addEventListener('mouseenter', () => {
65
- clearSafeZoneListener(this)
66
- })
67
-
68
- this.tooltip.addEventListener('mouseleave', () => {
69
- this.attachSafeZoneListener()
70
- })
71
- }
40
+ this.tooltip.addEventListener('mouseenter', () => {
41
+ clearTimeout(this.mouseenterTimeout)
42
+ })
43
+ this.tooltip.addEventListener('mouseleave', () => {
44
+ this.hideTooltip()
45
+ })
72
46
  }
73
47
  })
74
48
  }
75
49
 
76
- attachSafeZoneListener() {
77
- clearSafeZoneListener(this)
78
- this.safeZoneHandler = (e) => {
79
- if (!this.currentTrigger) return
80
- const triggerRect = this.currentTrigger.getBoundingClientRect()
81
- const tooltipRect = this.tooltip.getBoundingClientRect()
82
- const safeRect = getSafeZone(triggerRect, tooltipRect, this.position, SAFE_ZONE_MARGIN)
83
- if (!isPointInsideRect(e.clientX, e.clientY, safeRect)) {
84
- this.hideTooltip()
85
- clearSafeZoneListener(this)
86
- }
87
- }
88
- document.addEventListener('mousemove', this.safeZoneHandler)
89
- }
90
-
91
50
  checkCloseTooltip(trigger) {
92
51
  document.querySelector('body').addEventListener('click', ({ target }) => {
93
52
  const isTooltip = target.closest(`#${this.tooltipId}`) === this.tooltip
@@ -103,46 +62,27 @@ export default class PbTooltipFloatingUi extends PbEnhancedElement {
103
62
  showTooltip(trigger) {
104
63
  if (this.shouldShowTooltip === 'false') return
105
64
 
106
- clearSafeZoneListener(this)
107
-
108
- this.tooltip.style.opacity = '1'
109
- this.tooltip.style.visibility = 'visible'
110
- this.tooltip.style.pointerEvents = 'auto'
111
-
112
- if (this.cleanup) {
113
- this.cleanup()
114
- }
115
-
116
- const arrowElement = document.querySelector(`#${this.tooltipId}-arrow`)
117
-
118
- this.cleanup = autoUpdate(trigger, this.tooltip, () => {
119
- computePosition(trigger, this.tooltip, {
120
- placement: this.position,
121
- strategy: 'fixed',
122
- middleware: [
123
- offset({ mainAxis: TOOLTIP_OFFSET, crossAxis: 0 }),
124
- flip(),
125
- shift(),
126
- arrow({ element: arrowElement })
127
- ],
128
- }).then(({ x, y, placement, middlewareData }) => {
129
- Object.assign(this.tooltip.style, {
130
- left: `${x}px`,
131
- top: `${y}px`,
132
- position: 'fixed'
133
- })
134
- this.tooltip.setAttribute('data-popper-placement', placement)
135
- if (arrowElement && middlewareData.arrow) {
136
- const { x: arrowX, y: arrowY } = middlewareData.arrow
137
- Object.assign(arrowElement.style, {
138
- left: arrowX != null ? `${arrowX}px` : '',
139
- top: arrowY != null ? `${arrowY}px` : '',
140
- position: 'absolute'
141
- })
142
- }
143
- })
65
+ this.popper = createPopper(trigger, this.tooltip, {
66
+ placement: this.position,
67
+ strategy: 'fixed',
68
+ modifiers: [
69
+ {
70
+ name: 'offset',
71
+ options: {
72
+ offset: TOOLTIP_OFFSET,
73
+ },
74
+ },
75
+ {
76
+ name: 'arrow',
77
+ options: {
78
+ element: document.querySelector(`#${this.tooltipId}-arrow`),
79
+ },
80
+ },
81
+ offset,
82
+ preventOverflow,
83
+ flip,
84
+ ],
144
85
  })
145
-
146
86
  this.tooltip.classList.add('show')
147
87
 
148
88
  if (this.triggerMethod === 'click') {
@@ -154,50 +94,39 @@ export default class PbTooltipFloatingUi extends PbEnhancedElement {
154
94
  }
155
95
 
156
96
  hideTooltip() {
157
- if (!this.tooltip) return
158
-
159
97
  this.tooltip.classList.add('fade_out')
160
98
  setTimeout(() => {
161
- if (this.cleanup) {
162
- this.cleanup()
163
- this.cleanup = null
164
- }
99
+ if (!this.popper) return
100
+ this.popper.destroy()
165
101
  this.tooltip.classList.remove('show')
166
102
  this.tooltip.classList.remove('fade_out')
167
- this.tooltip.style.opacity = '0'
168
- this.tooltip.style.visibility = 'hidden'
169
- this.tooltip.style.pointerEvents = 'none'
170
- this.tooltip.style.position = ''
171
- this.tooltip.style.top = ''
172
- this.tooltip.style.left = ''
173
- this.tooltip.style.transform = ''
174
103
  }, TOOLTIP_TIMEOUT)
175
104
  }
176
105
 
177
106
  get triggerElements() {
178
107
  let triggerEl
108
+
179
109
  if (this.triggerElementId) {
180
110
  triggerEl = document.querySelector(`#${this.triggerElementId}`)
181
- } else if (this.triggerElementSelector) {
111
+ } else {
182
112
  const selectorIsId = this.triggerElementSelector.indexOf('#') > -1
183
113
  triggerEl = selectorIsId
184
- ? document.querySelector(this.triggerElementSelector)
185
- : document.querySelectorAll(this.triggerElementSelector)
186
- } else {
187
- triggerEl = this.element
114
+ ? document.querySelector(`${this.triggerElementSelector}`)
115
+ : document.querySelectorAll(`${this.triggerElementSelector}`)
188
116
  }
117
+
189
118
  if (!triggerEl) {
190
- console.error('Tooltip Kit: No valid trigger element found!')
119
+ console.error('Tooltip Kit: an invalid or unavailable DOM reference was provided!')
191
120
  return []
192
121
  }
193
- if (triggerEl.length === undefined) {
194
- triggerEl = [triggerEl]
195
- }
196
- return triggerEl
122
+
123
+ if (!triggerEl.length) triggerEl = [triggerEl]
124
+ return (this._triggerElements = this._triggerElements || triggerEl)
197
125
  }
198
126
 
199
127
  get tooltip() {
200
- return (this._tooltip = this._tooltip || this.element.querySelector(`#${this.tooltipId}`))
128
+ return (this._tooltip =
129
+ this._tooltip || this.element.querySelector(`#${this.tooltipId}`))
201
130
  }
202
131
 
203
132
  get position() {
@@ -223,60 +152,4 @@ export default class PbTooltipFloatingUi extends PbEnhancedElement {
223
152
  get triggerMethod() {
224
153
  return this.element.dataset.pbTooltipTriggerMethod || 'hover'
225
154
  }
226
-
227
- get tooltipInteraction() {
228
- return this.element.dataset.pbTooltipInteraction === 'true'
229
- }
230
-
231
- get delayOpen() {
232
- return this.element.dataset.pbTooltipDelayOpen
233
- }
234
-
235
- get delayClose() {
236
- return this.element.dataset.pbTooltipDelayClose
237
- }
238
- }
239
-
240
- function clearSafeZoneListener(context) {
241
- if (context.safeZoneHandler) {
242
- document.removeEventListener('mousemove', context.safeZoneHandler)
243
- context.safeZoneHandler = null
244
- }
245
- }
246
-
247
- function getSafeZone(triggerRect, tooltipRect, placement, margin) {
248
- let safeRect = {}
249
- if (placement.startsWith('top')) {
250
- safeRect.left = triggerRect.left - margin
251
- safeRect.right = triggerRect.right + margin
252
- safeRect.top = tooltipRect.bottom - margin
253
- safeRect.bottom = triggerRect.top + margin
254
- } else if (placement.startsWith('bottom')) {
255
- safeRect.left = triggerRect.left - margin
256
- safeRect.right = triggerRect.right + margin
257
- safeRect.top = triggerRect.bottom - margin
258
- safeRect.bottom = tooltipRect.top + margin
259
- } else if (placement.startsWith('left')) {
260
- safeRect.top = triggerRect.top - margin
261
- safeRect.bottom = triggerRect.bottom + margin
262
- safeRect.left = tooltipRect.right - margin
263
- safeRect.right = triggerRect.left + margin
264
- } else if (placement.startsWith('right')) {
265
- safeRect.top = triggerRect.top - margin
266
- safeRect.bottom = triggerRect.bottom + margin
267
- safeRect.left = triggerRect.right - margin
268
- safeRect.right = tooltipRect.left + margin
269
- } else {
270
- safeRect = {
271
- left: triggerRect.left - margin,
272
- right: triggerRect.right + margin,
273
- top: triggerRect.top - margin,
274
- bottom: triggerRect.bottom + margin,
275
- }
276
- }
277
- return safeRect
278
- }
279
-
280
- function isPointInsideRect(x, y, rect) {
281
- return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom
282
- }
155
+ }