@budibase/bbui 1.0.0 → 1.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 (128) hide show
  1. package/LICENSE +375 -0
  2. package/README.md +19 -17
  3. package/dist/bbui.es.js +2 -0
  4. package/dist/bbui.es.js.map +1 -0
  5. package/package.json +68 -26
  6. package/src/ActionButton/ActionButton.svelte +83 -0
  7. package/src/ActionGroup/ActionGroup.svelte +26 -0
  8. package/src/ActionMenu/ActionMenu.svelte +43 -0
  9. package/src/Actions/ClickOutside.svench.svx +30 -0
  10. package/src/Actions/PositionDropdown.svench.svx +81 -0
  11. package/src/Actions/autoresize_textarea.js +14 -0
  12. package/src/Actions/click_outside.js +18 -0
  13. package/src/Actions/position_dropdown.js +66 -0
  14. package/src/Avatar/Avatar.svelte +49 -0
  15. package/src/Badge/Badge.svelte +29 -0
  16. package/src/Button/Button.svelte +52 -0
  17. package/src/Button/Button.svench +138 -0
  18. package/src/ButtonGroup/ButtonGroup.svelte +19 -0
  19. package/src/ClearButton/ClearButton.svelte +19 -0
  20. package/src/ColorPicker/ColorPicker.svelte +292 -0
  21. package/src/DetailSummary/DetailSummary.svelte +83 -0
  22. package/src/Divider/Divider.svelte +25 -0
  23. package/src/Drawer/Drawer.svelte +85 -0
  24. package/src/Drawer/Drawer.svench +42 -0
  25. package/src/Drawer/DrawerContent.svelte +46 -0
  26. package/src/Form/Checkbox.svelte +23 -0
  27. package/src/Form/Combobox.svelte +44 -0
  28. package/src/Form/Core/Checkbox.svelte +67 -0
  29. package/src/Form/Core/Combobox.svelte +156 -0
  30. package/src/Form/Core/DatePicker.svelte +183 -0
  31. package/src/Form/Core/Dropzone.svelte +393 -0
  32. package/src/Form/Core/Multiselect.svelte +88 -0
  33. package/src/Form/Core/Picker.svelte +241 -0
  34. package/src/Form/Core/RadioGroup.svelte +47 -0
  35. package/src/Form/Core/Search.svelte +101 -0
  36. package/src/Form/Core/Select.svelte +81 -0
  37. package/src/Form/Core/Stepper.svelte +172 -0
  38. package/src/Form/Core/Switch.svelte +35 -0
  39. package/src/Form/Core/TextArea.svelte +60 -0
  40. package/src/Form/Core/TextField.svelte +104 -0
  41. package/src/Form/Core/index.js +12 -0
  42. package/src/Form/DatePicker.svelte +33 -0
  43. package/src/Form/Dropzone.svelte +34 -0
  44. package/src/Form/Field.svelte +41 -0
  45. package/src/Form/FieldLabel.svelte +27 -0
  46. package/src/Form/Input.svelte +38 -45
  47. package/src/Form/Multiselect.svelte +39 -0
  48. package/src/Form/RadioGroup.svelte +38 -0
  49. package/src/Form/Search.svelte +32 -0
  50. package/src/Form/Select.svelte +45 -43
  51. package/src/Form/Stepper.svelte +45 -0
  52. package/src/Form/TextArea.svelte +25 -44
  53. package/src/Form/Toggle.svelte +23 -0
  54. package/src/Icon/Icon.svelte +47 -0
  55. package/src/InlineAlert/InlineAlert.svelte +56 -0
  56. package/src/Label/Label.svelte +67 -0
  57. package/src/Layout/Layout.svelte +75 -0
  58. package/src/Layout/Page.svelte +25 -0
  59. package/src/Link/Link.svelte +22 -0
  60. package/src/List/Items/DetailSummary.svench +53 -0
  61. package/src/Menu/Item.svelte +45 -0
  62. package/src/Menu/Menu.svelte +7 -0
  63. package/src/Menu/Menu.svench +19 -0
  64. package/src/Menu/Section.svelte +10 -0
  65. package/src/Menu/Separator.svelte +1 -0
  66. package/src/Modal/Content.svelte +6 -0
  67. package/src/Modal/CustomContent.svelte +38 -0
  68. package/src/Modal/Modal.svelte +133 -0
  69. package/src/Modal/Modal.svench +117 -0
  70. package/src/Modal/ModalContent.svelte +139 -0
  71. package/src/Modal/QuizModal.svelte +54 -0
  72. package/src/Notification/Notification.svelte +20 -0
  73. package/src/Notification/NotificationDisplay.svelte +36 -0
  74. package/src/Pagination/Pagination.svelte +57 -0
  75. package/src/Popover/Popover.svelte +52 -0
  76. package/src/Popover/Popover.svench +121 -0
  77. package/src/ProgressBar/ProgressBar.svelte +54 -0
  78. package/src/ProgressCircle/ProgressCircle.svelte +62 -0
  79. package/src/SideNavigation/Item.svelte +45 -0
  80. package/src/SideNavigation/Navigation.svelte +12 -0
  81. package/src/StatusLight/StatusLight.svelte +41 -0
  82. package/src/Stores/Notifications.svench.svx +78 -0
  83. package/src/Stores/notifications.js +56 -0
  84. package/src/Table/ArrayRenderer.svelte +17 -0
  85. package/src/Table/AttachmentRenderer.svelte +55 -0
  86. package/src/Table/BooleanRenderer.svelte +42 -0
  87. package/src/Table/CellRenderer.svelte +37 -0
  88. package/src/Table/DateTimeRenderer.svelte +13 -0
  89. package/src/Table/InternalRenderer.svelte +28 -0
  90. package/src/Table/RelationshipRenderer.svelte +40 -0
  91. package/src/Table/SelectEditRenderer.svelte +16 -0
  92. package/src/Table/StringRenderer.svelte +13 -0
  93. package/src/Table/Table.svelte +506 -0
  94. package/src/Table/index.js +1 -0
  95. package/src/Tabs/Tab.svelte +66 -0
  96. package/src/Tabs/Tabs.svelte +105 -0
  97. package/src/Tags/Tag.svelte +43 -0
  98. package/src/Tags/Tags.svelte +7 -0
  99. package/src/Tooltip/Tooltip.svelte +24 -0
  100. package/src/TreeView/Item.svelte +41 -0
  101. package/src/TreeView/Tree.svelte +16 -0
  102. package/src/Typography/Body.svelte +19 -0
  103. package/src/Typography/Code.svelte +10 -0
  104. package/src/Typography/Detail.svelte +15 -0
  105. package/src/Typography/Heading.svelte +16 -0
  106. package/src/bbui.css +96 -0
  107. package/src/context.js +3 -0
  108. package/src/index.js +75 -10
  109. package/src/spectrum-icons-rollup.js +31 -0
  110. package/src/spectrum-icons-vite.js +31 -0
  111. package/src/utils/helpers.js +8 -0
  112. package/dist/bundle.css +0 -6
  113. package/dist/bundle.css.map +0 -18
  114. package/dist/index.js +0 -919
  115. package/dist/index.mjs +0 -906
  116. package/src/Branding/Budibase-logo.svelte +0 -68
  117. package/src/Branding/Logo.svelte +0 -16
  118. package/src/Branding/Logo.svench +0 -8
  119. package/src/Form/Button.svelte +0 -52
  120. package/src/Form/Button.svench +0 -26
  121. package/src/Form/Input.svench +0 -8
  122. package/src/Form/Select.svench +0 -8
  123. package/src/Form/TextArea.svench +0 -8
  124. package/src/Links/Home.svelte +0 -49
  125. package/src/Links/Home.svench +0 -19
  126. package/src/actions/autoresize_textarea.js +0 -14
  127. package/src/icons/Contribution.svelte +0 -14
  128. package/src/index.svench.svx +0 -35
@@ -0,0 +1,138 @@
1
+ <script>
2
+ import { View } from "svench";
3
+ import Button from "./Button.svelte";
4
+ import Icon from "../Icons/Icon.svelte";
5
+ </script>
6
+
7
+ <View name="Primary">
8
+ <Button primary small on:click={() => alert('Clicked!')}>Small</Button>
9
+ <Button primary on:click={() => alert('Clicked!')}>Default</Button>
10
+ <Button primary medium on:click={() => alert('Clicked!')}>Medium</Button>
11
+ <Button primary large on:click={() => alert('Clicked!')}>Large</Button>
12
+ <Button primary wide on:click={() => alert('Clicked!')}>Wide</Button>
13
+ </View>
14
+ <View name="Secondary">
15
+ <Button secondary small on:click={() => alert('Clicked!')}>Small</Button>
16
+ <Button secondary on:click={() => alert('Clicked!')}>Default</Button>
17
+ <Button secondary medium on:click={() => alert('Clicked!')}>Medium</Button>
18
+ <Button secondary large on:click={() => alert('Clicked!')}>Large</Button>
19
+ <Button secondary wide on:click={() => alert('Clicked!')}>Wide</Button>
20
+ </View>
21
+ <View name="Translucent">
22
+ <div class="translucent">
23
+ <div class="light">
24
+ <Button translucent small on:click={() => alert('Clicked!')}>Small</Button>
25
+ <Button translucent on:click={() => alert('Clicked!')}>Default</Button>
26
+ <Button translucent medium on:click={() => alert('Clicked!')}>Medium</Button>
27
+ <Button translucent large on:click={() => alert('Clicked!')}>Large</Button>
28
+ <Button translucent wide on:click={() => alert('Clicked!')}>Wide</Button>
29
+ </div>
30
+ <div class="dark">
31
+ <Button translucent small on:click={() => alert('Clicked!')}>Small</Button>
32
+ <Button translucent on:click={() => alert('Clicked!')}>Default</Button>
33
+ <Button translucent medium on:click={() => alert('Clicked!')}>Medium</Button>
34
+ <Button translucent large on:click={() => alert('Clicked!')}>Large</Button>
35
+ <Button translucent wide on:click={() => alert('Clicked!')}>Wide</Button>
36
+ </div>
37
+ </div>
38
+ </View>
39
+ <View name="Blue">
40
+ <Button blue small on:click={() => alert('Clicked!')}>Small</Button>
41
+ <Button blue on:click={() => alert('Clicked!')}>Default</Button>
42
+ <Button blue medium on:click={() => alert('Clicked!')}>Medium</Button>
43
+ <Button blue large on:click={() => alert('Clicked!')}>Large</Button>
44
+ <Button blue wide on:click={() => alert('Clicked!')}>Wide</Button>
45
+ </View>
46
+ <View name="Red">
47
+ <Button red small on:click={() => alert('Clicked!')}>Small</Button>
48
+ <Button red on:click={() => alert('Clicked!')}>Default</Button>
49
+ <Button red medium on:click={() => alert('Clicked!')}>Medium</Button>
50
+ <Button red large on:click={() => alert('Clicked!')}>Large</Button>
51
+ <Button red wide on:click={() => alert('Clicked!')}>Wide</Button>
52
+ </View>
53
+ <View name="Yellow">
54
+ <Button yellow small on:click={() => alert('Clicked!')}>Small</Button>
55
+ <Button yellow on:click={() => alert('Clicked!')}>Default</Button>
56
+ <Button yellow medium on:click={() => alert('Clicked!')}>Medium</Button>
57
+ <Button yellow large on:click={() => alert('Clicked!')}>Large</Button>
58
+ <Button yellow wide on:click={() => alert('Clicked!')}>Wide</Button>
59
+ </View>
60
+ <View name="Orange">
61
+ <Button orange small on:click={() => alert('Clicked!')}>Small</Button>
62
+ <Button orange on:click={() => alert('Clicked!')}>Default</Button>
63
+ <Button orange medium on:click={() => alert('Clicked!')}>Medium</Button>
64
+ <Button orange large on:click={() => alert('Clicked!')}>Large</Button>
65
+ <Button orange wide on:click={() => alert('Clicked!')}>Wide</Button>
66
+ </View>
67
+ <View name="Green">
68
+ <Button green small on:click={() => alert('Clicked!')}>Small</Button>
69
+ <Button green on:click={() => alert('Clicked!')}>Default</Button>
70
+ <Button green medium on:click={() => alert('Clicked!')}>Medium</Button>
71
+ <Button green large on:click={() => alert('Clicked!')}>Large</Button>
72
+ <Button green wide on:click={() => alert('Clicked!')}>Wide</Button>
73
+ </View>
74
+ <View name="Purple">
75
+ <Button purple small on:click={() => alert('Clicked!')}>Small</Button>
76
+ <Button purple on:click={() => alert('Clicked!')}>Default</Button>
77
+ <Button purple medium on:click={() => alert('Clicked!')}>Medium</Button>
78
+ <Button purple large on:click={() => alert('Clicked!')}>Large</Button>
79
+ <Button purple wide on:click={() => alert('Clicked!')}>Wide</Button>
80
+ </View>
81
+ <View name="Disabled">
82
+ <Button primary disabled on:click={() => alert('Clicked!')}>Disabled</Button>
83
+ </View>
84
+ <View name="Button With Icon">
85
+ <Button primary small on:click={() => alert('Clicked!')}>
86
+ <Icon name="addrow" direction="n" />
87
+ Small
88
+ </Button>
89
+ <Button primary on:click={() => alert('Clicked!')}>
90
+ <Icon name="add" direction="n" />
91
+ Default
92
+ </Button>
93
+ <Button primary medium on:click={() => alert('Clicked!')}>
94
+ <Icon name="addcolumn" direction="n" />
95
+ Medium
96
+ </Button>
97
+ <Button primary large on:click={() => alert('Clicked!')}>
98
+ <Icon name="copy" direction="n" />
99
+ Large
100
+ </Button>
101
+ <Button primary wide on:click={() => alert('Clicked!')}>
102
+ <Icon name="view" direction="n" />
103
+ Wide
104
+ </Button>
105
+ </View>
106
+ <View name="Button with symbols">
107
+ <Button primary small on:click={() => alert('Clicked!')}>⊗ Small</Button>
108
+ <Button primary on:click={() => alert('Clicked!')}>↓ Default</Button>
109
+ <Button primary medium on:click={() => alert('Clicked!')}>+ Medium</Button>
110
+ <Button primary large on:click={() => alert('Clicked!')}>⋯ Large</Button>
111
+ <Button primary wide on:click={() => alert('Clicked!')}>⊕ Wide</Button>
112
+ </View>
113
+ <View
114
+ name="use Knobs"
115
+ knobs={{ primary: true, secondary: false, blue: false, red: false, yellow: false, orange: false, green: false, purple: false, disabled: false, small: false, medium: false, large: false, wide: false, text: false }}
116
+ let:knobs>
117
+ <Button {...knobs} on:click={() => alert('Clicked!')}>Knooby</Button>
118
+ </View>
119
+ <View name="a link that looks like a button">
120
+ <Button primary href="https://google.com">Linkbutton</Button>
121
+ </View>
122
+
123
+
124
+ <style>
125
+ .translucent {
126
+ display: flex;
127
+ gap: 20px;
128
+ }
129
+ .translucent > div {
130
+ padding: 10px;
131
+ }
132
+ .light {
133
+ background-color: white;
134
+ }
135
+ .dark {
136
+ background-color: #2a2a2a;
137
+ }
138
+ </style>
@@ -0,0 +1,19 @@
1
+ <script>
2
+ import "@spectrum-css/buttongroup/dist/index-vars.css"
3
+ export let vertical = false
4
+
5
+ function group(element) {
6
+ const buttons = Array.from(element.getElementsByTagName("button"))
7
+ buttons.forEach(button => {
8
+ button.classList.add("spectrum-ButtonGroup-item")
9
+ })
10
+ }
11
+ </script>
12
+
13
+ <div
14
+ use:group
15
+ class="spectrum-ButtonGroup"
16
+ class:spectrum-ButtonGroup--vertical={vertical}
17
+ >
18
+ <slot />
19
+ </div>
@@ -0,0 +1,19 @@
1
+ <script>
2
+ export let small = false
3
+ export let disabled
4
+ </script>
5
+
6
+ <button
7
+ on:click
8
+ class="spectrum-ClearButton"
9
+ class:spectrum-ClearButton--small={small}
10
+ {disabled}
11
+ >
12
+ <svg
13
+ class="spectrum-Icon spectrum-UIIcon-Cross75"
14
+ focusable="false"
15
+ aria-hidden="true"
16
+ >
17
+ <use xlink:href="#spectrum-css-icon-Cross75" />
18
+ </svg>
19
+ </button>
@@ -0,0 +1,292 @@
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 "../utils/helpers"
9
+
10
+ export let value
11
+ export let size = "M"
12
+ export let spectrumTheme
13
+
14
+ let open = false
15
+
16
+ $: customValue = getCustomValue(value)
17
+ $: checkColor = getCheckColor(value)
18
+
19
+ const dispatch = createEventDispatcher()
20
+ const categories = [
21
+ {
22
+ label: "Theme",
23
+ colors: [
24
+ "gray-50",
25
+ "gray-75",
26
+ "gray-100",
27
+ "gray-200",
28
+ "gray-300",
29
+ "gray-400",
30
+ "gray-500",
31
+ "gray-600",
32
+ "gray-700",
33
+ "gray-800",
34
+ "gray-900",
35
+ ],
36
+ },
37
+ {
38
+ label: "Colors",
39
+ colors: [
40
+ "red-400",
41
+ "orange-400",
42
+ "yellow-400",
43
+ "green-400",
44
+ "seafoam-400",
45
+ "blue-400",
46
+ "indigo-400",
47
+ "magenta-400",
48
+
49
+ "red-500",
50
+ "orange-500",
51
+ "yellow-500",
52
+ "green-500",
53
+ "seafoam-500",
54
+ "blue-500",
55
+ "indigo-500",
56
+ "magenta-500",
57
+
58
+ "red-600",
59
+ "orange-600",
60
+ "yellow-600",
61
+ "green-600",
62
+ "seafoam-600",
63
+ "blue-600",
64
+ "indigo-600",
65
+ "magenta-600",
66
+
67
+ "red-700",
68
+ "orange-700",
69
+ "yellow-700",
70
+ "green-700",
71
+ "seafoam-700",
72
+ "blue-700",
73
+ "indigo-700",
74
+ "magenta-700",
75
+
76
+ "static-white",
77
+ "static-black",
78
+ ],
79
+ },
80
+ ]
81
+
82
+ const onChange = value => {
83
+ dispatch("change", value)
84
+ open = false
85
+ }
86
+
87
+ const getCustomValue = value => {
88
+ if (!value) {
89
+ return value
90
+ }
91
+ let found = false
92
+ const comparisonValue = value.substring(28, value.length - 1)
93
+ for (let category of categories) {
94
+ found = category.colors.includes(comparisonValue)
95
+ if (found) {
96
+ break
97
+ }
98
+ }
99
+ return found ? null : value
100
+ }
101
+
102
+ const prettyPrint = color => {
103
+ return capitalise(color.split("-").join(" "))
104
+ }
105
+
106
+ const getCheckColor = value => {
107
+ // Use dynamic color for theme grays
108
+ if (value?.includes("gray")) {
109
+ return /^.*(gray-(50|75|100|200|300|400|500))\)$/.test(value)
110
+ ? "var(--spectrum-global-color-gray-900)"
111
+ : "var(--spectrum-global-color-gray-50)"
112
+ }
113
+
114
+ // Use black check for static white
115
+ if (value?.includes("static-black")) {
116
+ return "var(--spectrum-global-color-static-gray-50)"
117
+ }
118
+
119
+ return "var(--spectrum-global-color-static-gray-900)"
120
+ }
121
+ </script>
122
+
123
+ <div class="container">
124
+ <div class="preview size--{size || 'M'}" on:click={() => (open = true)}>
125
+ <div
126
+ class="fill {spectrumTheme || ''}"
127
+ style={value ? `background: ${value};` : ""}
128
+ class:placeholder={!value}
129
+ />
130
+ </div>
131
+ {#if open}
132
+ <div
133
+ use:clickOutside={() => (open = false)}
134
+ transition:fly={{ y: -20, duration: 200 }}
135
+ class="spectrum-Popover spectrum-Popover--bottom spectrum-Picker-popover is-open"
136
+ >
137
+ {#each categories as category}
138
+ <div class="category">
139
+ <div class="heading">{category.label}</div>
140
+ <div class="colors">
141
+ {#each category.colors as color}
142
+ <div
143
+ on:click={() => {
144
+ onChange(`var(--spectrum-global-color-${color})`)
145
+ }}
146
+ class="color"
147
+ title={prettyPrint(color)}
148
+ >
149
+ <div
150
+ class="fill {spectrumTheme || ''}"
151
+ style="background: var(--spectrum-global-color-{color}); color: {checkColor};"
152
+ >
153
+ {#if value === `var(--spectrum-global-color-${color})`}
154
+ <Icon name="Checkmark" size="S" />
155
+ {/if}
156
+ </div>
157
+ </div>
158
+ {/each}
159
+ </div>
160
+ </div>
161
+ {/each}
162
+ <div class="category category--custom">
163
+ <div class="heading">Custom</div>
164
+ <div class="custom">
165
+ <Input
166
+ updateOnChange={false}
167
+ quiet
168
+ placeholder="Hex, RGB, HSL..."
169
+ value={customValue}
170
+ on:change
171
+ />
172
+ <Icon
173
+ size="S"
174
+ name="Close"
175
+ hoverable
176
+ on:click={() => onChange(null)}
177
+ />
178
+ </div>
179
+ </div>
180
+ </div>
181
+ {/if}
182
+ </div>
183
+
184
+ <style>
185
+ .container {
186
+ position: relative;
187
+ }
188
+ .preview {
189
+ width: 32px;
190
+ height: 32px;
191
+ border-radius: 100%;
192
+ position: relative;
193
+ transition: border-color 130ms ease-in-out;
194
+ box-shadow: 0 0 0 1px var(--spectrum-global-color-gray-400);
195
+ }
196
+ .preview:hover {
197
+ cursor: pointer;
198
+ box-shadow: 0 0 2px 2px var(--spectrum-global-color-gray-400);
199
+ }
200
+ .fill {
201
+ width: 100%;
202
+ height: 100%;
203
+ border-radius: 100%;
204
+ position: absolute;
205
+ top: 0;
206
+ left: 0;
207
+ display: grid;
208
+ place-items: center;
209
+ }
210
+ .fill.placeholder {
211
+ background-position: 0 0, 10px 10px;
212
+ background-size: 20px 20px;
213
+ background-image: linear-gradient(
214
+ 45deg,
215
+ #eee 25%,
216
+ transparent 25%,
217
+ transparent 75%,
218
+ #eee 75%,
219
+ #eee 100%
220
+ ),
221
+ linear-gradient(
222
+ 45deg,
223
+ #eee 25%,
224
+ white 25%,
225
+ white 75%,
226
+ #eee 75%,
227
+ #eee 100%
228
+ );
229
+ }
230
+ .size--S {
231
+ width: 20px;
232
+ height: 20px;
233
+ }
234
+ .size--M {
235
+ width: 32px;
236
+ height: 32px;
237
+ }
238
+ .size--L {
239
+ width: 48px;
240
+ height: 48px;
241
+ }
242
+ .spectrum-Popover {
243
+ width: 210px;
244
+ z-index: 999;
245
+ top: 100%;
246
+ padding: var(--spacing-l) var(--spacing-xl);
247
+ display: flex;
248
+ flex-direction: column;
249
+ justify-content: flex-start;
250
+ align-items: stretch;
251
+ gap: var(--spacing-xl);
252
+ }
253
+ .colors {
254
+ display: grid;
255
+ grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
256
+ gap: var(--spacing-xs);
257
+ }
258
+ .heading {
259
+ font-size: var(--font-size-s);
260
+ font-weight: 600;
261
+ letter-spacing: 0.14px;
262
+ flex: 1 1 auto;
263
+ text-transform: uppercase;
264
+ grid-column: 1 / 5;
265
+ margin-bottom: var(--spacing-s);
266
+ }
267
+ .color {
268
+ height: 16px;
269
+ width: 16px;
270
+ border-radius: 100%;
271
+ box-shadow: 0 0 0 1px var(--spectrum-global-color-gray-300);
272
+ position: relative;
273
+ }
274
+ .color:hover {
275
+ cursor: pointer;
276
+ box-shadow: 0 0 2px 2px var(--spectrum-global-color-gray-300);
277
+ }
278
+ .custom {
279
+ display: grid;
280
+ grid-template-columns: 1fr auto;
281
+ align-items: center;
282
+ gap: var(--spacing-m);
283
+ margin-right: var(--spacing-xs);
284
+ }
285
+ .category--custom .heading {
286
+ margin-bottom: var(--spacing-xs);
287
+ }
288
+
289
+ .spectrum-wrapper {
290
+ background-color: transparent;
291
+ }
292
+ </style>
@@ -0,0 +1,83 @@
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
+ <div class="property-group-name" on:click={onHeaderClick}>
23
+ <div class="name">{name}</div>
24
+ {#if collapsible}
25
+ <Icon size="S" name={show ? "Remove" : "Add"} />
26
+ {/if}
27
+ </div>
28
+ <div class="property-panel" class:show={show || !collapsible}>
29
+ <slot />
30
+ </div>
31
+ </div>
32
+
33
+ <style>
34
+ .property-group-container {
35
+ display: flex;
36
+ flex-direction: column;
37
+ justify-content: flex-start;
38
+ align-items: stretch;
39
+ border-bottom: var(--border-light);
40
+ }
41
+
42
+ .property-group-name {
43
+ cursor: pointer;
44
+ display: flex;
45
+ flex-flow: row nowrap;
46
+ flex-direction: row;
47
+ justify-content: space-between;
48
+ align-items: center;
49
+ padding: var(--spacing-m) var(--spacing-xl);
50
+ color: var(--spectrum-global-color-gray-600);
51
+ transition: color 130ms ease-in-out;
52
+ }
53
+ .property-group-name:hover {
54
+ color: var(--spectrum-global-color-gray-900);
55
+ }
56
+
57
+ .name {
58
+ text-align: left;
59
+ font-size: var(--font-size-s);
60
+ font-weight: 600;
61
+ letter-spacing: 0.14px;
62
+ flex: 1 1 auto;
63
+ overflow: hidden;
64
+ text-overflow: ellipsis;
65
+ text-transform: uppercase;
66
+ white-space: nowrap;
67
+ user-select: none;
68
+ }
69
+
70
+ .property-panel {
71
+ display: none;
72
+ padding: var(--spacing-s) var(--spacing-xl) var(--spacing-xl)
73
+ var(--spacing-xl);
74
+ }
75
+
76
+ .show {
77
+ display: flex;
78
+ flex-direction: column;
79
+ justify-content: flex-start;
80
+ align-items: stretch;
81
+ gap: var(--spacing-l);
82
+ }
83
+ </style>
@@ -0,0 +1,25 @@
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.noMargin {
20
+ margin: 0;
21
+ }
22
+ hr.noGrid {
23
+ grid-area: auto;
24
+ }
25
+ </style>
@@ -0,0 +1,85 @@
1
+ <script>
2
+ import { slide } from "svelte/transition"
3
+ import Portal from "svelte-portal"
4
+ import Button from "../Button/Button.svelte"
5
+ import Body from "../Typography/Body.svelte"
6
+ import Heading from "../Typography/Heading.svelte"
7
+
8
+ export let title
9
+ export let fillWidth
10
+ let visible = false
11
+ export function show() {
12
+ if (visible) {
13
+ return
14
+ }
15
+ visible = true
16
+ }
17
+
18
+ export function hide() {
19
+ if (!visible) {
20
+ return
21
+ }
22
+ visible = false
23
+ }
24
+
25
+ function handleKey(e) {
26
+ if (visible && e.key === "Escape") {
27
+ hide()
28
+ }
29
+ }
30
+ </script>
31
+
32
+ <svelte:window on:keydown={handleKey} />
33
+
34
+ {#if visible}
35
+ <Portal>
36
+ <section class:fillWidth class="drawer" transition:slide>
37
+ <header>
38
+ <div class="text">
39
+ <Heading size="XS">{title}</Heading>
40
+ <Body size="S">
41
+ <slot name="description" />
42
+ </Body>
43
+ </div>
44
+ <div class="buttons">
45
+ <Button secondary quiet on:click={hide}>Cancel</Button>
46
+ <slot name="buttons" />
47
+ </div>
48
+ </header>
49
+ <slot name="body" />
50
+ </section>
51
+ </Portal>
52
+ {/if}
53
+
54
+ <style>
55
+ .drawer {
56
+ position: absolute;
57
+ bottom: 0;
58
+ left: 260px;
59
+ width: calc(100% - 520px);
60
+ background: var(--background);
61
+ border-top: var(--border-light);
62
+ z-index: 2;
63
+ }
64
+
65
+ .fillWidth {
66
+ width: calc(100% - 260px) !important;
67
+ }
68
+
69
+ header {
70
+ display: flex;
71
+ justify-content: space-between;
72
+ align-items: center;
73
+ border-bottom: var(--border-light);
74
+ padding: var(--spacing-l) var(--spacing-xl);
75
+ gap: var(--spacing-xl);
76
+ }
77
+
78
+ .text {
79
+ display: flex;
80
+ flex-direction: column;
81
+ justify-content: center;
82
+ align-items: flex-start;
83
+ gap: var(--spacing-xs);
84
+ }
85
+ </style>