@dosgato/dialog 1.2.8 → 1.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 (58) hide show
  1. package/dist/Button.svelte +15 -13
  2. package/dist/ButtonGroup.svelte +44 -40
  3. package/dist/Checkbox.svelte +13 -12
  4. package/dist/Container.svelte +50 -46
  5. package/dist/Dialog.svelte +56 -41
  6. package/dist/FieldAutocomplete.svelte +77 -70
  7. package/dist/FieldCheckbox.svelte +25 -22
  8. package/dist/FieldChoices.svelte +74 -68
  9. package/dist/FieldChooserLink.svelte +148 -150
  10. package/dist/FieldDate.svelte +19 -18
  11. package/dist/FieldDateTime.svelte +36 -34
  12. package/dist/FieldDualListbox.svelte +80 -79
  13. package/dist/FieldHidden.svelte +16 -15
  14. package/dist/FieldIdentifier.svelte +18 -17
  15. package/dist/FieldMultiple.svelte +71 -74
  16. package/dist/FieldMultiselect.svelte +81 -72
  17. package/dist/FieldNumber.svelte +20 -19
  18. package/dist/FieldRadio.svelte +42 -41
  19. package/dist/FieldSelect.svelte +45 -45
  20. package/dist/FieldStandard.svelte +28 -27
  21. package/dist/FieldText.svelte +27 -24
  22. package/dist/FieldTextArea.svelte +24 -24
  23. package/dist/FileIcon.svelte +10 -8
  24. package/dist/Form.svelte +40 -18
  25. package/dist/Form.svelte.d.ts +15 -13
  26. package/dist/FormDialog.svelte +40 -25
  27. package/dist/FormDialog.svelte.d.ts +23 -17
  28. package/dist/Icon.svelte +38 -33
  29. package/dist/InlineMessage.svelte +31 -29
  30. package/dist/InlineMessages.svelte +10 -7
  31. package/dist/Input.svelte +40 -39
  32. package/dist/Listbox.svelte +102 -109
  33. package/dist/MaxLength.svelte +19 -18
  34. package/dist/Radio.svelte +18 -15
  35. package/dist/Switcher.svelte +37 -33
  36. package/dist/Tab.svelte +23 -21
  37. package/dist/Tabs.svelte +111 -110
  38. package/dist/Tooltip.svelte +7 -7
  39. package/dist/chooser/Chooser.svelte +83 -76
  40. package/dist/chooser/ChooserPreview.svelte +16 -14
  41. package/dist/chooser/Details.svelte +6 -4
  42. package/dist/chooser/Thumbnail.svelte +20 -16
  43. package/dist/chooser/UploadUI.svelte +78 -69
  44. package/dist/code/CodeEditor.svelte +63 -66
  45. package/dist/code/FieldCodeEditor.svelte +21 -19
  46. package/dist/colorpicker/FieldColorPicker.svelte +36 -35
  47. package/dist/cropper/FieldCropper.svelte +142 -141
  48. package/dist/iconpicker/FieldIconPicker.svelte +102 -94
  49. package/dist/imageposition/FieldImagePosition.svelte +107 -98
  50. package/dist/tagpicker/FieldTagPicker.svelte +63 -54
  51. package/dist/tree/LoadIcon.svelte +0 -1
  52. package/dist/tree/Tree.svelte +198 -192
  53. package/dist/tree/Tree.svelte.d.ts +5 -5
  54. package/dist/tree/TreeCell.svelte +10 -6
  55. package/dist/tree/TreeCell.svelte.d.ts +5 -5
  56. package/dist/tree/TreeNode.svelte +213 -241
  57. package/dist/tree/TreeNode.svelte.d.ts +5 -5
  58. package/package.json +8 -9
@@ -1,209 +1,216 @@
1
- <script>import { Icon } from '..';
2
- import { resize, PopupMenu } from '@txstate-mws/svelte-components';
3
- import { derivedStore, Store } from '@txstate-mws/svelte-store';
4
- import { afterUpdate, beforeUpdate, onDestroy, onMount, setContext, tick } from 'svelte';
5
- import dotsIcon from '@iconify-icons/ph/dots-three-outline-vertical-fill';
6
- import circleIcon from '@iconify-icons/ph/circle';
7
- import radioSelectedIcon from '@iconify-icons/ph/radio-button-fill';
8
- import { isNotBlank } from 'txstate-utils';
9
- import LoadIcon from './LoadIcon.svelte';
10
- import TreeNode from './TreeNode.svelte';
11
- import { getHashId, transformSearchable, TreeStore, TREE_STORE_CONTEXT } from './treestore';
12
- export let headers;
13
- export let searchable = undefined;
14
- export let filterable = searchable;
15
- export let filter = '';
16
- export let nodeClass = undefined;
17
- export let singleSelect = undefined;
18
- export let enableResize = false;
19
- /**
20
- * Takes the width of the tree, in pixels, and returns an array of TreeHeader IDs that should be
21
- * displayed at that screen width. Any headers whose ID is not returned will be added to a dropdown, which allows
22
- * the user to view them. The last ID returned by this function is the header that is replaced if the user chooses
23
- * to view a different header. The headers will always appear in the order in which they are defined in the headers prop.
24
- */
25
- export let responsiveHeaders = undefined;
26
- /**
27
- * this `itemType` prop is here for typescript only
28
- *
29
- * it will allow users to specify T
30
- *
31
- * we are able to determine T from the store prop, but not everyone will use the store prop
32
- */
33
- export const itemType = undefined;
34
- export let fetchChildren = undefined;
35
- export let dragEligible = undefined;
36
- export let moveHandler = undefined;
37
- export let copyHandler = undefined;
38
- export let dropEffect = undefined;
39
- export let store = new TreeStore(fetchChildren, { copyHandler, dragEligible, dropEffect, moveHandler });
40
- if (searchable)
41
- store.searchableFn = transformSearchable(searchable);
42
- if (filterable)
43
- store.filterableFn = transformSearchable(filterable);
44
- setContext(TREE_STORE_CONTEXT, store);
45
- const { filteredRootItems, headerOverride } = store;
46
- let checkboxelement;
47
- const headerelements = [];
48
- let showMoreButton;
49
- const treeWidth = new Store({});
50
- // Need to keep track of which headers are shown or hidden and which is selected
51
- let shownHeaders = headers;
52
- let hiddenHeaders = [];
53
- let selectedHeader = undefined;
54
- let selectedHeaderValue;
55
- function updateShownHeaders() {
1
+ <script lang="ts" generics="T extends TreeItemFromDB = TreeItemFromDB">
2
+ import dotsIcon from '@iconify-icons/ph/dots-three-outline-vertical-fill'
3
+ import circleIcon from '@iconify-icons/ph/circle'
4
+ import radioSelectedIcon from '@iconify-icons/ph/radio-button-fill'
5
+ import { resize, type ElementSize, PopupMenu, type PopupMenuItem } from '@txstate-mws/svelte-components'
6
+ import { derivedStore, Store } from '@txstate-mws/svelte-store'
7
+ import { afterUpdate, beforeUpdate, onDestroy, onMount, setContext, tick } from 'svelte'
8
+ import { isNotBlank } from 'txstate-utils'
9
+ import { Icon } from '..'
10
+ import LoadIcon from './LoadIcon.svelte'
11
+ import TreeNode from './TreeNode.svelte'
12
+ import { getHashId, transformSearchable, TreeStore, TREE_STORE_CONTEXT } from './treestore'
13
+ import type { DragEligibleFn, CopyHandlerFn, DropEffectFn, FetchChildrenFn, MoveHandlerFn, TreeHeader, TreeItemFromDB, SearchableType } from './treestore'
14
+
15
+ interface $$Events {
16
+ choose: CustomEvent<T>
17
+ deselect: CustomEvent<T>
18
+ }
19
+
20
+ export let headers: TreeHeader<T>[]
21
+ export let searchable: SearchableType<T> = undefined
22
+ export let filterable: SearchableType<T> = searchable
23
+ export let filter = ''
24
+ export let nodeClass: ((itm: T) => string) | undefined = undefined
25
+ export let singleSelect: boolean | undefined = undefined
26
+ export let enableResize = false
27
+ /**
28
+ * Takes the width of the tree, in pixels, and returns an array of TreeHeader IDs that should be
29
+ * displayed at that screen width. Any headers whose ID is not returned will be added to a dropdown, which allows
30
+ * the user to view them. The last ID returned by this function is the header that is replaced if the user chooses
31
+ * to view a different header. The headers will always appear in the order in which they are defined in the headers prop.
32
+ */
33
+ export let responsiveHeaders: ((treeWidth: number) => string[]) | undefined = undefined
34
+ /**
35
+ * this `itemType` prop is here for typescript only
36
+ *
37
+ * it will allow users to specify T
38
+ *
39
+ * we are able to determine T from the store prop, but not everyone will use the store prop
40
+ */
41
+ export const itemType: T | undefined = undefined
42
+ export let fetchChildren: FetchChildrenFn<T> | undefined = undefined
43
+ export let dragEligible: DragEligibleFn<T> | undefined = undefined
44
+ export let moveHandler: MoveHandlerFn<T> | undefined = undefined
45
+ export let copyHandler: CopyHandlerFn<T> | undefined = undefined
46
+ export let dropEffect: DropEffectFn<T> | undefined = undefined
47
+ export let store = new TreeStore<T>(fetchChildren!, { copyHandler, dragEligible, dropEffect, moveHandler })
48
+ if (searchable) store.searchableFn = transformSearchable(searchable)
49
+ if (filterable) store.filterableFn = transformSearchable(filterable)
50
+ setContext(TREE_STORE_CONTEXT, store)
51
+ const { filteredRootItems, headerOverride } = store
52
+
53
+ let checkboxelement: HTMLElement
54
+ const headerelements: HTMLElement[] = []
55
+ let showMoreButton: HTMLButtonElement
56
+ const treeWidth = new Store<ElementSize>({})
57
+
58
+ // Need to keep track of which headers are shown or hidden and which is selected
59
+ let shownHeaders: TreeHeader<T>[] = headers
60
+ let hiddenHeaders: TreeHeader<T>[] = []
61
+ let selectedHeader: TreeHeader<T> | undefined = undefined
62
+ let selectedHeaderValue: string
63
+
64
+ function updateShownHeaders () {
56
65
  if (typeof responsiveHeaders === 'function') {
57
- shownHeaders = [];
58
- hiddenHeaders = [];
59
- const shown = responsiveHeaders($treeWidth.clientWidth ?? 1024);
60
- if (selectedHeader && !shown.includes(selectedHeader.id)) {
61
- shown[shown.length - 1] = selectedHeader.id;
62
- }
63
- for (const h of headers) {
64
- if (shown.includes(h.id)) {
65
- shownHeaders.push(h);
66
- }
67
- else {
68
- hiddenHeaders.push(h);
69
- }
70
- }
71
- selectedHeaderValue = shown[shown.length - 1];
72
- if (hiddenHeaders.length) {
73
- const hideable = headers.find(h => h.id === selectedHeaderValue);
74
- if (hideable)
75
- hiddenHeaders.push(hideable);
66
+ shownHeaders = []
67
+ hiddenHeaders = []
68
+ const shown = responsiveHeaders($treeWidth.clientWidth ?? 1024)
69
+ if (selectedHeader && !shown.includes(selectedHeader.id)) {
70
+ shown[shown.length - 1] = selectedHeader.id
71
+ }
72
+ for (const h of headers) {
73
+ if (shown.includes(h.id)) {
74
+ shownHeaders.push(h)
75
+ } else {
76
+ hiddenHeaders.push(h)
76
77
  }
78
+ }
79
+ selectedHeaderValue = shown[shown.length - 1]
80
+ if (hiddenHeaders.length) {
81
+ const hideable = headers.find(h => h.id === selectedHeaderValue)
82
+ if (hideable) hiddenHeaders.push(hideable)
83
+ }
77
84
  }
78
- }
79
- function calcHeaderSizes() {
80
- updateShownHeaders();
81
- const headerSizes = [];
82
- let totalFixed = checkboxelement?.offsetWidth ?? 0;
83
- if (hiddenHeaders.length)
84
- totalFixed += (showMoreButton?.offsetWidth ?? 0);
85
+ }
86
+
87
+ function calcHeaderSizes () {
88
+ updateShownHeaders()
89
+ const headerSizes: string[] = []
90
+ let totalFixed = checkboxelement?.offsetWidth ?? 0
91
+ if (hiddenHeaders.length) totalFixed += (showMoreButton?.offsetWidth ?? 0)
85
92
  for (let i = 0; i < shownHeaders.length; i++) {
86
- const header = shownHeaders[i];
87
- if (header.fixed || $headerOverride[header.id]) {
88
- headerSizes[i] = $headerOverride[header.id] ?? header.fixed;
89
- totalFixed += headerelements[i]?.offsetWidth ?? 0;
90
- }
93
+ const header = shownHeaders[i]
94
+ if (header.fixed || $headerOverride[header.id]) {
95
+ headerSizes[i] = $headerOverride[header.id] ?? header.fixed
96
+ totalFixed += headerelements[i]?.offsetWidth ?? 0
97
+ }
91
98
  }
92
- const remainingWidth = ($treeWidth.clientWidth ?? 1024) - totalFixed;
93
- const growHeaders = shownHeaders.filter((h, i) => !h.fixed && !$headerOverride[h.id]);
94
- const totalGrowShares = growHeaders.reduce((sum, h) => sum + (h.grow ?? 1), 0);
99
+ const remainingWidth = ($treeWidth.clientWidth ?? 1024) - totalFixed
100
+ const growHeaders = shownHeaders.filter((h, i) => !h.fixed && !$headerOverride[h.id])
101
+ const totalGrowShares = growHeaders.reduce((sum, h) => sum + (h.grow ?? 1), 0)
95
102
  for (let i = 0; i < shownHeaders.length; i++) {
96
- const header = shownHeaders[i];
97
- if (!header.fixed && !$headerOverride[header.id] && headerelements[i]?.offsetWidth) {
98
- headerSizes[i] = `${remainingWidth * (header.grow ?? 1) / totalGrowShares}px`;
99
- }
103
+ const header = shownHeaders[i]
104
+ if (!header.fixed && !$headerOverride[header.id] && headerelements[i]?.offsetWidth) {
105
+ headerSizes[i] = `${remainingWidth * (header.grow ?? 1) / totalGrowShares}px`
106
+ }
100
107
  }
101
- return headerSizes;
102
- }
103
- const headerSizes = derivedStore([headerOverride, treeWidth], calcHeaderSizes);
104
- $: store.singleSelect = singleSelect;
105
- function onDragEnd() {
106
- store.update(v => ({ ...v, dragging: false }));
107
- }
108
- let search = '';
109
- let searchTimer = 0;
110
- $: store.filter(filter);
111
- function onKeyUp(e) {
112
- if (!store.searchableFn)
113
- return;
108
+ return headerSizes
109
+ }
110
+ const headerSizes = derivedStore([headerOverride, treeWidth], calcHeaderSizes)
111
+
112
+ $: store.singleSelect = singleSelect
113
+
114
+ function onDragEnd () {
115
+ store.update(v => ({ ...v, dragging: false }))
116
+ }
117
+
118
+ let search = ''
119
+ let searchTimer = 0
120
+ $: store.filter(filter)
121
+ function onKeyUp (e) {
122
+ if (!store.searchableFn) return
114
123
  if (e.key.length === 1) {
115
- search += e.key.toLocaleLowerCase();
116
- const searchItems = $store.focused?.parent ? $store.focused.parent.children : $store.rootItems;
117
- const newFocus = searchItems?.find(itm => store.searchableFn(itm).some(str => str.toLocaleLowerCase().startsWith(search)));
118
- if (newFocus)
119
- store.focus(newFocus);
120
- clearTimeout(searchTimer);
121
- searchTimer = setTimeout(() => { search = ''; }, 4000);
124
+ search += e.key.toLocaleLowerCase()
125
+ const searchItems = $store.focused?.parent ? $store.focused.parent.children : $store.rootItems
126
+ const newFocus = searchItems?.find(itm => store.searchableFn!(itm).some(str => str.toLocaleLowerCase().startsWith(search)))
127
+ if (newFocus) store.focus(newFocus)
128
+ clearTimeout(searchTimer)
129
+ searchTimer = setTimeout(() => { search = '' }, 4000)
130
+ } else if (e.key === 'Backspace') {
131
+ search = search.substring(0, search.length - 1)
132
+ } else if (e.key === 'Escape') {
133
+ search = ''
122
134
  }
123
- else if (e.key === 'Backspace') {
124
- search = search.substring(0, search.length - 1);
125
- }
126
- else if (e.key === 'Escape') {
127
- search = '';
135
+ }
136
+
137
+ let dragtargetid: string | undefined
138
+ let rightoftargetid: string | undefined
139
+ let widthStart: number
140
+ let width2Start: number
141
+ let mouseStart: number
142
+ function headerDragStart (header: TreeHeader<T>, idx: number) {
143
+ return (e: MouseEvent | TouchEvent) => {
144
+ if (!enableResize) return
145
+ const dragtarget = headerelements[idx]
146
+ const rightoftarget = headerelements.find((e, i) => i > idx && e.isConnected)
147
+ if (!dragtarget?.isConnected || !rightoftarget) dragtargetid = undefined
148
+ else {
149
+ e.preventDefault()
150
+ dragtargetid = header.id
151
+ rightoftargetid = rightoftarget.getAttribute('id') ?? undefined
152
+ widthStart = dragtarget.clientWidth
153
+ width2Start = rightoftarget.clientWidth
154
+ mouseStart = 'touches' in e ? e.touches[0].screenX : e.screenX
155
+ }
128
156
  }
129
- }
130
- let dragtargetid;
131
- let rightoftargetid;
132
- let widthStart;
133
- let width2Start;
134
- let mouseStart;
135
- function headerDragStart(header, idx) {
136
- return (e) => {
137
- if (!enableResize)
138
- return;
139
- const dragtarget = headerelements[idx];
140
- const rightoftarget = headerelements.find((e, i) => i > idx && e.isConnected);
141
- if (!dragtarget?.isConnected || !rightoftarget)
142
- dragtargetid = undefined;
143
- else {
144
- e.preventDefault();
145
- dragtargetid = header.id;
146
- rightoftargetid = rightoftarget.getAttribute('id') ?? undefined;
147
- widthStart = dragtarget.clientWidth;
148
- width2Start = rightoftarget.clientWidth;
149
- mouseStart = 'touches' in e ? e.touches[0].screenX : e.screenX;
150
- }
151
- };
152
- }
153
- function headerDrag(e) {
154
- if ('touches' in e && e.touches?.length > 1)
155
- return;
157
+ }
158
+
159
+ function headerDrag (e: MouseEvent | TouchEvent) {
160
+ if ('touches' in e && e.touches?.length > 1) return
156
161
  if (dragtargetid && rightoftargetid) {
157
- const screenX = 'touches' in e ? e.touches[0].screenX : e.screenX;
158
- store.setHeaderOverride(dragtargetid, `${widthStart - (mouseStart - screenX)}px`);
159
- store.setHeaderOverride(rightoftargetid, `${width2Start + (mouseStart - screenX)}px`);
162
+ const screenX = 'touches' in e ? e.touches[0].screenX : e.screenX
163
+ store.setHeaderOverride(dragtargetid, `${widthStart - (mouseStart - screenX)}px`)
164
+ store.setHeaderOverride(rightoftargetid, `${width2Start + (mouseStart - screenX)}px`)
160
165
  }
161
- }
162
- function headerDragEnd() {
163
- dragtargetid = undefined;
164
- rightoftargetid = undefined;
165
- }
166
- function headerDragReset() {
167
- store.resetHeaderOverride();
168
- }
169
- let mounted = false;
170
- onMount(async () => {
171
- document.addEventListener('dragend', onDragEnd);
172
- headerSizes.set(calcHeaderSizes()); // seems to need a kick on first mount
173
- await new Promise(resolve => requestAnimationFrame(resolve));
166
+ }
167
+
168
+ function headerDragEnd () {
169
+ dragtargetid = undefined
170
+ rightoftargetid = undefined
171
+ }
172
+
173
+ function headerDragReset () {
174
+ store.resetHeaderOverride()
175
+ }
176
+
177
+ let mounted = false
178
+ onMount(async () => {
179
+ document.addEventListener('dragend', onDragEnd)
180
+ headerSizes.set(calcHeaderSizes()) // seems to need a kick on first mount
181
+ await new Promise(resolve => requestAnimationFrame(resolve))
174
182
  // need to wait long enough for headers to redraw before trying to mount the rows
175
- await new Promise(resolve => requestAnimationFrame(resolve));
176
- mounted = true;
177
- await store.refresh();
178
- });
179
- onDestroy(() => {
180
- if (typeof document !== 'undefined')
181
- document.removeEventListener('dragend', onDragEnd);
182
- });
183
- let hadFocus = false;
184
- beforeUpdate(() => {
185
- hadFocus = !!store.treeElement?.contains(document.activeElement);
186
- });
187
- afterUpdate(() => {
183
+ await new Promise(resolve => requestAnimationFrame(resolve))
184
+ mounted = true
185
+ await store.refresh()
186
+ })
187
+ onDestroy(() => {
188
+ if (typeof document !== 'undefined') document.removeEventListener('dragend', onDragEnd)
189
+ })
190
+ let hadFocus = false
191
+ beforeUpdate(() => {
192
+ hadFocus = !!store.treeElement?.contains(document.activeElement)
193
+ })
194
+ afterUpdate(() => {
188
195
  if ($store.focused?.id) {
189
- const el = document.getElementById(getHashId($store.focused.id));
190
- if (el && hadFocus) {
191
- if (el !== document.activeElement)
192
- el.focus();
193
- }
196
+ const el = document.getElementById(getHashId($store.focused.id))
197
+ if (el && hadFocus) {
198
+ if (el !== document.activeElement) el.focus()
199
+ }
194
200
  }
195
- });
196
- $: myRootItemIds = $store && $filteredRootItems;
197
- $: myRootItems = $store?.rootItems?.filter(r => myRootItemIds.has(r.id)) ?? [];
198
- async function selectHeader(selected) {
199
- selectedHeader = headers.find(h => h.id === selected.value);
200
- updateShownHeaders();
201
- store.resetHeaderOverride();
202
- const headersizes = shownHeaders.map(h => h.fixed ? h.fixed : '');
203
- headerSizes.set(headersizes);
204
- await tick();
205
- headerSizes.set(calcHeaderSizes());
206
- }
201
+ })
202
+ $: myRootItemIds = $store && $filteredRootItems
203
+ $: myRootItems = $store?.rootItems?.filter(r => myRootItemIds.has(r.id)) ?? []
204
+
205
+ async function selectHeader (selected: PopupMenuItem) {
206
+ selectedHeader = headers.find(h => h.id === selected.value)
207
+ updateShownHeaders()
208
+ store.resetHeaderOverride()
209
+ const headersizes = shownHeaders.map(h => h.fixed ? h.fixed : '')
210
+ headerSizes.set(headersizes)
211
+ await tick()
212
+ headerSizes.set(calcHeaderSizes())
213
+ }
207
214
  </script>
208
215
 
209
216
  <svelte:window on:mouseup={headerDragEnd} />
@@ -326,5 +333,4 @@ async function selectHeader(selected) {
326
333
  :global(div.hideable-container ul.hideable-headers li.selected-header::after) {
327
334
  display: none;
328
335
  }
329
-
330
336
  </style>
@@ -1,7 +1,7 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  import { TreeStore } from './treestore';
3
3
  import type { DragEligibleFn, CopyHandlerFn, DropEffectFn, FetchChildrenFn, MoveHandlerFn, TreeHeader, TreeItemFromDB, SearchableType } from './treestore';
4
- declare class __sveltets_Render<T extends TreeItemFromDB> {
4
+ declare class __sveltets_Render<T extends TreeItemFromDB = TreeItemFromDB> {
5
5
  props(): {
6
6
  headers: TreeHeader<T>[];
7
7
  searchable?: SearchableType<T>;
@@ -36,10 +36,10 @@ declare class __sveltets_Render<T extends TreeItemFromDB> {
36
36
  };
37
37
  slots(): {};
38
38
  }
39
- export type TreeProps<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['props']>;
40
- export type TreeEvents<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['events']>;
41
- export type TreeSlots<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['slots']>;
42
- export default class Tree<T extends TreeItemFromDB> extends SvelteComponentTyped<TreeProps<T>, TreeEvents<T>, TreeSlots<T>> {
39
+ export type TreeProps<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['props']>;
40
+ export type TreeEvents<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['events']>;
41
+ export type TreeSlots<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['slots']>;
42
+ export default class Tree<T extends TreeItemFromDB = TreeItemFromDB> extends SvelteComponentTyped<TreeProps<T>, TreeEvents<T>, TreeSlots<T>> {
43
43
  get itemType(): T & {};
44
44
  }
45
45
  export {};
@@ -1,9 +1,13 @@
1
- <script>import { get } from 'txstate-utils';
2
- import { Icon } from '..';
3
- export let header;
4
- export let item;
5
- $: icon = (typeof header.icon === 'function' ? header.icon(item) : header.icon);
6
- $: headerComponent = header.component;
1
+ <script lang="ts" generics="T extends TreeItemFromDB = TreeItemFromDB">
2
+ import type { IconifyIcon } from '@iconify/svelte'
3
+ import { get } from 'txstate-utils'
4
+ import { Icon } from '..'
5
+ import type { TreeHeader, TreeItemFromDB, TypedTreeItem } from './treestore'
6
+
7
+ export let header: TreeHeader<T>
8
+ export let item: TypedTreeItem<T>
9
+ $: icon = (typeof header.icon === 'function' ? header.icon(item) : header.icon) as { icon: IconifyIcon, label: string } | undefined
10
+ $: headerComponent = header.component as any
7
11
  </script>
8
12
 
9
13
  {#if icon}
@@ -1,6 +1,6 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  import type { TreeHeader, TreeItemFromDB, TypedTreeItem } from './treestore';
3
- declare class __sveltets_Render<T extends TreeItemFromDB> {
3
+ declare class __sveltets_Render<T extends TreeItemFromDB = TreeItemFromDB> {
4
4
  props(): {
5
5
  header: TreeHeader<T>;
6
6
  item: TypedTreeItem<T>;
@@ -10,9 +10,9 @@ declare class __sveltets_Render<T extends TreeItemFromDB> {
10
10
  };
11
11
  slots(): {};
12
12
  }
13
- export type TreeCellProps<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['props']>;
14
- export type TreeCellEvents<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['events']>;
15
- export type TreeCellSlots<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['slots']>;
16
- export default class TreeCell<T extends TreeItemFromDB> extends SvelteComponentTyped<TreeCellProps<T>, TreeCellEvents<T>, TreeCellSlots<T>> {
13
+ export type TreeCellProps<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['props']>;
14
+ export type TreeCellEvents<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['events']>;
15
+ export type TreeCellSlots<T extends TreeItemFromDB = TreeItemFromDB> = ReturnType<__sveltets_Render<T>['slots']>;
16
+ export default class TreeCell<T extends TreeItemFromDB = TreeItemFromDB> extends SvelteComponentTyped<TreeCellProps<T>, TreeCellEvents<T>, TreeCellSlots<T>> {
17
17
  }
18
18
  export {};