@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.
- package/LICENSE +375 -0
- package/README.md +42 -0
- package/dist/bbui.es.js +8 -0
- package/dist/bbui.es.js.map +1 -0
- package/package.json +94 -0
- package/src/Accordion/Accordion.svelte +58 -0
- package/src/ActionButton/ActionButton.svelte +132 -0
- package/src/ActionGroup/ActionGroup.svelte +26 -0
- package/src/ActionMenu/ActionMenu.svelte +43 -0
- package/src/Actions/ClickOutside.svench.svx +30 -0
- package/src/Actions/PositionDropdown.svench.svx +81 -0
- package/src/Actions/autoresize_textarea.js +14 -0
- package/src/Actions/click_outside.js +76 -0
- package/src/Actions/position_dropdown.js +116 -0
- package/src/Avatar/Avatar.svelte +63 -0
- package/src/Badge/Badge.svelte +42 -0
- package/src/Banner/Banner.svelte +72 -0
- package/src/Banner/BannerDisplay.svelte +41 -0
- package/src/Button/Button.svelte +118 -0
- package/src/Button/Button.svench +138 -0
- package/src/ButtonGroup/ButtonGroup.svelte +30 -0
- package/src/ClearButton/ClearButton.svelte +19 -0
- package/src/ColorPicker/ColorPicker.svelte +304 -0
- package/src/DetailSummary/DetailSummary.svelte +92 -0
- package/src/Divider/Divider.svelte +28 -0
- package/src/Drawer/Drawer.svelte +113 -0
- package/src/Drawer/Drawer.svench +42 -0
- package/src/Drawer/DrawerContent.svelte +45 -0
- package/src/FancyForm/FancyButton.svelte +30 -0
- package/src/FancyForm/FancyButtonRadio.svelte +70 -0
- package/src/FancyForm/FancyCheckbox.svelte +53 -0
- package/src/FancyForm/FancyField.svelte +126 -0
- package/src/FancyForm/FancyFieldLabel.svelte +25 -0
- package/src/FancyForm/FancyForm.svelte +40 -0
- package/src/FancyForm/FancyInput.svelte +109 -0
- package/src/FancyForm/FancySelect.svelte +147 -0
- package/src/FancyForm/index.js +6 -0
- package/src/Form/Checkbox.svelte +23 -0
- package/src/Form/Combobox.svelte +45 -0
- package/src/Form/Core/Checkbox.svelte +69 -0
- package/src/Form/Core/CheckboxGroup.svelte +68 -0
- package/src/Form/Core/Combobox.svelte +142 -0
- package/src/Form/Core/DatePicker.svelte +265 -0
- package/src/Form/Core/Dropzone.svelte +482 -0
- package/src/Form/Core/EnvDropdown.svelte +276 -0
- package/src/Form/Core/File.svelte +115 -0
- package/src/Form/Core/InputDropdown.svelte +235 -0
- package/src/Form/Core/Multiselect.svelte +99 -0
- package/src/Form/Core/Picker.svelte +314 -0
- package/src/Form/Core/PickerDropdown.svelte +431 -0
- package/src/Form/Core/RadioGroup.svelte +65 -0
- package/src/Form/Core/RichTextField.svelte +42 -0
- package/src/Form/Core/Search.svelte +105 -0
- package/src/Form/Core/Select.svelte +90 -0
- package/src/Form/Core/Slider.svelte +86 -0
- package/src/Form/Core/Stepper.svelte +172 -0
- package/src/Form/Core/Switch.svelte +35 -0
- package/src/Form/Core/TextArea.svelte +78 -0
- package/src/Form/Core/TextField.svelte +115 -0
- package/src/Form/Core/index.js +16 -0
- package/src/Form/DatePicker.svelte +46 -0
- package/src/Form/Dropzone.svelte +44 -0
- package/src/Form/EnvDropdown.svelte +50 -0
- package/src/Form/Field.svelte +42 -0
- package/src/Form/FieldLabel.svelte +32 -0
- package/src/Form/File.svelte +37 -0
- package/src/Form/Input.svelte +45 -0
- package/src/Form/InputDropdown.svelte +53 -0
- package/src/Form/Multiselect.svelte +49 -0
- package/src/Form/PickerDropdown.svelte +131 -0
- package/src/Form/RadioGroup.svelte +42 -0
- package/src/Form/RichTextField.svelte +36 -0
- package/src/Form/Search.svelte +36 -0
- package/src/Form/Select.svelte +67 -0
- package/src/Form/Slider.svelte +24 -0
- package/src/Form/Stepper.svelte +45 -0
- package/src/Form/TextArea.svelte +34 -0
- package/src/Form/Toggle.svelte +22 -0
- package/src/Icon/Icon.svelte +94 -0
- package/src/Icon/IconAvatar.svelte +61 -0
- package/src/IconPicker/IconPicker.svelte +184 -0
- package/src/IconSideNav/IconSideNav.svelte +14 -0
- package/src/IconSideNav/IconSideNavItem.svelte +56 -0
- package/src/InlineAlert/InlineAlert.svelte +63 -0
- package/src/Input/CopyInput.svelte +59 -0
- package/src/Label/Label.svelte +31 -0
- package/src/Layout/Layout.svelte +94 -0
- package/src/Layout/Page.svelte +101 -0
- package/src/Link/Link.svelte +27 -0
- package/src/List/List.svelte +28 -0
- package/src/List/ListItem.svelte +93 -0
- package/src/Markdown/MarkdownEditor.svelte +60 -0
- package/src/Markdown/MarkdownViewer.svelte +70 -0
- package/src/Markdown/SpectrumMDE.svelte +184 -0
- package/src/Menu/Item.svelte +94 -0
- package/src/Menu/Menu.svelte +7 -0
- package/src/Menu/Menu.svench +19 -0
- package/src/Menu/Section.svelte +10 -0
- package/src/Menu/Separator.svelte +1 -0
- package/src/Modal/Content.svelte +6 -0
- package/src/Modal/CustomContent.svelte +37 -0
- package/src/Modal/Modal.svelte +178 -0
- package/src/Modal/Modal.svench +116 -0
- package/src/Modal/ModalContent.svelte +190 -0
- package/src/Modal/QuizModal.svelte +53 -0
- package/src/Notification/Notification.svelte +74 -0
- package/src/Notification/NotificationDisplay.svelte +43 -0
- package/src/Pagination/Pagination.svelte +57 -0
- package/src/Popover/Popover.svelte +95 -0
- package/src/Popover/Popover.svench +120 -0
- package/src/ProgressBar/ProgressBar.svelte +67 -0
- package/src/ProgressCircle/ProgressCircle.svelte +62 -0
- package/src/SideNavigation/Item.svelte +59 -0
- package/src/SideNavigation/Navigation.svelte +12 -0
- package/src/StatusLight/StatusLight.svelte +80 -0
- package/src/Stores/Notifications.svench.svx +78 -0
- package/src/Stores/banner.js +65 -0
- package/src/Stores/notifications.js +84 -0
- package/src/Table/ArrayRenderer.svelte +18 -0
- package/src/Table/AttachmentRenderer.svelte +73 -0
- package/src/Table/BoldRenderer.svelte +15 -0
- package/src/Table/BooleanRenderer.svelte +42 -0
- package/src/Table/CellRenderer.svelte +70 -0
- package/src/Table/CodeRenderer.svelte +14 -0
- package/src/Table/DateTimeRenderer.svelte +29 -0
- package/src/Table/InternalRenderer.svelte +24 -0
- package/src/Table/RelationshipRenderer.svelte +35 -0
- package/src/Table/SelectEditRenderer.svelte +28 -0
- package/src/Table/StringRenderer.svelte +22 -0
- package/src/Table/Table.svelte +657 -0
- package/src/Table/index.js +1 -0
- package/src/Tabs/Tab.svelte +88 -0
- package/src/Tabs/Tabs.svelte +130 -0
- package/src/Tags/Tag.svelte +43 -0
- package/src/Tags/Tags.svelte +17 -0
- package/src/Tooltip/Tooltip.svelte +34 -0
- package/src/Tooltip/TooltipWrapper.svelte +60 -0
- package/src/TreeView/Item.svelte +41 -0
- package/src/TreeView/Tree.svelte +16 -0
- package/src/Typography/Body.svelte +22 -0
- package/src/Typography/Code.svelte +10 -0
- package/src/Typography/Detail.svelte +19 -0
- package/src/Typography/Heading.svelte +24 -0
- package/src/bbui.css +118 -0
- package/src/context.js +4 -0
- package/src/helpers.js +116 -0
- package/src/index.js +109 -0
- package/src/spectrum-icons-rollup.js +31 -0
- package/src/spectrum-icons-vite.js +31 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { createEventDispatcher } from "svelte"
|
|
3
|
+
import "@spectrum-css/popover/dist/index-vars.css"
|
|
4
|
+
import clickOutside from "../Actions/click_outside"
|
|
5
|
+
import { fly } from "svelte/transition"
|
|
6
|
+
import Icon from "../Icon/Icon.svelte"
|
|
7
|
+
import Input from "../Form/Input.svelte"
|
|
8
|
+
import { capitalise } from "../helpers"
|
|
9
|
+
|
|
10
|
+
export let value
|
|
11
|
+
export let size = "M"
|
|
12
|
+
export let spectrumTheme
|
|
13
|
+
export let alignRight = false
|
|
14
|
+
|
|
15
|
+
let open = false
|
|
16
|
+
|
|
17
|
+
$: customValue = getCustomValue(value)
|
|
18
|
+
$: checkColor = getCheckColor(value)
|
|
19
|
+
|
|
20
|
+
const dispatch = createEventDispatcher()
|
|
21
|
+
const categories = [
|
|
22
|
+
{
|
|
23
|
+
label: "Theme",
|
|
24
|
+
colors: [
|
|
25
|
+
"gray-50",
|
|
26
|
+
"gray-75",
|
|
27
|
+
"gray-100",
|
|
28
|
+
"gray-200",
|
|
29
|
+
"gray-300",
|
|
30
|
+
"gray-400",
|
|
31
|
+
"gray-500",
|
|
32
|
+
"gray-600",
|
|
33
|
+
"gray-700",
|
|
34
|
+
"gray-800",
|
|
35
|
+
"gray-900",
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
label: "Colors",
|
|
40
|
+
colors: [
|
|
41
|
+
"red-400",
|
|
42
|
+
"orange-400",
|
|
43
|
+
"yellow-400",
|
|
44
|
+
"green-400",
|
|
45
|
+
"seafoam-400",
|
|
46
|
+
"blue-400",
|
|
47
|
+
"indigo-400",
|
|
48
|
+
"magenta-400",
|
|
49
|
+
|
|
50
|
+
"red-500",
|
|
51
|
+
"orange-500",
|
|
52
|
+
"yellow-500",
|
|
53
|
+
"green-500",
|
|
54
|
+
"seafoam-500",
|
|
55
|
+
"blue-500",
|
|
56
|
+
"indigo-500",
|
|
57
|
+
"magenta-500",
|
|
58
|
+
|
|
59
|
+
"red-600",
|
|
60
|
+
"orange-600",
|
|
61
|
+
"yellow-600",
|
|
62
|
+
"green-600",
|
|
63
|
+
"seafoam-600",
|
|
64
|
+
"blue-600",
|
|
65
|
+
"indigo-600",
|
|
66
|
+
"magenta-600",
|
|
67
|
+
|
|
68
|
+
"red-700",
|
|
69
|
+
"orange-700",
|
|
70
|
+
"yellow-700",
|
|
71
|
+
"green-700",
|
|
72
|
+
"seafoam-700",
|
|
73
|
+
"blue-700",
|
|
74
|
+
"indigo-700",
|
|
75
|
+
"magenta-700",
|
|
76
|
+
|
|
77
|
+
"static-white",
|
|
78
|
+
"static-black",
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
const onChange = value => {
|
|
84
|
+
dispatch("change", value)
|
|
85
|
+
open = false
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const getCustomValue = value => {
|
|
89
|
+
if (!value) {
|
|
90
|
+
return value
|
|
91
|
+
}
|
|
92
|
+
let found = false
|
|
93
|
+
const comparisonValue = value.substring(28, value.length - 1)
|
|
94
|
+
for (let category of categories) {
|
|
95
|
+
found = category.colors.includes(comparisonValue)
|
|
96
|
+
if (found) {
|
|
97
|
+
break
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return found ? null : value
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const prettyPrint = color => {
|
|
104
|
+
return capitalise(color.split("-").join(" "))
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const getCheckColor = value => {
|
|
108
|
+
// Use dynamic color for theme grays
|
|
109
|
+
if (value?.includes("gray")) {
|
|
110
|
+
return /^.*(gray-(50|75|100|200|300|400|500))\)$/.test(value)
|
|
111
|
+
? "var(--spectrum-global-color-gray-900)"
|
|
112
|
+
: "var(--spectrum-global-color-gray-50)"
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Use black check for static white
|
|
116
|
+
if (value?.includes("static-black")) {
|
|
117
|
+
return "var(--spectrum-global-color-static-gray-50)"
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return "var(--spectrum-global-color-static-gray-900)"
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const handleOutsideClick = event => {
|
|
124
|
+
if (open) {
|
|
125
|
+
event.stopPropagation()
|
|
126
|
+
open = false
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
</script>
|
|
130
|
+
|
|
131
|
+
<div class="container">
|
|
132
|
+
<div class="preview size--{size || 'M'}" on:click={() => (open = true)}>
|
|
133
|
+
<div
|
|
134
|
+
class="fill {spectrumTheme || ''}"
|
|
135
|
+
style={value ? `background: ${value};` : ""}
|
|
136
|
+
class:placeholder={!value}
|
|
137
|
+
/>
|
|
138
|
+
</div>
|
|
139
|
+
{#if open}
|
|
140
|
+
<div
|
|
141
|
+
use:clickOutside={handleOutsideClick}
|
|
142
|
+
transition:fly|local={{ y: -20, duration: 200 }}
|
|
143
|
+
class="spectrum-Popover spectrum-Popover--bottom spectrum-Picker-popover is-open"
|
|
144
|
+
class:spectrum-Popover--align-right={alignRight}
|
|
145
|
+
>
|
|
146
|
+
{#each categories as category}
|
|
147
|
+
<div class="category">
|
|
148
|
+
<div class="heading">{category.label}</div>
|
|
149
|
+
<div class="colors">
|
|
150
|
+
{#each category.colors as color}
|
|
151
|
+
<div
|
|
152
|
+
on:click={() => {
|
|
153
|
+
onChange(`var(--spectrum-global-color-${color})`)
|
|
154
|
+
}}
|
|
155
|
+
class="color"
|
|
156
|
+
title={prettyPrint(color)}
|
|
157
|
+
>
|
|
158
|
+
<div
|
|
159
|
+
class="fill {spectrumTheme || ''}"
|
|
160
|
+
style="background: var(--spectrum-global-color-{color}); color: {checkColor};"
|
|
161
|
+
>
|
|
162
|
+
{#if value === `var(--spectrum-global-color-${color})`}
|
|
163
|
+
<Icon name="Checkmark" size="S" />
|
|
164
|
+
{/if}
|
|
165
|
+
</div>
|
|
166
|
+
</div>
|
|
167
|
+
{/each}
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
{/each}
|
|
171
|
+
<div class="category category--custom">
|
|
172
|
+
<div class="heading">Custom</div>
|
|
173
|
+
<div class="custom">
|
|
174
|
+
<Input
|
|
175
|
+
updateOnChange={false}
|
|
176
|
+
quiet
|
|
177
|
+
placeholder="Hex, RGB, HSL..."
|
|
178
|
+
value={customValue}
|
|
179
|
+
on:change
|
|
180
|
+
/>
|
|
181
|
+
<Icon
|
|
182
|
+
size="S"
|
|
183
|
+
name="Close"
|
|
184
|
+
hoverable
|
|
185
|
+
on:click={() => onChange(null)}
|
|
186
|
+
/>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
190
|
+
{/if}
|
|
191
|
+
</div>
|
|
192
|
+
|
|
193
|
+
<style>
|
|
194
|
+
.container {
|
|
195
|
+
position: relative;
|
|
196
|
+
}
|
|
197
|
+
.preview {
|
|
198
|
+
width: 32px;
|
|
199
|
+
height: 32px;
|
|
200
|
+
border-radius: 100%;
|
|
201
|
+
position: relative;
|
|
202
|
+
transition: border-color 130ms ease-in-out;
|
|
203
|
+
box-shadow: 0 0 0 1px var(--spectrum-global-color-gray-400);
|
|
204
|
+
}
|
|
205
|
+
.preview:hover {
|
|
206
|
+
cursor: pointer;
|
|
207
|
+
box-shadow: 0 0 2px 2px var(--spectrum-global-color-gray-400);
|
|
208
|
+
}
|
|
209
|
+
.fill {
|
|
210
|
+
width: 100%;
|
|
211
|
+
height: 100%;
|
|
212
|
+
border-radius: 100%;
|
|
213
|
+
position: absolute;
|
|
214
|
+
top: 0;
|
|
215
|
+
left: 0;
|
|
216
|
+
display: grid;
|
|
217
|
+
place-items: center;
|
|
218
|
+
}
|
|
219
|
+
.fill.placeholder {
|
|
220
|
+
background-position: 0 0, 10px 10px;
|
|
221
|
+
background-size: 20px 20px;
|
|
222
|
+
background-image: linear-gradient(
|
|
223
|
+
45deg,
|
|
224
|
+
#eee 25%,
|
|
225
|
+
transparent 25%,
|
|
226
|
+
transparent 75%,
|
|
227
|
+
#eee 75%,
|
|
228
|
+
#eee 100%
|
|
229
|
+
),
|
|
230
|
+
linear-gradient(
|
|
231
|
+
45deg,
|
|
232
|
+
#eee 25%,
|
|
233
|
+
white 25%,
|
|
234
|
+
white 75%,
|
|
235
|
+
#eee 75%,
|
|
236
|
+
#eee 100%
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
.size--S {
|
|
240
|
+
width: 20px;
|
|
241
|
+
height: 20px;
|
|
242
|
+
}
|
|
243
|
+
.size--M {
|
|
244
|
+
width: 32px;
|
|
245
|
+
height: 32px;
|
|
246
|
+
}
|
|
247
|
+
.size--L {
|
|
248
|
+
width: 48px;
|
|
249
|
+
height: 48px;
|
|
250
|
+
}
|
|
251
|
+
.spectrum-Popover {
|
|
252
|
+
width: 210px;
|
|
253
|
+
z-index: 999;
|
|
254
|
+
top: 100%;
|
|
255
|
+
padding: var(--spacing-l) var(--spacing-xl);
|
|
256
|
+
display: flex;
|
|
257
|
+
flex-direction: column;
|
|
258
|
+
justify-content: flex-start;
|
|
259
|
+
align-items: stretch;
|
|
260
|
+
gap: var(--spacing-xl);
|
|
261
|
+
}
|
|
262
|
+
.spectrum-Popover--align-right {
|
|
263
|
+
right: 0;
|
|
264
|
+
}
|
|
265
|
+
.colors {
|
|
266
|
+
display: grid;
|
|
267
|
+
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
|
|
268
|
+
gap: var(--spacing-xs);
|
|
269
|
+
}
|
|
270
|
+
.heading {
|
|
271
|
+
font-size: var(--font-size-s);
|
|
272
|
+
font-weight: 600;
|
|
273
|
+
letter-spacing: 0.14px;
|
|
274
|
+
flex: 1 1 auto;
|
|
275
|
+
text-transform: uppercase;
|
|
276
|
+
grid-column: 1 / 5;
|
|
277
|
+
margin-bottom: var(--spacing-s);
|
|
278
|
+
}
|
|
279
|
+
.color {
|
|
280
|
+
height: 16px;
|
|
281
|
+
width: 16px;
|
|
282
|
+
border-radius: 100%;
|
|
283
|
+
box-shadow: 0 0 0 1px var(--spectrum-global-color-gray-300);
|
|
284
|
+
position: relative;
|
|
285
|
+
}
|
|
286
|
+
.color:hover {
|
|
287
|
+
cursor: pointer;
|
|
288
|
+
box-shadow: 0 0 2px 2px var(--spectrum-global-color-gray-300);
|
|
289
|
+
}
|
|
290
|
+
.custom {
|
|
291
|
+
display: grid;
|
|
292
|
+
grid-template-columns: 1fr auto;
|
|
293
|
+
align-items: center;
|
|
294
|
+
gap: var(--spacing-m);
|
|
295
|
+
margin-right: var(--spacing-xs);
|
|
296
|
+
}
|
|
297
|
+
.category--custom .heading {
|
|
298
|
+
margin-bottom: var(--spacing-xs);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.spectrum-wrapper {
|
|
302
|
+
background-color: transparent;
|
|
303
|
+
}
|
|
304
|
+
</style>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import Icon from "../Icon/Icon.svelte"
|
|
3
|
+
import { createEventDispatcher } from "svelte"
|
|
4
|
+
|
|
5
|
+
export let name
|
|
6
|
+
export let show = false
|
|
7
|
+
export let collapsible = true
|
|
8
|
+
|
|
9
|
+
const dispatch = createEventDispatcher()
|
|
10
|
+
const onHeaderClick = () => {
|
|
11
|
+
if (!collapsible) {
|
|
12
|
+
return
|
|
13
|
+
}
|
|
14
|
+
show = !show
|
|
15
|
+
if (show) {
|
|
16
|
+
dispatch("open")
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<div class="property-group-container">
|
|
22
|
+
{#if name}
|
|
23
|
+
<div class="property-group-name" on:click={onHeaderClick}>
|
|
24
|
+
<div class="name">{name}</div>
|
|
25
|
+
{#if collapsible}
|
|
26
|
+
<Icon size="S" name={show ? "Remove" : "Add"} />
|
|
27
|
+
{/if}
|
|
28
|
+
</div>
|
|
29
|
+
{/if}
|
|
30
|
+
<div
|
|
31
|
+
class="property-panel"
|
|
32
|
+
class:show={show || !collapsible}
|
|
33
|
+
class:no-title={!name}
|
|
34
|
+
>
|
|
35
|
+
<slot />
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<style>
|
|
40
|
+
.property-group-container {
|
|
41
|
+
display: flex;
|
|
42
|
+
flex-direction: column;
|
|
43
|
+
justify-content: flex-start;
|
|
44
|
+
align-items: stretch;
|
|
45
|
+
border-bottom: var(--border-light);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.property-group-name {
|
|
49
|
+
cursor: pointer;
|
|
50
|
+
display: flex;
|
|
51
|
+
flex-flow: row nowrap;
|
|
52
|
+
flex-direction: row;
|
|
53
|
+
justify-content: space-between;
|
|
54
|
+
align-items: center;
|
|
55
|
+
padding: var(--spacing-m) var(--spacing-xl);
|
|
56
|
+
color: var(--spectrum-global-color-gray-600);
|
|
57
|
+
transition: color 130ms ease-in-out;
|
|
58
|
+
}
|
|
59
|
+
.property-group-name:hover {
|
|
60
|
+
color: var(--spectrum-global-color-gray-900);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.name {
|
|
64
|
+
text-align: left;
|
|
65
|
+
font-size: var(--font-size-s);
|
|
66
|
+
font-weight: 600;
|
|
67
|
+
letter-spacing: 0.14px;
|
|
68
|
+
flex: 1 1 auto;
|
|
69
|
+
overflow: hidden;
|
|
70
|
+
text-overflow: ellipsis;
|
|
71
|
+
text-transform: uppercase;
|
|
72
|
+
white-space: nowrap;
|
|
73
|
+
user-select: none;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.property-panel {
|
|
77
|
+
display: none;
|
|
78
|
+
padding: var(--spacing-s) var(--spacing-xl) var(--spacing-xl)
|
|
79
|
+
var(--spacing-xl);
|
|
80
|
+
}
|
|
81
|
+
.property-panel.no-title {
|
|
82
|
+
padding: var(--spacing-xl);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.show {
|
|
86
|
+
display: flex;
|
|
87
|
+
flex-direction: column;
|
|
88
|
+
justify-content: flex-start;
|
|
89
|
+
align-items: stretch;
|
|
90
|
+
gap: var(--spacing-l);
|
|
91
|
+
}
|
|
92
|
+
</style>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import "@spectrum-css/divider/dist/index-vars.css"
|
|
3
|
+
export let size = "M"
|
|
4
|
+
|
|
5
|
+
export let vertical = false
|
|
6
|
+
export let noMargin = false
|
|
7
|
+
export let noGrid = false
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<hr
|
|
11
|
+
class:noMargin
|
|
12
|
+
class:noGrid
|
|
13
|
+
class="spectrum-Divider spectrum-Divider--{vertical
|
|
14
|
+
? 'vertical'
|
|
15
|
+
: 'horizontal'} spectrum-Dialog-divider spectrum-Divider--size{size}"
|
|
16
|
+
/>
|
|
17
|
+
|
|
18
|
+
<style>
|
|
19
|
+
hr {
|
|
20
|
+
background: var(--spectrum-global-color-gray-200);
|
|
21
|
+
}
|
|
22
|
+
hr.noMargin {
|
|
23
|
+
margin: 0;
|
|
24
|
+
}
|
|
25
|
+
hr.noGrid {
|
|
26
|
+
grid-area: auto;
|
|
27
|
+
}
|
|
28
|
+
</style>
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import Portal from "svelte-portal"
|
|
3
|
+
import Button from "../Button/Button.svelte"
|
|
4
|
+
import Body from "../Typography/Body.svelte"
|
|
5
|
+
import Heading from "../Typography/Heading.svelte"
|
|
6
|
+
|
|
7
|
+
export let title
|
|
8
|
+
export let fillWidth
|
|
9
|
+
export let left = "314px"
|
|
10
|
+
export let width = "calc(100% - 626px)"
|
|
11
|
+
|
|
12
|
+
let visible = false
|
|
13
|
+
|
|
14
|
+
export function show() {
|
|
15
|
+
if (visible) {
|
|
16
|
+
return
|
|
17
|
+
}
|
|
18
|
+
visible = true
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function hide() {
|
|
22
|
+
if (!visible) {
|
|
23
|
+
return
|
|
24
|
+
}
|
|
25
|
+
visible = false
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const easeInOutQuad = x => {
|
|
29
|
+
return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Use a custom svelte transition here because the built-in slide
|
|
33
|
+
// transition has a horrible overshoot
|
|
34
|
+
const slide = () => {
|
|
35
|
+
return {
|
|
36
|
+
duration: 360,
|
|
37
|
+
css: t => {
|
|
38
|
+
const translation = 100 - Math.round(easeInOutQuad(t) * 100)
|
|
39
|
+
return `transform: translateY(${translation}%);`
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
{#if visible}
|
|
46
|
+
<Portal>
|
|
47
|
+
<section
|
|
48
|
+
class:fillWidth
|
|
49
|
+
class="drawer"
|
|
50
|
+
transition:slide|local
|
|
51
|
+
style={`width: ${width}; left: ${left};`}
|
|
52
|
+
>
|
|
53
|
+
<header>
|
|
54
|
+
<div class="text">
|
|
55
|
+
<Heading size="XS">{title}</Heading>
|
|
56
|
+
<Body size="S">
|
|
57
|
+
<slot name="description" />
|
|
58
|
+
</Body>
|
|
59
|
+
</div>
|
|
60
|
+
<div class="buttons">
|
|
61
|
+
<Button secondary quiet on:click={hide}>Cancel</Button>
|
|
62
|
+
<slot name="buttons" />
|
|
63
|
+
</div>
|
|
64
|
+
</header>
|
|
65
|
+
<slot name="body" />
|
|
66
|
+
</section>
|
|
67
|
+
</Portal>
|
|
68
|
+
{/if}
|
|
69
|
+
|
|
70
|
+
<style>
|
|
71
|
+
.buttons {
|
|
72
|
+
display: flex;
|
|
73
|
+
gap: var(--spacing-m);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.drawer {
|
|
77
|
+
position: absolute;
|
|
78
|
+
bottom: 0;
|
|
79
|
+
background: var(--background);
|
|
80
|
+
border-top: var(--border-light);
|
|
81
|
+
z-index: 3;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.fillWidth {
|
|
85
|
+
left: 260px !important;
|
|
86
|
+
width: calc(100% - 260px) !important;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
header {
|
|
90
|
+
display: flex;
|
|
91
|
+
justify-content: space-between;
|
|
92
|
+
align-items: center;
|
|
93
|
+
border-bottom: var(--border-light);
|
|
94
|
+
padding: var(--spacing-l) var(--spacing-xl);
|
|
95
|
+
gap: var(--spacing-xl);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.text {
|
|
99
|
+
display: flex;
|
|
100
|
+
flex-direction: column;
|
|
101
|
+
justify-content: center;
|
|
102
|
+
align-items: flex-start;
|
|
103
|
+
gap: var(--spacing-xs);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.buttons {
|
|
107
|
+
display: flex;
|
|
108
|
+
flex-direction: row;
|
|
109
|
+
justify-content: flex-start;
|
|
110
|
+
align-items: center;
|
|
111
|
+
gap: var(--spacing-m);
|
|
112
|
+
}
|
|
113
|
+
</style>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { View } from "svench";
|
|
3
|
+
import Button from "../Button/Button.svelte";
|
|
4
|
+
import Drawer from "./Drawer.svelte";
|
|
5
|
+
|
|
6
|
+
let drawer1;
|
|
7
|
+
let drawer2;
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<style>
|
|
11
|
+
.drawer {
|
|
12
|
+
height: 40vh;
|
|
13
|
+
}
|
|
14
|
+
</style>
|
|
15
|
+
|
|
16
|
+
<View name="Basic Bottom Drawer">
|
|
17
|
+
<Button primary on:click={drawer1.show}>Open Drawer</Button>
|
|
18
|
+
<Drawer
|
|
19
|
+
bind:this={drawer1}
|
|
20
|
+
title="A basic Drawer with some text"
|
|
21
|
+
on:close={() => alert('You closed the drawer!')}>
|
|
22
|
+
<p slot="body">
|
|
23
|
+
Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat,
|
|
24
|
+
architecto assumenda! Quia harum hic numquam, soluta maiores facere
|
|
25
|
+
explicabo vero obcaecati voluptas, qui placeat ad, dolorem recusandae
|
|
26
|
+
labore quos? Nisi!
|
|
27
|
+
</p>
|
|
28
|
+
</Drawer>
|
|
29
|
+
</View>
|
|
30
|
+
<View name="Basic Bottom Drawer">
|
|
31
|
+
<Button blue on:click={drawer2.show}>Open Drawer</Button>
|
|
32
|
+
<Drawer
|
|
33
|
+
bind:this={drawer2}
|
|
34
|
+
title={'Actions'}
|
|
35
|
+
on:close={() => alert('You closed the drawer!')}>
|
|
36
|
+
<heading slot="buttons">
|
|
37
|
+
<Button thin blue on:click={drawer2.hide}>Save</Button>
|
|
38
|
+
</heading>
|
|
39
|
+
<div slot="description">This describes the drawer!</div>
|
|
40
|
+
<div class="drawer" slot="body">Some content here</div>
|
|
41
|
+
</Drawer>
|
|
42
|
+
</View>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<div class="drawer-contents">
|
|
2
|
+
<div class:no-sidebar={!$$slots.sidebar} class="container">
|
|
3
|
+
{#if $$slots.sidebar}
|
|
4
|
+
<div class="sidebar">
|
|
5
|
+
<slot name="sidebar" />
|
|
6
|
+
</div>
|
|
7
|
+
{/if}
|
|
8
|
+
<div class="main">
|
|
9
|
+
<slot />
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<style>
|
|
15
|
+
.drawer-contents {
|
|
16
|
+
height: 40vh;
|
|
17
|
+
overflow-y: auto;
|
|
18
|
+
}
|
|
19
|
+
.container {
|
|
20
|
+
height: 100%;
|
|
21
|
+
display: grid;
|
|
22
|
+
grid-template-columns: 320px 1fr;
|
|
23
|
+
}
|
|
24
|
+
.no-sidebar {
|
|
25
|
+
grid-template-columns: 1fr;
|
|
26
|
+
}
|
|
27
|
+
.sidebar {
|
|
28
|
+
border-right: var(--border-light);
|
|
29
|
+
overflow: auto;
|
|
30
|
+
padding: var(--spacing-xl);
|
|
31
|
+
scrollbar-width: none;
|
|
32
|
+
}
|
|
33
|
+
.sidebar::-webkit-scrollbar {
|
|
34
|
+
display: none;
|
|
35
|
+
}
|
|
36
|
+
.main {
|
|
37
|
+
padding: var(--spacing-xl);
|
|
38
|
+
}
|
|
39
|
+
.main :global(textarea) {
|
|
40
|
+
min-height: 200px;
|
|
41
|
+
}
|
|
42
|
+
.main :global(p) {
|
|
43
|
+
margin: 0;
|
|
44
|
+
}
|
|
45
|
+
</style>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import Icon from "../Icon/Icon.svelte"
|
|
3
|
+
import FancyField from "./FancyField.svelte"
|
|
4
|
+
|
|
5
|
+
export let icon
|
|
6
|
+
export let disabled
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<FancyField on:click clickable {disabled}>
|
|
10
|
+
{#if icon}
|
|
11
|
+
{#if icon.includes("/")}
|
|
12
|
+
<img src={icon} alt="button" />
|
|
13
|
+
{:else}
|
|
14
|
+
<Icon name={icon} />
|
|
15
|
+
{/if}
|
|
16
|
+
{/if}
|
|
17
|
+
<slot name="icon" />
|
|
18
|
+
<div>
|
|
19
|
+
<slot />
|
|
20
|
+
</div>
|
|
21
|
+
</FancyField>
|
|
22
|
+
|
|
23
|
+
<style>
|
|
24
|
+
img {
|
|
25
|
+
width: 22px;
|
|
26
|
+
}
|
|
27
|
+
div {
|
|
28
|
+
font-size: var(--font-size-l);
|
|
29
|
+
}
|
|
30
|
+
</style>
|