qnce-engine 1.2.0 → 1.2.1

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 (123) hide show
  1. package/README.md +713 -7
  2. package/dist/cli/audit.js +0 -0
  3. package/dist/cli/init.js +0 -0
  4. package/dist/cli/perf.d.ts.map +1 -1
  5. package/dist/cli/perf.js +2 -1
  6. package/dist/cli/perf.js.map +1 -1
  7. package/dist/cli/play.d.ts +4 -0
  8. package/dist/cli/play.d.ts.map +1 -0
  9. package/dist/cli/play.js +259 -0
  10. package/dist/cli/play.js.map +1 -0
  11. package/dist/engine/condition.d.ts +69 -0
  12. package/dist/engine/condition.d.ts.map +1 -0
  13. package/dist/engine/condition.js +195 -0
  14. package/dist/engine/condition.js.map +1 -0
  15. package/dist/engine/core.d.ts +274 -3
  16. package/dist/engine/core.d.ts.map +1 -1
  17. package/dist/engine/core.js +1148 -9
  18. package/dist/engine/core.js.map +1 -1
  19. package/dist/engine/demo-story.d.ts.map +1 -1
  20. package/dist/engine/demo-story.js +99 -13
  21. package/dist/engine/demo-story.js.map +1 -1
  22. package/dist/engine/errors.d.ts +76 -0
  23. package/dist/engine/errors.d.ts.map +1 -0
  24. package/dist/engine/errors.js +178 -0
  25. package/dist/engine/errors.js.map +1 -0
  26. package/dist/engine/types.d.ts +445 -0
  27. package/dist/engine/types.d.ts.map +1 -0
  28. package/dist/engine/types.js +9 -0
  29. package/dist/engine/types.js.map +1 -0
  30. package/dist/engine/validation.d.ts +110 -0
  31. package/dist/engine/validation.d.ts.map +1 -0
  32. package/dist/engine/validation.js +261 -0
  33. package/dist/engine/validation.js.map +1 -0
  34. package/dist/examples/examples/autosave-undo-demo.js +248 -0
  35. package/dist/examples/examples/persistence-demo.js +63 -0
  36. package/dist/examples/src/engine/condition.js +194 -0
  37. package/dist/examples/src/engine/core.js +1382 -0
  38. package/dist/examples/src/engine/demo-story.js +200 -0
  39. package/dist/examples/src/engine/types.js +8 -0
  40. package/dist/examples/src/index.js +35 -0
  41. package/dist/examples/src/integrations/react.js +322 -0
  42. package/dist/examples/src/narrative/branching/engine-simple.js +348 -0
  43. package/dist/examples/src/narrative/branching/index.js +55 -0
  44. package/dist/examples/src/narrative/branching/models.js +5 -0
  45. package/dist/examples/src/performance/ObjectPool.js +296 -0
  46. package/dist/examples/src/performance/PerfReporter.js +280 -0
  47. package/dist/examples/src/performance/ThreadPool.js +347 -0
  48. package/dist/index.d.ts +4 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +12 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/integrations/react.d.ts +200 -0
  53. package/dist/integrations/react.d.ts.map +1 -0
  54. package/dist/integrations/react.js +365 -0
  55. package/dist/integrations/react.js.map +1 -0
  56. package/dist/narrative/branching/engine-simple.js +3 -3
  57. package/dist/narrative/branching/engine-simple.js.map +1 -1
  58. package/dist/narrative/branching/engine.d.ts +1 -0
  59. package/dist/narrative/branching/engine.d.ts.map +1 -0
  60. package/dist/narrative/branching/engine.js +2 -0
  61. package/dist/narrative/branching/engine.js.map +1 -0
  62. package/dist/narrative/branching/models.d.ts.map +1 -1
  63. package/dist/performance/HotReloadDelta.d.ts +25 -8
  64. package/dist/performance/HotReloadDelta.d.ts.map +1 -1
  65. package/dist/performance/HotReloadDelta.js +10 -15
  66. package/dist/performance/HotReloadDelta.js.map +1 -1
  67. package/dist/ui/__tests__/AutosaveIndicator.test.d.ts +2 -0
  68. package/dist/ui/__tests__/AutosaveIndicator.test.d.ts.map +1 -0
  69. package/dist/ui/__tests__/AutosaveIndicator.test.js +329 -0
  70. package/dist/ui/__tests__/AutosaveIndicator.test.js.map +1 -0
  71. package/dist/ui/__tests__/UndoRedoControls.test.d.ts +2 -0
  72. package/dist/ui/__tests__/UndoRedoControls.test.d.ts.map +1 -0
  73. package/dist/ui/__tests__/UndoRedoControls.test.js +245 -0
  74. package/dist/ui/__tests__/UndoRedoControls.test.js.map +1 -0
  75. package/dist/ui/__tests__/autosave-simple.test.d.ts +2 -0
  76. package/dist/ui/__tests__/autosave-simple.test.d.ts.map +1 -0
  77. package/dist/ui/__tests__/autosave-simple.test.js +29 -0
  78. package/dist/ui/__tests__/autosave-simple.test.js.map +1 -0
  79. package/dist/ui/__tests__/setup.d.ts +2 -0
  80. package/dist/ui/__tests__/setup.d.ts.map +1 -0
  81. package/dist/ui/__tests__/setup.js +40 -0
  82. package/dist/ui/__tests__/setup.js.map +1 -0
  83. package/dist/ui/__tests__/smoke-test.d.ts +2 -0
  84. package/dist/ui/__tests__/smoke-test.d.ts.map +1 -0
  85. package/dist/ui/__tests__/smoke-test.js +18 -0
  86. package/dist/ui/__tests__/smoke-test.js.map +1 -0
  87. package/dist/ui/__tests__/smoke-test.test.d.ts +2 -0
  88. package/dist/ui/__tests__/smoke-test.test.d.ts.map +1 -0
  89. package/dist/ui/__tests__/smoke-test.test.js +18 -0
  90. package/dist/ui/__tests__/smoke-test.test.js.map +1 -0
  91. package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts +2 -0
  92. package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts.map +1 -0
  93. package/dist/ui/__tests__/useKeyboardShortcuts.test.js +374 -0
  94. package/dist/ui/__tests__/useKeyboardShortcuts.test.js.map +1 -0
  95. package/dist/ui/components/AutosaveIndicator.d.ts +18 -0
  96. package/dist/ui/components/AutosaveIndicator.d.ts.map +1 -0
  97. package/dist/ui/components/AutosaveIndicator.js +175 -0
  98. package/dist/ui/components/AutosaveIndicator.js.map +1 -0
  99. package/dist/ui/components/UndoRedoControls.d.ts +16 -0
  100. package/dist/ui/components/UndoRedoControls.d.ts.map +1 -0
  101. package/dist/ui/components/UndoRedoControls.js +144 -0
  102. package/dist/ui/components/UndoRedoControls.js.map +1 -0
  103. package/dist/ui/hooks/useKeyboardShortcuts.d.ts +22 -0
  104. package/dist/ui/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  105. package/dist/ui/hooks/useKeyboardShortcuts.js +162 -0
  106. package/dist/ui/hooks/useKeyboardShortcuts.js.map +1 -0
  107. package/dist/ui/index.d.ts +9 -0
  108. package/dist/ui/index.d.ts.map +1 -0
  109. package/dist/ui/index.js +14 -0
  110. package/dist/ui/index.js.map +1 -0
  111. package/dist/ui/types.d.ts +141 -0
  112. package/dist/ui/types.d.ts.map +1 -0
  113. package/dist/ui/types.js +51 -0
  114. package/dist/ui/types.js.map +1 -0
  115. package/examples/autosave-undo-demo.ts +306 -0
  116. package/examples/branching-demo-simple.ts +0 -0
  117. package/examples/branching-demo.ts +0 -0
  118. package/examples/persistence-demo.ts +84 -0
  119. package/examples/tsconfig.json +13 -0
  120. package/examples/ui-components-demo.tsx +320 -0
  121. package/examples/validation-demo-story.json +177 -0
  122. package/examples/validation-demo.js +163 -0
  123. package/package.json +23 -3
@@ -0,0 +1,374 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const react_1 = require("@testing-library/react");
4
+ const useKeyboardShortcuts_1 = require("../hooks/useKeyboardShortcuts");
5
+ const core_1 = require("../../engine/core");
6
+ const demo_story_1 = require("../../engine/demo-story");
7
+ // Mock the global addEventListener/removeEventListener
8
+ const mockAddEventListener = jest.fn();
9
+ const mockRemoveEventListener = jest.fn();
10
+ describe('useKeyboardShortcuts', () => {
11
+ let engine;
12
+ let mockKeyboardEvent;
13
+ beforeEach(() => {
14
+ // Mock document.addEventListener/removeEventListener since the hook uses document as default target
15
+ Object.defineProperty(document, 'addEventListener', {
16
+ value: mockAddEventListener,
17
+ writable: true,
18
+ });
19
+ Object.defineProperty(document, 'removeEventListener', {
20
+ value: mockRemoveEventListener,
21
+ writable: true,
22
+ });
23
+ engine = (0, core_1.createQNCEEngine)(demo_story_1.DEMO_STORY);
24
+ // Mock engine methods that the hook expects
25
+ engine.undo = jest.fn().mockResolvedValue({ success: true });
26
+ engine.redo = jest.fn().mockResolvedValue({ success: true });
27
+ engine.canUndo = jest.fn().mockReturnValue(true);
28
+ engine.canRedo = jest.fn().mockReturnValue(true);
29
+ engine.manualAutosave = jest.fn().mockResolvedValue({});
30
+ engine.resetNarrative = jest.fn();
31
+ // Mock window.confirm for reset functionality
32
+ Object.defineProperty(window, 'confirm', {
33
+ value: jest.fn().mockReturnValue(true),
34
+ writable: true,
35
+ });
36
+ mockKeyboardEvent = {
37
+ key: '',
38
+ ctrlKey: false,
39
+ metaKey: false,
40
+ shiftKey: false,
41
+ altKey: false,
42
+ preventDefault: jest.fn(),
43
+ stopPropagation: jest.fn()
44
+ };
45
+ jest.clearAllMocks();
46
+ mockAddEventListener.mockClear();
47
+ mockRemoveEventListener.mockClear();
48
+ });
49
+ describe('Hook Initialization', () => {
50
+ it('registers keyboard event listeners when enabled', () => {
51
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, { enabled: true }));
52
+ expect(mockAddEventListener).toHaveBeenCalledWith('keydown', expect.any(Function));
53
+ });
54
+ it('does not register listeners when disabled', () => {
55
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, { enabled: false }));
56
+ expect(mockAddEventListener).not.toHaveBeenCalled();
57
+ });
58
+ it('removes event listeners on unmount', () => {
59
+ const { unmount } = (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, { enabled: true }));
60
+ unmount();
61
+ expect(mockRemoveEventListener).toHaveBeenCalledWith('keydown', expect.any(Function));
62
+ });
63
+ });
64
+ describe('Default Keyboard Shortcuts', () => {
65
+ it('triggers undo on Ctrl+Z', async () => {
66
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, { enabled: true }));
67
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
68
+ await (0, react_1.act)(async () => {
69
+ keydownHandler({
70
+ ...mockKeyboardEvent,
71
+ key: 'z',
72
+ ctrlKey: true
73
+ });
74
+ });
75
+ expect(engine.undo).toHaveBeenCalledTimes(1);
76
+ });
77
+ it('triggers undo on Cmd+Z (Mac)', async () => {
78
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, { enabled: true }));
79
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
80
+ await (0, react_1.act)(async () => {
81
+ keydownHandler({
82
+ ...mockKeyboardEvent,
83
+ key: 'z',
84
+ metaKey: true
85
+ });
86
+ });
87
+ expect(engine.undo).toHaveBeenCalledTimes(1);
88
+ });
89
+ it('triggers redo on Ctrl+Y', async () => {
90
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, { enabled: true }));
91
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
92
+ await (0, react_1.act)(async () => {
93
+ keydownHandler({
94
+ ...mockKeyboardEvent,
95
+ key: 'y',
96
+ ctrlKey: true
97
+ });
98
+ });
99
+ expect(engine.redo).toHaveBeenCalledTimes(1);
100
+ });
101
+ it('triggers redo on Ctrl+Shift+Z', async () => {
102
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, { enabled: true }));
103
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
104
+ await (0, react_1.act)(async () => {
105
+ keydownHandler({
106
+ ...mockKeyboardEvent,
107
+ key: 'z',
108
+ ctrlKey: true,
109
+ shiftKey: true
110
+ });
111
+ });
112
+ expect(engine.redo).toHaveBeenCalledTimes(1);
113
+ });
114
+ it('triggers save on Ctrl+S', async () => {
115
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, { enabled: true }));
116
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
117
+ await (0, react_1.act)(async () => {
118
+ keydownHandler({
119
+ ...mockKeyboardEvent,
120
+ key: 's',
121
+ ctrlKey: true
122
+ });
123
+ });
124
+ expect(engine.manualAutosave).toHaveBeenCalledTimes(1);
125
+ });
126
+ });
127
+ describe('Custom Keyboard Bindings', () => {
128
+ it('uses custom bindings when provided', async () => {
129
+ const customBindings = {
130
+ undo: ['ctrl+u'],
131
+ redo: ['ctrl+r'],
132
+ save: ['ctrl+shift+s'],
133
+ reset: ['ctrl+alt+r']
134
+ };
135
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, {
136
+ enabled: true,
137
+ bindings: customBindings
138
+ }));
139
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
140
+ // Test custom undo binding
141
+ await (0, react_1.act)(async () => {
142
+ keydownHandler({
143
+ ...mockKeyboardEvent,
144
+ key: 'u',
145
+ ctrlKey: true
146
+ });
147
+ });
148
+ expect(engine.undo).toHaveBeenCalledTimes(1);
149
+ });
150
+ it('supports multiple bindings for the same action', async () => {
151
+ const customBindings = {
152
+ undo: ['ctrl+z', 'ctrl+u', 'cmd+z']
153
+ };
154
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, {
155
+ enabled: true,
156
+ bindings: customBindings
157
+ }));
158
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
159
+ // Test first binding
160
+ await (0, react_1.act)(async () => {
161
+ keydownHandler({
162
+ ...mockKeyboardEvent,
163
+ key: 'z',
164
+ ctrlKey: true
165
+ });
166
+ });
167
+ // Test second binding
168
+ await (0, react_1.act)(async () => {
169
+ keydownHandler({
170
+ ...mockKeyboardEvent,
171
+ key: 'u',
172
+ ctrlKey: true
173
+ });
174
+ });
175
+ // Test third binding
176
+ await (0, react_1.act)(async () => {
177
+ keydownHandler({
178
+ ...mockKeyboardEvent,
179
+ key: 'z',
180
+ metaKey: true
181
+ });
182
+ });
183
+ expect(engine.undo).toHaveBeenCalledTimes(3);
184
+ });
185
+ });
186
+ describe('Callback Functions', () => {
187
+ it('executes undo action when undo is triggered', async () => {
188
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, {
189
+ enabled: true
190
+ }));
191
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
192
+ await (0, react_1.act)(async () => {
193
+ keydownHandler({
194
+ ...mockKeyboardEvent,
195
+ key: 'z',
196
+ ctrlKey: true
197
+ });
198
+ });
199
+ expect(engine.undo).toHaveBeenCalledTimes(1);
200
+ });
201
+ it('executes redo action when redo is triggered', async () => {
202
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, {
203
+ enabled: true
204
+ }));
205
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
206
+ await (0, react_1.act)(async () => {
207
+ keydownHandler({
208
+ ...mockKeyboardEvent,
209
+ key: 'y',
210
+ ctrlKey: true
211
+ });
212
+ });
213
+ expect(engine.redo).toHaveBeenCalledTimes(1);
214
+ });
215
+ it('executes save action when save is triggered', async () => {
216
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, {
217
+ enabled: true
218
+ }));
219
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
220
+ await (0, react_1.act)(async () => {
221
+ keydownHandler({
222
+ ...mockKeyboardEvent,
223
+ key: 's',
224
+ ctrlKey: true
225
+ });
226
+ });
227
+ expect(engine.manualAutosave).toHaveBeenCalledTimes(1);
228
+ });
229
+ it('executes reset action when reset is triggered', async () => {
230
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, {
231
+ enabled: true,
232
+ bindings: { reset: ['ctrl+r'] }
233
+ }));
234
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
235
+ await (0, react_1.act)(async () => {
236
+ keydownHandler({
237
+ ...mockKeyboardEvent,
238
+ key: 'r',
239
+ ctrlKey: true
240
+ });
241
+ });
242
+ expect(engine.resetNarrative).toHaveBeenCalledTimes(1);
243
+ });
244
+ });
245
+ describe('Event Prevention', () => {
246
+ it('prevents default behavior for recognized shortcuts', async () => {
247
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, { enabled: true }));
248
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
249
+ const event = {
250
+ ...mockKeyboardEvent,
251
+ key: 'z',
252
+ ctrlKey: true
253
+ };
254
+ await (0, react_1.act)(async () => {
255
+ keydownHandler(event);
256
+ });
257
+ expect(event.preventDefault).toHaveBeenCalledTimes(1);
258
+ });
259
+ it('does not prevent default for unrecognized key combinations', async () => {
260
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, { enabled: true }));
261
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
262
+ const event = {
263
+ ...mockKeyboardEvent,
264
+ key: 'x',
265
+ ctrlKey: true
266
+ };
267
+ await (0, react_1.act)(async () => {
268
+ keydownHandler(event);
269
+ });
270
+ expect(event.preventDefault).not.toHaveBeenCalled();
271
+ });
272
+ it('prevents default behavior when preventDefault is enabled', async () => {
273
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, {
274
+ enabled: true,
275
+ preventDefault: true
276
+ }));
277
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
278
+ const event = {
279
+ ...mockKeyboardEvent,
280
+ key: 'z',
281
+ ctrlKey: true
282
+ };
283
+ await (0, react_1.act)(async () => {
284
+ keydownHandler(event);
285
+ });
286
+ expect(event.preventDefault).toHaveBeenCalledTimes(1);
287
+ });
288
+ });
289
+ describe('Accessibility Features', () => {
290
+ it('works with different target elements', () => {
291
+ const targetElement = document.createElement('div');
292
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, {
293
+ enabled: true,
294
+ target: targetElement
295
+ }));
296
+ // Should not throw an error with custom target
297
+ expect(true).toBe(true);
298
+ });
299
+ it('provides consistent keyboard navigation patterns', () => {
300
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, {
301
+ enabled: true
302
+ }));
303
+ // Hook should work consistently
304
+ expect(true).toBe(true);
305
+ });
306
+ });
307
+ describe('Error Handling', () => {
308
+ it('handles engine method failures gracefully', async () => {
309
+ const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
310
+ engine.undo.mockImplementation(() => {
311
+ throw new Error('Undo failed');
312
+ });
313
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, {
314
+ enabled: true
315
+ }));
316
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
317
+ // Should not throw when engine method fails
318
+ expect(() => {
319
+ keydownHandler({
320
+ ...mockKeyboardEvent,
321
+ key: 'z',
322
+ ctrlKey: true
323
+ });
324
+ }).not.toThrow();
325
+ consoleSpy.mockRestore();
326
+ });
327
+ it('handles null/undefined engine gracefully', () => {
328
+ expect(() => {
329
+ (0, react_1.renderHook)(() => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(null, { enabled: true }));
330
+ }).not.toThrow();
331
+ });
332
+ });
333
+ describe('Dynamic Configuration Updates', () => {
334
+ it('updates listeners when configuration changes', () => {
335
+ const { rerender } = (0, react_1.renderHook)(({ config }) => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, config), { initialProps: { config: { enabled: false } } });
336
+ expect(mockAddEventListener).not.toHaveBeenCalled();
337
+ rerender({ config: { enabled: true } });
338
+ expect(mockAddEventListener).toHaveBeenCalledWith('keydown', expect.any(Function));
339
+ });
340
+ it('updates bindings when they change', async () => {
341
+ const { rerender } = (0, react_1.renderHook)(({ bindings }) => (0, useKeyboardShortcuts_1.useKeyboardShortcuts)(engine, { enabled: true, bindings }), { initialProps: { bindings: { undo: ['ctrl+z'] } } });
342
+ // Test original binding
343
+ const keydownHandler = mockAddEventListener.mock.calls.find(call => call[0] === 'keydown')[1];
344
+ await (0, react_1.act)(async () => {
345
+ keydownHandler({
346
+ ...mockKeyboardEvent,
347
+ key: 'z',
348
+ ctrlKey: true
349
+ });
350
+ });
351
+ expect(engine.undo).toHaveBeenCalledTimes(1);
352
+ // Update bindings
353
+ rerender({ bindings: { undo: ['ctrl+u'] } });
354
+ // Old binding should not work
355
+ await (0, react_1.act)(async () => {
356
+ keydownHandler({
357
+ ...mockKeyboardEvent,
358
+ key: 'z',
359
+ ctrlKey: true
360
+ });
361
+ });
362
+ // New binding should work
363
+ await (0, react_1.act)(async () => {
364
+ keydownHandler({
365
+ ...mockKeyboardEvent,
366
+ key: 'u',
367
+ ctrlKey: true
368
+ });
369
+ });
370
+ expect(engine.undo).toHaveBeenCalledTimes(2);
371
+ });
372
+ });
373
+ });
374
+ //# sourceMappingURL=useKeyboardShortcuts.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKeyboardShortcuts.test.js","sourceRoot":"","sources":["../../../src/ui/__tests__/useKeyboardShortcuts.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { AutosaveIndicatorProps } from '../types';
3
+ /**
4
+ * AutosaveIndicator Component
5
+ *
6
+ * Visual indicator showing autosave status with animated feedback,
7
+ * timestamp display, and customizable positioning.
8
+ *
9
+ * Features:
10
+ * - Real-time autosave status updates (idle, saving, saved, error)
11
+ * - Animated visual feedback with spinner and status icons
12
+ * - Configurable positioning (corners, inline)
13
+ * - Timestamp of last successful save
14
+ * - Auto-hide functionality
15
+ * - Accessible with proper ARIA labels
16
+ */
17
+ export declare const AutosaveIndicator: React.FC<AutosaveIndicatorProps>;
18
+ //# sourceMappingURL=AutosaveIndicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutosaveIndicator.d.ts","sourceRoot":"","sources":["../../../src/ui/components/AutosaveIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAA2C,MAAM,UAAU,CAAC;AAG3F;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAsN9D,CAAC"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AutosaveIndicator = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const types_1 = require("../types");
7
+ const react_2 = require("../../integrations/react");
8
+ /**
9
+ * AutosaveIndicator Component
10
+ *
11
+ * Visual indicator showing autosave status with animated feedback,
12
+ * timestamp display, and customizable positioning.
13
+ *
14
+ * Features:
15
+ * - Real-time autosave status updates (idle, saving, saved, error)
16
+ * - Animated visual feedback with spinner and status icons
17
+ * - Configurable positioning (corners, inline)
18
+ * - Timestamp of last successful save
19
+ * - Auto-hide functionality
20
+ * - Accessible with proper ARIA labels
21
+ */
22
+ const AutosaveIndicator = ({ engine, theme: customTheme, className = '', style, variant = 'detailed', position = 'inline', messages = {
23
+ idle: 'Auto-save ready',
24
+ saving: 'Saving...',
25
+ saved: 'Saved',
26
+ error: 'Save failed',
27
+ disabled: 'Autosave disabled'
28
+ }, showTimestamp = true, autoHideDelay = 3000 }) => {
29
+ const { isEnabled, lastAutosave, isSaving } = (0, react_2.useAutosave)(engine);
30
+ const [visible, setVisible] = (0, react_1.useState)(true);
31
+ const [isAnimating, setIsAnimating] = (0, react_1.useState)(false);
32
+ const [lastSaveSuccessful, setLastSaveSuccessful] = (0, react_1.useState)(true);
33
+ // Determine status based on hook values
34
+ const status = (0, react_1.useMemo)(() => {
35
+ if (!isEnabled)
36
+ return 'disabled';
37
+ if (isSaving)
38
+ return 'saving';
39
+ if (lastAutosave && !isSaving) {
40
+ return lastSaveSuccessful ? 'saved' : 'error';
41
+ }
42
+ return 'idle';
43
+ }, [isEnabled, isSaving, lastAutosave, lastSaveSuccessful]);
44
+ // Merge custom theme with default theme
45
+ const theme = (0, react_1.useMemo)(() => ({
46
+ ...types_1.defaultTheme,
47
+ ...customTheme,
48
+ colors: { ...types_1.defaultTheme.colors, ...customTheme?.colors },
49
+ spacing: { ...types_1.defaultTheme.spacing, ...customTheme?.spacing },
50
+ borderRadius: { ...types_1.defaultTheme.borderRadius, ...customTheme?.borderRadius },
51
+ typography: {
52
+ ...types_1.defaultTheme.typography,
53
+ ...customTheme?.typography,
54
+ fontSize: { ...types_1.defaultTheme.typography.fontSize, ...customTheme?.typography?.fontSize },
55
+ fontWeight: { ...types_1.defaultTheme.typography.fontWeight, ...customTheme?.typography?.fontWeight }
56
+ },
57
+ shadows: { ...types_1.defaultTheme.shadows, ...customTheme?.shadows }
58
+ }), [customTheme]);
59
+ // Auto-hide logic for saved status
60
+ (0, react_1.useEffect)(() => {
61
+ setVisible(true);
62
+ if (status === 'saved' && autoHideDelay > 0) {
63
+ const hideTimer = setTimeout(() => {
64
+ setVisible(false);
65
+ }, autoHideDelay);
66
+ return () => clearTimeout(hideTimer);
67
+ }
68
+ }, [status, autoHideDelay]);
69
+ (0, react_1.useEffect)(() => {
70
+ setIsAnimating(isSaving);
71
+ }, [isSaving]);
72
+ // Position styles
73
+ const getPositionStyles = () => {
74
+ const basePositionStyle = {
75
+ position: position === 'inline' ? 'static' : 'fixed',
76
+ zIndex: 1000
77
+ };
78
+ switch (position) {
79
+ case 'top-left':
80
+ return { ...basePositionStyle, top: theme.spacing.md, left: theme.spacing.md };
81
+ case 'top-right':
82
+ return { ...basePositionStyle, top: theme.spacing.md, right: theme.spacing.md };
83
+ case 'bottom-left':
84
+ return { ...basePositionStyle, bottom: theme.spacing.md, left: theme.spacing.md };
85
+ case 'bottom-right':
86
+ return { ...basePositionStyle, bottom: theme.spacing.md, right: theme.spacing.md };
87
+ default:
88
+ return basePositionStyle;
89
+ }
90
+ };
91
+ // Status-based styling
92
+ const getStatusColor = (currentStatus) => {
93
+ switch (currentStatus) {
94
+ case 'saving':
95
+ return theme.colors.warning;
96
+ case 'saved':
97
+ return theme.colors.success;
98
+ case 'error':
99
+ return theme.colors.error;
100
+ default:
101
+ return theme.colors.secondary;
102
+ }
103
+ };
104
+ // Icons and indicators
105
+ const StatusIcon = ({ status }) => {
106
+ const iconStyle = {
107
+ fontSize: '16px',
108
+ lineHeight: 1,
109
+ color: getStatusColor(status)
110
+ };
111
+ switch (status) {
112
+ case 'saving':
113
+ return ((0, jsx_runtime_1.jsx)("span", { style: {
114
+ ...iconStyle,
115
+ animation: isAnimating ? 'spin 1s linear infinite' : 'none'
116
+ }, children: "\u27F3" }));
117
+ case 'saved':
118
+ return (0, jsx_runtime_1.jsx)("span", { style: iconStyle, children: "\u2713" });
119
+ case 'error':
120
+ return (0, jsx_runtime_1.jsx)("span", { style: iconStyle, children: "\u2717" });
121
+ default:
122
+ return (0, jsx_runtime_1.jsx)("span", { style: iconStyle, children: "\u25CB" });
123
+ }
124
+ };
125
+ // Format timestamp
126
+ const formatTimestamp = (date) => {
127
+ if (!date)
128
+ return '';
129
+ return date.toLocaleTimeString([], { hour12: false, timeStyle: 'short' });
130
+ };
131
+ // Component styles
132
+ const containerStyle = {
133
+ display: visible ? 'flex' : 'none',
134
+ alignItems: 'center',
135
+ gap: theme.spacing.xs,
136
+ padding: variant === 'icon-only' ? theme.spacing.xs : theme.spacing.sm,
137
+ backgroundColor: theme.colors.surface,
138
+ border: `1px solid ${getStatusColor(status)}`,
139
+ borderRadius: theme.borderRadius.md,
140
+ boxShadow: theme.shadows.sm,
141
+ fontFamily: theme.typography.fontFamily,
142
+ fontSize: theme.typography.fontSize.sm,
143
+ color: theme.colors.text,
144
+ transition: 'all 0.2s ease-in-out',
145
+ opacity: visible ? 1 : 0,
146
+ transform: visible ? 'translateY(0)' : 'translateY(-10px)',
147
+ ...getPositionStyles(),
148
+ ...style
149
+ };
150
+ const textStyle = {
151
+ fontWeight: theme.typography.fontWeight.medium,
152
+ color: getStatusColor(status)
153
+ };
154
+ const timestampStyle = {
155
+ fontSize: theme.typography.fontSize.sm,
156
+ color: theme.colors.textSecondary,
157
+ fontWeight: theme.typography.fontWeight.normal,
158
+ opacity: 0.8
159
+ };
160
+ // Show disabled state when autosave is disabled, otherwise don't render
161
+ if (!isEnabled && status === 'disabled') {
162
+ // Render disabled state
163
+ }
164
+ else if (!isEnabled) {
165
+ return null;
166
+ }
167
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("style", { children: `
168
+ @keyframes spin {
169
+ from { transform: rotate(0deg); }
170
+ to { transform: rotate(360deg); }
171
+ }
172
+ ` }), (0, jsx_runtime_1.jsxs)("div", { className: `qnce-autosave-indicator qnce-autosave-${status} ${className}`, style: containerStyle, role: "status", "aria-live": "polite", "aria-label": `Autosave status: ${messages[status] ?? status}`, children: [(0, jsx_runtime_1.jsx)(StatusIcon, { status: status }), variant !== 'icon-only' && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("span", { style: textStyle, children: messages[status] ?? status }), showTimestamp && lastAutosave && ((0, jsx_runtime_1.jsx)("span", { style: timestampStyle, children: formatTimestamp(lastAutosave) })), showTimestamp && !lastAutosave && ((0, jsx_runtime_1.jsx)("span", { style: timestampStyle, children: "Never" }))] }))] })] }));
173
+ };
174
+ exports.AutosaveIndicator = AutosaveIndicator;
175
+ //# sourceMappingURL=AutosaveIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutosaveIndicator.js","sourceRoot":"","sources":["../../../src/ui/components/AutosaveIndicator.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import { UndoRedoControlsProps } from '../types';
3
+ /**
4
+ * UndoRedoControls Component
5
+ *
6
+ * Provides accessible undo/redo buttons with real-time state updates,
7
+ * tooltips, keyboard support, and customizable theming.
8
+ *
9
+ * Features:
10
+ * - Real-time enable/disable based on undo/redo availability
11
+ * - Accessible with ARIA labels and keyboard navigation
12
+ * - Customizable themes and layouts
13
+ * - Integration with QNCE Engine undo/redo system
14
+ */
15
+ export declare const UndoRedoControls: React.FC<UndoRedoControlsProps>;
16
+ //# sourceMappingURL=UndoRedoControls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UndoRedoControls.d.ts","sourceRoot":"","sources":["../../../src/ui/components/UndoRedoControls.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAA2B,MAAM,UAAU,CAAC;AAG1E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAqN5D,CAAC"}