@budibase/bbui 1.2.1 → 1.2.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.
Files changed (152) hide show
  1. package/LICENSE +375 -0
  2. package/README.md +19 -17
  3. package/dist/bbui.es.js +210 -0
  4. package/dist/bbui.es.js.map +1 -0
  5. package/package.json +71 -26
  6. package/src/ActionButton/ActionButton.svelte +102 -0
  7. package/src/ActionGroup/ActionGroup.svelte +26 -0
  8. package/src/ActionMenu/ActionMenu.svelte +44 -0
  9. package/src/Actions/ClickOutside.svench.svx +30 -0
  10. package/src/Actions/PositionDropdown.svench.svx +81 -0
  11. package/src/Actions/autoresize_textarea.js +14 -0
  12. package/src/Actions/click_outside.js +18 -0
  13. package/src/Actions/position_dropdown.js +66 -0
  14. package/src/Avatar/Avatar.svelte +62 -0
  15. package/src/Badge/Badge.svelte +29 -0
  16. package/src/Banner/Banner.svelte +72 -0
  17. package/src/Banner/BannerDisplay.svelte +31 -0
  18. package/src/Button/Button.svelte +114 -0
  19. package/src/Button/Button.svench +138 -0
  20. package/src/ButtonGroup/ButtonGroup.svelte +30 -0
  21. package/src/ClearButton/ClearButton.svelte +19 -0
  22. package/src/ColorPicker/ColorPicker.svelte +297 -0
  23. package/src/DetailSummary/DetailSummary.svelte +83 -0
  24. package/src/Divider/Divider.svelte +28 -0
  25. package/src/Drawer/Drawer.svelte +113 -0
  26. package/src/Drawer/Drawer.svench +42 -0
  27. package/src/Drawer/DrawerContent.svelte +46 -0
  28. package/src/Form/Checkbox.svelte +23 -0
  29. package/src/Form/Combobox.svelte +45 -0
  30. package/src/Form/Core/Checkbox.svelte +69 -0
  31. package/src/Form/Core/CheckboxGroup.svelte +68 -0
  32. package/src/Form/Core/Combobox.svelte +142 -0
  33. package/src/Form/Core/DatePicker.svelte +242 -0
  34. package/src/Form/Core/Dropzone.svelte +438 -0
  35. package/src/Form/Core/InputDropdown.svelte +228 -0
  36. package/src/Form/Core/Multiselect.svelte +90 -0
  37. package/src/Form/Core/Picker.svelte +259 -0
  38. package/src/Form/Core/PickerDropdown.svelte +436 -0
  39. package/src/Form/Core/RadioGroup.svelte +47 -0
  40. package/src/Form/Core/RichTextField.svelte +42 -0
  41. package/src/Form/Core/Search.svelte +105 -0
  42. package/src/Form/Core/Select.svelte +75 -0
  43. package/src/Form/Core/Slider.svelte +86 -0
  44. package/src/Form/Core/Stepper.svelte +172 -0
  45. package/src/Form/Core/Switch.svelte +37 -0
  46. package/src/Form/Core/TextArea.svelte +78 -0
  47. package/src/Form/Core/TextField.svelte +119 -0
  48. package/src/Form/Core/index.js +15 -0
  49. package/src/Form/DatePicker.svelte +37 -0
  50. package/src/Form/Dropzone.svelte +40 -0
  51. package/src/Form/Field.svelte +42 -0
  52. package/src/Form/FieldLabel.svelte +32 -0
  53. package/src/Form/Input.svelte +40 -45
  54. package/src/Form/InputDropdown.svelte +55 -0
  55. package/src/Form/Multiselect.svelte +40 -0
  56. package/src/Form/PickerDropdown.svelte +132 -0
  57. package/src/Form/RadioGroup.svelte +40 -0
  58. package/src/Form/RichTextField.svelte +36 -0
  59. package/src/Form/Search.svelte +36 -0
  60. package/src/Form/Select.svelte +48 -43
  61. package/src/Form/Slider.svelte +24 -0
  62. package/src/Form/Stepper.svelte +45 -0
  63. package/src/Form/TextArea.svelte +29 -44
  64. package/src/Form/Toggle.svelte +23 -0
  65. package/src/Icon/Icon.svelte +86 -0
  66. package/src/IconPicker/IconPicker.svelte +177 -0
  67. package/src/IconSideNav/IconSideNav.svelte +14 -0
  68. package/src/IconSideNav/IconSideNavItem.svelte +56 -0
  69. package/src/InlineAlert/InlineAlert.svelte +56 -0
  70. package/src/Label/Label.svelte +20 -0
  71. package/src/Layout/Layout.svelte +94 -0
  72. package/src/Layout/Page.svelte +32 -0
  73. package/src/Link/Link.svelte +22 -0
  74. package/src/List/List.svelte +28 -0
  75. package/src/List/ListItem.svelte +92 -0
  76. package/src/Markdown/MarkdownEditor.svelte +60 -0
  77. package/src/Markdown/MarkdownViewer.svelte +70 -0
  78. package/src/Markdown/SpectrumMDE.svelte +184 -0
  79. package/src/Menu/Item.svelte +45 -0
  80. package/src/Menu/Menu.svelte +7 -0
  81. package/src/Menu/Menu.svench +19 -0
  82. package/src/Menu/Section.svelte +10 -0
  83. package/src/Menu/Separator.svelte +1 -0
  84. package/src/Modal/Content.svelte +6 -0
  85. package/src/Modal/CustomContent.svelte +38 -0
  86. package/src/Modal/Modal.svelte +142 -0
  87. package/src/Modal/Modal.svench +117 -0
  88. package/src/Modal/ModalContent.svelte +190 -0
  89. package/src/Modal/QuizModal.svelte +54 -0
  90. package/src/Notification/Notification.svelte +70 -0
  91. package/src/Notification/NotificationDisplay.svelte +43 -0
  92. package/src/Pagination/Pagination.svelte +57 -0
  93. package/src/Popover/Popover.svelte +77 -0
  94. package/src/Popover/Popover.svench +121 -0
  95. package/src/ProgressBar/ProgressBar.svelte +54 -0
  96. package/src/ProgressCircle/ProgressCircle.svelte +62 -0
  97. package/src/SideNavigation/Item.svelte +47 -0
  98. package/src/SideNavigation/Navigation.svelte +12 -0
  99. package/src/StatusLight/StatusLight.svelte +80 -0
  100. package/src/Stores/Notifications.svench.svx +78 -0
  101. package/src/Stores/banner.js +37 -0
  102. package/src/Stores/notifications.js +84 -0
  103. package/src/Table/ArrayRenderer.svelte +17 -0
  104. package/src/Table/AttachmentRenderer.svelte +57 -0
  105. package/src/Table/BoldRenderer.svelte +15 -0
  106. package/src/Table/BooleanRenderer.svelte +42 -0
  107. package/src/Table/CellRenderer.svelte +69 -0
  108. package/src/Table/CodeRenderer.svelte +14 -0
  109. package/src/Table/DateTimeRenderer.svelte +29 -0
  110. package/src/Table/InternalRenderer.svelte +24 -0
  111. package/src/Table/RelationshipRenderer.svelte +40 -0
  112. package/src/Table/SelectEditRenderer.svelte +28 -0
  113. package/src/Table/StringRenderer.svelte +14 -0
  114. package/src/Table/Table.svelte +648 -0
  115. package/src/Table/index.js +1 -0
  116. package/src/Tabs/Tab.svelte +88 -0
  117. package/src/Tabs/Tabs.svelte +125 -0
  118. package/src/Tags/Tag.svelte +43 -0
  119. package/src/Tags/Tags.svelte +7 -0
  120. package/src/Tooltip/Tooltip.svelte +34 -0
  121. package/src/Tooltip/TooltipWrapper.svelte +60 -0
  122. package/src/TreeView/Item.svelte +41 -0
  123. package/src/TreeView/Tree.svelte +16 -0
  124. package/src/Typography/Body.svelte +21 -0
  125. package/src/Typography/Code.svelte +10 -0
  126. package/src/Typography/Detail.svelte +19 -0
  127. package/src/Typography/Heading.svelte +17 -0
  128. package/src/bbui.css +96 -0
  129. package/src/context.js +3 -0
  130. package/src/helpers.js +134 -0
  131. package/src/index.js +97 -11
  132. package/src/spectrum-icons-rollup.js +31 -0
  133. package/src/spectrum-icons-vite.js +31 -0
  134. package/dist/bundle.css +0 -7
  135. package/dist/bundle.css.map +0 -20
  136. package/dist/index.js +0 -1100
  137. package/dist/index.mjs +0 -1086
  138. package/src/Branding/Budibase-logo.svelte +0 -68
  139. package/src/Branding/Logo.svelte +0 -16
  140. package/src/Branding/Logo.svench +0 -8
  141. package/src/Form/Button.svelte +0 -131
  142. package/src/Form/Button.svench +0 -49
  143. package/src/Form/Input.svench +0 -8
  144. package/src/Form/Select.svench +0 -8
  145. package/src/Form/TextArea.svench +0 -8
  146. package/src/Links/Home.svelte +0 -49
  147. package/src/Links/Home.svench +0 -19
  148. package/src/List/Items/DetailSummary.svelte +0 -66
  149. package/src/List/Items/DetailSummary.svench +0 -15
  150. package/src/actions/autoresize_textarea.js +0 -14
  151. package/src/icons/Contribution.svelte +0 -14
  152. package/src/index.svench.svx +0 -35
@@ -0,0 +1,436 @@
1
+ <script>
2
+ import "@spectrum-css/inputgroup/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 Icon from "../../Icon/Icon.svelte"
9
+ import StatusLight from "../../StatusLight/StatusLight.svelte"
10
+ import Detail from "../../Typography/Detail.svelte"
11
+ import Search from "./Search.svelte"
12
+
13
+ export let primaryLabel = ""
14
+ export let primaryValue = null
15
+ export let id = null
16
+ export let placeholder = "Choose an option or type"
17
+ export let disabled = false
18
+ export let readonly = false
19
+ export let updateOnChange = true
20
+ export let error = null
21
+ export let secondaryOptions = []
22
+ export let primaryOptions = []
23
+ export let secondaryFieldText = ""
24
+ export let secondaryFieldIcon = ""
25
+ export let secondaryFieldColour = ""
26
+ export let getPrimaryOptionValue = option => option
27
+ export let getPrimaryOptionColour = () => null
28
+ export let getPrimaryOptionIcon = () => null
29
+ export let getSecondaryOptionLabel = option => option
30
+ export let getSecondaryOptionValue = option => option
31
+ export let getSecondaryOptionColour = () => null
32
+ export let onSelectOption = () => {}
33
+ export let autoWidth = false
34
+ export let autocomplete = false
35
+ export let isOptionSelected = () => false
36
+ export let isPlaceholder = false
37
+ export let placeholderOption = null
38
+
39
+ const dispatch = createEventDispatcher()
40
+ let primaryOpen = false
41
+ let secondaryOpen = false
42
+ let focus = false
43
+ let searchTerm = null
44
+
45
+ $: groupTitles = Object.keys(primaryOptions)
46
+ let iconData
47
+
48
+ const updateSearch = e => {
49
+ dispatch("search", e.detail)
50
+ }
51
+
52
+ const updateValue = newValue => {
53
+ if (readonly) {
54
+ return
55
+ }
56
+ dispatch("change", newValue)
57
+ }
58
+
59
+ const onClickSecondary = () => {
60
+ dispatch("click")
61
+ if (readonly) {
62
+ return
63
+ }
64
+ secondaryOpen = true
65
+ }
66
+
67
+ const onPickPrimary = newValue => {
68
+ dispatch("pickprimary", newValue)
69
+ primaryOpen = false
70
+ }
71
+
72
+ const onClearPrimary = () => {
73
+ dispatch("pickprimary", null)
74
+ primaryOpen = false
75
+ }
76
+
77
+ const onPickSecondary = newValue => {
78
+ dispatch("picksecondary", newValue)
79
+ secondaryOpen = false
80
+ }
81
+
82
+ const onBlur = event => {
83
+ if (readonly) {
84
+ return
85
+ }
86
+ focus = false
87
+ updateValue(event.target.value)
88
+ }
89
+
90
+ const onInput = event => {
91
+ if (readonly || !updateOnChange) {
92
+ return
93
+ }
94
+ updateValue(event.target.value)
95
+ }
96
+
97
+ const updateValueOnEnter = event => {
98
+ if (readonly) {
99
+ return
100
+ }
101
+ if (event.key === "Enter") {
102
+ updateValue(event.target.value)
103
+ }
104
+ }
105
+ </script>
106
+
107
+ <div
108
+ class="spectrum-InputGroup"
109
+ class:is-invalid={!!error}
110
+ class:is-disabled={disabled}
111
+ >
112
+ <div
113
+ class="spectrum-Textfield spectrum-InputGroup-textfield"
114
+ class:is-invalid={!!error}
115
+ class:is-disabled={disabled}
116
+ class:is-focused={focus}
117
+ class:is-full-width={!secondaryOptions.length}
118
+ >
119
+ {#if iconData}
120
+ <svg
121
+ width="16px"
122
+ height="16px"
123
+ class="spectrum-Icon iconPadding"
124
+ style="color: {iconData?.color}"
125
+ focusable="false"
126
+ >
127
+ <use xlink:href="#spectrum-icon-18-{iconData?.icon}" />
128
+ </svg>
129
+ {/if}
130
+ <input
131
+ {id}
132
+ on:click={() => (primaryOpen = true)}
133
+ on:blur
134
+ on:focus
135
+ on:input
136
+ on:keyup
137
+ on:blur={onBlur}
138
+ on:input={onInput}
139
+ on:keyup={updateValueOnEnter}
140
+ value={primaryLabel || ""}
141
+ placeholder={placeholder || ""}
142
+ {disabled}
143
+ {readonly}
144
+ class="spectrum-Textfield-input spectrum-InputGroup-input"
145
+ class:labelPadding={iconData}
146
+ />
147
+ {#if primaryValue}
148
+ <button
149
+ on:click={() => onClearPrimary()}
150
+ type="reset"
151
+ class="spectrum-ClearButton spectrum-Search-clearButton"
152
+ >
153
+ <svg
154
+ class="spectrum-Icon spectrum-UIIcon-Cross75"
155
+ focusable="false"
156
+ aria-hidden="true"
157
+ >
158
+ <use xlink:href="#spectrum-css-icon-Cross75" />
159
+ </svg>
160
+ </button>
161
+ {/if}
162
+ </div>
163
+ {#if primaryOpen}
164
+ <div
165
+ use:clickOutside={() => (primaryOpen = false)}
166
+ transition:fly|local={{ y: -20, duration: 200 }}
167
+ class="spectrum-Popover spectrum-Popover--bottom spectrum-Picker-popover is-open"
168
+ class:auto-width={autoWidth}
169
+ class:is-full-width={!secondaryOptions.length}
170
+ >
171
+ {#if autocomplete}
172
+ <Search
173
+ value={searchTerm}
174
+ on:change={event => updateSearch(event)}
175
+ {disabled}
176
+ placeholder="Search"
177
+ />
178
+ {/if}
179
+
180
+ <ul class="spectrum-Menu" role="listbox">
181
+ {#if placeholderOption}
182
+ <li
183
+ class="spectrum-Menu-item placeholder"
184
+ class:is-selected={isPlaceholder}
185
+ role="option"
186
+ aria-selected="true"
187
+ tabindex="0"
188
+ on:click={() => onSelectOption(null)}
189
+ >
190
+ <span class="spectrum-Menu-itemLabel">{placeholderOption}</span>
191
+ <svg
192
+ class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
193
+ focusable="false"
194
+ aria-hidden="true"
195
+ >
196
+ <use xlink:href="#spectrum-css-icon-Checkmark100" />
197
+ </svg>
198
+ </li>
199
+ {/if}
200
+ {#each groupTitles as title}
201
+ <div class="spectrum-Menu-item">
202
+ <Detail>{title}</Detail>
203
+ </div>
204
+ {#if primaryOptions}
205
+ {#each primaryOptions[title].data as option, idx}
206
+ <li
207
+ class="spectrum-Menu-item"
208
+ class:is-selected={isOptionSelected(
209
+ getPrimaryOptionValue(option, idx)
210
+ )}
211
+ role="option"
212
+ aria-selected="true"
213
+ tabindex="0"
214
+ on:click={() =>
215
+ onPickPrimary({
216
+ value: primaryOptions[title].getValue(option),
217
+ label: primaryOptions[title].getLabel(option),
218
+ })}
219
+ >
220
+ {#if primaryOptions[title].getIcon(option)}
221
+ <div
222
+ style="background: {primaryOptions[title].getColour(
223
+ option
224
+ )};"
225
+ class="circle"
226
+ >
227
+ <div>
228
+ <Icon
229
+ size="S"
230
+ name={primaryOptions[title].getIcon(option)}
231
+ />
232
+ </div>
233
+ </div>
234
+ {:else if getPrimaryOptionColour(option, idx)}
235
+ <span class="option-left">
236
+ <StatusLight
237
+ square
238
+ color={getPrimaryOptionColour(option, idx)}
239
+ />
240
+ </span>
241
+ {/if}
242
+ <span class="spectrum-Menu-itemLabel">
243
+ <span
244
+ class:spacing-group={primaryOptions[title].getIcon(option)}
245
+ >
246
+ {primaryOptions[title].getLabel(option)}
247
+ <span />
248
+ </span>
249
+ <svg
250
+ class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
251
+ focusable="false"
252
+ aria-hidden="true"
253
+ >
254
+ <use xlink:href="#spectrum-css-icon-Checkmark100" />
255
+ </svg>
256
+ {#if getPrimaryOptionIcon(option, idx) && getPrimaryOptionColour(option, idx)}
257
+ <span class="option-right">
258
+ <StatusLight
259
+ square
260
+ color={getPrimaryOptionColour(option, idx)}
261
+ />
262
+ </span>
263
+ {/if}
264
+ </span>
265
+ </li>
266
+ {/each}
267
+ {/if}
268
+ {/each}
269
+ </ul>
270
+ </div>
271
+ {/if}
272
+ {#if secondaryOptions.length}
273
+ <div style="width: 30%">
274
+ <button
275
+ {id}
276
+ class="spectrum-Picker spectrum-Picker--sizeM override-borders"
277
+ {disabled}
278
+ class:is-open={secondaryOpen}
279
+ aria-haspopup="listbox"
280
+ on:mousedown={onClickSecondary}
281
+ >
282
+ {#if secondaryFieldIcon}
283
+ <span class="option-left">
284
+ <Icon name={secondaryFieldIcon} />
285
+ </span>
286
+ {:else if secondaryFieldColour}
287
+ <span class="option-left">
288
+ <StatusLight square color={secondaryFieldColour} />
289
+ </span>
290
+ {/if}
291
+
292
+ <span class:auto-width={autoWidth} class="spectrum-Picker-label">
293
+ {secondaryFieldText}
294
+ </span>
295
+ <svg
296
+ class="spectrum-Icon spectrum-UIIcon-ChevronDown100 spectrum-Picker-menuIcon"
297
+ focusable="false"
298
+ aria-hidden="true"
299
+ >
300
+ <use xlink:href="#spectrum-css-icon-Chevron100" />
301
+ </svg>
302
+ </button>
303
+ {#if secondaryOpen}
304
+ <div
305
+ use:clickOutside={() => (secondaryOpen = false)}
306
+ transition:fly|local={{ y: -20, duration: 200 }}
307
+ class="spectrum-Popover spectrum-Popover--bottom spectrum-Picker-popover is-open"
308
+ style="width: 30%"
309
+ >
310
+ <ul class="spectrum-Menu" role="listbox">
311
+ {#each secondaryOptions as option, idx}
312
+ <li
313
+ class="spectrum-Menu-item"
314
+ class:is-selected={isOptionSelected(
315
+ getSecondaryOptionValue(option, idx)
316
+ )}
317
+ role="option"
318
+ aria-selected="true"
319
+ tabindex="0"
320
+ on:click={() =>
321
+ onPickSecondary(getSecondaryOptionValue(option, idx))}
322
+ >
323
+ {#if getSecondaryOptionColour(option, idx)}
324
+ <span class="option-left">
325
+ <StatusLight
326
+ square
327
+ color={getSecondaryOptionColour(option, idx)}
328
+ />
329
+ </span>
330
+ {/if}
331
+
332
+ <span class="spectrum-Menu-itemLabel">
333
+ {getSecondaryOptionLabel(option, idx)}
334
+ </span>
335
+ <svg
336
+ class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
337
+ focusable="false"
338
+ aria-hidden="true"
339
+ >
340
+ <use xlink:href="#spectrum-css-icon-Checkmark100" />
341
+ </svg>
342
+ </li>
343
+ {/each}
344
+ </ul>
345
+ </div>
346
+ {/if}
347
+ </div>
348
+ {/if}
349
+ </div>
350
+
351
+ <style>
352
+ .spacing-group {
353
+ margin-left: var(--spacing-m);
354
+ }
355
+ .spectrum-InputGroup {
356
+ min-width: 0;
357
+ width: 100%;
358
+ }
359
+ .spectrum-InputGroup :global(.spectrum-Search-input) {
360
+ border: none;
361
+ border-bottom: 1px solid var(--spectrum-global-color-gray-300);
362
+ border-bottom-left-radius: 0;
363
+ border-bottom-right-radius: 0;
364
+ }
365
+
366
+ .override-borders {
367
+ border-top-left-radius: 0px;
368
+ border-bottom-left-radius: 0px;
369
+ }
370
+
371
+ .spectrum-Popover {
372
+ max-height: 240px;
373
+ z-index: 999;
374
+ top: 100%;
375
+ }
376
+
377
+ .option-left {
378
+ padding-right: 8px;
379
+ }
380
+ .option-right {
381
+ padding-left: 8px;
382
+ }
383
+
384
+ .circle {
385
+ border-radius: 50%;
386
+ height: 28px;
387
+ color: white;
388
+ font-weight: bold;
389
+ line-height: 48px;
390
+ font-size: 1.2em;
391
+ width: 28px;
392
+ position: relative;
393
+ }
394
+
395
+ .circle > div {
396
+ position: absolute;
397
+ text-decoration: none;
398
+ top: 50%;
399
+ left: 50%;
400
+ transform: translateX(-50%) translateY(-50%);
401
+ }
402
+
403
+ .iconPadding {
404
+ position: absolute;
405
+ top: 50%;
406
+ left: 10px;
407
+ transform: translateY(-50%);
408
+ color: silver;
409
+ margin-right: 10px;
410
+ }
411
+
412
+ .labelPadding {
413
+ padding-left: calc(1em + 10px + 8px);
414
+ }
415
+
416
+ .spectrum-Textfield.spectrum-InputGroup-textfield {
417
+ width: 70%;
418
+ }
419
+ .spectrum-Textfield.spectrum-InputGroup-textfield.is-full-width {
420
+ width: 100%;
421
+ }
422
+ .spectrum-Textfield.spectrum-InputGroup-textfield.is-full-width input {
423
+ border-right-width: thin;
424
+ }
425
+
426
+ .spectrum-Popover.spectrum-Popover--bottom.spectrum-Picker-popover.is-open {
427
+ width: 70%;
428
+ }
429
+ .spectrum-Popover.spectrum-Popover--bottom.spectrum-Picker-popover.is-open.is-full-width {
430
+ width: 100%;
431
+ }
432
+
433
+ .spectrum-Search-clearButton {
434
+ position: absolute;
435
+ }
436
+ </style>
@@ -0,0 +1,47 @@
1
+ <script>
2
+ import "@spectrum-css/fieldgroup/dist/index-vars.css"
3
+ import "@spectrum-css/radio/dist/index-vars.css"
4
+ import { createEventDispatcher } from "svelte"
5
+
6
+ export let direction = "vertical"
7
+ export let value = null
8
+ export let options = []
9
+ export let error = null
10
+ export let disabled = false
11
+ export let getOptionLabel = option => option
12
+ export let getOptionValue = option => option
13
+
14
+ const dispatch = createEventDispatcher()
15
+ const onChange = e => dispatch("change", e.target.value)
16
+ </script>
17
+
18
+ <div class={`spectrum-FieldGroup spectrum-FieldGroup--${direction}`}>
19
+ {#if options && Array.isArray(options)}
20
+ {#each options as option}
21
+ <div
22
+ title={getOptionLabel(option)}
23
+ class="spectrum-Radio spectrum-FieldGroup-item spectrum-Radio--emphasized"
24
+ class:is-invalid={!!error}
25
+ >
26
+ <input
27
+ on:change={onChange}
28
+ bind:group={value}
29
+ value={getOptionValue(option)}
30
+ type="radio"
31
+ class="spectrum-Radio-input"
32
+ {disabled}
33
+ />
34
+ <span class="spectrum-Radio-button" />
35
+ <label for="" class="spectrum-Radio-label">
36
+ {getOptionLabel(option)}
37
+ </label>
38
+ </div>
39
+ {/each}
40
+ {/if}
41
+ </div>
42
+
43
+ <style>
44
+ .spectrum-Radio-input {
45
+ opacity: 0;
46
+ }
47
+ </style>
@@ -0,0 +1,42 @@
1
+ <script>
2
+ import MarkdownEditor from "../../Markdown/MarkdownEditor.svelte"
3
+
4
+ export let value = ""
5
+ export let placeholder = null
6
+ export let disabled = false
7
+ export let error = null
8
+ export let height = null
9
+ export let id = null
10
+ export let fullScreenOffset = null
11
+ export let easyMDEOptions = null
12
+ </script>
13
+
14
+ <div class:error>
15
+ <MarkdownEditor
16
+ {value}
17
+ {placeholder}
18
+ {height}
19
+ {id}
20
+ {fullScreenOffset}
21
+ {disabled}
22
+ {easyMDEOptions}
23
+ on:change
24
+ />
25
+ </div>
26
+
27
+ <style>
28
+ .error :global(.EasyMDEContainer .editor-toolbar) {
29
+ border-top-color: var(--spectrum-semantic-negative-color-default);
30
+ border-left-color: var(--spectrum-semantic-negative-color-default);
31
+ border-right-color: var(--spectrum-semantic-negative-color-default);
32
+ }
33
+ .error :global(.EasyMDEContainer .CodeMirror) {
34
+ border-bottom-color: var(--spectrum-semantic-negative-color-default);
35
+ border-left-color: var(--spectrum-semantic-negative-color-default);
36
+ border-right-color: var(--spectrum-semantic-negative-color-default);
37
+ }
38
+ .error :global(.EasyMDEContainer .editor-preview-side) {
39
+ border-bottom-color: var(--spectrum-semantic-negative-color-default);
40
+ border-right-color: var(--spectrum-semantic-negative-color-default);
41
+ }
42
+ </style>
@@ -0,0 +1,105 @@
1
+ <script>
2
+ import "@spectrum-css/search/dist/index-vars.css"
3
+ import { createEventDispatcher } from "svelte"
4
+
5
+ export let value = null
6
+ export let placeholder = null
7
+ export let disabled = false
8
+ export let id = null
9
+ export let updateOnChange = true
10
+ export let quiet = false
11
+ export let inputRef
12
+
13
+ const dispatch = createEventDispatcher()
14
+ let focus = false
15
+
16
+ const updateValue = value => {
17
+ dispatch("change", value)
18
+ }
19
+
20
+ const onFocus = () => {
21
+ focus = true
22
+ }
23
+
24
+ const onBlur = event => {
25
+ focus = false
26
+ updateValue(event.target.value)
27
+ }
28
+
29
+ const onInput = event => {
30
+ if (!updateOnChange) {
31
+ return
32
+ }
33
+ updateValue(event.target.value)
34
+ }
35
+
36
+ const updateValueOnEnter = event => {
37
+ if (event.key === "Enter") {
38
+ updateValue(event.target.value)
39
+ }
40
+ }
41
+ </script>
42
+
43
+ <div class="spectrum-Search" class:is-disabled={disabled}>
44
+ <div
45
+ class="spectrum-Textfield"
46
+ class:spectrum-Textfield--quiet={quiet}
47
+ class:is-focused={focus}
48
+ class:is-disabled={disabled}
49
+ >
50
+ <svg
51
+ class="spectrum-Icon spectrum-Icon--sizeM spectrum-Textfield-icon"
52
+ focusable="false"
53
+ aria-hidden="true"
54
+ >
55
+ <use xlink:href="#spectrum-icon-18-Magnify" />
56
+ </svg>
57
+ <input
58
+ {disabled}
59
+ {id}
60
+ value={value || ""}
61
+ placeholder={placeholder || ""}
62
+ on:click
63
+ on:blur
64
+ on:focus
65
+ on:input
66
+ on:blur={onBlur}
67
+ on:focus={onFocus}
68
+ on:input={onInput}
69
+ on:keyup={updateValueOnEnter}
70
+ type="search"
71
+ class="spectrum-Textfield-input spectrum-Search-input"
72
+ autocomplete="off"
73
+ bind:this={inputRef}
74
+ />
75
+ </div>
76
+ <button
77
+ on:click={() => updateValue("")}
78
+ type="reset"
79
+ class="spectrum-ClearButton spectrum-Search-clearButton"
80
+ >
81
+ <svg
82
+ class="spectrum-Icon spectrum-UIIcon-Cross75"
83
+ focusable="false"
84
+ aria-hidden="true"
85
+ >
86
+ <use xlink:href="#spectrum-css-icon-Cross75" />
87
+ </svg>
88
+ </button>
89
+ </div>
90
+
91
+ <style>
92
+ .spectrum-Search,
93
+ .spectrum-Textfield {
94
+ width: 100%;
95
+ }
96
+ .spectrum-Search-input {
97
+ padding-right: 24px;
98
+ }
99
+ .is-disabled {
100
+ pointer-events: none;
101
+ }
102
+ .spectrum-Search-clearButton {
103
+ position: absolute;
104
+ }
105
+ </style>
@@ -0,0 +1,75 @@
1
+ <script>
2
+ import { createEventDispatcher } from "svelte"
3
+ import Picker from "./Picker.svelte"
4
+
5
+ export let value = null
6
+ export let id = null
7
+ export let placeholder = "Choose an option"
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 getOptionIcon = () => null
14
+ export let getOptionColour = () => null
15
+ export let readonly = false
16
+ export let quiet = false
17
+ export let autoWidth = false
18
+ export let autocomplete = false
19
+ export let sort = false
20
+ const dispatch = createEventDispatcher()
21
+ let open = false
22
+ $: fieldText = getFieldText(value, options, placeholder)
23
+ $: fieldIcon = getFieldAttribute(getOptionIcon, value, options)
24
+ $: fieldColour = getFieldAttribute(getOptionColour, value, options)
25
+
26
+ const getFieldAttribute = (getAttribute, value, options) => {
27
+ // Wait for options to load if there is a value but no options
28
+ if (!options?.length) {
29
+ return ""
30
+ }
31
+ const index = options.findIndex(
32
+ (option, idx) => getOptionValue(option, idx) === value
33
+ )
34
+ return index !== -1 ? getAttribute(options[index], index) : null
35
+ }
36
+
37
+ const getFieldText = (value, options, placeholder) => {
38
+ // Always use placeholder if no value
39
+ if (value == null || value === "") {
40
+ return placeholder || "Choose an option"
41
+ }
42
+
43
+ return getFieldAttribute(getOptionLabel, value, options)
44
+ }
45
+
46
+ const selectOption = value => {
47
+ dispatch("change", value)
48
+ open = false
49
+ }
50
+ </script>
51
+
52
+ <Picker
53
+ on:click
54
+ bind:open
55
+ {quiet}
56
+ {id}
57
+ {error}
58
+ {disabled}
59
+ {readonly}
60
+ {fieldText}
61
+ {fieldIcon}
62
+ {fieldColour}
63
+ {options}
64
+ {autoWidth}
65
+ {getOptionLabel}
66
+ {getOptionValue}
67
+ {getOptionIcon}
68
+ {getOptionColour}
69
+ {autocomplete}
70
+ {sort}
71
+ isPlaceholder={value == null || value === ""}
72
+ placeholderOption={placeholder}
73
+ isOptionSelected={option => option === value}
74
+ onSelectOption={selectOption}
75
+ />