@dosgato/dialog 0.0.19 → 0.0.21

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 (95) hide show
  1. package/Button.svelte +77 -0
  2. package/Button.svelte.d.ts +30 -0
  3. package/ButtonGroup.svelte.d.ts +3 -3
  4. package/Checkbox.svelte +2 -1
  5. package/Checkbox.svelte.d.ts +4 -3
  6. package/Container.svelte +18 -19
  7. package/Container.svelte.d.ts +5 -3
  8. package/Dialog.svelte +155 -0
  9. package/Dialog.svelte.d.ts +50 -0
  10. package/FieldAutocomplete.svelte +4 -7
  11. package/FieldAutocomplete.svelte.d.ts +4 -4
  12. package/FieldCheckbox.svelte +3 -2
  13. package/FieldCheckbox.svelte.d.ts +5 -4
  14. package/FieldChoices.svelte +3 -2
  15. package/FieldChoices.svelte.d.ts +4 -3
  16. package/FieldChooserLink.svelte +17 -13
  17. package/FieldChooserLink.svelte.d.ts +4 -5
  18. package/FieldDate.svelte +3 -2
  19. package/FieldDate.svelte.d.ts +4 -3
  20. package/FieldDateTime.svelte +3 -2
  21. package/FieldDateTime.svelte.d.ts +4 -3
  22. package/FieldDualListbox.svelte.d.ts +3 -3
  23. package/FieldHidden.svelte.d.ts +3 -3
  24. package/FieldIdentifier.svelte.d.ts +3 -3
  25. package/FieldMultiple.svelte +14 -7
  26. package/FieldMultiple.svelte.d.ts +6 -3
  27. package/FieldMultiselect.svelte +29 -22
  28. package/FieldMultiselect.svelte.d.ts +3 -3
  29. package/FieldNumber.svelte +3 -2
  30. package/FieldNumber.svelte.d.ts +4 -3
  31. package/FieldRadio.svelte +9 -4
  32. package/FieldRadio.svelte.d.ts +9 -3
  33. package/FieldSelect.svelte +9 -3
  34. package/FieldSelect.svelte.d.ts +9 -3
  35. package/FieldStandard.svelte +8 -3
  36. package/FieldStandard.svelte.d.ts +9 -3
  37. package/FieldText.svelte +3 -2
  38. package/FieldText.svelte.d.ts +4 -3
  39. package/FieldTextArea.svelte +5 -3
  40. package/FieldTextArea.svelte.d.ts +4 -3
  41. package/FileIcon.svelte.d.ts +3 -3
  42. package/Form.svelte +3 -3
  43. package/Form.svelte.d.ts +3 -3
  44. package/FormDialog.svelte +34 -0
  45. package/FormDialog.svelte.d.ts +38 -0
  46. package/Icon.svelte.d.ts +3 -3
  47. package/InlineMessage.svelte.d.ts +3 -3
  48. package/InlineMessages.svelte.d.ts +3 -3
  49. package/Input.svelte +4 -1
  50. package/Input.svelte.d.ts +4 -3
  51. package/Listbox.svelte.d.ts +3 -3
  52. package/Radio.svelte +5 -2
  53. package/Radio.svelte.d.ts +4 -3
  54. package/Tab.svelte +3 -2
  55. package/Tab.svelte.d.ts +3 -3
  56. package/TabStore.d.ts +11 -1
  57. package/TabStore.js +30 -3
  58. package/Tabs.svelte +66 -18
  59. package/Tabs.svelte.d.ts +5 -7
  60. package/chooser/Chooser.svelte +76 -99
  61. package/chooser/Chooser.svelte.d.ts +5 -5
  62. package/chooser/ChooserAPI.d.ts +10 -3
  63. package/chooser/ChooserStore.d.ts +15 -33
  64. package/chooser/ChooserStore.js +32 -149
  65. package/chooser/Details.svelte.d.ts +6 -5
  66. package/chooser/Thumbnail.svelte +9 -2
  67. package/chooser/Thumbnail.svelte.d.ts +6 -5
  68. package/colorpicker/FieldColorPicker.svelte +78 -24
  69. package/colorpicker/FieldColorPicker.svelte.d.ts +5 -6
  70. package/fileIcons.d.ts +2 -1
  71. package/helpers.d.ts +1 -0
  72. package/helpers.js +5 -0
  73. package/iconpicker/FieldIconPicker.svelte +4 -2
  74. package/iconpicker/FieldIconPicker.svelte.d.ts +4 -3
  75. package/index.d.ts +7 -0
  76. package/index.js +7 -0
  77. package/package.json +20 -13
  78. package/tree/LoadIcon.svelte +24 -0
  79. package/tree/LoadIcon.svelte.d.ts +23 -0
  80. package/tree/Tree.svelte +203 -0
  81. package/tree/Tree.svelte.d.ts +28 -0
  82. package/tree/TreeCell.svelte +18 -0
  83. package/tree/TreeCell.svelte.d.ts +18 -0
  84. package/tree/TreeNode.svelte +418 -0
  85. package/tree/TreeNode.svelte.d.ts +30 -0
  86. package/tree/index.d.ts +3 -0
  87. package/tree/index.js +3 -0
  88. package/tree/treestore.d.ts +117 -0
  89. package/tree/treestore.js +336 -0
  90. package/chooser/Asset.svelte +0 -83
  91. package/chooser/Asset.svelte.d.ts +0 -25
  92. package/chooser/AssetFolder.svelte +0 -127
  93. package/chooser/AssetFolder.svelte.d.ts +0 -25
  94. package/chooser/Page.svelte +0 -121
  95. package/chooser/Page.svelte.d.ts +0 -25
@@ -0,0 +1,28 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import { TreeStore } from './treestore';
3
+ import type { DragEligibleFn, CopyHandlerFn, DropEffectFn, FetchChildrenFn, MoveHandlerFn, TreeHeader, TreeItemFromDB } from './treestore';
4
+ declare class __sveltets_Render<T extends TreeItemFromDB> {
5
+ props(): {
6
+ headers: TreeHeader<T>[];
7
+ nodeClass?: (itm: T) => string;
8
+ singleSelect?: boolean;
9
+ enableResize?: boolean;
10
+ fetchChildren?: FetchChildrenFn<T>;
11
+ dragEligible?: DragEligibleFn<T>;
12
+ moveHandler?: MoveHandlerFn<T>;
13
+ copyHandler?: CopyHandlerFn<T>;
14
+ dropEffect?: DropEffectFn<T>;
15
+ store?: TreeStore<T>;
16
+ };
17
+ events(): {
18
+ choose: CustomEvent<T>;
19
+ deselect: CustomEvent<T>;
20
+ };
21
+ slots(): {};
22
+ }
23
+ export type TreeProps<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['props']>;
24
+ export type TreeEvents<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['events']>;
25
+ export type TreeSlots<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['slots']>;
26
+ export default class Tree<T extends TreeItemFromDB> extends SvelteComponentTyped<TreeProps<T>, TreeEvents<T>, TreeSlots<T>> {
27
+ }
28
+ export {};
@@ -0,0 +1,18 @@
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;
7
+ </script>
8
+
9
+ {#if header.icon}
10
+ <span class="icon"><Icon {icon} inline width="1.5em" /></span>
11
+ {/if}
12
+ {#if header.component}
13
+ <svelte:component this={headerComponent} {item} {header} />
14
+ {:else if header.render}
15
+ {@html header.render(item)}
16
+ {:else if header.get}
17
+ {#if get(item, header.get)}{get(item, header.get)}{:else}&nbsp;{/if}
18
+ {/if}
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { TreeHeader, TreeItemFromDB, TypedTreeItem } from './treestore';
3
+ declare class __sveltets_Render<T extends TreeItemFromDB> {
4
+ props(): {
5
+ header: TreeHeader<T>;
6
+ item: TypedTreeItem<T>;
7
+ };
8
+ events(): {} & {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots(): {};
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>> {
17
+ }
18
+ export {};
@@ -0,0 +1,418 @@
1
+ <script>import checkboxOutline from '@iconify-icons/mdi/checkbox-outline';
2
+ import checkboxBlankOutline from '@iconify-icons/mdi/checkbox-blank-outline';
3
+ import menuDown from '@iconify-icons/mdi/menu-down';
4
+ import menuRight from '@iconify-icons/mdi/menu-right';
5
+ import { modifierKey, ScreenReaderOnly } from '@txstate-mws/svelte-components';
6
+ import { createEventDispatcher, getContext } from 'svelte';
7
+ import { hashid, isNotBlank, toArray } from 'txstate-utils';
8
+ import { Icon } from '..';
9
+ import { TREE_STORE_CONTEXT } from './treestore';
10
+ import LoadIcon from './LoadIcon.svelte';
11
+ import TreeCell from './TreeCell.svelte';
12
+ export let headers;
13
+ export let headerSizes;
14
+ export let nodeClass = undefined;
15
+ export let item;
16
+ export let posinset;
17
+ export let setsize;
18
+ export let level;
19
+ export let next;
20
+ export let prev;
21
+ export let parent = undefined;
22
+ const store = getContext(TREE_STORE_CONTEXT);
23
+ const { dragging, draggable, selectedUndraggable, selected, focused, copied, headerOverride } = store;
24
+ const dispatch = createEventDispatcher();
25
+ let nodeelement;
26
+ let userWantsCopy = false;
27
+ $: isSelected = $selected.has(item.id);
28
+ $: showChildren = !!item.open && !!item.children?.length;
29
+ $: hashedId = hashid(item.id);
30
+ $: isDraggable = $draggable && ((isSelected && !$selectedUndraggable) || store.dragEligible([item], true) || store.dragEligible([item], false));
31
+ $: dropZone = $dragging && store.dropEffect(item, false, userWantsCopy) !== 'none';
32
+ $: dropDisabled = $dragging && !dropZone;
33
+ $: dropAbove = $dragging && store.dropEffect(item, true, userWantsCopy) !== 'none';
34
+ $: inClipboard = $copied.has(item.id);
35
+ function onKeyDown(e) {
36
+ if (e.ctrlKey || e.metaKey) {
37
+ if (e.key === 'x') {
38
+ store.cut();
39
+ }
40
+ else if (e.key === 'c') {
41
+ store.copy();
42
+ }
43
+ else if (e.key === 'v') {
44
+ store.paste();
45
+ }
46
+ }
47
+ else if (e.key === 'Escape') {
48
+ store.cancelCopy();
49
+ }
50
+ if (modifierKey(e) && !['Enter', ' '].includes(e.key))
51
+ return;
52
+ if (['Enter', ' '].includes(e.key)) {
53
+ e.preventDefault();
54
+ e.stopPropagation();
55
+ if ($store.selected && $store.selected.size === 1 && $store.selected.has(item.id))
56
+ dispatch('choose', item);
57
+ else {
58
+ if (e.metaKey || e.altKey) {
59
+ store.select(item, { clear: false, toggle: true });
60
+ }
61
+ else if (e.shiftKey) {
62
+ shiftClick();
63
+ }
64
+ else {
65
+ store.select(item, { clear: true });
66
+ }
67
+ }
68
+ }
69
+ else if (e.key === 'Escape') {
70
+ store.deselect();
71
+ }
72
+ else if (e.key === 'ArrowRight') {
73
+ e.preventDefault();
74
+ e.stopPropagation();
75
+ if (item.open && item.children?.length) {
76
+ const child = item.children[0];
77
+ store.focus(child);
78
+ }
79
+ else {
80
+ store.open(item);
81
+ }
82
+ }
83
+ else if (e.key === 'ArrowLeft') {
84
+ e.preventDefault();
85
+ e.stopPropagation();
86
+ if (item.open) {
87
+ store.close(item);
88
+ }
89
+ else if (parent) {
90
+ store.focus(parent);
91
+ }
92
+ }
93
+ else if (e.key === 'ArrowDown') {
94
+ e.preventDefault();
95
+ e.stopPropagation();
96
+ const mynext = item.open && item.children?.length ? item.children[0] : next;
97
+ if (mynext) {
98
+ store.focus(mynext);
99
+ }
100
+ }
101
+ else if (e.key === 'ArrowUp') {
102
+ e.preventDefault();
103
+ e.stopPropagation();
104
+ const anyprev = prev;
105
+ const myprev = anyprev?.open && anyprev.children?.length && (!parent || parent.children?.some(c => c.id === anyprev.id)) ? anyprev.children[anyprev.children.length - 1] : prev;
106
+ if (myprev) {
107
+ store.focus(myprev);
108
+ }
109
+ }
110
+ else if (e.key === '*') {
111
+ e.preventDefault();
112
+ e.stopPropagation();
113
+ const toOpen = (parent ? parent.children : $store.rootItems) ?? [];
114
+ for (const child of toOpen) {
115
+ store.open(child).catch(console.error);
116
+ }
117
+ }
118
+ }
119
+ function shiftClick() {
120
+ const treenodes = Array.from(store.treeElement?.querySelectorAll('div[role="treeitem"]') ?? []);
121
+ const selectedNodes = treenodes.filter(n => n.matches('.selected'));
122
+ const firstSelected = selectedNodes[0];
123
+ if (!firstSelected || (selectedNodes.length === 1 && firstSelected === nodeelement)) {
124
+ return store.select(item, { toggle: true });
125
+ }
126
+ const lastSelected = selectedNodes[selectedNodes.length - 1];
127
+ const selectingdownward = firstSelected.compareDocumentPosition(nodeelement) === Node.DOCUMENT_POSITION_FOLLOWING;
128
+ let selecting = false;
129
+ store.deselect(false);
130
+ for (const node of treenodes) {
131
+ if (selectingdownward && node === firstSelected)
132
+ selecting = true;
133
+ if (!selectingdownward && node === nodeelement)
134
+ selecting = true;
135
+ if (selecting)
136
+ store.selectById(node.getAttribute('data-id'), { notify: false, toggle: false });
137
+ if (selectingdownward && node === nodeelement)
138
+ selecting = false;
139
+ if (!selectingdownward && node === lastSelected)
140
+ selecting = false;
141
+ }
142
+ store.trigger();
143
+ }
144
+ function onClick(e) {
145
+ if (e.button > 0)
146
+ return;
147
+ e.preventDefault();
148
+ e.stopPropagation();
149
+ if (e.metaKey || e.altKey || e.ctrlKey) {
150
+ store.select(item, { clear: false, toggle: true });
151
+ }
152
+ else if (e.shiftKey) {
153
+ shiftClick();
154
+ }
155
+ else {
156
+ const wasFocused = $store.focused?.id === item.id;
157
+ store.select(item, { clear: true, toggle: false });
158
+ if (item.open && wasFocused && !item.loading)
159
+ store.close(item);
160
+ else if (!item.open)
161
+ store.open(item);
162
+ }
163
+ }
164
+ function onCheckClick(e) {
165
+ if (e.button > 0)
166
+ return;
167
+ e.preventDefault();
168
+ e.stopPropagation();
169
+ if (e.shiftKey) {
170
+ shiftClick();
171
+ }
172
+ else {
173
+ console.log('onCheckClick', isSelected);
174
+ if (isSelected)
175
+ dispatch('deselect', item);
176
+ store.select(item, { clear: false, toggle: true });
177
+ }
178
+ }
179
+ function onDblClick(e) {
180
+ if (modifierKey(e) || e.button > 0)
181
+ return;
182
+ e.preventDefault();
183
+ e.stopPropagation();
184
+ if ($store.selected.size <= 1)
185
+ dispatch('choose', item);
186
+ }
187
+ function onDragStart(e) {
188
+ userWantsCopy = e.dataTransfer.dropEffect === 'copy';
189
+ e.dataTransfer.effectAllowed = 'copyMove';
190
+ e.dataTransfer.setData('text/plain', item.id);
191
+ store.dragStart(item);
192
+ }
193
+ function onDragOver(e) {
194
+ userWantsCopy = e.dataTransfer.dropEffect === 'copy';
195
+ if (dropZone) {
196
+ e.preventDefault();
197
+ e.dataTransfer.dropEffect = store.dropEffect(item, false, userWantsCopy);
198
+ }
199
+ return !dropZone;
200
+ }
201
+ function onDragOverAbove(e) {
202
+ userWantsCopy = e.dataTransfer.dropEffect === 'copy';
203
+ if (dropAbove) {
204
+ e.preventDefault();
205
+ e.dataTransfer.dropEffect = store.dropEffect(item, true, userWantsCopy);
206
+ }
207
+ return !dropAbove;
208
+ }
209
+ let dragOver = 0;
210
+ let dragOverAbove = 0;
211
+ function onDrop(e) {
212
+ e.preventDefault();
213
+ dragOver = 0;
214
+ return store.drop(item, false, e.dataTransfer.dropEffect === 'copy');
215
+ }
216
+ function onDropAbove(e) {
217
+ e.preventDefault();
218
+ dragOverAbove = 0;
219
+ return store.drop(item, true, e.dataTransfer.dropEffect === 'copy');
220
+ }
221
+ function onDragEnter(e) {
222
+ if (!dropZone)
223
+ dragOver = 0;
224
+ else
225
+ dragOver++;
226
+ onDragOver(e);
227
+ }
228
+ function onDragEnterAbove(e) {
229
+ if (!dropAbove)
230
+ dragOverAbove = 0;
231
+ else
232
+ dragOverAbove++;
233
+ onDragOverAbove(e);
234
+ }
235
+ function onDragLeave(e) {
236
+ if (!dropZone)
237
+ dragOver = 0;
238
+ else
239
+ dragOver--;
240
+ }
241
+ function onDragLeaveAbove(e) {
242
+ if (!dropAbove)
243
+ dragOverAbove = 0;
244
+ else
245
+ dragOverAbove--;
246
+ }
247
+ $: if ($dragging) {
248
+ dragOver = 0;
249
+ dragOverAbove = 0;
250
+ }
251
+ </script>
252
+ <li>
253
+ {#if dropAbove}
254
+ <div class="drop-above"
255
+ class:dragOverAbove
256
+ on:dragenter={onDragEnterAbove}
257
+ on:dragleave={onDragLeaveAbove}
258
+ on:dragover={onDragOverAbove}
259
+ on:drop={onDropAbove}
260
+ style:left="{level + 1.3}em"
261
+ ></div>
262
+ {/if}
263
+ <div
264
+ id={hashedId}
265
+ bind:this={nodeelement}
266
+ class={['tree-node', nodeClass?.(item)].filter(isNotBlank).join(' ')}
267
+ class:selected={isSelected}
268
+ class:dragOver
269
+ class:dropDisabled
270
+ class:inClipboard
271
+ role="treeitem"
272
+ data-id={item.id}
273
+ draggable={isDraggable}
274
+ tabindex={$focused && $focused.id === item.id ? 0 : -1}
275
+ aria-level={level}
276
+ aria-posinset={posinset}
277
+ aria-setsize={setsize}
278
+ aria-selected={isSelected}
279
+ aria-expanded={item.hasChildren ? item.open && !!item.children && !!item.children.length : undefined}
280
+ aria-busy={item.loading}
281
+ on:keydown={onKeyDown}
282
+ on:click={onClick}
283
+ on:dragstart={onDragStart}
284
+ on:dragover={onDragOver}
285
+ on:dragenter={onDragEnter}
286
+ on:dragleave={onDragLeave}
287
+ on:drop={onDrop}
288
+ on:mousedown={e => { if (e.shiftKey) e.preventDefault() }}
289
+ on:dblclick={onDblClick}
290
+ >
291
+ <!-- keyboard users have modifier keys, they don't ever focus the checkbox -->
292
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
293
+ <div class="checkbox" on:click={onCheckClick}>
294
+ <Icon icon={isSelected ? checkboxOutline : checkboxBlankOutline } width="1.15em" inline />
295
+ </div>
296
+ {#each headers as header, i (header.id)}
297
+ <div
298
+ class={(header.class ? toArray(header.class(item)) : []).concat([header.id]).join(' ')}
299
+ style:width={$headerSizes?.[i] ?? '1px'}
300
+ style:padding-left={i === 0 ? `calc(min(${(level - 1) * 1.6}em, ${(level - 1) * 2.7}vw) + 1.4em)` : undefined}
301
+ class:left={i === 0}
302
+ >
303
+ {#if i === 0 && item.hasChildren}
304
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
305
+ <span class="arrow" on:click={onClick}><Icon icon={item.open ? menuDown : menuRight} width="1.5em" inline /></span>
306
+ {/if}
307
+ <TreeCell {header} {item} />
308
+ {#if i === 0 && item.loading}
309
+ <LoadIcon />
310
+ {/if}
311
+ </div>
312
+ {/each}
313
+ <ScreenReaderOnly>
314
+ command enter select multiple, shift enter select all from last selection
315
+ </ScreenReaderOnly>
316
+ </div>
317
+ {#if showChildren && item.children}
318
+ <ul role="group">
319
+ {#each item.children as child, i (child.id)}
320
+ <svelte:self
321
+ item={child}
322
+ {headers}
323
+ {headerSizes}
324
+ {nodeClass}
325
+ posinset={i + 1}
326
+ setsize={item.children.length}
327
+ level={child.level}
328
+ prev={i === 0 ? item : item.children[i - 1]}
329
+ next={i === item.children.length - 1 ? next : item.children[i + 1]}
330
+ parent={item}
331
+ on:choose
332
+ on:deselect
333
+ />
334
+ {/each}
335
+ </ul>
336
+ {/if}
337
+ </li>
338
+
339
+ <style>
340
+ .tree-node {
341
+ cursor: pointer;
342
+ display: flex;
343
+ align-items: center;
344
+ border-bottom: var(--tree-border, 1px dashed #aaaaaa);
345
+ width: 100%;
346
+ overflow: hidden;
347
+ }
348
+ :global(.resizing) .tree-node {
349
+ cursor: col-resize;
350
+ }
351
+ .tree-node .checkbox {
352
+ min-width: 1.5em;
353
+ max-width: 1.5em;
354
+ }
355
+ .tree-node > div {
356
+ padding: 0.6em 0.3em;
357
+ }
358
+ .tree-node > div.left {
359
+ display: flex;
360
+ align-items: center;
361
+ }
362
+ .tree-node > div.left .arrow {
363
+ margin-left: -1.6em;
364
+ margin-right: 0.1em;
365
+ }
366
+ .tree-node > div.left :global(.icon) {
367
+ margin-right: 0.4em;
368
+ }
369
+ .tree-node.selected {
370
+ background-color: var(--tree-selected, #f1f1f1);
371
+ color: var(--tree-selected-text, inherit);
372
+ }
373
+ .tree-node.dragOver {
374
+ background-color: var(--tree-droppable, #555555);
375
+ color: var(--tree-droppable-text, white);
376
+ }
377
+ .tree-node.dropDisabled {
378
+ opacity: 0.6;
379
+ }
380
+ .drop-above {
381
+ position: absolute;
382
+ top: -3px;
383
+ left: 0;
384
+ width: 100%;
385
+ height: 6px;
386
+ }
387
+ .drop-above.dragOverAbove {
388
+ background-color: var(--tree-droppable, #555555);
389
+ }
390
+ li {
391
+ position: relative;
392
+ }
393
+ ul {
394
+ padding: 0;
395
+ margin: 0;
396
+ list-style: none;
397
+ }
398
+ .inClipboard {
399
+ background-image: linear-gradient(90deg, #999999 50%, transparent 50%), linear-gradient(90deg, #999999 50%, transparent 50%), linear-gradient(0deg, #999999 50%, transparent 50%), linear-gradient(0deg, #999999 50%, transparent 50%);
400
+ background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
401
+ background-size: 15px 1px, 15px 1px, 1px 15px, 1px 15px;
402
+ background-position: left top, right bottom, left bottom, right top;
403
+ animation: border-dance 1s infinite linear;
404
+ }
405
+ @keyframes border-dance {
406
+ 0% {
407
+ background-position: left top, right bottom, left bottom, right top;
408
+ }
409
+ 100% {
410
+ background-position: left 15px top, right 15px bottom , left bottom 15px , right top 15px;
411
+ }
412
+ }
413
+ @media (prefers-reduced-motion) {
414
+ .inClipboard {
415
+ animation: none;
416
+ }
417
+ }
418
+ </style>
@@ -0,0 +1,30 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { Store } from '@txstate-mws/svelte-store';
3
+ import { type TypedTreeItem, type TreeItemFromDB, type TreeHeader } from './treestore';
4
+ declare class __sveltets_Render<T extends TreeItemFromDB> {
5
+ props(): {
6
+ headers: TreeHeader<T>[];
7
+ headerSizes: Store<string[]>;
8
+ nodeClass?: (itm: T) => string;
9
+ item: TypedTreeItem<T>;
10
+ posinset: number;
11
+ setsize: number;
12
+ level: number;
13
+ next: TypedTreeItem<T>;
14
+ prev: TypedTreeItem<T>;
15
+ parent?: TypedTreeItem<T>;
16
+ };
17
+ events(): {
18
+ choose: CustomEvent<any>;
19
+ deselect: CustomEvent<any>;
20
+ } & {
21
+ [evt: string]: CustomEvent<any>;
22
+ };
23
+ slots(): {};
24
+ }
25
+ export type TreeNodeProps<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['props']>;
26
+ export type TreeNodeEvents<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['events']>;
27
+ export type TreeNodeSlots<T extends TreeItemFromDB> = ReturnType<__sveltets_Render<T>['slots']>;
28
+ export default class TreeNode<T extends TreeItemFromDB> extends SvelteComponentTyped<TreeNodeProps<T>, TreeNodeEvents<T>, TreeNodeSlots<T>> {
29
+ }
30
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from './treestore.js';
2
+ export { default as Tree } from './Tree.svelte';
3
+ export { default as LoadIcon } from './LoadIcon.svelte';
package/tree/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './treestore.js';
2
+ export { default as Tree } from './Tree.svelte';
3
+ export { default as LoadIcon } from './LoadIcon.svelte';
@@ -0,0 +1,117 @@
1
+ import { ActiveStore } from '@txstate-mws/svelte-store';
2
+ import type { IconifyIcon } from '@iconify/svelte';
3
+ import type { SvelteComponent } from 'svelte';
4
+ export declare const TREE_STORE_CONTEXT: {};
5
+ export interface TreeItemFromDB {
6
+ id: string;
7
+ hasChildren?: boolean;
8
+ }
9
+ export interface TreeItem<T extends TreeItemFromDB> extends TreeItemFromDB {
10
+ level: number;
11
+ parent?: TypedTreeItem<T>;
12
+ loading?: boolean;
13
+ open?: boolean;
14
+ children?: TypedTreeItem<T>[];
15
+ }
16
+ export type TypedTreeItem<T extends TreeItemFromDB> = TreeItem<T> & T;
17
+ export interface ITreeStore<T extends TreeItemFromDB> {
18
+ loading?: boolean;
19
+ rootItems?: TypedTreeItem<T>[];
20
+ itemsById: Record<string, TypedTreeItem<T> | undefined>;
21
+ focused?: TypedTreeItem<T>;
22
+ selected: Map<string, TypedTreeItem<T>>;
23
+ selectedItems: TypedTreeItem<T>[];
24
+ copied: Map<string, TypedTreeItem<T>>;
25
+ cut?: boolean;
26
+ draggable: boolean;
27
+ selectedUndraggable?: boolean;
28
+ dragging: boolean;
29
+ headerWidthOverrides: Record<string, string>;
30
+ }
31
+ export type FetchChildrenFn<T extends TreeItemFromDB> = (item?: TypedTreeItem<T>) => Promise<T[]>;
32
+ export type DragEligibleFn<T extends TreeItemFromDB> = (selectedItems: TypedTreeItem<T>[], userWantsCopy: boolean) => boolean;
33
+ export type DropEffectFn<T extends TreeItemFromDB> = (selectedItems: TypedTreeItem<T>[], dropTarget: TypedTreeItem<T>, above: boolean, userWantsCopy: boolean) => 'move' | 'copy' | 'none';
34
+ export type MoveHandlerFn<T extends TreeItemFromDB> = (selectedItems: TypedTreeItem<T>[], dropTarget: TypedTreeItem<T>, above: boolean) => boolean | Promise<boolean>;
35
+ export type CopyHandlerFn<T extends TreeItemFromDB> = (selectedItems: TypedTreeItem<T>[], dropTarget: TypedTreeItem<T>, above: boolean, userWantsRecursive: boolean | undefined) => boolean | Promise<boolean>;
36
+ export interface TreeHeader<T extends TreeItemFromDB> {
37
+ id: string;
38
+ label: string;
39
+ fixed?: string;
40
+ grow?: number;
41
+ icon?: IconifyIcon | ((item: TypedTreeItem<T>) => IconifyIcon | undefined);
42
+ get?: string;
43
+ render?: (item: TypedTreeItem<T>) => string;
44
+ component?: SvelteComponent;
45
+ class?: (item: TypedTreeItem<T>) => string | string[];
46
+ }
47
+ export declare class TreeStore<T extends TreeItemFromDB> extends ActiveStore<ITreeStore<T>> {
48
+ #private;
49
+ fetchChildren: FetchChildrenFn<T>;
50
+ treeElement?: HTMLElement;
51
+ rootItems: import("@txstate-mws/svelte-store").DerivedStore<TypedTreeItem<T>[], ITreeStore<T>>;
52
+ draggable: import("@txstate-mws/svelte-store").DerivedStore<boolean, ITreeStore<T>>;
53
+ dragging: import("@txstate-mws/svelte-store").DerivedStore<boolean, ITreeStore<T>>;
54
+ selectedUndraggable: import("@txstate-mws/svelte-store").DerivedStore<boolean, ITreeStore<T>>;
55
+ selected: import("@txstate-mws/svelte-store").DerivedStore<Map<string, TypedTreeItem<T>>, ITreeStore<T>>;
56
+ focused: import("@txstate-mws/svelte-store").DerivedStore<TypedTreeItem<T>, ITreeStore<T>>;
57
+ copied: import("@txstate-mws/svelte-store").DerivedStore<Map<string, TypedTreeItem<T>>, ITreeStore<T>>;
58
+ headerOverride: import("@txstate-mws/svelte-store").DerivedStore<Record<string, string>, ITreeStore<T>>;
59
+ moveHandler?: MoveHandlerFn<T>;
60
+ copyHandler?: CopyHandlerFn<T>;
61
+ dragEligibleHandler?: DragEligibleFn<T>;
62
+ dropEffectHandler?: DropEffectFn<T>;
63
+ singleSelect?: boolean;
64
+ private refreshPromise?;
65
+ constructor(fetchChildren: FetchChildrenFn<T>, { moveHandler, copyHandler, dragEligible, dropEffect, singleSelect }?: {
66
+ moveHandler?: MoveHandlerFn<T>;
67
+ copyHandler?: CopyHandlerFn<T>;
68
+ dragEligible?: DragEligibleFn<T>;
69
+ dropEffect?: DropEffectFn<T>;
70
+ singleSelect?: boolean;
71
+ });
72
+ visit(item: TypedTreeItem<T>, cb: (item: TypedTreeItem<T>) => Promise<void>): Promise<void>;
73
+ visitSync(item: TypedTreeItem<T>, cb: (item: TypedTreeItem<T>) => void): void;
74
+ addLookup(items: TypedTreeItem<T>[]): void;
75
+ cleanSelected(): void;
76
+ determineDraggable(): void;
77
+ trigger(): void;
78
+ fetch(item?: TypedTreeItem<T>): Promise<TypedTreeItem<T>[]>;
79
+ refresh(item?: TypedTreeItem<T>, skipNotify?: boolean): Promise<void>;
80
+ focus(item: TypedTreeItem<T> | undefined, notify?: boolean): void;
81
+ select(item: TypedTreeItem<T>, { clear, notify, toggle }: {
82
+ clear?: boolean;
83
+ notify?: boolean;
84
+ toggle?: boolean;
85
+ }): void;
86
+ selectById(id: string, { clear, notify, toggle }: {
87
+ clear?: boolean;
88
+ notify?: boolean;
89
+ toggle?: boolean;
90
+ }): void;
91
+ deselect(notify?: boolean): void;
92
+ isSelected(item: TypedTreeItem<T>): boolean;
93
+ open(item: TypedTreeItem<T>, notify?: boolean): Promise<void>;
94
+ openAndRefresh(item: TypedTreeItem<T>, notify?: boolean): Promise<void>;
95
+ close(item: TypedTreeItem<T>): void;
96
+ toggle(item: TypedTreeItem<T>): Promise<void>;
97
+ viewUnder(item?: TypedTreeItem<T>): Promise<void>;
98
+ dragStart(item: TypedTreeItem<T>): void;
99
+ protected _drop(item: TypedTreeItem<T>, droppedItems: Map<string, TypedTreeItem<T>>, above: boolean, userWantsCopy: boolean, userWantsRecursive: boolean | undefined): Promise<boolean>;
100
+ drop(item: TypedTreeItem<T>, above: boolean, userWantsCopy: any): Promise<boolean>;
101
+ collectAncestors(item: TypedTreeItem<T>): TypedTreeItem<T>[];
102
+ root(item: TypedTreeItem<T>): TypedTreeItem<T>;
103
+ findCommonParent(items: TypedTreeItem<T>[]): TypedTreeItem<T>;
104
+ dragEligible(selectedItems: TypedTreeItem<T>[], userWantsCopy: boolean): boolean;
105
+ protected _dropEffect(item: TypedTreeItem<T>, droppedItems: Map<string, TypedTreeItem<T>>, above: boolean, userWantsCopy: boolean): "none" | "copy" | "move";
106
+ dropEffect(item: TypedTreeItem<T>, above: boolean, userWantsCopy: boolean): "none" | "copy" | "move";
107
+ cut(): void;
108
+ copy(): void;
109
+ cutEligible(): boolean;
110
+ copyEligible(): boolean;
111
+ cancelCopy(): void;
112
+ pasteEligible(above?: boolean): boolean;
113
+ pasteEffect(above?: boolean): "none" | "copy" | "move";
114
+ paste(above?: boolean, userWantsRecursive?: boolean): Promise<boolean>;
115
+ setHeaderOverride(id: string, width: string): void;
116
+ resetHeaderOverride(): void;
117
+ }