@poirazis/supercomponents-shared 1.2.16 → 1.2.18

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 (31) hide show
  1. package/dist/index.js +17703 -22317
  2. package/dist/index.umd.cjs +19 -19
  3. package/package.json +11 -11
  4. package/src/lib/SuperButton/SuperButton.svelte +57 -22
  5. package/src/lib/SuperField/SuperField.svelte +0 -2
  6. package/src/lib/SuperForm/InnerForm.svelte +7 -8
  7. package/src/lib/SuperTable/SuperTable.css +13 -6
  8. package/src/lib/SuperTable/SuperTable.svelte +26 -15
  9. package/src/lib/SuperTable/constants.js +1 -1
  10. package/src/lib/SuperTable/controls/RowButtonsColumn.svelte +33 -17
  11. package/src/lib/SuperTable/controls/SelectionColumn.svelte +2 -2
  12. package/src/lib/SuperTableCells/CellBoolean.svelte +52 -45
  13. package/src/lib/SuperTableCells/CellDatetime.svelte +268 -120
  14. package/src/lib/SuperTableCells/CellLink.svelte +16 -7
  15. package/src/lib/SuperTableCells/CellLinkPickerSelect.svelte +28 -24
  16. package/src/lib/SuperTableCells/CellLinkPickerTree.svelte +22 -20
  17. package/src/lib/SuperTableCells/CellNumber.svelte +55 -53
  18. package/src/lib/SuperTableCells/CellOptions.svelte +59 -32
  19. package/src/lib/SuperTableCells/CellOptionsAdvanced.svelte +131 -129
  20. package/src/lib/SuperTableCells/CellSQLLink.svelte +32 -32
  21. package/src/lib/SuperTableCells/CellSQLLinkPicker.svelte +2 -7
  22. package/src/lib/SuperTableCells/CellString.svelte +49 -47
  23. package/src/lib/SuperTableCells/CellStringMask.svelte +41 -40
  24. package/src/lib/SuperTableColumn/SuperTableColumn.svelte +2 -0
  25. package/src/lib/SuperTableColumn/parts/SuperColumnBody.svelte +3 -0
  26. package/src/lib/SuperTableColumn/parts/SuperColumnHeader.svelte +44 -42
  27. package/src/lib/SuperTableColumn/parts/SuperColumnRow.svelte +1 -1
  28. package/src/lib/SuperTabs/SuperTabs.svelte +33 -17
  29. package/src/lib/UI/elements/Checkbox.svelte +68 -10
  30. package/src/lib/UI/elements/Switch.svelte +162 -0
  31. package/src/lib/UI/elements/Tooltip.svelte +15 -43
@@ -21,6 +21,8 @@
21
21
  $columnState == "EditingCell" &&
22
22
  ($columnSettings.highlighters == "vertical" ||
23
23
  $columnSettings.highlighters == "both");
24
+
25
+ $: console.log(isLast);
24
26
  </script>
25
27
 
26
28
  <div
@@ -32,6 +34,7 @@
32
34
  class:inserting
33
35
  class:filtered={$columnState == "Filtered"}
34
36
  class:is-editing={editing}
37
+ class:is-last={isLast}
35
38
  >
36
39
  {#each $stbVisibleRows as index (index)}
37
40
  <SuperColumnRow
@@ -108,51 +108,53 @@
108
108
  on:mouseenter={() => (hovered = true)}
109
109
  on:mouseleave={() => (hovered = false)}
110
110
  >
111
- {#if $columnState == "Entering" || $columnState == "Filtered"}
112
- {#if $columnOptions.canFilter == "advanced"}
113
- <i
114
- class="ri-filter-3-line"
115
- tabindex="0"
116
- style="align-self: center; font-size: 14px;"
117
- on:click|preventDefault={() =>
118
- (showFilteringOptions = !showFilteringOptions)}
119
- ></i>
120
- {/if}
121
- <svelte:component
122
- this={$columnOptions.headerComponent}
123
- cellOptions={{
124
- ...$cellOptions,
125
- placeholder: filterOperator,
126
- disabled: filterOperator == "empty" || filterOperator == "notEmpty",
127
- }}
128
- value={filterValue}
129
- fieldSchema={$columnOptions.schema}
130
- multi={filterOperator == "containsAny" || filterOperator == "oneOf"}
131
- on:change={handleValueChange}
132
- on:focusout={handleBlur}
133
- />
134
- {:else}
135
- <div
136
- class="headerLabel"
137
- style:justify-content={$columnOptions?.headerAlign}
138
- on:click={columnState.headerClicked}
139
- >
140
- <div class="innerText" class:sortable={$columnOptions.canSort}>
141
- {$columnOptions.displayName ?? $columnOptions.name}
142
- </div>
143
- </div>
144
- {/if}
145
-
146
- {#if $columnOptions.canSort && $columnState == "Idle"}
147
- <span class="placeholder" on:click={columnState.sort}>
148
- {#if hovered || sorted}
111
+ {#key $columnState}
112
+ {#if $columnState == "Entering" || $columnState == "Filtered"}
113
+ {#if $columnOptions.canFilter == "advanced"}
149
114
  <i
150
- class={sorted == "ascending" ? "ri-sort-asc" : "ri-sort-desc"}
151
- class:sorted
115
+ class="ri-filter-3-line"
116
+ tabindex="0"
117
+ style="align-self: center; font-size: 14px;"
118
+ on:click|preventDefault={() =>
119
+ (showFilteringOptions = !showFilteringOptions)}
152
120
  ></i>
153
121
  {/if}
154
- </span>
155
- {/if}
122
+ <svelte:component
123
+ this={$columnOptions.headerComponent}
124
+ cellOptions={{
125
+ ...$cellOptions,
126
+ placeholder: filterOperator,
127
+ disabled: filterOperator == "empty" || filterOperator == "notEmpty",
128
+ }}
129
+ value={filterValue}
130
+ fieldSchema={$columnOptions.schema}
131
+ multi={filterOperator == "containsAny" || filterOperator == "oneOf"}
132
+ on:change={handleValueChange}
133
+ on:focusout={handleBlur}
134
+ />
135
+ {:else}
136
+ <div
137
+ class="headerLabel"
138
+ style:justify-content={$columnOptions?.headerAlign}
139
+ on:click={columnState.headerClicked}
140
+ >
141
+ <div class="innerText" class:sortable={$columnOptions.canSort}>
142
+ {$columnOptions.displayName ?? $columnOptions.name}
143
+ </div>
144
+ </div>
145
+ {/if}
146
+
147
+ {#if $columnOptions.canSort && $columnState == "Idle"}
148
+ <span class="placeholder" on:click={columnState.sort}>
149
+ {#if hovered || sorted}
150
+ <i
151
+ class={sorted == "ascending" ? "ri-sort-asc" : "ri-sort-desc"}
152
+ class:sorted
153
+ ></i>
154
+ {/if}
155
+ </span>
156
+ {/if}
157
+ {/key}
156
158
  </div>
157
159
 
158
160
  {#if $columnOptions.canFilter == "advanced" && $columnState != "Idle"}
@@ -72,7 +72,7 @@
72
72
  }
73
73
  }
74
74
  return obj;
75
- } else return obj[path] ?? undefined;
75
+ } else return obj[path];
76
76
  };
77
77
 
78
78
  const onClick = () => {
@@ -16,6 +16,7 @@
16
16
  export let list_icon;
17
17
  export let list_title;
18
18
  export let tabsWidth = "200px";
19
+ export let listBackground = "var(--spectrum-global-color-gray-50)";
19
20
 
20
21
  export let quietTabs;
21
22
 
@@ -44,11 +45,12 @@
44
45
  style:justify-content={buttonsAlignment}
45
46
  style:--tab-alignment={tabsAlignment}
46
47
  style:--tab-track-thickness="1px"
48
+ style:--list-background={listBackground}
47
49
  >
48
50
  {#if theme === "list" && list_title}
49
51
  <div class="tab list-title">
50
52
  {#if list_icon}
51
- <i class={list_icon}></i>
53
+ <i class={"ph ph-" + list_icon}></i>
52
54
  {/if}
53
55
  {list_title}
54
56
  </div>
@@ -73,7 +75,7 @@
73
75
  {#if container.icon}
74
76
  <i
75
77
  class={container.icon}
76
- style:font-size={tabsIconsOnly ? "20px" : "inherit"}
78
+ style:font-size={tabsIconsOnly ? "20px" : "12px"}
77
79
  style:color={container.color}
78
80
  ></i>
79
81
  {/if}
@@ -110,6 +112,14 @@
110
112
  margin-bottom: unset;
111
113
  --selected-tab: var(--spectrum-global-color-gray-200);
112
114
  }
115
+ .outer-tabs.vertical.list {
116
+ padding-left: unset;
117
+ padding-right: unset;
118
+ flex-direction: column;
119
+ align-items: stretch;
120
+ --selected-tab: var(--spectrum-global-color-gray-200);
121
+ border-right: 1px solid var(--spectrum-global-color-gray-300);
122
+ }
113
123
 
114
124
  .tabs {
115
125
  flex: auto;
@@ -125,20 +135,29 @@
125
135
 
126
136
  .tabs.list {
127
137
  gap: 0;
128
- background-color: var(--spectrum-global-color-gray-50);
138
+ background-color: var(
139
+ --list-background,
140
+ var(--spectrum-global-color-gray-50)
141
+ );
129
142
  border: unset;
130
143
  padding: unset;
144
+ padding-bottom: 0.5rem;
131
145
  }
132
146
 
133
147
  .tabs.vertical {
134
148
  flex-direction: column;
135
149
  border-bottom: unset;
136
150
  border-top: unset;
151
+ border-right: 1px solid var(--spectrum-global-color-gray-300);
152
+ padding-right: 0.25rem;
137
153
  gap: 0.25rem;
138
154
  }
139
155
 
140
156
  .tabs.vertical.list {
141
157
  border-right: unset;
158
+ gap: 2px;
159
+ padding: 2px;
160
+ padding-top: 0rem;
142
161
  }
143
162
 
144
163
  .tab {
@@ -165,10 +184,9 @@
165
184
  .tab.button {
166
185
  border-radius: 0.25rem;
167
186
  padding: 0.5rem 1rem;
168
- font-weight: 600;
169
187
  line-height: 14px;
170
188
  border: 1px solid transparent;
171
- height: 1.85rem;
189
+ height: 1.75rem;
172
190
  }
173
191
 
174
192
  .tab.button.vertical {
@@ -184,51 +202,49 @@
184
202
 
185
203
  .tab.button.selected {
186
204
  color: var(--spectrum-global-color-gray-700);
187
- border: 1px solid var(--spectrum-global-color-gray-300);
205
+ font-weight: 500;
206
+ border: 1px solid
207
+ rgb(from var(--spectrum-global-color-gray-400) r g b / 0.75);
188
208
  background-color: rgb(
189
209
  from var(--spectrum-global-color-gray-200) r g b / 0.85
190
210
  );
191
211
  }
192
212
 
193
213
  .tab.list {
194
- padding: 0.5rem 1rem;
214
+ padding: 0.5rem 0.5rem;
215
+ border-radius: 0.25rem;
195
216
  max-width: 100%;
196
217
  color: var(--spectrum-global-color-gray-700);
197
- font-weight: 400;
198
218
  }
199
219
 
200
220
  .tab.list.selected {
201
221
  color: var(--tab-selected-color);
202
222
  background-color: var(--selected-tab);
203
- font-weight: 500;
204
223
  }
205
224
 
206
- .tab.list:hover:not(.disabled):not(.list-section) {
207
- background-color: var(--spectrum-global-color-gray-75);
225
+ .tab.list:hover:not(.disabled):not(.list-section):not(.selected) {
226
+ background-color: var(--spectrum-global-color-gray-100);
208
227
  }
209
228
 
210
229
  .tab.list-title {
211
- padding: 0.75rem 1rem;
230
+ padding: 0.75rem 0.5rem;
212
231
  max-width: 100%;
213
232
  font-size: 12px;
214
233
  color: var(--spectrum-global-color-gray-800);
215
234
  text-transform: uppercase;
216
235
  letter-spacing: 1.2px;
217
- font-weight: 500;
218
236
  border-bottom: 1px solid var(--spectrum-global-color-gray-300);
219
- height: 3rem;
220
237
  }
221
238
 
222
239
  .tab.list-section {
223
240
  text-transform: uppercase;
224
241
  font-size: 11px;
225
- font-weight: 400;
226
- letter-spacing: 1.2px;
242
+ color: var(--spectrum-global-color-gray-600);
227
243
  background-color: transparent;
228
244
  }
229
245
 
230
246
  .tab.list-section.vertical {
231
- margin-top: 12px;
247
+ margin-top: 4px;
232
248
  }
233
249
 
234
250
  .tab.list-section:hover {
@@ -6,9 +6,11 @@
6
6
  export let partial: boolean = false;
7
7
  export let disabled: boolean = false;
8
8
  export let hovered: boolean = false;
9
+ export let locked: boolean = false;
10
+ export let size: "small" | "medium" | "large" = "small";
9
11
 
10
12
  function toggle() {
11
- if (disabled) return;
13
+ if (disabled || locked) return;
12
14
  checked = !checked;
13
15
  dispatch("change", { checked });
14
16
  }
@@ -16,11 +18,20 @@
16
18
 
17
19
  <!-- svelte-ignore a11y-click-events-have-key-events -->
18
20
  <!-- svelte-ignore a11y-no-static-element-interactions -->
19
- <button class:checked class:disabled class:hovered on:click={toggle}>
21
+ <button
22
+ class:checked
23
+ class:disabled
24
+ class:hovered
25
+ class:locked
26
+ class={size}
27
+ on:click={toggle}
28
+ >
20
29
  {#if checked}
21
30
  <i class="ph ph-check"></i>
22
31
  {:else if partial}
23
32
  <i class="ph ph-minus"></i>
33
+ {:else if locked}
34
+ <i class="ph ph-lock"></i>
24
35
  {/if}
25
36
  </button>
26
37
 
@@ -31,16 +42,50 @@
31
42
  display: flex;
32
43
  align-items: center;
33
44
  justify-content: center;
34
- width: 0.85rem;
35
- height: 0.85rem;
36
45
  border-radius: 0.25rem;
37
46
  border: 1px solid var(--spectrum-global-color-gray-500);
38
47
  background-color: var(--spectrum-global-color-gray-50);
39
48
  transition: all 0.1s ease-in-out;
40
49
  }
41
50
 
51
+ /* Small size */
52
+ button.small {
53
+ width: 0.85rem;
54
+ height: 0.85rem;
55
+ }
56
+
57
+ button.small i {
58
+ font-size: 0.65rem;
59
+ }
60
+
61
+ /* Medium size */
62
+ button.medium {
63
+ width: 1rem;
64
+ height: 1rem;
65
+ }
66
+
67
+ button.medium i {
68
+ font-size: 0.75rem;
69
+ }
70
+
71
+ /* Large size */
72
+ button.large {
73
+ width: 1.25rem;
74
+ height: 1.25rem;
75
+ }
76
+
77
+ button.large i {
78
+ font-size: 0.9rem;
79
+ }
80
+
42
81
  button.checked {
43
- border-color: var(--spectrum-global-color-gray-700);
82
+ border-color: var(--spectrum-global-color-blue-600) !important;
83
+ background-color: var(--spectrum-global-color-blue-600);
84
+
85
+ & i {
86
+ color: white;
87
+ font-weight: 900;
88
+ }
44
89
  }
45
90
 
46
91
  button.disabled {
@@ -49,20 +94,33 @@
49
94
  border-color: var(--spectrum-global-color-gray-300);
50
95
  }
51
96
 
52
- button:hover:not(.disabled),
53
- button.hovered:not(.disabled) {
97
+ button.locked {
98
+ border-color: transparent;
99
+ }
100
+
101
+ button.locked i {
102
+ font-size: 1rem !important;
103
+ font-weight: 400 !important;
104
+ color: var(--spectrum-global-color-gray-500) !important;
105
+ }
106
+
107
+ button:hover:not(.disabled):not(.locked):not(.checked) {
108
+ background-color: var(--spectrum-global-color-gray-100);
109
+ border-color: var(--spectrum-global-color-gray-600);
110
+ }
111
+
112
+ button.hovered:not(.disabled):not(.locked):not(.checked) {
54
113
  border: 1px solid var(--spectrum-global-color-gray-600);
55
114
  }
56
115
 
57
- button:active {
116
+ button:active:not(.disabled):not(.locked):not(.checked) {
58
117
  background-color: var(--spectrum-global-color-blue-100);
59
118
  }
60
- button:focus {
119
+ button:focus:not(.disabled):not(.locked) {
61
120
  border: 1px solid var(--spectrum-global-color-gray-700);
62
121
  }
63
122
 
64
123
  i {
65
- font-size: 0.65rem;
66
124
  font-weight: 700;
67
125
  color: var(--spectrum-global-color-gray-700);
68
126
  animation: scaleIn 0.13s ease-out;
@@ -0,0 +1,162 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from "svelte";
3
+ const dispatch = createEventDispatcher();
4
+
5
+ export let checked: boolean | null = false;
6
+ export let disabled: boolean = false;
7
+ export let hovered: boolean = false;
8
+ export let size: "small" | "medium" | "large" = "medium";
9
+ export let tristate: boolean = false;
10
+
11
+ function toggle() {
12
+ if (disabled) return;
13
+
14
+ if (tristate) {
15
+ // Three-state cycle: off -> on -> null -> off
16
+ if (checked === false) {
17
+ checked = true;
18
+ } else if (checked === true) {
19
+ checked = null;
20
+ } else {
21
+ checked = false;
22
+ }
23
+ } else {
24
+ // Two-state toggle: off -> on -> off
25
+ checked = !checked;
26
+ }
27
+
28
+ dispatch("change", { checked });
29
+ }
30
+ </script>
31
+
32
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
33
+ <!-- svelte-ignore a11y-no-static-element-interactions -->
34
+ <div
35
+ class="switch-container {size}"
36
+ class:checked={checked === true}
37
+ class:indeterminate={checked === null}
38
+ class:disabled
39
+ class:hovered
40
+ on:click|stopPropagation={toggle}
41
+ >
42
+ <div class="switch-track">
43
+ <div class="switch-thumb"></div>
44
+ </div>
45
+ </div>
46
+
47
+ <style>
48
+ .switch-container {
49
+ display: inline-flex;
50
+ align-items: center;
51
+ cursor: pointer;
52
+ user-select: none;
53
+ }
54
+
55
+ .switch-container.disabled {
56
+ cursor: not-allowed;
57
+ opacity: 0.6;
58
+ }
59
+
60
+ .switch-track {
61
+ position: relative;
62
+ background-color: var(--spectrum-global-color-gray-400);
63
+ border-radius: 1rem;
64
+ }
65
+
66
+ .switch-thumb {
67
+ position: absolute;
68
+ background-color: var(--spectrum-global-color-gray-50);
69
+ border-radius: 50%;
70
+ transition: transform 0.2s ease-in-out;
71
+ }
72
+
73
+ /* Small size */
74
+ .switch-container.small .switch-track {
75
+ width: 2rem;
76
+ height: 1rem;
77
+ }
78
+
79
+ .switch-container.small .switch-thumb {
80
+ width: 0.7rem;
81
+ height: 0.7rem;
82
+ top: 0.15rem;
83
+ left: 0.15rem;
84
+ }
85
+
86
+ .switch-container.small.checked .switch-thumb {
87
+ transform: translateX(1rem);
88
+ }
89
+
90
+ .switch-container.small.checked .switch-track {
91
+ justify-content: flex-end;
92
+ }
93
+
94
+ .switch-container.small.indeterminate .switch-thumb {
95
+ transform: translateX(0.45rem);
96
+ }
97
+
98
+ /* Medium size */
99
+ .switch-container.medium .switch-track {
100
+ width: 2.5rem;
101
+ height: 1.25rem;
102
+ }
103
+
104
+ .switch-container.medium .switch-thumb {
105
+ width: 1rem;
106
+ height: 1rem;
107
+ top: 0.125rem;
108
+ left: 0.125rem;
109
+ }
110
+
111
+ .switch-container.medium.checked .switch-thumb {
112
+ transform: translateX(1.25rem);
113
+ }
114
+
115
+ .switch-container.medium.indeterminate .switch-thumb {
116
+ transform: translateX(0.625rem);
117
+ }
118
+
119
+ /* Large size */
120
+ .switch-container.large .switch-track {
121
+ width: 3rem;
122
+ height: 1.5rem;
123
+ }
124
+
125
+ .switch-container.large .switch-thumb {
126
+ width: 1.25rem;
127
+ height: 1.25rem;
128
+ top: 0.125rem;
129
+ left: 0.125rem;
130
+ }
131
+
132
+ .switch-container.large.checked .switch-thumb {
133
+ transform: translateX(1.5rem);
134
+ }
135
+
136
+ .switch-container.large.indeterminate .switch-thumb {
137
+ transform: translateX(0.75rem);
138
+ }
139
+
140
+ /* Checked state */
141
+ .switch-container.checked .switch-track {
142
+ background-color: var(--spectrum-global-color-blue-500);
143
+ }
144
+
145
+ /* Indeterminate state */
146
+ .switch-container.indeterminate .switch-track {
147
+ background-color: var(--spectrum-global-color-orange-500);
148
+ }
149
+
150
+ /* Hover state */
151
+ .switch-container:hover:not(.disabled),
152
+ .switch-container.hovered:not(.disabled) {
153
+ filter: brightness(1.1);
154
+ }
155
+
156
+ /* Focus state */
157
+ .switch-container:focus-visible {
158
+ outline: 2px solid var(--spectrum-global-color-blue-600);
159
+ outline-offset: 2px;
160
+ border-radius: 0.5rem;
161
+ }
162
+ </style>
@@ -1,59 +1,30 @@
1
1
  <script>
2
2
  import SuperPopover from "../../SuperPopover/SuperPopover.svelte";
3
- import { onDestroy } from "svelte";
4
3
 
5
4
  export let anchor;
6
5
  export let content;
7
6
  export let show = false;
8
- export let delay = 750;
9
7
  export let align = "top";
10
-
11
- let timer;
12
- let isHovered = false;
13
-
14
- const startTimer = () => {
15
- if (timer) clearTimeout(timer);
16
- timer = setTimeout(() => {
17
- show = true;
18
- }, delay);
19
- };
20
-
21
- const clearTimer = () => {
22
- if (timer) {
23
- clearTimeout(timer);
24
- timer = null;
25
- }
26
- show = false;
27
- };
28
-
29
- const handleMouseEnter = () => {
30
- isHovered = true;
31
- startTimer();
32
- };
33
-
34
- const handleMouseLeave = () => {
35
- isHovered = false;
36
- clearTimer();
37
- };
38
-
39
- onDestroy(() => {
40
- clearTimer();
41
- });
42
8
  </script>
43
9
 
44
- {#if show}
45
- <SuperPopover {anchor} {align} open={show} dismissible={false} animate={true}>
46
- <div class="tooltip-content info">
47
- {content}
48
- </div>
49
- </SuperPopover>
50
- {/if}
10
+ <SuperPopover
11
+ {anchor}
12
+ {align}
13
+ open={show}
14
+ dismissible={false}
15
+ animate={true}
16
+ customZindex={1000}
17
+ offsetBelow={12}
18
+ >
19
+ <div class="tooltip-content info">
20
+ {content}
21
+ </div>
22
+ </SuperPopover>
51
23
 
52
24
  <style>
53
25
  .tooltip-content {
54
- padding: 8px 12px;
26
+ padding: 4px 12px;
55
27
  font-size: 12px;
56
- line-height: 1.4;
57
28
  color: var(--spectrum-global-color-gray-700);
58
29
  background-color: var(--spectrum-global-color-gray-50);
59
30
  border: 1px solid var(--spectrum-global-color-gray-300);
@@ -64,6 +35,7 @@
64
35
  }
65
36
 
66
37
  .tooltip-content.info {
38
+ padding: 4px 12px;
67
39
  background-color: var(--spectrum-global-color-blue-100);
68
40
  border-color: rgb(from var(--spectrum-global-color-blue-500) r g b / 50%);
69
41
  color: var(--spectrum-global-color-gray-800);