@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.
Files changed (61) hide show
  1. package/README.md +443 -576
  2. package/accordion.rip +113 -0
  3. package/alert-dialog.rip +96 -0
  4. package/autocomplete.rip +141 -0
  5. package/avatar.rip +37 -0
  6. package/badge.rip +15 -0
  7. package/breadcrumb.rip +46 -0
  8. package/button-group.rip +26 -0
  9. package/button.rip +23 -0
  10. package/card.rip +25 -0
  11. package/carousel.rip +110 -0
  12. package/checkbox-group.rip +65 -0
  13. package/checkbox.rip +33 -0
  14. package/collapsible.rip +50 -0
  15. package/combobox.rip +155 -0
  16. package/context-menu.rip +105 -0
  17. package/date-picker.rip +214 -0
  18. package/dialog.rip +107 -0
  19. package/drawer.rip +79 -0
  20. package/editable-value.rip +80 -0
  21. package/field.rip +53 -0
  22. package/fieldset.rip +22 -0
  23. package/form.rip +39 -0
  24. package/grid.rip +901 -0
  25. package/index.rip +16 -0
  26. package/input-group.rip +28 -0
  27. package/input.rip +36 -0
  28. package/label.rip +16 -0
  29. package/menu.rip +162 -0
  30. package/menubar.rip +155 -0
  31. package/meter.rip +36 -0
  32. package/multi-select.rip +158 -0
  33. package/native-select.rip +32 -0
  34. package/nav-menu.rip +129 -0
  35. package/number-field.rip +162 -0
  36. package/otp-field.rip +89 -0
  37. package/package.json +18 -27
  38. package/pagination.rip +123 -0
  39. package/popover.rip +143 -0
  40. package/preview-card.rip +73 -0
  41. package/progress.rip +25 -0
  42. package/radio-group.rip +67 -0
  43. package/resizable.rip +123 -0
  44. package/scroll-area.rip +145 -0
  45. package/select.rip +184 -0
  46. package/separator.rip +17 -0
  47. package/skeleton.rip +22 -0
  48. package/slider.rip +165 -0
  49. package/spinner.rip +17 -0
  50. package/table.rip +27 -0
  51. package/tabs.rip +124 -0
  52. package/textarea.rip +48 -0
  53. package/toast.rip +87 -0
  54. package/toggle-group.rip +78 -0
  55. package/toggle.rip +24 -0
  56. package/toolbar.rip +46 -0
  57. package/tooltip.rip +115 -0
  58. package/dist/rip-ui.min.js +0 -524
  59. package/dist/rip-ui.min.js.br +0 -0
  60. package/serve.rip +0 -92
  61. 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