@teacharium/widget 0.3.0 → 0.4.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/README.md CHANGED
@@ -13,9 +13,9 @@ If you are developing a production application, we recommend updating the config
13
13
 
14
14
  ```js
15
15
  export default tseslint.config([
16
- globalIgnores(['dist']),
16
+ globalIgnores(["dist"]),
17
17
  {
18
- files: ['**/*.{ts,tsx}'],
18
+ files: ["**/*.{ts,tsx}"],
19
19
  extends: [
20
20
  // Other configs...
21
21
 
@@ -30,40 +30,40 @@ export default tseslint.config([
30
30
  ],
31
31
  languageOptions: {
32
32
  parserOptions: {
33
- project: ['./tsconfig.node.json', './tsconfig.app.json'],
33
+ project: ["./tsconfig.node.json", "./tsconfig.app.json"],
34
34
  tsconfigRootDir: import.meta.dirname,
35
35
  },
36
36
  // other options...
37
37
  },
38
38
  },
39
- ])
39
+ ]);
40
40
  ```
41
41
 
42
42
  You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
43
43
 
44
44
  ```js
45
45
  // eslint.config.js
46
- import reactX from 'eslint-plugin-react-x'
47
- import reactDom from 'eslint-plugin-react-dom'
46
+ import reactX from "eslint-plugin-react-x";
47
+ import reactDom from "eslint-plugin-react-dom";
48
48
 
49
49
  export default tseslint.config([
50
- globalIgnores(['dist']),
50
+ globalIgnores(["dist"]),
51
51
  {
52
- files: ['**/*.{ts,tsx}'],
52
+ files: ["**/*.{ts,tsx}"],
53
53
  extends: [
54
54
  // Other configs...
55
55
  // Enable lint rules for React
56
- reactX.configs['recommended-typescript'],
56
+ reactX.configs["recommended-typescript"],
57
57
  // Enable lint rules for React DOM
58
58
  reactDom.configs.recommended,
59
59
  ],
60
60
  languageOptions: {
61
61
  parserOptions: {
62
- project: ['./tsconfig.node.json', './tsconfig.app.json'],
62
+ project: ["./tsconfig.node.json", "./tsconfig.app.json"],
63
63
  tsconfigRootDir: import.meta.dirname,
64
64
  },
65
65
  // other options...
66
66
  },
67
67
  },
68
- ])
68
+ ]);
69
69
  ```
@@ -1,5 +1,5 @@
1
1
  import { BaseField } from '@measured/puck';
2
- export type TeachariumCustomFieldType = "imageMedia" | "videoMedia" | "audioMedia" | "voiceover" | "action" | "variable" | "numericExpression" | "stringExpression" | "placeholder" | "step" | "condition" | "textStyle" | "frame";
2
+ export type TeachariumCustomFieldType = "imageMedia" | "videoMedia" | "audioMedia" | "voiceover" | "action" | "variable" | "numericExpression" | "stringExpression" | "placeholder" | "step" | "condition" | "textStyle" | "frame" | "color";
3
3
  export type TeachariumCustomField = BaseField & {
4
4
  type: TeachariumCustomFieldType;
5
5
  label?: string;
@@ -63,4 +63,8 @@ export type FrameField = TeachariumCustomField & {
63
63
  type: "frame";
64
64
  label?: string;
65
65
  };
66
+ export type ColorField = TeachariumCustomField & {
67
+ type: "color";
68
+ label?: string;
69
+ };
66
70
  export type TeachariumCustomFields = TeachariumCustomField;
@@ -1,4 +1,9 @@
1
1
  import { default as React } from 'react';
2
+ export interface MediaUrlResult {
3
+ data: string | null | undefined;
4
+ isLoading?: boolean;
5
+ error?: Error | null;
6
+ }
2
7
  export type VoiceType = "alloy" | "ash" | "ballad" | "coral" | "echo" | "fable" | "onyx" | "nova" | "sage" | "shimmer" | "verse";
3
8
  export interface VoiceoverData {
4
9
  enabled: boolean;
@@ -19,7 +24,7 @@ export interface BaseEvent {
19
24
  }
20
25
  export type VariableValue = string | number | boolean;
21
26
  export interface UseNumberExpressions {
22
- (expressions: string[], defaultValues?: number[]): (number)[];
27
+ (expressions: string[], defaultValues?: number[]): number[];
23
28
  }
24
29
  export interface UseStringExpressions {
25
30
  (expressions: (string | undefined)[], defaultValues?: string[]): string[];
@@ -30,29 +35,6 @@ export interface UseVariableValues {
30
35
  export interface UseUpdateVariables {
31
36
  (values: Record<string, VariableValue>): void;
32
37
  }
33
- export interface UseMediaUrl {
34
- (src: string, expiresIn?: number): {
35
- data: string | undefined;
36
- error: Error | null;
37
- isError: boolean;
38
- isLoading: boolean;
39
- isLoadingError: boolean;
40
- };
41
- }
42
- export interface UseVoiceoverUrl {
43
- (contentHash?: string | null, voice?: VoiceType | null, options?: {
44
- enabled?: boolean;
45
- model?: string | null;
46
- }): {
47
- data: string | undefined;
48
- error: Error | null;
49
- isError: boolean;
50
- isLoading: boolean;
51
- isLoadingError: boolean;
52
- refetch: () => Promise<any>;
53
- voiceoverId: string | undefined;
54
- };
55
- }
56
38
  export interface ConditionValue {
57
39
  leftOperand: string;
58
40
  operator: string;
@@ -109,6 +91,19 @@ export interface UseIsItem {
109
91
  options?: Omit<UseIsItemOptions, "stepId">;
110
92
  }): ItemUpdateApi;
111
93
  }
94
+ export type SetWidgetState<T> = (value: T | ((prev: T) => T)) => void;
95
+ export interface UseWidgetStateObjectResult<T extends Record<string, unknown>> {
96
+ state: T;
97
+ updateState: (updates: Partial<T>) => void;
98
+ resetState: () => void;
99
+ setState: (newState: T | ((prev: T) => T)) => void;
100
+ }
101
+ export interface UseWidgetState {
102
+ <T>(key: string, initialValue: T): [T, SetWidgetState<T>];
103
+ }
104
+ export interface UseWidgetStateObject {
105
+ <T extends Record<string, unknown>>(initialState: T): UseWidgetStateObjectResult<T>;
106
+ }
112
107
  /**
113
108
  * Hook for registering sub-items with custom IDs (e.g., rows in a matrix).
114
109
  * Requires passing a custom widget ID and optional type.
@@ -139,8 +134,13 @@ export interface UseLessonEventSubscription {
139
134
  }
140
135
  export interface TeachariumWidgetApi {
141
136
  isEditing: boolean;
142
- playerMode: "editing" | "preview" | "playbook";
137
+ playerMode: "editing" | "preview" | "playbook" | "player" | "review";
143
138
  stepId: string | undefined;
139
+ /**
140
+ * Whether the player is in review mode (showing completed work).
141
+ * When true, widgets should disable interactions but show content.
142
+ */
143
+ isReviewMode: boolean;
144
144
  events: {
145
145
  /**
146
146
  * Emit an event with type and params
@@ -156,14 +156,37 @@ export interface TeachariumWidgetApi {
156
156
  useNumberExpressions: UseNumberExpressions;
157
157
  useStringExpressions: UseStringExpressions;
158
158
  useVariableValues: UseVariableValues;
159
- useMediaUrl: UseMediaUrl;
160
- useVoiceoverUrl: UseVoiceoverUrl;
161
159
  useConditionEvaluation: UseConditionEvaluation;
162
160
  useIsItem: UseIsItem;
163
161
  useIsItemWithId: UseIsItemWithId;
164
162
  useItemsContext: UseItemsContext;
165
163
  useLessonEventEmitter: UseLessonEventEmitter;
166
164
  useLessonEventSubscription: UseLessonEventSubscription;
165
+ useResolvedMediaUrl: (mediaId: string | undefined) => MediaUrlResult;
166
+ useResolvedVoiceoverUrl: (contentHash: string | undefined, voice: string | undefined) => MediaUrlResult;
167
+ /**
168
+ * Persistent widget state hook (replaces useState for state that should survive navigation).
169
+ * State stored with this hook will:
170
+ * - Persist when navigating away from a step
171
+ * - Be restored when returning to the step (Previous button)
172
+ * - Be included in session state for resume
173
+ *
174
+ * @example
175
+ * const [selected, setSelected] = api.hooks.useWidgetState<string[]>("selected", []);
176
+ */
177
+ useWidgetState: UseWidgetState;
178
+ /**
179
+ * Persistent widget state hook with object shape.
180
+ * Provides convenient methods for partial updates and reset.
181
+ *
182
+ * @example
183
+ * const { state, updateState, resetState } = api.hooks.useWidgetStateObject({
184
+ * selected: [] as string[],
185
+ * showFeedback: false,
186
+ * isCorrect: undefined as boolean | undefined,
187
+ * });
188
+ */
189
+ useWidgetStateObject: UseWidgetStateObject;
167
190
  };
168
191
  /**
169
192
  * Create a variable that can be either transient (runtime only) or persistent (lesson-wide)
@@ -454,3 +454,4 @@ export {
454
454
  Se as hi,
455
455
  be as registerWidget
456
456
  };
457
+ //# sourceMappingURL=teacharium-widget.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teacharium-widget.es.js","sources":["../src/teacharium-widget.ts","../src/teacharium-widget-api.ts","../../../node_modules/.pnpm/react@19.1.2/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.pnpm/react@19.1.2/node_modules/react/cjs/react-jsx-runtime.development.js","../../../node_modules/.pnpm/react@19.1.2/node_modules/react/jsx-runtime.js","../src/standard-layout-options.tsx","../src/components/AudioPlayer.tsx","../src/utils/voiceover.ts","../src/utils/actions.ts","../src/main.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport type React from \"react\";\nimport type {\n DefaultComponentProps,\n Fields,\n PuckComponent,\n} from \"@measured/puck\";\nimport type { TeachariumWidgetApi } from \"./teacharium-widget-api\";\nimport type { TeachariumCustomFields } from \"./teacharium-custom-fields\";\n\ninterface TeachariumComponentProps {\n api: TeachariumWidgetApi;\n}\n\n// Create a union type of all your custom fields\n\nexport interface TeachariumComponentConfig<T = {}> {\n usagePrompt: string;\n fields: Fields<DefaultComponentProps, TeachariumCustomFields>;\n defaultProps: DefaultComponentProps;\n resolveData?: (arg: { props: any; changed: any }) => Promise<any>; // Todo tighten type\n resolveFields?: (\n data: unknown,\n context: {\n fields: Fields<DefaultComponentProps, TeachariumCustomFields>;\n },\n ) => Fields<DefaultComponentProps, TeachariumCustomFields>;\n render: PuckComponent<T & TeachariumComponentProps>;\n}\n\nexport interface TeachariumWidget<T> {\n name: string;\n category: string;\n description?: string;\n aiPrompt?: string;\n icon?: React.ComponentType<{ className?: string }> | string;\n config: TeachariumComponentConfig<T>;\n}\n\nexport const registerWidget = (widget: TeachariumWidget<any>) => {\n window.TeachariumComponents = window.TeachariumComponents || {};\n window.TeachariumComponents[widget.name] = widget;\n};\n\nexport const getWidgets = () => {\n return Object.values(window.TeachariumComponents || {});\n};\n\ndeclare global {\n interface Window {\n TeachariumComponents?: Record<string, TeachariumWidget<any>>;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type React from \"react\";\n\nexport interface MediaUrlResult {\n data: string | null | undefined;\n isLoading?: boolean;\n error?: Error | null;\n}\n\nexport type VoiceType =\n | \"alloy\"\n | \"ash\"\n | \"ballad\"\n | \"coral\"\n | \"echo\"\n | \"fable\"\n | \"onyx\"\n | \"nova\"\n | \"sage\"\n | \"shimmer\"\n | \"verse\";\n\nexport interface VoiceoverData {\n enabled: boolean;\n voice: VoiceType;\n speed?: number;\n showPlayButton: boolean;\n cached?: boolean;\n content?: string;\n contentHash?: string;\n}\n\n// Event source constants\nexport const EVENT_SOURCE_PLAYER = \"player\";\nexport const EVENT_SOURCE_FOOTER = \"footer\";\n\ntype EventListener<T = any> = (event: T) => void;\n\n// Base event interface with mandatory type field\nexport interface BaseEvent {\n type: string;\n timestamp?: string; // Auto-added by emit\n emittedBy?: string; // Optional source identifier\n}\n\nexport type VariableValue = string | number | boolean;\n\nexport interface UseNumberExpressions {\n (expressions: string[], defaultValues?: number[]): number[];\n}\n\nexport interface UseStringExpressions {\n (expressions: (string | undefined)[], defaultValues?: string[]): string[];\n}\n\nexport interface UseVariableValues {\n (names: Array<string | null | undefined>): (VariableValue | undefined)[];\n}\n\nexport interface UseUpdateVariables {\n (values: Record<string, VariableValue>): void;\n}\n\nexport interface ConditionValue {\n leftOperand: string;\n operator: string;\n rightOperand: string;\n type: \"string\" | \"number\";\n}\n\nexport interface UseConditionEvaluationResult {\n result: boolean | null;\n hasError: boolean;\n}\n\nexport interface UseConditionEvaluation {\n (condition: ConditionValue): UseConditionEvaluationResult;\n}\n\nexport type ItemType = \"instructional\" | \"practice\" | \"scored\";\n\nexport interface CurrentAnswer {\n humanReadable: string;\n machineReadable: string | number;\n}\n\nexport interface ItemStatus {\n correct: boolean;\n attempted: boolean;\n currentAnswer?: CurrentAnswer;\n maxScore: number;\n currentScore: number;\n}\n\nexport interface ItemData {\n widgetId: string;\n widgetName?: string;\n stepId: string;\n type: ItemType;\n status: ItemStatus;\n}\n\nexport interface ItemUpdateApi {\n updateCorrect: (correct: boolean) => void;\n updateAttempted: (attempted: boolean) => void;\n updateAnswer: (answer: CurrentAnswer | undefined) => void;\n updateStatus: (updates: Partial<ItemStatus>) => void;\n updateScore: (currentScore: number, maxScore?: number) => void;\n updateMaxScore: (maxScore: number) => void;\n}\n\nexport interface UseIsItemOptions {\n stepId: string;\n type?: ItemType;\n maxScore?: number;\n widgetName?: string;\n}\n\n/**\n * Hook for widgets to register as items and get the update API.\n * When used via api.hooks.useIsItem (curried version), widgets can optionally pass configuration.\n */\nexport interface UseIsItem {\n (options?: {\n widgetId?: string;\n options?: Omit<UseIsItemOptions, \"stepId\">;\n }): ItemUpdateApi;\n}\n\n// Widget state types for persistent state management\nexport type SetWidgetState<T> = (value: T | ((prev: T) => T)) => void;\n\nexport interface UseWidgetStateObjectResult<T extends Record<string, unknown>> {\n state: T;\n updateState: (updates: Partial<T>) => void;\n resetState: () => void;\n setState: (newState: T | ((prev: T) => T)) => void;\n}\n\nexport interface UseWidgetState {\n <T>(key: string, initialValue: T): [T, SetWidgetState<T>];\n}\n\nexport interface UseWidgetStateObject {\n <T extends Record<string, unknown>>(\n initialState: T,\n ): UseWidgetStateObjectResult<T>;\n}\n\n/**\n * Hook for registering sub-items with custom IDs (e.g., rows in a matrix).\n * Requires passing a custom widget ID and optional type.\n */\nexport interface UseIsItemWithId {\n (\n customWidgetId: string,\n options?: { type?: ItemType; maxScore?: number; widgetName?: string },\n ): ItemUpdateApi;\n}\n\nexport interface ItemsContextValue {\n items: Map<string, ItemData>;\n registerItem: (\n widgetId: string,\n stepId: string,\n type?: ItemType,\n maxScore?: number,\n widgetName?: string,\n ) => void;\n unregisterItem: (widgetId: string) => void;\n getItems: () => ItemData[];\n getItemsByStepId: (stepId: string) => ItemData[];\n getItemUpdateApi: (widgetId: string) => ItemUpdateApi;\n}\n\nexport interface UseItemsContext {\n (): ItemsContextValue;\n}\n\nexport interface UseLessonEventEmitter {\n (): <T extends BaseEvent = BaseEvent>(event: T) => void;\n}\n\nexport interface UseLessonEventSubscription {\n <T = any>(\n eventType: string,\n listener: EventListener<T>,\n priority?: number,\n deps?: React.DependencyList,\n ): void;\n}\n\nexport interface TeachariumWidgetApi {\n isEditing: boolean;\n\n playerMode: \"editing\" | \"preview\" | \"playbook\" | \"player\" | \"review\";\n\n stepId: string | undefined;\n\n /**\n * Whether the player is in review mode (showing completed work).\n * When true, widgets should disable interactions but show content.\n */\n isReviewMode: boolean;\n\n events: {\n /**\n * Emit an event with type and params\n * Example: api.events.emit({ type: \"nextStep\", params: {} })\n */\n emit<T extends BaseEvent = BaseEvent>(event: T): void;\n subscribe<T extends BaseEvent = BaseEvent>(\n eventType: string,\n listener: EventListener<T>,\n ): () => void;\n unsubscribe(eventType: string, listener: EventListener): void;\n };\n\n React: any;\n\n updateVariables: (values: Record<string, VariableValue>) => void;\n\n hooks: {\n useNumberExpressions: UseNumberExpressions;\n useStringExpressions: UseStringExpressions;\n useVariableValues: UseVariableValues;\n useConditionEvaluation: UseConditionEvaluation;\n useIsItem: UseIsItem;\n useIsItemWithId: UseIsItemWithId;\n useItemsContext: UseItemsContext;\n useLessonEventEmitter: UseLessonEventEmitter;\n useLessonEventSubscription: UseLessonEventSubscription;\n useResolvedMediaUrl: (mediaId: string | undefined) => MediaUrlResult;\n useResolvedVoiceoverUrl: (\n contentHash: string | undefined,\n voice: string | undefined,\n ) => MediaUrlResult;\n\n /**\n * Persistent widget state hook (replaces useState for state that should survive navigation).\n * State stored with this hook will:\n * - Persist when navigating away from a step\n * - Be restored when returning to the step (Previous button)\n * - Be included in session state for resume\n *\n * @example\n * const [selected, setSelected] = api.hooks.useWidgetState<string[]>(\"selected\", []);\n */\n useWidgetState: UseWidgetState;\n\n /**\n * Persistent widget state hook with object shape.\n * Provides convenient methods for partial updates and reset.\n *\n * @example\n * const { state, updateState, resetState } = api.hooks.useWidgetStateObject({\n * selected: [] as string[],\n * showFeedback: false,\n * isCorrect: undefined as boolean | undefined,\n * });\n */\n useWidgetStateObject: UseWidgetStateObject;\n };\n\n /**\n * Create a variable that can be either transient (runtime only) or persistent (lesson-wide)\n * By default, creates a transient variable automatically prefixed with the widget ID\n * Example: addVariable('selectedAnswer', 0) might create 'mcwidget1_selectedAnswer'\n *\n * For lesson-wide variables, pass { scope: \"lesson\", skipPrefix: true }\n * Example: addVariable('TotalTime', 0, \"number\", { scope: \"lesson\", skipPrefix: true })\n *\n * @param name - Base name for the variable (will be prefixed with widget ID unless skipPrefix is true)\n * @param initialValue - Initial value for the variable\n * @param type - Optional type specification (auto-inferred if not provided)\n * @param options - Optional configuration for the variable\n * @returns The full variable name that was created\n */\n addVariable: (\n name: string,\n initialValue: VariableValue,\n type?: \"string\" | \"number\" | \"boolean\",\n options?: {\n scope?: \"lesson\" | \"step\";\n skipPrefix?: boolean;\n description?: string;\n },\n ) => string;\n\n /**\n * Increment a numeric variable by a specified amount\n * @param name - Variable name to increment\n * @param amount - Amount to increment by (default: 1)\n */\n incrementVariable: (name: string, amount?: number) => void;\n\n /**\n * Decrement a numeric variable by a specified amount\n * @param name - Variable name to decrement\n * @param amount - Amount to decrement by (default: 1)\n */\n decrementVariable: (name: string, amount?: number) => void;\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return (type.displayName || \"Context\") + \".Provider\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(\n type,\n key,\n self,\n source,\n owner,\n props,\n debugStack,\n debugTask\n ) {\n self = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== self ? self : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n source,\n self,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n self,\n source,\n getOwner(),\n maybeKey,\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_ELEMENT_TYPE &&\n node._store &&\n (node._store.validated = 1);\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\");\n Symbol.for(\"react.provider\");\n var REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey, source, self) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n source,\n self,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey, source, self) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n source,\n self,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/* eslint-disable react-refresh/only-export-components */\nimport type { PuckComponent } from \"@measured/puck\";\nimport type { TeachariumComponentConfig } from \"./teacharium-widget\";\nimport type { React } from \"next/dist/server/route-modules/app-page/vendored/rsc/entrypoints\";\n\n// interface StandardLayoutProps {\n// margin: Field;\n// width: Field;\n// }\n\nconst standardLayoutOptions = {\n margin: {\n type: \"number\",\n label: \"Margin\",\n min: 0,\n max: 100,\n step: 1,\n },\n // width: {\n // label: \"Width\",\n // type: \"radio\",\n // options: [\n // { label: \"Full\", value: \"full\" },\n // { label: \"Partial\", value: \"partial\" },\n // ],\n // },\n} as const;\n\ntype StandardLayoutProps = {\n margin: number;\n};\n\nexport const LayoutContainer: PuckComponent<\n StandardLayoutProps & { children: React.ReactNode }\n> = ({ margin, children }) => {\n const layoutStyle: React.CSSProperties = {};\n if (margin) {\n layoutStyle.padding = `${margin}px`;\n }\n // if (width) {\n // layoutStyle.width = width === \"partial\" ? \"80%\" : \"100%\";\n // layoutStyle.margin = width === \"partial\" ? \"0 auto\" : \"0\";\n // }\n return <div style={layoutStyle}>{children}</div>;\n};\n\nexport const addStandardLayoutOptions = <T,>(\n config: TeachariumComponentConfig<T>,\n): TeachariumComponentConfig<T & StandardLayoutProps> => {\n const Render = config.render;\n\n return {\n ...config,\n render: (props) => {\n return (\n <LayoutContainer {...props}>\n <Render {...props} />\n </LayoutContainer>\n );\n },\n fields: {\n ...config.fields,\n ...standardLayoutOptions,\n },\n };\n};\n","import * as React from \"react\";\nimport { Loader2, Pause, Play, Volume2, VolumeX } from \"lucide-react\";\n\nconst cn = (...classes: Array<string | false | null | undefined>) =>\n classes.filter(Boolean).join(\" \");\n\ninterface AudioPlayerProps {\n audioUrl: string;\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n onPlay?: () => void;\n onPause?: () => void;\n onError?: (error: string) => void;\n}\n\nexport const AudioPlayer: React.FC<AudioPlayerProps> = ({\n audioUrl,\n className,\n size = \"sm\",\n onPlay,\n onPause,\n onError,\n}) => {\n const audioRef = React.useRef<HTMLAudioElement>(null);\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [isLoading, setIsLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [isMuted, setIsMuted] = React.useState(false);\n\n const sizeClasses = {\n sm: \"h-6 w-6\",\n md: \"h-8 w-8\",\n lg: \"h-10 w-10\",\n } as const;\n\n const iconSizes = {\n sm: 12,\n md: 16,\n lg: 20,\n } as const;\n\n const handlePlay = async () => {\n if (!audioRef.current) return;\n\n try {\n setIsLoading(true);\n setError(null);\n\n if (isPlaying) {\n audioRef.current.pause();\n } else {\n await audioRef.current.play();\n }\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to play audio\";\n setError(errorMessage);\n onError?.(errorMessage);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleToggleMute = () => {\n if (audioRef.current) {\n audioRef.current.muted = !audioRef.current.muted;\n setIsMuted(audioRef.current.muted);\n }\n };\n\n React.useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const handlePlayEvent = () => {\n setIsPlaying(true);\n onPlay?.();\n };\n\n const handlePauseEvent = () => {\n setIsPlaying(false);\n onPause?.();\n };\n\n const handleEndedEvent = () => {\n setIsPlaying(false);\n onPause?.();\n };\n\n const handleLoadStart = () => {\n setIsLoading(true);\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n };\n\n const handleError = () => {\n const errorMessage = \"Failed to load audio\";\n setError(errorMessage);\n setIsLoading(false);\n onError?.(errorMessage);\n };\n\n audio.addEventListener(\"play\", handlePlayEvent);\n audio.addEventListener(\"pause\", handlePauseEvent);\n audio.addEventListener(\"ended\", handleEndedEvent);\n audio.addEventListener(\"loadstart\", handleLoadStart);\n audio.addEventListener(\"canplay\", handleCanPlay);\n audio.addEventListener(\"error\", handleError);\n\n return () => {\n audio.removeEventListener(\"play\", handlePlayEvent);\n audio.removeEventListener(\"pause\", handlePauseEvent);\n audio.removeEventListener(\"ended\", handleEndedEvent);\n audio.removeEventListener(\"loadstart\", handleLoadStart);\n audio.removeEventListener(\"canplay\", handleCanPlay);\n audio.removeEventListener(\"error\", handleError);\n };\n }, [onPlay, onPause, onError]);\n\n const buttonBaseClasses =\n \"inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 ring-offset-background bg-transparent hover:bg-gray-100\";\n\n if (error) {\n return (\n <button\n type=\"button\"\n className={cn(\n buttonBaseClasses,\n sizeClasses[size],\n \"text-red-500\",\n className,\n )}\n disabled\n >\n <VolumeX size={iconSizes[size]} />\n </button>\n );\n }\n\n return (\n <div className={cn(\"flex items-center gap-1\", className)}>\n <audio ref={audioRef} src={audioUrl} preload=\"metadata\" />\n\n <button\n type=\"button\"\n className={cn(buttonBaseClasses, sizeClasses[size])}\n onClick={handlePlay}\n disabled={isLoading}\n >\n {isLoading ? (\n <Loader2 size={iconSizes[size]} className=\"animate-spin\" />\n ) : isPlaying ? (\n <Pause size={iconSizes[size]} />\n ) : (\n <Play size={iconSizes[size]} />\n )}\n </button>\n\n {size !== \"sm\" && (\n <button\n type=\"button\"\n className={cn(buttonBaseClasses, sizeClasses[size])}\n onClick={handleToggleMute}\n >\n {isMuted ? (\n <VolumeX size={iconSizes[size]} />\n ) : (\n <Volume2 size={iconSizes[size]} />\n )}\n </button>\n )}\n </div>\n );\n};\n","const HASH_ALGORITHM = \"SHA-256\";\n\n/**\n * Compute a stable hash for voiceover content so the same script\n * reuses cached audio. Relies solely on browser-compatible Web Crypto APIs.\n */\nexport async function getVoiceoverHash(content: string) {\n const subtle = globalThis.crypto?.subtle;\n\n if (!subtle) {\n throw new Error(\"Web Crypto is not available to compute voiceover hashes\");\n }\n\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n const digest = await subtle.digest(HASH_ALGORITHM, data);\n const bytes = new Uint8Array(digest);\n\n let hash = \"\";\n for (let index = 0; index < bytes.length; index += 1) {\n hash += bytes[index].toString(16).padStart(2, \"0\");\n }\n\n return hash;\n}\n","/**\n * Utility functions for working with actions in Teacharium widgets\n */\n\nimport type { TeachariumWidgetApi } from \"../teacharium-widget-api\";\n\n/**\n * Action configuration type\n */\nexport interface ActionConfiguration {\n actionType: string;\n parameters: Record<string, unknown>;\n}\n\n/**\n * Execute multiple actions in sequence\n *\n * @param api - The TeachariumWidgetApi instance\n * @param actions - Array of action configurations to execute\n *\n * @example\n * ```typescript\n * executeActions(api, [\n * { actionType: \"setVariable\", parameters: { variableName: \"score\", value: 10 } },\n * { actionType: \"showFeedback\", parameters: { message: \"Great!\", variant: \"correct\" } },\n * { actionType: \"nextStep\", parameters: {} }\n * ]);\n * ```\n */\nexport function executeActions(\n api: TeachariumWidgetApi,\n actions: ActionConfiguration[],\n): void {\n if (!actions || actions.length === 0) {\n return;\n }\n\n actions.forEach((action) => {\n if (!action.actionType) {\n console.warn(\"Skipping action with no actionType:\", action);\n return;\n }\n\n try {\n api.events.emit({\n type: action.actionType,\n params: action.parameters || {},\n });\n } catch (error) {\n console.error(`Error executing action ${action.actionType}:`, error);\n }\n });\n}\n\n/**\n * Execute a single action\n *\n * @param api - The TeachariumWidgetApi instance\n * @param action - Action configuration to execute\n *\n * @example\n * ```typescript\n * executeAction(api, {\n * actionType: \"nextStep\",\n * parameters: {}\n * });\n * ```\n */\nexport function executeAction(\n api: TeachariumWidgetApi,\n action: ActionConfiguration,\n): void {\n if (!action || !action.actionType) {\n console.warn(\"Cannot execute action with no actionType:\", action);\n return;\n }\n\n try {\n api.events.emit({\n type: action.actionType,\n params: action.parameters || {},\n });\n } catch (error) {\n console.error(`Error executing action ${action.actionType}:`, error);\n }\n}\n","export * from \"./teacharium-widget\";\nexport * from \"./teacharium-widget-api\";\nexport * from \"./teacharium-custom-fields\";\nexport * from \"./standard-layout-options\";\nexport { AudioPlayer } from \"./components/AudioPlayer\";\nexport * from \"./utils/voiceover\";\nexport * from \"./utils/actions\";\n\nexport const hi = \"world\";\n"],"names":["registerWidget","widget","getWidgets","EVENT_SOURCE_PLAYER","EVENT_SOURCE_FOOTER","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","self","source","owner","debugStack","debugTask","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","standardLayoutOptions","LayoutContainer","margin","layoutStyle","jsx","addStandardLayoutOptions","Render","cn","classes","AudioPlayer","audioUrl","className","size","onPlay","onPause","onError","audioRef","isPlaying","setIsPlaying","isLoading","setIsLoading","error","setError","isMuted","setIsMuted","sizeClasses","iconSizes","handlePlay","err","errorMessage","handleToggleMute","audio","handlePlayEvent","handlePauseEvent","handleEndedEvent","handleLoadStart","handleCanPlay","handleError","buttonBaseClasses","VolumeX","Loader2","Pause","Play","Volume2","HASH_ALGORITHM","getVoiceoverHash","content","subtle","data","digest","bytes","hash","index","executeActions","api","actions","action","executeAction","hi"],"mappings":"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","x_google_ignoreList":[2,3,4]}
package/package.json CHANGED
@@ -1,12 +1,20 @@
1
1
  {
2
2
  "name": "@teacharium/widget",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
7
7
  ],
8
8
  "module": "dist/teacharium-widget.es.js",
9
9
  "types": "dist/main.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/main.d.ts",
13
+ "development": "./src/main.ts",
14
+ "import": "./dist/teacharium-widget.es.js",
15
+ "default": "./dist/teacharium-widget.es.js"
16
+ }
17
+ },
10
18
  "scripts": {
11
19
  "dev": "tsc -b && vite build --watch",
12
20
  "build:watch": "tsc -b && vite build --watch",