@budibase/bbui 0.0.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/LICENSE +375 -0
- package/README.md +42 -0
- package/dist/bbui.es.js +8 -0
- package/dist/bbui.es.js.map +1 -0
- package/package.json +94 -0
- package/src/Accordion/Accordion.svelte +58 -0
- package/src/ActionButton/ActionButton.svelte +132 -0
- package/src/ActionGroup/ActionGroup.svelte +26 -0
- package/src/ActionMenu/ActionMenu.svelte +43 -0
- package/src/Actions/ClickOutside.svench.svx +30 -0
- package/src/Actions/PositionDropdown.svench.svx +81 -0
- package/src/Actions/autoresize_textarea.js +14 -0
- package/src/Actions/click_outside.js +76 -0
- package/src/Actions/position_dropdown.js +116 -0
- package/src/Avatar/Avatar.svelte +63 -0
- package/src/Badge/Badge.svelte +42 -0
- package/src/Banner/Banner.svelte +72 -0
- package/src/Banner/BannerDisplay.svelte +41 -0
- package/src/Button/Button.svelte +118 -0
- package/src/Button/Button.svench +138 -0
- package/src/ButtonGroup/ButtonGroup.svelte +30 -0
- package/src/ClearButton/ClearButton.svelte +19 -0
- package/src/ColorPicker/ColorPicker.svelte +304 -0
- package/src/DetailSummary/DetailSummary.svelte +92 -0
- package/src/Divider/Divider.svelte +28 -0
- package/src/Drawer/Drawer.svelte +113 -0
- package/src/Drawer/Drawer.svench +42 -0
- package/src/Drawer/DrawerContent.svelte +45 -0
- package/src/FancyForm/FancyButton.svelte +30 -0
- package/src/FancyForm/FancyButtonRadio.svelte +70 -0
- package/src/FancyForm/FancyCheckbox.svelte +53 -0
- package/src/FancyForm/FancyField.svelte +126 -0
- package/src/FancyForm/FancyFieldLabel.svelte +25 -0
- package/src/FancyForm/FancyForm.svelte +40 -0
- package/src/FancyForm/FancyInput.svelte +109 -0
- package/src/FancyForm/FancySelect.svelte +147 -0
- package/src/FancyForm/index.js +6 -0
- package/src/Form/Checkbox.svelte +23 -0
- package/src/Form/Combobox.svelte +45 -0
- package/src/Form/Core/Checkbox.svelte +69 -0
- package/src/Form/Core/CheckboxGroup.svelte +68 -0
- package/src/Form/Core/Combobox.svelte +142 -0
- package/src/Form/Core/DatePicker.svelte +265 -0
- package/src/Form/Core/Dropzone.svelte +482 -0
- package/src/Form/Core/EnvDropdown.svelte +276 -0
- package/src/Form/Core/File.svelte +115 -0
- package/src/Form/Core/InputDropdown.svelte +235 -0
- package/src/Form/Core/Multiselect.svelte +99 -0
- package/src/Form/Core/Picker.svelte +314 -0
- package/src/Form/Core/PickerDropdown.svelte +431 -0
- package/src/Form/Core/RadioGroup.svelte +65 -0
- package/src/Form/Core/RichTextField.svelte +42 -0
- package/src/Form/Core/Search.svelte +105 -0
- package/src/Form/Core/Select.svelte +90 -0
- package/src/Form/Core/Slider.svelte +86 -0
- package/src/Form/Core/Stepper.svelte +172 -0
- package/src/Form/Core/Switch.svelte +35 -0
- package/src/Form/Core/TextArea.svelte +78 -0
- package/src/Form/Core/TextField.svelte +115 -0
- package/src/Form/Core/index.js +16 -0
- package/src/Form/DatePicker.svelte +46 -0
- package/src/Form/Dropzone.svelte +44 -0
- package/src/Form/EnvDropdown.svelte +50 -0
- package/src/Form/Field.svelte +42 -0
- package/src/Form/FieldLabel.svelte +32 -0
- package/src/Form/File.svelte +37 -0
- package/src/Form/Input.svelte +45 -0
- package/src/Form/InputDropdown.svelte +53 -0
- package/src/Form/Multiselect.svelte +49 -0
- package/src/Form/PickerDropdown.svelte +131 -0
- package/src/Form/RadioGroup.svelte +42 -0
- package/src/Form/RichTextField.svelte +36 -0
- package/src/Form/Search.svelte +36 -0
- package/src/Form/Select.svelte +67 -0
- package/src/Form/Slider.svelte +24 -0
- package/src/Form/Stepper.svelte +45 -0
- package/src/Form/TextArea.svelte +34 -0
- package/src/Form/Toggle.svelte +22 -0
- package/src/Icon/Icon.svelte +94 -0
- package/src/Icon/IconAvatar.svelte +61 -0
- package/src/IconPicker/IconPicker.svelte +184 -0
- package/src/IconSideNav/IconSideNav.svelte +14 -0
- package/src/IconSideNav/IconSideNavItem.svelte +56 -0
- package/src/InlineAlert/InlineAlert.svelte +63 -0
- package/src/Input/CopyInput.svelte +59 -0
- package/src/Label/Label.svelte +31 -0
- package/src/Layout/Layout.svelte +94 -0
- package/src/Layout/Page.svelte +101 -0
- package/src/Link/Link.svelte +27 -0
- package/src/List/List.svelte +28 -0
- package/src/List/ListItem.svelte +93 -0
- package/src/Markdown/MarkdownEditor.svelte +60 -0
- package/src/Markdown/MarkdownViewer.svelte +70 -0
- package/src/Markdown/SpectrumMDE.svelte +184 -0
- package/src/Menu/Item.svelte +94 -0
- package/src/Menu/Menu.svelte +7 -0
- package/src/Menu/Menu.svench +19 -0
- package/src/Menu/Section.svelte +10 -0
- package/src/Menu/Separator.svelte +1 -0
- package/src/Modal/Content.svelte +6 -0
- package/src/Modal/CustomContent.svelte +37 -0
- package/src/Modal/Modal.svelte +178 -0
- package/src/Modal/Modal.svench +116 -0
- package/src/Modal/ModalContent.svelte +190 -0
- package/src/Modal/QuizModal.svelte +53 -0
- package/src/Notification/Notification.svelte +74 -0
- package/src/Notification/NotificationDisplay.svelte +43 -0
- package/src/Pagination/Pagination.svelte +57 -0
- package/src/Popover/Popover.svelte +95 -0
- package/src/Popover/Popover.svench +120 -0
- package/src/ProgressBar/ProgressBar.svelte +67 -0
- package/src/ProgressCircle/ProgressCircle.svelte +62 -0
- package/src/SideNavigation/Item.svelte +59 -0
- package/src/SideNavigation/Navigation.svelte +12 -0
- package/src/StatusLight/StatusLight.svelte +80 -0
- package/src/Stores/Notifications.svench.svx +78 -0
- package/src/Stores/banner.js +65 -0
- package/src/Stores/notifications.js +84 -0
- package/src/Table/ArrayRenderer.svelte +18 -0
- package/src/Table/AttachmentRenderer.svelte +73 -0
- package/src/Table/BoldRenderer.svelte +15 -0
- package/src/Table/BooleanRenderer.svelte +42 -0
- package/src/Table/CellRenderer.svelte +70 -0
- package/src/Table/CodeRenderer.svelte +14 -0
- package/src/Table/DateTimeRenderer.svelte +29 -0
- package/src/Table/InternalRenderer.svelte +24 -0
- package/src/Table/RelationshipRenderer.svelte +35 -0
- package/src/Table/SelectEditRenderer.svelte +28 -0
- package/src/Table/StringRenderer.svelte +22 -0
- package/src/Table/Table.svelte +657 -0
- package/src/Table/index.js +1 -0
- package/src/Tabs/Tab.svelte +88 -0
- package/src/Tabs/Tabs.svelte +130 -0
- package/src/Tags/Tag.svelte +43 -0
- package/src/Tags/Tags.svelte +17 -0
- package/src/Tooltip/Tooltip.svelte +34 -0
- package/src/Tooltip/TooltipWrapper.svelte +60 -0
- package/src/TreeView/Item.svelte +41 -0
- package/src/TreeView/Tree.svelte +16 -0
- package/src/Typography/Body.svelte +22 -0
- package/src/Typography/Code.svelte +10 -0
- package/src/Typography/Detail.svelte +19 -0
- package/src/Typography/Heading.svelte +24 -0
- package/src/bbui.css +118 -0
- package/src/context.js +4 -0
- package/src/helpers.js +116 -0
- package/src/index.js +109 -0
- package/src/spectrum-icons-rollup.js +31 -0
- package/src/spectrum-icons-vite.js +31 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import "@spectrum-css/picker/dist/index-vars.css"
|
|
3
|
+
import "@spectrum-css/popover/dist/index-vars.css"
|
|
4
|
+
import "@spectrum-css/menu/dist/index-vars.css"
|
|
5
|
+
import { createEventDispatcher } from "svelte"
|
|
6
|
+
import clickOutside from "../../Actions/click_outside"
|
|
7
|
+
import Search from "./Search.svelte"
|
|
8
|
+
import Icon from "../../Icon/Icon.svelte"
|
|
9
|
+
import StatusLight from "../../StatusLight/StatusLight.svelte"
|
|
10
|
+
import Popover from "../../Popover/Popover.svelte"
|
|
11
|
+
|
|
12
|
+
export let id = null
|
|
13
|
+
export let disabled = false
|
|
14
|
+
export let error = null
|
|
15
|
+
export let fieldText = ""
|
|
16
|
+
export let fieldIcon = ""
|
|
17
|
+
export let fieldColour = ""
|
|
18
|
+
export let isPlaceholder = false
|
|
19
|
+
export let placeholderOption = null
|
|
20
|
+
export let options = []
|
|
21
|
+
export let isOptionSelected = () => false
|
|
22
|
+
export let isOptionEnabled = () => true
|
|
23
|
+
export let onSelectOption = () => {}
|
|
24
|
+
export let getOptionLabel = option => option
|
|
25
|
+
export let getOptionValue = option => option
|
|
26
|
+
export let getOptionIcon = () => null
|
|
27
|
+
export let useOptionIconImage = false
|
|
28
|
+
export let getOptionColour = () => null
|
|
29
|
+
export let open = false
|
|
30
|
+
export let readonly = false
|
|
31
|
+
export let quiet = false
|
|
32
|
+
export let autoWidth = false
|
|
33
|
+
export let autocomplete = false
|
|
34
|
+
export let sort = false
|
|
35
|
+
export let fetchTerm = null
|
|
36
|
+
export let useFetch = false
|
|
37
|
+
export let customPopoverHeight
|
|
38
|
+
export let align = "left"
|
|
39
|
+
export let footer = null
|
|
40
|
+
|
|
41
|
+
const dispatch = createEventDispatcher()
|
|
42
|
+
|
|
43
|
+
let searchTerm = null
|
|
44
|
+
let button
|
|
45
|
+
let popover
|
|
46
|
+
|
|
47
|
+
$: sortedOptions = getSortedOptions(options, getOptionLabel, sort)
|
|
48
|
+
$: filteredOptions = getFilteredOptions(
|
|
49
|
+
sortedOptions,
|
|
50
|
+
searchTerm,
|
|
51
|
+
getOptionLabel
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
const onClick = e => {
|
|
55
|
+
e.preventDefault()
|
|
56
|
+
e.stopPropagation()
|
|
57
|
+
dispatch("click")
|
|
58
|
+
if (readonly) {
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
searchTerm = null
|
|
62
|
+
open = !open
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const getSortedOptions = (options, getLabel, sort) => {
|
|
66
|
+
if (!options?.length || !Array.isArray(options)) {
|
|
67
|
+
return []
|
|
68
|
+
}
|
|
69
|
+
if (!sort) {
|
|
70
|
+
return options
|
|
71
|
+
}
|
|
72
|
+
return options.sort((a, b) => {
|
|
73
|
+
const labelA = getLabel(a)
|
|
74
|
+
const labelB = getLabel(b)
|
|
75
|
+
return labelA > labelB ? 1 : -1
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const getFilteredOptions = (options, term, getLabel) => {
|
|
80
|
+
if (autocomplete && term && !fetchTerm) {
|
|
81
|
+
const lowerCaseTerm = term.toLowerCase()
|
|
82
|
+
return options.filter(option => {
|
|
83
|
+
return `${getLabel(option)}`.toLowerCase().includes(lowerCaseTerm)
|
|
84
|
+
})
|
|
85
|
+
}
|
|
86
|
+
return options
|
|
87
|
+
}
|
|
88
|
+
</script>
|
|
89
|
+
|
|
90
|
+
<button
|
|
91
|
+
{id}
|
|
92
|
+
class="spectrum-Picker spectrum-Picker--sizeM"
|
|
93
|
+
class:spectrum-Picker--quiet={quiet}
|
|
94
|
+
{disabled}
|
|
95
|
+
class:is-invalid={!!error}
|
|
96
|
+
class:is-open={open}
|
|
97
|
+
aria-haspopup="listbox"
|
|
98
|
+
on:click={onClick}
|
|
99
|
+
bind:this={button}
|
|
100
|
+
>
|
|
101
|
+
{#if fieldIcon}
|
|
102
|
+
<span class="option-extra icon">
|
|
103
|
+
<Icon size="S" name={fieldIcon} />
|
|
104
|
+
</span>
|
|
105
|
+
{/if}
|
|
106
|
+
{#if fieldColour}
|
|
107
|
+
<span class="option-extra">
|
|
108
|
+
<StatusLight square color={fieldColour} />
|
|
109
|
+
</span>
|
|
110
|
+
{/if}
|
|
111
|
+
<span
|
|
112
|
+
class="spectrum-Picker-label"
|
|
113
|
+
class:is-placeholder={isPlaceholder}
|
|
114
|
+
class:auto-width={autoWidth}
|
|
115
|
+
>
|
|
116
|
+
{fieldText}
|
|
117
|
+
</span>
|
|
118
|
+
{#if error}
|
|
119
|
+
<svg
|
|
120
|
+
class="spectrum-Icon spectrum-Icon--sizeM spectrum-Picker-validationIcon"
|
|
121
|
+
focusable="false"
|
|
122
|
+
aria-hidden="true"
|
|
123
|
+
aria-label="Folder"
|
|
124
|
+
>
|
|
125
|
+
<use xlink:href="#spectrum-icon-18-Alert" />
|
|
126
|
+
</svg>
|
|
127
|
+
{/if}
|
|
128
|
+
<svg
|
|
129
|
+
class="spectrum-Icon spectrum-UIIcon-ChevronDown100 spectrum-Picker-menuIcon"
|
|
130
|
+
focusable="false"
|
|
131
|
+
aria-hidden="true"
|
|
132
|
+
>
|
|
133
|
+
<use xlink:href="#spectrum-css-icon-Chevron100" />
|
|
134
|
+
</svg>
|
|
135
|
+
</button>
|
|
136
|
+
|
|
137
|
+
<Popover
|
|
138
|
+
anchor={button}
|
|
139
|
+
align={align || "left"}
|
|
140
|
+
bind:this={popover}
|
|
141
|
+
{open}
|
|
142
|
+
on:close={() => (open = false)}
|
|
143
|
+
useAnchorWidth={!autoWidth}
|
|
144
|
+
maxWidth={autoWidth ? 400 : null}
|
|
145
|
+
customHeight={customPopoverHeight}
|
|
146
|
+
>
|
|
147
|
+
<div
|
|
148
|
+
class="popover-content"
|
|
149
|
+
class:auto-width={autoWidth}
|
|
150
|
+
use:clickOutside={() => (open = false)}
|
|
151
|
+
>
|
|
152
|
+
{#if autocomplete}
|
|
153
|
+
<Search
|
|
154
|
+
value={useFetch ? fetchTerm : searchTerm}
|
|
155
|
+
on:change={event =>
|
|
156
|
+
useFetch ? (fetchTerm = event.detail) : (searchTerm = event.detail)}
|
|
157
|
+
{disabled}
|
|
158
|
+
placeholder="Search"
|
|
159
|
+
/>
|
|
160
|
+
{/if}
|
|
161
|
+
<ul class="spectrum-Menu" role="listbox">
|
|
162
|
+
{#if placeholderOption}
|
|
163
|
+
<li
|
|
164
|
+
class="spectrum-Menu-item placeholder"
|
|
165
|
+
class:is-selected={isPlaceholder}
|
|
166
|
+
role="option"
|
|
167
|
+
aria-selected="true"
|
|
168
|
+
tabindex="0"
|
|
169
|
+
on:click={() => onSelectOption(null)}
|
|
170
|
+
>
|
|
171
|
+
<span class="spectrum-Menu-itemLabel">{placeholderOption}</span>
|
|
172
|
+
<svg
|
|
173
|
+
class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
|
|
174
|
+
focusable="false"
|
|
175
|
+
aria-hidden="true"
|
|
176
|
+
>
|
|
177
|
+
<use xlink:href="#spectrum-css-icon-Checkmark100" />
|
|
178
|
+
</svg>
|
|
179
|
+
</li>
|
|
180
|
+
{/if}
|
|
181
|
+
{#if filteredOptions.length}
|
|
182
|
+
{#each filteredOptions as option, idx}
|
|
183
|
+
<li
|
|
184
|
+
class="spectrum-Menu-item"
|
|
185
|
+
class:is-selected={isOptionSelected(getOptionValue(option, idx))}
|
|
186
|
+
role="option"
|
|
187
|
+
aria-selected="true"
|
|
188
|
+
tabindex="0"
|
|
189
|
+
on:click={() => onSelectOption(getOptionValue(option, idx))}
|
|
190
|
+
class:is-disabled={!isOptionEnabled(option)}
|
|
191
|
+
>
|
|
192
|
+
{#if getOptionIcon(option, idx)}
|
|
193
|
+
<span class="option-extra icon">
|
|
194
|
+
{#if useOptionIconImage}
|
|
195
|
+
<img
|
|
196
|
+
src={getOptionIcon(option, idx)}
|
|
197
|
+
alt="icon"
|
|
198
|
+
width="15"
|
|
199
|
+
height="15"
|
|
200
|
+
/>
|
|
201
|
+
{:else}
|
|
202
|
+
<Icon size="S" name={getOptionIcon(option, idx)} />
|
|
203
|
+
{/if}
|
|
204
|
+
</span>
|
|
205
|
+
{/if}
|
|
206
|
+
{#if getOptionColour(option, idx)}
|
|
207
|
+
<span class="option-extra">
|
|
208
|
+
<StatusLight square color={getOptionColour(option, idx)} />
|
|
209
|
+
</span>
|
|
210
|
+
{/if}
|
|
211
|
+
<span class="spectrum-Menu-itemLabel">
|
|
212
|
+
{getOptionLabel(option, idx)}
|
|
213
|
+
</span>
|
|
214
|
+
<svg
|
|
215
|
+
class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
|
|
216
|
+
focusable="false"
|
|
217
|
+
aria-hidden="true"
|
|
218
|
+
>
|
|
219
|
+
<use xlink:href="#spectrum-css-icon-Checkmark100" />
|
|
220
|
+
</svg>
|
|
221
|
+
</li>
|
|
222
|
+
{/each}
|
|
223
|
+
{/if}
|
|
224
|
+
</ul>
|
|
225
|
+
|
|
226
|
+
{#if footer}
|
|
227
|
+
<div class="footer">
|
|
228
|
+
{footer}
|
|
229
|
+
</div>
|
|
230
|
+
{/if}
|
|
231
|
+
</div>
|
|
232
|
+
</Popover>
|
|
233
|
+
|
|
234
|
+
<style>
|
|
235
|
+
.spectrum-Picker {
|
|
236
|
+
width: 100%;
|
|
237
|
+
box-shadow: none;
|
|
238
|
+
}
|
|
239
|
+
.spectrum-Picker-label.auto-width {
|
|
240
|
+
margin-right: var(--spacing-xs);
|
|
241
|
+
}
|
|
242
|
+
.spectrum-Picker-label:not(.auto-width) {
|
|
243
|
+
overflow: hidden;
|
|
244
|
+
text-overflow: ellipsis;
|
|
245
|
+
white-space: nowrap;
|
|
246
|
+
width: 0;
|
|
247
|
+
}
|
|
248
|
+
.placeholder {
|
|
249
|
+
font-style: italic;
|
|
250
|
+
}
|
|
251
|
+
.spectrum-Picker-label.auto-width.is-placeholder {
|
|
252
|
+
padding-right: 2px;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* Icon and colour alignment */
|
|
256
|
+
.spectrum-Menu-checkmark {
|
|
257
|
+
align-self: center;
|
|
258
|
+
margin-top: 0;
|
|
259
|
+
}
|
|
260
|
+
.option-extra {
|
|
261
|
+
padding-right: 8px;
|
|
262
|
+
}
|
|
263
|
+
.option-extra.icon {
|
|
264
|
+
margin: 0 -1px;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/* Popover */
|
|
268
|
+
.popover-content {
|
|
269
|
+
display: contents;
|
|
270
|
+
}
|
|
271
|
+
.popover-content.auto-width .spectrum-Menu-itemLabel {
|
|
272
|
+
white-space: nowrap;
|
|
273
|
+
overflow: none;
|
|
274
|
+
text-overflow: ellipsis;
|
|
275
|
+
}
|
|
276
|
+
.popover-content:not(.auto-width) .spectrum-Menu-itemLabel {
|
|
277
|
+
width: 0;
|
|
278
|
+
flex: 1 1 auto;
|
|
279
|
+
}
|
|
280
|
+
.popover-content.auto-width .spectrum-Menu-item {
|
|
281
|
+
padding-right: var(--spacing-xl);
|
|
282
|
+
}
|
|
283
|
+
.spectrum-Menu-item.is-disabled {
|
|
284
|
+
pointer-events: none;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/* Search styles inside popover */
|
|
288
|
+
.popover-content :global(.spectrum-Search) {
|
|
289
|
+
margin-top: -1px;
|
|
290
|
+
margin-left: -1px;
|
|
291
|
+
width: calc(100% + 2px);
|
|
292
|
+
}
|
|
293
|
+
.popover-content :global(.spectrum-Search input) {
|
|
294
|
+
height: auto;
|
|
295
|
+
border-bottom-left-radius: 0;
|
|
296
|
+
border-bottom-right-radius: 0;
|
|
297
|
+
padding-top: var(--spectrum-global-dimension-size-100);
|
|
298
|
+
padding-bottom: var(--spectrum-global-dimension-size-100);
|
|
299
|
+
}
|
|
300
|
+
.popover-content :global(.spectrum-Search .spectrum-ClearButton) {
|
|
301
|
+
right: 1px;
|
|
302
|
+
top: 2px;
|
|
303
|
+
}
|
|
304
|
+
.popover-content :global(.spectrum-Search .spectrum-Textfield-icon) {
|
|
305
|
+
top: 9px;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.footer {
|
|
309
|
+
padding: 4px 12px 12px 12px;
|
|
310
|
+
font-style: italic;
|
|
311
|
+
max-width: 170px;
|
|
312
|
+
font-size: 12px;
|
|
313
|
+
}
|
|
314
|
+
</style>
|