@genesislcap/foundation-utils 14.422.0 → 14.422.1-alpha-6f2ae99.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.
@@ -8,6 +8,7 @@ import { ShortcutManager } from './shortcut-manager';
8
8
  export declare class FoundationShortcutListener extends FASTElement {
9
9
  shortcutManager: ShortcutManager;
10
10
  private keyListener;
11
+ private stateSubscription;
11
12
  private isListening;
12
13
  connectedCallback(): void;
13
14
  disconnectedCallback(): void;
@@ -15,7 +16,12 @@ export declare class FoundationShortcutListener extends FASTElement {
15
16
  private addKeyListener;
16
17
  private removeKeyListener;
17
18
  private handleKeyDown;
19
+ private resolveShortcutManager;
20
+ private isShortcutManager;
18
21
  private extractKeyFromCode;
22
+ private getDeepActiveElement;
23
+ private getEventElement;
24
+ private isEditableContext;
19
25
  private isInputElement;
20
26
  }
21
27
  //# sourceMappingURL=shortcut-listener.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shortcut-listener.d.ts","sourceRoot":"","sources":["../../../src/shortcut-manager/shortcut-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;GAIG;AACH,qBAGa,0BAA2B,SAAQ,WAAW;IAChC,eAAe,EAAE,eAAe,CAAC;IAE1D,OAAO,CAAC,WAAW,CAAiD;IACpE,OAAO,CAAC,WAAW,CAAS;IAE5B,iBAAiB;IAKjB,oBAAoB;IAKpB,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,kBAAkB;IA6C1B,OAAO,CAAC,cAAc;CAuBvB"}
1
+ {"version":3,"file":"shortcut-listener.d.ts","sourceRoot":"","sources":["../../../src/shortcut-manager/shortcut-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGrE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;GAIG;AACH,qBAGa,0BAA2B,SAAQ,WAAW;IAChC,eAAe,EAAE,eAAe,CAAC;IAE1D,OAAO,CAAC,WAAW,CAAiD;IACpE,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,WAAW,CAAS;IAE5B,iBAAiB;IAKjB,oBAAoB;IAOpB,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,sBAAsB;IAiB9B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,kBAAkB;IA6C1B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,cAAc;CA4CvB"}
@@ -73,6 +73,13 @@ export interface ShortcutManager {
73
73
  isPaused: boolean;
74
74
  isPaused$: Observable<boolean>;
75
75
  isPausedSubject: BehaviorSubject<boolean>;
76
+ /**
77
+ * Register a global execution guard.
78
+ * @remarks Guards are evaluated before shortcut-specific canExecute checks.
79
+ */
80
+ registerExecutionGuard(id: string, guard: () => ShortcutExecutionStatus | boolean): void;
81
+ unregisterExecutionGuard(id: string): void;
82
+ clearExecutionGuards(): void;
76
83
  }
77
84
  /**
78
85
  * Default implementation of the ShortcutManager interface
@@ -84,6 +91,7 @@ export declare class DefaultShortcutManager implements ShortcutManager {
84
91
  private keyCombinationMap;
85
92
  private _isPausedSubject;
86
93
  private _activeContext;
94
+ private executionGuards;
87
95
  get isPaused(): boolean;
88
96
  get isPaused$(): Observable<boolean>;
89
97
  get isPausedSubject(): BehaviorSubject<boolean>;
@@ -102,6 +110,9 @@ export declare class DefaultShortcutManager implements ShortcutManager {
102
110
  setActiveContext(context: string): void;
103
111
  getActiveContext(): string | undefined;
104
112
  clearActiveContext(): void;
113
+ registerExecutionGuard(id: string, guard: () => ShortcutExecutionStatus | boolean): void;
114
+ unregisterExecutionGuard(id: string): void;
115
+ clearExecutionGuards(): void;
105
116
  pause(): void;
106
117
  resume(): void;
107
118
  /**
@@ -111,6 +122,8 @@ export declare class DefaultShortcutManager implements ShortcutManager {
111
122
  private normalizeShortcutDefinition;
112
123
  private createKeyCombinationKey;
113
124
  private isElementFocused;
125
+ private getExecutionStatus;
126
+ private getExecutionGuardStatus;
114
127
  }
115
128
  /**
116
129
  * A dependency injection token for the ShortcutManager interface.
@@ -1 +1 @@
1
- {"version":3,"file":"shortcut-manager.d.ts","sourceRoot":"","sources":["../../../src/shortcut-manager/shortcut-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAInD;;;KAGK;AACL,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,uBAAuB,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAE9B,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAE9B,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC;IAGzD,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,0BAA0B,CAAC;IAE3E,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpD;;;;OAIG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC;;;;OAIG;IACH,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5D,YAAY,IAAI,kBAAkB,EAAE,CAAC;IACrC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAAC;IAC7D,WAAW,IAAI,MAAM,EAAE,CAAC;IACxB,wBAAwB,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAGzE,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAAC;IACvC,kBAAkB,IAAI,IAAI,CAAC;IAE3B,4BAA4B,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,OAAO,EAClB,OAAO,CAAC,EAAE,OAAO,GAChB,kBAAkB,GAAG,SAAS,CAAC;IAClC,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,OAAO,CAAC,SAAS,CAAsD;IACvE,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,cAAc,CAAqB;IAE3C,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,SAAS,IAAI,UAAU,CAAC,OAAO,CAAC,CAEnC;IAED,IAAI,eAAe,IAAI,eAAe,CAAC,OAAO,CAAC,CAE9C;IAED,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,IAAI;IAMxD,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,0BAA0B;IAwG1E,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAqCrD,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQnD,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIjC,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IA+B3D,YAAY,IAAI,kBAAkB,EAAE;IASpC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAK5D,4BAA4B,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,UAAQ,EACf,MAAM,UAAQ,EACd,QAAQ,UAAQ,EAChB,OAAO,UAAQ,GACd,kBAAkB,GAAG,SAAS;IAqCjC,WAAW,IAAI,MAAM,EAAE;IAIvB,wBAAwB,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAIxE,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMtC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKvC,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAItC,kBAAkB,IAAI,IAAI;IAI1B,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,uBAAuB;IAkB/B,OAAO,CAAC,gBAAgB;CAMzB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,uEAE3B,CAAC"}
1
+ {"version":3,"file":"shortcut-manager.d.ts","sourceRoot":"","sources":["../../../src/shortcut-manager/shortcut-manager.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ let FoundationShortcutListener = class FoundationShortcutListener extends FASTEl
11
11
  constructor() {
12
12
  super(...arguments);
13
13
  this.keyListener = null;
14
+ this.stateSubscription = null;
14
15
  this.isListening = false;
15
16
  }
16
17
  connectedCallback() {
@@ -18,12 +19,17 @@ let FoundationShortcutListener = class FoundationShortcutListener extends FASTEl
18
19
  this.setupStateSubscription();
19
20
  }
20
21
  disconnectedCallback() {
22
+ var _a;
21
23
  super.disconnectedCallback();
24
+ (_a = this.stateSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
25
+ this.stateSubscription = null;
22
26
  this.removeKeyListener();
23
27
  }
24
28
  setupStateSubscription() {
29
+ var _a;
25
30
  // Subscribe to the pause state changes
26
- this.shortcutManager.isPaused$.subscribe((isPaused) => {
31
+ (_a = this.stateSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
32
+ this.stateSubscription = this.shortcutManager.isPaused$.subscribe((isPaused) => {
27
33
  if (isPaused) {
28
34
  this.removeKeyListener();
29
35
  }
@@ -51,23 +57,45 @@ let FoundationShortcutListener = class FoundationShortcutListener extends FASTEl
51
57
  this.isListening = false;
52
58
  }
53
59
  handleKeyDown(event) {
60
+ const manager = this.resolveShortcutManager(event);
54
61
  // Don't handle shortcuts if the service is paused
55
- if (this.shortcutManager.isPaused) {
62
+ if (manager.isPaused) {
56
63
  return;
57
64
  }
58
- // Don't handle shortcuts if user is typing in an input field
59
- if (this.isInputElement(event.target)) {
65
+ // Don't handle shortcuts while user is typing in editable fields.
66
+ if (this.isEditableContext(event)) {
60
67
  return;
61
68
  }
62
69
  // Extract key from event.code with proper mapping for all key types
63
70
  const key = this.extractKeyFromCode(event.code);
64
- const shortcut = this.shortcutManager.findShortcutByKeyCombination(key, event.ctrlKey, event.altKey, event.shiftKey, event.metaKey);
71
+ const shortcut = manager.findShortcutByKeyCombination(key, event.ctrlKey, event.altKey, event.shiftKey, event.metaKey);
65
72
  if (shortcut) {
66
73
  event.preventDefault();
67
74
  event.stopPropagation();
68
- this.shortcutManager.executeShortcut(shortcut.id);
75
+ manager.executeShortcut(shortcut.id);
69
76
  }
70
77
  }
78
+ resolveShortcutManager(event) {
79
+ var _a, _b, _c;
80
+ const injectedManager = this.shortcutManager;
81
+ if ((_a = injectedManager.getShortcuts) === null || _a === void 0 ? void 0 : _a.call(injectedManager).length) {
82
+ return injectedManager;
83
+ }
84
+ const eventPath = (_c = (_b = event.composedPath) === null || _b === void 0 ? void 0 : _b.call(event)) !== null && _c !== void 0 ? _c : [];
85
+ for (const entry of eventPath) {
86
+ const candidate = entry === null || entry === void 0 ? void 0 : entry.shortcutManager;
87
+ if (this.isShortcutManager(candidate)) {
88
+ return candidate;
89
+ }
90
+ }
91
+ return injectedManager;
92
+ }
93
+ isShortcutManager(candidate) {
94
+ return (!!candidate &&
95
+ typeof candidate.findShortcutByKeyCombination === 'function' &&
96
+ typeof candidate.executeShortcut === 'function' &&
97
+ typeof candidate.getShortcuts === 'function');
98
+ }
71
99
  extractKeyFromCode(code) {
72
100
  // Handle regular letter keys (KeyA, KeyB, etc.)
73
101
  if (code.startsWith('Key')) {
@@ -109,23 +137,63 @@ let FoundationShortcutListener = class FoundationShortcutListener extends FASTEl
109
137
  };
110
138
  return specialKeyMap[code] || code.toLowerCase();
111
139
  }
140
+ getDeepActiveElement() {
141
+ var _a, _b;
142
+ let active = (_a = document.activeElement) !== null && _a !== void 0 ? _a : null;
143
+ while ((_b = active === null || active === void 0 ? void 0 : active.shadowRoot) === null || _b === void 0 ? void 0 : _b.activeElement) {
144
+ active = active.shadowRoot.activeElement;
145
+ }
146
+ return active;
147
+ }
148
+ getEventElement(event) {
149
+ var _a, _b, _c;
150
+ const path = (_b = (_a = event.composedPath) === null || _a === void 0 ? void 0 : _a.call(event)) !== null && _b !== void 0 ? _b : [];
151
+ const fromPath = path.find((entry) => entry instanceof Element);
152
+ return (_c = fromPath !== null && fromPath !== void 0 ? fromPath : event.target) !== null && _c !== void 0 ? _c : null;
153
+ }
154
+ isEditableContext(event) {
155
+ const eventElement = this.getEventElement(event);
156
+ if (eventElement && this.isInputElement(eventElement)) {
157
+ return true;
158
+ }
159
+ return this.isInputElement(this.getDeepActiveElement());
160
+ }
112
161
  isInputElement(element) {
162
+ var _a, _b;
113
163
  if (!element)
114
164
  return false;
115
- const inputTypes = ['input', 'textarea', 'select'];
116
- const tagName = element.tagName.toLowerCase();
117
- if (inputTypes.includes(tagName)) {
165
+ const isEditableContent = (value) => value !== null && value !== undefined && value.toLowerCase() !== 'false';
166
+ if (isEditableContent(element.getAttribute('contenteditable')) || element.isContentEditable) {
118
167
  return true;
119
168
  }
120
- // Check for contenteditable
121
- if (element.contentEditable === 'true') {
169
+ // TODO: more generic way to check if the element is editable
170
+ const editableSelector = [
171
+ 'input',
172
+ 'textarea',
173
+ 'select',
174
+ '[contenteditable="true"]',
175
+ '[contenteditable=""]',
176
+ '[role="textbox"]',
177
+ '[role="searchbox"]',
178
+ '[role="combobox"]',
179
+ 'zero-text-field',
180
+ 'rapid-text-field',
181
+ 'zero-text-area',
182
+ 'rapid-text-area',
183
+ 'zero-combobox',
184
+ 'rapid-combobox',
185
+ ].join(',');
186
+ if (element.matches(editableSelector) || !!element.closest(editableSelector)) {
122
187
  return true;
123
188
  }
124
- // Check for role="textbox" or similar
125
189
  const role = element.getAttribute('role');
126
190
  if (role && ['textbox', 'searchbox', 'combobox'].includes(role)) {
127
191
  return true;
128
192
  }
193
+ const tagName = (_b = (_a = element.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase) === null || _b === void 0 ? void 0 : _b.call(_a);
194
+ if (tagName && ['input', 'textarea', 'select'].includes(tagName)) {
195
+ return true;
196
+ }
129
197
  return false;
130
198
  }
131
199
  };
@@ -12,6 +12,7 @@ export class DefaultShortcutManager {
12
12
  this.shortcutLookup = new Map(); // context:id -> ShortcutDefinition for quick lookups
13
13
  this.keyCombinationMap = new Map(); // key combination -> set of "context:id" strings
14
14
  this._isPausedSubject = new BehaviorSubject(false);
15
+ this.executionGuards = new Map();
15
16
  }
16
17
  get isPaused() {
17
18
  return this._isPausedSubject.value;
@@ -88,22 +89,12 @@ export class DefaultShortcutManager {
88
89
  keyCombinationDisplay,
89
90
  // Functions that can be directly used in AG Grid menu items
90
91
  disabled: () => {
91
- if (this.isPaused)
92
- return true;
93
- if (normalizedShortcut.canExecute) {
94
- const status = normalizedShortcut.canExecute();
95
- return status.disabled || false;
96
- }
97
- return false;
92
+ const status = this.getExecutionStatus(normalizedShortcut);
93
+ return status.disabled || false;
98
94
  },
99
95
  tooltip: () => {
100
- if (this.isPaused)
101
- return 'Shortcuts are paused';
102
- if (normalizedShortcut.canExecute) {
103
- const status = normalizedShortcut.canExecute();
104
- return status.tooltip;
105
- }
106
- return undefined;
96
+ const status = this.getExecutionStatus(normalizedShortcut);
97
+ return status.tooltip;
107
98
  },
108
99
  };
109
100
  }
@@ -157,11 +148,9 @@ export class DefaultShortcutManager {
157
148
  return; // Don't execute if the required element is not focused
158
149
  }
159
150
  // Check if shortcut can be executed
160
- if (shortcut.canExecute) {
161
- const executionStatus = shortcut.canExecute();
162
- if (executionStatus.disabled) {
163
- return; // Don't execute if disabled
164
- }
151
+ const executionStatus = this.getExecutionStatus(shortcut);
152
+ if (executionStatus.disabled) {
153
+ return; // Don't execute if disabled
165
154
  }
166
155
  try {
167
156
  shortcut.action();
@@ -239,6 +228,15 @@ export class DefaultShortcutManager {
239
228
  clearActiveContext() {
240
229
  this._activeContext = undefined;
241
230
  }
231
+ registerExecutionGuard(id, guard) {
232
+ this.executionGuards.set(id, guard);
233
+ }
234
+ unregisterExecutionGuard(id) {
235
+ this.executionGuards.delete(id);
236
+ }
237
+ clearExecutionGuards() {
238
+ this.executionGuards.clear();
239
+ }
242
240
  pause() {
243
241
  this._isPausedSubject.next(true);
244
242
  }
@@ -278,6 +276,29 @@ export class DefaultShortcutManager {
278
276
  }
279
277
  return false;
280
278
  }
279
+ getExecutionStatus(shortcut) {
280
+ if (this.isPaused) {
281
+ return { disabled: true, tooltip: 'Shortcuts are paused' };
282
+ }
283
+ const guardStatus = this.getExecutionGuardStatus();
284
+ if (guardStatus.disabled) {
285
+ return guardStatus;
286
+ }
287
+ if (shortcut.canExecute) {
288
+ return shortcut.canExecute();
289
+ }
290
+ return { disabled: false, tooltip: undefined };
291
+ }
292
+ getExecutionGuardStatus() {
293
+ for (const guard of this.executionGuards.values()) {
294
+ const result = guard();
295
+ const status = typeof result === 'boolean' ? { disabled: result } : result;
296
+ if (status === null || status === void 0 ? void 0 : status.disabled) {
297
+ return { disabled: true, tooltip: status.tooltip };
298
+ }
299
+ }
300
+ return { disabled: false, tooltip: undefined };
301
+ }
281
302
  }
282
303
  /**
283
304
  * A dependency injection token for the ShortcutManager interface.
@@ -2744,6 +2744,37 @@
2744
2744
  "isAbstract": false,
2745
2745
  "name": "clearActiveContext"
2746
2746
  },
2747
+ {
2748
+ "kind": "Method",
2749
+ "canonicalReference": "@genesislcap/foundation-utils!DefaultShortcutManager#clearExecutionGuards:member(1)",
2750
+ "docComment": "",
2751
+ "excerptTokens": [
2752
+ {
2753
+ "kind": "Content",
2754
+ "text": "clearExecutionGuards(): "
2755
+ },
2756
+ {
2757
+ "kind": "Content",
2758
+ "text": "void"
2759
+ },
2760
+ {
2761
+ "kind": "Content",
2762
+ "text": ";"
2763
+ }
2764
+ ],
2765
+ "isStatic": false,
2766
+ "returnTypeTokenRange": {
2767
+ "startIndex": 1,
2768
+ "endIndex": 2
2769
+ },
2770
+ "releaseTag": "Public",
2771
+ "isProtected": false,
2772
+ "overloadIndex": 1,
2773
+ "parameters": [],
2774
+ "isOptional": false,
2775
+ "isAbstract": false,
2776
+ "name": "clearExecutionGuards"
2777
+ },
2747
2778
  {
2748
2779
  "kind": "Method",
2749
2780
  "canonicalReference": "@genesislcap/foundation-utils!DefaultShortcutManager#executeShortcut:member(1)",
@@ -3357,6 +3388,79 @@
3357
3388
  "isAbstract": false,
3358
3389
  "name": "registerContext"
3359
3390
  },
3391
+ {
3392
+ "kind": "Method",
3393
+ "canonicalReference": "@genesislcap/foundation-utils!DefaultShortcutManager#registerExecutionGuard:member(1)",
3394
+ "docComment": "",
3395
+ "excerptTokens": [
3396
+ {
3397
+ "kind": "Content",
3398
+ "text": "registerExecutionGuard(id: "
3399
+ },
3400
+ {
3401
+ "kind": "Content",
3402
+ "text": "string"
3403
+ },
3404
+ {
3405
+ "kind": "Content",
3406
+ "text": ", guard: "
3407
+ },
3408
+ {
3409
+ "kind": "Content",
3410
+ "text": "() => "
3411
+ },
3412
+ {
3413
+ "kind": "Reference",
3414
+ "text": "ShortcutExecutionStatus",
3415
+ "canonicalReference": "@genesislcap/foundation-utils!ShortcutExecutionStatus:type"
3416
+ },
3417
+ {
3418
+ "kind": "Content",
3419
+ "text": " | boolean"
3420
+ },
3421
+ {
3422
+ "kind": "Content",
3423
+ "text": "): "
3424
+ },
3425
+ {
3426
+ "kind": "Content",
3427
+ "text": "void"
3428
+ },
3429
+ {
3430
+ "kind": "Content",
3431
+ "text": ";"
3432
+ }
3433
+ ],
3434
+ "isStatic": false,
3435
+ "returnTypeTokenRange": {
3436
+ "startIndex": 7,
3437
+ "endIndex": 8
3438
+ },
3439
+ "releaseTag": "Public",
3440
+ "isProtected": false,
3441
+ "overloadIndex": 1,
3442
+ "parameters": [
3443
+ {
3444
+ "parameterName": "id",
3445
+ "parameterTypeTokenRange": {
3446
+ "startIndex": 1,
3447
+ "endIndex": 2
3448
+ },
3449
+ "isOptional": false
3450
+ },
3451
+ {
3452
+ "parameterName": "guard",
3453
+ "parameterTypeTokenRange": {
3454
+ "startIndex": 3,
3455
+ "endIndex": 6
3456
+ },
3457
+ "isOptional": false
3458
+ }
3459
+ ],
3460
+ "isOptional": false,
3461
+ "isAbstract": false,
3462
+ "name": "registerExecutionGuard"
3463
+ },
3360
3464
  {
3361
3465
  "kind": "Method",
3362
3466
  "canonicalReference": "@genesislcap/foundation-utils!DefaultShortcutManager#registerShortcut:member(1)",
@@ -3539,6 +3643,54 @@
3539
3643
  "isAbstract": false,
3540
3644
  "name": "setActiveContext"
3541
3645
  },
3646
+ {
3647
+ "kind": "Method",
3648
+ "canonicalReference": "@genesislcap/foundation-utils!DefaultShortcutManager#unregisterExecutionGuard:member(1)",
3649
+ "docComment": "",
3650
+ "excerptTokens": [
3651
+ {
3652
+ "kind": "Content",
3653
+ "text": "unregisterExecutionGuard(id: "
3654
+ },
3655
+ {
3656
+ "kind": "Content",
3657
+ "text": "string"
3658
+ },
3659
+ {
3660
+ "kind": "Content",
3661
+ "text": "): "
3662
+ },
3663
+ {
3664
+ "kind": "Content",
3665
+ "text": "void"
3666
+ },
3667
+ {
3668
+ "kind": "Content",
3669
+ "text": ";"
3670
+ }
3671
+ ],
3672
+ "isStatic": false,
3673
+ "returnTypeTokenRange": {
3674
+ "startIndex": 3,
3675
+ "endIndex": 4
3676
+ },
3677
+ "releaseTag": "Public",
3678
+ "isProtected": false,
3679
+ "overloadIndex": 1,
3680
+ "parameters": [
3681
+ {
3682
+ "parameterName": "id",
3683
+ "parameterTypeTokenRange": {
3684
+ "startIndex": 1,
3685
+ "endIndex": 2
3686
+ },
3687
+ "isOptional": false
3688
+ }
3689
+ ],
3690
+ "isOptional": false,
3691
+ "isAbstract": false,
3692
+ "name": "unregisterExecutionGuard"
3693
+ },
3542
3694
  {
3543
3695
  "kind": "Method",
3544
3696
  "canonicalReference": "@genesislcap/foundation-utils!DefaultShortcutManager#unregisterShortcut:member(1)",
@@ -17665,6 +17817,34 @@
17665
17817
  "parameters": [],
17666
17818
  "name": "clearActiveContext"
17667
17819
  },
17820
+ {
17821
+ "kind": "MethodSignature",
17822
+ "canonicalReference": "@genesislcap/foundation-utils!ShortcutManager#clearExecutionGuards:member(1)",
17823
+ "docComment": "",
17824
+ "excerptTokens": [
17825
+ {
17826
+ "kind": "Content",
17827
+ "text": "clearExecutionGuards(): "
17828
+ },
17829
+ {
17830
+ "kind": "Content",
17831
+ "text": "void"
17832
+ },
17833
+ {
17834
+ "kind": "Content",
17835
+ "text": ";"
17836
+ }
17837
+ ],
17838
+ "isOptional": false,
17839
+ "returnTypeTokenRange": {
17840
+ "startIndex": 1,
17841
+ "endIndex": 2
17842
+ },
17843
+ "releaseTag": "Public",
17844
+ "overloadIndex": 1,
17845
+ "parameters": [],
17846
+ "name": "clearExecutionGuards"
17847
+ },
17668
17848
  {
17669
17849
  "kind": "MethodSignature",
17670
17850
  "canonicalReference": "@genesislcap/foundation-utils!ShortcutManager#executeShortcut:member(1)",
@@ -18239,6 +18419,76 @@
18239
18419
  ],
18240
18420
  "name": "registerContext"
18241
18421
  },
18422
+ {
18423
+ "kind": "MethodSignature",
18424
+ "canonicalReference": "@genesislcap/foundation-utils!ShortcutManager#registerExecutionGuard:member(1)",
18425
+ "docComment": "/**\n * Register a global execution guard.\n *\n * @remarks\n *\n * Guards are evaluated before shortcut-specific canExecute checks.\n */\n",
18426
+ "excerptTokens": [
18427
+ {
18428
+ "kind": "Content",
18429
+ "text": "registerExecutionGuard(id: "
18430
+ },
18431
+ {
18432
+ "kind": "Content",
18433
+ "text": "string"
18434
+ },
18435
+ {
18436
+ "kind": "Content",
18437
+ "text": ", guard: "
18438
+ },
18439
+ {
18440
+ "kind": "Content",
18441
+ "text": "() => "
18442
+ },
18443
+ {
18444
+ "kind": "Reference",
18445
+ "text": "ShortcutExecutionStatus",
18446
+ "canonicalReference": "@genesislcap/foundation-utils!ShortcutExecutionStatus:type"
18447
+ },
18448
+ {
18449
+ "kind": "Content",
18450
+ "text": " | boolean"
18451
+ },
18452
+ {
18453
+ "kind": "Content",
18454
+ "text": "): "
18455
+ },
18456
+ {
18457
+ "kind": "Content",
18458
+ "text": "void"
18459
+ },
18460
+ {
18461
+ "kind": "Content",
18462
+ "text": ";"
18463
+ }
18464
+ ],
18465
+ "isOptional": false,
18466
+ "returnTypeTokenRange": {
18467
+ "startIndex": 7,
18468
+ "endIndex": 8
18469
+ },
18470
+ "releaseTag": "Public",
18471
+ "overloadIndex": 1,
18472
+ "parameters": [
18473
+ {
18474
+ "parameterName": "id",
18475
+ "parameterTypeTokenRange": {
18476
+ "startIndex": 1,
18477
+ "endIndex": 2
18478
+ },
18479
+ "isOptional": false
18480
+ },
18481
+ {
18482
+ "parameterName": "guard",
18483
+ "parameterTypeTokenRange": {
18484
+ "startIndex": 3,
18485
+ "endIndex": 6
18486
+ },
18487
+ "isOptional": false
18488
+ }
18489
+ ],
18490
+ "name": "registerExecutionGuard"
18491
+ },
18242
18492
  {
18243
18493
  "kind": "MethodSignature",
18244
18494
  "canonicalReference": "@genesislcap/foundation-utils!ShortcutManager#registerShortcut:member(1)",
@@ -18409,6 +18659,51 @@
18409
18659
  ],
18410
18660
  "name": "setActiveContext"
18411
18661
  },
18662
+ {
18663
+ "kind": "MethodSignature",
18664
+ "canonicalReference": "@genesislcap/foundation-utils!ShortcutManager#unregisterExecutionGuard:member(1)",
18665
+ "docComment": "",
18666
+ "excerptTokens": [
18667
+ {
18668
+ "kind": "Content",
18669
+ "text": "unregisterExecutionGuard(id: "
18670
+ },
18671
+ {
18672
+ "kind": "Content",
18673
+ "text": "string"
18674
+ },
18675
+ {
18676
+ "kind": "Content",
18677
+ "text": "): "
18678
+ },
18679
+ {
18680
+ "kind": "Content",
18681
+ "text": "void"
18682
+ },
18683
+ {
18684
+ "kind": "Content",
18685
+ "text": ";"
18686
+ }
18687
+ ],
18688
+ "isOptional": false,
18689
+ "returnTypeTokenRange": {
18690
+ "startIndex": 3,
18691
+ "endIndex": 4
18692
+ },
18693
+ "releaseTag": "Public",
18694
+ "overloadIndex": 1,
18695
+ "parameters": [
18696
+ {
18697
+ "parameterName": "id",
18698
+ "parameterTypeTokenRange": {
18699
+ "startIndex": 1,
18700
+ "endIndex": 2
18701
+ },
18702
+ "isOptional": false
18703
+ }
18704
+ ],
18705
+ "name": "unregisterExecutionGuard"
18706
+ },
18412
18707
  {
18413
18708
  "kind": "MethodSignature",
18414
18709
  "canonicalReference": "@genesislcap/foundation-utils!ShortcutManager#unregisterShortcut:member(1)",