@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.
- package/dist/bbui.es.js +3 -3
- package/dist/bbui.es.js.map +1 -1
- package/package.json +8 -5
- package/src/Button/Button.svelte +37 -64
- package/src/FancyForm/FancyButtonRadio.svelte +0 -2
- package/src/Form/Core/CheckboxGroup.svelte +12 -11
- package/src/Form/Core/EnvDropdown.svelte +1 -1
- package/src/IconPicker/IconPicker.svelte +0 -1
- package/src/Link/Link.svelte +46 -2
- package/src/Modal/ModalContent.svelte +7 -3
- package/src/OptionSelectDnD/OptionSelectDnD.svelte +252 -0
- package/src/Popover/Popover.svelte +7 -1
- package/src/Table/CellRenderer.svelte +0 -1
- package/src/Table/Table.svelte +1 -1
- package/src/Tooltip/AbsTooltip.svelte +157 -0
- package/src/Tooltip/TempTooltip.svelte +39 -0
- package/src/index.js +8 -2
|
@@ -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"
|