@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.
Files changed (149) hide show
  1. package/LICENSE +375 -0
  2. package/README.md +42 -0
  3. package/dist/bbui.es.js +8 -0
  4. package/dist/bbui.es.js.map +1 -0
  5. package/package.json +94 -0
  6. package/src/Accordion/Accordion.svelte +58 -0
  7. package/src/ActionButton/ActionButton.svelte +132 -0
  8. package/src/ActionGroup/ActionGroup.svelte +26 -0
  9. package/src/ActionMenu/ActionMenu.svelte +43 -0
  10. package/src/Actions/ClickOutside.svench.svx +30 -0
  11. package/src/Actions/PositionDropdown.svench.svx +81 -0
  12. package/src/Actions/autoresize_textarea.js +14 -0
  13. package/src/Actions/click_outside.js +76 -0
  14. package/src/Actions/position_dropdown.js +116 -0
  15. package/src/Avatar/Avatar.svelte +63 -0
  16. package/src/Badge/Badge.svelte +42 -0
  17. package/src/Banner/Banner.svelte +72 -0
  18. package/src/Banner/BannerDisplay.svelte +41 -0
  19. package/src/Button/Button.svelte +118 -0
  20. package/src/Button/Button.svench +138 -0
  21. package/src/ButtonGroup/ButtonGroup.svelte +30 -0
  22. package/src/ClearButton/ClearButton.svelte +19 -0
  23. package/src/ColorPicker/ColorPicker.svelte +304 -0
  24. package/src/DetailSummary/DetailSummary.svelte +92 -0
  25. package/src/Divider/Divider.svelte +28 -0
  26. package/src/Drawer/Drawer.svelte +113 -0
  27. package/src/Drawer/Drawer.svench +42 -0
  28. package/src/Drawer/DrawerContent.svelte +45 -0
  29. package/src/FancyForm/FancyButton.svelte +30 -0
  30. package/src/FancyForm/FancyButtonRadio.svelte +70 -0
  31. package/src/FancyForm/FancyCheckbox.svelte +53 -0
  32. package/src/FancyForm/FancyField.svelte +126 -0
  33. package/src/FancyForm/FancyFieldLabel.svelte +25 -0
  34. package/src/FancyForm/FancyForm.svelte +40 -0
  35. package/src/FancyForm/FancyInput.svelte +109 -0
  36. package/src/FancyForm/FancySelect.svelte +147 -0
  37. package/src/FancyForm/index.js +6 -0
  38. package/src/Form/Checkbox.svelte +23 -0
  39. package/src/Form/Combobox.svelte +45 -0
  40. package/src/Form/Core/Checkbox.svelte +69 -0
  41. package/src/Form/Core/CheckboxGroup.svelte +68 -0
  42. package/src/Form/Core/Combobox.svelte +142 -0
  43. package/src/Form/Core/DatePicker.svelte +265 -0
  44. package/src/Form/Core/Dropzone.svelte +482 -0
  45. package/src/Form/Core/EnvDropdown.svelte +276 -0
  46. package/src/Form/Core/File.svelte +115 -0
  47. package/src/Form/Core/InputDropdown.svelte +235 -0
  48. package/src/Form/Core/Multiselect.svelte +99 -0
  49. package/src/Form/Core/Picker.svelte +314 -0
  50. package/src/Form/Core/PickerDropdown.svelte +431 -0
  51. package/src/Form/Core/RadioGroup.svelte +65 -0
  52. package/src/Form/Core/RichTextField.svelte +42 -0
  53. package/src/Form/Core/Search.svelte +105 -0
  54. package/src/Form/Core/Select.svelte +90 -0
  55. package/src/Form/Core/Slider.svelte +86 -0
  56. package/src/Form/Core/Stepper.svelte +172 -0
  57. package/src/Form/Core/Switch.svelte +35 -0
  58. package/src/Form/Core/TextArea.svelte +78 -0
  59. package/src/Form/Core/TextField.svelte +115 -0
  60. package/src/Form/Core/index.js +16 -0
  61. package/src/Form/DatePicker.svelte +46 -0
  62. package/src/Form/Dropzone.svelte +44 -0
  63. package/src/Form/EnvDropdown.svelte +50 -0
  64. package/src/Form/Field.svelte +42 -0
  65. package/src/Form/FieldLabel.svelte +32 -0
  66. package/src/Form/File.svelte +37 -0
  67. package/src/Form/Input.svelte +45 -0
  68. package/src/Form/InputDropdown.svelte +53 -0
  69. package/src/Form/Multiselect.svelte +49 -0
  70. package/src/Form/PickerDropdown.svelte +131 -0
  71. package/src/Form/RadioGroup.svelte +42 -0
  72. package/src/Form/RichTextField.svelte +36 -0
  73. package/src/Form/Search.svelte +36 -0
  74. package/src/Form/Select.svelte +67 -0
  75. package/src/Form/Slider.svelte +24 -0
  76. package/src/Form/Stepper.svelte +45 -0
  77. package/src/Form/TextArea.svelte +34 -0
  78. package/src/Form/Toggle.svelte +22 -0
  79. package/src/Icon/Icon.svelte +94 -0
  80. package/src/Icon/IconAvatar.svelte +61 -0
  81. package/src/IconPicker/IconPicker.svelte +184 -0
  82. package/src/IconSideNav/IconSideNav.svelte +14 -0
  83. package/src/IconSideNav/IconSideNavItem.svelte +56 -0
  84. package/src/InlineAlert/InlineAlert.svelte +63 -0
  85. package/src/Input/CopyInput.svelte +59 -0
  86. package/src/Label/Label.svelte +31 -0
  87. package/src/Layout/Layout.svelte +94 -0
  88. package/src/Layout/Page.svelte +101 -0
  89. package/src/Link/Link.svelte +27 -0
  90. package/src/List/List.svelte +28 -0
  91. package/src/List/ListItem.svelte +93 -0
  92. package/src/Markdown/MarkdownEditor.svelte +60 -0
  93. package/src/Markdown/MarkdownViewer.svelte +70 -0
  94. package/src/Markdown/SpectrumMDE.svelte +184 -0
  95. package/src/Menu/Item.svelte +94 -0
  96. package/src/Menu/Menu.svelte +7 -0
  97. package/src/Menu/Menu.svench +19 -0
  98. package/src/Menu/Section.svelte +10 -0
  99. package/src/Menu/Separator.svelte +1 -0
  100. package/src/Modal/Content.svelte +6 -0
  101. package/src/Modal/CustomContent.svelte +37 -0
  102. package/src/Modal/Modal.svelte +178 -0
  103. package/src/Modal/Modal.svench +116 -0
  104. package/src/Modal/ModalContent.svelte +190 -0
  105. package/src/Modal/QuizModal.svelte +53 -0
  106. package/src/Notification/Notification.svelte +74 -0
  107. package/src/Notification/NotificationDisplay.svelte +43 -0
  108. package/src/Pagination/Pagination.svelte +57 -0
  109. package/src/Popover/Popover.svelte +95 -0
  110. package/src/Popover/Popover.svench +120 -0
  111. package/src/ProgressBar/ProgressBar.svelte +67 -0
  112. package/src/ProgressCircle/ProgressCircle.svelte +62 -0
  113. package/src/SideNavigation/Item.svelte +59 -0
  114. package/src/SideNavigation/Navigation.svelte +12 -0
  115. package/src/StatusLight/StatusLight.svelte +80 -0
  116. package/src/Stores/Notifications.svench.svx +78 -0
  117. package/src/Stores/banner.js +65 -0
  118. package/src/Stores/notifications.js +84 -0
  119. package/src/Table/ArrayRenderer.svelte +18 -0
  120. package/src/Table/AttachmentRenderer.svelte +73 -0
  121. package/src/Table/BoldRenderer.svelte +15 -0
  122. package/src/Table/BooleanRenderer.svelte +42 -0
  123. package/src/Table/CellRenderer.svelte +70 -0
  124. package/src/Table/CodeRenderer.svelte +14 -0
  125. package/src/Table/DateTimeRenderer.svelte +29 -0
  126. package/src/Table/InternalRenderer.svelte +24 -0
  127. package/src/Table/RelationshipRenderer.svelte +35 -0
  128. package/src/Table/SelectEditRenderer.svelte +28 -0
  129. package/src/Table/StringRenderer.svelte +22 -0
  130. package/src/Table/Table.svelte +657 -0
  131. package/src/Table/index.js +1 -0
  132. package/src/Tabs/Tab.svelte +88 -0
  133. package/src/Tabs/Tabs.svelte +130 -0
  134. package/src/Tags/Tag.svelte +43 -0
  135. package/src/Tags/Tags.svelte +17 -0
  136. package/src/Tooltip/Tooltip.svelte +34 -0
  137. package/src/Tooltip/TooltipWrapper.svelte +60 -0
  138. package/src/TreeView/Item.svelte +41 -0
  139. package/src/TreeView/Tree.svelte +16 -0
  140. package/src/Typography/Body.svelte +22 -0
  141. package/src/Typography/Code.svelte +10 -0
  142. package/src/Typography/Detail.svelte +19 -0
  143. package/src/Typography/Heading.svelte +24 -0
  144. package/src/bbui.css +118 -0
  145. package/src/context.js +4 -0
  146. package/src/helpers.js +116 -0
  147. package/src/index.js +109 -0
  148. package/src/spectrum-icons-rollup.js +31 -0
  149. 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>