@ngxsmk/cdk 1.3.2 → 3.0.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 (199) hide show
  1. package/README.md +1 -1
  2. package/cva-base/cva-base.d.ts +34 -0
  3. package/cva-base/cva-base.d.ts.map +1 -0
  4. package/cva-base/index.d.ts +2 -0
  5. package/cva-base/index.d.ts.map +1 -0
  6. package/cva-base/ngxsmk-cdk-cva-base.d.ts.map +1 -0
  7. package/esm2022/cva-base/cva-base.mjs +45 -0
  8. package/esm2022/cva-base/index.mjs +2 -0
  9. package/esm2022/cva-base/ngxsmk-cdk-cva-base.mjs +5 -0
  10. package/esm2022/input-group/index.mjs +3 -0
  11. package/esm2022/input-group/input-group-engine.mjs +219 -0
  12. package/esm2022/input-group/models/index.mjs +2 -0
  13. package/esm2022/input-group/models/input-group.model.mjs +2 -0
  14. package/esm2022/input-group/ngxsmk-cdk-input-group.mjs +5 -0
  15. package/esm2022/listbox-keyboard/index.mjs +2 -0
  16. package/esm2022/listbox-keyboard/listbox-keyboard.mjs +145 -0
  17. package/esm2022/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.mjs +5 -0
  18. package/esm2022/public-api.mjs +10 -1
  19. package/esm2022/roving-focus/index.mjs +2 -0
  20. package/esm2022/roving-focus/ngxsmk-cdk-roving-focus.mjs +5 -0
  21. package/esm2022/roving-focus/roving-focus.mjs +176 -0
  22. package/esm2022/scheduler/index.mjs +5 -0
  23. package/esm2022/scheduler/models/date-range.mjs +2 -0
  24. package/esm2022/scheduler/models/event.model.mjs +2 -0
  25. package/esm2022/scheduler/models/index.mjs +6 -0
  26. package/esm2022/scheduler/models/resource.model.mjs +5 -0
  27. package/esm2022/scheduler/models/selection.model.mjs +7 -0
  28. package/esm2022/scheduler/models/view.model.mjs +7 -0
  29. package/esm2022/scheduler/ngxsmk-cdk-scheduler.mjs +5 -0
  30. package/esm2022/scheduler/plugin/drag-plugin.mjs +82 -0
  31. package/esm2022/scheduler/plugin/index.mjs +8 -0
  32. package/esm2022/scheduler/plugin/keyboard-plugin.mjs +150 -0
  33. package/esm2022/scheduler/plugin/plugin-host.mjs +48 -0
  34. package/esm2022/scheduler/plugin/plugin.types.mjs +2 -0
  35. package/esm2022/scheduler/plugin/resize-plugin.mjs +74 -0
  36. package/esm2022/scheduler/plugin/selection-plugin.mjs +84 -0
  37. package/esm2022/scheduler/plugin/tooltip-plugin.mjs +103 -0
  38. package/esm2022/scheduler/scheduler-engine.mjs +316 -0
  39. package/esm2022/scheduler/utils/date-utils.mjs +131 -0
  40. package/esm2022/scheduler/utils/index.mjs +3 -0
  41. package/esm2022/scheduler/utils/snap.mjs +24 -0
  42. package/esm2022/scroll-lock/scroll-lock.mjs +22 -5
  43. package/esm2022/skip-link/index.mjs +2 -0
  44. package/esm2022/skip-link/ngxsmk-cdk-skip-link.mjs +5 -0
  45. package/esm2022/skip-link/skip-link.mjs +33 -0
  46. package/esm2022/spreadsheet/index.mjs +5 -0
  47. package/esm2022/spreadsheet/models/cell.model.mjs +2 -0
  48. package/esm2022/spreadsheet/models/column.model.mjs +2 -0
  49. package/esm2022/spreadsheet/models/filter.model.mjs +2 -0
  50. package/esm2022/spreadsheet/models/formula.model.mjs +2 -0
  51. package/esm2022/spreadsheet/models/index.mjs +8 -0
  52. package/esm2022/spreadsheet/models/row.model.mjs +2 -0
  53. package/esm2022/spreadsheet/models/selection.model.mjs +2 -0
  54. package/esm2022/spreadsheet/models/sort.model.mjs +2 -0
  55. package/esm2022/spreadsheet/ngxsmk-cdk-spreadsheet.mjs +5 -0
  56. package/esm2022/spreadsheet/plugin/clipboard-plugin.mjs +171 -0
  57. package/esm2022/spreadsheet/plugin/filter-plugin.mjs +87 -0
  58. package/esm2022/spreadsheet/plugin/formula-plugin.mjs +456 -0
  59. package/esm2022/spreadsheet/plugin/index.mjs +10 -0
  60. package/esm2022/spreadsheet/plugin/plugin-host.mjs +188 -0
  61. package/esm2022/spreadsheet/plugin/plugin.types.mjs +2 -0
  62. package/esm2022/spreadsheet/plugin/selection-plugin.mjs +114 -0
  63. package/esm2022/spreadsheet/plugin/sort-plugin.mjs +63 -0
  64. package/esm2022/spreadsheet/plugin/undo-plugin.mjs +138 -0
  65. package/esm2022/spreadsheet/plugin/validation-plugin.mjs +71 -0
  66. package/esm2022/spreadsheet/spreadsheet-engine.mjs +547 -0
  67. package/esm2022/spreadsheet/utils/cell-utils.mjs +129 -0
  68. package/esm2022/spreadsheet/utils/index.mjs +2 -0
  69. package/fesm2022/ngxsmk-cdk-cva-base.mjs +52 -0
  70. package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -0
  71. package/fesm2022/ngxsmk-cdk-input-group.mjs +226 -0
  72. package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -0
  73. package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs +152 -0
  74. package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -0
  75. package/fesm2022/ngxsmk-cdk-roving-focus.mjs +183 -0
  76. package/fesm2022/ngxsmk-cdk-roving-focus.mjs.map +1 -0
  77. package/fesm2022/ngxsmk-cdk-scheduler.mjs +1035 -0
  78. package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -0
  79. package/fesm2022/ngxsmk-cdk-scroll-lock.mjs +21 -4
  80. package/fesm2022/ngxsmk-cdk-scroll-lock.mjs.map +1 -1
  81. package/fesm2022/ngxsmk-cdk-skip-link.mjs +40 -0
  82. package/fesm2022/ngxsmk-cdk-skip-link.mjs.map +1 -0
  83. package/fesm2022/ngxsmk-cdk-spreadsheet.mjs +1969 -0
  84. package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -0
  85. package/fesm2022/ngxsmk-cdk.mjs +5 -0
  86. package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
  87. package/input-group/index.d.ts +3 -0
  88. package/input-group/index.d.ts.map +1 -0
  89. package/input-group/input-group-engine.d.ts +88 -0
  90. package/input-group/input-group-engine.d.ts.map +1 -0
  91. package/input-group/models/index.d.ts +2 -0
  92. package/input-group/models/index.d.ts.map +1 -0
  93. package/input-group/models/input-group.model.d.ts +114 -0
  94. package/input-group/models/input-group.model.d.ts.map +1 -0
  95. package/input-group/ngxsmk-cdk-input-group.d.ts.map +1 -0
  96. package/listbox-keyboard/index.d.ts +2 -0
  97. package/listbox-keyboard/index.d.ts.map +1 -0
  98. package/listbox-keyboard/listbox-keyboard.d.ts +60 -0
  99. package/listbox-keyboard/listbox-keyboard.d.ts.map +1 -0
  100. package/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.d.ts.map +1 -0
  101. package/package.json +59 -17
  102. package/public-api.d.ts +8 -0
  103. package/public-api.d.ts.map +1 -1
  104. package/roving-focus/index.d.ts +2 -0
  105. package/roving-focus/index.d.ts.map +1 -0
  106. package/roving-focus/ngxsmk-cdk-roving-focus.d.ts.map +1 -0
  107. package/roving-focus/roving-focus.d.ts +61 -0
  108. package/roving-focus/roving-focus.d.ts.map +1 -0
  109. package/scheduler/index.d.ts +5 -0
  110. package/scheduler/index.d.ts.map +1 -0
  111. package/scheduler/models/date-range.d.ts +6 -0
  112. package/scheduler/models/date-range.d.ts.map +1 -0
  113. package/scheduler/models/event.model.d.ts +50 -0
  114. package/scheduler/models/event.model.d.ts.map +1 -0
  115. package/scheduler/models/index.d.ts +6 -0
  116. package/scheduler/models/index.d.ts.map +1 -0
  117. package/scheduler/models/resource.model.d.ts +16 -0
  118. package/scheduler/models/resource.model.d.ts.map +1 -0
  119. package/scheduler/models/selection.model.d.ts +12 -0
  120. package/scheduler/models/selection.model.d.ts.map +1 -0
  121. package/scheduler/models/view.model.d.ts +21 -0
  122. package/scheduler/models/view.model.d.ts.map +1 -0
  123. package/scheduler/ngxsmk-cdk-scheduler.d.ts.map +1 -0
  124. package/scheduler/plugin/drag-plugin.d.ts +28 -0
  125. package/scheduler/plugin/drag-plugin.d.ts.map +1 -0
  126. package/scheduler/plugin/index.d.ts +8 -0
  127. package/scheduler/plugin/index.d.ts.map +1 -0
  128. package/scheduler/plugin/keyboard-plugin.d.ts +24 -0
  129. package/scheduler/plugin/keyboard-plugin.d.ts.map +1 -0
  130. package/scheduler/plugin/plugin-host.d.ts +16 -0
  131. package/scheduler/plugin/plugin-host.d.ts.map +1 -0
  132. package/scheduler/plugin/plugin.types.d.ts +9 -0
  133. package/scheduler/plugin/plugin.types.d.ts.map +1 -0
  134. package/scheduler/plugin/resize-plugin.d.ts +26 -0
  135. package/scheduler/plugin/resize-plugin.d.ts.map +1 -0
  136. package/scheduler/plugin/selection-plugin.d.ts +40 -0
  137. package/scheduler/plugin/selection-plugin.d.ts.map +1 -0
  138. package/scheduler/plugin/tooltip-plugin.d.ts +41 -0
  139. package/scheduler/plugin/tooltip-plugin.d.ts.map +1 -0
  140. package/scheduler/scheduler-engine.d.ts +95 -0
  141. package/scheduler/scheduler-engine.d.ts.map +1 -0
  142. package/scheduler/utils/date-utils.d.ts +26 -0
  143. package/scheduler/utils/date-utils.d.ts.map +1 -0
  144. package/scheduler/utils/index.d.ts +3 -0
  145. package/scheduler/utils/index.d.ts.map +1 -0
  146. package/scheduler/utils/snap.d.ts +7 -0
  147. package/scheduler/utils/snap.d.ts.map +1 -0
  148. package/scroll-lock/scroll-lock.d.ts +2 -0
  149. package/scroll-lock/scroll-lock.d.ts.map +1 -1
  150. package/skip-link/index.d.ts +2 -0
  151. package/skip-link/index.d.ts.map +1 -0
  152. package/skip-link/ngxsmk-cdk-skip-link.d.ts.map +1 -0
  153. package/skip-link/skip-link.d.ts +18 -0
  154. package/skip-link/skip-link.d.ts.map +1 -0
  155. package/spreadsheet/index.d.ts +5 -0
  156. package/spreadsheet/index.d.ts.map +1 -0
  157. package/spreadsheet/models/cell.model.d.ts +44 -0
  158. package/spreadsheet/models/cell.model.d.ts.map +1 -0
  159. package/spreadsheet/models/column.model.d.ts +77 -0
  160. package/spreadsheet/models/column.model.d.ts.map +1 -0
  161. package/spreadsheet/models/filter.model.d.ts +15 -0
  162. package/spreadsheet/models/filter.model.d.ts.map +1 -0
  163. package/spreadsheet/models/formula.model.d.ts +65 -0
  164. package/spreadsheet/models/formula.model.d.ts.map +1 -0
  165. package/spreadsheet/models/index.d.ts +8 -0
  166. package/spreadsheet/models/index.d.ts.map +1 -0
  167. package/spreadsheet/models/row.model.d.ts +33 -0
  168. package/spreadsheet/models/row.model.d.ts.map +1 -0
  169. package/spreadsheet/models/selection.model.d.ts +18 -0
  170. package/spreadsheet/models/selection.model.d.ts.map +1 -0
  171. package/spreadsheet/models/sort.model.d.ts +14 -0
  172. package/spreadsheet/models/sort.model.d.ts.map +1 -0
  173. package/spreadsheet/ngxsmk-cdk-spreadsheet.d.ts.map +1 -0
  174. package/spreadsheet/plugin/clipboard-plugin.d.ts +24 -0
  175. package/spreadsheet/plugin/clipboard-plugin.d.ts.map +1 -0
  176. package/spreadsheet/plugin/filter-plugin.d.ts +21 -0
  177. package/spreadsheet/plugin/filter-plugin.d.ts.map +1 -0
  178. package/spreadsheet/plugin/formula-plugin.d.ts +39 -0
  179. package/spreadsheet/plugin/formula-plugin.d.ts.map +1 -0
  180. package/spreadsheet/plugin/index.d.ts +10 -0
  181. package/spreadsheet/plugin/index.d.ts.map +1 -0
  182. package/spreadsheet/plugin/plugin-host.d.ts +66 -0
  183. package/spreadsheet/plugin/plugin-host.d.ts.map +1 -0
  184. package/spreadsheet/plugin/plugin.types.d.ts +58 -0
  185. package/spreadsheet/plugin/plugin.types.d.ts.map +1 -0
  186. package/spreadsheet/plugin/selection-plugin.d.ts +28 -0
  187. package/spreadsheet/plugin/selection-plugin.d.ts.map +1 -0
  188. package/spreadsheet/plugin/sort-plugin.d.ts +18 -0
  189. package/spreadsheet/plugin/sort-plugin.d.ts.map +1 -0
  190. package/spreadsheet/plugin/undo-plugin.d.ts +40 -0
  191. package/spreadsheet/plugin/undo-plugin.d.ts.map +1 -0
  192. package/spreadsheet/plugin/validation-plugin.d.ts +29 -0
  193. package/spreadsheet/plugin/validation-plugin.d.ts.map +1 -0
  194. package/spreadsheet/spreadsheet-engine.d.ts +194 -0
  195. package/spreadsheet/spreadsheet-engine.d.ts.map +1 -0
  196. package/spreadsheet/utils/cell-utils.d.ts +26 -0
  197. package/spreadsheet/utils/cell-utils.d.ts.map +1 -0
  198. package/spreadsheet/utils/index.d.ts +2 -0
  199. package/spreadsheet/utils/index.d.ts.map +1 -0
@@ -0,0 +1,183 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, input, booleanAttribute, signal, Directive, inject, ElementRef, output, computed } from '@angular/core';
3
+
4
+ const NGXSMK_ROVING_FOCUS_GROUP = new InjectionToken('NGXSMK_ROVING_FOCUS_GROUP');
5
+ /**
6
+ * Universal signals-native Roving Focus container directive.
7
+ * Manages keyboard navigation (Arrow keys, Home, End) across a set of items,
8
+ * keeping only the currently active item focusable via Tab (`tabindex="0"` vs `"-1"`).
9
+ *
10
+ * ```html
11
+ * <div ngxsmkRovingFocusGroup orientation="horizontal" [loop]="true">
12
+ * <button ngxsmkRovingFocusItem>Tab 1</button>
13
+ * <button ngxsmkRovingFocusItem>Tab 2</button>
14
+ * </div>
15
+ * ```
16
+ */
17
+ class NgxsmkRovingFocusGroup {
18
+ constructor() {
19
+ this.orientation = input('horizontal');
20
+ this.loop = input(true, { transform: booleanAttribute });
21
+ this.items = signal([]);
22
+ this.activeItem = signal(null);
23
+ }
24
+ register(item) {
25
+ this.items.update((list) => [...list, item]);
26
+ if (this.activeItem() === null && !item.disabled()) {
27
+ this.activeItem.set(item);
28
+ }
29
+ }
30
+ unregister(item) {
31
+ this.items.update((list) => list.filter((i) => i !== item));
32
+ if (this.activeItem() === item) {
33
+ const remaining = this.items().filter((i) => !i.disabled());
34
+ this.activeItem.set(remaining.length > 0 ? remaining[0] : null);
35
+ }
36
+ }
37
+ focusNext(current) {
38
+ const list = this.items().filter((i) => !i.disabled());
39
+ const idx = list.indexOf(current);
40
+ if (idx === -1)
41
+ return;
42
+ if (idx < list.length - 1) {
43
+ const next = list[idx + 1];
44
+ this.setActiveAndFocus(next);
45
+ }
46
+ else if (this.loop()) {
47
+ const first = list[0];
48
+ this.setActiveAndFocus(first);
49
+ }
50
+ }
51
+ focusPrev(current) {
52
+ const list = this.items().filter((i) => !i.disabled());
53
+ const idx = list.indexOf(current);
54
+ if (idx === -1)
55
+ return;
56
+ if (idx > 0) {
57
+ const prev = list[idx - 1];
58
+ this.setActiveAndFocus(prev);
59
+ }
60
+ else if (this.loop()) {
61
+ const last = list[list.length - 1];
62
+ this.setActiveAndFocus(last);
63
+ }
64
+ }
65
+ focusFirst() {
66
+ const list = this.items().filter((i) => !i.disabled());
67
+ if (list.length > 0) {
68
+ this.setActiveAndFocus(list[0]);
69
+ }
70
+ }
71
+ focusLast() {
72
+ const list = this.items().filter((i) => !i.disabled());
73
+ if (list.length > 0) {
74
+ this.setActiveAndFocus(list[list.length - 1]);
75
+ }
76
+ }
77
+ setActiveAndFocus(item) {
78
+ this.activeItem.set(item);
79
+ item.focus();
80
+ }
81
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkRovingFocusGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
82
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.0", type: NgxsmkRovingFocusGroup, isStandalone: true, selector: "[ngxsmkRovingFocusGroup]", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
83
+ {
84
+ provide: NGXSMK_ROVING_FOCUS_GROUP,
85
+ useExisting: NgxsmkRovingFocusGroup,
86
+ },
87
+ ], ngImport: i0 }); }
88
+ }
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkRovingFocusGroup, decorators: [{
90
+ type: Directive,
91
+ args: [{
92
+ standalone: true,
93
+ selector: '[ngxsmkRovingFocusGroup]',
94
+ providers: [
95
+ {
96
+ provide: NGXSMK_ROVING_FOCUS_GROUP,
97
+ useExisting: NgxsmkRovingFocusGroup,
98
+ },
99
+ ],
100
+ }]
101
+ }] });
102
+ /**
103
+ * Item in a Roving Focus group. Binds `[tabindex]` dynamically based on active state.
104
+ */
105
+ class NgxsmkRovingFocusItem {
106
+ constructor() {
107
+ this.group = inject(NGXSMK_ROVING_FOCUS_GROUP);
108
+ this.elRef = inject((ElementRef));
109
+ this.disabled = input(false, { transform: booleanAttribute });
110
+ this.focused = output();
111
+ this.isActive = computed(() => this.group.activeItem() === this);
112
+ this.tabIndex = computed(() => {
113
+ if (this.disabled())
114
+ return -1;
115
+ return this.isActive() ? 0 : -1;
116
+ });
117
+ this.group.register(this);
118
+ }
119
+ ngOnDestroy() {
120
+ this.group.unregister(this);
121
+ }
122
+ focus() {
123
+ this.elRef.nativeElement.focus();
124
+ }
125
+ handleFocus() {
126
+ if (!this.disabled()) {
127
+ this.group.activeItem.set(this);
128
+ this.focused.emit();
129
+ }
130
+ }
131
+ handleKeydown(event) {
132
+ if (this.disabled())
133
+ return;
134
+ const orient = this.group.orientation();
135
+ const isHoriz = orient === 'horizontal' || orient === 'both';
136
+ const isVert = orient === 'vertical' || orient === 'both';
137
+ switch (event.key) {
138
+ case 'ArrowRight':
139
+ case 'ArrowDown':
140
+ if ((event.key === 'ArrowRight' && isHoriz) || (event.key === 'ArrowDown' && isVert)) {
141
+ event.preventDefault();
142
+ this.group.focusNext(this);
143
+ }
144
+ break;
145
+ case 'ArrowLeft':
146
+ case 'ArrowUp':
147
+ if ((event.key === 'ArrowLeft' && isHoriz) || (event.key === 'ArrowUp' && isVert)) {
148
+ event.preventDefault();
149
+ this.group.focusPrev(this);
150
+ }
151
+ break;
152
+ case 'Home':
153
+ event.preventDefault();
154
+ this.group.focusFirst();
155
+ break;
156
+ case 'End':
157
+ event.preventDefault();
158
+ this.group.focusLast();
159
+ break;
160
+ }
161
+ }
162
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkRovingFocusItem, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
163
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "17.3.0", type: NgxsmkRovingFocusItem, isStandalone: true, selector: "[ngxsmkRovingFocusItem]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { focused: "focused" }, host: { listeners: { "keydown": "handleKeydown($event)", "focus": "handleFocus()" }, properties: { "attr.tabindex": "tabIndex()" } }, ngImport: i0 }); }
164
+ }
165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: NgxsmkRovingFocusItem, decorators: [{
166
+ type: Directive,
167
+ args: [{
168
+ standalone: true,
169
+ selector: '[ngxsmkRovingFocusItem]',
170
+ host: {
171
+ '[attr.tabindex]': 'tabIndex()',
172
+ '(keydown)': 'handleKeydown($event)',
173
+ '(focus)': 'handleFocus()',
174
+ },
175
+ }]
176
+ }], ctorParameters: () => [] });
177
+
178
+ /**
179
+ * Generated bundle index. Do not edit.
180
+ */
181
+
182
+ export { NGXSMK_ROVING_FOCUS_GROUP, NgxsmkRovingFocusGroup, NgxsmkRovingFocusItem };
183
+ //# sourceMappingURL=ngxsmk-cdk-roving-focus.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngxsmk-cdk-roving-focus.mjs","sources":["../../../../packages/cdk/roving-focus/roving-focus.ts","../../../../packages/cdk/roving-focus/ngxsmk-cdk-roving-focus.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n InjectionToken,\n OnDestroy,\n WritableSignal,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\nexport type NgxsmkRovingOrientation = 'horizontal' | 'vertical' | 'both';\n\nexport interface NgxsmkRovingFocusContext {\n register(item: NgxsmkRovingFocusItem): void;\n unregister(item: NgxsmkRovingFocusItem): void;\n focusNext(current: NgxsmkRovingFocusItem): void;\n focusPrev(current: NgxsmkRovingFocusItem): void;\n focusFirst(): void;\n focusLast(): void;\n activeItem: WritableSignal<NgxsmkRovingFocusItem | null>;\n orientation: () => NgxsmkRovingOrientation;\n loop: () => boolean;\n}\n\nexport const NGXSMK_ROVING_FOCUS_GROUP = new InjectionToken<NgxsmkRovingFocusContext>(\n 'NGXSMK_ROVING_FOCUS_GROUP',\n);\n\n/**\n * Universal signals-native Roving Focus container directive.\n * Manages keyboard navigation (Arrow keys, Home, End) across a set of items,\n * keeping only the currently active item focusable via Tab (`tabindex=\"0\"` vs `\"-1\"`).\n *\n * ```html\n * <div ngxsmkRovingFocusGroup orientation=\"horizontal\" [loop]=\"true\">\n * <button ngxsmkRovingFocusItem>Tab 1</button>\n * <button ngxsmkRovingFocusItem>Tab 2</button>\n * </div>\n * ```\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkRovingFocusGroup]',\n providers: [\n {\n provide: NGXSMK_ROVING_FOCUS_GROUP,\n useExisting: NgxsmkRovingFocusGroup,\n },\n ],\n})\nexport class NgxsmkRovingFocusGroup implements NgxsmkRovingFocusContext {\n readonly orientation = input<NgxsmkRovingOrientation>('horizontal');\n readonly loop = input(true, { transform: booleanAttribute });\n\n private readonly items = signal<NgxsmkRovingFocusItem[]>([]);\n readonly activeItem = signal<NgxsmkRovingFocusItem | null>(null);\n\n register(item: NgxsmkRovingFocusItem): void {\n this.items.update((list) => [...list, item]);\n if (this.activeItem() === null && !item.disabled()) {\n this.activeItem.set(item);\n }\n }\n\n unregister(item: NgxsmkRovingFocusItem): void {\n this.items.update((list) => list.filter((i) => i !== item));\n if (this.activeItem() === item) {\n const remaining = this.items().filter((i) => !i.disabled());\n this.activeItem.set(remaining.length > 0 ? remaining[0] : null);\n }\n }\n\n focusNext(current: NgxsmkRovingFocusItem): void {\n const list = this.items().filter((i) => !i.disabled());\n const idx = list.indexOf(current);\n if (idx === -1) return;\n\n if (idx < list.length - 1) {\n const next = list[idx + 1];\n this.setActiveAndFocus(next);\n } else if (this.loop()) {\n const first = list[0];\n this.setActiveAndFocus(first);\n }\n }\n\n focusPrev(current: NgxsmkRovingFocusItem): void {\n const list = this.items().filter((i) => !i.disabled());\n const idx = list.indexOf(current);\n if (idx === -1) return;\n\n if (idx > 0) {\n const prev = list[idx - 1];\n this.setActiveAndFocus(prev);\n } else if (this.loop()) {\n const last = list[list.length - 1];\n this.setActiveAndFocus(last);\n }\n }\n\n focusFirst(): void {\n const list = this.items().filter((i) => !i.disabled());\n if (list.length > 0) {\n this.setActiveAndFocus(list[0]);\n }\n }\n\n focusLast(): void {\n const list = this.items().filter((i) => !i.disabled());\n if (list.length > 0) {\n this.setActiveAndFocus(list[list.length - 1]);\n }\n }\n\n private setActiveAndFocus(item: NgxsmkRovingFocusItem): void {\n this.activeItem.set(item);\n item.focus();\n }\n}\n\n/**\n * Item in a Roving Focus group. Binds `[tabindex]` dynamically based on active state.\n */\n@Directive({\n standalone: true,\n selector: '[ngxsmkRovingFocusItem]',\n host: {\n '[attr.tabindex]': 'tabIndex()',\n '(keydown)': 'handleKeydown($event)',\n '(focus)': 'handleFocus()',\n },\n})\nexport class NgxsmkRovingFocusItem implements OnDestroy {\n private readonly group = inject(NGXSMK_ROVING_FOCUS_GROUP);\n private readonly elRef = inject(ElementRef<HTMLElement>);\n\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly focused = output<void>();\n\n readonly isActive = computed(() => this.group.activeItem() === this);\n readonly tabIndex = computed(() => {\n if (this.disabled()) return -1;\n return this.isActive() ? 0 : -1;\n });\n\n constructor() {\n this.group.register(this);\n }\n\n ngOnDestroy(): void {\n this.group.unregister(this);\n }\n\n focus(): void {\n this.elRef.nativeElement.focus();\n }\n\n protected handleFocus(): void {\n if (!this.disabled()) {\n this.group.activeItem.set(this);\n this.focused.emit();\n }\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n\n const orient = this.group.orientation();\n const isHoriz = orient === 'horizontal' || orient === 'both';\n const isVert = orient === 'vertical' || orient === 'both';\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n if ((event.key === 'ArrowRight' && isHoriz) || (event.key === 'ArrowDown' && isVert)) {\n event.preventDefault();\n this.group.focusNext(this);\n }\n break;\n\n case 'ArrowLeft':\n case 'ArrowUp':\n if ((event.key === 'ArrowLeft' && isHoriz) || (event.key === 'ArrowUp' && isVert)) {\n event.preventDefault();\n this.group.focusPrev(this);\n }\n break;\n\n case 'Home':\n event.preventDefault();\n this.group.focusFirst();\n break;\n\n case 'End':\n event.preventDefault();\n this.group.focusLast();\n break;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}