@budibase/bbui 3.24.0 → 3.24.1
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.mjs +106 -105
- package/dist/{easymde-BZCUdDp3.mjs → easymde-DHE3DJ3y.mjs} +1 -1
- package/dist/{index-BaHAAxDX.mjs → index-BI9c21WY.mjs} +2894 -2812
- package/package.json +2 -2
- package/src/Form/CollapsibleSearch.svelte +128 -0
- package/src/Form/Core/Picker.svelte +4 -1
- package/src/Form/Core/Search.svelte +12 -2
- package/src/Form/Core/Select.svelte +2 -0
- package/src/Form/Search.svelte +1 -0
- package/src/Form/Select.svelte +2 -0
- package/src/Typography/Body.svelte +0 -1
- package/src/index.ts +1 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/bbui",
|
|
3
3
|
"description": "A UI solution used in the different Budibase projects.",
|
|
4
|
-
"version": "3.24.
|
|
4
|
+
"version": "3.24.1",
|
|
5
5
|
"license": "MPL-2.0",
|
|
6
6
|
"module": "dist/bbui.mjs",
|
|
7
7
|
"exports": {
|
|
@@ -107,5 +107,5 @@
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
},
|
|
110
|
-
"gitHead": "
|
|
110
|
+
"gitHead": "6838c955ce1adef31581d699de2c9a6c81d37de5"
|
|
111
111
|
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { createEventDispatcher, tick } from "svelte"
|
|
3
|
+
import Icon from "../Icon/Icon.svelte"
|
|
4
|
+
import Search from "./Search.svelte"
|
|
5
|
+
|
|
6
|
+
export let value: string | undefined = undefined
|
|
7
|
+
export let placeholder: string | undefined = undefined
|
|
8
|
+
export let disabled = false
|
|
9
|
+
export let quiet = false
|
|
10
|
+
export let updateOnChange = true
|
|
11
|
+
export let width: string = "220px"
|
|
12
|
+
export let open = false
|
|
13
|
+
export let collapseOnBlur = true
|
|
14
|
+
export let inputRef: HTMLInputElement | undefined = undefined
|
|
15
|
+
|
|
16
|
+
const dispatch = createEventDispatcher()
|
|
17
|
+
|
|
18
|
+
const handleChange = (event: CustomEvent<string>) => {
|
|
19
|
+
value = event.detail
|
|
20
|
+
dispatch("change", event.detail)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const handleClear = () => {
|
|
24
|
+
open = false
|
|
25
|
+
dispatch("clear")
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const openSearch = async () => {
|
|
29
|
+
if (disabled) {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
open = true
|
|
33
|
+
await tick()
|
|
34
|
+
inputRef?.focus()
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const handleBlur = (event: FocusEvent) => {
|
|
38
|
+
if (collapseOnBlur) {
|
|
39
|
+
const inputValue = (event.target as HTMLInputElement | null)?.value || ""
|
|
40
|
+
if (!inputValue.trim()) {
|
|
41
|
+
open = false
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
dispatch("blur", event)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const forwardEvent = (event: Event) => {
|
|
48
|
+
dispatch(event.type, event)
|
|
49
|
+
}
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<div class="collapsible-search" style={`--collapsible-search-width: ${width}`}>
|
|
53
|
+
{#if !open}
|
|
54
|
+
<button
|
|
55
|
+
class="search-toggle"
|
|
56
|
+
type="button"
|
|
57
|
+
on:click={openSearch}
|
|
58
|
+
aria-label="Open search"
|
|
59
|
+
>
|
|
60
|
+
<Icon name="magnifying-glass" size="S" />
|
|
61
|
+
</button>
|
|
62
|
+
{/if}
|
|
63
|
+
<div class="collapsible-search-input" class:open>
|
|
64
|
+
<Search
|
|
65
|
+
{updateOnChange}
|
|
66
|
+
{disabled}
|
|
67
|
+
{placeholder}
|
|
68
|
+
{quiet}
|
|
69
|
+
{value}
|
|
70
|
+
bind:inputRef
|
|
71
|
+
on:change={handleChange}
|
|
72
|
+
on:clear={handleClear}
|
|
73
|
+
on:blur={handleBlur}
|
|
74
|
+
on:focus={forwardEvent}
|
|
75
|
+
on:input={forwardEvent}
|
|
76
|
+
on:click={forwardEvent}
|
|
77
|
+
/>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<style>
|
|
82
|
+
.collapsible-search {
|
|
83
|
+
display: flex;
|
|
84
|
+
align-items: center;
|
|
85
|
+
gap: var(--spacing-xs);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.collapsible-search-input {
|
|
89
|
+
width: 0;
|
|
90
|
+
opacity: 0;
|
|
91
|
+
overflow: hidden;
|
|
92
|
+
pointer-events: none;
|
|
93
|
+
visibility: hidden;
|
|
94
|
+
transition:
|
|
95
|
+
width 200ms ease,
|
|
96
|
+
opacity 200ms ease;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.collapsible-search-input.open {
|
|
100
|
+
width: var(--collapsible-search-width);
|
|
101
|
+
opacity: 1;
|
|
102
|
+
overflow: visible;
|
|
103
|
+
pointer-events: auto;
|
|
104
|
+
visibility: visible;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.search-toggle {
|
|
108
|
+
display: inline-flex;
|
|
109
|
+
align-items: center;
|
|
110
|
+
justify-content: center;
|
|
111
|
+
width: 32px;
|
|
112
|
+
height: 32px;
|
|
113
|
+
border-radius: 6px;
|
|
114
|
+
border: 1px solid var(--spectrum-global-color-gray-200);
|
|
115
|
+
background-color: var(--spectrum-global-color-gray-100);
|
|
116
|
+
color: var(--spectrum-global-color-gray-800);
|
|
117
|
+
cursor: pointer;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.search-toggle:hover {
|
|
121
|
+
background-color: var(--spectrum-global-color-gray-300);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.search-toggle:focus {
|
|
125
|
+
outline: 2px solid var(--spectrum-global-color-blue-400);
|
|
126
|
+
outline-offset: 2px;
|
|
127
|
+
}
|
|
128
|
+
</style>
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
import type { PickerIconInput, ResolvedIcon } from "../../types/Picker"
|
|
23
23
|
|
|
24
24
|
export let id: string | undefined = undefined
|
|
25
|
+
export let size: "S" | "M" | "L" = "M"
|
|
25
26
|
export let disabled: boolean = false
|
|
26
27
|
export let fieldText: string = ""
|
|
27
28
|
export let fieldIcon: PickerIconInput = undefined
|
|
@@ -223,7 +224,7 @@
|
|
|
223
224
|
|
|
224
225
|
<button
|
|
225
226
|
{id}
|
|
226
|
-
class="spectrum-Picker spectrum-Picker--
|
|
227
|
+
class="spectrum-Picker spectrum-Picker--size{size}"
|
|
227
228
|
class:spectrum-Picker--quiet={quiet}
|
|
228
229
|
{disabled}
|
|
229
230
|
class:is-open={open}
|
|
@@ -419,6 +420,8 @@
|
|
|
419
420
|
.spectrum-Picker {
|
|
420
421
|
width: 100%;
|
|
421
422
|
box-shadow: none;
|
|
423
|
+
border: 1px solid var(--spectrum-global-color-gray-200);
|
|
424
|
+
border-radius: 6px;
|
|
422
425
|
}
|
|
423
426
|
.spectrum-Picker-label.auto-width {
|
|
424
427
|
margin-right: var(--spacing-xs);
|
|
@@ -11,13 +11,23 @@
|
|
|
11
11
|
export let quiet = false
|
|
12
12
|
export let inputRef: HTMLElement | undefined = undefined
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
interface SearchEvents {
|
|
15
|
+
change: any
|
|
16
|
+
clear: void
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const dispatch = createEventDispatcher<SearchEvents>()
|
|
15
20
|
let focus = false
|
|
16
21
|
|
|
17
22
|
const updateValue = (value: any) => {
|
|
18
23
|
dispatch("change", value)
|
|
19
24
|
}
|
|
20
25
|
|
|
26
|
+
const clearValue = () => {
|
|
27
|
+
updateValue("")
|
|
28
|
+
dispatch("clear")
|
|
29
|
+
}
|
|
30
|
+
|
|
21
31
|
const onFocus = () => {
|
|
22
32
|
focus = true
|
|
23
33
|
}
|
|
@@ -71,7 +81,7 @@
|
|
|
71
81
|
/>
|
|
72
82
|
</div>
|
|
73
83
|
<button
|
|
74
|
-
on:click={
|
|
84
|
+
on:click={clearValue}
|
|
75
85
|
type="reset"
|
|
76
86
|
class="spectrum-ClearButton spectrum-Search-clearButton"
|
|
77
87
|
>
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
| ((_option: O, _index?: number) => string)
|
|
31
31
|
| undefined = undefined
|
|
32
32
|
export let readonly: boolean = false
|
|
33
|
+
export let size: "S" | "M" | "L" = "M"
|
|
33
34
|
export let quiet: boolean = false
|
|
34
35
|
export let autoWidth: boolean = false
|
|
35
36
|
export let autocomplete: boolean = false
|
|
@@ -98,6 +99,7 @@
|
|
|
98
99
|
bind:open
|
|
99
100
|
bind:searchTerm
|
|
100
101
|
on:loadMore
|
|
102
|
+
{size}
|
|
101
103
|
{quiet}
|
|
102
104
|
{id}
|
|
103
105
|
{disabled}
|
package/src/Form/Search.svelte
CHANGED
package/src/Form/Select.svelte
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
| ((_option: O, _index?: number) => boolean)
|
|
29
29
|
| undefined = undefined
|
|
30
30
|
export let quiet: boolean = false
|
|
31
|
+
export let size: "S" | "M" | "L" = "M"
|
|
31
32
|
export let autoWidth: boolean = false
|
|
32
33
|
export let sort: boolean = false
|
|
33
34
|
export let tooltip: string | undefined = undefined
|
|
@@ -62,6 +63,7 @@
|
|
|
62
63
|
|
|
63
64
|
<Field {helpText} {label} {labelPosition} {error} {tooltip}>
|
|
64
65
|
<Select
|
|
66
|
+
{size}
|
|
65
67
|
{quiet}
|
|
66
68
|
{loading}
|
|
67
69
|
{disabled}
|
package/src/index.ts
CHANGED
|
@@ -12,6 +12,7 @@ export { default as Dropzone } from "./Form/Dropzone.svelte"
|
|
|
12
12
|
export { default as EnvDropdown } from "./Form/EnvDropdown.svelte"
|
|
13
13
|
export { default as FieldLabel } from "./Form/FieldLabel.svelte"
|
|
14
14
|
export { default as File } from "./Form/File.svelte"
|
|
15
|
+
export { default as CollapsibleSearch } from "./Form/CollapsibleSearch.svelte"
|
|
15
16
|
export { default as Input } from "./Form/Input.svelte"
|
|
16
17
|
export { default as InputDropdown } from "./Form/InputDropdown.svelte"
|
|
17
18
|
export { default as Multiselect } from "./Form/Multiselect.svelte"
|