@budibase/bbui 1.58.13 → 2.0.0

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
@@ -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,7 @@
1
+ <script>
2
+ import "@spectrum-css/menu/dist/index-vars.css"
3
+ </script>
4
+
5
+ <ul class="spectrum-Menu" role="menu">
6
+ <slot />
7
+ </ul>
@@ -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,10 @@
1
+ <script>
2
+ export let heading
3
+ </script>
4
+
5
+ <li role="presentation">
6
+ <span class="spectrum-Menu-sectionHeading">{heading}</span>
7
+ <ul class="spectrum-Menu" role="group">
8
+ <slot />
9
+ </ul>
10
+ </li>
@@ -0,0 +1 @@
1
+ <li class="spectrum-Menu-divider" role="separator" />
@@ -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>
@@ -1,15 +1,18 @@
1
1
  <script>
2
- import { createEventDispatcher, setContext } from "svelte"
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
- const dispatch = createEventDispatcher()
7
+ import Context from "../context"
8
+
9
+ export let fixed = false
10
+ export let inline = false
7
11
 
8
- export let padding = true
9
- export let width = undefined
10
- export let border = true
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
- hide()
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 visible}
41
- <Portal target="body">
42
- <div
43
- class="overlay"
44
- on:click|self={hide}
45
- transition:fade={{ duration: 200 }}>
46
- <div
47
- class="scroll-wrapper"
48
- on:click|self={hide}
49
- transition:fly={{ y: 30, duration: 200 }}>
50
- <div class="content-wrapper" on:click|self={hide}>
51
- <div class="modal" class:padding class:border style={width ? `flex: 0 0 ${width}` : ""}>
52
- <slot/>
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
- </div>
106
+ {/if}
57
107
  </Portal>
58
108
  {/if}
59
109
 
60
110
  <style>
61
- .overlay {
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
- .scroll-wrapper {
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
- .modal.padding {
107
- padding: var(--spacing-xl);
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
- .modal.border {
110
- border: var(--border-dark);
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 { createEventDispatcher, getContext } from "svelte"
2
+ import "@spectrum-css/dialog/dist/index-vars.css"
3
+ import { getContext } from "svelte"
3
4
  import Button from "../Button/Button.svelte"
4
- import Icon from "../Icons/Icon.svelte";
5
- import Context from "../context";
6
- const dispatch = createEventDispatcher()
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
- const { hide } = getContext(Context.Modal)
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 class="modal-content">
31
- {#if title}
32
- <header>
33
- <h5>{title}</h5>
34
- <div class="header-content">
35
- <slot name="header" />
36
- </div>
37
- </header>
38
- {/if}
39
- <slot />
40
- {#if showCancelButton || showConfirmButton}
41
- <footer>
42
- <div class="footer-content">
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
- </div>
45
- <div class="buttons">
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={hide}>{cancelText}</Button>
107
+ <Button group secondary newStyles on:click={close}>
108
+ {cancelText}
109
+ </Button>
48
110
  {/if}
49
111
  {#if showConfirmButton}
50
- <Button
51
- primary
52
- {...$$restProps}
53
- disabled={confirmDisabled}
54
- on:click={confirm}>
55
- {confirmText}
56
- </Button>
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
- </footer>
60
- {/if}
61
- {#if showCloseIcon}
62
- <div class="close-icon" on:click={hide}>
63
- <Icon name="closeline" />
64
- </div>
65
- {/if}
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
- .modal-content {
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
- header {
77
- display: flex;
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
- header h5 {
84
- margin: 0;
85
- font-weight: 500;
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
- .header-content {
89
- display: flex;
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: 0;
98
- right: 0;
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
- footer {
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
- .footer-content {
119
- display: flex;
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
- .buttons {
126
- display: flex;
127
- flex-direction: row;
128
- justify-content: flex-end;
129
- align-items: center;
130
- gap: var(--spacing-m);
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>