@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
@@ -25,12 +25,19 @@ export let item;
25
25
  width: 100%;
26
26
  padding-top: 75%;
27
27
  }
28
- img {
28
+ .dialog-chooser-thumbnail img {
29
29
  width: 100%;
30
30
  height: 100%;
31
31
  object-fit: scale-down;
32
32
  }
33
- .dialog-chooser-thumbnail > * {
33
+ .dialog-chooser-thumbnail :global(svg) {
34
+ width: 60%;
35
+ height: 60%;
36
+ min-width: 4.5em;
37
+ min-height: 4.5em;
38
+ object-fit: scale-down;
39
+ }
40
+ .dialog-chooser-thumbnail > :global(*) {
34
41
  display: block;
35
42
  position: absolute;
36
43
  top: 50%;
@@ -1,17 +1,18 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
- import type { AnyUIItem, RawURL } from './ChooserStore';
2
+ import type { AnyItem } from './ChooserAPI';
3
+ import type { RawURL } from './ChooserStore';
3
4
  declare const __propDef: {
4
5
  props: {
5
- item: AnyUIItem | RawURL;
6
+ item: AnyItem | RawURL;
6
7
  };
7
8
  events: {
8
9
  [evt: string]: CustomEvent<any>;
9
10
  };
10
11
  slots: {};
11
12
  };
12
- export declare type ThumbnailProps = typeof __propDef.props;
13
- export declare type ThumbnailEvents = typeof __propDef.events;
14
- export declare type ThumbnailSlots = typeof __propDef.slots;
13
+ export type ThumbnailProps = typeof __propDef.props;
14
+ export type ThumbnailEvents = typeof __propDef.events;
15
+ export type ThumbnailSlots = typeof __propDef.slots;
15
16
  export default class Thumbnail extends SvelteComponentTyped<ThumbnailProps, ThumbnailEvents, ThumbnailSlots> {
16
17
  }
17
18
  export {};
@@ -1,43 +1,97 @@
1
1
  <script>import FieldStandard from '../FieldStandard.svelte';
2
- import { keyby } from 'txstate-utils';
2
+ import { getDescribedBy, Radio } from '..';
3
+ import { randomid } from 'txstate-utils';
3
4
  export let id = undefined;
4
5
  let className = '';
5
6
  export { className as class };
6
7
  export let path;
7
8
  export let options;
9
+ export let addAllOption = false;
8
10
  export let label = '';
9
11
  export let required = false;
10
- export let disabled = false;
11
12
  export let notNull = false;
12
- export let defaultValue = notNull ? options[0].value : undefined;
13
+ export let defaultValue = notNull ? (addAllOption ? 'alternating' : options[0].value) : undefined;
13
14
  export let conditional = undefined;
14
- export let placeholder = 'Select' + (label ? ' ' + label : '');
15
- export let inputelement = undefined;
16
- const colorsByValue = keyby(options, 'value');
15
+ export let helptext = undefined;
16
+ const groupid = randomid();
17
17
  </script>
18
18
 
19
- <FieldStandard bind:id {path} {label} {required} {defaultValue} {conditional} let:id let:value let:valid let:invalid let:onBlur let:onChange>
20
- <div class="flex-color-container">
21
- <div class="selected-color" style="background-color: { value ? colorsByValue[value].color : 'transparent' }"/>
22
- <select bind:this={inputelement} {id} name={path} {disabled} class="dialog-input dialog-select {className}" on:change={onChange} on:blur={onBlur} class:valid class:invalid>
23
- {#if !notNull}<option value="" selected={!value}>{placeholder}</option>{/if}
24
- {#each options as option (option.value) }
25
- <option value={option.value} selected={value === option.value}>{option.name || option.value}</option>
26
- {/each}
27
- </select>
19
+ <FieldStandard bind:id descid={groupid} {path} {label} {required} {defaultValue} {conditional} {helptext} let:value let:valid let:invalid let:onBlur let:onChange let:messagesid let:helptextid>
20
+ <div class="color-container {className}" role="radiogroup" aria-labelledby={groupid} class:invalid class:valid>
21
+ {#if addAllOption}
22
+ <label for={`${path}.alt`} class="colorsel alternating">
23
+ <Radio id={`${path}.alt`} name={path} value="alternating" selected={value === 'alternating'} {onChange} {onBlur} {helptextid}/>
24
+ <span class="alternating-bg">
25
+ {#each options as option}
26
+ <span style={`background-color: ${option.color}`}></span>
27
+ {/each}
28
+ </span>
29
+ <span class="alternating-text">Alternating</span>
30
+ </label>
31
+ {/if}
32
+ {#each options as option, idx (option.value) }
33
+ {@const radioid = `${path}.${idx}`}
34
+ <label for={radioid} class="colorsel">
35
+ <Radio id={radioid} name={path} value={option.value} selected={value === option.value} {onChange} {onBlur} {helptextid}/>
36
+ <span style={`background-color: ${option.color}`}>{option.name || option.value}</span>
37
+ </label>
38
+ {/each}
28
39
  </div>
29
40
  </FieldStandard>
30
41
 
31
42
  <style>
32
- .flex-color-container {
43
+ .color-container {
44
+ display: grid;
45
+ grid-gap: 10px;
46
+ grid-template-columns: 1fr 1fr 1fr;
47
+ }
48
+
49
+ label.colorsel :global(input[type="radio"]) {
50
+ border: 0;
51
+ clip: rect(0 0 0 0);
52
+ height: 1px;
53
+ margin: -1px;
54
+ overflow: hidden;
55
+ padding: 0;
56
+ position: absolute;
57
+ width: 1px;
58
+ }
59
+
60
+ label.colorsel :global(input[type="radio"] + span) {
61
+ display: inline-block;
62
+ font-weight: bold;
63
+ padding: 1rem;
64
+ width: 100%;
65
+ text-align: center;
66
+ white-space: nowrap;
67
+ border: 1px solid #D1D1D1;
68
+ }
69
+
70
+ label.colorsel :global(input[type="radio"]:checked + span) {
71
+ outline: 5px solid #93BBC4;
72
+ }
73
+
74
+ label.colorsel.alternating {
75
+ position: relative;
76
+ }
77
+
78
+ label.colorsel.alternating span.alternating-bg {
33
79
  display: flex;
34
- align-items: center;
35
- }
36
- .selected-color {
37
- height: 2em;
38
- width: 2em;
39
- margin-right: 1em;
40
- border: 1px solid #6d6d6d;
41
- border-radius: 3px;
80
+ padding: 0;
81
+ height: 100%;
82
+ }
83
+
84
+ label.colorsel.alternating span.alternating-bg span {
85
+ width: 100%;
86
+ }
87
+
88
+ label.colorsel.alternating span.alternating-text {
89
+ position: absolute;
90
+ left: 50%;
91
+ top: 50%;
92
+ transform: translate(-50%, -50%);
93
+ font-weight: bold;
94
+ color: white;
95
+ text-shadow: 1px 1px 0 #222, 1px -1px 0 #222, -1px 1px 0 #222, -1px -1px 0 #222;
42
96
  }
43
97
  </style>
@@ -6,23 +6,22 @@ declare const __propDef: {
6
6
  class?: string;
7
7
  path: string;
8
8
  options: ColorPickerOption[];
9
+ addAllOption?: boolean;
9
10
  label?: string;
10
11
  required?: boolean;
11
- disabled?: boolean;
12
12
  notNull?: boolean;
13
13
  defaultValue?: any;
14
14
  conditional?: boolean | undefined;
15
- placeholder?: string;
16
- inputelement?: HTMLSelectElement;
15
+ helptext?: string | undefined;
17
16
  };
18
17
  events: {
19
18
  [evt: string]: CustomEvent<any>;
20
19
  };
21
20
  slots: {};
22
21
  };
23
- export declare type FieldColorPickerProps = typeof __propDef.props;
24
- export declare type FieldColorPickerEvents = typeof __propDef.events;
25
- export declare type FieldColorPickerSlots = typeof __propDef.slots;
22
+ export type FieldColorPickerProps = typeof __propDef.props;
23
+ export type FieldColorPickerEvents = typeof __propDef.events;
24
+ export type FieldColorPickerSlots = typeof __propDef.slots;
26
25
  export default class FieldColorPicker extends SvelteComponentTyped<FieldColorPickerProps, FieldColorPickerEvents, FieldColorPickerSlots> {
27
26
  }
28
27
  export {};
package/fileIcons.d.ts CHANGED
@@ -1 +1,2 @@
1
- export declare function iconForMime(mime: string): import("@iconify/types").IconifyIcon;
1
+ import type { IconifyIcon } from '@iconify/svelte';
2
+ export declare function iconForMime(mime: string): IconifyIcon;
package/helpers.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare function getDescribedBy(ids: string[]): string;
package/helpers.js ADDED
@@ -0,0 +1,5 @@
1
+ import { isNotBlank } from 'txstate-utils';
2
+ export function getDescribedBy(ids) {
3
+ const descby = ids.filter(isNotBlank).join(' ');
4
+ return isNotBlank(descby) ? descby : null;
5
+ }
@@ -3,12 +3,14 @@ import { ScreenReaderOnly, Modal, modifierKey } from '@txstate-mws/svelte-compon
3
3
  import { FontAwesomeIcons, IconCategories } from './iconpicker';
4
4
  import Icon from '@iconify/svelte';
5
5
  import { randomid, keyby } from 'txstate-utils';
6
+ import { getDescribedBy } from '../helpers';
6
7
  export let id = undefined;
7
8
  export let path;
8
9
  export let label = '';
9
10
  export let required = false;
10
11
  export let defaultValue = { icon: 'fa-graduation-cap', prefix: 'fas' };
11
12
  export let conditional = undefined;
13
+ export let helptext = undefined;
12
14
  const labelid = randomid();
13
15
  const descid = randomid();
14
16
  let modalOpen = false;
@@ -101,9 +103,9 @@ function onKeyDown(e) {
101
103
  }
102
104
  </script>
103
105
 
104
- <FieldStandard bind:id {path} {label} {required} {defaultValue} {conditional} let:value let:valid let:invalid let:id let:onBlur let:setVal>
106
+ <FieldStandard bind:id {path} {descid} {label} {required} {defaultValue} {conditional} {helptext} let:value let:valid let:invalid let:id let:onBlur let:setVal let:messagesid let:helptextid>
105
107
  <Icon icon={`${value.prefix === 'fab' ? 'fa-brands' : 'fa-solid'}:${value.icon.slice(3)}`}/>
106
- <button id="btnSelectIcon" on:click={() => { modalOpen = true }}>Select New Icon</button>
108
+ <button id="btnSelectIcon" on:click={() => { modalOpen = true }} aria-describedby={getDescribedBy([descid, messagesid, helptextid])}>Select New Icon</button>
107
109
  {#if modalOpen}
108
110
  <Modal>
109
111
  <section>
@@ -10,15 +10,16 @@ declare const __propDef: {
10
10
  prefix: string;
11
11
  };
12
12
  conditional?: boolean | undefined;
13
+ helptext?: string | undefined;
13
14
  };
14
15
  events: {
15
16
  [evt: string]: CustomEvent<any>;
16
17
  };
17
18
  slots: {};
18
19
  };
19
- export declare type FieldIconPickerProps = typeof __propDef.props;
20
- export declare type FieldIconPickerEvents = typeof __propDef.events;
21
- export declare type FieldIconPickerSlots = typeof __propDef.slots;
20
+ export type FieldIconPickerProps = typeof __propDef.props;
21
+ export type FieldIconPickerEvents = typeof __propDef.events;
22
+ export type FieldIconPickerSlots = typeof __propDef.slots;
22
23
  export default class FieldIconPicker extends SvelteComponentTyped<FieldIconPickerProps, FieldIconPickerEvents, FieldIconPickerSlots> {
23
24
  }
24
25
  export {};
package/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
+ export { default as Button } from './Button.svelte';
2
+ export { default as ButtonGroup } from './ButtonGroup.svelte';
1
3
  export { default as Checkbox } from './Checkbox.svelte';
2
4
  export { default as Container } from './Container.svelte';
5
+ export { default as Dialog } from './Dialog.svelte';
3
6
  export { default as FieldAutocomplete } from './FieldAutocomplete.svelte';
4
7
  export { default as FieldCheckbox } from './FieldCheckbox.svelte';
5
8
  export { default as FieldChoices } from './FieldChoices.svelte';
@@ -8,6 +11,7 @@ export { default as FieldDate } from './FieldDate.svelte';
8
11
  export { default as FieldDateTime } from './FieldDateTime.svelte';
9
12
  export { default as FieldDualListbox } from './FieldDualListbox.svelte';
10
13
  export { default as FieldHidden } from './FieldHidden.svelte';
14
+ export { default as FieldIdentifier } from './FieldIdentifier.svelte';
11
15
  export { default as FieldMultiple } from './FieldMultiple.svelte';
12
16
  export { default as FieldMultiselect } from './FieldMultiselect.svelte';
13
17
  export { default as FieldNumber } from './FieldNumber.svelte';
@@ -18,6 +22,7 @@ export { default as FieldText } from './FieldText.svelte';
18
22
  export { default as FieldTextArea } from './FieldTextArea.svelte';
19
23
  export { default as FileIcon } from './FileIcon.svelte';
20
24
  export { default as Form } from './Form.svelte';
25
+ export { default as FormDialog } from './FormDialog.svelte';
21
26
  export { default as Icon } from './Icon.svelte';
22
27
  export { default as InlineMessage } from './InlineMessage.svelte';
23
28
  export { default as InlineMessages } from './InlineMessages.svelte';
@@ -31,3 +36,5 @@ export * from './fileIcons.js';
31
36
  export * from './TabStore.js';
32
37
  export * from './iconpicker/index.js';
33
38
  export * from './colorpicker/index.js';
39
+ export * from './helpers.js';
40
+ export * from './tree/index.js';
package/index.js CHANGED
@@ -1,5 +1,8 @@
1
+ export { default as Button } from './Button.svelte';
2
+ export { default as ButtonGroup } from './ButtonGroup.svelte';
1
3
  export { default as Checkbox } from './Checkbox.svelte';
2
4
  export { default as Container } from './Container.svelte';
5
+ export { default as Dialog } from './Dialog.svelte';
3
6
  export { default as FieldAutocomplete } from './FieldAutocomplete.svelte';
4
7
  export { default as FieldCheckbox } from './FieldCheckbox.svelte';
5
8
  export { default as FieldChoices } from './FieldChoices.svelte';
@@ -8,6 +11,7 @@ export { default as FieldDate } from './FieldDate.svelte';
8
11
  export { default as FieldDateTime } from './FieldDateTime.svelte';
9
12
  export { default as FieldDualListbox } from './FieldDualListbox.svelte';
10
13
  export { default as FieldHidden } from './FieldHidden.svelte';
14
+ export { default as FieldIdentifier } from './FieldIdentifier.svelte';
11
15
  export { default as FieldMultiple } from './FieldMultiple.svelte';
12
16
  export { default as FieldMultiselect } from './FieldMultiselect.svelte';
13
17
  export { default as FieldNumber } from './FieldNumber.svelte';
@@ -18,6 +22,7 @@ export { default as FieldText } from './FieldText.svelte';
18
22
  export { default as FieldTextArea } from './FieldTextArea.svelte';
19
23
  export { default as FileIcon } from './FileIcon.svelte';
20
24
  export { default as Form } from './Form.svelte';
25
+ export { default as FormDialog } from './FormDialog.svelte';
21
26
  export { default as Icon } from './Icon.svelte';
22
27
  export { default as InlineMessage } from './InlineMessage.svelte';
23
28
  export { default as InlineMessages } from './InlineMessages.svelte';
@@ -31,3 +36,5 @@ export * from './fileIcons.js';
31
36
  export * from './TabStore.js';
32
37
  export * from './iconpicker/index.js';
33
38
  export * from './colorpicker/index.js';
39
+ export * from './helpers.js';
40
+ export * from './tree/index.js';
package/package.json CHANGED
@@ -1,34 +1,36 @@
1
1
  {
2
2
  "name": "@dosgato/dialog",
3
3
  "description": "A component library for building forms that edit a JSON document.",
4
- "version": "0.0.19",
4
+ "version": "0.0.21",
5
5
  "dependencies": {
6
- "@txstate-mws/svelte-components": "^1.3.0",
7
- "@txstate-mws/svelte-forms": ">=0.0.22",
8
- "@iconify/svelte": "^2.2.1",
6
+ "@txstate-mws/svelte-components": "^1.3.5",
7
+ "@txstate-mws/svelte-forms": "^1.1.2",
8
+ "@iconify/svelte": "^3.0.0",
9
9
  "@iconify-icons/mdi": "^1.2.22",
10
10
  "@iconify-icons/ph": "^1.2.2",
11
- "txstate-utils": "^1.7.3"
11
+ "txstate-utils": "^1.7.12"
12
12
  },
13
13
  "devDependencies": {
14
14
  "@sveltejs/adapter-auto": "next",
15
15
  "@sveltejs/kit": "next",
16
- "@sveltejs/package": "next",
17
- "eslint-config-standard-with-typescript": "^21.0.1",
18
- "eslint-plugin-svelte3": "^3.2.1",
16
+ "@sveltejs/package": "^1.0.0-next.5",
17
+ "eslint-config-standard-with-typescript": "^23.0.0",
18
+ "eslint-plugin-svelte3": "^4.0.0",
19
19
  "svelte": "^3.44.0",
20
20
  "svelte-check": "^2.2.6",
21
21
  "svelte-preprocess": "^4.9.4",
22
- "svelte2tsx": "^0.4.14",
22
+ "svelte2tsx": "^0.5.20",
23
23
  "tslib": "^2.3.1",
24
24
  "typescript": "^4.4.3"
25
25
  },
26
26
  "type": "module",
27
27
  "exports": {
28
28
  "./package.json": "./package.json",
29
+ "./Button.svelte": "./Button.svelte",
29
30
  "./ButtonGroup.svelte": "./ButtonGroup.svelte",
30
31
  "./Checkbox.svelte": "./Checkbox.svelte",
31
32
  "./Container.svelte": "./Container.svelte",
33
+ "./Dialog.svelte": "./Dialog.svelte",
32
34
  "./FieldAutocomplete.svelte": "./FieldAutocomplete.svelte",
33
35
  "./FieldCheckbox.svelte": "./FieldCheckbox.svelte",
34
36
  "./FieldChoices.svelte": "./FieldChoices.svelte",
@@ -48,6 +50,7 @@
48
50
  "./FieldTextArea.svelte": "./FieldTextArea.svelte",
49
51
  "./FileIcon.svelte": "./FileIcon.svelte",
50
52
  "./Form.svelte": "./Form.svelte",
53
+ "./FormDialog.svelte": "./FormDialog.svelte",
51
54
  "./Icon.svelte": "./Icon.svelte",
52
55
  "./InlineMessage.svelte": "./InlineMessage.svelte",
53
56
  "./InlineMessages.svelte": "./InlineMessages.svelte",
@@ -57,23 +60,27 @@
57
60
  "./Tab.svelte": "./Tab.svelte",
58
61
  "./TabStore": "./TabStore.js",
59
62
  "./Tabs.svelte": "./Tabs.svelte",
60
- "./chooser/Asset.svelte": "./chooser/Asset.svelte",
61
- "./chooser/AssetFolder.svelte": "./chooser/AssetFolder.svelte",
62
63
  "./chooser/Chooser.svelte": "./chooser/Chooser.svelte",
63
64
  "./chooser/ChooserAPI": "./chooser/ChooserAPI.js",
64
65
  "./chooser/ChooserStore": "./chooser/ChooserStore.js",
65
66
  "./chooser/Details.svelte": "./chooser/Details.svelte",
66
- "./chooser/Page.svelte": "./chooser/Page.svelte",
67
67
  "./chooser/Thumbnail.svelte": "./chooser/Thumbnail.svelte",
68
68
  "./chooser": "./chooser/index.js",
69
69
  "./colorpicker/FieldColorPicker.svelte": "./colorpicker/FieldColorPicker.svelte",
70
70
  "./colorpicker/colorpicker": "./colorpicker/colorpicker.js",
71
71
  "./colorpicker": "./colorpicker/index.js",
72
72
  "./fileIcons": "./fileIcons.js",
73
+ "./helpers": "./helpers.js",
73
74
  "./iconpicker/FieldIconPicker.svelte": "./iconpicker/FieldIconPicker.svelte",
74
75
  "./iconpicker/iconpicker": "./iconpicker/iconpicker.js",
75
76
  "./iconpicker": "./iconpicker/index.js",
76
- ".": "./index.js"
77
+ ".": "./index.js",
78
+ "./tree/LoadIcon.svelte": "./tree/LoadIcon.svelte",
79
+ "./tree/Tree.svelte": "./tree/Tree.svelte",
80
+ "./tree/TreeCell.svelte": "./tree/TreeCell.svelte",
81
+ "./tree/TreeNode.svelte": "./tree/TreeNode.svelte",
82
+ "./tree": "./tree/index.js",
83
+ "./tree/treestore": "./tree/treestore.js"
77
84
  },
78
85
  "svelte": "./index.js"
79
86
  }
@@ -0,0 +1,24 @@
1
+ <script>
2
+ export let size = '1em'
3
+ </script>
4
+
5
+ <i aria-hidden="true" style:width={size} style:padding-top={size}></i>
6
+
7
+ <style>
8
+ i {
9
+ display: inline-block;
10
+ box-sizing: content-box;
11
+ border-color: var(--loadicon-bg-color, #FFFFFF);
12
+ border-top-color: var(--loadicon-moving-color, #333333);
13
+ border-style: solid;
14
+ border-radius: 50%;
15
+ animation: spin 2s linear infinite;
16
+ margin-left: 0.3em;
17
+ vertical-align: middle;
18
+ }
19
+
20
+ @keyframes spin {
21
+ 0% { transform: rotate(0deg); }
22
+ 100% { transform: rotate(360deg); }
23
+ }
24
+ </style>
@@ -0,0 +1,23 @@
1
+ /** @typedef {typeof __propDef.props} LoadIconProps */
2
+ /** @typedef {typeof __propDef.events} LoadIconEvents */
3
+ /** @typedef {typeof __propDef.slots} LoadIconSlots */
4
+ export default class LoadIcon extends SvelteComponentTyped<{
5
+ size?: string;
6
+ }, {
7
+ [evt: string]: CustomEvent<any>;
8
+ }, {}> {
9
+ }
10
+ export type LoadIconProps = typeof __propDef.props;
11
+ export type LoadIconEvents = typeof __propDef.events;
12
+ export type LoadIconSlots = typeof __propDef.slots;
13
+ import { SvelteComponentTyped } from "svelte";
14
+ declare const __propDef: {
15
+ props: {
16
+ size?: string;
17
+ };
18
+ events: {
19
+ [evt: string]: CustomEvent<any>;
20
+ };
21
+ slots: {};
22
+ };
23
+ export {};
@@ -0,0 +1,203 @@
1
+ <script>import { resize } from '@txstate-mws/svelte-components';
2
+ import { derivedStore, Store } from '@txstate-mws/svelte-store';
3
+ import { afterUpdate, beforeUpdate, onDestroy, onMount, setContext } from 'svelte';
4
+ import { hashid } from 'txstate-utils';
5
+ import TreeNode from './TreeNode.svelte';
6
+ import { TreeStore, TREE_STORE_CONTEXT } from './treestore';
7
+ export let headers;
8
+ export let nodeClass = undefined;
9
+ export let singleSelect = undefined;
10
+ export let enableResize = false;
11
+ export let fetchChildren = undefined;
12
+ export let dragEligible = undefined;
13
+ export let moveHandler = undefined;
14
+ export let copyHandler = undefined;
15
+ export let dropEffect = undefined;
16
+ export let store = new TreeStore(fetchChildren, { copyHandler, dragEligible, dropEffect, moveHandler });
17
+ setContext(TREE_STORE_CONTEXT, store);
18
+ const { rootItems, headerOverride } = store;
19
+ let checkboxelement;
20
+ const headerelements = [];
21
+ const treeWidth = new Store({});
22
+ function calcHeaderSizes() {
23
+ const headerSizes = [];
24
+ let totalFixed = checkboxelement?.offsetWidth ?? 0;
25
+ for (let i = 0; i < headers.length; i++) {
26
+ const header = headers[i];
27
+ if (header.fixed || $headerOverride[header.id]) {
28
+ headerSizes[i] = $headerOverride[header.id] ?? header.fixed;
29
+ totalFixed += headerelements[i]?.offsetWidth ?? 0;
30
+ }
31
+ }
32
+ const remainingWidth = ($treeWidth.clientWidth ?? 1024) - totalFixed;
33
+ const growHeaders = headers.filter((h, i) => !h.fixed && !$headerOverride[h.id] && headerelements[i]?.offsetWidth);
34
+ const totalGrowShares = growHeaders.reduce((sum, h) => sum + (h.grow ?? 1), 0);
35
+ for (let i = 0; i < headers.length; i++) {
36
+ const header = headers[i];
37
+ if (!header.fixed && !$headerOverride[header.id] && headerelements[i]?.offsetWidth) {
38
+ headerSizes[i] = `${remainingWidth * (header.grow ?? 1) / totalGrowShares}px`;
39
+ }
40
+ }
41
+ return headerSizes;
42
+ }
43
+ const headerSizes = derivedStore([headerOverride, treeWidth], calcHeaderSizes);
44
+ $: store.singleSelect = singleSelect;
45
+ function onDragEnd() {
46
+ store.update(v => ({ ...v, dragging: false }));
47
+ }
48
+ let dragheaderid;
49
+ let dragheaderidx;
50
+ let dragtarget;
51
+ let widthStart;
52
+ let mouseStart;
53
+ function headerDragStart(header, idx) {
54
+ return (e) => {
55
+ if (!enableResize)
56
+ return;
57
+ dragtarget = headerelements[idx];
58
+ if (!dragtarget.isConnected)
59
+ dragtarget = undefined;
60
+ else {
61
+ e.preventDefault();
62
+ dragheaderid = header.id;
63
+ dragheaderidx = idx;
64
+ widthStart = dragtarget.clientWidth;
65
+ mouseStart = e instanceof TouchEvent ? e.touches[0].screenX : e.screenX;
66
+ }
67
+ };
68
+ }
69
+ function headerDrag(e) {
70
+ if (e instanceof TouchEvent && e.touches.length > 1)
71
+ return;
72
+ if (dragheaderid && dragheaderidx != null && dragtarget?.isConnected) {
73
+ for (let i = 0; i < dragheaderidx; i++) {
74
+ store.setHeaderOverride(headers[i].id, $headerSizes[i]);
75
+ }
76
+ const screenX = e instanceof TouchEvent ? e.touches[0].screenX : e.screenX;
77
+ store.setHeaderOverride(dragheaderid, `${widthStart - (mouseStart - screenX)}px`);
78
+ }
79
+ }
80
+ function headerDragEnd() {
81
+ dragtarget = undefined;
82
+ dragheaderid = undefined;
83
+ }
84
+ function headerDragReset() {
85
+ store.resetHeaderOverride();
86
+ }
87
+ let mounted = false;
88
+ onMount(async () => {
89
+ document.addEventListener('dragend', onDragEnd);
90
+ await store.refresh();
91
+ if ($store.focused?.id) {
92
+ const el = document.getElementById(hashid($store.focused.id));
93
+ el?.scrollIntoView({ block: 'center' });
94
+ }
95
+ headerSizes.set(calcHeaderSizes()); // seems to need a kick on first mount
96
+ mounted = true;
97
+ });
98
+ onDestroy(() => {
99
+ document.removeEventListener('dragend', onDragEnd);
100
+ });
101
+ let hadFocus = false;
102
+ beforeUpdate(() => {
103
+ hadFocus = !!store.treeElement?.contains(document.activeElement);
104
+ });
105
+ afterUpdate(() => {
106
+ if ($store.focused?.id) {
107
+ const el = document.getElementById(hashid($store.focused.id));
108
+ if (el && hadFocus) {
109
+ if (el !== document.activeElement)
110
+ el.focus();
111
+ }
112
+ }
113
+ });
114
+ </script>
115
+
116
+ <svelte:window on:mouseup={headerDragEnd} />
117
+
118
+ <div class="tree-header" class:mounted class:resizing={!!dragheaderid} use:resize={{ store: treeWidth }} aria-hidden="true" on:mouseup={headerDragEnd} on:touchend={headerDragEnd} on:mousemove={dragheaderid ? headerDrag : undefined} on:touchmove={dragheaderid ? headerDrag : undefined}>
119
+ <div class="checkbox" bind:this={checkboxelement}>&nbsp;</div>
120
+ {#each headers as header, i (header.label)}
121
+ <div bind:this={headerelements[i]} id={header.id} class="tree-header-cell {header.id}" style:width={$headerOverride[header.id] ?? $headerSizes?.[i]}>{header.label}</div>
122
+ {#if enableResize && i !== headers.length - 1}<div class="tree-separator" on:mousedown={headerDragStart(header, i)} on:touchstart={headerDragStart(header, i)} on:dblclick={headerDragReset}>&nbsp;</div>{/if}
123
+ {/each}
124
+ </div>
125
+ {#if $rootItems?.length}
126
+ <ul bind:this={store.treeElement} class:mounted role="tree" class:resizing={!!dragheaderid} on:mousemove={dragheaderid ? headerDrag : undefined} on:touchmove={dragheaderid ? headerDrag : undefined} on:mouseup={headerDragEnd} on:touchend={headerDragEnd}>
127
+ {#each $rootItems as item, i (item.id)}
128
+ <TreeNode
129
+ {item}
130
+ {headers}
131
+ {headerSizes}
132
+ {nodeClass}
133
+ posinset={i + 1}
134
+ setsize={$rootItems.length}
135
+ level={item.level}
136
+ prev={$rootItems[i - 1]}
137
+ next={$rootItems[i + 1]}
138
+ on:choose
139
+ on:deselect
140
+ />
141
+ {/each}
142
+ </ul>
143
+ {/if}
144
+
145
+ <style>
146
+ .tree-header {
147
+ display: flex;
148
+ align-items: center;
149
+ background-color: var(--tree-head-bg, #555555);
150
+ color: var(--tree-head-text, white);
151
+ position: sticky;
152
+ top: 0;
153
+ left: 0;
154
+ z-index: 1;
155
+ font-size: 0.9em;
156
+ opacity: 0;
157
+ }
158
+ .tree-header.mounted {
159
+ opacity: 1;
160
+ }
161
+ .tree-header.resizing {
162
+ cursor: col-resize;
163
+ }
164
+ .tree-header > .tree-header-cell {
165
+ padding: 0.4em 0.3em;
166
+ }
167
+ .tree-header > .tree-separator {
168
+ position: relative;
169
+ width: 4px;
170
+ margin-left: -4px;
171
+ padding: 0.4em 0;
172
+ cursor: col-resize;
173
+ }
174
+ .tree-header > .tree-separator:before {
175
+ content: ' ';
176
+ position: absolute;
177
+ left: 1px;
178
+ top: 0;
179
+ width: 2px;
180
+ height: 100%;
181
+ background-color: var(--tree-head-text, white);
182
+ }
183
+ :global([data-eq~="650px"]) .tree-header {
184
+ font-size: 0.8em;
185
+ }
186
+ .checkbox {
187
+ min-width: 1.5em;
188
+ max-width: 1.5em;
189
+ }
190
+ ul {
191
+ padding: 0;
192
+ margin: 0;
193
+ list-style: none;
194
+ font-size: 0.9em;
195
+ opacity: 0;
196
+ }
197
+ ul.mounted {
198
+ opacity: 1;
199
+ }
200
+ :global([data-eq~="650px"]) ul {
201
+ font-size: 0.8em;
202
+ }
203
+ </style>