@budibase/bbui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/LICENSE +375 -0
  2. package/README.md +42 -0
  3. package/dist/bbui.es.js +8 -0
  4. package/dist/bbui.es.js.map +1 -0
  5. package/package.json +94 -0
  6. package/src/Accordion/Accordion.svelte +58 -0
  7. package/src/ActionButton/ActionButton.svelte +132 -0
  8. package/src/ActionGroup/ActionGroup.svelte +26 -0
  9. package/src/ActionMenu/ActionMenu.svelte +43 -0
  10. package/src/Actions/ClickOutside.svench.svx +30 -0
  11. package/src/Actions/PositionDropdown.svench.svx +81 -0
  12. package/src/Actions/autoresize_textarea.js +14 -0
  13. package/src/Actions/click_outside.js +76 -0
  14. package/src/Actions/position_dropdown.js +116 -0
  15. package/src/Avatar/Avatar.svelte +63 -0
  16. package/src/Badge/Badge.svelte +42 -0
  17. package/src/Banner/Banner.svelte +72 -0
  18. package/src/Banner/BannerDisplay.svelte +41 -0
  19. package/src/Button/Button.svelte +118 -0
  20. package/src/Button/Button.svench +138 -0
  21. package/src/ButtonGroup/ButtonGroup.svelte +30 -0
  22. package/src/ClearButton/ClearButton.svelte +19 -0
  23. package/src/ColorPicker/ColorPicker.svelte +304 -0
  24. package/src/DetailSummary/DetailSummary.svelte +92 -0
  25. package/src/Divider/Divider.svelte +28 -0
  26. package/src/Drawer/Drawer.svelte +113 -0
  27. package/src/Drawer/Drawer.svench +42 -0
  28. package/src/Drawer/DrawerContent.svelte +45 -0
  29. package/src/FancyForm/FancyButton.svelte +30 -0
  30. package/src/FancyForm/FancyButtonRadio.svelte +70 -0
  31. package/src/FancyForm/FancyCheckbox.svelte +53 -0
  32. package/src/FancyForm/FancyField.svelte +126 -0
  33. package/src/FancyForm/FancyFieldLabel.svelte +25 -0
  34. package/src/FancyForm/FancyForm.svelte +40 -0
  35. package/src/FancyForm/FancyInput.svelte +109 -0
  36. package/src/FancyForm/FancySelect.svelte +147 -0
  37. package/src/FancyForm/index.js +6 -0
  38. package/src/Form/Checkbox.svelte +23 -0
  39. package/src/Form/Combobox.svelte +45 -0
  40. package/src/Form/Core/Checkbox.svelte +69 -0
  41. package/src/Form/Core/CheckboxGroup.svelte +68 -0
  42. package/src/Form/Core/Combobox.svelte +142 -0
  43. package/src/Form/Core/DatePicker.svelte +265 -0
  44. package/src/Form/Core/Dropzone.svelte +482 -0
  45. package/src/Form/Core/EnvDropdown.svelte +276 -0
  46. package/src/Form/Core/File.svelte +115 -0
  47. package/src/Form/Core/InputDropdown.svelte +235 -0
  48. package/src/Form/Core/Multiselect.svelte +99 -0
  49. package/src/Form/Core/Picker.svelte +314 -0
  50. package/src/Form/Core/PickerDropdown.svelte +431 -0
  51. package/src/Form/Core/RadioGroup.svelte +65 -0
  52. package/src/Form/Core/RichTextField.svelte +42 -0
  53. package/src/Form/Core/Search.svelte +105 -0
  54. package/src/Form/Core/Select.svelte +90 -0
  55. package/src/Form/Core/Slider.svelte +86 -0
  56. package/src/Form/Core/Stepper.svelte +172 -0
  57. package/src/Form/Core/Switch.svelte +35 -0
  58. package/src/Form/Core/TextArea.svelte +78 -0
  59. package/src/Form/Core/TextField.svelte +115 -0
  60. package/src/Form/Core/index.js +16 -0
  61. package/src/Form/DatePicker.svelte +46 -0
  62. package/src/Form/Dropzone.svelte +44 -0
  63. package/src/Form/EnvDropdown.svelte +50 -0
  64. package/src/Form/Field.svelte +42 -0
  65. package/src/Form/FieldLabel.svelte +32 -0
  66. package/src/Form/File.svelte +37 -0
  67. package/src/Form/Input.svelte +45 -0
  68. package/src/Form/InputDropdown.svelte +53 -0
  69. package/src/Form/Multiselect.svelte +49 -0
  70. package/src/Form/PickerDropdown.svelte +131 -0
  71. package/src/Form/RadioGroup.svelte +42 -0
  72. package/src/Form/RichTextField.svelte +36 -0
  73. package/src/Form/Search.svelte +36 -0
  74. package/src/Form/Select.svelte +67 -0
  75. package/src/Form/Slider.svelte +24 -0
  76. package/src/Form/Stepper.svelte +45 -0
  77. package/src/Form/TextArea.svelte +34 -0
  78. package/src/Form/Toggle.svelte +22 -0
  79. package/src/Icon/Icon.svelte +94 -0
  80. package/src/Icon/IconAvatar.svelte +61 -0
  81. package/src/IconPicker/IconPicker.svelte +184 -0
  82. package/src/IconSideNav/IconSideNav.svelte +14 -0
  83. package/src/IconSideNav/IconSideNavItem.svelte +56 -0
  84. package/src/InlineAlert/InlineAlert.svelte +63 -0
  85. package/src/Input/CopyInput.svelte +59 -0
  86. package/src/Label/Label.svelte +31 -0
  87. package/src/Layout/Layout.svelte +94 -0
  88. package/src/Layout/Page.svelte +101 -0
  89. package/src/Link/Link.svelte +27 -0
  90. package/src/List/List.svelte +28 -0
  91. package/src/List/ListItem.svelte +93 -0
  92. package/src/Markdown/MarkdownEditor.svelte +60 -0
  93. package/src/Markdown/MarkdownViewer.svelte +70 -0
  94. package/src/Markdown/SpectrumMDE.svelte +184 -0
  95. package/src/Menu/Item.svelte +94 -0
  96. package/src/Menu/Menu.svelte +7 -0
  97. package/src/Menu/Menu.svench +19 -0
  98. package/src/Menu/Section.svelte +10 -0
  99. package/src/Menu/Separator.svelte +1 -0
  100. package/src/Modal/Content.svelte +6 -0
  101. package/src/Modal/CustomContent.svelte +37 -0
  102. package/src/Modal/Modal.svelte +178 -0
  103. package/src/Modal/Modal.svench +116 -0
  104. package/src/Modal/ModalContent.svelte +190 -0
  105. package/src/Modal/QuizModal.svelte +53 -0
  106. package/src/Notification/Notification.svelte +74 -0
  107. package/src/Notification/NotificationDisplay.svelte +43 -0
  108. package/src/Pagination/Pagination.svelte +57 -0
  109. package/src/Popover/Popover.svelte +95 -0
  110. package/src/Popover/Popover.svench +120 -0
  111. package/src/ProgressBar/ProgressBar.svelte +67 -0
  112. package/src/ProgressCircle/ProgressCircle.svelte +62 -0
  113. package/src/SideNavigation/Item.svelte +59 -0
  114. package/src/SideNavigation/Navigation.svelte +12 -0
  115. package/src/StatusLight/StatusLight.svelte +80 -0
  116. package/src/Stores/Notifications.svench.svx +78 -0
  117. package/src/Stores/banner.js +65 -0
  118. package/src/Stores/notifications.js +84 -0
  119. package/src/Table/ArrayRenderer.svelte +18 -0
  120. package/src/Table/AttachmentRenderer.svelte +73 -0
  121. package/src/Table/BoldRenderer.svelte +15 -0
  122. package/src/Table/BooleanRenderer.svelte +42 -0
  123. package/src/Table/CellRenderer.svelte +70 -0
  124. package/src/Table/CodeRenderer.svelte +14 -0
  125. package/src/Table/DateTimeRenderer.svelte +29 -0
  126. package/src/Table/InternalRenderer.svelte +24 -0
  127. package/src/Table/RelationshipRenderer.svelte +35 -0
  128. package/src/Table/SelectEditRenderer.svelte +28 -0
  129. package/src/Table/StringRenderer.svelte +22 -0
  130. package/src/Table/Table.svelte +657 -0
  131. package/src/Table/index.js +1 -0
  132. package/src/Tabs/Tab.svelte +88 -0
  133. package/src/Tabs/Tabs.svelte +130 -0
  134. package/src/Tags/Tag.svelte +43 -0
  135. package/src/Tags/Tags.svelte +17 -0
  136. package/src/Tooltip/Tooltip.svelte +34 -0
  137. package/src/Tooltip/TooltipWrapper.svelte +60 -0
  138. package/src/TreeView/Item.svelte +41 -0
  139. package/src/TreeView/Tree.svelte +16 -0
  140. package/src/Typography/Body.svelte +22 -0
  141. package/src/Typography/Code.svelte +10 -0
  142. package/src/Typography/Detail.svelte +19 -0
  143. package/src/Typography/Heading.svelte +24 -0
  144. package/src/bbui.css +118 -0
  145. package/src/context.js +4 -0
  146. package/src/helpers.js +116 -0
  147. package/src/index.js +109 -0
  148. package/src/spectrum-icons-rollup.js +31 -0
  149. package/src/spectrum-icons-vite.js +31 -0
@@ -0,0 +1,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>