@spaethtech/svelte-ui 0.1.10 → 0.3.0

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 (208) hide show
  1. package/README.md +166 -42
  2. package/dist/components/Alert.svelte +119 -0
  3. package/dist/components/Alert.svelte.d.ts +29 -0
  4. package/dist/components/Badge/Badge.svelte +142 -69
  5. package/dist/components/Badge/Badge.svelte.d.ts +26 -6
  6. package/dist/components/Badge/index.d.ts +1 -1
  7. package/dist/components/Badge/index.js +1 -1
  8. package/dist/components/Banner.svelte +133 -0
  9. package/dist/components/Banner.svelte.d.ts +31 -0
  10. package/dist/components/Button.svelte +240 -0
  11. package/dist/components/Button.svelte.d.ts +33 -0
  12. package/dist/components/ButtonDropdown.svelte +145 -0
  13. package/dist/components/ButtonDropdown.svelte.d.ts +31 -0
  14. package/dist/components/Calendar.svelte +259 -0
  15. package/dist/components/Calendar.svelte.d.ts +27 -0
  16. package/dist/components/Card.svelte +78 -0
  17. package/dist/components/Card.svelte.d.ts +17 -0
  18. package/dist/components/CardBody.svelte +41 -0
  19. package/dist/components/CardBody.svelte.d.ts +17 -0
  20. package/dist/components/CardFooter.svelte +49 -0
  21. package/dist/components/CardFooter.svelte.d.ts +16 -0
  22. package/dist/components/CardHeader.svelte +49 -0
  23. package/dist/components/CardHeader.svelte.d.ts +16 -0
  24. package/dist/components/Checkbox.svelte +131 -0
  25. package/dist/components/Checkbox.svelte.d.ts +16 -0
  26. package/dist/components/DataTable.svelte +518 -0
  27. package/dist/components/DataTable.svelte.d.ts +74 -0
  28. package/dist/components/DatePicker.svelte +312 -0
  29. package/dist/components/DatePicker.svelte.d.ts +32 -0
  30. package/dist/components/DateTimeInput.svelte +93 -0
  31. package/dist/components/DateTimeInput.svelte.d.ts +20 -0
  32. package/dist/components/Dialog.svelte +132 -0
  33. package/dist/components/Dialog.svelte.d.ts +24 -0
  34. package/dist/components/{EmailInput/EmailInput.svelte → EmailInput.svelte} +17 -8
  35. package/dist/components/EmailInput.svelte.d.ts +21 -0
  36. package/dist/components/Input.svelte +369 -0
  37. package/dist/components/Input.svelte.d.ts +35 -0
  38. package/dist/components/{List/List.svelte → List.svelte} +194 -133
  39. package/dist/components/{List/List.svelte.d.ts → List.svelte.d.ts} +9 -1
  40. package/dist/components/Menu.svelte +117 -0
  41. package/dist/components/Menu.svelte.d.ts +20 -0
  42. package/dist/components/NotesEditor.svelte +127 -0
  43. package/dist/components/NotesEditor.svelte.d.ts +17 -0
  44. package/dist/components/{NumberInput/NumberInput.svelte → NumberInput.svelte} +146 -105
  45. package/dist/components/{NumberInput/NumberInput.svelte.d.ts → NumberInput.svelte.d.ts} +11 -4
  46. package/dist/components/PasswordInput.svelte +52 -0
  47. package/dist/components/PasswordInput.svelte.d.ts +20 -0
  48. package/dist/components/Popup.svelte +140 -0
  49. package/dist/components/Popup.svelte.d.ts +31 -0
  50. package/dist/components/Query.svelte +284 -0
  51. package/dist/components/Query.svelte.d.ts +15 -0
  52. package/dist/components/{Rating/Rating.svelte → Rating.svelte} +19 -10
  53. package/dist/components/Rating.svelte.d.ts +13 -0
  54. package/dist/components/{SearchInput/SearchInput.svelte → SearchInput.svelte} +19 -8
  55. package/dist/components/{SearchInput/SearchInput.svelte.d.ts → SearchInput.svelte.d.ts} +9 -2
  56. package/dist/components/{Select/Select.svelte → Select.svelte} +48 -76
  57. package/dist/components/{Select/Select.svelte.d.ts → Select.svelte.d.ts} +11 -1
  58. package/dist/components/SideBarMenu/SideBarMenu.svelte +724 -0
  59. package/dist/components/SideBarMenu/SideBarMenu.svelte.d.ts +109 -0
  60. package/dist/components/SideBarMenu/index.d.ts +2 -0
  61. package/dist/components/SideBarMenu/index.js +1 -0
  62. package/dist/components/TabStrip/TabStrip.svelte +384 -0
  63. package/dist/components/TabStrip/TabStrip.svelte.d.ts +50 -0
  64. package/dist/components/TabStrip/index.d.ts +3 -0
  65. package/dist/components/TabStrip/index.js +2 -0
  66. package/dist/components/{TextArea/TextArea.svelte → TextArea.svelte} +143 -112
  67. package/dist/components/TextArea.svelte.d.ts +38 -0
  68. package/dist/components/ThemeSelector.svelte +81 -0
  69. package/dist/components/ThemeSelector.svelte.d.ts +10 -0
  70. package/dist/components/TimePicker.svelte +148 -0
  71. package/dist/components/TimePicker.svelte.d.ts +28 -0
  72. package/dist/components/TimeRangeInput.svelte +203 -0
  73. package/dist/components/TimeRangeInput.svelte.d.ts +29 -0
  74. package/dist/components/TimeSpinner.svelte +202 -0
  75. package/dist/components/TimeSpinner.svelte.d.ts +26 -0
  76. package/dist/components/Toast/Toaster.svelte +51 -0
  77. package/dist/components/Toast/Toaster.svelte.d.ts +12 -0
  78. package/dist/components/Toast/toast.svelte.d.ts +29 -0
  79. package/dist/components/Toast/toast.svelte.js +27 -0
  80. package/dist/components/Toggle.svelte +93 -0
  81. package/dist/components/Toggle.svelte.d.ts +15 -0
  82. package/dist/data/dataset.d.ts +42 -0
  83. package/dist/data/dataset.js +3 -0
  84. package/dist/data/index.d.ts +3 -0
  85. package/dist/data/index.js +3 -0
  86. package/dist/data/query/ast.d.ts +62 -0
  87. package/dist/data/query/ast.js +12 -0
  88. package/dist/data/query/index.d.ts +3 -0
  89. package/dist/data/query/index.js +3 -0
  90. package/dist/data/query/lexer.d.ts +33 -0
  91. package/dist/data/query/lexer.js +225 -0
  92. package/dist/data/query/parser.d.ts +11 -0
  93. package/dist/data/query/parser.js +252 -0
  94. package/dist/data/table/grid.svelte.d.ts +57 -0
  95. package/dist/data/table/grid.svelte.js +139 -0
  96. package/dist/data/table/index.d.ts +2 -0
  97. package/dist/data/table/index.js +2 -0
  98. package/dist/data/table/types.d.ts +79 -0
  99. package/dist/index.d.ts +48 -22
  100. package/dist/index.js +45 -21
  101. package/dist/positioning/anchored.d.ts +61 -0
  102. package/dist/positioning/anchored.js +122 -0
  103. package/dist/positioning/tooltip.d.ts +41 -0
  104. package/dist/positioning/tooltip.js +147 -0
  105. package/dist/theme.css +205 -0
  106. package/dist/types/breakpoints.d.ts +24 -0
  107. package/dist/types/breakpoints.js +13 -0
  108. package/dist/types/responsive.d.ts +32 -0
  109. package/dist/types/responsive.js +54 -0
  110. package/dist/types/sizes.d.ts +10 -3
  111. package/dist/types/time.d.ts +19 -0
  112. package/dist/types/time.js +10 -0
  113. package/dist/types/variants.d.ts +8 -1
  114. package/dist/types/variants.js +16 -1
  115. package/package.json +93 -63
  116. package/dist/components/Button/Button.svelte +0 -172
  117. package/dist/components/Button/Button.svelte.d.ts +0 -32
  118. package/dist/components/Button/index.d.ts +0 -1
  119. package/dist/components/Button/index.js +0 -1
  120. package/dist/components/Dialog/Dialog.svelte +0 -101
  121. package/dist/components/Dialog/Dialog.svelte.d.ts +0 -18
  122. package/dist/components/Dialog/index.d.ts +0 -1
  123. package/dist/components/Dialog/index.js +0 -1
  124. package/dist/components/ElementManager/ElementManager.svelte +0 -397
  125. package/dist/components/ElementManager/ElementManager.svelte.d.ts +0 -43
  126. package/dist/components/ElementManager/index.d.ts +0 -1
  127. package/dist/components/ElementManager/index.js +0 -1
  128. package/dist/components/EmailInput/EmailInput.svelte.d.ts +0 -14
  129. package/dist/components/EmailInput/index.d.ts +0 -1
  130. package/dist/components/EmailInput/index.js +0 -1
  131. package/dist/components/Icon/Icon.svelte +0 -74
  132. package/dist/components/Icon/Icon.svelte.d.ts +0 -13
  133. package/dist/components/Icon/index.d.ts +0 -1
  134. package/dist/components/Icon/index.js +0 -1
  135. package/dist/components/Input/Input.svelte +0 -268
  136. package/dist/components/Input/Input.svelte.d.ts +0 -18
  137. package/dist/components/Input/index.d.ts +0 -1
  138. package/dist/components/Input/index.js +0 -1
  139. package/dist/components/List/index.d.ts +0 -1
  140. package/dist/components/List/index.js +0 -1
  141. package/dist/components/ListItem/ListItem.svelte +0 -175
  142. package/dist/components/ListItem/ListItem.svelte.d.ts +0 -24
  143. package/dist/components/ListItem/index.d.ts +0 -2
  144. package/dist/components/ListItem/index.js +0 -2
  145. package/dist/components/ListView/ListView.svelte +0 -463
  146. package/dist/components/ListView/ListView.svelte.d.ts +0 -37
  147. package/dist/components/ListView/index.d.ts +0 -2
  148. package/dist/components/ListView/index.js +0 -2
  149. package/dist/components/NodeGraph/BaseNode.d.ts +0 -57
  150. package/dist/components/NodeGraph/BaseNode.js +0 -30
  151. package/dist/components/NodeGraph/Edge.svelte +0 -60
  152. package/dist/components/NodeGraph/Edge.svelte.d.ts +0 -16
  153. package/dist/components/NodeGraph/ExpressionEvaluator.d.ts +0 -82
  154. package/dist/components/NodeGraph/ExpressionEvaluator.js +0 -152
  155. package/dist/components/NodeGraph/Node.svelte +0 -100
  156. package/dist/components/NodeGraph/Node.svelte.d.ts +0 -10
  157. package/dist/components/NodeGraph/NodeGraph.svelte +0 -52
  158. package/dist/components/NodeGraph/NodeGraph.svelte.d.ts +0 -14
  159. package/dist/components/NodeGraph/NodeInstance.svelte.d.ts +0 -80
  160. package/dist/components/NodeGraph/NodeInstance.svelte.js +0 -241
  161. package/dist/components/NodeGraph/NodePort.svelte +0 -75
  162. package/dist/components/NodeGraph/NodePort.svelte.d.ts +0 -11
  163. package/dist/components/NodeGraph/decorators.d.ts +0 -81
  164. package/dist/components/NodeGraph/decorators.js +0 -148
  165. package/dist/components/NodeGraph/index.d.ts +0 -9
  166. package/dist/components/NodeGraph/index.js +0 -9
  167. package/dist/components/NodeGraph/types.d.ts +0 -94
  168. package/dist/components/NodeGraph/types.js +0 -33
  169. package/dist/components/NotesEditor/NotesEditor.svelte +0 -203
  170. package/dist/components/NotesEditor/NotesEditor.svelte.d.ts +0 -9
  171. package/dist/components/NotesEditor/index.d.ts +0 -1
  172. package/dist/components/NotesEditor/index.js +0 -1
  173. package/dist/components/NumberInput/index.d.ts +0 -1
  174. package/dist/components/NumberInput/index.js +0 -1
  175. package/dist/components/PasswordInput/PasswordInput.svelte +0 -41
  176. package/dist/components/PasswordInput/PasswordInput.svelte.d.ts +0 -13
  177. package/dist/components/PasswordInput/index.d.ts +0 -1
  178. package/dist/components/PasswordInput/index.js +0 -1
  179. package/dist/components/Popup/index.d.ts +0 -1
  180. package/dist/components/Popup/index.js +0 -1
  181. package/dist/components/Rating/Rating.svelte.d.ts +0 -7
  182. package/dist/components/Rating/index.d.ts +0 -1
  183. package/dist/components/Rating/index.js +0 -1
  184. package/dist/components/ScrollView/ScrollView.svelte +0 -285
  185. package/dist/components/ScrollView/ScrollView.svelte.d.ts +0 -19
  186. package/dist/components/ScrollView/index.d.ts +0 -1
  187. package/dist/components/ScrollView/index.js +0 -1
  188. package/dist/components/SearchInput/index.d.ts +0 -1
  189. package/dist/components/SearchInput/index.js +0 -1
  190. package/dist/components/Select/index.d.ts +0 -1
  191. package/dist/components/Select/index.js +0 -1
  192. package/dist/components/TextArea/TextArea.svelte.d.ts +0 -19
  193. package/dist/components/TextArea/index.d.ts +0 -1
  194. package/dist/components/TextArea/index.js +0 -1
  195. package/dist/components/ThemeSelector/ThemeSelector.svelte +0 -64
  196. package/dist/components/ThemeSelector/ThemeSelector.svelte.d.ts +0 -3
  197. package/dist/components/ThemeSelector/index.d.ts +0 -1
  198. package/dist/components/ThemeSelector/index.js +0 -1
  199. package/dist/components/TooltipHandler/TooltipHandler.svelte +0 -593
  200. package/dist/components/TooltipHandler/TooltipHandler.svelte.d.ts +0 -10
  201. package/dist/components/TooltipHandler/index.d.ts +0 -1
  202. package/dist/components/TooltipHandler/index.js +0 -1
  203. package/dist/styles/sizes.d.ts +0 -78
  204. package/dist/styles/sizes.js +0 -120
  205. package/dist/styles/variants.d.ts +0 -106
  206. package/dist/styles/variants.js +0 -194
  207. package/dist/types/ManagerTypes.d.ts +0 -42
  208. /package/dist/{types/ManagerTypes.js → data/table/types.js} +0 -0
@@ -1,9 +1,12 @@
1
1
  <script lang="ts">
2
- import { slide } from 'svelte/transition';
3
- import type { Snippet } from 'svelte';
4
- import { faChevronDown } from '@fortawesome/free-solid-svg-icons';
5
- import Input from '../Input/Input.svelte';
6
- import List from '../List/List.svelte';
2
+ import type { Snippet } from "svelte";
3
+ import ChevronDown from "~icons/mdi/chevron-down";
4
+ import Input from "./Input.svelte";
5
+ import List from "./List.svelte";
6
+ import Popup from "./Popup.svelte";
7
+ import type { Size } from "../types/sizes.js";
8
+ import type { Responsive } from "../types/responsive.js";
9
+ import type { Variant } from "../types/variants.js";
7
10
 
8
11
  type Option = Record<string, any> & {
9
12
  value: string;
@@ -37,6 +40,8 @@
37
40
  onLoadEnd,
38
41
  onSelection,
39
42
  disabled = false,
43
+ size = "md",
44
+ name,
40
45
  ...restProps
41
46
  }: {
42
47
  options?: Option[];
@@ -65,9 +70,17 @@
65
70
  onLoadEnd?: () => void;
66
71
  onSelection?: (option: Option) => void;
67
72
  disabled?: boolean;
73
+ /** Shared size axis — forwarded to the underlying Input trigger. */
74
+ size?: Responsive<Size>;
75
+ /** Shared variant/borderless axes — forwarded to the underlying Input trigger. */
76
+ variant?: Variant;
77
+ borderless?: boolean;
78
+ /** When set, render a hidden <input name> carrying the value so the Select submits in a form. */
79
+ name?: string;
68
80
  } & Record<string, any> = $props();
69
81
 
70
82
  let isOpen = $state(false);
83
+ let containerElement = $state<HTMLElement>();
71
84
  let inputElement = $state<HTMLInputElement>();
72
85
  let listElement = $state<any>();
73
86
 
@@ -76,27 +89,23 @@
76
89
  if (multiSelect && Array.isArray(value)) {
77
90
  if (value.length === 0) return "";
78
91
  if (value.length === 1) {
79
- const selectedOption = options.find(option => option.value === value[0]);
92
+ const selectedOption = options.find((option) => option.value === value[0]);
80
93
  return selectedOption?.label || "";
81
94
  }
82
95
  return `${value.length} items selected`;
83
96
  } else {
84
- const selectedOption = options.find(option => option.value === value);
97
+ const selectedOption = options.find((option) => option.value === value);
85
98
  return selectedOption?.label || "";
86
99
  }
87
100
  });
88
101
 
89
- // Global dropdown manager - only one dropdown open at a time
90
- let dropdownId = Math.random().toString(36).substring(2, 9);
91
- let zIndex = $state(50);
92
-
93
102
  function toggleDropdown(event?: MouseEvent | KeyboardEvent) {
94
103
  event?.stopPropagation();
95
104
  event?.preventDefault(); // Prevent text selection
96
105
  if (disabled) return;
97
-
106
+
98
107
  isOpen = !isOpen;
99
-
108
+
100
109
  if (isOpen) {
101
110
  // Set focus to the selected item in the list
102
111
  setTimeout(() => {
@@ -122,17 +131,17 @@
122
131
  if (!multiSelect) {
123
132
  isOpen = false;
124
133
  }
125
-
134
+
126
135
  if (onSelection) {
127
136
  onSelection(option);
128
137
  }
129
-
138
+
130
139
  if (!multiSelect && autoAdvance) {
131
140
  // Move to next focusable element (only in single-select mode)
132
141
  setTimeout(() => {
133
142
  if (inputElement) {
134
143
  const focusableElements = document.querySelectorAll(
135
- 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
144
+ 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])',
136
145
  );
137
146
  const currentIndex = Array.from(focusableElements).indexOf(inputElement);
138
147
  const nextElement = focusableElements[currentIndex + 1] as HTMLElement;
@@ -146,10 +155,10 @@
146
155
  }
147
156
 
148
157
  function handleKeydown(event: KeyboardEvent) {
149
- if (event.key === 'Escape') {
158
+ if (event.key === "Escape") {
150
159
  isOpen = false;
151
160
  inputElement?.focus();
152
- } else if (event.key === 'Enter') {
161
+ } else if (event.key === "Enter") {
153
162
  if (isOpen) {
154
163
  // Close dropdown and allow Enter to propagate for form submission
155
164
  isOpen = false;
@@ -159,10 +168,10 @@
159
168
  event.preventDefault();
160
169
  toggleDropdown(event);
161
170
  }
162
- } else if (event.key === ' ') {
171
+ } else if (event.key === " ") {
163
172
  event.preventDefault();
164
173
  toggleDropdown(event);
165
- } else if (event.key === 'ArrowDown' && !isOpen) {
174
+ } else if (event.key === "ArrowDown" && !isOpen) {
166
175
  event.preventDefault();
167
176
  isOpen = true;
168
177
  }
@@ -178,50 +187,21 @@
178
187
  listElement.focus();
179
188
  }
180
189
  }, 50);
181
- }
190
+ },
182
191
  };
183
192
  });
184
-
185
- // Close dropdown when clicking outside or when another dropdown opens
186
- $effect(() => {
187
- if (isOpen) {
188
- // Increment z-index for newly opened dropdown
189
- zIndex = 50 + Date.now() % 1000;
190
-
191
- // Set this as the active dropdown
192
- document.dispatchEvent(new CustomEvent('dropdown-opened', { detail: { id: dropdownId } }));
193
-
194
- const handleClickOutside = (event: MouseEvent) => {
195
- const target = event.target as Element;
196
- if (!target.closest('.select-container')) {
197
- isOpen = false;
198
- }
199
- };
200
-
201
- const handleOtherDropdownOpen = (event: CustomEvent) => {
202
- if (event.detail.id !== dropdownId) {
203
- isOpen = false;
204
- }
205
- };
206
-
207
- document.addEventListener('click', handleClickOutside);
208
- document.addEventListener('dropdown-opened', handleOtherDropdownOpen as EventListener);
209
-
210
- return () => {
211
- document.removeEventListener('click', handleClickOutside);
212
- document.removeEventListener('dropdown-opened', handleOtherDropdownOpen as EventListener);
213
- };
214
- }
215
- });
216
193
  </script>
217
194
 
218
- <div class="relative select-container {className}">
195
+ <div bind:this={containerElement} class="relative select-container {className}">
196
+ <!-- Hidden field so the Select participates in native/remote forms (submits the value, not the label). -->
197
+ {#if name}
198
+ <input type="hidden" {name} value={Array.isArray(value) ? value.join(",") : (value ?? "")} />
199
+ {/if}
219
200
  <Input
220
201
  bind:element={inputElement}
221
202
  value={selectedLabel()}
222
203
  {placeholder}
223
204
  readonly={true}
224
- icon={faChevronDown}
225
205
  iconPosition="right"
226
206
  iconClickable={true}
227
207
  onIconClick={toggleDropdown}
@@ -229,16 +209,20 @@
229
209
  ondblclick={handleInputDoubleClick}
230
210
  onkeydown={handleKeydown}
231
211
  {disabled}
212
+ {size}
232
213
  class={inputClass}
233
214
  inputClass={disabled ? "!cursor-default select-none" : "!cursor-pointer select-none"}
234
215
  {...restProps}
235
- />
236
-
237
- <!-- Always render List to maintain cache, show/hide with CSS -->
238
- <div
239
- class="absolute w-full {isOpen ? '' : 'opacity-0 pointer-events-none'}"
240
- style="z-index: {isOpen ? zIndex : -1}; top: calc(100% + 0.25rem);"
241
216
  >
217
+ {#snippet icon()}<ChevronDown />{/snippet}
218
+ </Input>
219
+
220
+ <!--
221
+ Dropdown lives on the browser top layer (Popover API) via Popup, positioned by the shared
222
+ `anchored` engine — so it flips up/down against the viewport, is never clipped, and reserves
223
+ no layout space. Popup keeps the List mounted (hidden) while closed, preserving its cache.
224
+ -->
225
+ <Popup anchor={containerElement} bind:open={isOpen} matchWidth offset={4}>
242
226
  <List
243
227
  bind:this={listElement}
244
228
  {options}
@@ -246,6 +230,7 @@
246
230
  {multiSelect}
247
231
  {maxVisibleItems}
248
232
  {itemHeight}
233
+ {size}
249
234
  {itemSnippet}
250
235
  onSelection={handleSelection}
251
236
  class={dropdownClass}
@@ -261,18 +246,5 @@
261
246
  {onLoadStart}
262
247
  {onLoadEnd}
263
248
  />
264
- </div>
265
-
266
- <!-- Transition effect overlay -->
267
- {#if isOpen}
268
- <div
269
- class="absolute w-full pointer-events-none"
270
- style="z-index: {zIndex + 1}; top: calc(100% + 0.25rem);"
271
- transition:slide={{ duration: 200 }}
272
- >
273
- <div style="height: {maxVisibleItems * itemHeight}px; opacity: 0;">
274
- <!-- Invisible placeholder for slide transition -->
275
- </div>
276
- </div>
277
- {/if}
278
- </div>
249
+ </Popup>
250
+ </div>
@@ -1,4 +1,7 @@
1
- import type { Snippet } from 'svelte';
1
+ import type { Snippet } from "svelte";
2
+ import type { Size } from "../types/sizes.js";
3
+ import type { Responsive } from "../types/responsive.js";
4
+ import type { Variant } from "../types/variants.js";
2
5
  type Option = Record<string, any> & {
3
6
  value: string;
4
7
  label: string;
@@ -29,6 +32,13 @@ type $$ComponentProps = {
29
32
  onLoadEnd?: () => void;
30
33
  onSelection?: (option: Option) => void;
31
34
  disabled?: boolean;
35
+ /** Shared size axis — forwarded to the underlying Input trigger. */
36
+ size?: Responsive<Size>;
37
+ /** Shared variant/borderless axes — forwarded to the underlying Input trigger. */
38
+ variant?: Variant;
39
+ borderless?: boolean;
40
+ /** When set, render a hidden <input name> carrying the value so the Select submits in a form. */
41
+ name?: string;
32
42
  } & Record<string, any>;
33
43
  declare const Select: import("svelte").Component<$$ComponentProps, {}, "value" | "searchTerm" | "methods">;
34
44
  type Select = ReturnType<typeof Select>;