@rip-lang/ui 0.3.19 → 0.3.21
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.
- package/README.md +443 -576
- package/accordion.rip +113 -0
- package/alert-dialog.rip +96 -0
- package/autocomplete.rip +141 -0
- package/avatar.rip +37 -0
- package/badge.rip +15 -0
- package/breadcrumb.rip +46 -0
- package/button-group.rip +26 -0
- package/button.rip +23 -0
- package/card.rip +25 -0
- package/carousel.rip +110 -0
- package/checkbox-group.rip +65 -0
- package/checkbox.rip +33 -0
- package/collapsible.rip +50 -0
- package/combobox.rip +155 -0
- package/context-menu.rip +105 -0
- package/date-picker.rip +214 -0
- package/dialog.rip +107 -0
- package/drawer.rip +79 -0
- package/editable-value.rip +80 -0
- package/field.rip +53 -0
- package/fieldset.rip +22 -0
- package/form.rip +39 -0
- package/grid.rip +901 -0
- package/index.rip +16 -0
- package/input-group.rip +28 -0
- package/input.rip +36 -0
- package/label.rip +16 -0
- package/menu.rip +162 -0
- package/menubar.rip +155 -0
- package/meter.rip +36 -0
- package/multi-select.rip +158 -0
- package/native-select.rip +32 -0
- package/nav-menu.rip +129 -0
- package/number-field.rip +162 -0
- package/otp-field.rip +89 -0
- package/package.json +18 -27
- package/pagination.rip +123 -0
- package/popover.rip +143 -0
- package/preview-card.rip +73 -0
- package/progress.rip +25 -0
- package/radio-group.rip +67 -0
- package/resizable.rip +123 -0
- package/scroll-area.rip +145 -0
- package/select.rip +184 -0
- package/separator.rip +17 -0
- package/skeleton.rip +22 -0
- package/slider.rip +165 -0
- package/spinner.rip +17 -0
- package/table.rip +27 -0
- package/tabs.rip +124 -0
- package/textarea.rip +48 -0
- package/toast.rip +87 -0
- package/toggle-group.rip +78 -0
- package/toggle.rip +24 -0
- package/toolbar.rip +46 -0
- package/tooltip.rip +115 -0
- package/dist/rip-ui.min.js +0 -524
- package/dist/rip-ui.min.js.br +0 -0
- package/serve.rip +0 -92
- package/ui.rip +0 -964
package/tooltip.rip
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Tooltip — accessible headless tooltip with delay and positioning
|
|
2
|
+
#
|
|
3
|
+
# Shows on hover/focus with configurable delay. Uses aria-describedby.
|
|
4
|
+
# Exposes $open, $entering, $exiting. Ships zero CSS.
|
|
5
|
+
#
|
|
6
|
+
# Usage:
|
|
7
|
+
# Tooltip text: "Helpful info", placement: "top"
|
|
8
|
+
# button "Hover me"
|
|
9
|
+
|
|
10
|
+
lastCloseTime = 0
|
|
11
|
+
GROUP_TIMEOUT = 400
|
|
12
|
+
|
|
13
|
+
export Tooltip = component
|
|
14
|
+
@text := ''
|
|
15
|
+
@placement := 'top'
|
|
16
|
+
@delay := 300
|
|
17
|
+
@offset := 6
|
|
18
|
+
@hoverable := false
|
|
19
|
+
|
|
20
|
+
open := false
|
|
21
|
+
entering := false
|
|
22
|
+
exiting := false
|
|
23
|
+
_showTimer := null
|
|
24
|
+
_hideTimer := null
|
|
25
|
+
_id =! "tip-#{Math.random().toString(36).slice(2, 8)}"
|
|
26
|
+
|
|
27
|
+
show: ->
|
|
28
|
+
clearTimeout _hideTimer if _hideTimer
|
|
29
|
+
delay = if (Date.now() - lastCloseTime) < GROUP_TIMEOUT then 0 else @delay
|
|
30
|
+
_showTimer = setTimeout =>
|
|
31
|
+
open = true
|
|
32
|
+
entering = true
|
|
33
|
+
setTimeout =>
|
|
34
|
+
entering = false
|
|
35
|
+
@_position()
|
|
36
|
+
, 0
|
|
37
|
+
, delay
|
|
38
|
+
|
|
39
|
+
hide: ->
|
|
40
|
+
clearTimeout _showTimer if _showTimer
|
|
41
|
+
exiting = true
|
|
42
|
+
_hideTimer = setTimeout =>
|
|
43
|
+
open = false
|
|
44
|
+
exiting = false
|
|
45
|
+
lastCloseTime = Date.now()
|
|
46
|
+
, 150
|
|
47
|
+
|
|
48
|
+
_cancelHide: ->
|
|
49
|
+
clearTimeout _hideTimer if _hideTimer
|
|
50
|
+
exiting = false
|
|
51
|
+
|
|
52
|
+
_position: ->
|
|
53
|
+
return unless @_trigger and @_tip
|
|
54
|
+
tr = @_trigger.getBoundingClientRect()
|
|
55
|
+
fl = @_tip.getBoundingClientRect()
|
|
56
|
+
[side, align] = @placement.split('-')
|
|
57
|
+
align ?= 'center'
|
|
58
|
+
gap = @offset
|
|
59
|
+
|
|
60
|
+
x = switch side
|
|
61
|
+
when 'bottom', 'top'
|
|
62
|
+
switch align
|
|
63
|
+
when 'start' then tr.left
|
|
64
|
+
when 'end' then tr.right - fl.width
|
|
65
|
+
else tr.left + (tr.width - fl.width) / 2
|
|
66
|
+
when 'right' then tr.right + gap
|
|
67
|
+
when 'left' then tr.left - fl.width - gap
|
|
68
|
+
|
|
69
|
+
y = switch side
|
|
70
|
+
when 'bottom' then tr.bottom + gap
|
|
71
|
+
when 'top' then tr.top - fl.height - gap
|
|
72
|
+
when 'left', 'right'
|
|
73
|
+
switch align
|
|
74
|
+
when 'start' then tr.top
|
|
75
|
+
when 'end' then tr.bottom - fl.height
|
|
76
|
+
else tr.top + (tr.height - fl.height) / 2
|
|
77
|
+
|
|
78
|
+
if side is 'bottom' and y + fl.height > window.innerHeight
|
|
79
|
+
y = tr.top - fl.height - gap
|
|
80
|
+
if side is 'top' and y < 0
|
|
81
|
+
y = tr.bottom + gap
|
|
82
|
+
if side is 'right' and x + fl.width > window.innerWidth
|
|
83
|
+
x = tr.left - fl.width - gap
|
|
84
|
+
if side is 'left' and x < 0
|
|
85
|
+
x = tr.right + gap
|
|
86
|
+
|
|
87
|
+
x = Math.max(4, Math.min(x, window.innerWidth - fl.width - 4))
|
|
88
|
+
|
|
89
|
+
@_tip.style.position = 'fixed'
|
|
90
|
+
@_tip.style.left = "#{x}px"
|
|
91
|
+
@_tip.style.top = "#{y}px"
|
|
92
|
+
|
|
93
|
+
beforeUnmount: ->
|
|
94
|
+
clearTimeout _showTimer if _showTimer
|
|
95
|
+
clearTimeout _hideTimer if _hideTimer
|
|
96
|
+
|
|
97
|
+
render
|
|
98
|
+
.
|
|
99
|
+
div ref: "_trigger"
|
|
100
|
+
aria-describedby: open ? _id : undefined
|
|
101
|
+
@mouseenter: @show
|
|
102
|
+
@mouseleave: @hide
|
|
103
|
+
@focusin: @show
|
|
104
|
+
@focusout: @hide
|
|
105
|
+
slot
|
|
106
|
+
|
|
107
|
+
if open
|
|
108
|
+
div ref: "_tip", id: _id, role: "tooltip", style: "position:fixed"
|
|
109
|
+
$open: true
|
|
110
|
+
$entering: entering?!
|
|
111
|
+
$exiting: exiting?!
|
|
112
|
+
$placement: @placement
|
|
113
|
+
@mouseenter: (=> @_cancelHide() if @hoverable)
|
|
114
|
+
@mouseleave: (=> @hide() if @hoverable)
|
|
115
|
+
@text
|