qnce-engine 0.1.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 (154) hide show
  1. package/README.md +959 -5
  2. package/dist/cli/audit.js +6 -4
  3. package/dist/cli/audit.js.map +1 -1
  4. package/dist/cli/init.js +11 -9
  5. package/dist/cli/init.js.map +1 -1
  6. package/dist/cli/perf.d.ts +30 -0
  7. package/dist/cli/perf.d.ts.map +1 -0
  8. package/dist/cli/perf.js +220 -0
  9. package/dist/cli/perf.js.map +1 -0
  10. package/dist/cli/play.d.ts +4 -0
  11. package/dist/cli/play.d.ts.map +1 -0
  12. package/dist/cli/play.js +259 -0
  13. package/dist/cli/play.js.map +1 -0
  14. package/dist/engine/condition.d.ts +69 -0
  15. package/dist/engine/condition.d.ts.map +1 -0
  16. package/dist/engine/condition.js +195 -0
  17. package/dist/engine/condition.js.map +1 -0
  18. package/dist/engine/core.d.ts +378 -11
  19. package/dist/engine/core.d.ts.map +1 -1
  20. package/dist/engine/core.js +1433 -13
  21. package/dist/engine/core.js.map +1 -1
  22. package/dist/engine/demo-story.d.ts.map +1 -1
  23. package/dist/engine/demo-story.js +103 -14
  24. package/dist/engine/demo-story.js.map +1 -1
  25. package/dist/engine/errors.d.ts +76 -0
  26. package/dist/engine/errors.d.ts.map +1 -0
  27. package/dist/engine/errors.js +178 -0
  28. package/dist/engine/errors.js.map +1 -0
  29. package/dist/engine/types.d.ts +445 -0
  30. package/dist/engine/types.d.ts.map +1 -0
  31. package/dist/engine/types.js +9 -0
  32. package/dist/engine/types.js.map +1 -0
  33. package/dist/engine/validation.d.ts +110 -0
  34. package/dist/engine/validation.d.ts.map +1 -0
  35. package/dist/engine/validation.js +261 -0
  36. package/dist/engine/validation.js.map +1 -0
  37. package/dist/examples/examples/autosave-undo-demo.js +248 -0
  38. package/dist/examples/examples/persistence-demo.js +63 -0
  39. package/dist/examples/src/engine/condition.js +194 -0
  40. package/dist/examples/src/engine/core.js +1382 -0
  41. package/dist/examples/src/engine/demo-story.js +200 -0
  42. package/dist/examples/src/engine/types.js +8 -0
  43. package/dist/examples/src/index.js +35 -0
  44. package/dist/examples/src/integrations/react.js +322 -0
  45. package/dist/examples/src/narrative/branching/engine-simple.js +348 -0
  46. package/dist/examples/src/narrative/branching/index.js +55 -0
  47. package/dist/examples/src/narrative/branching/models.js +5 -0
  48. package/dist/examples/src/performance/ObjectPool.js +296 -0
  49. package/dist/examples/src/performance/PerfReporter.js +280 -0
  50. package/dist/examples/src/performance/ThreadPool.js +347 -0
  51. package/dist/index.d.ts +4 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +35 -3
  54. package/dist/index.js.map +1 -1
  55. package/dist/integrations/react.d.ts +200 -0
  56. package/dist/integrations/react.d.ts.map +1 -0
  57. package/dist/integrations/react.js +365 -0
  58. package/dist/integrations/react.js.map +1 -0
  59. package/dist/narrative/branching/engine-simple.d.ts +84 -0
  60. package/dist/narrative/branching/engine-simple.d.ts.map +1 -0
  61. package/dist/narrative/branching/engine-simple.js +349 -0
  62. package/dist/narrative/branching/engine-simple.js.map +1 -0
  63. package/dist/narrative/branching/engine.d.ts +1 -0
  64. package/dist/narrative/branching/engine.d.ts.map +1 -0
  65. package/dist/narrative/branching/engine.js +2 -0
  66. package/dist/narrative/branching/engine.js.map +1 -0
  67. package/dist/narrative/branching/index.d.ts +12 -0
  68. package/dist/narrative/branching/index.d.ts.map +1 -0
  69. package/dist/narrative/branching/index.js +56 -0
  70. package/dist/narrative/branching/index.js.map +1 -0
  71. package/dist/narrative/branching/models.d.ts +223 -0
  72. package/dist/narrative/branching/models.d.ts.map +1 -0
  73. package/dist/narrative/branching/models.js +6 -0
  74. package/dist/narrative/branching/models.js.map +1 -0
  75. package/dist/performance/HotReloadDelta.d.ts +124 -0
  76. package/dist/performance/HotReloadDelta.d.ts.map +1 -0
  77. package/dist/performance/HotReloadDelta.js +328 -0
  78. package/dist/performance/HotReloadDelta.js.map +1 -0
  79. package/dist/performance/ObjectPool.d.ts +150 -0
  80. package/dist/performance/ObjectPool.d.ts.map +1 -0
  81. package/dist/performance/ObjectPool.js +297 -0
  82. package/dist/performance/ObjectPool.js.map +1 -0
  83. package/dist/performance/PerfReporter.d.ts +123 -0
  84. package/dist/performance/PerfReporter.d.ts.map +1 -0
  85. package/dist/performance/PerfReporter.js +281 -0
  86. package/dist/performance/PerfReporter.js.map +1 -0
  87. package/dist/performance/ThreadPool.d.ts +107 -0
  88. package/dist/performance/ThreadPool.d.ts.map +1 -0
  89. package/dist/performance/ThreadPool.js +348 -0
  90. package/dist/performance/ThreadPool.js.map +1 -0
  91. package/dist/ui/__tests__/AutosaveIndicator.test.d.ts +2 -0
  92. package/dist/ui/__tests__/AutosaveIndicator.test.d.ts.map +1 -0
  93. package/dist/ui/__tests__/AutosaveIndicator.test.js +329 -0
  94. package/dist/ui/__tests__/AutosaveIndicator.test.js.map +1 -0
  95. package/dist/ui/__tests__/UndoRedoControls.test.d.ts +2 -0
  96. package/dist/ui/__tests__/UndoRedoControls.test.d.ts.map +1 -0
  97. package/dist/ui/__tests__/UndoRedoControls.test.js +245 -0
  98. package/dist/ui/__tests__/UndoRedoControls.test.js.map +1 -0
  99. package/dist/ui/__tests__/autosave-simple.test.d.ts +2 -0
  100. package/dist/ui/__tests__/autosave-simple.test.d.ts.map +1 -0
  101. package/dist/ui/__tests__/autosave-simple.test.js +29 -0
  102. package/dist/ui/__tests__/autosave-simple.test.js.map +1 -0
  103. package/dist/ui/__tests__/setup.d.ts +2 -0
  104. package/dist/ui/__tests__/setup.d.ts.map +1 -0
  105. package/dist/ui/__tests__/setup.js +40 -0
  106. package/dist/ui/__tests__/setup.js.map +1 -0
  107. package/dist/ui/__tests__/smoke-test.d.ts +2 -0
  108. package/dist/ui/__tests__/smoke-test.d.ts.map +1 -0
  109. package/dist/ui/__tests__/smoke-test.js +18 -0
  110. package/dist/ui/__tests__/smoke-test.js.map +1 -0
  111. package/dist/ui/__tests__/smoke-test.test.d.ts +2 -0
  112. package/dist/ui/__tests__/smoke-test.test.d.ts.map +1 -0
  113. package/dist/ui/__tests__/smoke-test.test.js +18 -0
  114. package/dist/ui/__tests__/smoke-test.test.js.map +1 -0
  115. package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts +2 -0
  116. package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts.map +1 -0
  117. package/dist/ui/__tests__/useKeyboardShortcuts.test.js +374 -0
  118. package/dist/ui/__tests__/useKeyboardShortcuts.test.js.map +1 -0
  119. package/dist/ui/components/AutosaveIndicator.d.ts +18 -0
  120. package/dist/ui/components/AutosaveIndicator.d.ts.map +1 -0
  121. package/dist/ui/components/AutosaveIndicator.js +175 -0
  122. package/dist/ui/components/AutosaveIndicator.js.map +1 -0
  123. package/dist/ui/components/UndoRedoControls.d.ts +16 -0
  124. package/dist/ui/components/UndoRedoControls.d.ts.map +1 -0
  125. package/dist/ui/components/UndoRedoControls.js +144 -0
  126. package/dist/ui/components/UndoRedoControls.js.map +1 -0
  127. package/dist/ui/hooks/useKeyboardShortcuts.d.ts +22 -0
  128. package/dist/ui/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  129. package/dist/ui/hooks/useKeyboardShortcuts.js +162 -0
  130. package/dist/ui/hooks/useKeyboardShortcuts.js.map +1 -0
  131. package/dist/ui/index.d.ts +9 -0
  132. package/dist/ui/index.d.ts.map +1 -0
  133. package/dist/ui/index.js +14 -0
  134. package/dist/ui/index.js.map +1 -0
  135. package/dist/ui/types.d.ts +141 -0
  136. package/dist/ui/types.d.ts.map +1 -0
  137. package/dist/ui/types.js +51 -0
  138. package/dist/ui/types.js.map +1 -0
  139. package/docs/PERFORMANCE.md +355 -0
  140. package/docs/branching/ERD.md +214 -0
  141. package/docs/branching/PDM.md +443 -0
  142. package/docs/branching/RELEASE-v1.2.0.md +169 -0
  143. package/examples/autosave-undo-demo.ts +306 -0
  144. package/examples/branching-advanced-demo.ts +339 -0
  145. package/examples/branching-demo-simple.ts +0 -0
  146. package/examples/branching-demo.ts +0 -0
  147. package/examples/branching-quickstart.ts +314 -0
  148. package/examples/persistence-demo.ts +84 -0
  149. package/examples/quickstart-demo.js +82 -0
  150. package/examples/tsconfig.json +13 -0
  151. package/examples/ui-components-demo.tsx +320 -0
  152. package/examples/validation-demo-story.json +177 -0
  153. package/examples/validation-demo.js +163 -0
  154. package/package.json +41 -8
@@ -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":";;;;AAAA,iCAA4D;AAC5D,oCAA2F;AAC3F,oDAAuD;AAEvD;;;;;;;;;;;;;GAaG;AACI,MAAM,iBAAiB,GAAqC,CAAC,EAClE,MAAM,EACN,KAAK,EAAE,WAAW,EAClB,SAAS,GAAG,EAAE,EACd,KAAK,EACL,OAAO,GAAG,UAAU,EACpB,QAAQ,GAAG,QAAQ,EACnB,QAAQ,GAAG;IACT,IAAI,EAAE,iBAAiB;IACvB,MAAM,EAAE,WAAW;IACnB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,aAAa;IACpB,QAAQ,EAAE,mBAAmB;CAC9B,EACD,aAAa,GAAG,IAAI,EACpB,aAAa,GAAG,IAAI,EACrB,EAAE,EAAE;IACH,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,IAAA,mBAAW,EAAC,MAAM,CAAC,CAAC;IAClE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC;IAEnE,wCAAwC;IACxC,MAAM,MAAM,GAAmB,IAAA,eAAO,EAAC,GAAG,EAAE;QAC1C,IAAI,CAAC,SAAS;YAAE,OAAO,UAAU,CAAC;QAClC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,IAAI,YAAY,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAChD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAE5D,wCAAwC;IACxC,MAAM,KAAK,GAAc,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,CAAC;QACtC,GAAG,oBAAY;QACf,GAAG,WAAW;QACd,MAAM,EAAE,EAAE,GAAG,oBAAY,CAAC,MAAM,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE;QAC1D,OAAO,EAAE,EAAE,GAAG,oBAAY,CAAC,OAAO,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE;QAC7D,YAAY,EAAE,EAAE,GAAG,oBAAY,CAAC,YAAY,EAAE,GAAG,WAAW,EAAE,YAAY,EAAE;QAC5E,UAAU,EAAE;YACV,GAAG,oBAAY,CAAC,UAAU;YAC1B,GAAG,WAAW,EAAE,UAAU;YAC1B,QAAQ,EAAE,EAAE,GAAG,oBAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE;YACvF,UAAU,EAAE,EAAE,GAAG,oBAAY,CAAC,UAAU,CAAC,UAAU,EAAE,GAAG,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE;SAC9F;QACD,OAAO,EAAE,EAAE,GAAG,oBAAY,CAAC,OAAO,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE;KAC9D,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAEnB,mCAAmC;IACnC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,UAAU,CAAC,IAAI,CAAC,CAAC;QAEjB,IAAI,MAAM,KAAK,OAAO,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC,EAAE,aAAa,CAAC,CAAC;YAElB,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;IAE5B,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,kBAAkB;IAClB,MAAM,iBAAiB,GAAG,GAAwB,EAAE;QAClD,MAAM,iBAAiB,GAAwB;YAC7C,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;YACpD,MAAM,EAAE,IAAI;SACb,CAAC;QAEF,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,UAAU;gBACb,OAAO,EAAE,GAAG,iBAAiB,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YACjF,KAAK,WAAW;gBACd,OAAO,EAAE,GAAG,iBAAiB,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAClF,KAAK,aAAa;gBAChB,OAAO,EAAE,GAAG,iBAAiB,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YACpF,KAAK,cAAc;gBACjB,OAAO,EAAE,GAAG,iBAAiB,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YACrF;gBACE,OAAO,iBAAiB,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;IAEF,uBAAuB;IACvB,MAAM,cAAc,GAAG,CAAC,aAA6B,EAAU,EAAE;QAC/D,QAAQ,aAAa,EAAE,CAAC;YACtB,KAAK,QAAQ;gBACX,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;YAC9B,KAAK,OAAO;gBACV,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;YAC9B,KAAK,OAAO;gBACV,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;YAC5B;gBACE,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;IAEF,uBAAuB;IACvB,MAAM,UAAU,GAAyC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACtE,MAAM,SAAS,GAAwB;YACrC,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC;SAC9B,CAAC;QAEF,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,QAAQ;gBACX,OAAO,CACL,iCACE,KAAK,EAAE;wBACL,GAAG,SAAS;wBACZ,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,MAAM;qBAC5D,uBAGI,CACR,CAAC;YACJ,KAAK,OAAO;gBACV,OAAO,iCAAM,KAAK,EAAE,SAAS,uBAAU,CAAC;YAC1C,KAAK,OAAO;gBACV,OAAO,iCAAM,KAAK,EAAE,SAAS,uBAAU,CAAC;YAC1C;gBACE,OAAO,iCAAM,KAAK,EAAE,SAAS,uBAAU,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC;IAEF,mBAAmB;IACnB,MAAM,eAAe,GAAG,CAAC,IAAiB,EAAU,EAAE;QACpD,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC;IAEF,mBAAmB;IACnB,MAAM,cAAc,GAAwB;QAC1C,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAClC,UAAU,EAAE,QAAQ;QACpB,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;QACrB,OAAO,EAAE,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;QACtE,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;QACrC,MAAM,EAAE,aAAa,cAAc,CAAC,MAAM,CAAC,EAAE;QAC7C,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE;QACnC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;QAC3B,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU;QACvC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QACtC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;QACxB,UAAU,EAAE,sBAAsB;QAClC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,mBAAmB;QAC1D,GAAG,iBAAiB,EAAE;QACtB,GAAG,KAAK;KACT,CAAC;IAEF,MAAM,SAAS,GAAwB;QACrC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM;QAC9C,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC;KAC9B,CAAC;IAEF,MAAM,cAAc,GAAwB;QAC1C,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;QACtC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,aAAa;QACjC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM;QAC9C,OAAO,EAAE,GAAG;KACb,CAAC;IAEF,wEAAwE;IACxE,IAAI,CAAC,SAAS,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QACxC,wBAAwB;IAC1B,CAAC;SAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,6DAEE,4CACG;;;;;SAKA,GACK,EAER,iCACE,SAAS,EAAE,yCAAyC,MAAM,IAAI,SAAS,EAAE,EACzE,KAAK,EAAE,cAAc,EACrB,IAAI,EAAC,QAAQ,eACH,QAAQ,gBACN,oBAAoB,QAAQ,CAAC,MAA+B,CAAC,IAAI,MAAM,EAAE,aAErF,uBAAC,UAAU,IAAC,MAAM,EAAE,MAAM,GAAI,EAC7B,OAAO,KAAK,WAAW,IAAI,CAC1B,6DACE,iCAAM,KAAK,EAAE,SAAS,YACnB,QAAQ,CAAC,MAA+B,CAAC,IAAI,MAAM,GAC/C,EACN,aAAa,IAAI,YAAY,IAAI,CAChC,iCAAM,KAAK,EAAE,cAAc,YACxB,eAAe,CAAC,YAAY,CAAC,GACzB,CACR,EACA,aAAa,IAAI,CAAC,YAAY,IAAI,CACjC,iCAAM,KAAK,EAAE,cAAc,sBAEpB,CACR,IACA,CACJ,IACG,IACL,CACJ,CAAC;AACJ,CAAC,CAAC;AAtNW,QAAA,iBAAiB,qBAsN5B"}
@@ -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"}
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UndoRedoControls = 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
+ * UndoRedoControls Component
10
+ *
11
+ * Provides accessible undo/redo buttons with real-time state updates,
12
+ * tooltips, keyboard support, and customizable theming.
13
+ *
14
+ * Features:
15
+ * - Real-time enable/disable based on undo/redo availability
16
+ * - Accessible with ARIA labels and keyboard navigation
17
+ * - Customizable themes and layouts
18
+ * - Integration with QNCE Engine undo/redo system
19
+ */
20
+ const UndoRedoControls = ({ engine, theme: customTheme, className = '', style, disabled = false, showLabels = true, labels = { undo: 'Undo', redo: 'Redo' }, size = 'md', layout = 'horizontal', onUndo, onRedo }) => {
21
+ const { undo, redo, canUndo, canRedo, undoCount, redoCount } = (0, react_2.useUndoRedo)(engine);
22
+ // Merge custom theme with default theme
23
+ const theme = (0, react_1.useMemo)(() => ({
24
+ ...types_1.defaultTheme,
25
+ ...customTheme,
26
+ colors: { ...types_1.defaultTheme.colors, ...customTheme?.colors },
27
+ spacing: { ...types_1.defaultTheme.spacing, ...customTheme?.spacing },
28
+ borderRadius: { ...types_1.defaultTheme.borderRadius, ...customTheme?.borderRadius },
29
+ typography: {
30
+ ...types_1.defaultTheme.typography,
31
+ ...customTheme?.typography,
32
+ fontSize: { ...types_1.defaultTheme.typography.fontSize, ...customTheme?.typography?.fontSize },
33
+ fontWeight: { ...types_1.defaultTheme.typography.fontWeight, ...customTheme?.typography?.fontWeight }
34
+ },
35
+ shadows: { ...types_1.defaultTheme.shadows, ...customTheme?.shadows }
36
+ }), [customTheme]);
37
+ // Size configurations
38
+ const sizeConfig = {
39
+ sm: {
40
+ padding: `${theme.spacing.xs} ${theme.spacing.sm}`,
41
+ fontSize: theme.typography.fontSize.sm,
42
+ iconSize: '16px'
43
+ },
44
+ md: {
45
+ padding: `${theme.spacing.sm} ${theme.spacing.md}`,
46
+ fontSize: theme.typography.fontSize.md,
47
+ iconSize: '20px'
48
+ },
49
+ lg: {
50
+ padding: `${theme.spacing.md} ${theme.spacing.lg}`,
51
+ fontSize: theme.typography.fontSize.lg,
52
+ iconSize: '24px'
53
+ }
54
+ };
55
+ const currentSize = sizeConfig[size];
56
+ // Button styles
57
+ const buttonBaseStyle = {
58
+ fontFamily: theme.typography.fontFamily,
59
+ fontSize: currentSize.fontSize,
60
+ fontWeight: theme.typography.fontWeight.medium,
61
+ padding: currentSize.padding,
62
+ borderRadius: theme.borderRadius.md,
63
+ border: `1px solid ${theme.colors.primary}`,
64
+ backgroundColor: theme.colors.background,
65
+ color: theme.colors.primary,
66
+ cursor: 'pointer',
67
+ transition: 'all 0.2s ease-in-out',
68
+ display: 'flex',
69
+ alignItems: 'center',
70
+ justifyContent: 'center',
71
+ gap: theme.spacing.xs,
72
+ boxShadow: theme.shadows.sm,
73
+ outline: 'none',
74
+ position: 'relative'
75
+ };
76
+ const buttonDisabledStyle = {
77
+ ...buttonBaseStyle,
78
+ backgroundColor: theme.colors.surface,
79
+ color: theme.colors.disabled,
80
+ borderColor: theme.colors.disabled,
81
+ cursor: 'not-allowed',
82
+ boxShadow: 'none'
83
+ };
84
+ const buttonHoverStyle = {
85
+ backgroundColor: theme.colors.primary,
86
+ color: theme.colors.background,
87
+ transform: 'translateY(-1px)',
88
+ boxShadow: theme.shadows.md
89
+ };
90
+ // Container styles
91
+ const containerStyle = {
92
+ display: 'flex',
93
+ flexDirection: layout === 'horizontal' ? 'row' : 'column',
94
+ gap: theme.spacing.sm,
95
+ alignItems: layout === 'horizontal' ? 'center' : 'stretch',
96
+ ...style
97
+ };
98
+ // Handle button actions
99
+ const handleUndo = async () => {
100
+ if (!disabled && canUndo) {
101
+ try {
102
+ const result = await undo();
103
+ onUndo?.(result);
104
+ }
105
+ catch (error) {
106
+ onUndo?.({ success: false, error: error instanceof Error ? error.message : 'Undo failed' });
107
+ }
108
+ }
109
+ };
110
+ const handleRedo = async () => {
111
+ if (!disabled && canRedo) {
112
+ try {
113
+ const result = await redo();
114
+ onRedo?.(result);
115
+ }
116
+ catch (error) {
117
+ onRedo?.({ success: false, error: error instanceof Error ? error.message : 'Redo failed' });
118
+ }
119
+ }
120
+ };
121
+ // Hover state management
122
+ const [undoHovered, setUndoHovered] = (0, react_1.useState)(false);
123
+ const [redoHovered, setRedoHovered] = (0, react_1.useState)(false);
124
+ // Icons (using Unicode symbols for simplicity - can be replaced with icon library)
125
+ const UndoIcon = () => ((0, jsx_runtime_1.jsx)("span", { style: { fontSize: currentSize.iconSize, lineHeight: 1 }, children: "\u21B6" }));
126
+ const RedoIcon = () => ((0, jsx_runtime_1.jsx)("span", { style: { fontSize: currentSize.iconSize, lineHeight: 1 }, children: "\u21B7" }));
127
+ return ((0, jsx_runtime_1.jsxs)("div", { className: `qnce-undo-redo-controls ${className}`, style: containerStyle, role: "group", "aria-label": "Undo and redo controls", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: handleUndo, disabled: disabled || !canUndo, style: {
128
+ ...(disabled || !canUndo ? buttonDisabledStyle : buttonBaseStyle),
129
+ ...(undoHovered && !disabled && canUndo ? buttonHoverStyle : {})
130
+ }, onMouseEnter: () => setUndoHovered(true), onMouseLeave: () => setUndoHovered(false), onFocus: () => setUndoHovered(true), onBlur: () => setUndoHovered(false), "aria-label": `${labels.undo}${undoCount > 0 ? ` (${undoCount} available)` : ''}`, title: `${labels.undo}${undoCount > 0 ? ` (${undoCount} available)` : ''}`, "aria-disabled": disabled || !canUndo, children: [(0, jsx_runtime_1.jsx)(UndoIcon, {}), showLabels && (0, jsx_runtime_1.jsx)("span", { children: labels.undo }), undoCount > 0 && ((0, jsx_runtime_1.jsxs)("span", { style: {
131
+ fontSize: theme.typography.fontSize.sm,
132
+ opacity: 0.8,
133
+ fontWeight: theme.typography.fontWeight.normal
134
+ }, children: ["(", undoCount, ")"] }))] }), (0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: handleRedo, disabled: disabled || !canRedo, style: {
135
+ ...(disabled || !canRedo ? buttonDisabledStyle : buttonBaseStyle),
136
+ ...(redoHovered && !disabled && canRedo ? buttonHoverStyle : {})
137
+ }, onMouseEnter: () => setRedoHovered(true), onMouseLeave: () => setRedoHovered(false), onFocus: () => setRedoHovered(true), onBlur: () => setRedoHovered(false), "aria-label": `${labels.redo}${redoCount > 0 ? ` (${redoCount} available)` : ''}`, title: `${labels.redo}${redoCount > 0 ? ` (${redoCount} available)` : ''}`, "aria-disabled": disabled || !canRedo, children: [(0, jsx_runtime_1.jsx)(RedoIcon, {}), showLabels && (0, jsx_runtime_1.jsx)("span", { children: labels.redo }), redoCount > 0 && ((0, jsx_runtime_1.jsxs)("span", { style: {
138
+ fontSize: theme.typography.fontSize.sm,
139
+ opacity: 0.8,
140
+ fontWeight: theme.typography.fontWeight.normal
141
+ }, children: ["(", redoCount, ")"] }))] })] }));
142
+ };
143
+ exports.UndoRedoControls = UndoRedoControls;
144
+ //# sourceMappingURL=UndoRedoControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UndoRedoControls.js","sourceRoot":"","sources":["../../../src/ui/components/UndoRedoControls.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { KeyboardShortcutsConfig } from '../types';
2
+ import { QNCEEngine } from '../../engine/core';
3
+ /**
4
+ * useKeyboardShortcuts Hook
5
+ *
6
+ * Provides keyboard shortcuts for common QNCE operations like undo/redo and autosave.
7
+ *
8
+ * Features:
9
+ * - Configurable key bindings
10
+ * - Support for modifier keys (Ctrl, Alt, Shift, Meta)
11
+ * - Automatic cleanup on unmount
12
+ * - Prevention of default browser behavior
13
+ * - Accessibility-friendly implementation
14
+ *
15
+ * Default shortcuts:
16
+ * - Ctrl+Z / Cmd+Z: Undo
17
+ * - Ctrl+Y / Cmd+Y / Ctrl+Shift+Z: Redo
18
+ * - Ctrl+S / Cmd+S: Manual autosave
19
+ * - Ctrl+R / Cmd+R: Reset narrative (disabled by default)
20
+ */
21
+ export declare function useKeyboardShortcuts(engine: QNCEEngine, config?: KeyboardShortcutsConfig): void;
22
+ //# sourceMappingURL=useKeyboardShortcuts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKeyboardShortcuts.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useKeyboardShortcuts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,EAClB,MAAM,GAAE,uBAA4B,GACnC,IAAI,CA2JN"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useKeyboardShortcuts = useKeyboardShortcuts;
4
+ const react_1 = require("react");
5
+ /**
6
+ * useKeyboardShortcuts Hook
7
+ *
8
+ * Provides keyboard shortcuts for common QNCE operations like undo/redo and autosave.
9
+ *
10
+ * Features:
11
+ * - Configurable key bindings
12
+ * - Support for modifier keys (Ctrl, Alt, Shift, Meta)
13
+ * - Automatic cleanup on unmount
14
+ * - Prevention of default browser behavior
15
+ * - Accessibility-friendly implementation
16
+ *
17
+ * Default shortcuts:
18
+ * - Ctrl+Z / Cmd+Z: Undo
19
+ * - Ctrl+Y / Cmd+Y / Ctrl+Shift+Z: Redo
20
+ * - Ctrl+S / Cmd+S: Manual autosave
21
+ * - Ctrl+R / Cmd+R: Reset narrative (disabled by default)
22
+ */
23
+ function useKeyboardShortcuts(engine, config = {}) {
24
+ const { enabled = true, bindings = {
25
+ undo: ['ctrl+z', 'cmd+z'],
26
+ redo: ['ctrl+y', 'cmd+y', 'ctrl+shift+z'],
27
+ save: ['ctrl+s', 'cmd+s'],
28
+ reset: [] // Disabled by default for safety
29
+ }, preventDefault = true, target = document } = config;
30
+ // Parse key combination string into components
31
+ const parseKeyCombo = (0, react_1.useCallback)((combo) => {
32
+ const parts = combo.toLowerCase().split('+');
33
+ const key = parts[parts.length - 1];
34
+ const modifiers = parts.slice(0, -1);
35
+ return {
36
+ key,
37
+ ctrl: modifiers.includes('ctrl'),
38
+ alt: modifiers.includes('alt'),
39
+ shift: modifiers.includes('shift'),
40
+ meta: modifiers.includes('cmd') || modifiers.includes('meta')
41
+ };
42
+ }, []);
43
+ // Check if a keyboard event matches a key combination
44
+ const matchesKeyCombo = (0, react_1.useCallback)((event, combo) => {
45
+ const parsed = parseKeyCombo(combo);
46
+ return (event.key.toLowerCase() === parsed.key &&
47
+ event.ctrlKey === parsed.ctrl &&
48
+ event.altKey === parsed.alt &&
49
+ event.shiftKey === parsed.shift &&
50
+ event.metaKey === parsed.meta);
51
+ }, [parseKeyCombo]);
52
+ // Handle keyboard events
53
+ const handleKeyDown = (0, react_1.useCallback)((event) => {
54
+ const keyboardEvent = event;
55
+ if (!enabled || !engine)
56
+ return;
57
+ // Skip if user is typing in an input field
58
+ const activeElement = document.activeElement;
59
+ if (activeElement && (activeElement.tagName === 'INPUT' ||
60
+ activeElement.tagName === 'TEXTAREA' ||
61
+ activeElement.tagName === 'SELECT' ||
62
+ activeElement.getAttribute('contenteditable') === 'true')) {
63
+ return;
64
+ }
65
+ let handled = false;
66
+ // Check undo shortcuts
67
+ for (const combo of bindings.undo || []) {
68
+ if (matchesKeyCombo(keyboardEvent, combo)) {
69
+ if (engine.canUndo()) {
70
+ try {
71
+ engine.undo();
72
+ }
73
+ catch (error) {
74
+ console.error('[QNCE] Undo failed:', error);
75
+ }
76
+ handled = true;
77
+ break;
78
+ }
79
+ }
80
+ }
81
+ // Check redo shortcuts
82
+ if (!handled) {
83
+ for (const combo of bindings.redo || []) {
84
+ if (matchesKeyCombo(keyboardEvent, combo)) {
85
+ if (engine.canRedo()) {
86
+ try {
87
+ engine.redo();
88
+ }
89
+ catch (error) {
90
+ console.error('[QNCE] Redo failed:', error);
91
+ }
92
+ handled = true;
93
+ break;
94
+ }
95
+ }
96
+ }
97
+ }
98
+ // Check autosave shortcuts
99
+ if (!handled) {
100
+ for (const combo of bindings.save || []) {
101
+ if (matchesKeyCombo(keyboardEvent, combo)) {
102
+ engine.manualAutosave().catch((error) => {
103
+ console.warn('[QNCE] Manual autosave failed:', error.message);
104
+ });
105
+ handled = true;
106
+ break;
107
+ }
108
+ }
109
+ }
110
+ // Check reset shortcuts (if enabled)
111
+ if (!handled && bindings.reset && bindings.reset.length > 0) {
112
+ for (const combo of bindings.reset) {
113
+ if (matchesKeyCombo(keyboardEvent, combo)) {
114
+ // Add confirmation for reset to prevent accidental data loss
115
+ if (window.confirm('Are you sure you want to reset the narrative? This will lose all progress.')) {
116
+ try {
117
+ engine.resetNarrative();
118
+ }
119
+ catch (error) {
120
+ console.error('[QNCE] Reset failed:', error);
121
+ }
122
+ handled = true;
123
+ break;
124
+ }
125
+ }
126
+ }
127
+ }
128
+ // Prevent default browser behavior if we handled the event
129
+ if (handled && preventDefault) {
130
+ keyboardEvent.preventDefault();
131
+ keyboardEvent.stopPropagation();
132
+ }
133
+ }, [enabled, engine, bindings, matchesKeyCombo, preventDefault]);
134
+ // Set up keyboard event listeners
135
+ (0, react_1.useEffect)(() => {
136
+ if (!enabled || !target)
137
+ return;
138
+ const currentTarget = target;
139
+ currentTarget.addEventListener('keydown', handleKeyDown);
140
+ return () => {
141
+ currentTarget.removeEventListener('keydown', handleKeyDown);
142
+ };
143
+ }, [enabled, target, handleKeyDown]);
144
+ // Log active shortcuts for debugging (development only)
145
+ (0, react_1.useEffect)(() => {
146
+ if (!enabled || process.env.NODE_ENV === 'production')
147
+ return;
148
+ const shortcuts = [];
149
+ if (bindings.undo?.length)
150
+ shortcuts.push(`Undo: ${bindings.undo.join(', ')}`);
151
+ if (bindings.redo?.length)
152
+ shortcuts.push(`Redo: ${bindings.redo.join(', ')}`);
153
+ if (bindings.save?.length)
154
+ shortcuts.push(`Save: ${bindings.save.join(', ')}`);
155
+ if (bindings.reset?.length)
156
+ shortcuts.push(`Reset: ${bindings.reset.join(', ')}`);
157
+ if (shortcuts.length > 0) {
158
+ console.log('[QNCE] Active keyboard shortcuts:', shortcuts.join(' | '));
159
+ }
160
+ }, [enabled, bindings]);
161
+ }
162
+ //# sourceMappingURL=useKeyboardShortcuts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKeyboardShortcuts.js","sourceRoot":"","sources":["../../../src/ui/hooks/useKeyboardShortcuts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * QNCE Engine UI Components
3
+ * Sprint 3.6: Ready-to-use React components for narrative applications
4
+ */
5
+ export { UndoRedoControls } from './components/UndoRedoControls';
6
+ export { AutosaveIndicator } from './components/AutosaveIndicator';
7
+ export { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts';
8
+ export type { UndoRedoControlsProps, AutosaveIndicatorProps, KeyboardShortcutsConfig, QNCETheme } from './types';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,SAAS,EACV,MAAM,SAAS,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * QNCE Engine UI Components
4
+ * Sprint 3.6: Ready-to-use React components for narrative applications
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.useKeyboardShortcuts = exports.AutosaveIndicator = exports.UndoRedoControls = void 0;
8
+ var UndoRedoControls_1 = require("./components/UndoRedoControls");
9
+ Object.defineProperty(exports, "UndoRedoControls", { enumerable: true, get: function () { return UndoRedoControls_1.UndoRedoControls; } });
10
+ var AutosaveIndicator_1 = require("./components/AutosaveIndicator");
11
+ Object.defineProperty(exports, "AutosaveIndicator", { enumerable: true, get: function () { return AutosaveIndicator_1.AutosaveIndicator; } });
12
+ var useKeyboardShortcuts_1 = require("./hooks/useKeyboardShortcuts");
13
+ Object.defineProperty(exports, "useKeyboardShortcuts", { enumerable: true, get: function () { return useKeyboardShortcuts_1.useKeyboardShortcuts; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAAiE;AAAxD,oHAAA,gBAAgB,OAAA;AACzB,oEAAmE;AAA1D,sHAAA,iBAAiB,OAAA;AAC1B,qEAAoE;AAA3D,4HAAA,oBAAoB,OAAA"}