@budibase/bbui 3.24.0 → 3.24.2

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/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.0",
4
+ "version": "3.24.2",
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": "7cfa950d39730aa88a1c26c60f8094d6f0b0606d"
110
+ "gitHead": "237b6a0e4013f770eb766e79596e6f52bfcb6ea7"
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--sizeM"
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
- const dispatch = createEventDispatcher()
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={() => updateValue("")}
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}
@@ -30,6 +30,7 @@
30
30
  {quiet}
31
31
  bind:inputRef
32
32
  on:change={onChange}
33
+ on:clear
33
34
  on:click
34
35
  on:input
35
36
  on:focus
@@ -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}
@@ -24,7 +24,6 @@
24
24
  <style>
25
25
  p {
26
26
  text-wrap: pretty;
27
- letter-spacing: -0.01em !important;
28
27
  text-rendering: optimizelegibility;
29
28
  }
30
29
  </style>
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"