@budibase/bbui 1.58.13 → 2.0.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.
Files changed (181) hide show
  1. package/LICENSE +375 -0
  2. package/dist/bbui.es.js +14 -0
  3. package/dist/bbui.es.js.map +1 -0
  4. package/package.json +68 -32
  5. package/src/ActionButton/ActionButton.svelte +102 -0
  6. package/src/ActionGroup/ActionGroup.svelte +26 -0
  7. package/src/ActionMenu/ActionMenu.svelte +44 -0
  8. package/src/Actions/autoresize_textarea.js +9 -9
  9. package/src/Actions/click_outside.js +5 -5
  10. package/src/Actions/position_dropdown.js +46 -37
  11. package/src/Avatar/Avatar.svelte +62 -0
  12. package/src/Badge/Badge.svelte +29 -0
  13. package/src/Banner/Banner.svelte +72 -0
  14. package/src/Banner/BannerDisplay.svelte +41 -0
  15. package/src/Button/Button.svelte +102 -200
  16. package/src/ButtonGroup/ButtonGroup.svelte +30 -0
  17. package/src/ClearButton/ClearButton.svelte +19 -0
  18. package/src/ColorPicker/ColorPicker.svelte +297 -0
  19. package/src/DetailSummary/DetailSummary.svelte +83 -0
  20. package/src/Divider/Divider.svelte +28 -0
  21. package/src/Drawer/Drawer.svelte +76 -51
  22. package/src/Drawer/DrawerContent.svelte +46 -0
  23. package/src/Form/Checkbox.svelte +21 -132
  24. package/src/Form/Combobox.svelte +45 -0
  25. package/src/Form/Core/Checkbox.svelte +69 -0
  26. package/src/Form/Core/CheckboxGroup.svelte +68 -0
  27. package/src/Form/Core/Combobox.svelte +142 -0
  28. package/src/Form/Core/DatePicker.svelte +257 -0
  29. package/src/Form/Core/Dropzone.svelte +453 -0
  30. package/src/Form/Core/InputDropdown.svelte +228 -0
  31. package/src/Form/Core/Multiselect.svelte +90 -0
  32. package/src/Form/Core/Picker.svelte +259 -0
  33. package/src/Form/Core/PickerDropdown.svelte +415 -0
  34. package/src/Form/Core/RadioGroup.svelte +48 -0
  35. package/src/Form/Core/RichTextField.svelte +42 -0
  36. package/src/Form/Core/Search.svelte +105 -0
  37. package/src/Form/Core/Select.svelte +75 -0
  38. package/src/Form/Core/Slider.svelte +86 -0
  39. package/src/Form/Core/Stepper.svelte +172 -0
  40. package/src/Form/Core/Switch.svelte +37 -0
  41. package/src/Form/Core/TextArea.svelte +78 -0
  42. package/src/Form/Core/TextField.svelte +119 -0
  43. package/src/Form/Core/index.js +15 -0
  44. package/src/Form/DatePicker.svelte +39 -0
  45. package/src/Form/Dropzone.svelte +42 -0
  46. package/src/Form/Field.svelte +42 -0
  47. package/src/Form/FieldLabel.svelte +32 -0
  48. package/src/Form/Input.svelte +41 -187
  49. package/src/Form/InputDropdown.svelte +55 -0
  50. package/src/Form/Multiselect.svelte +36 -320
  51. package/src/Form/PickerDropdown.svelte +132 -0
  52. package/src/Form/RadioGroup.svelte +42 -0
  53. package/src/Form/RichTextField.svelte +36 -0
  54. package/src/Form/Search.svelte +36 -0
  55. package/src/Form/Select.svelte +48 -88
  56. package/src/Form/Slider.svelte +16 -91
  57. package/src/Form/Stepper.svelte +45 -0
  58. package/src/Form/TextArea.svelte +30 -128
  59. package/src/Form/Toggle.svelte +20 -110
  60. package/src/Icon/Icon.svelte +91 -0
  61. package/src/Icon/IconAvatar.svelte +58 -0
  62. package/src/IconPicker/IconPicker.svelte +177 -0
  63. package/src/IconSideNav/IconSideNav.svelte +14 -0
  64. package/src/IconSideNav/IconSideNavItem.svelte +56 -0
  65. package/src/InlineAlert/InlineAlert.svelte +60 -0
  66. package/src/Label/Label.svelte +29 -0
  67. package/src/Layout/Layout.svelte +94 -0
  68. package/src/Layout/Page.svelte +32 -0
  69. package/src/Link/Link.svelte +24 -0
  70. package/src/List/List.svelte +28 -0
  71. package/src/List/ListItem.svelte +90 -0
  72. package/src/Markdown/MarkdownEditor.svelte +60 -0
  73. package/src/Markdown/MarkdownViewer.svelte +70 -0
  74. package/src/Markdown/SpectrumMDE.svelte +184 -0
  75. package/src/Menu/Item.svelte +96 -0
  76. package/src/Menu/Menu.svelte +7 -0
  77. package/src/Menu/Menu.svench +19 -0
  78. package/src/Menu/Section.svelte +10 -0
  79. package/src/Menu/Separator.svelte +1 -0
  80. package/src/Modal/Content.svelte +0 -11
  81. package/src/Modal/CustomContent.svelte +9 -6
  82. package/src/Modal/Modal.svelte +104 -51
  83. package/src/Modal/ModalContent.svelte +131 -73
  84. package/src/Modal/QuizModal.svelte +16 -17
  85. package/src/Notification/Notification.svelte +70 -0
  86. package/src/Notification/NotificationDisplay.svelte +43 -0
  87. package/src/Pagination/Pagination.svelte +57 -0
  88. package/src/Popover/Popover.svelte +43 -33
  89. package/src/ProgressBar/ProgressBar.svelte +67 -0
  90. package/src/ProgressCircle/ProgressCircle.svelte +62 -0
  91. package/src/SideNavigation/Item.svelte +61 -0
  92. package/src/SideNavigation/Navigation.svelte +12 -0
  93. package/src/StatusLight/StatusLight.svelte +80 -0
  94. package/src/Stores/Notifications.svench.svx +1 -1
  95. package/src/Stores/banner.js +65 -0
  96. package/src/Stores/notifications.js +75 -38
  97. package/src/Table/ArrayRenderer.svelte +17 -0
  98. package/src/Table/AttachmentRenderer.svelte +73 -0
  99. package/src/Table/BoldRenderer.svelte +15 -0
  100. package/src/Table/BooleanRenderer.svelte +42 -0
  101. package/src/Table/CellRenderer.svelte +69 -0
  102. package/src/Table/CodeRenderer.svelte +14 -0
  103. package/src/Table/DateTimeRenderer.svelte +29 -0
  104. package/src/Table/InternalRenderer.svelte +24 -0
  105. package/src/Table/RelationshipRenderer.svelte +40 -0
  106. package/src/Table/SelectEditRenderer.svelte +28 -0
  107. package/src/Table/StringRenderer.svelte +14 -0
  108. package/src/Table/Table.svelte +635 -0
  109. package/src/Table/index.js +1 -0
  110. package/src/Tabs/Tab.svelte +88 -0
  111. package/src/Tabs/Tabs.svelte +130 -0
  112. package/src/Tags/Tag.svelte +43 -0
  113. package/src/Tags/Tags.svelte +7 -0
  114. package/src/Tooltip/Tooltip.svelte +34 -0
  115. package/src/Tooltip/TooltipWrapper.svelte +60 -0
  116. package/src/TreeView/Item.svelte +41 -0
  117. package/src/TreeView/Tree.svelte +16 -0
  118. package/src/Typography/Body.svelte +21 -0
  119. package/src/Typography/Code.svelte +10 -0
  120. package/src/Typography/Detail.svelte +19 -0
  121. package/src/Typography/Heading.svelte +17 -0
  122. package/{dist → src}/bbui.css +2 -99
  123. package/src/context.js +1 -1
  124. package/src/helpers.js +134 -0
  125. package/src/index.js +95 -40
  126. package/src/spectrum-icons-rollup.js +31 -0
  127. package/src/spectrum-icons-vite.js +31 -0
  128. package/dist/dist/bundle.css +0 -42
  129. package/dist/dist/bundle.css.map +0 -64
  130. package/dist/index.js +0 -36193
  131. package/dist/index.mjs +0 -36147
  132. package/src/Button/Close.svelte +0 -59
  133. package/src/Button/Close.svench +0 -36
  134. package/src/Button/TextButton.svelte +0 -128
  135. package/src/Button/TextButton.svench +0 -69
  136. package/src/DatePicker/DatePicker.svelte +0 -45
  137. package/src/DatePicker/DatePicker.svench +0 -17
  138. package/src/DropdownMenu/DropdownMenu.svelte +0 -77
  139. package/src/DropdownMenu/DropdownMenu.svench +0 -161
  140. package/src/Dropzone/Dropzone.svelte +0 -294
  141. package/src/Dropzone/Dropzone.svench +0 -17
  142. package/src/Dropzone/fileTypes.js +0 -5
  143. package/src/Form/Checkbox.svench.svx +0 -67
  144. package/src/Form/DataList.svelte +0 -158
  145. package/src/Form/DataList.svench +0 -57
  146. package/src/Form/Input.svench +0 -62
  147. package/src/Form/Multiselect.svench +0 -63
  148. package/src/Form/Radio.svelte +0 -133
  149. package/src/Form/Radio.svench.svx +0 -64
  150. package/src/Form/RichText.svelte +0 -61
  151. package/src/Form/RichText.svench.svx +0 -40
  152. package/src/Form/Select.svench +0 -62
  153. package/src/Form/Slider.svench +0 -26
  154. package/src/Form/TextArea.svench +0 -30
  155. package/src/Form/Toggle.svench +0 -21
  156. package/src/Icons/Contribution.svelte +0 -14
  157. package/src/Icons/Icon.svelte +0 -36
  158. package/src/Icons/Icon.svench +0 -109
  159. package/src/Icons/icon-paths.js +0 -136
  160. package/src/Links/Home.svelte +0 -51
  161. package/src/Links/Home.svench +0 -19
  162. package/src/List/Items/DetailSummary.svelte +0 -85
  163. package/src/List/Items/DetailSummary.svench +0 -53
  164. package/src/List/Search.svelte +0 -34
  165. package/src/List/Search.svench +0 -8
  166. package/src/Spacer/Spacer.svelte +0 -50
  167. package/src/Spacer/Spacer.svench +0 -51
  168. package/src/Styleguide/Body.svelte +0 -72
  169. package/src/Styleguide/Borders.svench +0 -175
  170. package/src/Styleguide/Budibase-logo.svelte +0 -68
  171. package/src/Styleguide/Color.svench +0 -201
  172. package/src/Styleguide/Heading.svelte +0 -74
  173. package/src/Styleguide/Label.svelte +0 -70
  174. package/src/Styleguide/Logo.svelte +0 -16
  175. package/src/Styleguide/Logo.svench +0 -8
  176. package/src/Styleguide/Spacing.svench +0 -191
  177. package/src/Styleguide/Typography.svench +0 -227
  178. package/src/Switcher/Switcher.svelte +0 -47
  179. package/src/Switcher/Switcher.svench +0 -27
  180. package/src/index.svench.svx +0 -35
  181. package/src/utils/buildStyle.js +0 -14
@@ -0,0 +1,90 @@
1
+ <script>
2
+ import Picker from "./Picker.svelte"
3
+ import { createEventDispatcher } from "svelte"
4
+
5
+ export let value = []
6
+ export let id = null
7
+ export let placeholder = null
8
+ export let disabled = false
9
+ export let error = null
10
+ export let options = []
11
+ export let getOptionLabel = option => option
12
+ export let getOptionValue = option => option
13
+ export let readonly = false
14
+ export let autocomplete = false
15
+ export let sort = false
16
+ export let autoWidth = false
17
+
18
+ const dispatch = createEventDispatcher()
19
+ $: selectedLookupMap = getSelectedLookupMap(value)
20
+ $: optionLookupMap = getOptionLookupMap(options)
21
+ $: fieldText = getFieldText(value, optionLookupMap, placeholder)
22
+ $: isOptionSelected = optionValue => selectedLookupMap[optionValue] === true
23
+ $: toggleOption = makeToggleOption(selectedLookupMap, value)
24
+
25
+ const getFieldText = (value, map, placeholder) => {
26
+ if (Array.isArray(value) && value.length > 0) {
27
+ if (!map) {
28
+ return ""
29
+ }
30
+ const vals = value.map(option => map[option] || option).join(", ")
31
+ return `(${value.length}) ${vals}`
32
+ } else {
33
+ return placeholder || "Choose some options"
34
+ }
35
+ }
36
+
37
+ const getSelectedLookupMap = value => {
38
+ let map = {}
39
+ if (Array.isArray(value) && value.length > 0) {
40
+ value.forEach(option => {
41
+ if (option) {
42
+ map[option] = true
43
+ }
44
+ })
45
+ }
46
+ return map
47
+ }
48
+
49
+ const getOptionLookupMap = options => {
50
+ let map = null
51
+ if (options?.length) {
52
+ map = {}
53
+ options.forEach((option, idx) => {
54
+ const optionValue = getOptionValue(option, idx)
55
+ if (optionValue != null) {
56
+ map[optionValue] = getOptionLabel(option, idx) || ""
57
+ }
58
+ })
59
+ }
60
+ return map
61
+ }
62
+
63
+ const makeToggleOption = (map, value) => {
64
+ return optionValue => {
65
+ if (map[optionValue]) {
66
+ const filtered = value.filter(option => option !== optionValue)
67
+ dispatch("change", filtered)
68
+ } else {
69
+ dispatch("change", [...value, optionValue])
70
+ }
71
+ }
72
+ }
73
+ </script>
74
+
75
+ <Picker
76
+ {id}
77
+ {error}
78
+ {disabled}
79
+ {readonly}
80
+ {fieldText}
81
+ {options}
82
+ isPlaceholder={!value?.length}
83
+ {autocomplete}
84
+ {isOptionSelected}
85
+ {getOptionLabel}
86
+ {getOptionValue}
87
+ onSelectOption={toggleOption}
88
+ {sort}
89
+ {autoWidth}
90
+ />
@@ -0,0 +1,259 @@
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 { fly } from "svelte/transition"
6
+ import { createEventDispatcher } from "svelte"
7
+ import clickOutside from "../../Actions/click_outside"
8
+ import Search from "./Search.svelte"
9
+ import Icon from "../../Icon/Icon.svelte"
10
+ import StatusLight from "../../StatusLight/StatusLight.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 onSelectOption = () => {}
23
+ export let getOptionLabel = option => option
24
+ export let getOptionValue = option => option
25
+ export let getOptionIcon = () => null
26
+ export let getOptionColour = () => null
27
+ export let open = false
28
+ export let readonly = false
29
+ export let quiet = false
30
+ export let autoWidth = false
31
+ export let autocomplete = false
32
+ export let sort = false
33
+
34
+ const dispatch = createEventDispatcher()
35
+ let searchTerm = null
36
+
37
+ $: sortedOptions = getSortedOptions(options, getOptionLabel, sort)
38
+ $: filteredOptions = getFilteredOptions(
39
+ sortedOptions,
40
+ searchTerm,
41
+ getOptionLabel
42
+ )
43
+
44
+ const onClick = () => {
45
+ dispatch("click")
46
+ if (readonly) {
47
+ return
48
+ }
49
+ searchTerm = null
50
+ open = !open
51
+ }
52
+
53
+ const getSortedOptions = (options, getLabel, sort) => {
54
+ if (!options?.length || !Array.isArray(options)) {
55
+ return []
56
+ }
57
+ if (!sort) {
58
+ return options
59
+ }
60
+ return options.sort((a, b) => {
61
+ const labelA = getLabel(a)
62
+ const labelB = getLabel(b)
63
+ return labelA > labelB ? 1 : -1
64
+ })
65
+ }
66
+
67
+ const getFilteredOptions = (options, term, getLabel) => {
68
+ if (autocomplete && term) {
69
+ const lowerCaseTerm = term.toLowerCase()
70
+ return options.filter(option => {
71
+ return `${getLabel(option)}`.toLowerCase().includes(lowerCaseTerm)
72
+ })
73
+ }
74
+ return options
75
+ }
76
+ </script>
77
+
78
+ <div use:clickOutside={() => (open = false)}>
79
+ <button
80
+ {id}
81
+ class="spectrum-Picker spectrum-Picker--sizeM"
82
+ class:spectrum-Picker--quiet={quiet}
83
+ {disabled}
84
+ class:is-invalid={!!error}
85
+ class:is-open={open}
86
+ aria-haspopup="listbox"
87
+ on:mousedown={onClick}
88
+ >
89
+ {#if fieldIcon}
90
+ <span class="option-extra">
91
+ <Icon name={fieldIcon} />
92
+ </span>
93
+ {/if}
94
+ {#if fieldColour}
95
+ <span class="option-extra">
96
+ <StatusLight square color={fieldColour} />
97
+ </span>
98
+ {/if}
99
+ <span
100
+ class="spectrum-Picker-label"
101
+ class:is-placeholder={isPlaceholder}
102
+ class:auto-width={autoWidth}
103
+ >
104
+ {fieldText}
105
+ </span>
106
+ {#if error}
107
+ <svg
108
+ class="spectrum-Icon spectrum-Icon--sizeM spectrum-Picker-validationIcon"
109
+ focusable="false"
110
+ aria-hidden="true"
111
+ aria-label="Folder"
112
+ >
113
+ <use xlink:href="#spectrum-icon-18-Alert" />
114
+ </svg>
115
+ {/if}
116
+ <svg
117
+ class="spectrum-Icon spectrum-UIIcon-ChevronDown100 spectrum-Picker-menuIcon"
118
+ focusable="false"
119
+ aria-hidden="true"
120
+ >
121
+ <use xlink:href="#spectrum-css-icon-Chevron100" />
122
+ </svg>
123
+ </button>
124
+ {#if open}
125
+ <div
126
+ transition:fly|local={{ y: -20, duration: 200 }}
127
+ class="spectrum-Popover spectrum-Popover--bottom spectrum-Picker-popover is-open"
128
+ class:auto-width={autoWidth}
129
+ >
130
+ {#if autocomplete}
131
+ <Search
132
+ value={searchTerm}
133
+ on:change={event => (searchTerm = event.detail)}
134
+ {disabled}
135
+ placeholder="Search"
136
+ />
137
+ {/if}
138
+ <ul class="spectrum-Menu" role="listbox">
139
+ {#if placeholderOption}
140
+ <li
141
+ class="spectrum-Menu-item placeholder"
142
+ class:is-selected={isPlaceholder}
143
+ role="option"
144
+ aria-selected="true"
145
+ tabindex="0"
146
+ on:click={() => onSelectOption(null)}
147
+ >
148
+ <span class="spectrum-Menu-itemLabel">{placeholderOption}</span>
149
+ <svg
150
+ class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
151
+ focusable="false"
152
+ aria-hidden="true"
153
+ >
154
+ <use xlink:href="#spectrum-css-icon-Checkmark100" />
155
+ </svg>
156
+ </li>
157
+ {/if}
158
+ {#if filteredOptions.length}
159
+ {#each filteredOptions as option, idx}
160
+ <li
161
+ class="spectrum-Menu-item"
162
+ class:is-selected={isOptionSelected(getOptionValue(option, idx))}
163
+ role="option"
164
+ aria-selected="true"
165
+ tabindex="0"
166
+ on:click={() => onSelectOption(getOptionValue(option, idx))}
167
+ >
168
+ {#if getOptionIcon(option, idx)}
169
+ <span class="option-extra">
170
+ <Icon name={getOptionIcon(option, idx)} />
171
+ </span>
172
+ {/if}
173
+ {#if getOptionColour(option, idx)}
174
+ <span class="option-extra">
175
+ <StatusLight square color={getOptionColour(option, idx)} />
176
+ </span>
177
+ {/if}
178
+ <span class="spectrum-Menu-itemLabel">
179
+ {getOptionLabel(option, idx)}
180
+ </span>
181
+ <svg
182
+ class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
183
+ focusable="false"
184
+ aria-hidden="true"
185
+ >
186
+ <use xlink:href="#spectrum-css-icon-Checkmark100" />
187
+ </svg>
188
+ </li>
189
+ {/each}
190
+ {/if}
191
+ </ul>
192
+ </div>
193
+ {/if}
194
+ </div>
195
+
196
+ <style>
197
+ .spectrum-Popover {
198
+ max-height: 240px;
199
+ z-index: 999;
200
+ top: 100%;
201
+ }
202
+ .spectrum-Popover:not(.auto-width) {
203
+ width: 100%;
204
+ }
205
+ .spectrum-Popover.auto-width :global(.spectrum-Menu-itemLabel) {
206
+ white-space: nowrap;
207
+ }
208
+ .spectrum-Picker {
209
+ width: 100%;
210
+ box-shadow: none;
211
+ }
212
+ .spectrum-Picker-label.auto-width {
213
+ margin-right: var(--spacing-xs);
214
+ }
215
+ .spectrum-Picker-label:not(.auto-width) {
216
+ overflow: hidden;
217
+ text-overflow: ellipsis;
218
+ white-space: nowrap;
219
+ width: 0;
220
+ }
221
+ .placeholder {
222
+ font-style: italic;
223
+ }
224
+ .spectrum-Picker-label.auto-width.is-placeholder {
225
+ padding-right: 2px;
226
+ }
227
+ .auto-width .spectrum-Menu-item {
228
+ padding-right: var(--spacing-xl);
229
+ }
230
+
231
+ /* Icon and colour alignment */
232
+ .spectrum-Menu-checkmark {
233
+ align-self: center;
234
+ margin-top: 0;
235
+ }
236
+ .option-extra {
237
+ padding-right: 8px;
238
+ }
239
+
240
+ .spectrum-Popover :global(.spectrum-Search) {
241
+ margin-top: -1px;
242
+ margin-left: -1px;
243
+ width: calc(100% + 2px);
244
+ }
245
+ .spectrum-Popover :global(.spectrum-Search input) {
246
+ height: auto;
247
+ border-bottom-left-radius: 0;
248
+ border-bottom-right-radius: 0;
249
+ padding-top: var(--spectrum-global-dimension-size-100);
250
+ padding-bottom: var(--spectrum-global-dimension-size-100);
251
+ }
252
+ .spectrum-Popover :global(.spectrum-Search .spectrum-ClearButton) {
253
+ right: 1px;
254
+ top: 2px;
255
+ }
256
+ .spectrum-Popover :global(.spectrum-Search .spectrum-Textfield-icon) {
257
+ top: 9px;
258
+ }
259
+ </style>