@budibase/bbui 2.8.29 → 2.8.31-alpha.0

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.
@@ -0,0 +1,157 @@
1
+ <script context="module">
2
+ export const TooltipPosition = {
3
+ Top: "top",
4
+ Right: "right",
5
+ Bottom: "bottom",
6
+ Left: "left",
7
+ }
8
+ export const TooltipType = {
9
+ Default: "default",
10
+ Info: "info",
11
+ Positive: "positive",
12
+ Negative: "negative",
13
+ }
14
+ </script>
15
+
16
+ <script>
17
+ import Portal from "svelte-portal"
18
+ import { fade } from "svelte/transition"
19
+ import "@spectrum-css/tooltip/dist/index-vars.css"
20
+ import { onDestroy } from "svelte"
21
+
22
+ export let position = TooltipPosition.Top
23
+ export let type = TooltipType.Default
24
+ export let text = ""
25
+ export let fixed = false
26
+ export let color = null
27
+
28
+ let wrapper
29
+ let hovered = false
30
+ let left
31
+ let top
32
+ let visible = false
33
+ let timeout
34
+ let interval
35
+
36
+ $: {
37
+ if (hovered || fixed) {
38
+ // Debounce showing by 200ms to avoid flashing tooltip
39
+ timeout = setTimeout(show, 200)
40
+ } else {
41
+ hide()
42
+ }
43
+ }
44
+ $: tooltipStyle = color ? `background:${color};` : null
45
+ $: tipStyle = color ? `border-top-color:${color};` : null
46
+
47
+ // Computes the position of the tooltip
48
+ const updateTooltipPosition = () => {
49
+ const node = wrapper?.children?.[0]
50
+ if (!node) {
51
+ left = null
52
+ top = null
53
+ return
54
+ }
55
+ const bounds = node.getBoundingClientRect()
56
+
57
+ // Determine where to render tooltip based on position prop
58
+ if (position === TooltipPosition.Top) {
59
+ left = bounds.left + bounds.width / 2
60
+ top = bounds.top
61
+ } else if (position === TooltipPosition.Right) {
62
+ left = bounds.left + bounds.width
63
+ top = bounds.top + bounds.height / 2
64
+ } else if (position === TooltipPosition.Bottom) {
65
+ left = bounds.left + bounds.width / 2
66
+ top = bounds.top + bounds.height
67
+ } else if (position === TooltipPosition.Left) {
68
+ left = bounds.left
69
+ top = bounds.top + bounds.height / 2
70
+ }
71
+ }
72
+
73
+ // Computes the position of the tooltip then shows it.
74
+ // We set up a poll to frequently update the position of the tooltip in case
75
+ // the target moves.
76
+ const show = () => {
77
+ updateTooltipPosition()
78
+ interval = setInterval(updateTooltipPosition, 100)
79
+ visible = true
80
+ }
81
+
82
+ // Hides the tooltip
83
+ const hide = () => {
84
+ clearTimeout(timeout)
85
+ clearInterval(interval)
86
+ visible = false
87
+ }
88
+
89
+ // Ensure we clean up interval and timeout
90
+ onDestroy(hide)
91
+ </script>
92
+
93
+ <div
94
+ bind:this={wrapper}
95
+ class="abs-tooltip"
96
+ on:focus={null}
97
+ on:mouseover={() => (hovered = true)}
98
+ on:mouseleave={() => (hovered = false)}
99
+ >
100
+ <slot />
101
+ </div>
102
+
103
+ {#if visible && text && left != null && top != null}
104
+ <Portal target=".spectrum">
105
+ <span
106
+ class="spectrum-Tooltip spectrum-Tooltip--{type} spectrum-Tooltip--{position} is-open"
107
+ style={`left:${left}px;top:${top}px;${tooltipStyle}`}
108
+ transition:fade|local={{ duration: 130 }}
109
+ >
110
+ <span class="spectrum-Tooltip-label">{text}</span>
111
+ <span class="spectrum-Tooltip-tip" style={tipStyle} />
112
+ </span>
113
+ </Portal>
114
+ {/if}
115
+
116
+ <style>
117
+ .abs-tooltip {
118
+ display: contents;
119
+ }
120
+ .spectrum-Tooltip {
121
+ position: absolute;
122
+ z-index: 9999;
123
+ pointer-events: none;
124
+ margin: 0;
125
+ max-width: 280px;
126
+ transition: top 130ms ease-out, left 130ms ease-out;
127
+ }
128
+ .spectrum-Tooltip-label {
129
+ text-overflow: ellipsis;
130
+ white-space: nowrap;
131
+ overflow: hidden;
132
+ font-size: 12px;
133
+ font-weight: 600;
134
+ }
135
+
136
+ /* Colour overrides for default type */
137
+ .spectrum-Tooltip--default {
138
+ background: var(--spectrum-global-color-gray-500);
139
+ }
140
+ .spectrum-Tooltip--default .spectrum-Tooltip-tip {
141
+ border-top-color: var(--spectrum-global-color-gray-500);
142
+ }
143
+
144
+ /* Position styles */
145
+ .spectrum-Tooltip--top {
146
+ transform: translateX(-50%) translateY(calc(-100% - 8px));
147
+ }
148
+ .spectrum-Tooltip--right {
149
+ transform: translateX(8px) translateY(-50%);
150
+ }
151
+ .spectrum-Tooltip--bottom {
152
+ transform: translateX(-50%) translateY(8px);
153
+ }
154
+ .spectrum-Tooltip--left {
155
+ transform: translateX(calc(-100% - 8px)) translateY(-50%);
156
+ }
157
+ </style>
@@ -0,0 +1,39 @@
1
+ <script>
2
+ import AbsTooltip from "./AbsTooltip.svelte"
3
+ import { onDestroy } from "svelte"
4
+
5
+ export let text = null
6
+ export let condition = true
7
+ export let duration = 3000
8
+ export let position
9
+ export let type
10
+
11
+ let visible = false
12
+ let timeout
13
+
14
+ $: {
15
+ if (condition) {
16
+ showTooltip()
17
+ } else {
18
+ hideTooltip()
19
+ }
20
+ }
21
+
22
+ const showTooltip = () => {
23
+ visible = true
24
+ timeout = setTimeout(() => {
25
+ visible = false
26
+ }, duration)
27
+ }
28
+
29
+ const hideTooltip = () => {
30
+ visible = false
31
+ clearTimeout(timeout)
32
+ }
33
+
34
+ onDestroy(hideTooltip)
35
+ </script>
36
+
37
+ <AbsTooltip {position} {type} text={visible ? text : null} fixed={visible}>
38
+ <slot />
39
+ </AbsTooltip>
package/src/index.js CHANGED
@@ -36,13 +36,19 @@ export { default as Layout } from "./Layout/Layout.svelte"
36
36
  export { default as Page } from "./Layout/Page.svelte"
37
37
  export { default as Link } from "./Link/Link.svelte"
38
38
  export { default as Tooltip } from "./Tooltip/Tooltip.svelte"
39
+ export { default as TempTooltip } from "./Tooltip/TempTooltip.svelte"
40
+ export {
41
+ default as AbsTooltip,
42
+ TooltipPosition,
43
+ TooltipType,
44
+ } from "./Tooltip/AbsTooltip.svelte"
39
45
  export { default as TooltipWrapper } from "./Tooltip/TooltipWrapper.svelte"
40
46
  export { default as Menu } from "./Menu/Menu.svelte"
41
47
  export { default as MenuSection } from "./Menu/Section.svelte"
42
48
  export { default as MenuSeparator } from "./Menu/Separator.svelte"
43
49
  export { default as MenuItem } from "./Menu/Item.svelte"
44
50
  export { default as Modal } from "./Modal/Modal.svelte"
45
- export { default as ModalContent } from "./Modal/ModalContent.svelte"
51
+ export { default as ModalContent, keepOpen } from "./Modal/ModalContent.svelte"
46
52
  export { default as NotificationDisplay } from "./Notification/NotificationDisplay.svelte"
47
53
  export { default as Notification } from "./Notification/Notification.svelte"
48
54
  export { default as SideNavigation } from "./SideNavigation/Navigation.svelte"
@@ -78,7 +84,7 @@ export { default as IconSideNavItem } from "./IconSideNav/IconSideNavItem.svelte
78
84
  export { default as Slider } from "./Form/Slider.svelte"
79
85
  export { default as Accordion } from "./Accordion/Accordion.svelte"
80
86
  export { default as File } from "./Form/File.svelte"
81
-
87
+ export { default as OptionSelectDnD } from "./OptionSelectDnD/OptionSelectDnD.svelte"
82
88
  // Renderers
83
89
  export { default as BoldRenderer } from "./Table/BoldRenderer.svelte"
84
90
  export { default as CodeRenderer } from "./Table/CodeRenderer.svelte"