@ngstarter-ui/components 21.0.24 → 21.0.26

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 (107) hide show
  1. package/ai/component-registry.json +78 -15
  2. package/fesm2022/ngstarter-ui-components-avatar.mjs +3 -3
  3. package/fesm2022/ngstarter-ui-components-avatar.mjs.map +1 -1
  4. package/fesm2022/ngstarter-ui-components-badge.mjs +1 -2
  5. package/fesm2022/ngstarter-ui-components-badge.mjs.map +1 -1
  6. package/fesm2022/ngstarter-ui-components-breadcrumbs.mjs +0 -2
  7. package/fesm2022/ngstarter-ui-components-breadcrumbs.mjs.map +1 -1
  8. package/fesm2022/ngstarter-ui-components-button-toggle.mjs +1 -1
  9. package/fesm2022/ngstarter-ui-components-button-toggle.mjs.map +1 -1
  10. package/fesm2022/ngstarter-ui-components-button.mjs +2 -2
  11. package/fesm2022/ngstarter-ui-components-button.mjs.map +1 -1
  12. package/fesm2022/ngstarter-ui-components-calendar.mjs +1 -1
  13. package/fesm2022/ngstarter-ui-components-calendar.mjs.map +1 -1
  14. package/fesm2022/ngstarter-ui-components-card-overlay.mjs +0 -1
  15. package/fesm2022/ngstarter-ui-components-card-overlay.mjs.map +1 -1
  16. package/fesm2022/ngstarter-ui-components-card.mjs +7 -12
  17. package/fesm2022/ngstarter-ui-components-card.mjs.map +1 -1
  18. package/fesm2022/ngstarter-ui-components-carousel.mjs +0 -3
  19. package/fesm2022/ngstarter-ui-components-carousel.mjs.map +1 -1
  20. package/fesm2022/ngstarter-ui-components-chips.mjs +13 -16
  21. package/fesm2022/ngstarter-ui-components-chips.mjs.map +1 -1
  22. package/fesm2022/ngstarter-ui-components-code-highlighter.mjs +4 -1
  23. package/fesm2022/ngstarter-ui-components-code-highlighter.mjs.map +1 -1
  24. package/fesm2022/ngstarter-ui-components-command-bar.mjs +2 -2
  25. package/fesm2022/ngstarter-ui-components-command-bar.mjs.map +1 -1
  26. package/fesm2022/ngstarter-ui-components-comment-editor.mjs +4 -16
  27. package/fesm2022/ngstarter-ui-components-comment-editor.mjs.map +1 -1
  28. package/fesm2022/{ngstarter-ui-components-content-editor-code-block.component-Czb0bvcr.mjs → ngstarter-ui-components-content-editor-code-block.component-CKrOhA7h.mjs} +2 -2
  29. package/fesm2022/{ngstarter-ui-components-content-editor-code-block.component-Czb0bvcr.mjs.map → ngstarter-ui-components-content-editor-code-block.component-CKrOhA7h.mjs.map} +1 -1
  30. package/fesm2022/{ngstarter-ui-components-content-editor-embed-block-c8Pq0Jdq.mjs → ngstarter-ui-components-content-editor-embed-block-zSApBzF3.mjs} +2 -2
  31. package/fesm2022/{ngstarter-ui-components-content-editor-embed-block-c8Pq0Jdq.mjs.map → ngstarter-ui-components-content-editor-embed-block-zSApBzF3.mjs.map} +1 -1
  32. package/fesm2022/{ngstarter-ui-components-content-editor-heading-block.component-CT5g3MLZ.mjs → ngstarter-ui-components-content-editor-heading-block.component-Dv8d0nCy.mjs} +2 -2
  33. package/fesm2022/{ngstarter-ui-components-content-editor-heading-block.component-CT5g3MLZ.mjs.map → ngstarter-ui-components-content-editor-heading-block.component-Dv8d0nCy.mjs.map} +1 -1
  34. package/fesm2022/{ngstarter-ui-components-content-editor-image-block.component-Cp_Yo7zI.mjs → ngstarter-ui-components-content-editor-image-block.component-g-H7a5Z_.mjs} +2 -2
  35. package/fesm2022/{ngstarter-ui-components-content-editor-image-block.component-Cp_Yo7zI.mjs.map → ngstarter-ui-components-content-editor-image-block.component-g-H7a5Z_.mjs.map} +1 -1
  36. package/fesm2022/{ngstarter-ui-components-content-editor-list-block.component-BvineUWy.mjs → ngstarter-ui-components-content-editor-list-block.component-PgqisgxY.mjs} +2 -2
  37. package/fesm2022/{ngstarter-ui-components-content-editor-list-block.component-BvineUWy.mjs.map → ngstarter-ui-components-content-editor-list-block.component-PgqisgxY.mjs.map} +1 -1
  38. package/fesm2022/{ngstarter-ui-components-content-editor-ngstarter-ui-components-content-editor-4_TqxgpH.mjs → ngstarter-ui-components-content-editor-ngstarter-ui-components-content-editor-BuMm25ea.mjs} +12 -13
  39. package/fesm2022/ngstarter-ui-components-content-editor-ngstarter-ui-components-content-editor-BuMm25ea.mjs.map +1 -0
  40. package/fesm2022/{ngstarter-ui-components-content-editor-paragraph-block.component-sH44U1I8.mjs → ngstarter-ui-components-content-editor-paragraph-block.component-DS_6CzuA.mjs} +2 -2
  41. package/fesm2022/{ngstarter-ui-components-content-editor-paragraph-block.component-sH44U1I8.mjs.map → ngstarter-ui-components-content-editor-paragraph-block.component-DS_6CzuA.mjs.map} +1 -1
  42. package/fesm2022/{ngstarter-ui-components-content-editor-quote-block.component-CA3KoZ-u.mjs → ngstarter-ui-components-content-editor-quote-block.component-Df92Nqvp.mjs} +2 -2
  43. package/fesm2022/{ngstarter-ui-components-content-editor-quote-block.component-CA3KoZ-u.mjs.map → ngstarter-ui-components-content-editor-quote-block.component-Df92Nqvp.mjs.map} +1 -1
  44. package/fesm2022/{ngstarter-ui-components-content-editor-table-block.component-GTZiYUjU.mjs → ngstarter-ui-components-content-editor-table-block.component-D4rdPkGz.mjs} +2 -2
  45. package/fesm2022/{ngstarter-ui-components-content-editor-table-block.component-GTZiYUjU.mjs.map → ngstarter-ui-components-content-editor-table-block.component-D4rdPkGz.mjs.map} +1 -1
  46. package/fesm2022/{ngstarter-ui-components-content-editor-video-block.component-CzMZ1s6C.mjs → ngstarter-ui-components-content-editor-video-block.component-DqS9Lhp_.mjs} +2 -2
  47. package/fesm2022/{ngstarter-ui-components-content-editor-video-block.component-CzMZ1s6C.mjs.map → ngstarter-ui-components-content-editor-video-block.component-DqS9Lhp_.mjs.map} +1 -1
  48. package/fesm2022/ngstarter-ui-components-content-editor.mjs +1 -1
  49. package/fesm2022/ngstarter-ui-components-core.mjs +0 -9
  50. package/fesm2022/ngstarter-ui-components-core.mjs.map +1 -1
  51. package/fesm2022/ngstarter-ui-components-country-select.mjs +11 -11
  52. package/fesm2022/ngstarter-ui-components-country-select.mjs.map +1 -1
  53. package/fesm2022/ngstarter-ui-components-data-view.mjs +0 -3
  54. package/fesm2022/ngstarter-ui-components-data-view.mjs.map +1 -1
  55. package/fesm2022/ngstarter-ui-components-datepicker.mjs +21 -17
  56. package/fesm2022/ngstarter-ui-components-datepicker.mjs.map +1 -1
  57. package/fesm2022/ngstarter-ui-components-dialog.mjs +0 -1
  58. package/fesm2022/ngstarter-ui-components-dialog.mjs.map +1 -1
  59. package/fesm2022/ngstarter-ui-components-empty-state.mjs +6 -6
  60. package/fesm2022/ngstarter-ui-components-empty-state.mjs.map +1 -1
  61. package/fesm2022/ngstarter-ui-components-expansion.mjs +6 -6
  62. package/fesm2022/ngstarter-ui-components-expansion.mjs.map +1 -1
  63. package/fesm2022/ngstarter-ui-components-filter-builder.mjs +0 -3
  64. package/fesm2022/ngstarter-ui-components-filter-builder.mjs.map +1 -1
  65. package/fesm2022/ngstarter-ui-components-form-field.mjs +4 -4
  66. package/fesm2022/ngstarter-ui-components-form-field.mjs.map +1 -1
  67. package/fesm2022/{ngstarter-ui-components-form-renderer-autocomplete-many-field-BLhfO1zC.mjs → ngstarter-ui-components-form-renderer-autocomplete-many-field-CGQ3pJaG.mjs} +2 -2
  68. package/fesm2022/{ngstarter-ui-components-form-renderer-autocomplete-many-field-BLhfO1zC.mjs.map → ngstarter-ui-components-form-renderer-autocomplete-many-field-CGQ3pJaG.mjs.map} +1 -1
  69. package/fesm2022/{ngstarter-ui-components-form-renderer-datepicker-field-DRSVe0gK.mjs → ngstarter-ui-components-form-renderer-datepicker-field-Cf3jfPv7.mjs} +2 -2
  70. package/fesm2022/{ngstarter-ui-components-form-renderer-datepicker-field-DRSVe0gK.mjs.map → ngstarter-ui-components-form-renderer-datepicker-field-Cf3jfPv7.mjs.map} +1 -1
  71. package/fesm2022/{ngstarter-ui-components-form-renderer-input-field-DpGLKZjz.mjs → ngstarter-ui-components-form-renderer-input-field-tZHU8-_L.mjs} +2 -2
  72. package/fesm2022/{ngstarter-ui-components-form-renderer-input-field-DpGLKZjz.mjs.map → ngstarter-ui-components-form-renderer-input-field-tZHU8-_L.mjs.map} +1 -1
  73. package/fesm2022/{ngstarter-ui-components-form-renderer-radio-group-field-DUCSU3iT.mjs → ngstarter-ui-components-form-renderer-radio-group-field-lc1V-NeL.mjs} +2 -2
  74. package/fesm2022/{ngstarter-ui-components-form-renderer-radio-group-field-DUCSU3iT.mjs.map → ngstarter-ui-components-form-renderer-radio-group-field-lc1V-NeL.mjs.map} +1 -1
  75. package/fesm2022/{ngstarter-ui-components-form-renderer-select-field-CCbpYyZo.mjs → ngstarter-ui-components-form-renderer-select-field-DyBidcIU.mjs} +2 -2
  76. package/fesm2022/{ngstarter-ui-components-form-renderer-select-field-CCbpYyZo.mjs.map → ngstarter-ui-components-form-renderer-select-field-DyBidcIU.mjs.map} +1 -1
  77. package/fesm2022/{ngstarter-ui-components-form-renderer-textarea-field-D89GlMDO.mjs → ngstarter-ui-components-form-renderer-textarea-field-DxbPsw3z.mjs} +2 -2
  78. package/fesm2022/{ngstarter-ui-components-form-renderer-textarea-field-D89GlMDO.mjs.map → ngstarter-ui-components-form-renderer-textarea-field-DxbPsw3z.mjs.map} +1 -1
  79. package/fesm2022/{ngstarter-ui-components-form-renderer-timezone-field-C9wz7zPg.mjs → ngstarter-ui-components-form-renderer-timezone-field-DAWrM-jS.mjs} +2 -2
  80. package/fesm2022/{ngstarter-ui-components-form-renderer-timezone-field-C9wz7zPg.mjs.map → ngstarter-ui-components-form-renderer-timezone-field-DAWrM-jS.mjs.map} +1 -1
  81. package/fesm2022/ngstarter-ui-components-form-renderer.mjs +9 -9
  82. package/fesm2022/ngstarter-ui-components-form-renderer.mjs.map +1 -1
  83. package/fesm2022/ngstarter-ui-components-guided-tour.mjs +4 -5
  84. package/fesm2022/ngstarter-ui-components-guided-tour.mjs.map +1 -1
  85. package/fesm2022/ngstarter-ui-components-headless-stepper.mjs +2 -2
  86. package/fesm2022/ngstarter-ui-components-headless-stepper.mjs.map +1 -1
  87. package/fesm2022/ngstarter-ui-components-icon.mjs +1 -1
  88. package/fesm2022/ngstarter-ui-components-icon.mjs.map +1 -1
  89. package/fesm2022/ngstarter-ui-components-image-designer.mjs +1 -1
  90. package/fesm2022/ngstarter-ui-components-image-designer.mjs.map +1 -1
  91. package/fesm2022/ngstarter-ui-components-marquee.mjs +78 -8
  92. package/fesm2022/ngstarter-ui-components-marquee.mjs.map +1 -1
  93. package/fesm2022/ngstarter-ui-components-notifications.mjs +55 -29
  94. package/fesm2022/ngstarter-ui-components-notifications.mjs.map +1 -1
  95. package/fesm2022/ngstarter-ui-components-tree.mjs +851 -36
  96. package/fesm2022/ngstarter-ui-components-tree.mjs.map +1 -1
  97. package/package.json +1 -1
  98. package/types/ngstarter-ui-components-card.d.ts +1 -1
  99. package/types/ngstarter-ui-components-chips.d.ts +2 -2
  100. package/types/ngstarter-ui-components-datepicker.d.ts +6 -6
  101. package/types/ngstarter-ui-components-expansion.d.ts +2 -2
  102. package/types/ngstarter-ui-components-form-field.d.ts +2 -2
  103. package/types/ngstarter-ui-components-guided-tour.d.ts +1 -1
  104. package/types/ngstarter-ui-components-marquee.d.ts +19 -11
  105. package/types/ngstarter-ui-components-notifications.d.ts +21 -8
  106. package/types/ngstarter-ui-components-tree.d.ts +148 -24
  107. package/fesm2022/ngstarter-ui-components-content-editor-ngstarter-ui-components-content-editor-4_TqxgpH.mjs.map +0 -1
@@ -1,6 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ViewContainerRef, Directive, viewChild, ChangeDetectionStrategy, Component, input, numberAttribute, booleanAttribute, HostAttributeToken, effect } from '@angular/core';
2
+ import { inject, ViewContainerRef, Directive, input, booleanAttribute, output, signal, ViewChild, ChangeDetectionStrategy, Component, createComponent, ElementRef, Renderer2, ApplicationRef, EnvironmentInjector, PLATFORM_ID, numberAttribute, HostAttributeToken, effect } from '@angular/core';
3
3
  import { CDK_TREE_NODE_OUTLET_NODE, CdkTreeNodeOutlet, CdkTree, CdkTreeNode, CdkNestedTreeNode, CdkTreeNodePadding, CdkTreeNodeToggle, CdkTreeNodeDef } from '@angular/cdk/tree';
4
+ import { isPlatformBrowser } from '@angular/common';
5
+ import { Checkbox } from '@ngstarter-ui/components/checkbox';
4
6
 
5
7
  class TreeNodeOutlet {
6
8
  viewContainer = inject(ViewContainerRef);
@@ -27,11 +29,443 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
27
29
  }]
28
30
  }] });
29
31
  class Tree extends CdkTree {
30
- // Outlets within the tree's template where the dataNodes will be inserted.
31
- // We need an initializer here to avoid a TS error. The value will be set in `ngAfterViewInit`.
32
- _nodeOutlet = viewChild(TreeNodeOutlet);
32
+ checkable = input(false, { ...(ngDevMode ? { debugName: "checkable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
33
+ selectable = input(false, { ...(ngDevMode ? { debugName: "selectable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
34
+ draggable = input(false, { ...(ngDevMode ? { debugName: "draggable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
35
+ childrenKey = input('children', ...(ngDevMode ? [{ debugName: "childrenKey" }] : /* istanbul ignore next */ []));
36
+ checkedChange = output();
37
+ selectedChange = output();
38
+ nodeDrop = output();
39
+ _checkStateVersion = signal(0, ...(ngDevMode ? [{ debugName: "_checkStateVersion" }] : /* istanbul ignore next */ []));
40
+ _selectedKey = signal(undefined, ...(ngDevMode ? [{ debugName: "_selectedKey" }] : /* istanbul ignore next */ []));
41
+ _dropTargetKey = signal(undefined, ...(ngDevMode ? [{ debugName: "_dropTargetKey" }] : /* istanbul ignore next */ []));
42
+ _dropTargetPosition = signal(undefined, ...(ngDevMode ? [{ debugName: "_dropTargetPosition" }] : /* istanbul ignore next */ []));
43
+ _checkedKeys = new Set();
44
+ _nodeValueByDataKey = new Map();
45
+ _disabledDataKeys = new Set();
46
+ _enabledDataKeys = new Set();
47
+ _draggedNode;
48
+ _nodeOutlet = undefined;
49
+ _toggleNodeChecked(node, checked) {
50
+ if (this._isNodeDisabled(node)) {
51
+ return;
52
+ }
53
+ const nodes = [node, ...this._getCheckableDescendants(node)].filter(item => !this._isNodeDisabled(item));
54
+ for (const item of nodes) {
55
+ const key = this._getCheckableNodeKey(item);
56
+ if (checked) {
57
+ this._checkedKeys.add(key);
58
+ }
59
+ else {
60
+ this._checkedKeys.delete(key);
61
+ }
62
+ }
63
+ this._syncCheckedParentKeys();
64
+ this._checkStateVersion.update(value => value + 1);
65
+ this.checkedChange.emit(this._getCheckedValues());
66
+ }
67
+ _isNodeChecked(node) {
68
+ if (this._isNodeDisabled(node)) {
69
+ return false;
70
+ }
71
+ const descendants = this._getCheckableDescendants(node).filter(item => !this._isNodeDisabled(item));
72
+ if (!descendants.length) {
73
+ return this._checkedKeys.has(this._getCheckableNodeKey(node));
74
+ }
75
+ return descendants.every(item => this._checkedKeys.has(this._getCheckableNodeKey(item)));
76
+ }
77
+ _isNodeIndeterminate(node) {
78
+ if (this._isNodeDisabled(node)) {
79
+ return false;
80
+ }
81
+ const descendants = this._getCheckableDescendants(node).filter(item => !this._isNodeDisabled(item));
82
+ if (!descendants.length) {
83
+ return false;
84
+ }
85
+ const selectedCount = descendants.filter(item => this._checkedKeys.has(this._getCheckableNodeKey(item))).length;
86
+ return selectedCount > 0 && selectedCount < descendants.length;
87
+ }
88
+ _selectNode(node) {
89
+ if (this._isNodeDisabled(node)) {
90
+ return;
91
+ }
92
+ const value = this._getTreeNodeValue(node);
93
+ if (Object.is(this._selectedKey(), value)) {
94
+ return;
95
+ }
96
+ this._selectedKey.set(value);
97
+ this.selectedChange.emit(value);
98
+ }
99
+ _isNodeSelected(node) {
100
+ return !this._isNodeDisabled(node) && Object.is(this._selectedKey(), this._getTreeNodeValue(node));
101
+ }
102
+ _canDragNode(node) {
103
+ return node !== undefined && this.draggable() && !this._isNodeDisabled(node);
104
+ }
105
+ _isNodeDropTarget(node) {
106
+ return node !== undefined && Object.is(this._dropTargetKey(), this._getTreeNodeDataKey(node));
107
+ }
108
+ _isNodeDropTargetPosition(node, position) {
109
+ return this._isNodeDropTarget(node) && this._dropTargetPosition() === position;
110
+ }
111
+ _startNodeDrag(node, event) {
112
+ if (!this._canDragNode(node)) {
113
+ event.preventDefault();
114
+ return;
115
+ }
116
+ this._draggedNode = node;
117
+ if (event.dataTransfer) {
118
+ event.dataTransfer.effectAllowed = 'move';
119
+ event.dataTransfer.setData('text/plain', String(this._getTreeNodeValue(node) ?? ''));
120
+ }
121
+ }
122
+ _dragNodeOver(node, event) {
123
+ const position = this._getDropPosition(event);
124
+ if (!this._canDropNode(node, position)) {
125
+ return;
126
+ }
127
+ event.preventDefault();
128
+ event.stopPropagation();
129
+ if (event.dataTransfer) {
130
+ event.dataTransfer.dropEffect = 'move';
131
+ }
132
+ this._dropTargetKey.set(this._getTreeNodeDataKey(node));
133
+ this._dropTargetPosition.set(position);
134
+ }
135
+ _dragNodeLeave(node, event) {
136
+ event.stopPropagation();
137
+ if (Object.is(this._dropTargetKey(), this._getTreeNodeDataKey(node))) {
138
+ this._dropTargetKey.set(undefined);
139
+ this._dropTargetPosition.set(undefined);
140
+ }
141
+ }
142
+ _dropNodeInto(node, event) {
143
+ const position = this._dropTargetPosition() ?? this._getDropPosition(event);
144
+ if (!this._canDropNode(node, position)) {
145
+ return;
146
+ }
147
+ event.preventDefault();
148
+ event.stopPropagation();
149
+ const source = this._draggedNode;
150
+ const moved = this._moveNode(source, node, position);
151
+ this._clearNodeDrag();
152
+ if (moved) {
153
+ this.nodeDrop.emit({
154
+ source,
155
+ target: node,
156
+ position,
157
+ sourceValue: this._getTreeNodeValue(source),
158
+ targetValue: this._getTreeNodeValue(node),
159
+ dataSource: this._getRootNodes() ?? [],
160
+ });
161
+ }
162
+ }
163
+ _endNodeDrag() {
164
+ this._clearNodeDrag();
165
+ }
166
+ _registerNodeValue(node, value) {
167
+ const key = this._getTreeNodeDataKey(node);
168
+ this._nodeValueByDataKey.set(key, value);
169
+ }
170
+ _unregisterNodeValueByDataKey(key) {
171
+ this._nodeValueByDataKey.delete(key);
172
+ }
173
+ _registerNodeDisabled(node, disabled) {
174
+ const key = this._getTreeNodeDataKey(node);
175
+ if (disabled) {
176
+ const checkedKey = this._getCheckableNodeKey(node);
177
+ const wasChecked = this._checkedKeys.has(checkedKey);
178
+ this._disabledDataKeys.add(key);
179
+ this._enabledDataKeys.delete(key);
180
+ this._checkedKeys.delete(checkedKey);
181
+ if (Object.is(this._selectedKey(), this._getTreeNodeValue(node))) {
182
+ this._selectedKey.set(undefined);
183
+ this.selectedChange.emit(undefined);
184
+ }
185
+ if (wasChecked) {
186
+ this._syncCheckedParentKeys();
187
+ this._checkStateVersion.update(value => value + 1);
188
+ this.checkedChange.emit(this._getCheckedValues());
189
+ }
190
+ }
191
+ else {
192
+ this._disabledDataKeys.delete(key);
193
+ this._enabledDataKeys.add(key);
194
+ }
195
+ }
196
+ _unregisterNodeDisabledByDataKey(key) {
197
+ this._disabledDataKeys.delete(key);
198
+ this._enabledDataKeys.delete(key);
199
+ }
200
+ _isNodeDisabled(node) {
201
+ const key = this._getTreeNodeDataKey(node);
202
+ if (this._enabledDataKeys.has(key)) {
203
+ return false;
204
+ }
205
+ return this._disabledDataKeys.has(key) || node?.disabled === true;
206
+ }
207
+ _getTreeNodeDataKey(node) {
208
+ return this._getTreeNodeKey(node);
209
+ }
210
+ _getTreeNodeValue(node) {
211
+ const key = this._getTreeNodeDataKey(node);
212
+ return this._nodeValueByDataKey.has(key) ? this._nodeValueByDataKey.get(key) : key;
213
+ }
214
+ _canDropNode(target, position) {
215
+ const source = this._draggedNode;
216
+ return !!source
217
+ && this.draggable()
218
+ && !this._isNodeDisabled(target)
219
+ && !this._isSameNode(source, target)
220
+ && !this._isNodeDescendantOf(target, source);
221
+ }
222
+ _moveNode(source, target, position) {
223
+ const rootNodes = this._getRootNodes();
224
+ if (!rootNodes) {
225
+ return false;
226
+ }
227
+ const moved = position === 'inside'
228
+ ? this._moveNodeInto(source, target, rootNodes)
229
+ : this._moveNodeBeside(source, target, position, rootNodes);
230
+ if (!moved) {
231
+ return false;
232
+ }
233
+ this._refreshTreeData(rootNodes);
234
+ this._syncCheckedParentKeys();
235
+ this._checkStateVersion.update(value => value + 1);
236
+ return true;
237
+ }
238
+ _moveNodeInto(source, target, rootNodes) {
239
+ const sourceLocation = this._removeNodeFrom(rootNodes, source);
240
+ if (!sourceLocation) {
241
+ return false;
242
+ }
243
+ const targetChildren = this._getMutableNodeChildren(target);
244
+ if (!targetChildren) {
245
+ sourceLocation.items.splice(sourceLocation.index, 0, source);
246
+ return false;
247
+ }
248
+ targetChildren.push(source);
249
+ this.expand?.(target);
250
+ return true;
251
+ }
252
+ _moveNodeBeside(source, target, position, rootNodes) {
253
+ const sourceLocation = this._removeNodeFrom(rootNodes, source);
254
+ if (!sourceLocation) {
255
+ return false;
256
+ }
257
+ const targetLocation = this._findNodeLocation(rootNodes, target);
258
+ if (!targetLocation) {
259
+ sourceLocation.items.splice(sourceLocation.index, 0, source);
260
+ return false;
261
+ }
262
+ const insertIndex = position === 'before' ? targetLocation.index : targetLocation.index + 1;
263
+ targetLocation.items.splice(insertIndex, 0, source);
264
+ return true;
265
+ }
266
+ _findNodeLocation(nodes, target) {
267
+ for (let i = 0; i < nodes.length; i++) {
268
+ const node = nodes[i];
269
+ if (this._isSameNode(node, target)) {
270
+ return { items: nodes, index: i };
271
+ }
272
+ const children = this._getDataNodeChildren(node);
273
+ if (Array.isArray(children)) {
274
+ const location = this._findNodeLocation(children, target);
275
+ if (location) {
276
+ return location;
277
+ }
278
+ }
279
+ }
280
+ return undefined;
281
+ }
282
+ _removeNodeFrom(nodes, source) {
283
+ for (let i = 0; i < nodes.length; i++) {
284
+ const node = nodes[i];
285
+ if (this._isSameNode(node, source)) {
286
+ nodes.splice(i, 1);
287
+ return { items: nodes, index: i };
288
+ }
289
+ const children = this._getDataNodeChildren(node);
290
+ if (Array.isArray(children)) {
291
+ const location = this._removeNodeFrom(children, source);
292
+ if (location) {
293
+ return location;
294
+ }
295
+ }
296
+ }
297
+ return undefined;
298
+ }
299
+ _getRootNodes() {
300
+ return Array.isArray(this.dataSource) ? this.dataSource : undefined;
301
+ }
302
+ _getDataNodeChildren(node) {
303
+ const childrenAccessor = this.childrenAccessor;
304
+ const children = childrenAccessor?.(node);
305
+ return Array.isArray(children) ? children : undefined;
306
+ }
307
+ _getMutableNodeChildren(node) {
308
+ const existingChildren = this._getDataNodeChildren(node);
309
+ if (existingChildren?.length) {
310
+ return existingChildren;
311
+ }
312
+ const childrenKey = this.childrenKey();
313
+ const nodeRecord = node;
314
+ if (!nodeRecord || typeof nodeRecord !== 'object') {
315
+ return existingChildren;
316
+ }
317
+ if (!Array.isArray(nodeRecord[childrenKey])) {
318
+ nodeRecord[childrenKey] = [];
319
+ }
320
+ return nodeRecord[childrenKey];
321
+ }
322
+ _refreshTreeData(rootNodes) {
323
+ if (Array.isArray(this.dataSource)) {
324
+ this.dataSource = [];
325
+ this.dataSource = [...rootNodes];
326
+ return;
327
+ }
328
+ this.renderNodeChanges(rootNodes);
329
+ }
330
+ _isNodeDescendantOf(node, maybeAncestor) {
331
+ return this._getCheckableDescendants(maybeAncestor).some(item => this._isSameNode(item, node));
332
+ }
333
+ _isSameNode(first, second) {
334
+ return first === second || Object.is(this._getTreeNodeDataKey(first), this._getTreeNodeDataKey(second));
335
+ }
336
+ _getDropPosition(event) {
337
+ const element = event.currentTarget instanceof HTMLElement
338
+ ? event.currentTarget
339
+ : event.target instanceof HTMLElement
340
+ ? event.target
341
+ : null;
342
+ const rect = element?.getBoundingClientRect();
343
+ if (!rect?.height) {
344
+ return 'inside';
345
+ }
346
+ const relativeY = event.clientY - rect.top;
347
+ if (relativeY < rect.height * 0.25) {
348
+ return 'before';
349
+ }
350
+ if (relativeY > rect.height * 0.75) {
351
+ return 'after';
352
+ }
353
+ return 'inside';
354
+ }
355
+ _clearNodeDrag() {
356
+ this._draggedNode = undefined;
357
+ this._dropTargetKey.set(undefined);
358
+ this._dropTargetPosition.set(undefined);
359
+ }
360
+ _getCheckableDescendants(node) {
361
+ const treeControl = this.treeControl;
362
+ const flatNodes = treeControl?.dataNodes?.length
363
+ ? treeControl.dataNodes
364
+ : (this._keyManagerNodes?.value ?? this._flattenedNodes?.value ?? []);
365
+ if (flatNodes.length && treeControl?.getLevel) {
366
+ const nodeKey = this._getTreeNodeKey(node);
367
+ const startIndex = flatNodes.findIndex(item => (item === node || this._getTreeNodeKey(item) === nodeKey));
368
+ if (startIndex > -1) {
369
+ const descendants = [];
370
+ const level = treeControl.getLevel(flatNodes[startIndex]);
371
+ for (let i = startIndex + 1; i < flatNodes.length && treeControl.getLevel(flatNodes[i]) > level; i++) {
372
+ descendants.push(flatNodes[i]);
373
+ }
374
+ return descendants;
375
+ }
376
+ }
377
+ if (treeControl?.getDescendants) {
378
+ return treeControl.getDescendants(node);
379
+ }
380
+ const childrenAccessor = this.childrenAccessor;
381
+ if (!childrenAccessor) {
382
+ return [];
383
+ }
384
+ const descendants = [];
385
+ const collect = (current) => {
386
+ const children = childrenAccessor(current);
387
+ if (!Array.isArray(children)) {
388
+ return;
389
+ }
390
+ for (const child of children) {
391
+ descendants.push(child);
392
+ collect(child);
393
+ }
394
+ };
395
+ collect(node);
396
+ return descendants;
397
+ }
398
+ _getCheckableNodeKey(node) {
399
+ return this._getTreeNodeValue(node);
400
+ }
401
+ _getCheckedValues() {
402
+ return Array.from(this._checkedKeys);
403
+ }
404
+ _syncCheckedParentKeys() {
405
+ const nodes = this._getCheckableNodes();
406
+ for (let i = nodes.length - 1; i >= 0; i--) {
407
+ const node = nodes[i];
408
+ if (this._isNodeDisabled(node)) {
409
+ this._checkedKeys.delete(this._getCheckableNodeKey(node));
410
+ continue;
411
+ }
412
+ const descendants = this._getCheckableDescendants(node).filter(item => !this._isNodeDisabled(item));
413
+ if (!descendants.length) {
414
+ continue;
415
+ }
416
+ const key = this._getCheckableNodeKey(node);
417
+ if (descendants.every(item => this._checkedKeys.has(this._getCheckableNodeKey(item)))) {
418
+ this._checkedKeys.add(key);
419
+ }
420
+ else {
421
+ this._checkedKeys.delete(key);
422
+ }
423
+ }
424
+ }
425
+ _getCheckableNodes() {
426
+ const treeControl = this.treeControl;
427
+ const flatNodes = treeControl?.dataNodes?.length
428
+ ? treeControl.dataNodes
429
+ : (this._keyManagerNodes?.value ?? this._flattenedNodes?.value ?? []);
430
+ if (flatNodes.length) {
431
+ return flatNodes;
432
+ }
433
+ const data = this.dataSource;
434
+ if (!Array.isArray(data)) {
435
+ return [];
436
+ }
437
+ const childrenAccessor = this.childrenAccessor;
438
+ if (!childrenAccessor) {
439
+ return data;
440
+ }
441
+ const nodes = [];
442
+ const collect = (items) => {
443
+ for (const item of items) {
444
+ nodes.push(item);
445
+ const children = childrenAccessor(item);
446
+ if (Array.isArray(children)) {
447
+ collect(children);
448
+ }
449
+ }
450
+ };
451
+ collect(data);
452
+ return nodes;
453
+ }
454
+ _getTreeNodeKey(node) {
455
+ const treeControl = this.treeControl;
456
+ if (treeControl?.trackBy) {
457
+ return treeControl.trackBy(node);
458
+ }
459
+ if (this.expansionKey) {
460
+ return this.expansionKey(node);
461
+ }
462
+ if (this.trackBy) {
463
+ return this.trackBy(-1, node);
464
+ }
465
+ return node;
466
+ }
33
467
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Tree, deps: null, target: i0.ɵɵFactoryTarget.Component });
34
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.4", type: Tree, isStandalone: true, selector: "ngs-tree", host: { classAttribute: "ngs-tree" }, providers: [{ provide: CdkTree, useExisting: Tree }], viewQueries: [{ propertyName: "_nodeOutlet", first: true, predicate: TreeNodeOutlet, descendants: true, isSignal: true }], exportAs: ["ngsTree"], usesInheritance: true, ngImport: i0, template: `<ng-container ngsTreeNodeOutlet />`, isInline: true, styles: [":host{display:block;background:var(--ngs-tree-container-background-color, transparent)}:host ::ng-deep .ngs-tree-node,:host ::ng-deep .ngs-nested-tree-node{color:var(--ngs-tree-node-text-color, inherit);font-family:var(--ngs-tree-node-text-font, inherit);font-size:var(--ngs-tree-node-text-size, inherit);font-weight:var(--ngs-tree-node-text-weight, inherit)}:host ::ng-deep .ngs-tree-node{display:flex;align-items:center;flex:1;word-wrap:break-word;min-height:var(--ngs-tree-node-min-height, 48px);box-sizing:border-box}:host ::ng-deep .ngs-nested-tree-node{border-bottom-width:0}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: TreeNodeOutlet, selector: "[ngsTreeNodeOutlet]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
468
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: Tree, isStandalone: true, selector: "ngs-tree", inputs: { checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, draggable: { classPropertyName: "draggable", publicName: "draggable", isSignal: true, isRequired: false, transformFunction: null }, childrenKey: { classPropertyName: "childrenKey", publicName: "childrenKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "checkedChange", selectedChange: "selectedChange", nodeDrop: "nodeDrop" }, host: { classAttribute: "ngs-tree" }, providers: [{ provide: CdkTree, useExisting: Tree }], viewQueries: [{ propertyName: "_nodeOutlet", first: true, predicate: TreeNodeOutlet, descendants: true, static: true }], exportAs: ["ngsTree"], usesInheritance: true, ngImport: i0, template: `<ng-container ngsTreeNodeOutlet />`, isInline: true, styles: [":host{--ngs-tree-padding: calc(var(--spacing, .25rem) * 3) 0;--ngs-tree-node-padding: var(--ngs-nav-item-padding);--ngs-tree-node-min-height: var(--ngs-nav-item-height);--ngs-tree-node-hover-bg: var(--ngs-nav-item-hover-bg);--ngs-tree-node-active-bg: var(--ngs-nav-item-active-bg);--ngs-tree-node-active-color: var(--ngs-nav-item-active-color);--ngs-tree-node-disabled-opacity: .38;--ngs-tree-node-title-font-size: 1rem;--ngs-tree-node-font-size: var(--ngs-nav-item-font-size);--ngs-tree-node-gap: var(--ngs-nav-item-gap);--ngs-tree-node-radius: var(--ngs-nav-item-radius);--ngs-tree-node-color: var(--ngs-nav-item-color);--ngs-tree-node-hover-color: var(--ngs-nav-item-hover-color);--ngs-tree-gap: calc(var(--spacing, .25rem) * 1);--ngs-tree-node-line-color: var(--ngs-color-neutral);display:flex;flex-direction:column;gap:var(--ngs-tree-gap);padding:var(--ngs-tree-padding);background:var(--ngs-tree-container-background-color, transparent)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: TreeNodeOutlet, selector: "[ngsTreeNodeOutlet]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
35
469
  }
36
470
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Tree, decorators: [{
37
471
  type: Component,
@@ -39,24 +473,173 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
39
473
  TreeNodeOutlet
40
474
  ], template: `<ng-container ngsTreeNodeOutlet />`, changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: CdkTree, useExisting: Tree }], host: {
41
475
  'class': 'ngs-tree',
42
- }, styles: [":host{display:block;background:var(--ngs-tree-container-background-color, transparent)}:host ::ng-deep .ngs-tree-node,:host ::ng-deep .ngs-nested-tree-node{color:var(--ngs-tree-node-text-color, inherit);font-family:var(--ngs-tree-node-text-font, inherit);font-size:var(--ngs-tree-node-text-size, inherit);font-weight:var(--ngs-tree-node-text-weight, inherit)}:host ::ng-deep .ngs-tree-node{display:flex;align-items:center;flex:1;word-wrap:break-word;min-height:var(--ngs-tree-node-min-height, 48px);box-sizing:border-box}:host ::ng-deep .ngs-nested-tree-node{border-bottom-width:0}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
43
- }], propDecorators: { _nodeOutlet: [{ type: i0.ViewChild, args: [i0.forwardRef(() => TreeNodeOutlet), { isSignal: true }] }] } });
476
+ }, styles: [":host{--ngs-tree-padding: calc(var(--spacing, .25rem) * 3) 0;--ngs-tree-node-padding: var(--ngs-nav-item-padding);--ngs-tree-node-min-height: var(--ngs-nav-item-height);--ngs-tree-node-hover-bg: var(--ngs-nav-item-hover-bg);--ngs-tree-node-active-bg: var(--ngs-nav-item-active-bg);--ngs-tree-node-active-color: var(--ngs-nav-item-active-color);--ngs-tree-node-disabled-opacity: .38;--ngs-tree-node-title-font-size: 1rem;--ngs-tree-node-font-size: var(--ngs-nav-item-font-size);--ngs-tree-node-gap: var(--ngs-nav-item-gap);--ngs-tree-node-radius: var(--ngs-nav-item-radius);--ngs-tree-node-color: var(--ngs-nav-item-color);--ngs-tree-node-hover-color: var(--ngs-nav-item-hover-color);--ngs-tree-gap: calc(var(--spacing, .25rem) * 1);--ngs-tree-node-line-color: var(--ngs-color-neutral);display:flex;flex-direction:column;gap:var(--ngs-tree-gap);padding:var(--ngs-tree-padding);background:var(--ngs-tree-container-background-color, transparent)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
477
+ }], propDecorators: { checkable: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkable", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], draggable: [{ type: i0.Input, args: [{ isSignal: true, alias: "draggable", required: false }] }], childrenKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "childrenKey", required: false }] }], checkedChange: [{ type: i0.Output, args: ["checkedChange"] }], selectedChange: [{ type: i0.Output, args: ["selectedChange"] }], nodeDrop: [{ type: i0.Output, args: ["nodeDrop"] }], _nodeOutlet: [{
478
+ type: ViewChild,
479
+ args: [TreeNodeOutlet, { static: true }]
480
+ }] } });
44
481
 
482
+ const NGS_TREE_NODE_VALUE_UNSET = Symbol('ngs-tree-node-value-unset');
45
483
  function isNoopTreeKeyManager(keyManager) {
46
484
  return !!keyManager._isNoopTreeKeyManager;
47
485
  }
486
+ function isTreeNodeControlClick(event, host) {
487
+ const target = event.target;
488
+ if (!(target instanceof Element)) {
489
+ return false;
490
+ }
491
+ const control = target.closest('.ngs-tree-node-checkbox, [ngsTreeNodeToggle], [ngstreenodetoggle]');
492
+ return !!control && control !== host;
493
+ }
494
+ class TreeNodeCheckbox {
495
+ _node;
496
+ _tree;
497
+ _elementRef;
498
+ _renderer;
499
+ _appRef;
500
+ _environmentInjector;
501
+ _disabled;
502
+ _isReady = false;
503
+ _wrapperElement;
504
+ _componentRef;
505
+ _unlistenClick;
506
+ _unlistenKeydown;
507
+ _changeSubscription;
508
+ constructor(_node, _tree, _elementRef, _renderer, _appRef, _environmentInjector, _disabled) {
509
+ this._node = _node;
510
+ this._tree = _tree;
511
+ this._elementRef = _elementRef;
512
+ this._renderer = _renderer;
513
+ this._appRef = _appRef;
514
+ this._environmentInjector = _environmentInjector;
515
+ this._disabled = _disabled;
516
+ }
517
+ enable() {
518
+ this._isReady = true;
519
+ this.sync();
520
+ }
521
+ sync() {
522
+ if (!this._isReady) {
523
+ return;
524
+ }
525
+ if (!this._tree.checkable()) {
526
+ this.destroy();
527
+ return;
528
+ }
529
+ const checkbox = this._ensureCheckbox();
530
+ const node = this._node.data;
531
+ const checked = this._tree._isNodeChecked(node);
532
+ const indeterminate = this._tree._isNodeIndeterminate(node);
533
+ checkbox.checked.set(checked);
534
+ checkbox.indeterminate.set(indeterminate);
535
+ checkbox.disabled.set(this._disabled());
536
+ this._componentRef?.changeDetectorRef.detectChanges();
537
+ }
538
+ destroy() {
539
+ this._unlistenClick?.();
540
+ this._unlistenClick = undefined;
541
+ this._unlistenKeydown?.();
542
+ this._unlistenKeydown = undefined;
543
+ this._changeSubscription?.unsubscribe();
544
+ this._changeSubscription = undefined;
545
+ if (this._componentRef) {
546
+ this._appRef.detachView(this._componentRef.hostView);
547
+ this._componentRef.destroy();
548
+ this._componentRef = undefined;
549
+ }
550
+ this._wrapperElement?.remove();
551
+ this._wrapperElement = undefined;
552
+ }
553
+ _ensureCheckbox() {
554
+ if (this._componentRef) {
555
+ return this._componentRef.instance;
556
+ }
557
+ const existingWrapper = this._elementRef.nativeElement.querySelector(':scope > .ngs-tree-node-checkbox');
558
+ const wrapper = existingWrapper ?? this._renderer.createElement('span');
559
+ let checkboxHost = wrapper.querySelector(':scope > ngs-checkbox');
560
+ if (!existingWrapper) {
561
+ this._renderer.addClass(wrapper, 'ngs-tree-node-checkbox');
562
+ checkboxHost = this._renderer.createElement('ngs-checkbox');
563
+ this._renderer.appendChild(wrapper, checkboxHost);
564
+ this._renderer.insertBefore(this._elementRef.nativeElement, wrapper, this._getCheckboxInsertionReference());
565
+ }
566
+ else if (!checkboxHost) {
567
+ checkboxHost = this._renderer.createElement('ngs-checkbox');
568
+ this._renderer.appendChild(wrapper, checkboxHost);
569
+ }
570
+ while (checkboxHost.firstChild) {
571
+ checkboxHost.firstChild.remove();
572
+ }
573
+ this._wrapperElement = wrapper;
574
+ this._componentRef = createComponent(Checkbox, {
575
+ environmentInjector: this._environmentInjector,
576
+ hostElement: checkboxHost,
577
+ });
578
+ this._componentRef.setInput('aria-label', 'Select tree node');
579
+ this._componentRef.setInput('tabIndex', -1);
580
+ this._appRef.attachView(this._componentRef.hostView);
581
+ this._bindCheckboxEvents(wrapper, this._componentRef);
582
+ return this._componentRef.instance;
583
+ }
584
+ _getCheckboxInsertionReference() {
585
+ const host = this._elementRef.nativeElement;
586
+ const firstElement = host.firstElementChild;
587
+ if (firstElement?.matches('button, [ngsTreeNodeToggle], [ngstreenodetoggle], [ngsIconButton], [ngsiconbutton]')) {
588
+ return firstElement.nextSibling;
589
+ }
590
+ return host.firstChild;
591
+ }
592
+ _bindCheckboxEvents(checkboxElement, checkboxRef) {
593
+ this._unlistenClick = this._renderer.listen(checkboxElement, 'click', (event) => {
594
+ event.stopPropagation();
595
+ });
596
+ this._unlistenKeydown = this._renderer.listen(checkboxElement, 'keydown', (event) => {
597
+ event.stopPropagation();
598
+ });
599
+ this._changeSubscription = checkboxRef.instance.change.subscribe((event) => {
600
+ this._tree._toggleNodeChecked(this._node.data, event.checked);
601
+ });
602
+ }
603
+ }
48
604
  class TreeNode extends CdkTreeNode {
605
+ _hostElementRef = inject(ElementRef);
606
+ _renderer = inject(Renderer2);
607
+ _appRef = inject(ApplicationRef);
608
+ _environmentInjector = inject(EnvironmentInjector);
609
+ _platformId = inject(PLATFORM_ID);
610
+ _checkbox;
611
+ _dataChangesSubscription;
612
+ _checkboxEnableHandle;
613
+ _registeredDataKey = NGS_TREE_NODE_VALUE_UNSET;
49
614
  tabIndexInputBinding = input(0, { ...(ngDevMode ? { debugName: "tabIndexInputBinding" } : /* istanbul ignore next */ {}), transform: (value) => (value == null ? 0 : numberAttribute(value)),
50
615
  alias: 'tabIndex' });
616
+ value = input(NGS_TREE_NODE_VALUE_UNSET, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
51
617
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
52
618
  defaultTabIndex = 0;
53
619
  constructor() {
54
620
  super();
621
+ const tree = this._tree;
622
+ this._checkbox = new TreeNodeCheckbox(this, tree, this._hostElementRef, this._renderer, this._appRef, this._environmentInjector, () => this.disabled());
623
+ this._dataChangesSubscription = this._dataChanges.subscribe(() => this._syncNodeState());
624
+ if (isPlatformBrowser(this._platformId)) {
625
+ this._checkboxEnableHandle = setTimeout(() => this._checkbox.enable());
626
+ }
55
627
  const tabIndex = inject(new HostAttributeToken('tabindex'), { optional: true });
56
628
  this._tabIndexInputBinding = Number(tabIndex) || this.defaultTabIndex;
57
629
  effect(() => {
58
630
  this.isDisabled = this.disabled();
59
631
  });
632
+ effect(() => {
633
+ tree.checkable();
634
+ tree._checkStateVersion();
635
+ this.disabled();
636
+ this._syncNodeDisabledRegistration();
637
+ this._checkbox.sync();
638
+ });
639
+ effect(() => {
640
+ this.value();
641
+ this._syncNodeState();
642
+ });
60
643
  }
61
644
  _getTabindexAttribute() {
62
645
  if (isNoopTreeKeyManager(this._tree._keyManager)) {
@@ -64,81 +647,313 @@ class TreeNode extends CdkTreeNode {
64
647
  }
65
648
  return this._tabindex;
66
649
  }
650
+ _handleNodeClick(event) {
651
+ this._focusItem();
652
+ this._selectNodeFromEvent(event);
653
+ }
654
+ _isSelectable() {
655
+ return this._tree.selectable() && !this.disabled();
656
+ }
657
+ _isSelected() {
658
+ const tree = this._tree;
659
+ return tree.selectable() && tree._isNodeSelected(this.data);
660
+ }
661
+ _getAriaSelected() {
662
+ return this._tree.selectable() ? this._isSelected() : null;
663
+ }
664
+ _isDraggable() {
665
+ return this._tree._canDragNode(this.data);
666
+ }
667
+ _isDropTarget() {
668
+ return this._tree._isNodeDropTarget(this.data);
669
+ }
670
+ _isDropTargetPosition(position) {
671
+ return this._tree._isNodeDropTargetPosition(this.data, position);
672
+ }
673
+ _getDraggableAttribute() {
674
+ return this._isDraggable() ? true : null;
675
+ }
676
+ _getAriaGrabbed() {
677
+ return this._tree.draggable() ? false : null;
678
+ }
679
+ _handleDragStart(event) {
680
+ this._tree._startNodeDrag(this.data, event);
681
+ }
682
+ _handleDragOver(event) {
683
+ this._tree._dragNodeOver(this.data, event);
684
+ }
685
+ _handleDragLeave(event) {
686
+ this._tree._dragNodeLeave(this.data, event);
687
+ }
688
+ _handleDrop(event) {
689
+ this._tree._dropNodeInto(this.data, event);
690
+ }
691
+ _handleDragEnd() {
692
+ this._tree._endNodeDrag();
693
+ }
694
+ _selectNodeFromEvent(event) {
695
+ if (!this._isSelectable() || this._isTreeControlClick(event)) {
696
+ return;
697
+ }
698
+ this._tree._selectNode(this.data);
699
+ }
700
+ _isTreeControlClick(event) {
701
+ return isTreeNodeControlClick(event, this._hostElementRef.nativeElement);
702
+ }
703
+ _syncNodeState() {
704
+ this._syncNodeValueRegistration();
705
+ this._syncNodeDisabledRegistration();
706
+ this._checkbox.sync();
707
+ }
708
+ _syncNodeValueRegistration() {
709
+ if (this.data === undefined) {
710
+ return;
711
+ }
712
+ const tree = this._tree;
713
+ const key = tree._getTreeNodeDataKey(this.data);
714
+ if (this._registeredDataKey !== NGS_TREE_NODE_VALUE_UNSET && !Object.is(this._registeredDataKey, key)) {
715
+ tree._unregisterNodeValueByDataKey(this._registeredDataKey);
716
+ tree._unregisterNodeDisabledByDataKey(this._registeredDataKey);
717
+ }
718
+ this._registeredDataKey = key;
719
+ if (this.value() === NGS_TREE_NODE_VALUE_UNSET) {
720
+ tree._unregisterNodeValueByDataKey(key);
721
+ }
722
+ else {
723
+ tree._registerNodeValue(this.data, this.value());
724
+ }
725
+ }
726
+ _syncNodeDisabledRegistration() {
727
+ if (this.data === undefined) {
728
+ return;
729
+ }
730
+ this._tree._registerNodeDisabled(this.data, this.disabled());
731
+ }
67
732
  ngOnInit() {
68
733
  super.ngOnInit();
734
+ this._syncNodeState();
69
735
  }
70
736
  ngOnDestroy() {
737
+ if (this._checkboxEnableHandle) {
738
+ clearTimeout(this._checkboxEnableHandle);
739
+ }
740
+ this._dataChangesSubscription?.unsubscribe();
741
+ if (this._registeredDataKey !== NGS_TREE_NODE_VALUE_UNSET) {
742
+ this._tree._unregisterNodeValueByDataKey(this._registeredDataKey);
743
+ this._tree._unregisterNodeDisabledByDataKey(this._registeredDataKey);
744
+ }
745
+ this._checkbox.destroy();
71
746
  super.ngOnDestroy();
72
747
  }
73
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: TreeNode, deps: [], target: i0.ɵɵFactoryTarget.Directive });
74
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.4", type: TreeNode, isStandalone: true, selector: "ngs-tree-node", inputs: { tabIndexInputBinding: { classPropertyName: "tabIndexInputBinding", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activation: "activation", expandedChange: "expandedChange" }, host: { listeners: { "click": "_focusItem()" }, properties: { "attr.aria-expanded": "_getAriaExpanded()", "attr.aria-level": "level + 1", "attr.aria-posinset": "_getPositionInSet()", "attr.aria-setsize": "_getSetSize()", "tabindex": "_getTabindexAttribute()" }, classAttribute: "ngs-tree-node" }, providers: [{ provide: CdkTreeNode, useExisting: TreeNode }], exportAs: ["ngsTreeNode"], usesInheritance: true, ngImport: i0 });
748
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: TreeNode, deps: [], target: i0.ɵɵFactoryTarget.Component });
749
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: TreeNode, isStandalone: true, selector: "ngs-tree-node", inputs: { tabIndexInputBinding: { classPropertyName: "tabIndexInputBinding", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activation: "activation", expandedChange: "expandedChange" }, host: { listeners: { "click": "_handleNodeClick($event)", "dragstart": "_handleDragStart($event)", "dragover": "_handleDragOver($event)", "dragleave": "_handleDragLeave($event)", "drop": "_handleDrop($event)", "dragend": "_handleDragEnd()" }, properties: { "class.ngs-tree-node-selectable": "_isSelectable()", "class.ngs-tree-node-selected": "_isSelected()", "class.ngs-tree-node-disabled": "disabled()", "class.ngs-tree-node-draggable": "_isDraggable()", "class.ngs-tree-node-drop-target": "_isDropTarget()", "class.ngs-tree-node-drop-before": "_isDropTargetPosition(\"before\")", "class.ngs-tree-node-drop-inside": "_isDropTargetPosition(\"inside\")", "class.ngs-tree-node-drop-after": "_isDropTargetPosition(\"after\")", "attr.draggable": "_getDraggableAttribute()", "attr.aria-expanded": "_getAriaExpanded()", "attr.aria-level": "level + 1", "attr.aria-posinset": "_getPositionInSet()", "attr.aria-setsize": "_getSetSize()", "attr.aria-selected": "_getAriaSelected()", "attr.aria-disabled": "disabled()", "attr.aria-grabbed": "_getAriaGrabbed()", "tabindex": "_getTabindexAttribute()" }, classAttribute: "ngs-tree-node" }, providers: [{ provide: CdkTreeNode, useExisting: TreeNode }], exportAs: ["ngsTreeNode"], usesInheritance: true, ngImport: i0, template: '<ng-content />', isInline: true, styles: [":host{color:var(--ngs-tree-node-color);font-size:var(--ngs-tree-node-font-size);position:relative}:host.ngs-tree-node{display:flex;align-items:center;flex:1;gap:var(--ngs-tree-node-gap);padding:var(--ngs-tree-node-padding);word-wrap:break-word;min-height:var(--ngs-tree-node-min-height);box-sizing:border-box}:host.ngs-nested-tree-node{border-bottom-width:0}:host.ngs-tree-node-selectable{border-radius:var(--ngs-tree-node-radius);cursor:pointer}:host.ngs-tree-node-disabled{opacity:var(--ngs-tree-node-disabled-opacity);cursor:default}:host.ngs-tree-node-draggable{cursor:grab}:host.ngs-tree-node-draggable:active{cursor:grabbing}:host.ngs-tree-node-drop-inside{color:var(--ngs-tree-node-drop-target-color, var(--ngs-tree-node-active-color));background:var(--ngs-tree-node-drop-target-bg, var(--ngs-tree-node-active-bg));outline:var(--ngs-tree-node-drop-target-outline, 1px solid var(--ngs-color-primary));outline-offset:var(--ngs-tree-node-drop-target-outline-offset, -1px)}:host.ngs-tree-node-drop-before:before,:host.ngs-tree-node-drop-after:after{content:\"\";position:absolute;z-index:1;inset-inline:0;height:var(--ngs-tree-node-drop-line-size, 2px);background:var(--ngs-tree-node-drop-line-color, var(--ngs-color-primary));border-radius:var(--ngs-tree-node-drop-line-radius, 999px);pointer-events:none}:host.ngs-tree-node-drop-before:before{top:0}:host.ngs-tree-node-drop-after:after{bottom:0}:host.ngs-tree-node-selectable:not(.ngs-tree-node-selected,.ngs-tree-node-disabled):hover{color:var(--ngs-tree-node-hover-color);background:var(--ngs-tree-node-hover-bg)}:host.ngs-tree-node-selected:not(.ngs-tree-node-disabled){color:var(--ngs-tree-node-active-color);background:var(--ngs-tree-node-active-bg)}:host.ngs-tree-node-selectable>button:disabled{pointer-events:none}:host .ngs-tree-node-checkbox{display:inline-flex;align-items:center;justify-content:center;flex:none;margin-inline-end:var(--ngs-tree-node-checkbox-gap, calc(var(--spacing, .25rem) * 2))}:host .ngs-tree-node-checkbox ngs-checkbox{--ngs-checkbox-gap: 0}:host .ngs-tree-node-checkbox .ngs-checkbox-label{display:none}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
75
750
  }
76
751
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: TreeNode, decorators: [{
77
- type: Directive,
78
- args: [{
79
- selector: 'ngs-tree-node',
80
- exportAs: 'ngsTreeNode',
81
- outputs: ['activation', 'expandedChange'],
82
- providers: [{ provide: CdkTreeNode, useExisting: TreeNode }],
83
- host: {
752
+ type: Component,
753
+ args: [{ selector: 'ngs-tree-node', exportAs: 'ngsTreeNode', template: '<ng-content />', standalone: true, outputs: ['activation', 'expandedChange'], providers: [{ provide: CdkTreeNode, useExisting: TreeNode }], changeDetection: ChangeDetectionStrategy.OnPush, host: {
84
754
  'class': 'ngs-tree-node',
755
+ '[class.ngs-tree-node-selectable]': '_isSelectable()',
756
+ '[class.ngs-tree-node-selected]': '_isSelected()',
757
+ '[class.ngs-tree-node-disabled]': 'disabled()',
758
+ '[class.ngs-tree-node-draggable]': '_isDraggable()',
759
+ '[class.ngs-tree-node-drop-target]': '_isDropTarget()',
760
+ '[class.ngs-tree-node-drop-before]': '_isDropTargetPosition("before")',
761
+ '[class.ngs-tree-node-drop-inside]': '_isDropTargetPosition("inside")',
762
+ '[class.ngs-tree-node-drop-after]': '_isDropTargetPosition("after")',
763
+ '[attr.draggable]': '_getDraggableAttribute()',
85
764
  '[attr.aria-expanded]': '_getAriaExpanded()',
86
765
  '[attr.aria-level]': 'level + 1',
87
766
  '[attr.aria-posinset]': '_getPositionInSet()',
88
767
  '[attr.aria-setsize]': '_getSetSize()',
89
- '(click)': '_focusItem()',
768
+ '[attr.aria-selected]': '_getAriaSelected()',
769
+ '[attr.aria-disabled]': 'disabled()',
770
+ '[attr.aria-grabbed]': '_getAriaGrabbed()',
771
+ '(click)': '_handleNodeClick($event)',
772
+ '(dragstart)': '_handleDragStart($event)',
773
+ '(dragover)': '_handleDragOver($event)',
774
+ '(dragleave)': '_handleDragLeave($event)',
775
+ '(drop)': '_handleDrop($event)',
776
+ '(dragend)': '_handleDragEnd()',
90
777
  '[tabindex]': '_getTabindexAttribute()',
91
- },
92
- standalone: true
93
- }]
94
- }], ctorParameters: () => [], propDecorators: { tabIndexInputBinding: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
778
+ }, styles: [":host{color:var(--ngs-tree-node-color);font-size:var(--ngs-tree-node-font-size);position:relative}:host.ngs-tree-node{display:flex;align-items:center;flex:1;gap:var(--ngs-tree-node-gap);padding:var(--ngs-tree-node-padding);word-wrap:break-word;min-height:var(--ngs-tree-node-min-height);box-sizing:border-box}:host.ngs-nested-tree-node{border-bottom-width:0}:host.ngs-tree-node-selectable{border-radius:var(--ngs-tree-node-radius);cursor:pointer}:host.ngs-tree-node-disabled{opacity:var(--ngs-tree-node-disabled-opacity);cursor:default}:host.ngs-tree-node-draggable{cursor:grab}:host.ngs-tree-node-draggable:active{cursor:grabbing}:host.ngs-tree-node-drop-inside{color:var(--ngs-tree-node-drop-target-color, var(--ngs-tree-node-active-color));background:var(--ngs-tree-node-drop-target-bg, var(--ngs-tree-node-active-bg));outline:var(--ngs-tree-node-drop-target-outline, 1px solid var(--ngs-color-primary));outline-offset:var(--ngs-tree-node-drop-target-outline-offset, -1px)}:host.ngs-tree-node-drop-before:before,:host.ngs-tree-node-drop-after:after{content:\"\";position:absolute;z-index:1;inset-inline:0;height:var(--ngs-tree-node-drop-line-size, 2px);background:var(--ngs-tree-node-drop-line-color, var(--ngs-color-primary));border-radius:var(--ngs-tree-node-drop-line-radius, 999px);pointer-events:none}:host.ngs-tree-node-drop-before:before{top:0}:host.ngs-tree-node-drop-after:after{bottom:0}:host.ngs-tree-node-selectable:not(.ngs-tree-node-selected,.ngs-tree-node-disabled):hover{color:var(--ngs-tree-node-hover-color);background:var(--ngs-tree-node-hover-bg)}:host.ngs-tree-node-selected:not(.ngs-tree-node-disabled){color:var(--ngs-tree-node-active-color);background:var(--ngs-tree-node-active-bg)}:host.ngs-tree-node-selectable>button:disabled{pointer-events:none}:host .ngs-tree-node-checkbox{display:inline-flex;align-items:center;justify-content:center;flex:none;margin-inline-end:var(--ngs-tree-node-checkbox-gap, calc(var(--spacing, .25rem) * 2))}:host .ngs-tree-node-checkbox ngs-checkbox{--ngs-checkbox-gap: 0}:host .ngs-tree-node-checkbox .ngs-checkbox-label{display:none}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
779
+ }], ctorParameters: () => [], propDecorators: { tabIndexInputBinding: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
95
780
  class NestedTreeNode extends CdkNestedTreeNode {
781
+ _hostElementRef = inject(ElementRef);
782
+ _renderer = inject(Renderer2);
783
+ _appRef = inject(ApplicationRef);
784
+ _environmentInjector = inject(EnvironmentInjector);
785
+ _platformId = inject(PLATFORM_ID);
786
+ _checkbox;
787
+ _dataChangesSubscription;
788
+ _checkboxEnableHandle;
789
+ _registeredDataKey = NGS_TREE_NODE_VALUE_UNSET;
96
790
  node = input(undefined, { ...(ngDevMode ? { debugName: "node" } : /* istanbul ignore next */ {}), alias: 'ngsNestedTreeNode' });
791
+ value = input(NGS_TREE_NODE_VALUE_UNSET, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
97
792
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
98
793
  tabIndexInput = input(0, { ...(ngDevMode ? { debugName: "tabIndexInput" } : /* istanbul ignore next */ {}), alias: 'tabIndex',
99
794
  transform: (value) => (value == null ? 0 : numberAttribute(value)) });
100
795
  constructor() {
101
796
  super();
797
+ const tree = this._tree;
798
+ this._checkbox = new TreeNodeCheckbox(this, tree, this._hostElementRef, this._renderer, this._appRef, this._environmentInjector, () => this.disabled());
799
+ this._dataChangesSubscription = this._dataChanges.subscribe(() => this._syncNodeState());
800
+ if (isPlatformBrowser(this._platformId)) {
801
+ this._checkboxEnableHandle = setTimeout(() => this._checkbox.enable());
802
+ }
102
803
  effect(() => {
103
804
  this.isDisabled = this.disabled();
104
805
  });
806
+ effect(() => {
807
+ tree.checkable();
808
+ tree._checkStateVersion();
809
+ this.disabled();
810
+ this._syncNodeDisabledRegistration();
811
+ this._checkbox.sync();
812
+ });
813
+ effect(() => {
814
+ this.value();
815
+ this._syncNodeState();
816
+ });
105
817
  }
106
818
  get tabIndex() {
107
819
  return this.isDisabled ? -1 : this.tabIndexInput();
108
820
  }
821
+ _handleNodeClick(event) {
822
+ this._focusItem?.();
823
+ this._selectNodeFromEvent(event);
824
+ }
825
+ _isSelectable() {
826
+ return this._tree.selectable() && !this.disabled();
827
+ }
828
+ _isSelected() {
829
+ const tree = this._tree;
830
+ return tree.selectable() && tree._isNodeSelected(this.data);
831
+ }
832
+ _getAriaSelected() {
833
+ return this._tree.selectable() ? this._isSelected() : null;
834
+ }
835
+ _isDraggable() {
836
+ return this._tree._canDragNode(this.data);
837
+ }
838
+ _isDropTarget() {
839
+ return this._tree._isNodeDropTarget(this.data);
840
+ }
841
+ _isDropTargetPosition(position) {
842
+ return this._tree._isNodeDropTargetPosition(this.data, position);
843
+ }
844
+ _getDraggableAttribute() {
845
+ return this._isDraggable() ? true : null;
846
+ }
847
+ _getAriaGrabbed() {
848
+ return this._tree.draggable() ? false : null;
849
+ }
850
+ _handleDragStart(event) {
851
+ this._tree._startNodeDrag(this.data, event);
852
+ }
853
+ _handleDragOver(event) {
854
+ this._tree._dragNodeOver(this.data, event);
855
+ }
856
+ _handleDragLeave(event) {
857
+ this._tree._dragNodeLeave(this.data, event);
858
+ }
859
+ _handleDrop(event) {
860
+ this._tree._dropNodeInto(this.data, event);
861
+ }
862
+ _handleDragEnd() {
863
+ this._tree._endNodeDrag();
864
+ }
865
+ _selectNodeFromEvent(event) {
866
+ if (!this._isSelectable() || this._isTreeControlClick(event)) {
867
+ return;
868
+ }
869
+ this._tree._selectNode(this.data);
870
+ }
871
+ _isTreeControlClick(event) {
872
+ return isTreeNodeControlClick(event, this._hostElementRef.nativeElement);
873
+ }
874
+ _syncNodeState() {
875
+ this._syncNodeValueRegistration();
876
+ this._syncNodeDisabledRegistration();
877
+ this._checkbox.sync();
878
+ }
879
+ _syncNodeValueRegistration() {
880
+ if (this.data === undefined) {
881
+ return;
882
+ }
883
+ const tree = this._tree;
884
+ const key = tree._getTreeNodeDataKey(this.data);
885
+ if (this._registeredDataKey !== NGS_TREE_NODE_VALUE_UNSET && !Object.is(this._registeredDataKey, key)) {
886
+ tree._unregisterNodeValueByDataKey(this._registeredDataKey);
887
+ tree._unregisterNodeDisabledByDataKey(this._registeredDataKey);
888
+ }
889
+ this._registeredDataKey = key;
890
+ if (this.value() === NGS_TREE_NODE_VALUE_UNSET) {
891
+ tree._unregisterNodeValueByDataKey(key);
892
+ }
893
+ else {
894
+ tree._registerNodeValue(this.data, this.value());
895
+ }
896
+ }
897
+ _syncNodeDisabledRegistration() {
898
+ if (this.data === undefined) {
899
+ return;
900
+ }
901
+ this._tree._registerNodeDisabled(this.data, this.disabled());
902
+ }
109
903
  ngOnInit() {
110
904
  super.ngOnInit();
905
+ this._syncNodeState();
111
906
  }
112
907
  ngAfterContentInit() {
113
908
  super.ngAfterContentInit();
114
909
  }
115
910
  ngOnDestroy() {
911
+ if (this._checkboxEnableHandle) {
912
+ clearTimeout(this._checkboxEnableHandle);
913
+ }
914
+ this._dataChangesSubscription?.unsubscribe();
915
+ if (this._registeredDataKey !== NGS_TREE_NODE_VALUE_UNSET) {
916
+ this._tree._unregisterNodeValueByDataKey(this._registeredDataKey);
917
+ this._tree._unregisterNodeDisabledByDataKey(this._registeredDataKey);
918
+ }
919
+ this._checkbox.destroy();
116
920
  super.ngOnDestroy();
117
921
  }
118
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NestedTreeNode, deps: [], target: i0.ɵɵFactoryTarget.Directive });
119
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.4", type: NestedTreeNode, isStandalone: true, selector: "ngs-nested-tree-node", inputs: { node: { classPropertyName: "node", publicName: "ngsNestedTreeNode", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, tabIndexInput: { classPropertyName: "tabIndexInput", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activation: "activation", expandedChange: "expandedChange" }, host: { classAttribute: "ngs-nested-tree-node" }, providers: [
922
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NestedTreeNode, deps: [], target: i0.ɵɵFactoryTarget.Component });
923
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: NestedTreeNode, isStandalone: true, selector: "ngs-nested-tree-node", inputs: { node: { classPropertyName: "node", publicName: "ngsNestedTreeNode", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, tabIndexInput: { classPropertyName: "tabIndexInput", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activation: "activation", expandedChange: "expandedChange" }, host: { listeners: { "click": "_handleNodeClick($event)", "dragstart": "_handleDragStart($event)", "dragover": "_handleDragOver($event)", "dragleave": "_handleDragLeave($event)", "drop": "_handleDrop($event)", "dragend": "_handleDragEnd()" }, properties: { "class.ngs-tree-node-selectable": "_isSelectable()", "class.ngs-tree-node-selected": "_isSelected()", "class.ngs-tree-node-disabled": "disabled()", "class.ngs-tree-node-draggable": "_isDraggable()", "class.ngs-tree-node-drop-target": "_isDropTarget()", "class.ngs-tree-node-drop-before": "_isDropTargetPosition(\"before\")", "class.ngs-tree-node-drop-inside": "_isDropTargetPosition(\"inside\")", "class.ngs-tree-node-drop-after": "_isDropTargetPosition(\"after\")", "attr.draggable": "_getDraggableAttribute()", "attr.aria-selected": "_getAriaSelected()", "attr.aria-disabled": "disabled()", "attr.aria-grabbed": "_getAriaGrabbed()" }, classAttribute: "ngs-nested-tree-node" }, providers: [
120
924
  { provide: CdkNestedTreeNode, useExisting: NestedTreeNode },
121
925
  { provide: CdkTreeNode, useExisting: NestedTreeNode },
122
926
  { provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: NestedTreeNode },
123
- ], exportAs: ["ngsNestedTreeNode"], usesInheritance: true, ngImport: i0 });
927
+ ], exportAs: ["ngsNestedTreeNode"], usesInheritance: true, ngImport: i0, template: '<ng-content />', isInline: true, styles: [":host{color:var(--ngs-tree-node-color);font-size:var(--ngs-tree-node-font-size);position:relative}:host.ngs-tree-node{display:flex;align-items:center;flex:1;gap:var(--ngs-tree-node-gap);padding:var(--ngs-tree-node-padding);word-wrap:break-word;min-height:var(--ngs-tree-node-min-height);box-sizing:border-box}:host.ngs-nested-tree-node{border-bottom-width:0}:host.ngs-tree-node-selectable{border-radius:var(--ngs-tree-node-radius);cursor:pointer}:host.ngs-tree-node-disabled{opacity:var(--ngs-tree-node-disabled-opacity);cursor:default}:host.ngs-tree-node-draggable{cursor:grab}:host.ngs-tree-node-draggable:active{cursor:grabbing}:host.ngs-tree-node-drop-inside{color:var(--ngs-tree-node-drop-target-color, var(--ngs-tree-node-active-color));background:var(--ngs-tree-node-drop-target-bg, var(--ngs-tree-node-active-bg));outline:var(--ngs-tree-node-drop-target-outline, 1px solid var(--ngs-color-primary));outline-offset:var(--ngs-tree-node-drop-target-outline-offset, -1px)}:host.ngs-tree-node-drop-before:before,:host.ngs-tree-node-drop-after:after{content:\"\";position:absolute;z-index:1;inset-inline:0;height:var(--ngs-tree-node-drop-line-size, 2px);background:var(--ngs-tree-node-drop-line-color, var(--ngs-color-primary));border-radius:var(--ngs-tree-node-drop-line-radius, 999px);pointer-events:none}:host.ngs-tree-node-drop-before:before{top:0}:host.ngs-tree-node-drop-after:after{bottom:0}:host.ngs-tree-node-selectable:not(.ngs-tree-node-selected,.ngs-tree-node-disabled):hover{color:var(--ngs-tree-node-hover-color);background:var(--ngs-tree-node-hover-bg)}:host.ngs-tree-node-selected:not(.ngs-tree-node-disabled){color:var(--ngs-tree-node-active-color);background:var(--ngs-tree-node-active-bg)}:host.ngs-tree-node-selectable>button:disabled{pointer-events:none}:host .ngs-tree-node-checkbox{display:inline-flex;align-items:center;justify-content:center;flex:none;margin-inline-end:var(--ngs-tree-node-checkbox-gap, calc(var(--spacing, .25rem) * 2))}:host .ngs-tree-node-checkbox ngs-checkbox{--ngs-checkbox-gap: 0}:host .ngs-tree-node-checkbox .ngs-checkbox-label{display:none}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
124
928
  }
125
929
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: NestedTreeNode, decorators: [{
126
- type: Directive,
127
- args: [{
128
- selector: 'ngs-nested-tree-node',
129
- exportAs: 'ngsNestedTreeNode',
130
- outputs: ['activation', 'expandedChange'],
131
- providers: [
930
+ type: Component,
931
+ args: [{ selector: 'ngs-nested-tree-node', exportAs: 'ngsNestedTreeNode', template: '<ng-content />', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, outputs: ['activation', 'expandedChange'], providers: [
132
932
  { provide: CdkNestedTreeNode, useExisting: NestedTreeNode },
133
933
  { provide: CdkTreeNode, useExisting: NestedTreeNode },
134
934
  { provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: NestedTreeNode },
135
- ],
136
- host: {
935
+ ], host: {
137
936
  'class': 'ngs-nested-tree-node',
138
- },
139
- standalone: true
140
- }]
141
- }], ctorParameters: () => [], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngsNestedTreeNode", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], tabIndexInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }] } });
937
+ '[class.ngs-tree-node-selectable]': '_isSelectable()',
938
+ '[class.ngs-tree-node-selected]': '_isSelected()',
939
+ '[class.ngs-tree-node-disabled]': 'disabled()',
940
+ '[class.ngs-tree-node-draggable]': '_isDraggable()',
941
+ '[class.ngs-tree-node-drop-target]': '_isDropTarget()',
942
+ '[class.ngs-tree-node-drop-before]': '_isDropTargetPosition("before")',
943
+ '[class.ngs-tree-node-drop-inside]': '_isDropTargetPosition("inside")',
944
+ '[class.ngs-tree-node-drop-after]': '_isDropTargetPosition("after")',
945
+ '[attr.draggable]': '_getDraggableAttribute()',
946
+ '[attr.aria-selected]': '_getAriaSelected()',
947
+ '[attr.aria-disabled]': 'disabled()',
948
+ '[attr.aria-grabbed]': '_getAriaGrabbed()',
949
+ '(click)': '_handleNodeClick($event)',
950
+ '(dragstart)': '_handleDragStart($event)',
951
+ '(dragover)': '_handleDragOver($event)',
952
+ '(dragleave)': '_handleDragLeave($event)',
953
+ '(drop)': '_handleDrop($event)',
954
+ '(dragend)': '_handleDragEnd()',
955
+ }, styles: [":host{color:var(--ngs-tree-node-color);font-size:var(--ngs-tree-node-font-size);position:relative}:host.ngs-tree-node{display:flex;align-items:center;flex:1;gap:var(--ngs-tree-node-gap);padding:var(--ngs-tree-node-padding);word-wrap:break-word;min-height:var(--ngs-tree-node-min-height);box-sizing:border-box}:host.ngs-nested-tree-node{border-bottom-width:0}:host.ngs-tree-node-selectable{border-radius:var(--ngs-tree-node-radius);cursor:pointer}:host.ngs-tree-node-disabled{opacity:var(--ngs-tree-node-disabled-opacity);cursor:default}:host.ngs-tree-node-draggable{cursor:grab}:host.ngs-tree-node-draggable:active{cursor:grabbing}:host.ngs-tree-node-drop-inside{color:var(--ngs-tree-node-drop-target-color, var(--ngs-tree-node-active-color));background:var(--ngs-tree-node-drop-target-bg, var(--ngs-tree-node-active-bg));outline:var(--ngs-tree-node-drop-target-outline, 1px solid var(--ngs-color-primary));outline-offset:var(--ngs-tree-node-drop-target-outline-offset, -1px)}:host.ngs-tree-node-drop-before:before,:host.ngs-tree-node-drop-after:after{content:\"\";position:absolute;z-index:1;inset-inline:0;height:var(--ngs-tree-node-drop-line-size, 2px);background:var(--ngs-tree-node-drop-line-color, var(--ngs-color-primary));border-radius:var(--ngs-tree-node-drop-line-radius, 999px);pointer-events:none}:host.ngs-tree-node-drop-before:before{top:0}:host.ngs-tree-node-drop-after:after{bottom:0}:host.ngs-tree-node-selectable:not(.ngs-tree-node-selected,.ngs-tree-node-disabled):hover{color:var(--ngs-tree-node-hover-color);background:var(--ngs-tree-node-hover-bg)}:host.ngs-tree-node-selected:not(.ngs-tree-node-disabled){color:var(--ngs-tree-node-active-color);background:var(--ngs-tree-node-active-bg)}:host.ngs-tree-node-selectable>button:disabled{pointer-events:none}:host .ngs-tree-node-checkbox{display:inline-flex;align-items:center;justify-content:center;flex:none;margin-inline-end:var(--ngs-tree-node-checkbox-gap, calc(var(--spacing, .25rem) * 2))}:host .ngs-tree-node-checkbox ngs-checkbox{--ngs-checkbox-gap: 0}:host .ngs-tree-node-checkbox .ngs-checkbox-label{display:none}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
956
+ }], ctorParameters: () => [], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngsNestedTreeNode", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], tabIndexInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }] } });
142
957
 
143
958
  class TreeNodePadding extends CdkTreeNodePadding {
144
959
  levelInput = input(0, { ...(ngDevMode ? { debugName: "levelInput" } : /* istanbul ignore next */ {}), alias: 'ngsTreeNodePadding',