@poirazis/supercomponents-shared 1.2.11 → 1.2.13

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 (34) hide show
  1. package/dist/index.js +11081 -10997
  2. package/dist/index.umd.cjs +13 -13
  3. package/package.json +1 -1
  4. package/src/lib/SuperField/SuperField.svelte +1 -1
  5. package/src/lib/SuperForm/InnerForm.svelte +68 -19
  6. package/src/lib/SuperForm/SuperForm.svelte +13 -3
  7. package/src/lib/SuperTable/SuperTable.css +9 -6
  8. package/src/lib/SuperTable/SuperTable.svelte +207 -193
  9. package/src/lib/SuperTable/controls/ColumnsSection.svelte +11 -19
  10. package/src/lib/SuperTable/controls/RowButtonsColumn.svelte +4 -4
  11. package/src/lib/SuperTable/controls/SelectionColumn.svelte +9 -10
  12. package/src/lib/SuperTable/overlays/AddNewRowOverlay.svelte +1 -1
  13. package/src/lib/SuperTableCells/CellAttachmentExpanded.svelte +0 -1
  14. package/src/lib/SuperTableCells/CellAttachmentSlider.svelte +0 -1
  15. package/src/lib/SuperTableCells/CellBoolean.svelte +0 -1
  16. package/src/lib/SuperTableCells/CellCommon.css +60 -88
  17. package/src/lib/SuperTableCells/CellDateRange.svelte +6 -32
  18. package/src/lib/SuperTableCells/CellDatetime.svelte +3 -4
  19. package/src/lib/SuperTableCells/CellJSON.svelte +1 -4
  20. package/src/lib/SuperTableCells/CellLink.svelte +22 -21
  21. package/src/lib/SuperTableCells/CellLinkAdvanced.svelte +3 -7
  22. package/src/lib/SuperTableCells/CellLinkPickerSelect.svelte +7 -4
  23. package/src/lib/SuperTableCells/CellNumber.svelte +18 -23
  24. package/src/lib/SuperTableCells/CellOptions.svelte +39 -37
  25. package/src/lib/SuperTableCells/CellSQLLink.svelte +85 -66
  26. package/src/lib/SuperTableCells/CellSQLLinkPicker.svelte +66 -36
  27. package/src/lib/SuperTableCells/CellString.svelte +9 -25
  28. package/src/lib/SuperTableCells/CellStringMask.svelte +119 -26
  29. package/src/lib/SuperTableCells/CellStringSimple.svelte +6 -8
  30. package/src/lib/SuperTableColumn/SuperTableColumn.svelte +10 -10
  31. package/src/lib/SuperTableColumn/parts/SuperColumnHeader.svelte +4 -1
  32. package/src/lib/SuperTableColumn/parts/SuperColumnRow.svelte +25 -21
  33. package/src/lib/SuperTabs/SuperTabs.svelte +28 -23
  34. package/src/lib/SuperTable/controls/SuperTableWelcome.svelte +0 -58
@@ -1,7 +1,28 @@
1
1
  <script>
2
2
  import { createEventDispatcher, onMount, onDestroy } from "svelte";
3
3
  import fsm from "svelte-fsm";
4
- import IMask from "imask";
4
+ import {
5
+ Masked,
6
+ InputMask,
7
+ createMask,
8
+ MaskedPattern,
9
+ MaskedRegExp,
10
+ MaskedNumber,
11
+ MaskedDate,
12
+ MaskedEnum,
13
+ MaskedRange,
14
+ MaskedDynamic,
15
+ } from "imask";
16
+
17
+ // Register mask classes with Masked.overloads to ensure they're available for createMask
18
+ // This is required for imask 6.x to properly handle pattern-based masks
19
+ if (MaskedPattern && Masked.overloads) {
20
+ // Ensure MaskedPattern is available as an overload
21
+ if (!Masked.overloads.find((o) => o.mask === MaskedPattern)) {
22
+ Masked.overloads.unshift({ mask: MaskedPattern });
23
+ }
24
+ }
25
+
5
26
  const dispatch = createEventDispatcher();
6
27
 
7
28
  export let value;
@@ -23,9 +44,53 @@
23
44
  let inputMask;
24
45
  let inputElement;
25
46
 
47
+ function createMaskInstance(maskPattern) {
48
+ if (!maskPattern) return null;
49
+ try {
50
+ // For imask 6.x, explicitly create a MaskedPattern instance
51
+ // This avoids the "Masked class is not found" error by directly instantiating
52
+ const mask = new MaskedPattern({
53
+ mask: maskPattern,
54
+ lazy: false,
55
+ placeholderChar: "_",
56
+ });
57
+ return mask;
58
+ } catch (patternError) {
59
+ try {
60
+ // Fallback: try as a regex pattern
61
+ const mask = new MaskedRegExp({
62
+ mask: new RegExp(maskPattern),
63
+ lazy: false,
64
+ });
65
+ return mask;
66
+ } catch (regexError) {
67
+ try {
68
+ // Last fallback: use generic createMask
69
+ return createMask({
70
+ mask: maskPattern,
71
+ lazy: false,
72
+ });
73
+ } catch (createError) {
74
+ console.error(
75
+ "Failed to create mask - pattern:",
76
+ maskPattern,
77
+ "errors:",
78
+ {
79
+ patternError: patternError?.message,
80
+ regexError: regexError?.message,
81
+ createError: createError?.message,
82
+ },
83
+ );
84
+ return null;
85
+ }
86
+ }
87
+ }
88
+ }
89
+
26
90
  function applyMask(rawValue) {
27
91
  if (!mask || !rawValue) return rawValue;
28
- const tempMask = IMask.createMask({ mask: mask });
92
+ const tempMask = createMaskInstance(mask);
93
+ if (!tempMask) return rawValue;
29
94
  tempMask.unmaskedValue = rawValue;
30
95
  return tempMask.value;
31
96
  }
@@ -42,7 +107,11 @@
42
107
  return;
43
108
  }
44
109
 
45
- const tempMask = IMask.createMask({ mask: mask });
110
+ const tempMask = createMaskInstance(mask);
111
+ if (!tempMask) {
112
+ isComplete = false;
113
+ return;
114
+ }
46
115
  tempMask.resolve(localValue);
47
116
  isComplete = tempMask.isComplete;
48
117
  }
@@ -158,16 +227,18 @@
158
227
  // For input validation, check if typed key is valid for mask
159
228
  if (e.key.length === 1 && mask) {
160
229
  // Check if key matches mask pattern (e.g., for "00000", only digits)
161
- const tempMask = IMask.createMask({ mask: mask });
162
- const currentLength = (localValue || "").length;
163
- // Get the expected pattern for this position
164
- // For simplicity, if mask contains only digits or specific chars, check if key matches
165
- const placeholder =
166
- tempMask.blocks[0]?.placeholder ||
167
- (tempMask.mask.includes("0") ? "0" : null);
168
- if (placeholder === "0" && !/\d/.test(e.key)) {
169
- e.preventDefault();
170
- return;
230
+ const tempMask = createMaskInstance(mask);
231
+ if (tempMask) {
232
+ const currentLength = (localValue || "").length;
233
+ // Get the expected pattern for this position
234
+ // For simplicity, if mask contains only digits or specific chars, check if key matches
235
+ const placeholder =
236
+ tempMask.blocks?.[0]?.placeholder ||
237
+ (tempMask.mask?.includes("0") ? "0" : null);
238
+ if (placeholder === "0" && !/\d/.test(e.key)) {
239
+ e.preventDefault();
240
+ return;
241
+ }
171
242
  }
172
243
  }
173
244
  },
@@ -180,6 +251,7 @@
180
251
  $: error = cellOptions?.error;
181
252
  $: icon = error ? "ph ph-warning" : cellOptions?.icon;
182
253
  $: cellState.reset(value);
254
+ $: displayValue = inEdit ? localValue : applyMask(value);
183
255
 
184
256
  const focus = (node) => {
185
257
  node?.focus();
@@ -217,18 +289,41 @@
217
289
  };
218
290
  }
219
291
 
220
- inputMask = IMask(node, { mask: maskPattern });
221
- inputMask.unmaskedValue = localValue || "";
292
+ try {
293
+ // Try to create mask instance using MaskedPattern first
294
+ const maskInstance = createMaskInstance(maskPattern);
295
+ if (maskInstance) {
296
+ inputMask = new InputMask(node, { mask: maskPattern });
297
+ } else {
298
+ throw new Error("Failed to create mask instance");
299
+ }
300
+
301
+ inputMask.unmaskedValue = localValue || "";
222
302
 
223
- inputMask.on("accept", () => {
224
- localValue = inputMask.unmaskedValue;
225
- updateIsComplete();
226
- lastEdit = new Date();
227
- });
303
+ inputMask.on("accept", () => {
304
+ localValue = inputMask.unmaskedValue;
305
+ updateIsComplete();
306
+ lastEdit = new Date();
307
+ });
228
308
 
229
- inputMask.on("complete", () => {
230
- isComplete = true;
231
- });
309
+ inputMask.on("complete", () => {
310
+ isComplete = true;
311
+ });
312
+ } catch (e) {
313
+ console.error("Error initializing IMask:", e);
314
+ // Fallback to plain input without masking
315
+ const handleInput = (e) => {
316
+ localValue = node.value;
317
+ lastEdit = new Date();
318
+ };
319
+ node.addEventListener("input", handleInput);
320
+ node.value = localValue || "";
321
+ return {
322
+ destroy() {
323
+ node.removeEventListener("input", handleInput);
324
+ },
325
+ };
326
+ }
232
327
 
233
328
  return {
234
329
  destroy() {
@@ -268,7 +363,6 @@
268
363
  bind:this={inputElement}
269
364
  tabindex="0"
270
365
  class="editor"
271
- class:with-icon={cellOptions.icon}
272
366
  {placeholder}
273
367
  style:color={!isComplete
274
368
  ? "var(--spectrum-global-color-gray-700)"
@@ -296,13 +390,12 @@
296
390
  <div
297
391
  class="value"
298
392
  tabindex={cellOptions.readonly || cellOptions.disabled ? "-1" : "0"}
299
- class:with-icon={cellOptions.icon}
300
393
  class:placeholder={!value}
301
394
  style:justify-content={cellOptions.align}
302
395
  on:focusin={cellState.focus}
303
396
  >
304
397
  <span>
305
- {applyMask(localValue) || placeholder}
398
+ {displayValue || placeholder}
306
399
  </span>
307
400
  </div>
308
401
  {/if}
@@ -10,12 +10,11 @@
10
10
  debounce: 250,
11
11
  };
12
12
 
13
- $: formattedValue =
14
- cellOptions?.template
15
- ? processStringSync(cellOptions.template, {
16
- value,
17
- })
18
- : undefined;;
13
+ $: formattedValue = cellOptions?.template
14
+ ? processStringSync(cellOptions.template, {
15
+ value,
16
+ })
17
+ : undefined;
19
18
 
20
19
  $: placeholder =
21
20
  cellOptions.readonly || cellOptions.disabled
@@ -39,12 +38,11 @@
39
38
  style:font-weight={cellOptions.fontWeight}
40
39
  >
41
40
  {#if cellOptions.icon}
42
- <i class={cellOptions.icon + " icon"}></i>
41
+ <i class={cellOptions.icon + " field-icon"}></i>
43
42
  {/if}
44
43
 
45
44
  <div
46
45
  class="value"
47
- class:with-icon={cellOptions.icon}
48
46
  class:placeholder={!value}
49
47
  style:justify-content={cellOptions.align}
50
48
  >
@@ -28,6 +28,8 @@
28
28
  const stbState = getContext("stbState");
29
29
  const stbAPI = getContext("stbAPI");
30
30
 
31
+ const data = getContext("data");
32
+
31
33
  // Cell Components Map
32
34
  const cellComponents = {
33
35
  string: CellString,
@@ -68,7 +70,6 @@
68
70
  export let columnOptions;
69
71
  export let sticky;
70
72
  export let scrollPos;
71
- export let stbData;
72
73
 
73
74
  // Internal Variables
74
75
  let id = Math.random() * 100;
@@ -106,9 +107,7 @@
106
107
  })
107
108
  : undefined;
108
109
 
109
- $: values = $stbData?.rows?.map((row) =>
110
- deepGet(row, $columnOptionsStore.name)
111
- );
110
+ $: values = $data.map((row) => deepGet(row, $columnOptionsStore.name));
112
111
 
113
112
  $: if ($stbSortColumn == $columnOptionsStore.name) {
114
113
  sorted = $stbSortOrder;
@@ -139,7 +138,7 @@
139
138
  color: $columnOptionsStore.color,
140
139
  controlType: "checkbox",
141
140
  };
142
- }
141
+ },
143
142
  );
144
143
 
145
144
  const headerCellOptions = derivedMemo(
@@ -160,7 +159,7 @@
160
159
  initialState: "Editing",
161
160
  role: "inlineInput",
162
161
  };
163
- }
162
+ },
164
163
  );
165
164
 
166
165
  // Allow the Super Table to bind to the Super Column State Machine to control it
@@ -177,7 +176,7 @@
177
176
  if (columnOptions.canSort) {
178
177
  stbState.sortBy(
179
178
  columnOptions.name,
180
- sorted == "ascending" ? "descending" : "ascending"
179
+ sorted == "ascending" ? "descending" : "ascending",
181
180
  );
182
181
  sorted = "ascending" ? "descending" : "ascending";
183
182
  }
@@ -188,7 +187,7 @@
188
187
  unlockWidth() {
189
188
  if (resizing) return;
190
189
  $lockWidth = 0;
191
- if (!columnOptions.asComponent) this.lockWidth.debounce(50);
190
+ if (!columnOptions.asComponent) this.lockWidth.debounce(150);
192
191
  },
193
192
  startResizing(e) {
194
193
  e.stopPropagation();
@@ -244,6 +243,7 @@
244
243
  return "Idle";
245
244
  },
246
245
  clear() {
246
+ stbState.clearFilter(id);
247
247
  return "Idle";
248
248
  },
249
249
  },
@@ -259,7 +259,7 @@
259
259
  },
260
260
  EditingCell: {
261
261
  _enter() {
262
- $lockWidth = viewport.clientWidth;
262
+ $lockWidth = Math.max(viewport.clientWidth, 160);
263
263
  stbState.edit.debounce(30);
264
264
  },
265
265
  patchRow(index, id, rev, field, change) {
@@ -395,7 +395,7 @@
395
395
  {/if}
396
396
 
397
397
  <SuperColumnBody
398
- rows={$stbData?.rows}
398
+ rows={$data}
399
399
  rowHeight={$stbSettings.appearance.rowHeight}
400
400
  field={$columnOptionsStore.name}
401
401
  idField={$stbSettings.data.idColumn}
@@ -28,6 +28,10 @@
28
28
  }
29
29
 
30
30
  $: isEntering = $columnState == "Entering";
31
+ $: if ($columnState == "Idle") {
32
+ filterValue = null;
33
+ filterOperator = $columnOptions.defaultFilteringOperator;
34
+ }
31
35
 
32
36
  const handleValueChange = (e) => {
33
37
  if (e.detail != undefined && e.detail != null && e.detail != "") {
@@ -125,7 +129,6 @@
125
129
  fieldSchema={$columnOptions.schema}
126
130
  multi={filterOperator == "containsAny" || filterOperator == "oneOf"}
127
131
  on:change={handleValueChange}
128
- on:cancel={columnState.cancel}
129
132
  on:focusout={handleBlur}
130
133
  />
131
134
  {:else}
@@ -21,16 +21,18 @@
21
21
  export let isLast;
22
22
  export let disabled;
23
23
 
24
- // the default height
25
-
26
- let viewport;
27
24
  let info;
28
25
 
29
- $: meta = $rowMetadata?.[index] ?? {};
26
+ // Get Row overrides from metadata or fallback to column settings
27
+ $: color = $rowMetadata[index]?.color;
28
+ $: height = $rowMetadata[index]?.height;
29
+ $: bgcolor = $rowMetadata[index]?.bgcolor;
30
+
30
31
  $: id = row?.[idField] ?? index;
31
32
  $: value = deepGet(row, field);
32
- $: isHovered = $stbHovered == index || $stbMenuID == index;
33
- $: isSelected = $rowMetadata?.[index]?.selected ?? false;
33
+ $: hovered = $stbHovered == index || $stbMenuID == index;
34
+ $: selected = $rowMetadata?.[index]?.selected ?? false;
35
+ $: disabled = $rowMetadata?.[index]?.disabled ?? false;
34
36
  $: hasChildren = $columnSettings.hasChildren > 0;
35
37
 
36
38
  const patchRow = async (change) => {
@@ -73,37 +75,39 @@
73
75
  } else return obj[path] ?? undefined;
74
76
  };
75
77
 
78
+ const onClick = () => {
79
+ if (disabled) return;
80
+ stbState.handleRowClick(index, field, deepGet(row, field), id);
81
+ };
76
82
  onDestroy(() => {
77
83
  if ($stbEditing == index) {
78
84
  columnState.exitedit();
79
85
  }
80
86
  });
87
+
88
+ const onContextMenu = (e) => {
89
+ stbAPI.showContextMenu(index, e.__root);
90
+ };
81
91
  </script>
82
92
 
83
93
  <!-- svelte-ignore a11y-click-events-have-key-events -->
84
94
  <!-- svelte-ignore a11y-no-static-element-interactions -->
85
95
  <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
86
96
  <div
87
- bind:this={viewport}
88
97
  class="super-row"
89
- class:is-selected={isSelected}
90
- class:is-hovered={isHovered}
91
- class:is-editing={isEditing}
92
- class:is-disabled={meta.disabled}
98
+ class:selected
99
+ class:hovered
100
+ class:isEditing
101
+ class:disabled
93
102
  class:isLast
94
- style:height={meta.height + "px"}
95
- style:color={meta.color}
96
- style:background-color={meta.bgcolor}
103
+ style:height
104
+ style:color
105
+ style:background-color={bgcolor}
97
106
  style:justify-content={$columnSettings.align}
98
107
  on:mouseenter={() => ($stbHovered = index)}
99
108
  on:mouseleave={() => ($stbHovered = undefined)}
100
- on:click={() => {
101
- if (!meta.disabled)
102
- stbState.handleRowClick(index, field, deepGet(row, field), id);
103
- }}
104
- on:contextmenu|preventDefault={() => {
105
- stbAPI.showContextMenu(index, viewport);
106
- }}
109
+ on:click={onClick}
110
+ on:contextmenu|preventDefault={onContextMenu}
107
111
  >
108
112
  {#if !hasChildren}
109
113
  <svelte:component
@@ -15,14 +15,14 @@
15
15
  export let tabsIconsOnly;
16
16
  export let list_icon;
17
17
  export let list_title;
18
- export let wide = true;
18
+ export let tabsWidth = "200px";
19
19
 
20
20
  export let quietTabs;
21
21
 
22
22
  // Computed for repeated logic
23
23
  $: isVertical = tabsPosition == "left" || theme === "list";
24
24
  $: justify = direction === "row" ? hAlign : vAlign;
25
- $: button = theme === "buttons" || theme === "wideButtons";
25
+ $: button = theme === "buttons";
26
26
  </script>
27
27
 
28
28
  <!-- svelte-ignore a11y-click-events-have-key-events -->
@@ -33,15 +33,14 @@
33
33
  class:quietTabs
34
34
  class:list={theme === "list"}
35
35
  class:vertical={isVertical}
36
- class:wide={theme === "wideButtons" && wide}
37
36
  style:justify-content={justify}
37
+ style:width={isVertical ? tabsWidth || "200px" : "100%"}
38
38
  >
39
39
  <div
40
40
  class="tabs"
41
41
  class:vertical={isVertical}
42
42
  class:buttons={button}
43
43
  class:list={theme === "list"}
44
- class:wide={theme === "wideButtons" && wide}
45
44
  style:justify-content={buttonsAlignment}
46
45
  style:--tab-alignment={tabsAlignment}
47
46
  style:--tab-track-thickness="1px"
@@ -74,7 +73,7 @@
74
73
  {#if container.icon}
75
74
  <i
76
75
  class={container.icon}
77
- style:font-size={tabsIconsOnly ? "20px" : null}
76
+ style:font-size={tabsIconsOnly ? "20px" : "inherit"}
78
77
  style:color={container.color}
79
78
  ></i>
80
79
  {/if}
@@ -104,30 +103,24 @@
104
103
  }
105
104
 
106
105
  .outer-tabs.vertical {
106
+ padding-left: 0.25rem;
107
+ padding-right: 0.25rem;
107
108
  flex-direction: column;
108
109
  align-items: stretch;
109
- margin-right: 0.75rem;
110
110
  margin-bottom: unset;
111
- width: 10rem;
112
- background-color: var(--spectrum-global-color-gray-100);
113
111
  --selected-tab: var(--spectrum-global-color-gray-200);
114
112
  }
115
113
 
116
- .outer-tabs.vertical.wide {
117
- width: 14rem;
118
- }
119
-
120
114
  .tabs {
121
115
  flex: auto;
122
116
  display: flex;
123
117
  gap: 1rem;
124
- padding: 0.35rem 0.5rem;
125
- border-bottom: 1px solid var(--spectrum-global-color-gray-200);
126
- border-top: 1px solid var(--spectrum-global-color-gray-200);
118
+ padding-bottom: 0.25rem;
119
+ border-bottom: 1px solid var(--spectrum-global-color-gray-300);
127
120
  }
128
121
 
129
122
  .tabs.buttons {
130
- gap: 0.5rem;
123
+ gap: 0.25rem;
131
124
  }
132
125
 
133
126
  .tabs.list {
@@ -170,21 +163,31 @@
170
163
  }
171
164
 
172
165
  .tab.button {
173
- border-radius: 4px;
174
- padding: 0.35rem 1rem;
166
+ border-radius: 0.25rem;
167
+ padding: 0.5rem 1rem;
168
+ font-weight: 600;
169
+ line-height: 14px;
170
+ border: 1px solid transparent;
171
+ height: 1.85rem;
175
172
  }
176
173
 
177
174
  .tab.button.vertical {
178
175
  width: 100%;
176
+ padding: 0.5rem 0.75rem;
179
177
  }
180
178
 
181
179
  .tab.button:active:not(.disabled):not(.list-section) {
182
- background-color: var(--spectrum-global-color-gray-200);
180
+ background-color: rgb(
181
+ from var(--spectrum-global-color-gray-200) r g b / 0.85
182
+ );
183
183
  }
184
184
 
185
185
  .tab.button.selected {
186
- color: var(--spectrum-global-color-gray-800);
187
- background-color: var(--spectrum-global-color-gray-300);
186
+ color: var(--spectrum-global-color-gray-700);
187
+ border: 1px solid var(--spectrum-global-color-gray-300);
188
+ background-color: rgb(
189
+ from var(--spectrum-global-color-gray-200) r g b / 0.85
190
+ );
188
191
  }
189
192
 
190
193
  .tab.list {
@@ -234,11 +237,13 @@
234
237
 
235
238
  .tab:hover:not(.disabled):not(.list-title):not(.list-section) {
236
239
  cursor: pointer;
237
- color: var(--spectrum-global-color-gray-800);
238
240
  }
239
241
 
240
242
  .tab.button:hover:not(.selected) {
241
- background-color: var(--spectrum-global-color-gray-200);
243
+ background-color: rgb(
244
+ from var(--spectrum-global-color-gray-200) r g b / 0.65
245
+ );
246
+ border-color: var(--spectrum-global-color-gray-200);
242
247
  }
243
248
 
244
249
  .tab.selected {
@@ -1,58 +0,0 @@
1
- <script>
2
- function autoSetup() {}
3
- </script>
4
-
5
- <div class="welcome">
6
- <div class="welcome-icon">
7
- <svg
8
- xmlns="http://www.w3.org/2000/svg"
9
- width="64"
10
- height="64"
11
- viewBox="0 0 18 18"
12
- >
13
- <defs>
14
- <style>
15
- .fill {
16
- fill: #1da1f2;
17
- }
18
- </style>
19
- </defs>
20
- <title>S Table 18 N</title>
21
- <rect
22
- id="Canvas"
23
- fill="#ff13dc"
24
- opacity="0"
25
- width="18"
26
- height="18"
27
- /><path
28
- class="fill"
29
- d="M16.5,1H1.5a.5.5,0,0,0-.5.5v15a.5.5,0,0,0,.5.5h15a.5.5,0,0,0,.5-.5V1.5A.5.5,0,0,0,16.5,1ZM6,16H2V14H6Zm0-3H2V11H6Zm0-3H2V8H6Zm10,6H7V14h9Zm0-3H7V11h9Zm0-3H7V8h9Zm0-3H2V2H16Z"
30
- ></p>
31
- </svg>
32
- </div>
33
-
34
- <div class="welcome-text">
35
- <h2>Welcome to the Super Table Component</h2>
36
- <p>You need to connect your Super Table to a Data Provider</p>
37
- <p>and select the <strong>Unique ID Column</strong></p>
38
- <p>Then add some Super Columns to start designing you table</p>
39
- </div>
40
- </div>
41
-
42
- <style>
43
- h2 {
44
- padding-top: none;
45
- margin-top: unset;
46
- }
47
- .welcome {
48
- display: flex;
49
- flex-direction: row;
50
- justify-content: flex-start;
51
- align-content: middle;
52
- gap: 20px;
53
- }
54
-
55
- .welcome-text,
56
- .welcome-icon {
57
- }
58
- </style>