@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.
- package/LICENSE +375 -0
- package/dist/bbui.es.js +14 -0
- package/dist/bbui.es.js.map +1 -0
- package/package.json +68 -32
- package/src/ActionButton/ActionButton.svelte +102 -0
- package/src/ActionGroup/ActionGroup.svelte +26 -0
- package/src/ActionMenu/ActionMenu.svelte +44 -0
- package/src/Actions/autoresize_textarea.js +9 -9
- package/src/Actions/click_outside.js +5 -5
- package/src/Actions/position_dropdown.js +46 -37
- package/src/Avatar/Avatar.svelte +62 -0
- package/src/Badge/Badge.svelte +29 -0
- package/src/Banner/Banner.svelte +72 -0
- package/src/Banner/BannerDisplay.svelte +41 -0
- package/src/Button/Button.svelte +102 -200
- package/src/ButtonGroup/ButtonGroup.svelte +30 -0
- package/src/ClearButton/ClearButton.svelte +19 -0
- package/src/ColorPicker/ColorPicker.svelte +297 -0
- package/src/DetailSummary/DetailSummary.svelte +83 -0
- package/src/Divider/Divider.svelte +28 -0
- package/src/Drawer/Drawer.svelte +76 -51
- package/src/Drawer/DrawerContent.svelte +46 -0
- package/src/Form/Checkbox.svelte +21 -132
- 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 +257 -0
- package/src/Form/Core/Dropzone.svelte +453 -0
- package/src/Form/Core/InputDropdown.svelte +228 -0
- package/src/Form/Core/Multiselect.svelte +90 -0
- package/src/Form/Core/Picker.svelte +259 -0
- package/src/Form/Core/PickerDropdown.svelte +415 -0
- package/src/Form/Core/RadioGroup.svelte +48 -0
- package/src/Form/Core/RichTextField.svelte +42 -0
- package/src/Form/Core/Search.svelte +105 -0
- package/src/Form/Core/Select.svelte +75 -0
- package/src/Form/Core/Slider.svelte +86 -0
- package/src/Form/Core/Stepper.svelte +172 -0
- package/src/Form/Core/Switch.svelte +37 -0
- package/src/Form/Core/TextArea.svelte +78 -0
- package/src/Form/Core/TextField.svelte +119 -0
- package/src/Form/Core/index.js +15 -0
- package/src/Form/DatePicker.svelte +39 -0
- package/src/Form/Dropzone.svelte +42 -0
- package/src/Form/Field.svelte +42 -0
- package/src/Form/FieldLabel.svelte +32 -0
- package/src/Form/Input.svelte +41 -187
- package/src/Form/InputDropdown.svelte +55 -0
- package/src/Form/Multiselect.svelte +36 -320
- package/src/Form/PickerDropdown.svelte +132 -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 +48 -88
- package/src/Form/Slider.svelte +16 -91
- package/src/Form/Stepper.svelte +45 -0
- package/src/Form/TextArea.svelte +30 -128
- package/src/Form/Toggle.svelte +20 -110
- package/src/Icon/Icon.svelte +91 -0
- package/src/Icon/IconAvatar.svelte +58 -0
- package/src/IconPicker/IconPicker.svelte +177 -0
- package/src/IconSideNav/IconSideNav.svelte +14 -0
- package/src/IconSideNav/IconSideNavItem.svelte +56 -0
- package/src/InlineAlert/InlineAlert.svelte +60 -0
- package/src/Label/Label.svelte +29 -0
- package/src/Layout/Layout.svelte +94 -0
- package/src/Layout/Page.svelte +32 -0
- package/src/Link/Link.svelte +24 -0
- package/src/List/List.svelte +28 -0
- package/src/List/ListItem.svelte +90 -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 +96 -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 +0 -11
- package/src/Modal/CustomContent.svelte +9 -6
- package/src/Modal/Modal.svelte +104 -51
- package/src/Modal/ModalContent.svelte +131 -73
- package/src/Modal/QuizModal.svelte +16 -17
- package/src/Notification/Notification.svelte +70 -0
- package/src/Notification/NotificationDisplay.svelte +43 -0
- package/src/Pagination/Pagination.svelte +57 -0
- package/src/Popover/Popover.svelte +43 -33
- package/src/ProgressBar/ProgressBar.svelte +67 -0
- package/src/ProgressCircle/ProgressCircle.svelte +62 -0
- package/src/SideNavigation/Item.svelte +61 -0
- package/src/SideNavigation/Navigation.svelte +12 -0
- package/src/StatusLight/StatusLight.svelte +80 -0
- package/src/Stores/Notifications.svench.svx +1 -1
- package/src/Stores/banner.js +65 -0
- package/src/Stores/notifications.js +75 -38
- package/src/Table/ArrayRenderer.svelte +17 -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 +69 -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 +40 -0
- package/src/Table/SelectEditRenderer.svelte +28 -0
- package/src/Table/StringRenderer.svelte +14 -0
- package/src/Table/Table.svelte +635 -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 +7 -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 +21 -0
- package/src/Typography/Code.svelte +10 -0
- package/src/Typography/Detail.svelte +19 -0
- package/src/Typography/Heading.svelte +17 -0
- package/{dist → src}/bbui.css +2 -99
- package/src/context.js +1 -1
- package/src/helpers.js +134 -0
- package/src/index.js +95 -40
- package/src/spectrum-icons-rollup.js +31 -0
- package/src/spectrum-icons-vite.js +31 -0
- package/dist/dist/bundle.css +0 -42
- package/dist/dist/bundle.css.map +0 -64
- package/dist/index.js +0 -36193
- package/dist/index.mjs +0 -36147
- package/src/Button/Close.svelte +0 -59
- package/src/Button/Close.svench +0 -36
- package/src/Button/TextButton.svelte +0 -128
- package/src/Button/TextButton.svench +0 -69
- package/src/DatePicker/DatePicker.svelte +0 -45
- package/src/DatePicker/DatePicker.svench +0 -17
- package/src/DropdownMenu/DropdownMenu.svelte +0 -77
- package/src/DropdownMenu/DropdownMenu.svench +0 -161
- package/src/Dropzone/Dropzone.svelte +0 -294
- package/src/Dropzone/Dropzone.svench +0 -17
- package/src/Dropzone/fileTypes.js +0 -5
- package/src/Form/Checkbox.svench.svx +0 -67
- package/src/Form/DataList.svelte +0 -158
- package/src/Form/DataList.svench +0 -57
- package/src/Form/Input.svench +0 -62
- package/src/Form/Multiselect.svench +0 -63
- package/src/Form/Radio.svelte +0 -133
- package/src/Form/Radio.svench.svx +0 -64
- package/src/Form/RichText.svelte +0 -61
- package/src/Form/RichText.svench.svx +0 -40
- package/src/Form/Select.svench +0 -62
- package/src/Form/Slider.svench +0 -26
- package/src/Form/TextArea.svench +0 -30
- package/src/Form/Toggle.svench +0 -21
- package/src/Icons/Contribution.svelte +0 -14
- package/src/Icons/Icon.svelte +0 -36
- package/src/Icons/Icon.svench +0 -109
- package/src/Icons/icon-paths.js +0 -136
- package/src/Links/Home.svelte +0 -51
- package/src/Links/Home.svench +0 -19
- package/src/List/Items/DetailSummary.svelte +0 -85
- package/src/List/Items/DetailSummary.svench +0 -53
- package/src/List/Search.svelte +0 -34
- package/src/List/Search.svench +0 -8
- package/src/Spacer/Spacer.svelte +0 -50
- package/src/Spacer/Spacer.svench +0 -51
- package/src/Styleguide/Body.svelte +0 -72
- package/src/Styleguide/Borders.svench +0 -175
- package/src/Styleguide/Budibase-logo.svelte +0 -68
- package/src/Styleguide/Color.svench +0 -201
- package/src/Styleguide/Heading.svelte +0 -74
- package/src/Styleguide/Label.svelte +0 -70
- package/src/Styleguide/Logo.svelte +0 -16
- package/src/Styleguide/Logo.svench +0 -8
- package/src/Styleguide/Spacing.svench +0 -191
- package/src/Styleguide/Typography.svench +0 -227
- package/src/Switcher/Switcher.svelte +0 -47
- package/src/Switcher/Switcher.svench +0 -27
- package/src/index.svench.svx +0 -35
- package/src/utils/buildStyle.js +0 -14
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { createEventDispatcher, getContext } from "svelte"
|
|
3
|
+
import Icon from "../Icon/Icon.svelte"
|
|
4
|
+
|
|
5
|
+
const dispatch = createEventDispatcher()
|
|
6
|
+
const actionMenu = getContext("actionMenu")
|
|
7
|
+
|
|
8
|
+
export let dataCy
|
|
9
|
+
export let icon = undefined
|
|
10
|
+
export let disabled = undefined
|
|
11
|
+
export let noClose = false
|
|
12
|
+
export let keyBind = undefined
|
|
13
|
+
|
|
14
|
+
$: keys = getKeys(keyBind)
|
|
15
|
+
|
|
16
|
+
const getKeys = keyBind => {
|
|
17
|
+
let keys = keyBind?.split("+") || []
|
|
18
|
+
for (let i = 0; i < keys.length; i++) {
|
|
19
|
+
if (
|
|
20
|
+
keys[i].toLowerCase() === "ctrl" &&
|
|
21
|
+
navigator.platform.startsWith("Mac")
|
|
22
|
+
) {
|
|
23
|
+
keys[i] = "⌘"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return keys
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const onClick = () => {
|
|
30
|
+
if (actionMenu && !noClose) {
|
|
31
|
+
actionMenu.hide()
|
|
32
|
+
}
|
|
33
|
+
dispatch("click")
|
|
34
|
+
}
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<li
|
|
38
|
+
data-cy={dataCy}
|
|
39
|
+
on:click|preventDefault={disabled ? null : onClick}
|
|
40
|
+
class="spectrum-Menu-item"
|
|
41
|
+
class:is-disabled={disabled}
|
|
42
|
+
role="menuitem"
|
|
43
|
+
tabindex="0"
|
|
44
|
+
>
|
|
45
|
+
{#if icon}
|
|
46
|
+
<div class="icon">
|
|
47
|
+
<Icon name={icon} size="S" />
|
|
48
|
+
</div>
|
|
49
|
+
{/if}
|
|
50
|
+
<span class="spectrum-Menu-itemLabel"><slot /></span>
|
|
51
|
+
{#if keys?.length}
|
|
52
|
+
<div class="keys">
|
|
53
|
+
{#each keys as key}
|
|
54
|
+
<div class="key">
|
|
55
|
+
{#if key.startsWith("!")}
|
|
56
|
+
<Icon size="XS" name={key.split("!")[1]} />
|
|
57
|
+
{:else}
|
|
58
|
+
{key}
|
|
59
|
+
{/if}
|
|
60
|
+
</div>
|
|
61
|
+
{/each}
|
|
62
|
+
</div>
|
|
63
|
+
{/if}
|
|
64
|
+
</li>
|
|
65
|
+
|
|
66
|
+
<style>
|
|
67
|
+
.icon {
|
|
68
|
+
align-self: center;
|
|
69
|
+
margin-right: var(--spacing-s);
|
|
70
|
+
}
|
|
71
|
+
.keys {
|
|
72
|
+
margin-left: 30px;
|
|
73
|
+
display: flex;
|
|
74
|
+
flex-direction: row;
|
|
75
|
+
justify-content: flex-end;
|
|
76
|
+
align-items: center;
|
|
77
|
+
gap: 4px;
|
|
78
|
+
}
|
|
79
|
+
.key {
|
|
80
|
+
color: var(--spectrum-global-color-gray-900);
|
|
81
|
+
padding: 2px 4px;
|
|
82
|
+
font-size: 12px;
|
|
83
|
+
font-weight: 600;
|
|
84
|
+
background-color: var(--spectrum-global-color-gray-300);
|
|
85
|
+
border-radius: 4px;
|
|
86
|
+
min-width: 12px;
|
|
87
|
+
height: 16px;
|
|
88
|
+
text-align: center;
|
|
89
|
+
margin: -1px 0;
|
|
90
|
+
display: grid;
|
|
91
|
+
place-items: center;
|
|
92
|
+
}
|
|
93
|
+
.is-disabled .key {
|
|
94
|
+
color: var(--spectrum-global-color-gray-600);
|
|
95
|
+
}
|
|
96
|
+
</style>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import Menu from './Menu.svelte'
|
|
3
|
+
import Separator from './Separator.svelte'
|
|
4
|
+
import Section from './Section.svelte'
|
|
5
|
+
import Item from './Item.svelte'
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<Menu>
|
|
9
|
+
<Section heading="Section heading">
|
|
10
|
+
<Item>Some Item 1</Item>
|
|
11
|
+
<Item>Some Item 2</Item>
|
|
12
|
+
<Item>Some Item 3</Item>
|
|
13
|
+
</Section>
|
|
14
|
+
<Separator />
|
|
15
|
+
<Section heading="Section heading">
|
|
16
|
+
<Item icon="SaveFloppy">Save</Item>
|
|
17
|
+
<Item disabled icon="DataDownload">Download</Item>
|
|
18
|
+
</Section>
|
|
19
|
+
</Menu>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<li class="spectrum-Menu-divider" role="separator" />
|
package/src/Modal/Content.svelte
CHANGED
|
@@ -3,15 +3,4 @@
|
|
|
3
3
|
let value = ""
|
|
4
4
|
</script>
|
|
5
5
|
|
|
6
|
-
<style>
|
|
7
|
-
p {
|
|
8
|
-
font-size: var(--font-size-m);
|
|
9
|
-
margin: 0;
|
|
10
|
-
font-family: var(--font-sans);
|
|
11
|
-
font-weight: 400;
|
|
12
|
-
line-height: 1.5;
|
|
13
|
-
color: var(--grey-7);
|
|
14
|
-
}
|
|
15
|
-
</style>
|
|
16
|
-
|
|
17
6
|
<Input label="Your Name" bind:value />
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
import { getContext } from "svelte"
|
|
3
|
-
import Context from "../context"
|
|
2
|
+
import { getContext } from "svelte"
|
|
3
|
+
import Context from "../context"
|
|
4
4
|
|
|
5
5
|
const { hide } = getContext(Context.Modal)
|
|
6
6
|
|
|
@@ -14,6 +14,13 @@
|
|
|
14
14
|
}
|
|
15
15
|
</script>
|
|
16
16
|
|
|
17
|
+
<div on:click={increment}>
|
|
18
|
+
Click me
|
|
19
|
+
{remaining}
|
|
20
|
+
more time{remaining === 1 ? "" : "s"}
|
|
21
|
+
to close this modal!
|
|
22
|
+
</div>
|
|
23
|
+
|
|
17
24
|
<style>
|
|
18
25
|
div {
|
|
19
26
|
padding: 40px;
|
|
@@ -29,7 +36,3 @@
|
|
|
29
36
|
cursor: pointer;
|
|
30
37
|
}
|
|
31
38
|
</style>
|
|
32
|
-
|
|
33
|
-
<div on:click={increment}>
|
|
34
|
-
Click me {remaining} more time{remaining === 1 ? "" : "s"} to close this modal!
|
|
35
|
-
</div>
|
package/src/Modal/Modal.svelte
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
import
|
|
2
|
+
import "@spectrum-css/modal/dist/index-vars.css"
|
|
3
|
+
import "@spectrum-css/underlay/dist/index-vars.css"
|
|
4
|
+
import { createEventDispatcher, setContext, tick } from "svelte"
|
|
3
5
|
import { fade, fly } from "svelte/transition"
|
|
4
6
|
import Portal from "svelte-portal"
|
|
5
|
-
import Context from "../context"
|
|
6
|
-
|
|
7
|
+
import Context from "../context"
|
|
8
|
+
|
|
9
|
+
export let fixed = false
|
|
10
|
+
export let inline = false
|
|
7
11
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
12
|
+
const dispatch = createEventDispatcher()
|
|
13
|
+
let visible = fixed || inline
|
|
14
|
+
let modal
|
|
11
15
|
|
|
12
|
-
let visible = false
|
|
13
16
|
$: dispatch(visible ? "show" : "hide")
|
|
14
17
|
|
|
15
18
|
export function show() {
|
|
@@ -20,93 +23,143 @@
|
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
export function hide() {
|
|
23
|
-
if (!visible) {
|
|
26
|
+
if (!visible || fixed || inline) {
|
|
24
27
|
return
|
|
25
28
|
}
|
|
26
29
|
visible = false
|
|
27
30
|
}
|
|
28
31
|
|
|
32
|
+
export function cancel() {
|
|
33
|
+
if (!visible) {
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
dispatch("cancel")
|
|
37
|
+
hide()
|
|
38
|
+
}
|
|
39
|
+
|
|
29
40
|
function handleKey(e) {
|
|
30
41
|
if (visible && e.key === "Escape") {
|
|
31
|
-
|
|
42
|
+
cancel()
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function focusModal(node) {
|
|
47
|
+
await tick()
|
|
48
|
+
|
|
49
|
+
// Try to focus first input
|
|
50
|
+
const inputs = node.querySelectorAll("input")
|
|
51
|
+
if (inputs?.length) {
|
|
52
|
+
inputs[0].focus()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Otherwise try to focus confirmation button
|
|
56
|
+
else if (modal) {
|
|
57
|
+
const confirm = modal.querySelector(".confirm-wrap .spectrum-Button")
|
|
58
|
+
if (confirm) {
|
|
59
|
+
confirm.focus()
|
|
60
|
+
}
|
|
32
61
|
}
|
|
33
62
|
}
|
|
34
63
|
|
|
35
|
-
setContext(Context.Modal, { show, hide })
|
|
64
|
+
setContext(Context.Modal, { show, hide, cancel })
|
|
36
65
|
</script>
|
|
37
66
|
|
|
38
67
|
<svelte:window on:keydown={handleKey} />
|
|
39
68
|
|
|
40
|
-
{#if
|
|
41
|
-
|
|
42
|
-
<div
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
69
|
+
{#if inline}
|
|
70
|
+
{#if visible}
|
|
71
|
+
<div use:focusModal bind:this={modal} class="spectrum-Modal inline is-open">
|
|
72
|
+
<slot />
|
|
73
|
+
</div>
|
|
74
|
+
{/if}
|
|
75
|
+
{:else}
|
|
76
|
+
<!--
|
|
77
|
+
We cannot conditionally render the portal as this leads to a missing
|
|
78
|
+
insertion point when using nested modals. Therefore we just conditionally
|
|
79
|
+
render the content of the portal.
|
|
80
|
+
It still breaks the modal animation, but its better than soft bricking the
|
|
81
|
+
screen.
|
|
82
|
+
-->
|
|
83
|
+
<Portal target=".modal-container">
|
|
84
|
+
{#if visible}
|
|
85
|
+
<div class="spectrum-Underlay is-open" on:mousedown|self={cancel}>
|
|
86
|
+
<div
|
|
87
|
+
class="background"
|
|
88
|
+
in:fade={{ duration: 200 }}
|
|
89
|
+
out:fade|local={{ duration: 200 }}
|
|
90
|
+
/>
|
|
91
|
+
<div class="modal-wrapper" on:mousedown|self={cancel}>
|
|
92
|
+
<div class="modal-inner-wrapper" on:mousedown|self={cancel}>
|
|
93
|
+
<slot name="outside" />
|
|
94
|
+
<div
|
|
95
|
+
use:focusModal
|
|
96
|
+
bind:this={modal}
|
|
97
|
+
class="spectrum-Modal is-open"
|
|
98
|
+
in:fly={{ y: 30, duration: 200 }}
|
|
99
|
+
out:fly|local={{ y: 30, duration: 200 }}
|
|
100
|
+
>
|
|
101
|
+
<slot />
|
|
102
|
+
</div>
|
|
53
103
|
</div>
|
|
54
104
|
</div>
|
|
55
105
|
</div>
|
|
56
|
-
|
|
106
|
+
{/if}
|
|
57
107
|
</Portal>
|
|
58
108
|
{/if}
|
|
59
109
|
|
|
60
110
|
<style>
|
|
61
|
-
.
|
|
62
|
-
position: fixed;
|
|
63
|
-
left: 0;
|
|
64
|
-
right: 0;
|
|
65
|
-
top: 0;
|
|
66
|
-
bottom: 0;
|
|
67
|
-
overflow-x: hidden;
|
|
68
|
-
overflow-y: auto;
|
|
111
|
+
.spectrum-Underlay {
|
|
69
112
|
display: flex;
|
|
70
113
|
flex-direction: row;
|
|
71
114
|
justify-content: center;
|
|
72
115
|
align-items: center;
|
|
73
|
-
background-color: rgba(0, 0, 0, 0.25);
|
|
74
116
|
z-index: 999;
|
|
117
|
+
overflow: auto;
|
|
118
|
+
overflow-x: hidden;
|
|
119
|
+
background: transparent;
|
|
120
|
+
}
|
|
121
|
+
.background {
|
|
122
|
+
background: var(--modal-background, rgba(0, 0, 0, 0.75));
|
|
123
|
+
position: fixed;
|
|
124
|
+
top: 0;
|
|
125
|
+
left: 0;
|
|
126
|
+
height: 100vh;
|
|
127
|
+
width: 100vw;
|
|
128
|
+
opacity: 0.65;
|
|
129
|
+
pointer-events: none;
|
|
75
130
|
}
|
|
76
131
|
|
|
77
|
-
.
|
|
132
|
+
.modal-wrapper {
|
|
78
133
|
flex: 1 1 auto;
|
|
79
134
|
display: flex;
|
|
80
135
|
flex-direction: row;
|
|
136
|
+
-moz-box-pack: center;
|
|
81
137
|
justify-content: center;
|
|
82
138
|
align-items: flex-start;
|
|
83
139
|
max-height: 100%;
|
|
84
140
|
}
|
|
85
|
-
|
|
86
|
-
.content-wrapper {
|
|
141
|
+
.modal-inner-wrapper {
|
|
87
142
|
flex: 1 1 auto;
|
|
88
143
|
display: flex;
|
|
89
144
|
flex-direction: row;
|
|
145
|
+
-moz-box-pack: center;
|
|
90
146
|
justify-content: center;
|
|
91
147
|
align-items: flex-start;
|
|
92
148
|
width: 0;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
.modal {
|
|
96
|
-
background-color: var(--background);
|
|
97
|
-
display: grid;
|
|
98
|
-
align-items: stretch;
|
|
99
|
-
box-shadow: 0 0 4rem 1.5rem rgba(0, 0, 0, 0.15);
|
|
100
149
|
position: relative;
|
|
101
|
-
flex: 0 0 400px;
|
|
102
|
-
margin: 2rem 0;
|
|
103
|
-
border-radius: var(--border-radius-m);
|
|
104
|
-
gap: var(--spacing-xl);
|
|
105
150
|
}
|
|
106
|
-
|
|
107
|
-
|
|
151
|
+
|
|
152
|
+
.spectrum-Modal {
|
|
153
|
+
overflow: visible;
|
|
154
|
+
max-height: none;
|
|
155
|
+
margin: 40px 0;
|
|
156
|
+
transform: none;
|
|
157
|
+
--spectrum-dialog-confirm-border-radius: var(
|
|
158
|
+
--spectrum-global-dimension-size-100
|
|
159
|
+
);
|
|
160
|
+
max-width: 100%;
|
|
108
161
|
}
|
|
109
|
-
.
|
|
110
|
-
border: var(--border-
|
|
162
|
+
:global(.spectrum--lightest .spectrum-Modal.inline) {
|
|
163
|
+
border: var(--border-light);
|
|
111
164
|
}
|
|
112
165
|
</style>
|
|
@@ -1,23 +1,41 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
import
|
|
2
|
+
import "@spectrum-css/dialog/dist/index-vars.css"
|
|
3
|
+
import { getContext } from "svelte"
|
|
3
4
|
import Button from "../Button/Button.svelte"
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
5
|
+
import Divider from "../Divider/Divider.svelte"
|
|
6
|
+
import Icon from "../Icon/Icon.svelte"
|
|
7
|
+
import Context from "../context"
|
|
8
|
+
import ProgressCircle from "../ProgressCircle/ProgressCircle.svelte"
|
|
7
9
|
|
|
8
10
|
export let title = undefined
|
|
11
|
+
export let size = "S"
|
|
9
12
|
export let cancelText = "Cancel"
|
|
10
13
|
export let confirmText = "Confirm"
|
|
11
14
|
export let showCancelButton = true
|
|
12
15
|
export let showConfirmButton = true
|
|
13
16
|
export let showCloseIcon = true
|
|
14
17
|
export let onConfirm = undefined
|
|
18
|
+
export let onCancel = undefined
|
|
15
19
|
export let disabled = false
|
|
20
|
+
export let showDivider = true
|
|
16
21
|
|
|
17
|
-
|
|
22
|
+
export let showSecondaryButton = false
|
|
23
|
+
export let secondaryButtonText = undefined
|
|
24
|
+
export let secondaryAction = undefined
|
|
25
|
+
export let secondaryButtonWarning = false
|
|
26
|
+
export let dataCy = null
|
|
27
|
+
const { hide, cancel } = getContext(Context.Modal)
|
|
18
28
|
let loading = false
|
|
19
29
|
$: confirmDisabled = disabled || loading
|
|
20
30
|
|
|
31
|
+
async function secondary() {
|
|
32
|
+
loading = true
|
|
33
|
+
if (!secondaryAction || (await secondaryAction()) !== false) {
|
|
34
|
+
hide()
|
|
35
|
+
}
|
|
36
|
+
loading = false
|
|
37
|
+
}
|
|
38
|
+
|
|
21
39
|
async function confirm() {
|
|
22
40
|
loading = true
|
|
23
41
|
if (!onConfirm || (await onConfirm()) !== false) {
|
|
@@ -25,108 +43,148 @@
|
|
|
25
43
|
}
|
|
26
44
|
loading = false
|
|
27
45
|
}
|
|
46
|
+
|
|
47
|
+
async function close() {
|
|
48
|
+
loading = true
|
|
49
|
+
if (!onCancel || (await onCancel()) !== false) {
|
|
50
|
+
cancel()
|
|
51
|
+
}
|
|
52
|
+
loading = false
|
|
53
|
+
}
|
|
28
54
|
</script>
|
|
29
55
|
|
|
30
|
-
<div
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
{
|
|
41
|
-
|
|
42
|
-
|
|
56
|
+
<div
|
|
57
|
+
class="spectrum-Dialog"
|
|
58
|
+
class:spectrum-Dialog--small={size === "S"}
|
|
59
|
+
class:spectrum-Dialog--medium={size === "M"}
|
|
60
|
+
class:spectrum-Dialog--large={size === "L"}
|
|
61
|
+
class:spectrum-Dialog--extraLarge={size === "XL"}
|
|
62
|
+
style="position: relative;"
|
|
63
|
+
role="dialog"
|
|
64
|
+
tabindex="-1"
|
|
65
|
+
aria-modal="true"
|
|
66
|
+
data-cy={dataCy}
|
|
67
|
+
>
|
|
68
|
+
<div class="spectrum-Dialog-grid">
|
|
69
|
+
{#if title || $$slots.header}
|
|
70
|
+
<h1
|
|
71
|
+
class="spectrum-Dialog-heading spectrum-Dialog-heading--noHeader"
|
|
72
|
+
class:noDivider={!showDivider}
|
|
73
|
+
class:header-spacing={$$slots.header}
|
|
74
|
+
>
|
|
75
|
+
{#if title}
|
|
76
|
+
{title}
|
|
77
|
+
{:else if $$slots.header}
|
|
78
|
+
<slot name="header" />
|
|
79
|
+
{/if}
|
|
80
|
+
</h1>
|
|
81
|
+
{#if showDivider}
|
|
82
|
+
<Divider />
|
|
83
|
+
{/if}
|
|
84
|
+
{/if}
|
|
85
|
+
|
|
86
|
+
<!-- TODO: Remove content-grid class once Layout components are in bbui -->
|
|
87
|
+
<section class="spectrum-Dialog-content content-grid">
|
|
88
|
+
<slot />
|
|
89
|
+
</section>
|
|
90
|
+
{#if showCancelButton || showConfirmButton || $$slots.footer}
|
|
91
|
+
<div
|
|
92
|
+
class="spectrum-ButtonGroup spectrum-Dialog-buttonGroup spectrum-Dialog-buttonGroup--noFooter"
|
|
93
|
+
>
|
|
43
94
|
<slot name="footer" />
|
|
44
|
-
|
|
45
|
-
|
|
95
|
+
{#if showSecondaryButton && secondaryButtonText && secondaryAction}
|
|
96
|
+
<div class="secondary-action">
|
|
97
|
+
<Button
|
|
98
|
+
group
|
|
99
|
+
secondary
|
|
100
|
+
warning={secondaryButtonWarning}
|
|
101
|
+
on:click={secondary}>{secondaryButtonText}</Button
|
|
102
|
+
>
|
|
103
|
+
</div>
|
|
104
|
+
{/if}
|
|
105
|
+
|
|
46
106
|
{#if showCancelButton}
|
|
47
|
-
<Button secondary on:click={
|
|
107
|
+
<Button group secondary newStyles on:click={close}>
|
|
108
|
+
{cancelText}
|
|
109
|
+
</Button>
|
|
48
110
|
{/if}
|
|
49
111
|
{#if showConfirmButton}
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
112
|
+
<span class="confirm-wrap">
|
|
113
|
+
<Button
|
|
114
|
+
group
|
|
115
|
+
cta
|
|
116
|
+
{...$$restProps}
|
|
117
|
+
disabled={confirmDisabled}
|
|
118
|
+
on:click={confirm}
|
|
119
|
+
>
|
|
120
|
+
{#if loading}
|
|
121
|
+
<ProgressCircle overBackground={true} size="S" />
|
|
122
|
+
{/if}
|
|
123
|
+
{#if !loading}
|
|
124
|
+
{confirmText}
|
|
125
|
+
{/if}
|
|
126
|
+
</Button>
|
|
127
|
+
</span>
|
|
57
128
|
{/if}
|
|
58
129
|
</div>
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
130
|
+
{/if}
|
|
131
|
+
{#if showCloseIcon}
|
|
132
|
+
<div class="close-icon">
|
|
133
|
+
<Icon hoverable name="Close" on:click={cancel} />
|
|
134
|
+
</div>
|
|
135
|
+
{/if}
|
|
136
|
+
</div>
|
|
66
137
|
</div>
|
|
67
138
|
|
|
68
139
|
<style>
|
|
69
|
-
.
|
|
140
|
+
.spectrum-Dialog--extraLarge {
|
|
141
|
+
width: 1000px;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.content-grid {
|
|
70
145
|
display: grid;
|
|
71
146
|
position: relative;
|
|
72
147
|
gap: var(--spacing-xl);
|
|
73
|
-
color: var(--ink);
|
|
74
148
|
}
|
|
75
149
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
flex-direction: row;
|
|
79
|
-
justify-content: space-between;
|
|
80
|
-
align-items: center;
|
|
81
|
-
margin-right: 40px;
|
|
150
|
+
.spectrum-Dialog-content {
|
|
151
|
+
overflow: visible;
|
|
82
152
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
153
|
+
.spectrum-Dialog-heading {
|
|
154
|
+
font-family: var(--font-sans);
|
|
155
|
+
}
|
|
156
|
+
.spectrum-Dialog-heading.noDivider {
|
|
157
|
+
margin-bottom: 12px;
|
|
86
158
|
}
|
|
87
159
|
|
|
88
|
-
.
|
|
89
|
-
|
|
90
|
-
flex-direction: row;
|
|
91
|
-
justify-content: flex-end;
|
|
92
|
-
align-items: center;
|
|
160
|
+
.spectrum-Dialog-buttonGroup {
|
|
161
|
+
gap: var(--spectrum-global-dimension-static-size-200);
|
|
93
162
|
}
|
|
94
163
|
|
|
95
164
|
.close-icon {
|
|
96
165
|
position: absolute;
|
|
97
|
-
top:
|
|
98
|
-
right:
|
|
99
|
-
color: var(--ink);
|
|
166
|
+
top: 15px;
|
|
167
|
+
right: 15px;
|
|
100
168
|
font-size: var(--font-size-m);
|
|
101
169
|
}
|
|
102
|
-
.close-icon:hover {
|
|
103
|
-
color: var(--grey-6);
|
|
104
|
-
cursor: pointer;
|
|
105
|
-
}
|
|
106
170
|
.close-icon :global(svg) {
|
|
107
171
|
margin-right: 0;
|
|
108
172
|
}
|
|
109
173
|
|
|
110
|
-
|
|
174
|
+
.header-spacing {
|
|
111
175
|
display: flex;
|
|
112
|
-
flex-direction: row;
|
|
113
176
|
justify-content: space-between;
|
|
114
|
-
align-items: center;
|
|
115
|
-
gap: var(--spacing-m);
|
|
116
177
|
}
|
|
117
178
|
|
|
118
|
-
.
|
|
119
|
-
|
|
120
|
-
flex-direction: row;
|
|
121
|
-
justify-content: flex-start;
|
|
122
|
-
align-items: center;
|
|
179
|
+
.secondary-action {
|
|
180
|
+
margin-right: auto;
|
|
123
181
|
}
|
|
124
182
|
|
|
125
|
-
.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
183
|
+
.spectrum-Dialog-buttonGroup {
|
|
184
|
+
padding-left: 0;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.confirm-wrap :global(.spectrum-Button-label) {
|
|
188
|
+
display: contents;
|
|
131
189
|
}
|
|
132
190
|
</style>
|