@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,657 @@
1
+ <script>
2
+ import { createEventDispatcher } from "svelte"
3
+ import "@spectrum-css/table/dist/index-vars.css"
4
+ import CellRenderer from "./CellRenderer.svelte"
5
+ import SelectEditRenderer from "./SelectEditRenderer.svelte"
6
+ import { cloneDeep, deepGet } from "../helpers"
7
+ import ProgressCircle from "../ProgressCircle/ProgressCircle.svelte"
8
+ import Checkbox from "../Form/Checkbox.svelte"
9
+
10
+ /**
11
+ * The expected schema is our normal couch schemas for our tables.
12
+ * Each field schema can be enriched with a few extra properties to customise
13
+ * the behaviour.
14
+ * All of these are optional and do not need to be added.
15
+ * displayName: Overrides the field name displayed as the column title
16
+ * sortable: Set to false to disable sorting data by a certain column
17
+ * editable: Set to false to disable editing a certain column if the
18
+ * allowEditColumns prop is true
19
+ * width: the width of the column
20
+ * align: the alignment of the column
21
+ * template: a HBS or JS binding to use as the value
22
+ * background: the background color
23
+ * color: the text color
24
+ * borderLeft: show a left border
25
+ * borderRight: show a right border
26
+ */
27
+ export let data = []
28
+ export let schema = {}
29
+ export let showAutoColumns = false
30
+ export let rowCount = 0
31
+ export let quiet = false
32
+ export let loading = false
33
+ export let allowSelectRows
34
+ export let allowEditRows = true
35
+ export let allowEditColumns = true
36
+ export let allowClickRows = true
37
+ export let selectedRows = []
38
+ export let customRenderers = []
39
+ export let disableSorting = false
40
+ export let autoSortColumns = true
41
+ export let compact = false
42
+ export let customPlaceholder = false
43
+ export let showHeaderBorder = true
44
+ export let placeholderText = "No rows found"
45
+
46
+ const dispatch = createEventDispatcher()
47
+
48
+ // Config
49
+ const headerHeight = 36
50
+ $: rowHeight = compact ? 46 : 55
51
+
52
+ // Sorting state
53
+ let sortColumn
54
+ let sortOrder
55
+
56
+ // Table state
57
+ let height = 0
58
+ let loaded = false
59
+ let checkboxStatus = false
60
+
61
+ $: schema = fixSchema(schema)
62
+ $: if (!loading) loaded = true
63
+ $: fields = getFields(schema, showAutoColumns, autoSortColumns)
64
+ $: rows = fields?.length ? data || [] : []
65
+ $: totalRowCount = rows?.length || 0
66
+ $: visibleRowCount = getVisibleRowCount(
67
+ loaded,
68
+ height,
69
+ rows.length,
70
+ rowCount,
71
+ rowHeight
72
+ )
73
+ $: heightStyle = getHeightStyle(
74
+ visibleRowCount,
75
+ rowCount,
76
+ totalRowCount,
77
+ rowHeight,
78
+ loading
79
+ )
80
+ $: sortedRows = sortRows(rows, sortColumn, sortOrder)
81
+ $: gridStyle = getGridStyle(fields, schema, showEditColumn)
82
+ $: showEditColumn = allowEditRows || allowSelectRows
83
+ $: cellStyles = computeCellStyles(schema)
84
+
85
+ // Deselect the "select all" checkbox when the user navigates to a new page
86
+ $: {
87
+ let checkRowCount = rows.filter(o1 =>
88
+ selectedRows.some(o2 => o1._id === o2._id)
89
+ )
90
+ if (checkRowCount.length === 0) {
91
+ checkboxStatus = false
92
+ }
93
+ }
94
+
95
+ const fixSchema = schema => {
96
+ let fixedSchema = {}
97
+ Object.entries(schema || {}).forEach(([fieldName, fieldSchema]) => {
98
+ if (typeof fieldSchema === "string") {
99
+ fixedSchema[fieldName] = {
100
+ type: fieldSchema,
101
+ name: fieldName,
102
+ }
103
+ } else {
104
+ fixedSchema[fieldName] = {
105
+ ...fieldSchema,
106
+ name: fieldName,
107
+ }
108
+ }
109
+ })
110
+ return fixedSchema
111
+ }
112
+
113
+ const getVisibleRowCount = (loaded, height, allRows, rowCount, rowHeight) => {
114
+ if (!loaded) {
115
+ return rowCount || 0
116
+ }
117
+ if (rowCount) {
118
+ return Math.min(allRows, rowCount)
119
+ }
120
+ return Math.min(allRows, Math.ceil(height / rowHeight))
121
+ }
122
+
123
+ const getHeightStyle = (
124
+ visibleRowCount,
125
+ rowCount,
126
+ totalRowCount,
127
+ rowHeight,
128
+ loading
129
+ ) => {
130
+ if (loading) {
131
+ return `height: ${headerHeight + visibleRowCount * rowHeight}px;`
132
+ }
133
+ if (!rowCount || !visibleRowCount || totalRowCount <= rowCount) {
134
+ return ""
135
+ }
136
+ return `height: ${headerHeight + visibleRowCount * rowHeight}px;`
137
+ }
138
+
139
+ const getGridStyle = (fields, schema, showEditColumn) => {
140
+ let style = "grid-template-columns:"
141
+ if (showEditColumn) {
142
+ style += " auto"
143
+ }
144
+ fields?.forEach(field => {
145
+ const fieldSchema = schema[field]
146
+ if (fieldSchema.width && typeof fieldSchema.width === "string") {
147
+ style += ` ${fieldSchema.width}`
148
+ } else {
149
+ style += " minmax(auto, 1fr)"
150
+ }
151
+ })
152
+ style += ";"
153
+ return style
154
+ }
155
+
156
+ const sortRows = (rows, sortColumn, sortOrder) => {
157
+ if (!sortColumn || !sortOrder || disableSorting) {
158
+ return rows
159
+ }
160
+ return rows.slice().sort((a, b) => {
161
+ const colA = a[sortColumn]
162
+ const colB = b[sortColumn]
163
+ if (sortOrder === "Descending") {
164
+ return colA > colB ? -1 : 1
165
+ } else {
166
+ return colA > colB ? 1 : -1
167
+ }
168
+ })
169
+ }
170
+
171
+ const sortBy = fieldSchema => {
172
+ if (fieldSchema.sortable === false) {
173
+ return
174
+ }
175
+ if (fieldSchema.name === sortColumn) {
176
+ sortOrder = sortOrder === "Descending" ? "Ascending" : "Descending"
177
+ } else {
178
+ sortColumn = fieldSchema.name
179
+ sortOrder = "Descending"
180
+ }
181
+ dispatch("sort", { column: sortColumn, order: sortOrder })
182
+ }
183
+
184
+ const getDisplayName = schema => {
185
+ let name = schema?.displayName
186
+ if (schema && name === undefined) {
187
+ name = schema.name
188
+ }
189
+ return name || ""
190
+ }
191
+
192
+ const getFields = (schema, showAutoColumns, autoSortColumns) => {
193
+ let columns = []
194
+ let autoColumns = []
195
+ Object.entries(schema || {}).forEach(([field, fieldSchema]) => {
196
+ if (!field || !fieldSchema) {
197
+ return
198
+ }
199
+ if (!autoSortColumns || !fieldSchema?.autocolumn) {
200
+ columns.push(fieldSchema)
201
+ } else if (showAutoColumns) {
202
+ autoColumns.push(fieldSchema)
203
+ }
204
+ })
205
+ return columns
206
+ .sort((a, b) => {
207
+ const orderA = a.order || Number.MAX_SAFE_INTEGER
208
+ const orderB = b.order || Number.MAX_SAFE_INTEGER
209
+ const nameA = getDisplayName(a)
210
+ const nameB = getDisplayName(b)
211
+ if (orderA !== orderB) {
212
+ return orderA < orderB ? orderA : orderB
213
+ }
214
+ return nameA < nameB ? a : b
215
+ })
216
+ .concat(autoColumns)
217
+ .map(column => column.name)
218
+ }
219
+
220
+ const editColumn = (e, field) => {
221
+ e.stopPropagation()
222
+ dispatch("editcolumn", field)
223
+ }
224
+
225
+ const editRow = (e, row) => {
226
+ e.stopPropagation()
227
+ dispatch("editrow", cloneDeep(row))
228
+ }
229
+
230
+ const toggleSelectRow = row => {
231
+ if (!allowSelectRows) {
232
+ return
233
+ }
234
+ if (selectedRows.some(selectedRow => selectedRow._id === row._id)) {
235
+ selectedRows = selectedRows.filter(
236
+ selectedRow => selectedRow._id !== row._id
237
+ )
238
+ } else {
239
+ selectedRows = [...selectedRows, row]
240
+ }
241
+ }
242
+
243
+ const toggleSelectAll = e => {
244
+ const select = !!e.detail
245
+ if (select) {
246
+ // Add any rows which are not already in selected rows
247
+ rows.forEach(row => {
248
+ if (selectedRows.findIndex(x => x._id === row._id) === -1) {
249
+ selectedRows.push(row)
250
+ }
251
+ })
252
+ } else {
253
+ // Remove any rows from selected rows that are in the current data set
254
+ selectedRows = selectedRows.filter(el =>
255
+ rows.every(f => f._id !== el._id)
256
+ )
257
+ }
258
+ }
259
+
260
+ const computeCellStyles = schema => {
261
+ let styles = {}
262
+ Object.keys(schema || {}).forEach(field => {
263
+ styles[field] = ""
264
+ if (schema[field].color) {
265
+ styles[field] += `color: ${schema[field].color};`
266
+ }
267
+ if (schema[field].background) {
268
+ styles[field] += `background-color: ${schema[field].background};`
269
+ }
270
+ if (schema[field].align === "Center") {
271
+ styles[field] += "justify-content: center; text-align: center;"
272
+ }
273
+ if (schema[field].align === "Right") {
274
+ styles[field] += "justify-content: flex-end; text-align: right;"
275
+ }
276
+ if (schema[field].borderLeft) {
277
+ styles[field] +=
278
+ "border-left: 1px solid var(--spectrum-global-color-gray-200);"
279
+ }
280
+ if (schema[field].borderLeft) {
281
+ styles[field] +=
282
+ "border-right: 1px solid var(--spectrum-global-color-gray-200);"
283
+ }
284
+ if (schema[field].minWidth) {
285
+ styles[field] += `min-width: ${schema[field].minWidth};`
286
+ }
287
+ })
288
+ return styles
289
+ }
290
+ </script>
291
+
292
+ {#key fields?.length}
293
+ <div
294
+ class="wrapper"
295
+ class:wrapper--quiet={quiet}
296
+ class:wrapper--compact={compact}
297
+ bind:offsetHeight={height}
298
+ style={`--row-height: ${rowHeight}px; --header-height: ${headerHeight}px;`}
299
+ >
300
+ {#if loading}
301
+ <div class="loading" style={heightStyle}>
302
+ <slot name="loadingIndicator">
303
+ <ProgressCircle />
304
+ </slot>
305
+ </div>
306
+ {:else}
307
+ <div
308
+ class="spectrum-Table"
309
+ class:no-scroll={!rowCount}
310
+ style={`${heightStyle}${gridStyle}`}
311
+ >
312
+ {#if fields.length}
313
+ <div class="spectrum-Table-head">
314
+ {#if showEditColumn}
315
+ <div
316
+ class:noBorderHeader={!showHeaderBorder}
317
+ class="spectrum-Table-headCell spectrum-Table-headCell--divider spectrum-Table-headCell--edit"
318
+ >
319
+ {#if allowSelectRows}
320
+ <Checkbox
321
+ bind:value={checkboxStatus}
322
+ on:change={toggleSelectAll}
323
+ />
324
+ {:else}
325
+ Edit
326
+ {/if}
327
+ </div>
328
+ {/if}
329
+ {#each fields as field}
330
+ <div
331
+ class="spectrum-Table-headCell"
332
+ class:noBorderHeader={!showHeaderBorder}
333
+ class:spectrum-Table-headCell--alignCenter={schema[field]
334
+ .align === "Center"}
335
+ class:spectrum-Table-headCell--alignRight={schema[field]
336
+ .align === "Right"}
337
+ class:is-sortable={schema[field].sortable !== false}
338
+ class:is-sorted-desc={sortColumn === field &&
339
+ sortOrder === "Descending"}
340
+ class:is-sorted-asc={sortColumn === field &&
341
+ sortOrder === "Ascending"}
342
+ on:click={() => sortBy(schema[field])}
343
+ >
344
+ <div class="title">{getDisplayName(schema[field])}</div>
345
+ {#if schema[field]?.autocolumn}
346
+ <svg
347
+ class="spectrum-Icon spectrum-Table-autoIcon"
348
+ focusable="false"
349
+ >
350
+ <use xlink:href="#spectrum-icon-18-MagicWand" />
351
+ </svg>
352
+ {/if}
353
+ {#if sortColumn === field}
354
+ <svg
355
+ class="spectrum-Icon spectrum-UIIcon-ArrowDown100 spectrum-Table-sortedIcon"
356
+ focusable="false"
357
+ aria-hidden="true"
358
+ >
359
+ <use xlink:href="#spectrum-css-icon-Arrow100" />
360
+ </svg>
361
+ {/if}
362
+ {#if allowEditColumns && schema[field]?.editable !== false}
363
+ <svg
364
+ class="spectrum-Icon spectrum-Table-editIcon"
365
+ focusable="false"
366
+ on:click={e => editColumn(e, field)}
367
+ >
368
+ <use xlink:href="#spectrum-icon-18-Edit" />
369
+ </svg>
370
+ {/if}
371
+ </div>
372
+ {/each}
373
+ </div>
374
+ {/if}
375
+ {#if sortedRows?.length}
376
+ {#each sortedRows as row, idx}
377
+ <div class="spectrum-Table-row" class:clickable={allowClickRows}>
378
+ {#if showEditColumn}
379
+ <div
380
+ class:noBorderCheckbox={!showHeaderBorder}
381
+ class="spectrum-Table-cell spectrum-Table-cell--divider spectrum-Table-cell--edit"
382
+ on:click={e => {
383
+ toggleSelectRow(row)
384
+ e.stopPropagation()
385
+ }}
386
+ >
387
+ <SelectEditRenderer
388
+ data={row}
389
+ selected={selectedRows.findIndex(
390
+ selectedRow => selectedRow._id === row._id
391
+ ) !== -1}
392
+ onEdit={e => editRow(e, row)}
393
+ {allowSelectRows}
394
+ {allowEditRows}
395
+ />
396
+ </div>
397
+ {/if}
398
+ {#each fields as field}
399
+ <div
400
+ class="spectrum-Table-cell"
401
+ class:spectrum-Table-cell--divider={!!schema[field].divider}
402
+ style={cellStyles[field]}
403
+ on:click={() => {
404
+ if (!schema[field]?.preventSelectRow) {
405
+ dispatch("click", row)
406
+ toggleSelectRow(row)
407
+ }
408
+ }}
409
+ >
410
+ <CellRenderer
411
+ {customRenderers}
412
+ {row}
413
+ schema={schema[field]}
414
+ value={deepGet(row, field)}
415
+ on:clickrelationship
416
+ on:buttonclick
417
+ >
418
+ <slot />
419
+ </CellRenderer>
420
+ </div>
421
+ {/each}
422
+ </div>
423
+ {/each}
424
+ {:else}
425
+ <div
426
+ class="placeholder"
427
+ class:placeholder--custom={customPlaceholder}
428
+ class:placeholder--no-fields={!fields?.length}
429
+ >
430
+ {#if customPlaceholder}
431
+ <slot name="placeholder" />
432
+ {:else}
433
+ <div class="placeholder-content">
434
+ <svg
435
+ class="spectrum-Icon spectrum-Icon--sizeXXL"
436
+ focusable="false"
437
+ >
438
+ <use xlink:href="#spectrum-icon-18-Table" />
439
+ </svg>
440
+ <div>{placeholderText}</div>
441
+ </div>
442
+ {/if}
443
+ </div>
444
+ {/if}
445
+ </div>
446
+ {/if}
447
+ </div>
448
+ {/key}
449
+
450
+ <style>
451
+ /* Wrapper */
452
+ .wrapper {
453
+ position: relative;
454
+ --table-bg: var(--spectrum-global-color-gray-50);
455
+ --table-border: 1px solid var(--spectrum-alias-border-color-mid);
456
+ --cell-padding: var(--spectrum-global-dimension-size-250);
457
+ overflow: auto;
458
+ }
459
+ .wrapper--quiet {
460
+ --table-bg: var(--spectrum-alias-background-color-transparent);
461
+ }
462
+ .wrapper--compact {
463
+ --cell-padding: var(--spectrum-global-dimension-size-150);
464
+ }
465
+
466
+ /* Loading */
467
+ .loading {
468
+ display: flex;
469
+ align-items: center;
470
+ min-height: 100px;
471
+ justify-content: center;
472
+ }
473
+
474
+ /* Table */
475
+ .spectrum-Table {
476
+ width: 100%;
477
+ border-radius: 0;
478
+ display: grid;
479
+ overflow: auto;
480
+ }
481
+ .spectrum-Table.no-scroll {
482
+ overflow: visible;
483
+ }
484
+
485
+ /* Header */
486
+ .spectrum-Table-head {
487
+ display: contents;
488
+ }
489
+ .spectrum-Table-head > :first-child {
490
+ border-left: 1px solid transparent;
491
+ padding-left: var(--cell-padding);
492
+ }
493
+ .spectrum-Table-head > :last-child {
494
+ border-right: 1px solid transparent;
495
+ padding-right: var(--cell-padding);
496
+ }
497
+ .spectrum-Table-headCell {
498
+ height: var(--header-height);
499
+ position: sticky;
500
+ top: 0;
501
+ text-overflow: ellipsis;
502
+ white-space: nowrap;
503
+ background-color: var(--spectrum-alias-background-color-secondary);
504
+ z-index: 2;
505
+ border-bottom: var(--table-border);
506
+ padding: 0 calc(var(--cell-padding) / 1.33);
507
+ display: flex;
508
+ flex-direction: row;
509
+ justify-content: flex-start;
510
+ align-items: center;
511
+ user-select: none;
512
+ border-top: var(--table-border);
513
+ }
514
+ .spectrum-Table-headCell:first-of-type {
515
+ border-left: var(--table-border);
516
+ }
517
+ .spectrum-Table-headCell:last-of-type {
518
+ border-right: var(--table-border);
519
+ }
520
+
521
+ .noBorderHeader {
522
+ border-top: none !important;
523
+ border-right: none !important;
524
+ border-left: none !important;
525
+ }
526
+
527
+ .noBorderCheckbox {
528
+ border-top: none !important;
529
+ border-right: none !important;
530
+ }
531
+
532
+ .spectrum-Table-headCell--alignCenter {
533
+ justify-content: center;
534
+ }
535
+ .spectrum-Table-headCell--alignRight {
536
+ justify-content: flex-end;
537
+ }
538
+ .spectrum-Table-headCell--edit {
539
+ position: sticky;
540
+ left: 0;
541
+ z-index: 3;
542
+ }
543
+ .spectrum-Table-headCell .title {
544
+ overflow: visible;
545
+ text-overflow: ellipsis;
546
+ }
547
+ .spectrum-Table-headCell:hover .spectrum-Table-editIcon {
548
+ opacity: 1;
549
+ transition: opacity 0.2s ease;
550
+ }
551
+ .spectrum-Table-headCell .spectrum-Icon {
552
+ pointer-events: all;
553
+ margin-left: var(
554
+ --spectrum-table-header-sort-icon-gap,
555
+ var(--spectrum-global-dimension-size-125)
556
+ );
557
+ }
558
+ .spectrum-Table-editIcon,
559
+ .spectrum-Table-autoIcon {
560
+ width: var(--spectrum-global-dimension-size-150);
561
+ height: var(--spectrum-global-dimension-size-150);
562
+ }
563
+ .spectrum-Table-editIcon {
564
+ opacity: 0;
565
+ }
566
+
567
+ /* Table rows */
568
+ .spectrum-Table-row {
569
+ display: contents;
570
+ cursor: auto;
571
+ }
572
+ .spectrum-Table-row.clickable {
573
+ cursor: pointer;
574
+ }
575
+ .spectrum-Table-row.clickable:hover .spectrum-Table-cell {
576
+ background-color: var(--spectrum-global-color-gray-100);
577
+ }
578
+ .wrapper--quiet .spectrum-Table-row {
579
+ border-left: none;
580
+ border-right: none;
581
+ }
582
+ .spectrum-Table-row > :first-child {
583
+ border-left: var(--table-border);
584
+ padding-left: var(--cell-padding);
585
+ }
586
+ .spectrum-Table-row > :last-child {
587
+ border-right: var(--table-border);
588
+ padding-right: var(--cell-padding);
589
+ }
590
+
591
+ /* Table cells */
592
+ .spectrum-Table-cell {
593
+ flex: 1 1 auto;
594
+ padding: 0 calc(var(--cell-padding) / 1.33);
595
+ border-top: none;
596
+ border-bottom: none;
597
+ border-radius: 0;
598
+ text-overflow: ellipsis;
599
+ white-space: nowrap;
600
+ height: var(--row-height);
601
+ display: flex;
602
+ flex-direction: row;
603
+ justify-content: flex-start;
604
+ align-items: center;
605
+ gap: 4px;
606
+ border-bottom: 1px solid var(--spectrum-alias-border-color-mid);
607
+ background-color: var(--table-bg);
608
+ z-index: auto;
609
+ transition: background-color 130ms ease-out;
610
+ }
611
+ .spectrum-Table-cell--edit {
612
+ position: sticky;
613
+ left: 0;
614
+ z-index: 2;
615
+ }
616
+
617
+ /* Placeholder */
618
+ .placeholder {
619
+ display: flex;
620
+ flex-direction: row;
621
+ justify-content: center;
622
+ align-items: center;
623
+ border: var(--table-border);
624
+ border-top: none;
625
+ grid-column: 1 / -1;
626
+ background-color: var(--table-bg);
627
+ padding: 40px;
628
+ }
629
+ .placeholder--no-fields {
630
+ border-top: var(--table-border);
631
+ }
632
+ .placeholder--custom {
633
+ justify-content: flex-start;
634
+ }
635
+ .wrapper--quiet .placeholder {
636
+ border-left: none;
637
+ border-right: none;
638
+ }
639
+ .placeholder-content {
640
+ display: flex;
641
+ flex-direction: column;
642
+ justify-content: center;
643
+ align-items: center;
644
+ color: var(
645
+ --spectrum-table-cell-text-color,
646
+ var(--spectrum-alias-text-color)
647
+ );
648
+ }
649
+ .placeholder-content div {
650
+ margin-top: 10px;
651
+ font-size: var(
652
+ --spectrum-table-cell-text-size,
653
+ var(--spectrum-alias-font-size-default)
654
+ );
655
+ text-align: center;
656
+ }
657
+ </style>
@@ -0,0 +1 @@
1
+ export { default as Table } from "./Table.svelte"