@budibase/bbui 1.58.13 → 2.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 (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
@@ -1,191 +1,45 @@
1
1
  <script>
2
- import { createEventDispatcher } from "svelte";
3
- import Button from "../Button/Button.svelte";
4
- import Label from "../Styleguide/Label.svelte"
5
- const dispatch = createEventDispatcher();
6
-
7
- export let name = undefined;
8
- export let label = undefined;
9
- export let outline = false;
10
- export let presentation = false;
11
- export let thin = false;
12
- export let extraThin = false;
13
- export let large = false;
14
- export let border = false;
15
- export let edit = false;
16
- export let disabled = false;
17
- export let type = undefined;
18
- export let placeholder = "";
19
- export let value = "";
20
- export let error = false;
21
- export let validator = () => {};
22
-
23
- // This section handles the edit mode and dispatching of things to the parent when saved
24
- let editMode = false;
25
-
26
- const updateValue = (e) => {
27
- if (type === "number") {
28
- const num = parseFloat(e.target.value)
29
- value = isNaN(num) ? "" : num;
30
- } else {
31
- value = e.target.value;
32
- }
33
- };
34
-
35
- const save = () => {
36
- editMode = false;
37
- dispatch("save", value);
38
- };
39
-
40
- const enableEdit = () => {
41
- editMode = true;
42
- };
43
- </script>
44
-
45
- <style>
46
- .container {
47
- min-width: 0;
48
- display: flex;
49
- flex-direction: column;
50
- }
51
-
52
- .label-container {
53
- display: flex;
54
- flex-direction: row;
55
- justify-content: space-between;
56
- align-items: flex-end;
57
- margin-bottom: var(--spacing-s);
58
- }
59
- .label-container :global(label) {
60
- margin-bottom: 0;
61
- }
62
-
63
- .controls {
64
- align-items: center;
65
- display: grid;
66
- grid-template-columns: auto auto;
67
- grid-gap: 12px;
68
- margin-left: auto;
69
- padding-left: 12px;
70
- }
71
- .controls :global(button) {
72
- min-width: 100px;
73
- font-size: var(--font-size-s);
74
- border-radius: var(--rounded-small);
75
- }
76
-
77
- input {
78
- min-width: 0;
79
- box-sizing: border-box;
80
- color: var(--ink);
81
- font-size: var(--font-size-s);
82
- border-radius: var(--border-radius-s);
83
- border: none;
84
- background-color: var(--grey-2);
85
- padding: var(--spacing-m);
86
- margin: 0;
87
- outline: none;
88
- font-family: var(--font-sans);
89
- border: var(--border-transparent);
90
- transition: all 0.2s ease-in-out;
91
- }
92
- input.presentation {
93
- background-color: var(--background);
94
- border: var(--background) 2px solid;
95
- }
96
- input.presentation:hover {
97
- background-color: var(--grey-2);
98
- border: var(--grey-4) 2px solid;
99
- }
100
- input.thin {
101
- font-size: var(--font-size-xs);
2
+ import Field from "./Field.svelte"
3
+ import TextField from "./Core/TextField.svelte"
4
+ import { createEventDispatcher } from "svelte"
5
+
6
+ export let value = null
7
+ export let label = null
8
+ export let labelPosition = "above"
9
+ export let placeholder = null
10
+ export let type = "text"
11
+ export let disabled = false
12
+ export let readonly = false
13
+ export let error = null
14
+ export let updateOnChange = true
15
+ export let quiet = false
16
+ export let dataCy
17
+ export let autofocus
18
+
19
+ const dispatch = createEventDispatcher()
20
+ const onChange = e => {
21
+ value = e.detail
22
+ dispatch("change", e.detail)
102
23
  }
103
- input.extraThin {
104
- font-size: var(--font-size-xs);
105
- padding: var(--spacing-s) var(--spacing-m);
106
- }
107
- input.large {
108
- font-size: var(--font-size-m);
109
- padding: var(--spacing-l);
110
-
111
- }
112
- input.border {
113
- border: var(--border-grey-2);
114
- }
115
- input.border:active {
116
- border: var(--border-blue);
117
- }
118
- input.border:focus {
119
- border: var(--border-blue);
120
- }
121
- input.outline {
122
- border: var(--border-light-2);
123
- background: var(--background);
124
- }
125
- input.outline:active {
126
- border: var(--border-blue);
127
- }
128
- input.outline:focus {
129
- border: var(--border-blue);
130
- }
131
- input:hover {
132
- border: var(--grey-4) 2px solid;
133
- }
134
- input::placeholder {
135
- color: var(--grey-6);
136
- }
137
- input:focus {
138
- border: var(--border-blue);
139
- }
140
- input:disabled {
141
- background: var(--grey-4);
142
- color: var(--grey-6);
143
- }
144
-
145
- .error {
146
- margin-top: 10px;
147
- font-size: var(--font-size-xs);
148
- font-family: var(--font-sans);
149
- line-height: 1.17;
150
- color: var(--red);
151
- }
152
- </style>
24
+ </script>
153
25
 
154
- <div class="container">
155
- {#if label || edit}
156
- <div class="label-container">
157
- {#if label}
158
- <Label extraSmall grey forAttr={name}>{label}</Label>
159
- {/if}
160
- {#if edit}
161
- <div class="controls">
162
- <Button small secondary disabled={editMode} on:click={enableEdit}>
163
- Edit
164
- </Button>
165
- <Button small blue disabled={!editMode} on:click={save}>Save</Button>
166
- </div>
167
- {/if}
168
- </div>
169
- {/if}
170
- <input
171
- class:outline
172
- class:presentation
173
- class:thin
174
- class:extraThin
175
- class:large
176
- class:border
177
- on:change
178
- on:input
179
- on:change={updateValue}
180
- on:input={updateValue}
181
- on:blur={updateValue}
182
- use:validator
183
- disabled={disabled || (edit && !editMode)}
184
- value={value == null ? "" : value}
26
+ <Field {label} {labelPosition} {error}>
27
+ <TextField
28
+ {dataCy}
29
+ {updateOnChange}
30
+ {error}
31
+ {disabled}
32
+ {readonly}
33
+ {value}
34
+ {placeholder}
185
35
  {type}
186
- {name}
187
- {placeholder} />
188
- {#if error}
189
- <div class="error">{error}</div>
190
- {/if}
191
- </div>
36
+ {quiet}
37
+ {autofocus}
38
+ on:change={onChange}
39
+ on:click
40
+ on:input
41
+ on:blur
42
+ on:focus
43
+ on:keyup
44
+ />
45
+ </Field>
@@ -0,0 +1,55 @@
1
+ <script>
2
+ import Field from "./Field.svelte"
3
+ import InputDropdown from "./Core/InputDropdown.svelte"
4
+ import { createEventDispatcher } from "svelte"
5
+
6
+ export let inputValue = null
7
+ export let dropdownValue = null
8
+ export let inputType = "text"
9
+ export let label = null
10
+ export let labelPosition = "above"
11
+ export let placeholder = null
12
+ export let disabled = false
13
+ export let readonly = false
14
+ export let error = null
15
+ export let updateOnChange = true
16
+ export let quiet = false
17
+ export let dataCy
18
+ export let autofocus
19
+ export let options = []
20
+
21
+ const dispatch = createEventDispatcher()
22
+
23
+ const onPick = e => {
24
+ dropdownValue = e.detail
25
+ dispatch("pick", e.detail)
26
+ }
27
+ const onChange = e => {
28
+ inputValue = e.detail
29
+ dispatch("change", e.detail)
30
+ }
31
+ </script>
32
+
33
+ <Field {label} {labelPosition} {error}>
34
+ <InputDropdown
35
+ {dataCy}
36
+ {updateOnChange}
37
+ {error}
38
+ {disabled}
39
+ {readonly}
40
+ {inputValue}
41
+ {dropdownValue}
42
+ {placeholder}
43
+ {inputType}
44
+ {quiet}
45
+ {autofocus}
46
+ {options}
47
+ on:change={onChange}
48
+ on:pick={onPick}
49
+ on:click
50
+ on:input
51
+ on:blur
52
+ on:focus
53
+ on:keyup
54
+ />
55
+ </Field>
@@ -1,324 +1,40 @@
1
1
  <script>
2
- import Portal from "svelte-portal";
3
- import { afterUpdate } from "svelte";
4
- import { createEventDispatcher } from "svelte";
5
- import { fly } from "svelte/transition";
6
- import Label from "../Styleguide/Label.svelte";
7
- const xPath =
8
- "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z";
9
-
10
- import positionDropdown from '../Actions/position_dropdown'
11
- import clickOutside from '../Actions/click_outside'
12
-
13
- const dispatch = createEventDispatcher();
14
-
15
- export let value = [];
16
- export let label = undefined;
17
- export let align = "left"
18
- export let secondary = false;
19
- export let outline = false;
20
- export let disabled = false;
21
- export let placeholder = undefined;
22
- export let extraThin = false;
23
-
24
- let options = [];
25
- let optionsVisible = false;
26
- let slot;
27
- let anchor;
28
- $: lookupMap = mapValues(value);
29
- $: selectedOptions = options.filter((option) => lookupMap[option.value]);
30
-
31
- afterUpdate(() => {
32
- // Update available options
33
- const domOptions = Array.from(slot.querySelectorAll("option"));
34
- options = domOptions.map((option) => ({
35
- value: option.value,
36
- name: option.textContent,
37
- }));
38
- });
39
-
40
- function mapValues(value) {
41
- let map = {};
42
- if (value) {
43
- value.forEach((option) => {
44
- map[option] = true;
45
- });
46
- }
47
- return map;
48
- }
49
-
50
- function add(val) {
51
- value = [...value, val];
52
- dispatch("change", value);
53
- }
54
-
55
- function remove(val) {
56
- value = value.filter((option) => option !== val);
57
- dispatch("change", value);
58
- }
59
-
60
- function showOptions(show) {
61
- optionsVisible = show;
62
- }
63
-
64
- function handleClick() {
65
- showOptions(!optionsVisible);
66
- }
67
-
68
- function handleOptionMousedown(e) {
69
- const value = e.target.dataset.value;
70
- if (value == null) {
71
- return;
72
- }
73
- if (lookupMap[value]) {
74
- remove(value);
75
- } else {
76
- add(value);
77
- }
2
+ import { createEventDispatcher } from "svelte"
3
+ import Multiselect from "./Core/Multiselect.svelte"
4
+ import Field from "./Field.svelte"
5
+
6
+ export let value = []
7
+ export let label = null
8
+ export let disabled = false
9
+ export let readonly = false
10
+ export let labelPosition = "above"
11
+ export let error = null
12
+ export let placeholder = null
13
+ export let options = []
14
+ export let getOptionLabel = option => option
15
+ export let getOptionValue = option => option
16
+ export let sort = false
17
+ export let autoWidth = false
18
+ const dispatch = createEventDispatcher()
19
+ const onChange = e => {
20
+ value = e.detail
21
+ dispatch("change", e.detail)
78
22
  }
79
23
  </script>
80
24
 
81
- <style>
82
- .multiselect {
83
- position: relative;
84
- display: flex;
85
- flex-direction: column;
86
- justify-content: flex-start;
87
- align-items: stretch;
88
- font-family: var(--font-sans);
89
- min-width: 0;
90
- }
91
- .multiselect:hover {
92
- border-bottom-color: hsl(0, 0%, 50%);
93
- }
94
-
95
- .tokens-wrapper {
96
- display: flex;
97
- flex-direction: row;
98
- justify-content: flex-start;
99
- align-items: center;
100
- flex: 0 1 auto;
101
- }
102
-
103
- .tokens {
104
- align-items: center;
105
- display: flex;
106
- flex-wrap: wrap;
107
- position: relative;
108
- width: 0;
109
- flex: 1 1 auto;
110
- background-color: var(--background);
111
- border-radius: var(--border-radius-m);
112
- padding: 0 var(--spacing-m) calc(var(--spacing-m) - var(--spacing-xs))
113
- calc(var(--spacing-m) / 2);
114
- border: var(--border-transparent);
115
- }
116
- .tokens.disabled {
117
- background-color: var(--grey-4);
118
- pointer-events: none;
119
- }
120
- .tokens.outline {
121
- border: var(--border-dark);
122
- }
123
- .tokens.secondary {
124
- background-color: var(--grey-2);
125
- }
126
- .tokens.extraThin {
127
- padding: 0 var(--spacing-m) calc(var(--spacing-s) - var(--spacing-xs))
128
- calc(var(--spacing-m) / 2);
129
- }
130
- .tokens:hover {
131
- cursor: pointer;
132
- }
133
- .tokens.optionsVisible {
134
- border: var(--border-blue);
135
- }
136
- .tokens.empty {
137
- padding: var(--spacing-m);
138
- font-size: var(--font-size-xs);
139
- user-select: none;
140
- }
141
- .tokens.empty.extraThin {
142
- padding: var(--spacing-s) var(--spacing-m);
143
- }
144
- .tokens::after {
145
- width: 100%;
146
- left: 0;
147
- }
148
-
149
- .token {
150
- font-size: var(--font-size-xs);
151
- background-color: var(--ink);
152
- color: var(--background);
153
- border-radius: var(--border-radius-l);
154
- display: flex;
155
- flex-direction: row;
156
- align-items: center;
157
- margin: calc(var(--spacing-m) - var(--spacing-xs)) 0 0
158
- calc(var(--spacing-m) / 2);
159
- max-height: 1.3rem;
160
- padding: var(--spacing-xs) var(--spacing-s);
161
- transition: background-color 0.3s;
162
- white-space: nowrap;
163
- overflow: hidden;
164
- }
165
- .token.extraThin {
166
- margin: calc(var(--spacing-s) - var(--spacing-xs)) 0 0
167
- calc(var(--spacing-m) / 2);
168
- }
169
- .token span {
170
- pointer-events: none;
171
- user-select: none;
172
- flex: 1 1 auto;
173
- overflow: hidden;
174
- white-space: nowrap;
175
- text-overflow: ellipsis;
176
- }
177
- .token .token-remove {
178
- align-items: center;
179
- background-color: var(--grey-7);
180
- border-radius: 50%;
181
- display: flex;
182
- justify-content: center;
183
- height: 1rem;
184
- width: 1rem;
185
- margin: calc(-1 * var(--spacing-xs)) 0 calc(-1 * var(--spacing-xs))
186
- var(--spacing-xs);
187
- flex: 0 0 auto;
188
- }
189
- .token path {
190
- fill: var(--background);
191
- }
192
- .token .token-remove:hover {
193
- background-color: var(--grey-6);
194
- cursor: pointer;
195
- }
196
-
197
- .placeholder {
198
- pointer-events: none;
199
- color: var(--ink);
200
- }
201
- .placeholder.disabled {
202
- color: var(--grey-6);
203
- }
204
-
205
- .icon-clear path {
206
- fill: white;
207
- }
208
- .options {
209
- left: 0;
210
- list-style: none;
211
- margin-block-end: 0;
212
- margin-block-start: 0;
213
- overflow-y: auto;
214
- padding-inline-start: 0;
215
- position: absolute;
216
- border: var(--border-dark);
217
- border-radius: var(--border-radius-m);
218
- box-shadow: 0 5px 12px rgba(0, 0, 0, 0.15);
219
- margin: var(--spacing-xs) 0;
220
- padding: var(--spacing-s) 0;
221
- background-color: var(--background);
222
- max-height: 200px;
223
- }
224
- li {
225
- cursor: pointer;
226
- padding: var(--spacing-s) var(--spacing-m);
227
- font-size: var(--font-size-xs);
228
- color: var(--ink);
229
- }
230
- li.selected {
231
- background-color: var(--blue);
232
- color: white;
233
- }
234
- li:not(.selected):hover {
235
- background-color: var(--grey-1);
236
- }
237
- li.no-results:hover {
238
- background-color: white;
239
- cursor: initial;
240
- }
241
-
242
- .hidden {
243
- height: 0;
244
- overflow: hidden;
245
- visibility: hidden;
246
- padding: 0;
247
- margin: 0;
248
- border: 0;
249
- outline: 0;
250
- }
251
- </style>
252
-
253
- {#if label}
254
- <Label extraSmall grey>{label}</Label>
255
- {/if}
256
- <div class="multiselect" bind:this={anchor}>
257
- <div class="tokens-wrapper">
258
- <div
259
- class="tokens"
260
- class:outline
261
- class:disabled
262
- class:secondary
263
- class:extraThin
264
- class:optionsVisible
265
- on:click|self={handleClick}
266
- class:empty={!value || !value.length}>
267
- {#each selectedOptions as option}
268
- <div
269
- class="token"
270
- class:extraThin
271
- data-id={option.value}
272
- on:click|self={handleClick}>
273
- <span>{option.name}</span>
274
- <div
275
- class="token-remove"
276
- title="Remove {option.name}"
277
- on:click={() => remove(option.value)}>
278
- <svg
279
- class="icon-clear"
280
- xmlns="http://www.w3.org/2000/svg"
281
- width="18"
282
- height="18"
283
- viewBox="0 0 24 24">
284
- <path d={xPath} />
285
- </svg>
286
- </div>
287
- </div>
288
- {/each}
289
- {#if !value || !value.length}
290
- {#if placeholder && placeholder.length}
291
- <div class:disabled class="placeholder">{placeholder}</div>
292
- {:else}
293
- <div class="placeholder">&nbsp;</div>
294
- {/if}
295
- {/if}
296
- </div>
297
- </div>
298
-
299
- <select bind:this={slot} type="multiple" class="hidden">
300
- <slot />
301
- </select>
302
-
303
- {#if optionsVisible}
304
- <Portal>
305
- <ul
306
- class="options"
307
- use:positionDropdown={{anchor, align}}
308
- use:clickOutside={() => showOptions(false)}
309
- transition:fly={{ duration: 200, y: 5 }}
310
- on:mousedown|preventDefault={handleOptionMousedown}>
311
- {#each options as option}
312
- <li
313
- class:selected={lookupMap[option.value]}
314
- data-value={option.value}>
315
- {option.name}
316
- </li>
317
- {/each}
318
- {#if !options.length}
319
- <li class="no-results">No results</li>
320
- {/if}
321
- </ul>
322
- </Portal>
323
- {/if}
324
- </div>
25
+ <Field {label} {labelPosition} {error}>
26
+ <Multiselect
27
+ {error}
28
+ {disabled}
29
+ {readonly}
30
+ {value}
31
+ {options}
32
+ {placeholder}
33
+ {sort}
34
+ {getOptionLabel}
35
+ {getOptionValue}
36
+ {autoWidth}
37
+ on:change={onChange}
38
+ on:click
39
+ />
40
+ </Field>