@lessonkit/react 1.0.2 → 1.1.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.
package/dist/index.d.cts CHANGED
@@ -1,9 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React from 'react';
3
3
  import * as _lessonkit_core from '@lessonkit/core';
4
- import { CourseId, TelemetryUser, TrackingClient, LessonkitPlugin, ProgressState, LessonId, TelemetryEventName, TelemetryDataFor, PluginHost, BlockId, CheckId } from '@lessonkit/core';
5
- export { AssessmentScoreInput, AssessmentScoreResult, InteractionBlockRegistration, LessonkitPlugin, LessonkitPluginContext, LessonkitPluginKind, PluginHost, PluginRegistry, TelemetryPipelineSink, buildTelemetryEvent, createLessonkitRuntime, createPluginRegistry, createTelemetryPipeline, defineAssessmentPlugin, defineLifecyclePlugin, defineTelemetryPlugin } from '@lessonkit/core';
6
- import { AssessmentDescriptor } from '@lessonkit/lxpack';
4
+ import { CourseId, TelemetryUser, TrackingClient, LessonkitPlugin, ProgressState, LessonId, TelemetryEventName, TelemetryDataFor, PluginHost, BlockId, AssessmentHandle, AssessmentBaseProps, AssessmentBehaviour, AssessmentAnsweredData, AssessmentCompletedData, CheckId } from '@lessonkit/core';
5
+ export { AssessmentAnsweredData, AssessmentBaseProps, AssessmentBehaviour, AssessmentCompletedData, AssessmentHandle, AssessmentInteractionType, AssessmentScoreInput, AssessmentScoreResult, AssessmentXAPIData, InteractionBlockRegistration, LessonkitPlugin, LessonkitPluginContext, LessonkitPluginKind, PluginHost, PluginRegistry, TelemetryPipelineSink, buildTelemetryEvent, createLessonkitRuntime, createPluginRegistry, createTelemetryPipeline, defineAssessmentPlugin, defineLifecyclePlugin, defineTelemetryPlugin } from '@lessonkit/core';
6
+ import { McqAssessmentDescriptor } from '@lessonkit/lxpack';
7
7
  import { XAPITransport, XAPIClient } from '@lessonkit/xapi';
8
8
  import { LxpackBridgeMode } from '@lessonkit/lxpack/bridge';
9
9
  import { LessonkitThemeV1, ThemePresetName, PartialLessonkitThemeV1 } from '@lessonkit/themes';
@@ -96,8 +96,8 @@ type ReflectionProps = {
96
96
  onChange?: (value: string) => void;
97
97
  children?: React.ReactNode;
98
98
  };
99
- type QuizProps = AssessmentDescriptor;
100
- type KnowledgeCheckProps = AssessmentDescriptor;
99
+ type QuizProps = McqAssessmentDescriptor;
100
+ type KnowledgeCheckProps = McqAssessmentDescriptor;
101
101
  type ProgressTrackerProps = {
102
102
  totalLessons?: number;
103
103
  };
@@ -109,6 +109,99 @@ declare function KnowledgeCheck(props: KnowledgeCheckProps): react_jsx_runtime.J
109
109
  declare function Quiz(props: QuizProps): react_jsx_runtime.JSX.Element;
110
110
  declare function ProgressTracker(props: ProgressTrackerProps): react_jsx_runtime.JSX.Element;
111
111
 
112
+ type TrueFalseProps = AssessmentBaseProps & {
113
+ question: string;
114
+ answer: boolean;
115
+ };
116
+ declare const TrueFalse: React.ForwardRefExoticComponent<_lessonkit_core.AssessmentBehaviour & {
117
+ checkId: _lessonkit_core.CheckId;
118
+ passingScore?: number;
119
+ } & {
120
+ question: string;
121
+ answer: boolean;
122
+ } & React.RefAttributes<AssessmentHandle>>;
123
+
124
+ type MarkTheWordsProps = AssessmentBaseProps & {
125
+ /** Plain text; words listed in `correctWords` are selectable targets. */
126
+ text: string;
127
+ correctWords: string[];
128
+ };
129
+ declare const MarkTheWords: React.ForwardRefExoticComponent<_lessonkit_core.AssessmentBehaviour & {
130
+ checkId: _lessonkit_core.CheckId;
131
+ passingScore?: number;
132
+ } & {
133
+ /** Plain text; words listed in `correctWords` are selectable targets. */
134
+ text: string;
135
+ correctWords: string[];
136
+ } & React.RefAttributes<AssessmentHandle>>;
137
+
138
+ type FillInBlankSpec = {
139
+ id: string;
140
+ answer: string;
141
+ };
142
+ type FillInTheBlanksProps = AssessmentBaseProps & {
143
+ /** Text with `*` wrapping each blank answer, e.g. "The *capital* of France is *Paris*." */
144
+ template: string;
145
+ /** Optional explicit blanks (overrides parsing from template). */
146
+ blanks?: FillInBlankSpec[];
147
+ };
148
+ declare const FillInTheBlanks: React.ForwardRefExoticComponent<_lessonkit_core.AssessmentBehaviour & {
149
+ checkId: _lessonkit_core.CheckId;
150
+ passingScore?: number;
151
+ } & {
152
+ /** Text with `*` wrapping each blank answer, e.g. "The *capital* of France is *Paris*." */
153
+ template: string;
154
+ /** Optional explicit blanks (overrides parsing from template). */
155
+ blanks?: FillInBlankSpec[];
156
+ } & React.RefAttributes<AssessmentHandle>>;
157
+
158
+ type DragTheWordsProps = AssessmentBaseProps & {
159
+ /** Sentence with `*` around drop zones; `words` are draggable options. */
160
+ template: string;
161
+ words: string[];
162
+ };
163
+ declare const DragTheWords: React.ForwardRefExoticComponent<_lessonkit_core.AssessmentBehaviour & {
164
+ checkId: _lessonkit_core.CheckId;
165
+ passingScore?: number;
166
+ } & {
167
+ /** Sentence with `*` around drop zones; `words` are draggable options. */
168
+ template: string;
169
+ words: string[];
170
+ } & React.RefAttributes<AssessmentHandle>>;
171
+
172
+ type DragItem = {
173
+ id: string;
174
+ label: string;
175
+ };
176
+ type DropTarget = {
177
+ id: string;
178
+ label: string;
179
+ accepts: string;
180
+ };
181
+ type DragAndDropProps = AssessmentBaseProps & {
182
+ items: DragItem[];
183
+ targets: DropTarget[];
184
+ };
185
+ declare const DragAndDrop: React.ForwardRefExoticComponent<_lessonkit_core.AssessmentBehaviour & {
186
+ checkId: _lessonkit_core.CheckId;
187
+ passingScore?: number;
188
+ } & {
189
+ items: DragItem[];
190
+ targets: DropTarget[];
191
+ } & React.RefAttributes<AssessmentHandle>>;
192
+
193
+ type AssessmentSequenceProps = AssessmentBehaviour & {
194
+ children: React.ReactNode;
195
+ /** Show one child assessment at a time (Question Set). */
196
+ sequential?: boolean;
197
+ };
198
+ declare function AssessmentSequence(props: AssessmentSequenceProps): react_jsx_runtime.JSX.Element;
199
+
200
+ declare function useAssessmentState(enclosingLessonId?: LessonId): {
201
+ answer: (data: AssessmentAnsweredData) => void;
202
+ complete: (data: AssessmentCompletedData) => void;
203
+ };
204
+
112
205
  declare function useLessonkit(): LessonkitRuntime;
113
206
  declare function useProgress(): _lessonkit_core.ProgressState;
114
207
  declare function useTracking(): {
@@ -122,6 +215,7 @@ declare function useCompletion(): {
122
215
  }) => void;
123
216
  completeCourse: () => void;
124
217
  };
218
+
125
219
  declare function useQuizState(enclosingLessonId?: LessonId): {
126
220
  answer: (opts: {
127
221
  checkId: CheckId;
@@ -137,6 +231,8 @@ declare function useQuizState(enclosingLessonId?: LessonId): {
137
231
  }) => void;
138
232
  };
139
233
 
234
+ declare function resetAssessmentWarningsForTests(): void;
235
+
140
236
  type ThemeMode = "light" | "dark" | "system";
141
237
  type ThemeResolvedMode = "light" | "dark";
142
238
  type ThemeProviderProps = {
@@ -158,13 +254,14 @@ declare function ThemeProvider(props: ThemeProviderProps): react_jsx_runtime.JSX
158
254
  declare function useTheme(): ThemeContextValue;
159
255
 
160
256
  declare const blockCatalogVersion: 1;
257
+ declare const blockCatalogV2Version: 2;
161
258
  type BlockPropSpec = {
162
259
  name: string;
163
260
  type: string;
164
261
  required: boolean;
165
262
  description: string;
166
263
  };
167
- type BlockCatalogEntry = {
264
+ type BlockCatalogEntryBase = {
168
265
  type: string;
169
266
  aliases?: string[];
170
267
  category: "container" | "content" | "assessment" | "chrome";
@@ -191,6 +288,12 @@ type BlockCatalogEntry = {
191
288
  manualTracking?: string;
192
289
  };
193
290
  };
291
+ type BlockCatalogEntry = BlockCatalogEntryBase;
292
+ type BlockCatalogEntryV2 = BlockCatalogEntryBase & {
293
+ assessmentContract?: true;
294
+ h5pMachineName?: string;
295
+ h5pAlias?: string;
296
+ };
194
297
  declare const BLOCK_CATALOG: ({
195
298
  type: string;
196
299
  category: "container";
@@ -398,7 +501,11 @@ declare const BLOCK_CATALOG: ({
398
501
  optionalIds?: undefined;
399
502
  aliases?: undefined;
400
503
  })[];
401
- declare function buildBlockCatalog(): BlockCatalogEntry[];
402
- declare function getBlockCatalogEntry(type: string): BlockCatalogEntry | undefined;
504
+ declare const BLOCK_CATALOG_V2: BlockCatalogEntryV2[];
505
+ type BuildBlockCatalogOptions = {
506
+ version?: 1 | 2;
507
+ };
508
+ declare function buildBlockCatalog(opts?: BuildBlockCatalogOptions): BlockCatalogEntry[] | BlockCatalogEntryV2[];
509
+ declare function getBlockCatalogEntry(type: string, opts?: BuildBlockCatalogOptions): BlockCatalogEntry | BlockCatalogEntryV2 | undefined;
403
510
 
404
- export { BLOCK_CATALOG, type BlockCatalogEntry, type BlockPropSpec, Course, type CourseProps, KnowledgeCheck, type KnowledgeCheckProps, Lesson, type LessonProps, type LessonkitConfig, LessonkitProvider, type LessonkitProviderProps, type LessonkitRuntime, ProgressTracker, type ProgressTrackerProps, Quiz, type QuizProps, Reflection, type ReflectionProps, Scenario, type ScenarioProps, type ThemeContextValue, type ThemeMode, ThemeProvider, type ThemeProviderProps, type ThemeResolvedMode, blockCatalogVersion, buildBlockCatalog, getBlockCatalogEntry, resetQuizWarningsForTests, useCompletion, useLessonkit, useProgress, useQuizState, useTheme, useTracking };
511
+ export { AssessmentSequence, type AssessmentSequenceProps, BLOCK_CATALOG, BLOCK_CATALOG_V2, type BlockCatalogEntry, type BlockCatalogEntryV2, type BlockPropSpec, Course, type CourseProps, DragAndDrop, type DragAndDropProps, type DragItem, DragTheWords, type DragTheWordsProps, type DropTarget, type FillInBlankSpec, FillInTheBlanks, type FillInTheBlanksProps, KnowledgeCheck, type KnowledgeCheckProps, Lesson, type LessonProps, type LessonkitConfig, LessonkitProvider, type LessonkitProviderProps, type LessonkitRuntime, MarkTheWords, type MarkTheWordsProps, ProgressTracker, type ProgressTrackerProps, Quiz, type QuizProps, Reflection, type ReflectionProps, Scenario, type ScenarioProps, type ThemeContextValue, type ThemeMode, ThemeProvider, type ThemeProviderProps, type ThemeResolvedMode, TrueFalse, type TrueFalseProps, blockCatalogV2Version, blockCatalogVersion, buildBlockCatalog, getBlockCatalogEntry, resetAssessmentWarningsForTests, resetQuizWarningsForTests, useAssessmentState, useCompletion, useLessonkit, useProgress, useQuizState, useTheme, useTracking };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import React from 'react';
3
3
  import * as _lessonkit_core from '@lessonkit/core';
4
- import { CourseId, TelemetryUser, TrackingClient, LessonkitPlugin, ProgressState, LessonId, TelemetryEventName, TelemetryDataFor, PluginHost, BlockId, CheckId } from '@lessonkit/core';
5
- export { AssessmentScoreInput, AssessmentScoreResult, InteractionBlockRegistration, LessonkitPlugin, LessonkitPluginContext, LessonkitPluginKind, PluginHost, PluginRegistry, TelemetryPipelineSink, buildTelemetryEvent, createLessonkitRuntime, createPluginRegistry, createTelemetryPipeline, defineAssessmentPlugin, defineLifecyclePlugin, defineTelemetryPlugin } from '@lessonkit/core';
6
- import { AssessmentDescriptor } from '@lessonkit/lxpack';
4
+ import { CourseId, TelemetryUser, TrackingClient, LessonkitPlugin, ProgressState, LessonId, TelemetryEventName, TelemetryDataFor, PluginHost, BlockId, AssessmentHandle, AssessmentBaseProps, AssessmentBehaviour, AssessmentAnsweredData, AssessmentCompletedData, CheckId } from '@lessonkit/core';
5
+ export { AssessmentAnsweredData, AssessmentBaseProps, AssessmentBehaviour, AssessmentCompletedData, AssessmentHandle, AssessmentInteractionType, AssessmentScoreInput, AssessmentScoreResult, AssessmentXAPIData, InteractionBlockRegistration, LessonkitPlugin, LessonkitPluginContext, LessonkitPluginKind, PluginHost, PluginRegistry, TelemetryPipelineSink, buildTelemetryEvent, createLessonkitRuntime, createPluginRegistry, createTelemetryPipeline, defineAssessmentPlugin, defineLifecyclePlugin, defineTelemetryPlugin } from '@lessonkit/core';
6
+ import { McqAssessmentDescriptor } from '@lessonkit/lxpack';
7
7
  import { XAPITransport, XAPIClient } from '@lessonkit/xapi';
8
8
  import { LxpackBridgeMode } from '@lessonkit/lxpack/bridge';
9
9
  import { LessonkitThemeV1, ThemePresetName, PartialLessonkitThemeV1 } from '@lessonkit/themes';
@@ -96,8 +96,8 @@ type ReflectionProps = {
96
96
  onChange?: (value: string) => void;
97
97
  children?: React.ReactNode;
98
98
  };
99
- type QuizProps = AssessmentDescriptor;
100
- type KnowledgeCheckProps = AssessmentDescriptor;
99
+ type QuizProps = McqAssessmentDescriptor;
100
+ type KnowledgeCheckProps = McqAssessmentDescriptor;
101
101
  type ProgressTrackerProps = {
102
102
  totalLessons?: number;
103
103
  };
@@ -109,6 +109,99 @@ declare function KnowledgeCheck(props: KnowledgeCheckProps): react_jsx_runtime.J
109
109
  declare function Quiz(props: QuizProps): react_jsx_runtime.JSX.Element;
110
110
  declare function ProgressTracker(props: ProgressTrackerProps): react_jsx_runtime.JSX.Element;
111
111
 
112
+ type TrueFalseProps = AssessmentBaseProps & {
113
+ question: string;
114
+ answer: boolean;
115
+ };
116
+ declare const TrueFalse: React.ForwardRefExoticComponent<_lessonkit_core.AssessmentBehaviour & {
117
+ checkId: _lessonkit_core.CheckId;
118
+ passingScore?: number;
119
+ } & {
120
+ question: string;
121
+ answer: boolean;
122
+ } & React.RefAttributes<AssessmentHandle>>;
123
+
124
+ type MarkTheWordsProps = AssessmentBaseProps & {
125
+ /** Plain text; words listed in `correctWords` are selectable targets. */
126
+ text: string;
127
+ correctWords: string[];
128
+ };
129
+ declare const MarkTheWords: React.ForwardRefExoticComponent<_lessonkit_core.AssessmentBehaviour & {
130
+ checkId: _lessonkit_core.CheckId;
131
+ passingScore?: number;
132
+ } & {
133
+ /** Plain text; words listed in `correctWords` are selectable targets. */
134
+ text: string;
135
+ correctWords: string[];
136
+ } & React.RefAttributes<AssessmentHandle>>;
137
+
138
+ type FillInBlankSpec = {
139
+ id: string;
140
+ answer: string;
141
+ };
142
+ type FillInTheBlanksProps = AssessmentBaseProps & {
143
+ /** Text with `*` wrapping each blank answer, e.g. "The *capital* of France is *Paris*." */
144
+ template: string;
145
+ /** Optional explicit blanks (overrides parsing from template). */
146
+ blanks?: FillInBlankSpec[];
147
+ };
148
+ declare const FillInTheBlanks: React.ForwardRefExoticComponent<_lessonkit_core.AssessmentBehaviour & {
149
+ checkId: _lessonkit_core.CheckId;
150
+ passingScore?: number;
151
+ } & {
152
+ /** Text with `*` wrapping each blank answer, e.g. "The *capital* of France is *Paris*." */
153
+ template: string;
154
+ /** Optional explicit blanks (overrides parsing from template). */
155
+ blanks?: FillInBlankSpec[];
156
+ } & React.RefAttributes<AssessmentHandle>>;
157
+
158
+ type DragTheWordsProps = AssessmentBaseProps & {
159
+ /** Sentence with `*` around drop zones; `words` are draggable options. */
160
+ template: string;
161
+ words: string[];
162
+ };
163
+ declare const DragTheWords: React.ForwardRefExoticComponent<_lessonkit_core.AssessmentBehaviour & {
164
+ checkId: _lessonkit_core.CheckId;
165
+ passingScore?: number;
166
+ } & {
167
+ /** Sentence with `*` around drop zones; `words` are draggable options. */
168
+ template: string;
169
+ words: string[];
170
+ } & React.RefAttributes<AssessmentHandle>>;
171
+
172
+ type DragItem = {
173
+ id: string;
174
+ label: string;
175
+ };
176
+ type DropTarget = {
177
+ id: string;
178
+ label: string;
179
+ accepts: string;
180
+ };
181
+ type DragAndDropProps = AssessmentBaseProps & {
182
+ items: DragItem[];
183
+ targets: DropTarget[];
184
+ };
185
+ declare const DragAndDrop: React.ForwardRefExoticComponent<_lessonkit_core.AssessmentBehaviour & {
186
+ checkId: _lessonkit_core.CheckId;
187
+ passingScore?: number;
188
+ } & {
189
+ items: DragItem[];
190
+ targets: DropTarget[];
191
+ } & React.RefAttributes<AssessmentHandle>>;
192
+
193
+ type AssessmentSequenceProps = AssessmentBehaviour & {
194
+ children: React.ReactNode;
195
+ /** Show one child assessment at a time (Question Set). */
196
+ sequential?: boolean;
197
+ };
198
+ declare function AssessmentSequence(props: AssessmentSequenceProps): react_jsx_runtime.JSX.Element;
199
+
200
+ declare function useAssessmentState(enclosingLessonId?: LessonId): {
201
+ answer: (data: AssessmentAnsweredData) => void;
202
+ complete: (data: AssessmentCompletedData) => void;
203
+ };
204
+
112
205
  declare function useLessonkit(): LessonkitRuntime;
113
206
  declare function useProgress(): _lessonkit_core.ProgressState;
114
207
  declare function useTracking(): {
@@ -122,6 +215,7 @@ declare function useCompletion(): {
122
215
  }) => void;
123
216
  completeCourse: () => void;
124
217
  };
218
+
125
219
  declare function useQuizState(enclosingLessonId?: LessonId): {
126
220
  answer: (opts: {
127
221
  checkId: CheckId;
@@ -137,6 +231,8 @@ declare function useQuizState(enclosingLessonId?: LessonId): {
137
231
  }) => void;
138
232
  };
139
233
 
234
+ declare function resetAssessmentWarningsForTests(): void;
235
+
140
236
  type ThemeMode = "light" | "dark" | "system";
141
237
  type ThemeResolvedMode = "light" | "dark";
142
238
  type ThemeProviderProps = {
@@ -158,13 +254,14 @@ declare function ThemeProvider(props: ThemeProviderProps): react_jsx_runtime.JSX
158
254
  declare function useTheme(): ThemeContextValue;
159
255
 
160
256
  declare const blockCatalogVersion: 1;
257
+ declare const blockCatalogV2Version: 2;
161
258
  type BlockPropSpec = {
162
259
  name: string;
163
260
  type: string;
164
261
  required: boolean;
165
262
  description: string;
166
263
  };
167
- type BlockCatalogEntry = {
264
+ type BlockCatalogEntryBase = {
168
265
  type: string;
169
266
  aliases?: string[];
170
267
  category: "container" | "content" | "assessment" | "chrome";
@@ -191,6 +288,12 @@ type BlockCatalogEntry = {
191
288
  manualTracking?: string;
192
289
  };
193
290
  };
291
+ type BlockCatalogEntry = BlockCatalogEntryBase;
292
+ type BlockCatalogEntryV2 = BlockCatalogEntryBase & {
293
+ assessmentContract?: true;
294
+ h5pMachineName?: string;
295
+ h5pAlias?: string;
296
+ };
194
297
  declare const BLOCK_CATALOG: ({
195
298
  type: string;
196
299
  category: "container";
@@ -398,7 +501,11 @@ declare const BLOCK_CATALOG: ({
398
501
  optionalIds?: undefined;
399
502
  aliases?: undefined;
400
503
  })[];
401
- declare function buildBlockCatalog(): BlockCatalogEntry[];
402
- declare function getBlockCatalogEntry(type: string): BlockCatalogEntry | undefined;
504
+ declare const BLOCK_CATALOG_V2: BlockCatalogEntryV2[];
505
+ type BuildBlockCatalogOptions = {
506
+ version?: 1 | 2;
507
+ };
508
+ declare function buildBlockCatalog(opts?: BuildBlockCatalogOptions): BlockCatalogEntry[] | BlockCatalogEntryV2[];
509
+ declare function getBlockCatalogEntry(type: string, opts?: BuildBlockCatalogOptions): BlockCatalogEntry | BlockCatalogEntryV2 | undefined;
403
510
 
404
- export { BLOCK_CATALOG, type BlockCatalogEntry, type BlockPropSpec, Course, type CourseProps, KnowledgeCheck, type KnowledgeCheckProps, Lesson, type LessonProps, type LessonkitConfig, LessonkitProvider, type LessonkitProviderProps, type LessonkitRuntime, ProgressTracker, type ProgressTrackerProps, Quiz, type QuizProps, Reflection, type ReflectionProps, Scenario, type ScenarioProps, type ThemeContextValue, type ThemeMode, ThemeProvider, type ThemeProviderProps, type ThemeResolvedMode, blockCatalogVersion, buildBlockCatalog, getBlockCatalogEntry, resetQuizWarningsForTests, useCompletion, useLessonkit, useProgress, useQuizState, useTheme, useTracking };
511
+ export { AssessmentSequence, type AssessmentSequenceProps, BLOCK_CATALOG, BLOCK_CATALOG_V2, type BlockCatalogEntry, type BlockCatalogEntryV2, type BlockPropSpec, Course, type CourseProps, DragAndDrop, type DragAndDropProps, type DragItem, DragTheWords, type DragTheWordsProps, type DropTarget, type FillInBlankSpec, FillInTheBlanks, type FillInTheBlanksProps, KnowledgeCheck, type KnowledgeCheckProps, Lesson, type LessonProps, type LessonkitConfig, LessonkitProvider, type LessonkitProviderProps, type LessonkitRuntime, MarkTheWords, type MarkTheWordsProps, ProgressTracker, type ProgressTrackerProps, Quiz, type QuizProps, Reflection, type ReflectionProps, Scenario, type ScenarioProps, type ThemeContextValue, type ThemeMode, ThemeProvider, type ThemeProviderProps, type ThemeResolvedMode, TrueFalse, type TrueFalseProps, blockCatalogV2Version, blockCatalogVersion, buildBlockCatalog, getBlockCatalogEntry, resetAssessmentWarningsForTests, resetQuizWarningsForTests, useAssessmentState, useCompletion, useLessonkit, useProgress, useQuizState, useTheme, useTracking };