@intellectif/lk-react 18.0.0 → 18.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/CHANGELOG.md +44 -0
- package/README.md +3 -1
- package/dist/{WrittenResponse-B4kY-U0v.d.ts → WrittenResponse-CeHY5u3W.d.ts} +1 -1
- package/dist/{WrittenResponse-Dl3zah22.d.cts → WrittenResponse-DT_Yqbq1.d.cts} +1 -1
- package/dist/ai/useAiHelp.cjs +20 -0
- package/dist/ai/useAiHelp.cjs.map +1 -0
- package/dist/ai/useAiHelp.d.cts +146 -0
- package/dist/ai/useAiHelp.d.ts +146 -0
- package/dist/ai/useAiHelp.js +7 -0
- package/dist/ai/useAiHelp.js.map +1 -0
- package/dist/{chunk-Z5XY66PO.cjs → chunk-3SDCALS3.cjs} +16 -16
- package/dist/chunk-3SDCALS3.cjs.map +1 -0
- package/dist/{chunk-QA42VDTA.cjs → chunk-3SJ7TVL6.cjs} +12 -11
- package/dist/chunk-3SJ7TVL6.cjs.map +1 -0
- package/dist/{chunk-V5BTVGPA.js → chunk-4NERCBOW.js} +4 -3
- package/dist/chunk-4NERCBOW.js.map +1 -0
- package/dist/{chunk-UYQBEPNZ.js → chunk-6NY7OTOO.js} +15 -8
- package/dist/chunk-6NY7OTOO.js.map +1 -0
- package/dist/{chunk-RZ52SEYV.cjs → chunk-7GYAUA56.cjs} +10 -9
- package/dist/chunk-7GYAUA56.cjs.map +1 -0
- package/dist/{chunk-BAKLJKFZ.cjs → chunk-APZ6JFN6.cjs} +4 -29
- package/dist/chunk-APZ6JFN6.cjs.map +1 -0
- package/dist/chunk-BURYHHBM.js +114 -0
- package/dist/chunk-BURYHHBM.js.map +1 -0
- package/dist/{chunk-H63O5HPW.cjs → chunk-CQNKZ435.cjs} +8 -7
- package/dist/chunk-CQNKZ435.cjs.map +1 -0
- package/dist/chunk-EANGKAKG.cjs +32 -0
- package/dist/chunk-EANGKAKG.cjs.map +1 -0
- package/dist/{chunk-YTGRXD23.js → chunk-FEOFX4QW.js} +4 -25
- package/dist/chunk-FEOFX4QW.js.map +1 -0
- package/dist/{chunk-QJW3K6JN.js → chunk-G7AGM2Y7.js} +4 -3
- package/dist/chunk-G7AGM2Y7.js.map +1 -0
- package/dist/{chunk-HZMILQYO.js → chunk-GM4PXDZ2.js} +5 -4
- package/dist/chunk-GM4PXDZ2.js.map +1 -0
- package/dist/{chunk-QHK6PTUR.js → chunk-IKV2I7KT.js} +5 -4
- package/dist/chunk-IKV2I7KT.js.map +1 -0
- package/dist/{chunk-TI23GIFM.cjs → chunk-JH77MAON.cjs} +12 -11
- package/dist/chunk-JH77MAON.cjs.map +1 -0
- package/dist/{chunk-6DTW5T3Z.js → chunk-JSRKES2Z.js} +5 -4
- package/dist/chunk-JSRKES2Z.js.map +1 -0
- package/dist/chunk-JVWLXVYG.cjs +27 -0
- package/dist/chunk-JVWLXVYG.cjs.map +1 -0
- package/dist/{chunk-UQIRDE52.cjs → chunk-LX2X4KC7.cjs} +6 -5
- package/dist/chunk-LX2X4KC7.cjs.map +1 -0
- package/dist/{chunk-KWKB74KL.js → chunk-MKWBLNTD.js} +198 -44
- package/dist/chunk-MKWBLNTD.js.map +1 -0
- package/dist/chunk-NWGQ7JML.cjs +117 -0
- package/dist/chunk-NWGQ7JML.cjs.map +1 -0
- package/dist/{chunk-6RRFH7C4.cjs → chunk-NZM3M5IR.cjs} +39 -54
- package/dist/chunk-NZM3M5IR.cjs.map +1 -0
- package/dist/chunk-PPFVTXGJ.js +27 -0
- package/dist/chunk-PPFVTXGJ.js.map +1 -0
- package/dist/{chunk-3TJSFPO4.cjs → chunk-PROKRNL2.cjs} +26 -19
- package/dist/chunk-PROKRNL2.cjs.map +1 -0
- package/dist/chunk-TEAVPUMX.js +22 -0
- package/dist/chunk-TEAVPUMX.js.map +1 -0
- package/dist/{chunk-ALH6TUX2.js → chunk-THHFIP4N.js} +5 -4
- package/dist/chunk-THHFIP4N.js.map +1 -0
- package/dist/chunk-TL3GVPBO.cjs +234 -0
- package/dist/chunk-TL3GVPBO.cjs.map +1 -0
- package/dist/{chunk-XEGBGKHV.cjs → chunk-TXMP5AOW.cjs} +206 -52
- package/dist/chunk-TXMP5AOW.cjs.map +1 -0
- package/dist/{chunk-KP57YCYQ.js → chunk-UXV3V5NH.js} +23 -35
- package/dist/chunk-UXV3V5NH.js.map +1 -0
- package/dist/{chunk-H3IRVX7J.js → chunk-WSPVQR4O.js} +9 -9
- package/dist/chunk-WSPVQR4O.js.map +1 -0
- package/dist/{chunk-JKMBFHER.cjs → chunk-X4YU6BX7.cjs} +12 -11
- package/dist/chunk-X4YU6BX7.cjs.map +1 -0
- package/dist/chunk-YGJE7RSW.js +231 -0
- package/dist/chunk-YGJE7RSW.js.map +1 -0
- package/dist/components/ActivityPreview.cjs +14 -11
- package/dist/components/ActivityPreview.d.cts +7 -3
- package/dist/components/ActivityPreview.d.ts +7 -3
- package/dist/components/ActivityPreview.js +13 -10
- package/dist/components/ActivitySequence.cjs +14 -11
- package/dist/components/ActivitySequence.d.cts +75 -11
- package/dist/components/ActivitySequence.d.ts +75 -11
- package/dist/components/ActivitySequence.js +13 -10
- package/dist/components/Dictation.cjs +7 -4
- package/dist/components/Dictation.d.cts +1 -1
- package/dist/components/Dictation.d.ts +1 -1
- package/dist/components/Dictation.js +6 -3
- package/dist/components/FillInTheBlanks.cjs +7 -4
- package/dist/components/FillInTheBlanks.d.cts +1 -1
- package/dist/components/FillInTheBlanks.d.ts +1 -1
- package/dist/components/FillInTheBlanks.js +6 -3
- package/dist/components/GapSelect.cjs +7 -4
- package/dist/components/GapSelect.d.cts +1 -1
- package/dist/components/GapSelect.d.ts +1 -1
- package/dist/components/GapSelect.js +6 -3
- package/dist/components/InteractiveVideo.cjs +14 -11
- package/dist/components/InteractiveVideo.d.cts +2 -2
- package/dist/components/InteractiveVideo.d.ts +2 -2
- package/dist/components/InteractiveVideo.js +12 -9
- package/dist/components/MultipleChoice.cjs +7 -4
- package/dist/components/MultipleChoice.d.cts +1 -1
- package/dist/components/MultipleChoice.d.ts +1 -1
- package/dist/components/MultipleChoice.js +6 -3
- package/dist/components/PronunciationFeedback.cjs +4 -3
- package/dist/components/PronunciationFeedback.d.cts +1 -1
- package/dist/components/PronunciationFeedback.d.ts +1 -1
- package/dist/components/PronunciationFeedback.js +3 -2
- package/dist/components/ReadAloud.cjs +6 -4
- package/dist/components/ReadAloud.d.cts +2 -2
- package/dist/components/ReadAloud.d.ts +2 -2
- package/dist/components/ReadAloud.js +5 -3
- package/dist/components/StimulusPanel.d.cts +1 -1
- package/dist/components/StimulusPanel.d.ts +1 -1
- package/dist/components/WrittenResponse.cjs +4 -3
- package/dist/components/WrittenResponse.d.cts +3 -3
- package/dist/components/WrittenResponse.d.ts +3 -3
- package/dist/components/WrittenResponse.js +3 -2
- package/dist/i18n/LkIntlProvider.d.cts +2 -2
- package/dist/i18n/LkIntlProvider.d.ts +2 -2
- package/dist/index.cjs +34 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +15 -12
- package/dist/index.js.map +1 -1
- package/dist/{strings-PCYKWCwd.d.ts → types-BY-4S5Rd.d.ts} +761 -761
- package/dist/{strings-BOPKhnS-.d.cts → types-DtPYG1hh.d.cts} +761 -761
- package/package.json +11 -1
- package/dist/chunk-3TJSFPO4.cjs.map +0 -1
- package/dist/chunk-5F4Q6JT7.cjs +0 -289
- package/dist/chunk-5F4Q6JT7.cjs.map +0 -1
- package/dist/chunk-6DTW5T3Z.js.map +0 -1
- package/dist/chunk-6RRFH7C4.cjs.map +0 -1
- package/dist/chunk-ALH6TUX2.js.map +0 -1
- package/dist/chunk-BAKLJKFZ.cjs.map +0 -1
- package/dist/chunk-GR33G5QM.js +0 -286
- package/dist/chunk-GR33G5QM.js.map +0 -1
- package/dist/chunk-H3IRVX7J.js.map +0 -1
- package/dist/chunk-H63O5HPW.cjs.map +0 -1
- package/dist/chunk-HZMILQYO.js.map +0 -1
- package/dist/chunk-JKMBFHER.cjs.map +0 -1
- package/dist/chunk-KP57YCYQ.js.map +0 -1
- package/dist/chunk-KWKB74KL.js.map +0 -1
- package/dist/chunk-QA42VDTA.cjs.map +0 -1
- package/dist/chunk-QHK6PTUR.js.map +0 -1
- package/dist/chunk-QJW3K6JN.js.map +0 -1
- package/dist/chunk-RZ52SEYV.cjs.map +0 -1
- package/dist/chunk-TI23GIFM.cjs.map +0 -1
- package/dist/chunk-UQIRDE52.cjs.map +0 -1
- package/dist/chunk-UYQBEPNZ.js.map +0 -1
- package/dist/chunk-V5BTVGPA.js.map +0 -1
- package/dist/chunk-XEGBGKHV.cjs.map +0 -1
- package/dist/chunk-YTGRXD23.js.map +0 -1
- package/dist/chunk-Z5XY66PO.cjs.map +0 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkTL3GVPBO_cjs = require('./chunk-TL3GVPBO.cjs');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
|
|
8
|
+
function situation(input) {
|
|
9
|
+
const { data, response, submitted, renderMode, ai, locale, onInteraction } = input;
|
|
10
|
+
return {
|
|
11
|
+
data,
|
|
12
|
+
response,
|
|
13
|
+
submitted,
|
|
14
|
+
renderMode,
|
|
15
|
+
...ai !== void 0 ? { ai } : {},
|
|
16
|
+
...locale !== void 0 ? { locale } : {},
|
|
17
|
+
...onInteraction !== void 0 ? { onInteraction } : {}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function AiExplanation({
|
|
21
|
+
outcome,
|
|
22
|
+
...rest
|
|
23
|
+
}) {
|
|
24
|
+
const s = rest.strings;
|
|
25
|
+
const help = chunkTL3GVPBO_cjs.useAiExplanation({
|
|
26
|
+
...situation(rest),
|
|
27
|
+
...outcome !== void 0 ? { outcome } : {}
|
|
28
|
+
});
|
|
29
|
+
const buttonRef = react.useRef(null);
|
|
30
|
+
const panelRef = react.useRef(null);
|
|
31
|
+
const refocus = react.useRef(false);
|
|
32
|
+
react.useEffect(() => {
|
|
33
|
+
if (help.status === "shown" && refocus.current) {
|
|
34
|
+
refocus.current = false;
|
|
35
|
+
panelRef.current?.focus();
|
|
36
|
+
}
|
|
37
|
+
if (help.status === "unavailable") {
|
|
38
|
+
refocus.current = false;
|
|
39
|
+
}
|
|
40
|
+
}, [help.status]);
|
|
41
|
+
if (!help.offered) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const ask = () => {
|
|
45
|
+
refocus.current = typeof document !== "undefined" && document.activeElement === buttonRef.current;
|
|
46
|
+
help.ask();
|
|
47
|
+
};
|
|
48
|
+
const loading = help.status === "loading";
|
|
49
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lk-ai", "data-state": help.status, children: [
|
|
50
|
+
help.explanation === null ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
51
|
+
"button",
|
|
52
|
+
{
|
|
53
|
+
ref: buttonRef,
|
|
54
|
+
type: "button",
|
|
55
|
+
className: "lk-ai-button",
|
|
56
|
+
"aria-busy": loading || void 0,
|
|
57
|
+
"aria-disabled": loading || void 0,
|
|
58
|
+
onClick: ask,
|
|
59
|
+
children: loading ? s.aiExplaining : s.aiExplain
|
|
60
|
+
}
|
|
61
|
+
) : null,
|
|
62
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { "aria-live": "polite", children: help.explanation !== null ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
63
|
+
"section",
|
|
64
|
+
{
|
|
65
|
+
ref: panelRef,
|
|
66
|
+
className: "lk-ai-panel",
|
|
67
|
+
tabIndex: -1,
|
|
68
|
+
"aria-label": s.aiExplanation,
|
|
69
|
+
children: [
|
|
70
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ai-heading", children: s.aiExplanation }),
|
|
71
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ai-text", children: help.explanation.text }),
|
|
72
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ai-notice", children: s.aiNotice })
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
) : help.status === "unavailable" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ai-unavailable", children: s.aiExplanationUnavailable }) : null })
|
|
76
|
+
] });
|
|
77
|
+
}
|
|
78
|
+
function AiHints({ disabled, ...rest }) {
|
|
79
|
+
const s = rest.strings;
|
|
80
|
+
const help = chunkTL3GVPBO_cjs.useAiHints({ ...situation(rest), disabled });
|
|
81
|
+
const used = help.used;
|
|
82
|
+
if (rest.ai?.hint === void 0 || !help.offered && used === 0) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
const loading = help.status === "loading";
|
|
86
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lk-ai lk-ai-hint-area", "data-state": help.status, children: [
|
|
87
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { "aria-live": "polite", children: [
|
|
88
|
+
used > 0 ? /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "lk-ai-hints", "aria-label": s.aiHints, children: help.hints.map((hint, index) => (
|
|
89
|
+
// Hints are only ever appended, so a position is a stable key.
|
|
90
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: an append-only list
|
|
91
|
+
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: "lk-ai-hint", children: [
|
|
92
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "lk-ai-hint-label", children: s.aiHintNumber(index + 1) }),
|
|
93
|
+
" ",
|
|
94
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "lk-ai-text", children: hint.text })
|
|
95
|
+
] }, index)
|
|
96
|
+
)) }) : null,
|
|
97
|
+
help.status === "unavailable" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ai-unavailable", children: s.aiHintUnavailable }) : null
|
|
98
|
+
] }),
|
|
99
|
+
help.offered ? used < help.limit ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
100
|
+
"button",
|
|
101
|
+
{
|
|
102
|
+
type: "button",
|
|
103
|
+
className: "lk-ai-button",
|
|
104
|
+
"aria-busy": loading || void 0,
|
|
105
|
+
"aria-disabled": loading || void 0,
|
|
106
|
+
onClick: help.ask,
|
|
107
|
+
children: loading ? s.aiHintLoading : s.aiHint
|
|
108
|
+
}
|
|
109
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ai-note", children: s.aiNoMoreHints }) : null,
|
|
110
|
+
used > 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ai-notice", children: s.aiNotice }) : null
|
|
111
|
+
] });
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
exports.AiExplanation = AiExplanation;
|
|
115
|
+
exports.AiHints = AiHints;
|
|
116
|
+
//# sourceMappingURL=chunk-NWGQ7JML.cjs.map
|
|
117
|
+
//# sourceMappingURL=chunk-NWGQ7JML.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/shared/AiHelp.tsx"],"names":["useAiExplanation","useRef","useEffect","jsx","jsxs","useAiHints"],"mappings":"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","file":"chunk-NWGQ7JML.cjs","sourcesContent":["'use client';\n\nimport type { InteractionEvent, ItemOutcome, LearnerResponse } from '@intellectif/lk-core';\nimport { useEffect, useRef } from 'react';\nimport type { LearnerAi } from '../../ai/LkAiProvider.js';\nimport { useAiExplanation, useAiHints } from '../../ai/useAiHelp.js';\nimport type { LkStrings } from '../../i18n/strings.js';\nimport type { RenderableActivity, RenderMode } from '../types.js';\n\ninterface Situation {\n ai: LearnerAi | undefined;\n data: RenderableActivity;\n renderMode: RenderMode;\n submitted: boolean;\n /** The learner's answer as it stands: submitted, restored, or being written. */\n response: LearnerResponse;\n /** The component's `locale`, the default language for what is written. */\n locale: string | undefined;\n onInteraction: ((event: InteractionEvent) => void) | undefined;\n strings: LkStrings;\n}\n\n/** What the hooks take, from what a component holds: the optional half, without `undefined` values. */\nfunction situation(input: Situation): {\n data: RenderableActivity;\n response: LearnerResponse;\n submitted: boolean;\n renderMode: RenderMode;\n ai?: LearnerAi;\n locale?: string;\n onInteraction?: (event: InteractionEvent) => void;\n} {\n const { data, response, submitted, renderMode, ai, locale, onInteraction } = input;\n return {\n data,\n response,\n submitted,\n renderMode,\n ...(ai !== undefined ? { ai } : {}),\n ...(locale !== undefined ? { locale } : {}),\n ...(onInteraction !== undefined ? { onInteraction } : {}),\n };\n}\n\n/**\n * \"Explain my answer\": the SDK's own surface over {@link useAiExplanation} — a\n * button, the explanation with who wrote it, and \"not available\" when a call\n * fails or its answer is refused.\n *\n * Nothing renders without a port, or where the rules say no explanation.\n */\nexport function AiExplanation({\n outcome,\n ...rest\n}: Situation & { outcome: ItemOutcome | undefined }) {\n const s = rest.strings;\n const help = useAiExplanation({\n ...situation(rest),\n ...(outcome !== undefined ? { outcome } : {}),\n });\n const buttonRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLElement>(null);\n const refocus = useRef(false);\n\n // The button that asked goes away when the explanation arrives; focus moves\n // to what it asked for rather than falling to the page.\n useEffect(() => {\n if (help.status === 'shown' && refocus.current) {\n refocus.current = false;\n panelRef.current?.focus();\n }\n if (help.status === 'unavailable') {\n refocus.current = false;\n }\n }, [help.status]);\n\n if (!help.offered) {\n return null;\n }\n\n const ask = (): void => {\n refocus.current =\n typeof document !== 'undefined' && document.activeElement === buttonRef.current;\n help.ask();\n };\n\n const loading = help.status === 'loading';\n return (\n <div className=\"lk-ai\" data-state={help.status}>\n {help.explanation === null ? (\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"lk-ai-button\"\n aria-busy={loading || undefined}\n aria-disabled={loading || undefined}\n onClick={ask}\n >\n {loading ? s.aiExplaining : s.aiExplain}\n </button>\n ) : null}\n <div aria-live=\"polite\">\n {help.explanation !== null ? (\n <section\n ref={panelRef}\n className=\"lk-ai-panel\"\n tabIndex={-1}\n aria-label={s.aiExplanation}\n >\n <p className=\"lk-ai-heading\">{s.aiExplanation}</p>\n <p className=\"lk-ai-text\">{help.explanation.text}</p>\n <p className=\"lk-ai-notice\">{s.aiNotice}</p>\n </section>\n ) : help.status === 'unavailable' ? (\n <p className=\"lk-ai-unavailable\">{s.aiExplanationUnavailable}</p>\n ) : null}\n </div>\n </div>\n );\n}\n\n/**\n * \"Get a hint\": the SDK's own surface over {@link useAiHints} — a button, the\n * hints given so far as a numbered list, and who wrote them.\n *\n * The hints stay listed after submit, so the learner can see what they were\n * given, but no more can be asked for. Another question starts with none.\n */\nexport function AiHints({ disabled, ...rest }: Situation & { disabled: boolean }) {\n const s = rest.strings;\n const help = useAiHints({ ...situation(rest), disabled });\n const used = help.used;\n\n if (rest.ai?.hint === undefined || (!help.offered && used === 0)) {\n return null;\n }\n\n const loading = help.status === 'loading';\n return (\n <div className=\"lk-ai lk-ai-hint-area\" data-state={help.status}>\n <div aria-live=\"polite\">\n {used > 0 ? (\n <ol className=\"lk-ai-hints\" aria-label={s.aiHints}>\n {help.hints.map((hint, index) => (\n // Hints are only ever appended, so a position is a stable key.\n // biome-ignore lint/suspicious/noArrayIndexKey: an append-only list\n <li key={index} className=\"lk-ai-hint\">\n <span className=\"lk-ai-hint-label\">{s.aiHintNumber(index + 1)}</span>{' '}\n <span className=\"lk-ai-text\">{hint.text}</span>\n </li>\n ))}\n </ol>\n ) : null}\n {help.status === 'unavailable' ? (\n <p className=\"lk-ai-unavailable\">{s.aiHintUnavailable}</p>\n ) : null}\n </div>\n {help.offered ? (\n used < help.limit ? (\n <button\n type=\"button\"\n className=\"lk-ai-button\"\n aria-busy={loading || undefined}\n aria-disabled={loading || undefined}\n onClick={help.ask}\n >\n {loading ? s.aiHintLoading : s.aiHint}\n </button>\n ) : (\n <p className=\"lk-ai-note\">{s.aiNoMoreHints}</p>\n )\n ) : null}\n {used > 0 ? <p className=\"lk-ai-notice\">{s.aiNotice}</p> : null}\n </div>\n );\n}\n"]}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkLX2X4KC7_cjs = require('./chunk-LX2X4KC7.cjs');
|
|
5
5
|
var chunkUDCQTOVU_cjs = require('./chunk-UDCQTOVU.cjs');
|
|
6
6
|
var chunkOD65OZIW_cjs = require('./chunk-OD65OZIW.cjs');
|
|
7
|
+
var chunkJVWLXVYG_cjs = require('./chunk-JVWLXVYG.cjs');
|
|
7
8
|
var chunkBRPEB43C_cjs = require('./chunk-BRPEB43C.cjs');
|
|
8
|
-
var
|
|
9
|
+
var chunkAPZ6JFN6_cjs = require('./chunk-APZ6JFN6.cjs');
|
|
10
|
+
var chunkEANGKAKG_cjs = require('./chunk-EANGKAKG.cjs');
|
|
9
11
|
var chunkL7WY5YFQ_cjs = require('./chunk-L7WY5YFQ.cjs');
|
|
10
12
|
var chunkXOR4MPEN_cjs = require('./chunk-XOR4MPEN.cjs');
|
|
11
13
|
var chunkAHGB5HH6_cjs = require('./chunk-AHGB5HH6.cjs');
|
|
@@ -42,27 +44,13 @@ function stopCaptureGroup(group) {
|
|
|
42
44
|
stop();
|
|
43
45
|
}
|
|
44
46
|
}
|
|
45
|
-
var SequenceSlotContext = react.createContext(null);
|
|
46
|
-
var lastTake = 0;
|
|
47
|
-
function mintTake() {
|
|
48
|
-
lastTake += 1;
|
|
49
|
-
return lastTake;
|
|
50
|
-
}
|
|
51
|
-
var takes = /* @__PURE__ */ new WeakMap();
|
|
52
|
-
function stampTake(value, take) {
|
|
53
|
-
takes.set(value, take);
|
|
54
|
-
return value;
|
|
55
|
-
}
|
|
56
|
-
function takeOf(value) {
|
|
57
|
-
return typeof value === "object" && value !== null ? takes.get(value) : void 0;
|
|
58
|
-
}
|
|
59
47
|
var isNumber = (value) => typeof value === "number" && Number.isFinite(value);
|
|
60
48
|
function readRecordingBounds(recording) {
|
|
61
49
|
const bounds = typeof recording === "object" && recording !== null ? recording : {};
|
|
62
50
|
const maxSeconds = isNumber(bounds.maxSeconds) && bounds.maxSeconds > 0 ? Math.min(bounds.maxSeconds, lkCore.READ_ALOUD_MAX_SECONDS) : lkCore.READ_ALOUD_MAX_SECONDS;
|
|
63
51
|
const minSeconds = isNumber(bounds.minSeconds) && bounds.minSeconds >= 0 && bounds.minSeconds < maxSeconds ? bounds.minSeconds : void 0;
|
|
64
|
-
const
|
|
65
|
-
const maxTakes =
|
|
52
|
+
const takes = bounds.maxTakes;
|
|
53
|
+
const maxTakes = takes === void 0 || takes === null ? void 0 : isNumber(takes) ? Math.min(Math.max(1, Math.floor(takes)), lkCore.READ_ALOUD_MAX_TAKES) : lkCore.READ_ALOUD_MAX_TAKES;
|
|
66
54
|
return { maxSeconds, minSeconds, maxTakes };
|
|
67
55
|
}
|
|
68
56
|
function secondsWithin(milliseconds, maxSeconds, rounding) {
|
|
@@ -140,8 +128,8 @@ function marksFromDetails(details) {
|
|
|
140
128
|
function recordingOf(response) {
|
|
141
129
|
return response !== void 0 && response.type === "read-aloud" ? response.recording : null;
|
|
142
130
|
}
|
|
143
|
-
function responseOf(recording,
|
|
144
|
-
return { type: "read-aloud", recording, ...
|
|
131
|
+
function responseOf(recording, takes) {
|
|
132
|
+
return { type: "read-aloud", recording, ...takes > 0 ? { takes } : {} };
|
|
145
133
|
}
|
|
146
134
|
function unscorableMessage(code, s) {
|
|
147
135
|
return code === "no_speech" || code === "insufficient_voiced_time" ? s.readAloudNotHeard : s.readAloudNotAssessed;
|
|
@@ -172,7 +160,7 @@ function OutcomeSummary({
|
|
|
172
160
|
"data-status": reading.status,
|
|
173
161
|
"data-passed": String(reading.grade.passed),
|
|
174
162
|
children: scoreShown ? null : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
175
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ra-grade", children: s.scoreAnnouncement(
|
|
163
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ra-grade", children: s.scoreAnnouncement(chunkLX2X4KC7_cjs.percentOfGrade(reading.grade), reading.grade.passed) }),
|
|
176
164
|
reading.grade.feedback ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ra-grade-feedback", dir: "auto", children: reading.grade.feedback }) : null
|
|
177
165
|
] })
|
|
178
166
|
}
|
|
@@ -225,10 +213,10 @@ function ReadAloud({
|
|
|
225
213
|
const isExam = renderMode === "exam";
|
|
226
214
|
const isReview = renderMode === "review";
|
|
227
215
|
const s = chunkAHGB5HH6_cjs.useLkStrings(strings);
|
|
228
|
-
const slot = react.useContext(SequenceSlotContext);
|
|
216
|
+
const slot = react.useContext(chunkJVWLXVYG_cjs.SequenceSlotContext);
|
|
229
217
|
const captureGroup = slot?.captureGroup;
|
|
230
218
|
const devError = react.useMemo(() => {
|
|
231
|
-
if (!
|
|
219
|
+
if (!chunkEANGKAKG_cjs.isDevelopment()) {
|
|
232
220
|
return null;
|
|
233
221
|
}
|
|
234
222
|
if (data.redacted === true) {
|
|
@@ -419,7 +407,7 @@ function ReadAloud({
|
|
|
419
407
|
[data, s.readAloudSlowRecording]
|
|
420
408
|
);
|
|
421
409
|
const takeAudio = isReview ? playbackUrl : takeUrl;
|
|
422
|
-
const playback =
|
|
410
|
+
const playback = chunkLX2X4KC7_cjs.usePlaybackRefusal(takeAudio);
|
|
423
411
|
const submitRef = react.useRef(null);
|
|
424
412
|
if (devError) {
|
|
425
413
|
throw devError;
|
|
@@ -444,14 +432,14 @@ function ReadAloud({
|
|
|
444
432
|
const runAssess = async (ref, current, take2) => {
|
|
445
433
|
const assess = bindingRef.current?.assess;
|
|
446
434
|
const durationMs = current?.durationMs ?? 0;
|
|
447
|
-
const
|
|
435
|
+
const takes = recorder.takesUsed;
|
|
448
436
|
const run = runRef.current;
|
|
449
437
|
if (assess === void 0) {
|
|
450
438
|
setPhase({ kind: "unassessed", take: take2 });
|
|
451
439
|
return;
|
|
452
440
|
}
|
|
453
441
|
setPhase({ kind: "assessing", take: take2 });
|
|
454
|
-
fire("assessment-requested", { takes
|
|
442
|
+
fire("assessment-requested", { takes, durationMs });
|
|
455
443
|
let answer;
|
|
456
444
|
try {
|
|
457
445
|
answer = await assess(ref);
|
|
@@ -460,22 +448,22 @@ function ReadAloud({
|
|
|
460
448
|
return;
|
|
461
449
|
}
|
|
462
450
|
raise({ kind: "assess-failed", take: take2, retryable: true });
|
|
463
|
-
fire("assessment-failed", { takes
|
|
451
|
+
fire("assessment-failed", { takes, durationMs, retryable: true });
|
|
464
452
|
return;
|
|
465
453
|
}
|
|
466
454
|
if (run !== runRef.current) {
|
|
467
455
|
return;
|
|
468
456
|
}
|
|
469
|
-
const result =
|
|
457
|
+
const result = chunkLX2X4KC7_cjs.readAssessResult(answer);
|
|
470
458
|
if (result.status === "failed") {
|
|
471
459
|
raise({ kind: "assess-failed", take: take2, retryable: result.retryable });
|
|
472
|
-
fire("assessment-failed", { takes
|
|
460
|
+
fire("assessment-failed", { takes, durationMs, retryable: result.retryable });
|
|
473
461
|
return;
|
|
474
462
|
}
|
|
475
463
|
if (result.status === "unscorable") {
|
|
476
464
|
setPhase({ kind: "unscorable", take: take2, code: result.code });
|
|
477
465
|
fire("assessment-failed", {
|
|
478
|
-
takes
|
|
466
|
+
takes,
|
|
479
467
|
durationMs,
|
|
480
468
|
retryable: true,
|
|
481
469
|
...result.code !== void 0 ? { code: result.code } : {}
|
|
@@ -486,20 +474,20 @@ function ReadAloud({
|
|
|
486
474
|
setPhase({ kind: "graded", take: take2, assessment: result.assessment, grade: result.grade });
|
|
487
475
|
const grade = result.grade;
|
|
488
476
|
if (grade === null) {
|
|
489
|
-
fire("assessment-failed", { takes
|
|
477
|
+
fire("assessment-failed", { takes, durationMs, retryable: true });
|
|
490
478
|
return;
|
|
491
479
|
}
|
|
492
480
|
onComplete?.(
|
|
493
|
-
stampTake(
|
|
481
|
+
chunkJVWLXVYG_cjs.stampTake(
|
|
494
482
|
{
|
|
495
483
|
score: grade.score,
|
|
496
484
|
maxScore: grade.maxScore,
|
|
497
485
|
passed: grade.passed,
|
|
498
486
|
timeSpent,
|
|
499
487
|
xapiStatement: lkCore.xAPIBuilder.buildAnsweredStatement({
|
|
500
|
-
actor:
|
|
488
|
+
actor: chunkEANGKAKG_cjs.ANONYMOUS_ACTOR,
|
|
501
489
|
object: {
|
|
502
|
-
id:
|
|
490
|
+
id: chunkEANGKAKG_cjs.objectIdFor(data.id),
|
|
503
491
|
name: { [data.locale ?? "en-US"]: data.title },
|
|
504
492
|
...lkCore.xapiDefinitionFor(data)
|
|
505
493
|
},
|
|
@@ -509,7 +497,7 @@ function ReadAloud({
|
|
|
509
497
|
// optional, and an empty list is the honest reading of "no per-word
|
|
510
498
|
// marks were stored" — never a mark of its own.
|
|
511
499
|
scoringResult: {
|
|
512
|
-
score:
|
|
500
|
+
score: chunkLX2X4KC7_cjs.fractionOfGrade(grade),
|
|
513
501
|
maxScore: 1,
|
|
514
502
|
passed: grade.passed,
|
|
515
503
|
feedback: grade.feedback,
|
|
@@ -527,9 +515,9 @@ function ReadAloud({
|
|
|
527
515
|
return;
|
|
528
516
|
}
|
|
529
517
|
submittingRef.current = true;
|
|
530
|
-
const
|
|
518
|
+
const takes = recorder.takesUsed;
|
|
531
519
|
const run = runRef.current;
|
|
532
|
-
const take2 = mintTake();
|
|
520
|
+
const take2 = chunkJVWLXVYG_cjs.mintTake();
|
|
533
521
|
beginTakeReport(take2);
|
|
534
522
|
try {
|
|
535
523
|
let ref = null;
|
|
@@ -543,7 +531,7 @@ function ReadAloud({
|
|
|
543
531
|
}
|
|
544
532
|
raise({ kind: "upload-failed", take: take2 });
|
|
545
533
|
fire("recording-upload-failed", {
|
|
546
|
-
takes
|
|
534
|
+
takes,
|
|
547
535
|
durationMs: current.durationMs,
|
|
548
536
|
retryable: true
|
|
549
537
|
});
|
|
@@ -553,10 +541,10 @@ function ReadAloud({
|
|
|
553
541
|
return;
|
|
554
542
|
}
|
|
555
543
|
setUploaded(ref);
|
|
556
|
-
fire("recording-uploaded", { takes
|
|
544
|
+
fire("recording-uploaded", { takes, durationMs: current.durationMs });
|
|
557
545
|
}
|
|
558
|
-
onSubmit?.(stampTake(responseOf(ref,
|
|
559
|
-
fire("submitted", { takes
|
|
546
|
+
onSubmit?.(chunkJVWLXVYG_cjs.stampTake(responseOf(ref, takes), take2));
|
|
547
|
+
fire("submitted", { takes, durationMs: current?.durationMs ?? 0 });
|
|
560
548
|
if (isExam || ref === null) {
|
|
561
549
|
complete();
|
|
562
550
|
setPhase({ kind: "submitted", take: take2 });
|
|
@@ -603,8 +591,8 @@ function ReadAloud({
|
|
|
603
591
|
};
|
|
604
592
|
const contentLang = typeof data.locale === "string" ? data.locale : void 0;
|
|
605
593
|
const contentDir = chunkOD65OZIW_cjs.localeDirectionOf(data.locale);
|
|
606
|
-
const outcomeReading = react.useMemo(() =>
|
|
607
|
-
const keptEvidence = react.useMemo(() =>
|
|
594
|
+
const outcomeReading = react.useMemo(() => chunkLX2X4KC7_cjs.readOutcome(outcome), [outcome]);
|
|
595
|
+
const keptEvidence = react.useMemo(() => chunkLX2X4KC7_cjs.readEvidence(assessment), [assessment]);
|
|
608
596
|
const storedGrade = outcomeReading?.kind === "graded" && outcomeReading.status === "graded" ? outcomeReading.grade : null;
|
|
609
597
|
const storedMarks = react.useMemo(
|
|
610
598
|
() => isReview && keptEvidence === null && storedGrade?.details !== void 0 ? marksFromDetails(storedGrade.details) : null,
|
|
@@ -646,7 +634,7 @@ function ReadAloud({
|
|
|
646
634
|
case "graded": {
|
|
647
635
|
const grade = phase.grade;
|
|
648
636
|
return grade === null ? { text: `${s.answerSubmitted} ${s.couldNotBeGraded}`, feedback: null } : {
|
|
649
|
-
text: `${s.answerSubmitted} ${s.scoreAnnouncement(
|
|
637
|
+
text: `${s.answerSubmitted} ${s.scoreAnnouncement(chunkLX2X4KC7_cjs.percentOfGrade(grade), grade.passed)}`,
|
|
650
638
|
feedback: grade.feedback
|
|
651
639
|
};
|
|
652
640
|
}
|
|
@@ -829,7 +817,7 @@ function ReadAloud({
|
|
|
829
817
|
busy ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ra-pending", role: "status", "aria-busy": "true", children: phase.kind === "uploading" ? s.readAloudUploading : s.readAloudAssessing }) : null,
|
|
830
818
|
alertText !== null ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "lk-ra-alert", role: "alert", children: alertText }, errorNonce) : null,
|
|
831
819
|
feedbackAssessment !== null ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
832
|
-
|
|
820
|
+
chunkLX2X4KC7_cjs.PronunciationFeedback,
|
|
833
821
|
{
|
|
834
822
|
data: { referenceText: data.referenceText, locale: data.locale },
|
|
835
823
|
assessment: feedbackAssessment,
|
|
@@ -843,14 +831,14 @@ function ReadAloud({
|
|
|
843
831
|
) : null,
|
|
844
832
|
storedMarks !== null ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lk-ra-marks", children: [
|
|
845
833
|
/* @__PURE__ */ jsxRuntime.jsx("ol", { className: "lk-ra-words", "aria-label": s.pronunciationWordsLabel, dir: contentDir, children: storedMarks.map((entry, index) => {
|
|
846
|
-
const sentence =
|
|
834
|
+
const sentence = chunkLX2X4KC7_cjs.markSentence(entry, s);
|
|
847
835
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
848
836
|
"li",
|
|
849
837
|
{
|
|
850
838
|
className: "lk-ra-word",
|
|
851
839
|
"data-state": entry.state,
|
|
852
840
|
children: [
|
|
853
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "lk-visually-hidden", style:
|
|
841
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "lk-visually-hidden", style: chunkLX2X4KC7_cjs.VISUALLY_HIDDEN, children: sentence }),
|
|
854
842
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
855
843
|
"span",
|
|
856
844
|
{
|
|
@@ -874,7 +862,7 @@ function ReadAloud({
|
|
|
874
862
|
// but a live region is the only thing that TELLS a screen-reader
|
|
875
863
|
// learner a grade arrived, since nothing takes focus. Clipped rather
|
|
876
864
|
// than `display: none`, which would stop it being announced at all.
|
|
877
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "lk-visually-hidden", style:
|
|
865
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "lk-visually-hidden", style: chunkLX2X4KC7_cjs.VISUALLY_HIDDEN, children: /* @__PURE__ */ jsxRuntime.jsx(AnnouncementText, { announcement }) })
|
|
878
866
|
) : /* @__PURE__ */ jsxRuntime.jsx(AnnouncementText, { announcement }) })
|
|
879
867
|
]
|
|
880
868
|
}
|
|
@@ -882,13 +870,10 @@ function ReadAloud({
|
|
|
882
870
|
}
|
|
883
871
|
function ReadAloud2(props) {
|
|
884
872
|
const strings = chunkAHGB5HH6_cjs.useLkStrings(props.strings);
|
|
885
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
873
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkAPZ6JFN6_cjs.ActivityErrorBoundary, { activityTitle: props.data?.title, strings, children: /* @__PURE__ */ jsxRuntime.jsx(ReadAloud, { ...props }) });
|
|
886
874
|
}
|
|
887
875
|
|
|
888
876
|
exports.ReadAloud = ReadAloud2;
|
|
889
|
-
exports.SequenceSlotContext = SequenceSlotContext;
|
|
890
|
-
exports.mintTake = mintTake;
|
|
891
877
|
exports.stopCaptureGroup = stopCaptureGroup;
|
|
892
|
-
|
|
893
|
-
//# sourceMappingURL=chunk-
|
|
894
|
-
//# sourceMappingURL=chunk-6RRFH7C4.cjs.map
|
|
878
|
+
//# sourceMappingURL=chunk-NZM3M5IR.cjs.map
|
|
879
|
+
//# sourceMappingURL=chunk-NZM3M5IR.cjs.map
|