@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,431 @@
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
+ import IconAvatar from "../../Icon/IconAvatar.svelte"
13
+
14
+ export let primaryLabel = ""
15
+ export let primaryValue = null
16
+ export let id = null
17
+ export let placeholder = "Choose an option or type"
18
+ export let disabled = false
19
+ export let error = null
20
+ export let secondaryOptions = []
21
+ export let primaryOptions = []
22
+ export let secondaryFieldText = ""
23
+ export let secondaryFieldIcon = ""
24
+ export let secondaryFieldColour = ""
25
+ export let getPrimaryOptionValue = option => option
26
+ export let getPrimaryOptionColour = () => null
27
+ export let getPrimaryOptionIcon = () => null
28
+ export let getSecondaryOptionLabel = option => option
29
+ export let getSecondaryOptionValue = option => option
30
+ export let getSecondaryOptionColour = () => null
31
+ export let onSelectOption = () => {}
32
+ export let autoWidth = false
33
+ export let autocomplete = false
34
+ export let isOptionSelected = () => false
35
+ export let isPlaceholder = false
36
+ export let placeholderOption = null
37
+ export let showClearIcon = true
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
+ dispatch("change", newValue)
54
+ }
55
+
56
+ const onClickSecondary = () => {
57
+ dispatch("click")
58
+ secondaryOpen = true
59
+ }
60
+
61
+ const onPickPrimary = newValue => {
62
+ dispatch("pickprimary", newValue)
63
+ primaryOpen = false
64
+ dispatch("closed")
65
+ }
66
+
67
+ const onClearPrimary = () => {
68
+ dispatch("pickprimary", null)
69
+ primaryOpen = false
70
+ }
71
+
72
+ const onPickSecondary = newValue => {
73
+ dispatch("picksecondary", newValue)
74
+ secondaryOpen = false
75
+ }
76
+
77
+ const onBlur = event => {
78
+ focus = false
79
+ updateValue(event.target.value)
80
+ }
81
+
82
+ const onInput = event => {
83
+ updateValue(event.target.value)
84
+ }
85
+
86
+ const updateValueOnEnter = event => {
87
+ if (event.key === "Enter") {
88
+ updateValue(event.target.value)
89
+ }
90
+ }
91
+
92
+ const handlePrimaryOutsideClick = event => {
93
+ if (primaryOpen) {
94
+ event.stopPropagation()
95
+ primaryOpen = false
96
+ dispatch("closed")
97
+ }
98
+ }
99
+
100
+ const handleSecondaryOutsideClick = event => {
101
+ if (secondaryOpen) {
102
+ event.stopPropagation()
103
+ secondaryOpen = false
104
+ }
105
+ }
106
+ </script>
107
+
108
+ <div
109
+ class="spectrum-InputGroup"
110
+ class:is-invalid={!!error}
111
+ class:is-disabled={disabled}
112
+ >
113
+ <div
114
+ class="spectrum-Textfield spectrum-InputGroup-textfield"
115
+ class:is-invalid={!!error}
116
+ class:is-disabled={disabled}
117
+ class:is-focused={focus}
118
+ class:is-full-width={!secondaryOptions.length}
119
+ >
120
+ {#if iconData}
121
+ <svg
122
+ width="16px"
123
+ height="16px"
124
+ class="spectrum-Icon iconPadding"
125
+ style="color: {iconData?.color}"
126
+ focusable="false"
127
+ >
128
+ <use xlink:href="#spectrum-icon-18-{iconData?.icon}" />
129
+ </svg>
130
+ {/if}
131
+ <input
132
+ {id}
133
+ on:click={() => (primaryOpen = true)}
134
+ on:blur
135
+ on:focus
136
+ on:input
137
+ on:keyup
138
+ on:blur={onBlur}
139
+ on:input={onInput}
140
+ on:keyup={updateValueOnEnter}
141
+ value={primaryLabel || ""}
142
+ placeholder={placeholder || ""}
143
+ {disabled}
144
+ readonly
145
+ class="spectrum-Textfield-input spectrum-InputGroup-input"
146
+ class:labelPadding={iconData}
147
+ class:open={primaryOpen}
148
+ />
149
+ {#if primaryValue && showClearIcon}
150
+ <button
151
+ on:click={() => onClearPrimary()}
152
+ type="reset"
153
+ class="spectrum-ClearButton spectrum-Search-clearButton"
154
+ >
155
+ <svg
156
+ class="spectrum-Icon spectrum-UIIcon-Cross75"
157
+ focusable="false"
158
+ aria-hidden="true"
159
+ >
160
+ <use xlink:href="#spectrum-css-icon-Cross75" />
161
+ </svg>
162
+ </button>
163
+ {/if}
164
+ </div>
165
+ {#if primaryOpen}
166
+ <div
167
+ use:clickOutside={handlePrimaryOutsideClick}
168
+ transition:fly|local={{ y: -20, duration: 200 }}
169
+ class="spectrum-Popover spectrum-Popover--bottom spectrum-Picker-popover is-open"
170
+ class:auto-width={autoWidth}
171
+ class:is-full-width={!secondaryOptions.length}
172
+ >
173
+ {#if autocomplete}
174
+ <Search
175
+ value={searchTerm}
176
+ on:change={event => updateSearch(event)}
177
+ {disabled}
178
+ placeholder="Search"
179
+ />
180
+ {/if}
181
+
182
+ <ul class="spectrum-Menu" role="listbox">
183
+ {#if placeholderOption}
184
+ <li
185
+ class="spectrum-Menu-item placeholder"
186
+ class:is-selected={isPlaceholder}
187
+ role="option"
188
+ aria-selected="true"
189
+ tabindex="0"
190
+ on:click={() => onSelectOption(null)}
191
+ >
192
+ <span class="spectrum-Menu-itemLabel">{placeholderOption}</span>
193
+ <svg
194
+ class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
195
+ focusable="false"
196
+ aria-hidden="true"
197
+ >
198
+ <use xlink:href="#spectrum-css-icon-Checkmark100" />
199
+ </svg>
200
+ </li>
201
+ {/if}
202
+ {#each groupTitles as title}
203
+ <div class="spectrum-Menu-item title">
204
+ <Detail>{title}</Detail>
205
+ </div>
206
+ {#if primaryOptions}
207
+ {#each primaryOptions[title].data as option, idx}
208
+ <li
209
+ class="spectrum-Menu-item"
210
+ class:is-selected={isOptionSelected(
211
+ getPrimaryOptionValue(option, idx)
212
+ )}
213
+ role="option"
214
+ aria-selected="true"
215
+ tabindex="0"
216
+ on:click={() =>
217
+ onPickPrimary({
218
+ value: primaryOptions[title].getValue(option),
219
+ label: primaryOptions[title].getLabel(option),
220
+ })}
221
+ >
222
+ {#if primaryOptions[title].getIcon(option)}
223
+ <IconAvatar
224
+ size="S"
225
+ icon={primaryOptions[title].getIcon(option)}
226
+ background={primaryOptions[title].getColour(option)}
227
+ />
228
+ {:else if getPrimaryOptionColour(option, idx)}
229
+ <span class="option-left">
230
+ <StatusLight
231
+ square
232
+ color={getPrimaryOptionColour(option, idx)}
233
+ />
234
+ </span>
235
+ {/if}
236
+ <span class="spectrum-Menu-itemLabel">
237
+ <div
238
+ class="primary-text"
239
+ class:spacing-group={primaryOptions[title].getIcon(option)}
240
+ >
241
+ {primaryOptions[title].getLabel(option)}
242
+ <span />
243
+ </div>
244
+ <svg
245
+ class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
246
+ focusable="false"
247
+ aria-hidden="true"
248
+ >
249
+ <use xlink:href="#spectrum-css-icon-Checkmark100" />
250
+ </svg>
251
+ {#if getPrimaryOptionIcon(option, idx) && getPrimaryOptionColour(option, idx)}
252
+ <span class="option-right">
253
+ <StatusLight
254
+ square
255
+ color={getPrimaryOptionColour(option, idx)}
256
+ />
257
+ </span>
258
+ {/if}
259
+ </span>
260
+ </li>
261
+ {/each}
262
+ {/if}
263
+ {/each}
264
+ </ul>
265
+ </div>
266
+ {/if}
267
+ {#if secondaryOptions.length}
268
+ <div style="width: 30%">
269
+ <button
270
+ {id}
271
+ class="spectrum-Picker spectrum-Picker--sizeM override-borders"
272
+ {disabled}
273
+ class:is-open={secondaryOpen}
274
+ aria-haspopup="listbox"
275
+ on:click={onClickSecondary}
276
+ >
277
+ {#if secondaryFieldIcon}
278
+ <span class="option-left">
279
+ <Icon name={secondaryFieldIcon} />
280
+ </span>
281
+ {:else if secondaryFieldColour}
282
+ <span class="option-left">
283
+ <StatusLight square color={secondaryFieldColour} />
284
+ </span>
285
+ {/if}
286
+
287
+ <span class:auto-width={autoWidth} class="spectrum-Picker-label">
288
+ {secondaryFieldText}
289
+ </span>
290
+ <svg
291
+ class="spectrum-Icon spectrum-UIIcon-ChevronDown100 spectrum-Picker-menuIcon"
292
+ focusable="false"
293
+ aria-hidden="true"
294
+ >
295
+ <use xlink:href="#spectrum-css-icon-Chevron100" />
296
+ </svg>
297
+ </button>
298
+ {#if secondaryOpen}
299
+ <div
300
+ use:clickOutside={handleSecondaryOutsideClick}
301
+ transition:fly|local={{ y: -20, duration: 200 }}
302
+ class="spectrum-Popover spectrum-Popover--bottom spectrum-Picker-popover is-open"
303
+ style="width: 30%"
304
+ >
305
+ <ul class="spectrum-Menu" role="listbox">
306
+ {#each secondaryOptions as option, idx}
307
+ <li
308
+ class="spectrum-Menu-item"
309
+ class:is-selected={isOptionSelected(
310
+ getSecondaryOptionValue(option, idx)
311
+ )}
312
+ role="option"
313
+ aria-selected="true"
314
+ tabindex="0"
315
+ on:click={() =>
316
+ onPickSecondary(getSecondaryOptionValue(option, idx))}
317
+ >
318
+ {#if getSecondaryOptionColour(option, idx)}
319
+ <span class="option-left">
320
+ <StatusLight
321
+ square
322
+ color={getSecondaryOptionColour(option, idx)}
323
+ />
324
+ </span>
325
+ {/if}
326
+
327
+ <span class="spectrum-Menu-itemLabel">
328
+ {getSecondaryOptionLabel(option, idx)}
329
+ </span>
330
+ <svg
331
+ class="spectrum-Icon spectrum-UIIcon-Checkmark100 spectrum-Menu-checkmark spectrum-Menu-itemIcon"
332
+ focusable="false"
333
+ aria-hidden="true"
334
+ >
335
+ <use xlink:href="#spectrum-css-icon-Checkmark100" />
336
+ </svg>
337
+ </li>
338
+ {/each}
339
+ </ul>
340
+ </div>
341
+ {/if}
342
+ </div>
343
+ {/if}
344
+ </div>
345
+
346
+ <style>
347
+ .primary-text {
348
+ white-space: nowrap;
349
+ overflow: hidden;
350
+ text-overflow: ellipsis;
351
+ }
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
+ .iconPadding {
385
+ position: absolute;
386
+ top: 50%;
387
+ left: 10px;
388
+ transform: translateY(-50%);
389
+ color: silver;
390
+ margin-right: 10px;
391
+ }
392
+
393
+ .labelPadding {
394
+ padding-left: calc(1em + 10px + 8px);
395
+ }
396
+
397
+ .spectrum-Textfield.spectrum-InputGroup-textfield {
398
+ width: 70%;
399
+ }
400
+ .spectrum-Textfield.spectrum-InputGroup-textfield.is-full-width {
401
+ width: 100%;
402
+ }
403
+ .spectrum-Textfield.spectrum-InputGroup-textfield.is-full-width input {
404
+ border-right-width: thin;
405
+ }
406
+
407
+ .spectrum-Popover.spectrum-Popover--bottom.spectrum-Picker-popover.is-open {
408
+ width: 70%;
409
+ }
410
+ .spectrum-Popover.spectrum-Popover--bottom.spectrum-Picker-popover.is-open.is-full-width {
411
+ width: 100%;
412
+ }
413
+
414
+ .spectrum-Search-clearButton {
415
+ position: absolute;
416
+ }
417
+
418
+ /* Fix focus borders to show only when opened */
419
+ .spectrum-Textfield-input {
420
+ border-color: var(--spectrum-global-color-gray-400) !important;
421
+ border-right-width: 1px;
422
+ }
423
+ .spectrum-Textfield-input.open {
424
+ border-color: var(--spectrum-global-color-blue-400) !important;
425
+ }
426
+
427
+ /* Fix being able to hover and select titles */
428
+ .spectrum-Menu-item.title {
429
+ pointer-events: none;
430
+ }
431
+ </style>
@@ -0,0 +1,65 @@
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
+ export let getOptionTitle = option => option
14
+ export let sort = false
15
+
16
+ const dispatch = createEventDispatcher()
17
+ const onChange = e => dispatch("change", e.target.value)
18
+
19
+ const getSortedOptions = (options, getLabel, sort) => {
20
+ if (!options?.length || !Array.isArray(options)) {
21
+ return []
22
+ }
23
+ if (!sort) {
24
+ return options
25
+ }
26
+ return [...options].sort((a, b) => {
27
+ const labelA = getLabel(a)
28
+ const labelB = getLabel(b)
29
+ return labelA > labelB ? 1 : -1
30
+ })
31
+ }
32
+
33
+ $: parsedOptions = getSortedOptions(options, getOptionLabel, sort)
34
+ </script>
35
+
36
+ <div class={`spectrum-FieldGroup spectrum-FieldGroup--${direction}`}>
37
+ {#if parsedOptions && Array.isArray(parsedOptions)}
38
+ {#each parsedOptions as option}
39
+ <div
40
+ title={getOptionTitle(option)}
41
+ class="spectrum-Radio spectrum-FieldGroup-item spectrum-Radio--emphasized"
42
+ class:is-invalid={!!error}
43
+ >
44
+ <input
45
+ on:change={onChange}
46
+ bind:group={value}
47
+ value={getOptionValue(option)}
48
+ type="radio"
49
+ class="spectrum-Radio-input"
50
+ {disabled}
51
+ />
52
+ <span class="spectrum-Radio-button" />
53
+ <label for="" class="spectrum-Radio-label">
54
+ {getOptionLabel(option)}
55
+ </label>
56
+ </div>
57
+ {/each}
58
+ {/if}
59
+ </div>
60
+
61
+ <style>
62
+ .spectrum-Radio-input {
63
+ opacity: 0;
64
+ }
65
+ </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>