tree-element 0.1.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 (182) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +221 -0
  3. package/lib/animation.d.ts +5 -0
  4. package/lib/animation.d.ts.map +1 -0
  5. package/lib/animation.js +39 -0
  6. package/lib/animation.js.map +1 -0
  7. package/lib/classNames.d.ts +34 -0
  8. package/lib/classNames.d.ts.map +1 -0
  9. package/lib/classNames.js +39 -0
  10. package/lib/classNames.js.map +1 -0
  11. package/lib/dataLoader.d.ts +25 -0
  12. package/lib/dataLoader.d.ts.map +1 -0
  13. package/lib/dataLoader.js +69 -0
  14. package/lib/dataLoader.js.map +1 -0
  15. package/lib/dragAndDropHandler/binarySearch.d.ts +3 -0
  16. package/lib/dragAndDropHandler/binarySearch.d.ts.map +1 -0
  17. package/lib/dragAndDropHandler/binarySearch.js +23 -0
  18. package/lib/dragAndDropHandler/binarySearch.js.map +1 -0
  19. package/lib/dragAndDropHandler/dragElement.d.ts +20 -0
  20. package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -0
  21. package/lib/dragAndDropHandler/dragElement.js +39 -0
  22. package/lib/dragAndDropHandler/dragElement.js.map +1 -0
  23. package/lib/dragAndDropHandler/generateHitAreas.d.ts +13 -0
  24. package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -0
  25. package/lib/dragAndDropHandler/generateHitAreas.js +130 -0
  26. package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -0
  27. package/lib/dragAndDropHandler/index.d.ts +76 -0
  28. package/lib/dragAndDropHandler/index.d.ts.map +1 -0
  29. package/lib/dragAndDropHandler/index.js +311 -0
  30. package/lib/dragAndDropHandler/index.js.map +1 -0
  31. package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts +11 -0
  32. package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -0
  33. package/lib/dragAndDropHandler/iterateVisibleNodes.js +54 -0
  34. package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -0
  35. package/lib/dragAndDropHandler/types.d.ts +11 -0
  36. package/lib/dragAndDropHandler/types.d.ts.map +1 -0
  37. package/lib/elementsRenderer.d.ts +53 -0
  38. package/lib/elementsRenderer.d.ts.map +1 -0
  39. package/lib/elementsRenderer.js +251 -0
  40. package/lib/elementsRenderer.js.map +1 -0
  41. package/lib/events.d.ts +224 -0
  42. package/lib/events.d.ts.map +1 -0
  43. package/lib/index.d.ts +367 -0
  44. package/lib/index.d.ts.map +1 -0
  45. package/lib/index.js +1098 -0
  46. package/lib/index.js.map +1 -0
  47. package/lib/keyHandler.d.ts +29 -0
  48. package/lib/keyHandler.d.ts.map +1 -0
  49. package/lib/keyHandler.js +107 -0
  50. package/lib/keyHandler.js.map +1 -0
  51. package/lib/methodTypes.d.ts +21 -0
  52. package/lib/methodTypes.d.ts.map +1 -0
  53. package/lib/mouseHandler.d.ts +60 -0
  54. package/lib/mouseHandler.d.ts.map +1 -0
  55. package/lib/mouseHandler.js +283 -0
  56. package/lib/mouseHandler.js.map +1 -0
  57. package/lib/mouseUtils.d.ts +9 -0
  58. package/lib/mouseUtils.d.ts.map +1 -0
  59. package/lib/mouseUtils.js +15 -0
  60. package/lib/mouseUtils.js.map +1 -0
  61. package/lib/node.d.ts +320 -0
  62. package/lib/node.d.ts.map +1 -0
  63. package/lib/node.js +737 -0
  64. package/lib/node.js.map +1 -0
  65. package/lib/nodeElement/borderDropHint.d.ts +9 -0
  66. package/lib/nodeElement/borderDropHint.d.ts.map +1 -0
  67. package/lib/nodeElement/borderDropHint.js +24 -0
  68. package/lib/nodeElement/borderDropHint.js.map +1 -0
  69. package/lib/nodeElement/folderElement.d.ts +22 -0
  70. package/lib/nodeElement/folderElement.d.ts.map +1 -0
  71. package/lib/nodeElement/folderElement.js +100 -0
  72. package/lib/nodeElement/folderElement.js.map +1 -0
  73. package/lib/nodeElement/ghostDropHint.d.ts +18 -0
  74. package/lib/nodeElement/ghostDropHint.d.ts.map +1 -0
  75. package/lib/nodeElement/ghostDropHint.js +67 -0
  76. package/lib/nodeElement/ghostDropHint.js.map +1 -0
  77. package/lib/nodeElement/index.d.ts +28 -0
  78. package/lib/nodeElement/index.d.ts.map +1 -0
  79. package/lib/nodeElement/index.js +66 -0
  80. package/lib/nodeElement/index.js.map +1 -0
  81. package/lib/nodeUtils.d.ts +7 -0
  82. package/lib/nodeUtils.d.ts.map +1 -0
  83. package/lib/nodeUtils.js +4 -0
  84. package/lib/nodeUtils.js.map +1 -0
  85. package/lib/options.d.ts +310 -0
  86. package/lib/options.d.ts.map +1 -0
  87. package/lib/package.json +3 -0
  88. package/lib/positionUtils.d.ts +8 -0
  89. package/lib/positionUtils.d.ts.map +1 -0
  90. package/lib/positionUtils.js +14 -0
  91. package/lib/positionUtils.js.map +1 -0
  92. package/lib/requestUrl.d.ts +9 -0
  93. package/lib/requestUrl.d.ts.map +1 -0
  94. package/lib/requestUrl.js +37 -0
  95. package/lib/requestUrl.js.map +1 -0
  96. package/lib/saveStateHandler.d.ts +46 -0
  97. package/lib/saveStateHandler.d.ts.map +1 -0
  98. package/lib/saveStateHandler.js +204 -0
  99. package/lib/saveStateHandler.js.map +1 -0
  100. package/lib/scrollHandler/containerScrollParent.d.ts +12 -0
  101. package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -0
  102. package/lib/scrollHandler/containerScrollParent.js +49 -0
  103. package/lib/scrollHandler/containerScrollParent.js.map +1 -0
  104. package/lib/scrollHandler/createScrollParent.d.ts +4 -0
  105. package/lib/scrollHandler/createScrollParent.d.ts.map +1 -0
  106. package/lib/scrollHandler/createScrollParent.js +38 -0
  107. package/lib/scrollHandler/createScrollParent.js.map +1 -0
  108. package/lib/scrollHandler/documentScrollParent.d.ts +22 -0
  109. package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -0
  110. package/lib/scrollHandler/documentScrollParent.js +71 -0
  111. package/lib/scrollHandler/documentScrollParent.js.map +1 -0
  112. package/lib/scrollHandler/scrollParent.d.ts +26 -0
  113. package/lib/scrollHandler/scrollParent.d.ts.map +1 -0
  114. package/lib/scrollHandler/scrollParent.js +79 -0
  115. package/lib/scrollHandler/scrollParent.js.map +1 -0
  116. package/lib/scrollHandler.d.ts +20 -0
  117. package/lib/scrollHandler.d.ts.map +1 -0
  118. package/lib/scrollHandler.js +41 -0
  119. package/lib/scrollHandler.js.map +1 -0
  120. package/lib/selectNodeHandler.d.ts +38 -0
  121. package/lib/selectNodeHandler.d.ts.map +1 -0
  122. package/lib/selectNodeHandler.js +166 -0
  123. package/lib/selectNodeHandler.js.map +1 -0
  124. package/lib/setDefaultOptions.d.ts +4 -0
  125. package/lib/setDefaultOptions.d.ts.map +1 -0
  126. package/lib/setDefaultOptions.js +86 -0
  127. package/lib/setDefaultOptions.js.map +1 -0
  128. package/lib/triggerCustomEvent.d.ts +3 -0
  129. package/lib/triggerCustomEvent.d.ts.map +1 -0
  130. package/lib/triggerCustomEvent.js +13 -0
  131. package/lib/triggerCustomEvent.js.map +1 -0
  132. package/lib/util.d.ts +3 -0
  133. package/lib/util.d.ts.map +1 -0
  134. package/lib/util.js +5 -0
  135. package/lib/util.js.map +1 -0
  136. package/lib/version.d.ts +3 -0
  137. package/lib/version.d.ts.map +1 -0
  138. package/lib/version.js +5 -0
  139. package/lib/version.js.map +1 -0
  140. package/package.json +110 -0
  141. package/src/animation.ts +48 -0
  142. package/src/classNames.ts +70 -0
  143. package/src/dataLoader.ts +92 -0
  144. package/src/dragAndDropHandler/binarySearch.ts +27 -0
  145. package/src/dragAndDropHandler/dragElement.ts +62 -0
  146. package/src/dragAndDropHandler/generateHitAreas.ts +195 -0
  147. package/src/dragAndDropHandler/index.ts +442 -0
  148. package/src/dragAndDropHandler/iterateVisibleNodes.ts +91 -0
  149. package/src/dragAndDropHandler/types.ts +12 -0
  150. package/src/elementsRenderer.ts +367 -0
  151. package/src/events.ts +237 -0
  152. package/src/header.txt +16 -0
  153. package/src/index.ts +1290 -0
  154. package/src/keyHandler.ts +139 -0
  155. package/src/methodTypes.ts +44 -0
  156. package/src/mouseHandler.ts +391 -0
  157. package/src/mouseUtils.ts +23 -0
  158. package/src/node.ts +831 -0
  159. package/src/nodeElement/borderDropHint.ts +37 -0
  160. package/src/nodeElement/folderElement.ts +140 -0
  161. package/src/nodeElement/ghostDropHint.ts +84 -0
  162. package/src/nodeElement/index.ts +103 -0
  163. package/src/nodeUtils.ts +12 -0
  164. package/src/options.ts +325 -0
  165. package/src/positionUtils.ts +18 -0
  166. package/src/requestUrl.ts +41 -0
  167. package/src/saveStateHandler.ts +279 -0
  168. package/src/scrollHandler/containerScrollParent.ts +71 -0
  169. package/src/scrollHandler/createScrollParent.ts +51 -0
  170. package/src/scrollHandler/documentScrollParent.ts +104 -0
  171. package/src/scrollHandler/scrollParent.ts +117 -0
  172. package/src/scrollHandler.ts +55 -0
  173. package/src/selectNodeHandler.ts +192 -0
  174. package/src/setDefaultOptions.ts +79 -0
  175. package/src/triggerCustomEvent.ts +14 -0
  176. package/src/util.ts +5 -0
  177. package/src/version.ts +4 -0
  178. package/tree_element.css +195 -0
  179. package/tree_element.debug.js +4153 -0
  180. package/tree_element.debug.js.map +1 -0
  181. package/tree_element.js +21 -0
  182. package/tree_element.js.map +1 -0
@@ -0,0 +1,55 @@
1
+ import type { PositionInfo } from "./mouseUtils";
2
+ import type { ScrollParent } from "./scrollHandler/scrollParent";
3
+
4
+ import createScrollParent from "./scrollHandler/createScrollParent";
5
+
6
+ interface ScrollHandlerParams {
7
+ refreshHitAreas: () => void;
8
+ treeElement: HTMLElement;
9
+ }
10
+
11
+ export default class ScrollHandler {
12
+ private refreshHitAreas: () => void;
13
+ private scrollParent?: ScrollParent;
14
+ private treeElement: HTMLElement;
15
+
16
+ constructor({ refreshHitAreas, treeElement }: ScrollHandlerParams) {
17
+ this.refreshHitAreas = refreshHitAreas;
18
+ this.scrollParent = undefined;
19
+ this.treeElement = treeElement;
20
+ }
21
+
22
+ public checkScrolling(positionInfo: PositionInfo): void {
23
+ this.checkVerticalScrolling(positionInfo);
24
+ this.checkHorizontalScrolling(positionInfo);
25
+ }
26
+
27
+ public getScrollLeft(): number {
28
+ return this.getScrollParent().getScrollLeft();
29
+ }
30
+
31
+ public scrollToY(top: number): void {
32
+ this.getScrollParent().scrollToY(top);
33
+ }
34
+
35
+ public stopScrolling() {
36
+ this.getScrollParent().stopScrolling();
37
+ }
38
+
39
+ private checkHorizontalScrolling(positionInfo: PositionInfo): void {
40
+ this.getScrollParent().checkHorizontalScrolling(positionInfo.pageX);
41
+ }
42
+
43
+ private checkVerticalScrolling(positionInfo: PositionInfo): void {
44
+ this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);
45
+ }
46
+
47
+ private getScrollParent(): ScrollParent {
48
+ this.scrollParent ??= createScrollParent(
49
+ this.treeElement,
50
+ this.refreshHitAreas,
51
+ );
52
+
53
+ return this.scrollParent;
54
+ }
55
+ }
@@ -0,0 +1,192 @@
1
+ import type { GetNodeById, GetNodeElementForNode, OpenParents, TriggerEvent } from "./methodTypes";
2
+ import type { Node, NodeId } from "./node";
3
+ import type { OnCanSelectNode } from "./options";
4
+
5
+ export interface SelectNodeOptions {
6
+ mustSetFocus?: boolean;
7
+ mustToggle?: boolean;
8
+ }
9
+
10
+ interface SelectNodeHandlerParameters {
11
+ getNodeById: GetNodeById;
12
+ getNodeElementForNode: GetNodeElementForNode;
13
+ getOnCanSelectNode: () => OnCanSelectNode | undefined;
14
+ getSelectable: () => boolean;
15
+ openParents: OpenParents;
16
+ saveState: () => void;
17
+ triggerEvent: TriggerEvent;
18
+ }
19
+
20
+ export default class SelectNodeHandler {
21
+ private getNodeById: GetNodeById;
22
+ private getNodeElementForNode: GetNodeElementForNode;
23
+ private getOnCanSelectNode: () => OnCanSelectNode | undefined;
24
+ private getSelectable: () => boolean;
25
+ private openParents: OpenParents;
26
+ private saveState: () => void;
27
+ private selectedNodes: Set<NodeId>;
28
+ private selectedSingleNode: Node | null;
29
+ private triggerEvent: TriggerEvent;
30
+
31
+ constructor({ getNodeById, getNodeElementForNode, getOnCanSelectNode, getSelectable, openParents, saveState, triggerEvent }: SelectNodeHandlerParameters) {
32
+ this.getNodeById = getNodeById;
33
+ this.getNodeElementForNode = getNodeElementForNode;
34
+ this.getOnCanSelectNode = getOnCanSelectNode;
35
+ this.getSelectable = getSelectable;
36
+ this.openParents = openParents;
37
+ this.saveState = saveState;
38
+ this.selectedNodes = new Set<NodeId>();
39
+ this.selectedSingleNode = null;
40
+ this.triggerEvent = triggerEvent;
41
+ }
42
+
43
+ public addToSelection(node: Node): void {
44
+ if (node.id != null) {
45
+ this.selectedNodes.add(node.id);
46
+ } else {
47
+ this.selectedSingleNode = node;
48
+ }
49
+ }
50
+
51
+ public clear(): void {
52
+ this.selectedNodes.clear();
53
+ this.selectedSingleNode = null;
54
+ }
55
+
56
+ public getSelectedNode(): false | Node {
57
+ const selectedNodes = this.getSelectedNodes();
58
+
59
+ if (selectedNodes.length) {
60
+ return selectedNodes[0] ?? false;
61
+ } else {
62
+ return false;
63
+ }
64
+ }
65
+
66
+ public getSelectedNodes(): Node[] {
67
+ if (this.selectedSingleNode) {
68
+ return [this.selectedSingleNode];
69
+ } else {
70
+ const selectedNodes: Node[] = [];
71
+
72
+ this.selectedNodes.forEach((id) => {
73
+ const node = this.getNodeById(id);
74
+ if (node) {
75
+ selectedNodes.push(node);
76
+ }
77
+ });
78
+
79
+ return selectedNodes;
80
+ }
81
+ }
82
+
83
+ public getSelectedNodesUnder(parent: Node): Node[] {
84
+ if (this.selectedSingleNode) {
85
+ if (parent.isParentOf(this.selectedSingleNode)) {
86
+ return [this.selectedSingleNode];
87
+ } else {
88
+ return [];
89
+ }
90
+ } else {
91
+ const selectedNodes: Node[] = [];
92
+
93
+ this.selectedNodes.forEach((id) => {
94
+ const node = this.getNodeById(id);
95
+ if (node && parent.isParentOf(node)) {
96
+ selectedNodes.push(node);
97
+ }
98
+ });
99
+
100
+ return selectedNodes;
101
+ }
102
+ }
103
+
104
+ public isNodeSelected(node: Node): boolean {
105
+ if (node.id != null) {
106
+ return this.selectedNodes.has(node.id);
107
+ } else if (this.selectedSingleNode) {
108
+ return this.selectedSingleNode.element === node.element;
109
+ } else {
110
+ return false;
111
+ }
112
+ }
113
+
114
+ public removeFromSelection(node: Node, includeChildren = false): void {
115
+ if (node.id == null) {
116
+ if (
117
+ this.selectedSingleNode &&
118
+ node.element === this.selectedSingleNode.element
119
+ ) {
120
+ this.selectedSingleNode = null;
121
+ }
122
+ } else {
123
+ this.selectedNodes.delete(node.id);
124
+
125
+ if (includeChildren) {
126
+ node.iterate(() => {
127
+ if (node.id != null) {
128
+ this.selectedNodes.delete(node.id);
129
+ }
130
+ return true;
131
+ });
132
+ }
133
+ }
134
+ }
135
+
136
+ /* Select a single node.
137
+ * Renders the changed elements.
138
+ * Deselects if the node is currently selected (if the mustToggle is on).
139
+ * Deselects the previously selected node.
140
+ * Check if the node is selectable.
141
+ * Saves the state.
142
+ * Options:
143
+ * mustSetFocus: set the focus to the selected node
144
+ * mustToggle: support deselecting the selected node
145
+ */
146
+ public selectSingleNode(node: Node, optionsParam?: SelectNodeOptions) {
147
+ const defaultOptions = { mustSetFocus: true, mustToggle: true };
148
+ const selectOptions = { ...defaultOptions, ...(optionsParam ?? {}) };
149
+
150
+ const canSelect = (): boolean => {
151
+ if (!this.getSelectable()) {
152
+ return false;
153
+ }
154
+
155
+ const onCanSelectNode = this.getOnCanSelectNode();
156
+ return onCanSelectNode ? onCanSelectNode(node) : true;
157
+ };
158
+
159
+ if (!canSelect()) {
160
+ return;
161
+ }
162
+
163
+ const deselectCurrentNode = (deselectedNode: Node) => {
164
+ this.removeFromSelection(deselectedNode);
165
+ this.getNodeElementForNode(deselectedNode).deselect();
166
+ };
167
+
168
+ if (this.isNodeSelected(node)) {
169
+ if (selectOptions.mustToggle) {
170
+ deselectCurrentNode(node);
171
+ this.triggerEvent("tree.deselect", { node });
172
+ }
173
+ } else {
174
+ const deselectedNode = this.getSelectedNode();
175
+
176
+ if (deselectedNode) {
177
+ deselectCurrentNode(deselectedNode);
178
+ }
179
+
180
+ this.addToSelection(node);
181
+ this.openParents(node);
182
+ this.getNodeElementForNode(node).select(selectOptions.mustSetFocus);
183
+
184
+ this.triggerEvent("tree.select", {
185
+ deselectedNode: deselectedNode || null,
186
+ node,
187
+ });
188
+ }
189
+
190
+ this.saveState();
191
+ }
192
+ }
@@ -0,0 +1,79 @@
1
+ import type { TreeElementOptions } from "./options";
2
+
3
+ import { DEFAULT_CLASS_PREFIX } from "./classNames";
4
+ import { Node } from "./node";
5
+
6
+ const defaults: TreeElementOptions = {
7
+ animationSpeed: "fast",
8
+ autoEscape: true,
9
+ autoOpen: false, // true / false / int (open n levels starting at 0)
10
+ buttonLeft: true,
11
+ classPrefix: DEFAULT_CLASS_PREFIX, // the prefix of all css classes
12
+ // The symbol to use for a closed node - ► BLACK RIGHT-POINTING POINTER
13
+ // http://www.fileformat.info/info/unicode/char/25ba/index.htm
14
+ closedIcon: undefined,
15
+ commonClassName: undefined, // the class of every element; the default is "<classPrefix>-common"
16
+ data: undefined,
17
+ dataFilter: undefined,
18
+ dataUrl: undefined,
19
+ dragAndDrop: false,
20
+ keyboardSupport: true,
21
+ nodeClass: Node,
22
+ onCanMove: undefined, // Can this node be moved?
23
+ onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)
24
+ onCanSelectNode: undefined,
25
+ onCreateLi: undefined,
26
+ onDragMove: undefined,
27
+ onDragStop: undefined,
28
+ onGetStateFromStorage: undefined,
29
+ onIsMoveHandle: undefined,
30
+ onSetStateFromStorage: undefined,
31
+ openedIcon: undefined,
32
+ openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds
33
+ // The symbol to use for an open node - ▼ BLACK DOWN-POINTING TRIANGLE
34
+ // http://www.fileformat.info/info/unicode/char/25bc/index.htm
35
+ rtl: undefined, // right-to-left support; true / false (default)
36
+ saveState: false, // true / false / string (local storage key; the default key is "tree")
37
+ selectable: true,
38
+ showEmptyFolder: false,
39
+ slide: true, // must display slide animation?
40
+ startDndDelay: 300, // The delay for starting dnd (in milliseconds)
41
+ tabIndex: 0,
42
+ treeClassName: undefined, // the class of the root element; the default is classPrefix
43
+ useContextMenu: true,
44
+ };
45
+
46
+ const setDefaultOptions = (htmlElement: HTMLElement, inputOptions: Partial<TreeElementOptions>): TreeElementOptions => {
47
+ const options = { ...defaults, ...inputOptions };
48
+
49
+ options.dataUrl ??= htmlElement.dataset.url;
50
+ options.rtl ??= getRtlOptionFromHTMLElement(htmlElement);
51
+ options.closedIcon ??= getDefaultClosedIcon(options);
52
+ options.openedIcon ??= "&#x25bc;";
53
+
54
+ return options;
55
+ }
56
+
57
+ const getDefaultClosedIcon = (options: TreeElementOptions): string => {
58
+ if (options.rtl) {
59
+ // triangle to the left
60
+ return "&#x25c0;";
61
+ } else {
62
+ // triangle to the right
63
+ return "&#x25ba;";
64
+ }
65
+ }
66
+
67
+ const getRtlOptionFromHTMLElement = (htmlElement: HTMLElement): boolean => {
68
+ const dataRtl = htmlElement.dataset.rtl;
69
+
70
+ if (dataRtl == "") {
71
+ return true;
72
+ } else if (dataRtl === "false") {
73
+ return false;
74
+ } else {
75
+ return Boolean(dataRtl);
76
+ }
77
+ }
78
+
79
+ export default setDefaultOptions;
@@ -0,0 +1,14 @@
1
+ // Trigger a CustomEvent. Return if the event is processed (true) or cancelled (false).
2
+ const triggerCustomEvent = (element: HTMLElement, eventName: string, values?: Record<string, unknown>): boolean => {
3
+ const event = new CustomEvent(eventName, {
4
+ bubbles: true,
5
+ cancelable: true,
6
+ detail: values,
7
+ });
8
+
9
+ element.dispatchEvent(event);
10
+
11
+ return !event.defaultPrevented;
12
+ }
13
+
14
+ export default triggerCustomEvent;
package/src/util.ts ADDED
@@ -0,0 +1,5 @@
1
+ export const isInt = (n: unknown): boolean =>
2
+ typeof n === "number" && n % 1 === 0;
3
+
4
+ export const getBoolString = (value: unknown): string =>
5
+ value ? "true" : "false";
package/src/version.ts ADDED
@@ -0,0 +1,4 @@
1
+ // Generated by config/generateVersion.mjs. Do not edit.
2
+ const version = "0.1.0";
3
+
4
+ export default version;
@@ -0,0 +1,195 @@
1
+ ul.tree-element {
2
+ list-style: none outside;
3
+ margin-left: 0;
4
+ margin-bottom: 0;
5
+ padding: 0;
6
+
7
+ &.tree-element-dnd {
8
+ touch-action: none;
9
+ }
10
+
11
+ ul.tree-element-common {
12
+ list-style: none outside;
13
+ margin-left: 12px;
14
+ margin-right: 0;
15
+ margin-bottom: 0;
16
+ padding: 0;
17
+ display: block;
18
+ }
19
+
20
+ li.tree-element-closed > ul.tree-element-common {
21
+ display: none;
22
+ }
23
+
24
+ li.tree-element-common {
25
+ clear: both;
26
+ list-style-type: none;
27
+ }
28
+
29
+ .tree-element-toggler {
30
+ border-bottom: none;
31
+ color: #333;
32
+ text-decoration: none;
33
+ vertical-align: middle;
34
+
35
+ &:hover {
36
+ color: #000;
37
+ text-decoration: none;
38
+ }
39
+
40
+ &.tree-element-closed {
41
+ background-position: 0 0;
42
+ }
43
+
44
+ &.tree-element-toggler-left {
45
+ margin-right: 0.5em;
46
+ }
47
+
48
+ &.tree-element-toggler-right {
49
+ margin-left: 0.5em;
50
+ }
51
+ }
52
+
53
+ .tree-element-element {
54
+ cursor: pointer;
55
+ position: relative;
56
+ display: flex;
57
+
58
+ &:has(.tree-element-title-button-right) {
59
+ display: block;
60
+ }
61
+ }
62
+
63
+ .tree-element-title {
64
+ color: #1c4257;
65
+ vertical-align: middle;
66
+ }
67
+
68
+ .tree-element-title-button-left {
69
+ margin-left: 1.5em;
70
+
71
+ &.tree-element-title-folder {
72
+ margin-left: 0;
73
+ }
74
+ }
75
+
76
+ li.tree-element-folder {
77
+ margin-bottom: 4px;
78
+
79
+ &.tree-element-closed {
80
+ margin-bottom: 1px;
81
+ }
82
+ }
83
+
84
+ li.tree-element-ghost {
85
+ position: relative;
86
+ z-index: 10;
87
+ margin-right: 10px;
88
+
89
+ span {
90
+ display: block;
91
+ }
92
+
93
+ span.tree-element-circle {
94
+ border: solid 2px #0000ff;
95
+ border-radius: 100px;
96
+ height: 8px;
97
+ width: 8px;
98
+ position: absolute;
99
+ top: -4px;
100
+ left: -6px;
101
+ box-sizing: border-box;
102
+ }
103
+
104
+ span.tree-element-line {
105
+ background-color: #0000ff;
106
+ height: 2px;
107
+ padding: 0;
108
+ position: absolute;
109
+ top: -1px;
110
+ left: 2px;
111
+ width: 100%;
112
+ }
113
+
114
+ &.tree-element-inside {
115
+ margin-left: 48px;
116
+ }
117
+ }
118
+
119
+ span.tree-element-border {
120
+ position: absolute;
121
+ display: block;
122
+ left: -2px;
123
+ top: 0;
124
+ border: solid 2px #0000ff;
125
+ border-radius: 6px;
126
+ margin: 0;
127
+ box-sizing: content-box;
128
+ }
129
+
130
+ li.tree-element-selected > .tree-element-element,
131
+ li.tree-element-selected > .tree-element-element:hover {
132
+ background-color: #97bdd6;
133
+ background: linear-gradient(#bee0f5, #89afca);
134
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7);
135
+ }
136
+
137
+ .tree-element-moving > .tree-element-element .tree-element-title {
138
+ outline: dashed 1px #0000ff;
139
+ }
140
+ }
141
+
142
+ ul.tree-element.tree-element-rtl {
143
+ direction: rtl;
144
+
145
+ ul.tree-element-common {
146
+ margin-left: 0;
147
+ margin-right: 12px;
148
+ }
149
+
150
+ .tree-element-toggler {
151
+ margin-left: 0.5em;
152
+ margin-right: 0;
153
+ }
154
+
155
+ .tree-element-title {
156
+ margin-left: 0;
157
+ margin-right: 1.5em;
158
+
159
+ &.tree-element-title-folder {
160
+ margin-right: 0;
161
+ }
162
+ }
163
+
164
+ li.tree-element-ghost {
165
+ margin-right: 0;
166
+ margin-left: 10px;
167
+
168
+ span.tree-element-circle {
169
+ right: -6px;
170
+ }
171
+
172
+ span.tree-element-line {
173
+ right: 2px;
174
+ }
175
+
176
+ &.tree-element-inside {
177
+ margin-left: 0;
178
+ margin-right: 48px;
179
+ }
180
+ }
181
+
182
+ span.tree-element-border {
183
+ right: -2px;
184
+ }
185
+ }
186
+
187
+ span.tree-element-dragging {
188
+ color: #fff;
189
+ background: #000;
190
+ opacity: 0.6;
191
+ cursor: pointer;
192
+ padding: 2px 8px;
193
+ }
194
+
195
+ /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNzcy90cmVlX2VsZW1lbnQucG9zdGNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiJ0cmVlX2VsZW1lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsidWwudHJlZS1lbGVtZW50IHtcbiAgbGlzdC1zdHlsZTogbm9uZSBvdXRzaWRlO1xuICBtYXJnaW4tbGVmdDogMDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgcGFkZGluZzogMDtcblxuICAmLnRyZWUtZWxlbWVudC1kbmQge1xuICAgIHRvdWNoLWFjdGlvbjogbm9uZTtcbiAgfVxuXG4gIHVsLnRyZWUtZWxlbWVudC1jb21tb24ge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmUgb3V0c2lkZTtcbiAgICBtYXJnaW4tbGVmdDogMTJweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgbGkudHJlZS1lbGVtZW50LWNsb3NlZCA+IHVsLnRyZWUtZWxlbWVudC1jb21tb24ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICBsaS50cmVlLWVsZW1lbnQtY29tbW9uIHtcbiAgICBjbGVhcjogYm90aDtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIH1cblxuICAudHJlZS1lbGVtZW50LXRvZ2dsZXIge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgY29sb3I6ICMzMzM7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiAjMDAwO1xuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIH1cblxuICAgICYudHJlZS1lbGVtZW50LWNsb3NlZCB7XG4gICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7XG4gICAgfVxuXG4gICAgJi50cmVlLWVsZW1lbnQtdG9nZ2xlci1sZWZ0IHtcbiAgICAgIG1hcmdpbi1yaWdodDogMC41ZW07XG4gICAgfVxuXG4gICAgJi50cmVlLWVsZW1lbnQtdG9nZ2xlci1yaWdodCB7XG4gICAgICBtYXJnaW4tbGVmdDogMC41ZW07XG4gICAgfVxuICB9XG5cbiAgLnRyZWUtZWxlbWVudC1lbGVtZW50IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG5cbiAgICAmOmhhcygudHJlZS1lbGVtZW50LXRpdGxlLWJ1dHRvbi1yaWdodCkge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICB9XG5cbiAgLnRyZWUtZWxlbWVudC10aXRsZSB7XG4gICAgY29sb3I6ICMxYzQyNTc7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgfVxuXG4gIC50cmVlLWVsZW1lbnQtdGl0bGUtYnV0dG9uLWxlZnQge1xuICAgIG1hcmdpbi1sZWZ0OiAxLjVlbTtcblxuICAgICYudHJlZS1lbGVtZW50LXRpdGxlLWZvbGRlciB7XG4gICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICB9XG4gIH1cblxuICBsaS50cmVlLWVsZW1lbnQtZm9sZGVyIHtcbiAgICBtYXJnaW4tYm90dG9tOiA0cHg7XG5cbiAgICAmLnRyZWUtZWxlbWVudC1jbG9zZWQge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMXB4O1xuICAgIH1cbiAgfVxuXG4gIGxpLnRyZWUtZWxlbWVudC1naG9zdCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDEwO1xuICAgIG1hcmdpbi1yaWdodDogMTBweDtcblxuICAgIHNwYW4ge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuXG4gICAgc3Bhbi50cmVlLWVsZW1lbnQtY2lyY2xlIHtcbiAgICAgIGJvcmRlcjogc29saWQgMnB4ICMwMDAwZmY7XG4gICAgICBib3JkZXItcmFkaXVzOiAxMDBweDtcbiAgICAgIGhlaWdodDogOHB4O1xuICAgICAgd2lkdGg6IDhweDtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogLTRweDtcbiAgICAgIGxlZnQ6IC02cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIHNwYW4udHJlZS1lbGVtZW50LWxpbmUge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDBmZjtcbiAgICAgIGhlaWdodDogMnB4O1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogLTFweDtcbiAgICAgIGxlZnQ6IDJweDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgICYudHJlZS1lbGVtZW50LWluc2lkZSB7XG4gICAgICBtYXJnaW4tbGVmdDogNDhweDtcbiAgICB9XG4gIH1cblxuICBzcGFuLnRyZWUtZWxlbWVudC1ib3JkZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBsZWZ0OiAtMnB4O1xuICAgIHRvcDogMDtcbiAgICBib3JkZXI6IHNvbGlkIDJweCAjMDAwMGZmO1xuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICBtYXJnaW46IDA7XG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIH1cblxuICBsaS50cmVlLWVsZW1lbnQtc2VsZWN0ZWQgPiAudHJlZS1lbGVtZW50LWVsZW1lbnQsXG4gIGxpLnRyZWUtZWxlbWVudC1zZWxlY3RlZCA+IC50cmVlLWVsZW1lbnQtZWxlbWVudDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk3YmRkNjtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2JlZTBmNSwgIzg5YWZjYSk7XG4gICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICB9XG5cbiAgLnRyZWUtZWxlbWVudC1tb3ZpbmcgPiAudHJlZS1lbGVtZW50LWVsZW1lbnQgLnRyZWUtZWxlbWVudC10aXRsZSB7XG4gICAgb3V0bGluZTogZGFzaGVkIDFweCAjMDAwMGZmO1xuICB9XG59XG5cbnVsLnRyZWUtZWxlbWVudC50cmVlLWVsZW1lbnQtcnRsIHtcbiAgZGlyZWN0aW9uOiBydGw7XG5cbiAgdWwudHJlZS1lbGVtZW50LWNvbW1vbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAxMnB4O1xuICB9XG5cbiAgLnRyZWUtZWxlbWVudC10b2dnbGVyIHtcbiAgICBtYXJnaW4tbGVmdDogMC41ZW07XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICB9XG5cbiAgLnRyZWUtZWxlbWVudC10aXRsZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAxLjVlbTtcblxuICAgICYudHJlZS1lbGVtZW50LXRpdGxlLWZvbGRlciB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgfVxuICB9XG5cbiAgbGkudHJlZS1lbGVtZW50LWdob3N0IHtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG5cbiAgICBzcGFuLnRyZWUtZWxlbWVudC1jaXJjbGUge1xuICAgICAgcmlnaHQ6IC02cHg7XG4gICAgfVxuXG4gICAgc3Bhbi50cmVlLWVsZW1lbnQtbGluZSB7XG4gICAgICByaWdodDogMnB4O1xuICAgIH1cblxuICAgICYudHJlZS1lbGVtZW50LWluc2lkZSB7XG4gICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICAgIG1hcmdpbi1yaWdodDogNDhweDtcbiAgICB9XG4gIH1cblxuICBzcGFuLnRyZWUtZWxlbWVudC1ib3JkZXIge1xuICAgIHJpZ2h0OiAtMnB4O1xuICB9XG59XG5cbnNwYW4udHJlZS1lbGVtZW50LWRyYWdnaW5nIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQ6ICMwMDA7XG4gIG9wYWNpdHk6IDAuNjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAycHggOHB4O1xufVxuIl19 */