@intellectif/lk-react 12.0.1 → 14.0.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.
Files changed (165) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +17 -6
  3. package/dist/{WrittenResponse-BgcpEM-e.d.ts → WrittenResponse-C0P34En1.d.ts} +1 -1
  4. package/dist/{WrittenResponse-ByzXYEoW.d.cts → WrittenResponse-pB1ik8hg.d.cts} +1 -1
  5. package/dist/chunk-36FTYJWJ.cjs +869 -0
  6. package/dist/chunk-36FTYJWJ.cjs.map +1 -0
  7. package/dist/chunk-47HHC4GD.js +763 -0
  8. package/dist/chunk-47HHC4GD.js.map +1 -0
  9. package/dist/chunk-62AKSD5Y.js +509 -0
  10. package/dist/chunk-62AKSD5Y.js.map +1 -0
  11. package/dist/{chunk-XKGBD3UK.js → chunk-72UGRIMM.js} +6 -5
  12. package/dist/chunk-72UGRIMM.js.map +1 -0
  13. package/dist/{chunk-FX7VMZHQ.cjs → chunk-B2XQLU2E.cjs} +58 -8
  14. package/dist/chunk-B2XQLU2E.cjs.map +1 -0
  15. package/dist/{chunk-ZFWC4KZC.js → chunk-BO6P723E.js} +26 -31
  16. package/dist/chunk-BO6P723E.js.map +1 -0
  17. package/dist/chunk-BRPEB43C.cjs +13 -0
  18. package/dist/chunk-BRPEB43C.cjs.map +1 -0
  19. package/dist/{chunk-6KMEB7TF.cjs → chunk-BVRUUYYR.cjs} +42 -15
  20. package/dist/chunk-BVRUUYYR.cjs.map +1 -0
  21. package/dist/{chunk-AMGK7DDM.cjs → chunk-D4DQFTA7.cjs} +2 -2
  22. package/dist/chunk-D4DQFTA7.cjs.map +1 -0
  23. package/dist/chunk-D57QZILZ.js +863 -0
  24. package/dist/chunk-D57QZILZ.js.map +1 -0
  25. package/dist/chunk-F4TBCRGI.cjs +518 -0
  26. package/dist/chunk-F4TBCRGI.cjs.map +1 -0
  27. package/dist/{chunk-V6M57YMK.js → chunk-I33FOKZ7.js} +227 -30
  28. package/dist/chunk-I33FOKZ7.js.map +1 -0
  29. package/dist/{chunk-GVBEI5R3.cjs → chunk-J2CDPIRC.cjs} +233 -36
  30. package/dist/chunk-J2CDPIRC.cjs.map +1 -0
  31. package/dist/{chunk-KYOCDRUO.cjs → chunk-LB3FEV7Z.cjs} +97 -2
  32. package/dist/chunk-LB3FEV7Z.cjs.map +1 -0
  33. package/dist/{chunk-QXYAOILF.js → chunk-LGCUOLP6.js} +6 -5
  34. package/dist/chunk-LGCUOLP6.js.map +1 -0
  35. package/dist/{chunk-GWD75Q25.js → chunk-LLXCX5KK.js} +6 -5
  36. package/dist/chunk-LLXCX5KK.js.map +1 -0
  37. package/dist/chunk-MCO52PV5.js +520 -0
  38. package/dist/chunk-MCO52PV5.js.map +1 -0
  39. package/dist/{chunk-G6PUWKQC.cjs → chunk-NDQD3ZRY.cjs} +15 -14
  40. package/dist/chunk-NDQD3ZRY.cjs.map +1 -0
  41. package/dist/chunk-OD65OZIW.cjs +159 -0
  42. package/dist/chunk-OD65OZIW.cjs.map +1 -0
  43. package/dist/chunk-RCMYEWBE.js +11 -0
  44. package/dist/chunk-RCMYEWBE.js.map +1 -0
  45. package/dist/{chunk-KSXEBV2H.cjs → chunk-RRH7ZPXC.cjs} +6 -6
  46. package/dist/{chunk-KSXEBV2H.cjs.map → chunk-RRH7ZPXC.cjs.map} +1 -1
  47. package/dist/{chunk-DQNVAXG6.js → chunk-RXS455MR.js} +2 -2
  48. package/dist/chunk-RXS455MR.js.map +1 -0
  49. package/dist/{chunk-LIHKQEIP.cjs → chunk-SE6WWDVW.cjs} +15 -14
  50. package/dist/chunk-SE6WWDVW.cjs.map +1 -0
  51. package/dist/{chunk-5IH3NRXE.js → chunk-SWY6PWXK.js} +4 -4
  52. package/dist/{chunk-5IH3NRXE.js.map → chunk-SWY6PWXK.js.map} +1 -1
  53. package/dist/chunk-TDJEKXEP.js +212 -0
  54. package/dist/chunk-TDJEKXEP.js.map +1 -0
  55. package/dist/{chunk-NK5EVL5C.cjs → chunk-U3APKQ7P.cjs} +15 -14
  56. package/dist/chunk-U3APKQ7P.cjs.map +1 -0
  57. package/dist/chunk-UDCQTOVU.cjs +523 -0
  58. package/dist/chunk-UDCQTOVU.cjs.map +1 -0
  59. package/dist/{chunk-EWTAMY6L.cjs → chunk-USBANZ7K.cjs} +27 -33
  60. package/dist/chunk-USBANZ7K.cjs.map +1 -0
  61. package/dist/chunk-WTS34S5E.cjs +765 -0
  62. package/dist/chunk-WTS34S5E.cjs.map +1 -0
  63. package/dist/{chunk-2Y6V5E7H.js → chunk-XIBOFTOL.js} +57 -7
  64. package/dist/chunk-XIBOFTOL.js.map +1 -0
  65. package/dist/{chunk-ZFSRMGWO.js → chunk-XUEIUEPI.js} +6 -5
  66. package/dist/chunk-XUEIUEPI.js.map +1 -0
  67. package/dist/{chunk-64AJVB6O.cjs → chunk-YEYKJFEC.cjs} +14 -13
  68. package/dist/chunk-YEYKJFEC.cjs.map +1 -0
  69. package/dist/{chunk-5S2YDMEJ.js → chunk-YMBBM5K7.js} +36 -9
  70. package/dist/chunk-YMBBM5K7.js.map +1 -0
  71. package/dist/chunk-YORQQXGO.js +155 -0
  72. package/dist/chunk-YORQQXGO.js.map +1 -0
  73. package/dist/components/ActivityPreview.cjs +15 -9
  74. package/dist/components/ActivityPreview.d.cts +9 -3
  75. package/dist/components/ActivityPreview.d.ts +9 -3
  76. package/dist/components/ActivityPreview.js +14 -8
  77. package/dist/components/ActivitySequence.cjs +16 -10
  78. package/dist/components/ActivitySequence.d.cts +112 -6
  79. package/dist/components/ActivitySequence.d.ts +112 -6
  80. package/dist/components/ActivitySequence.js +15 -9
  81. package/dist/components/Dictation.cjs +19 -0
  82. package/dist/components/Dictation.cjs.map +1 -0
  83. package/dist/components/Dictation.d.cts +17 -0
  84. package/dist/components/Dictation.d.ts +17 -0
  85. package/dist/components/Dictation.js +10 -0
  86. package/dist/components/Dictation.js.map +1 -0
  87. package/dist/components/FillInTheBlanks.cjs +6 -5
  88. package/dist/components/FillInTheBlanks.d.cts +2 -1
  89. package/dist/components/FillInTheBlanks.d.ts +2 -1
  90. package/dist/components/FillInTheBlanks.js +5 -4
  91. package/dist/components/GapSelect.cjs +6 -5
  92. package/dist/components/GapSelect.d.cts +2 -1
  93. package/dist/components/GapSelect.d.ts +2 -1
  94. package/dist/components/GapSelect.js +5 -4
  95. package/dist/components/MultipleChoice.cjs +6 -5
  96. package/dist/components/MultipleChoice.d.cts +2 -1
  97. package/dist/components/MultipleChoice.d.ts +2 -1
  98. package/dist/components/MultipleChoice.js +5 -4
  99. package/dist/components/PronunciationFeedback.cjs +16 -0
  100. package/dist/components/PronunciationFeedback.cjs.map +1 -0
  101. package/dist/components/PronunciationFeedback.d.cts +64 -0
  102. package/dist/components/PronunciationFeedback.d.ts +64 -0
  103. package/dist/components/PronunciationFeedback.js +7 -0
  104. package/dist/components/PronunciationFeedback.js.map +1 -0
  105. package/dist/components/ReadAloud.cjs +21 -0
  106. package/dist/components/ReadAloud.cjs.map +1 -0
  107. package/dist/components/ReadAloud.d.cts +15 -0
  108. package/dist/components/ReadAloud.d.ts +15 -0
  109. package/dist/components/ReadAloud.js +12 -0
  110. package/dist/components/ReadAloud.js.map +1 -0
  111. package/dist/components/StimulusPanel.cjs +4 -4
  112. package/dist/components/StimulusPanel.d.cts +2 -1
  113. package/dist/components/StimulusPanel.d.ts +2 -1
  114. package/dist/components/StimulusPanel.js +3 -3
  115. package/dist/components/WrittenResponse.cjs +6 -5
  116. package/dist/components/WrittenResponse.d.cts +4 -3
  117. package/dist/components/WrittenResponse.d.ts +4 -3
  118. package/dist/components/WrittenResponse.js +5 -4
  119. package/dist/hooks/useSpeechRecorder.cjs +17 -0
  120. package/dist/hooks/useSpeechRecorder.cjs.map +1 -0
  121. package/dist/hooks/useSpeechRecorder.d.cts +127 -0
  122. package/dist/hooks/useSpeechRecorder.d.ts +127 -0
  123. package/dist/hooks/useSpeechRecorder.js +4 -0
  124. package/dist/hooks/useSpeechRecorder.js.map +1 -0
  125. package/dist/i18n/LkIntlProvider.cjs +7 -7
  126. package/dist/i18n/LkIntlProvider.d.cts +3 -2
  127. package/dist/i18n/LkIntlProvider.d.ts +3 -2
  128. package/dist/i18n/LkIntlProvider.js +1 -1
  129. package/dist/index.cjs +59 -33
  130. package/dist/index.cjs.map +1 -1
  131. package/dist/index.d.cts +7 -2
  132. package/dist/index.d.ts +7 -2
  133. package/dist/index.js +17 -11
  134. package/dist/index.js.map +1 -1
  135. package/dist/machine-CuwKqWXC.d.cts +26 -0
  136. package/dist/machine-CuwKqWXC.d.ts +26 -0
  137. package/dist/{strings-CN7n-BlE.d.ts → strings--ADnHcaA.d.cts} +261 -8
  138. package/dist/{strings-CN7n-BlE.d.cts → strings-CtdSf2St.d.ts} +261 -8
  139. package/dist/theme/ThemeProvider.cjs +6 -6
  140. package/dist/theme/ThemeProvider.d.cts +4 -4
  141. package/dist/theme/ThemeProvider.d.ts +4 -4
  142. package/dist/theme/ThemeProvider.js +1 -1
  143. package/dist/theme/skin.css +1050 -3
  144. package/package.json +43 -3
  145. package/dist/chunk-2Y6V5E7H.js.map +0 -1
  146. package/dist/chunk-5S2YDMEJ.js.map +0 -1
  147. package/dist/chunk-64AJVB6O.cjs.map +0 -1
  148. package/dist/chunk-6KMEB7TF.cjs.map +0 -1
  149. package/dist/chunk-AMGK7DDM.cjs.map +0 -1
  150. package/dist/chunk-CK7Z275S.js +0 -117
  151. package/dist/chunk-CK7Z275S.js.map +0 -1
  152. package/dist/chunk-DQNVAXG6.js.map +0 -1
  153. package/dist/chunk-EWTAMY6L.cjs.map +0 -1
  154. package/dist/chunk-FX7VMZHQ.cjs.map +0 -1
  155. package/dist/chunk-G6PUWKQC.cjs.map +0 -1
  156. package/dist/chunk-GVBEI5R3.cjs.map +0 -1
  157. package/dist/chunk-GWD75Q25.js.map +0 -1
  158. package/dist/chunk-KYOCDRUO.cjs.map +0 -1
  159. package/dist/chunk-LIHKQEIP.cjs.map +0 -1
  160. package/dist/chunk-NK5EVL5C.cjs.map +0 -1
  161. package/dist/chunk-QXYAOILF.js.map +0 -1
  162. package/dist/chunk-V6M57YMK.js.map +0 -1
  163. package/dist/chunk-XKGBD3UK.js.map +0 -1
  164. package/dist/chunk-ZFSRMGWO.js.map +0 -1
  165. package/dist/chunk-ZFWC4KZC.js.map +0 -1
@@ -1,4 +1,74 @@
1
- import { ActivityData, ActivityResult, LearnerResponse, ItemOutcome, MediaPlayLedgerEntry, MediaPlayClaim, MediaPlayGrant, InteractionEvent, ThemeTokens, RedactedActivityData, ItemGroup, SequenceEntry, Stimulus } from '@intellectif/lk-core';
1
+ import { SpeechAssessment, GradeRecord, ReadAloudData, RecordingRef, LearnerResponse, ActivityData, ActivityResult, ItemOutcome, MediaPlayLedgerEntry, MediaPlayClaim, MediaPlayGrant, InteractionEvent, ThemeTokens, RedactedActivityData, ItemGroup, SequenceEntry, ReadAloudDimension, ReadAloudWordState, Stimulus } from '@intellectif/lk-core';
2
+ import { R as RecordedTake, S as SpeechRecorderError } from './machine-CuwKqWXC.cjs';
3
+
4
+ /**
5
+ * What an application's assessor came back with.
6
+ *
7
+ * `code` is a plain `string` and not `SpeechUnscorableCode`: an application's
8
+ * own assessor may refuse a take for a reason the SDK has no name for, and a
9
+ * narrower type would make it unreportable. This component classifies the two
10
+ * codes that mean "nothing was heard" and treats every other one the same way.
11
+ */
12
+ type ReadAloudAssessResult = {
13
+ status: 'graded';
14
+ assessment: SpeechAssessment;
15
+ grade: GradeRecord;
16
+ } | {
17
+ status: 'unscorable';
18
+ code: string;
19
+ assessment?: SpeechAssessment;
20
+ } | {
21
+ status: 'failed';
22
+ retryable: boolean;
23
+ };
24
+ /**
25
+ * How a take reaches the application, and how a judgement comes back.
26
+ *
27
+ * Named `recordingBinding` rather than `recording` because both
28
+ * `ReadAloudData.recording` (the bounds) and `ReadAloudLearnerResponse.recording`
29
+ * (the stored take) already exist: the plain name would read as one of those.
30
+ */
31
+ interface RecordingBinding {
32
+ /**
33
+ * Puts the take in your storage and returns its key. **Required** outside
34
+ * `review`: without it a learner can speak into a control that submits
35
+ * nothing. Settle it — a promise that never does leaves the submit pending
36
+ * for ever.
37
+ */
38
+ upload(take: RecordedTake): Promise<RecordingRef>;
39
+ /**
40
+ * Judges the stored take. `practice` only — an exam never assesses on the
41
+ * client. Optional: a binding without it records, uploads and submits, and
42
+ * the feedback is replaced by a notice.
43
+ */
44
+ assess?(ref: RecordingRef): Promise<ReadAloudAssessResult>;
45
+ /** A playable link to a stored take. `review` only. */
46
+ playbackUrl?(ref: RecordingRef): Promise<string>;
47
+ }
48
+ interface ReadAloudProps extends ActivityProps<ReadAloudData> {
49
+ /** How a take is stored and judged. See {@link RecordingBinding}. */
50
+ recordingBinding?: RecordingBinding;
51
+ /**
52
+ * The evidence behind a stored grade, for `review`. Without it a graded
53
+ * outcome still shows its marks, rebuilt from `outcome.grade.details`; with
54
+ * neither, the score is shown and no marks are.
55
+ */
56
+ assessment?: SpeechAssessment;
57
+ /**
58
+ * Confidence above which a break note is shown, 0..1, forwarded to
59
+ * {@link PronunciationFeedback}. No default — see its own prop.
60
+ */
61
+ breakThreshold?: number;
62
+ /** The same, for the monotone note. */
63
+ monotoneThreshold?: number;
64
+ /**
65
+ * Never called. A read-aloud answer is a key in your storage, and there is
66
+ * none until the take has been uploaded — so there is no intermediate
67
+ * response to report, and reporting the take itself would offer a host a
68
+ * recording it has nowhere to put. `onSubmit` carries the response, once.
69
+ */
70
+ onChange?: (response: LearnerResponse) => void;
71
+ }
2
72
 
3
73
  /**
4
74
  * How an activity is being presented. This is the single switch that decides
@@ -132,8 +202,10 @@ interface ActivityProps<TData extends ActivityData = ActivityData> {
132
202
  * a different one re-declares the language of every SDK string in this
133
203
  * subtree without changing the words.
134
204
  *
135
- * It is NOT `data.locale`, which labels xAPI statements only. Authored
136
- * content in another language belongs on `stimulus.locale`, which
205
+ * It is NOT `data.locale`, which labels xAPI statements and, on a
206
+ * dictation, places the dictation's own words: `<Dictation>` puts it, and
207
+ * the direction it names, on its title, hints, marks and solution. Other
208
+ * authored content in another language belongs on `stimulus.locale`, which
137
209
  * `<StimulusPanel>` puts on the passage alone.
138
210
  */
139
211
  locale?: string;
@@ -189,10 +261,17 @@ declare function asRenderable<TData extends ActivityData>(redacted: RedactedActi
189
261
  * ```
190
262
  *
191
263
  * Pass `renderMode="exam"` (or `"review"`). Redacted data has no answer key, and
192
- * all three built-in activities throw at render in the default `practice` mode
193
- * rather than fail later: `<MultipleChoice>` and `<FillInTheBlanks>` because
194
- * they grade locally, and `<WrittenResponse>` because `practice` still runs its
195
- * local submit path and emits a practice-mode xAPI statement.
264
+ * almost every built-in activity throws at render in the default `practice`
265
+ * mode rather than fail later: `<MultipleChoice>`, `<FillInTheBlanks>`,
266
+ * `<GapSelect>` and `<Dictation>` because they grade locally, and
267
+ * `<WrittenResponse>` because `practice` still runs its local submit path and
268
+ * emits a practice-mode xAPI statement.
269
+ *
270
+ * `<ReadAloud>` is the exception and renders a projection in every mode: a
271
+ * read-aloud item has no answer key to withhold, so `redact()` removes only the
272
+ * authored feedback and leaves the reading, its language and its bounds — which
273
+ * is everything the component puts on screen. It grades nothing locally either;
274
+ * the grade comes back from whatever the application asked to judge the take.
196
275
  */
197
276
  declare function asRenderableSequence(entries: readonly (RedactedActivityData | RedactedItemGroupData)[]): readonly SequenceEntry<RenderableActivity>[];
198
277
  /** Structural shape of a `redactItemGroup()` projection, as it arrives from a server. */
@@ -328,6 +407,47 @@ interface SequenceMediaBudget {
328
407
  /** Translations for the transport chrome. Defaults are English. */
329
408
  strings?: Partial<MediaTransportStrings>;
330
409
  }
410
+ /**
411
+ * Which slot a recording belongs to, stamped on every call the pager makes.
412
+ *
413
+ * Exactly the shape {@link ActivitySequenceProps.onSubmit} already passes, so
414
+ * one identity travels with the answer and with the take that answer points at
415
+ * — and a consumer writes `slotId` in both places rather than reconciling two
416
+ * spellings of "which question was this".
417
+ */
418
+ interface SequenceRecordingSlot {
419
+ /** Identity from `flattenSequence` — stable under shuffling. Store against THIS. */
420
+ slotId: string;
421
+ /** Presented position, which moves under shuffling. */
422
+ index: number;
423
+ activityId: string;
424
+ }
425
+ /**
426
+ * The pager-level half of a read-aloud recording binding: where every take in
427
+ * this sequence is stored, and how a judgement comes back.
428
+ *
429
+ * One prop at both levels, because it is one concept — the media-budget
430
+ * precedent ({@link SequenceMediaBudget} beside {@link MediaBudgetBinding}).
431
+ * The difference is the second argument: a per-slot binding knows which slot it
432
+ * belongs to, so a sequence-level one is told.
433
+ *
434
+ * The SDK records and hands over; it never judges. `assess` is `practice` only
435
+ * and optional — a sequence that only stores takes gets the "assessment is not
436
+ * available" notice rather than a throw — and `playbackUrl` is `review` only.
437
+ * A slot whose activity is not a read-aloud never calls any of them.
438
+ */
439
+ interface SequenceRecordingBinding {
440
+ /**
441
+ * Puts the take in your storage and returns its key. **Required** outside
442
+ * `review`: without it a learner can speak into a control that submits
443
+ * nothing, which the component refuses to render. Settle it.
444
+ */
445
+ upload(take: RecordedTake, slot: SequenceRecordingSlot): Promise<RecordingRef>;
446
+ /** Judges the stored take. `practice` only; an exam never assesses on the client. */
447
+ assess?(ref: RecordingRef, slot: SequenceRecordingSlot): Promise<ReadAloudAssessResult>;
448
+ /** A playable link to a stored take. `review` only. */
449
+ playbackUrl?(ref: RecordingRef, slot: SequenceRecordingSlot): Promise<string>;
450
+ }
331
451
 
332
452
  /**
333
453
  * Every string the SDK's own chrome renders.
@@ -417,6 +537,139 @@ interface LkStrings {
417
537
  questionProgress: (index: number, total: number) => string;
418
538
  /** Shown when no renderer is registered for an activity type. */
419
539
  unsupportedActivity: string;
540
+ /** Accessible name of the box the learner types the recording into. */
541
+ dictationInputLabel: string;
542
+ /** Accessible name of the group holding the recording. */
543
+ dictationRecording: string;
544
+ /** Accessible name of the group holding the slower recording, and its default `alt`. */
545
+ dictationSlowRecording: string;
546
+ /** The progressive-hint button, with how many transcript words are shown so far. */
547
+ dictationRevealNextWord: (revealed: number, total: number) => string;
548
+ /** Hides every revealed hint word again. */
549
+ dictationResetHints: string;
550
+ /** The solution toggle: shows the transcript after the attempt is marked. */
551
+ showSolution: string;
552
+ hideSolution: string;
553
+ /** Accessible name of the revealed transcript. */
554
+ dictationSolutionLabel: string;
555
+ /** Accessible name of the word-by-word marked result. */
556
+ dictationMarksLabel: string;
557
+ /** Tells the learner the marks compare the normalised text, not what they typed. */
558
+ dictationDiffNote: string;
559
+ /**
560
+ * The four sentences a screen reader hears for a marked word — the only
561
+ * channel the marks have for assistive technology; the glyphs and the
562
+ * character diff are decoration.
563
+ */
564
+ dictationWordCorrect: (word: string) => string;
565
+ dictationWordWrong: (word: string, expected: string) => string;
566
+ dictationWordMissing: (expected: string) => string;
567
+ dictationWordExtra: (word: string) => string;
568
+ /** The legend rows; the character-level marks reuse the same four. */
569
+ dictationLegendCorrect: string;
570
+ dictationLegendWrong: string;
571
+ dictationLegendMissing: string;
572
+ dictationLegendExtra: string;
573
+ /** Marked result of an attempt with no words in it once punctuation and spacing are ignored, an empty one included. */
574
+ dictationNothingTyped: string;
575
+ /**
576
+ * Appended to the score announcement, e.g. "4 of 6 words correct." — a whole
577
+ * sentence, because authored feedback may follow it.
578
+ */
579
+ dictationWordsSummary: (correct: number, total: number) => string;
580
+ /** Accessible name of the group holding the model recording. */
581
+ readAloudModelRecording: string;
582
+ /** Accessible name of the group holding the slower model recording, and its default `alt`. */
583
+ readAloudSlowRecording: string;
584
+ /** Starts a take. */
585
+ readAloudRecord: string;
586
+ /** Ends the take in progress. */
587
+ readAloudStop: string;
588
+ /** Throws the take away so the learner can start over. */
589
+ readAloudRerecord: string;
590
+ /** Accessible name of the player for the take the learner just made. */
591
+ readAloudYourRecording: string;
592
+ /**
593
+ * Live progress while recording. Whole seconds, not a `m:ss` clock: a
594
+ * recording is bounded in seconds by the item, and a translation should not
595
+ * have to reimplement a clock to change the word around it.
596
+ *
597
+ * Shown on screen and hidden from assistive technology: it changes every
598
+ * second, and a screen reader that spoke each change would speak into the
599
+ * take being assessed. The two sentences below are what is announced instead.
600
+ */
601
+ readAloudRecordingProgress: (seconds: number, maxSeconds: number) => string;
602
+ /** Announced once when a capture begins. */
603
+ readAloudRecordingStarted: string;
604
+ /**
605
+ * Announced once when a capture ends, by the learner or at its own bound.
606
+ * Carries the length because the progress counter is not announced: a take
607
+ * that reads back as "20 of 20 seconds" is one that stopped itself.
608
+ */
609
+ readAloudRecordingStopped: (seconds: number, maxSeconds: number) => string;
610
+ /** How many takes are left. Called with 0 as well, so the wording is one translation's. */
611
+ readAloudTakesRemaining: (remaining: number, max: number) => string;
612
+ /** `exam` only: hands the item in with no recording at all, deliberately. */
613
+ readAloudSubmitWithoutRecording: string;
614
+ /** Pending, while the take travels to the application's storage. */
615
+ readAloudUploading: string;
616
+ /** The take never reached storage, so nothing was submitted. */
617
+ readAloudUploadFailed: string;
618
+ /** Retries whichever step just failed. */
619
+ readAloudTryAgain: string;
620
+ /** Pending, while the assessor judges the take. */
621
+ readAloudAssessing: string;
622
+ /** The binding stores recordings but judges none, so there is no feedback to show. */
623
+ readAloudAssessmentUnavailable: string;
624
+ /** The assessor found no speech, or too little of it, in the take. */
625
+ readAloudNotHeard: string;
626
+ /** The assessor produced no grade for any other reason. The code itself is never shown. */
627
+ readAloudNotAssessed: string;
628
+ /** The assessment could not be run at all — a failure of the call, not of the reading. */
629
+ readAloudAssessmentFailed: string;
630
+ /**
631
+ * What went wrong with the microphone or with the take. One function rather
632
+ * than five keys, so a translation keeps the five sentences together and the
633
+ * SDK keeps one name for the concept.
634
+ */
635
+ readAloudRecorderError: (reason: SpeechRecorderError) => string;
636
+ /** Accessible name of the whole feedback region. */
637
+ pronunciationFeedbackLabel: string;
638
+ /** Name of one scored dimension, as a learner reads it. */
639
+ pronunciationDimension: (dimension: ReadAloudDimension) => string;
640
+ /** A dimension or a word the engine did not measure. NEVER rendered as 0%. */
641
+ pronunciationNotAssessed: string;
642
+ /** Accessible name of the word-by-word marks. */
643
+ pronunciationWordsLabel: string;
644
+ /** One legend row per marking state — the same four states the marks carry. */
645
+ pronunciationLegend: (state: ReadAloudWordState) => string;
646
+ /**
647
+ * The four sentences a screen reader hears for a marked word: the only
648
+ * channel the marks have for assistive technology, since the glyph and the
649
+ * decoration are both hidden from it.
650
+ */
651
+ pronunciationWordCorrect: (word: string) => string;
652
+ pronunciationWordMispronounced: (word: string) => string;
653
+ pronunciationWordOmitted: (word: string) => string;
654
+ pronunciationWordInserted: (word: string) => string;
655
+ /** Opens one word's syllables, sounds and timings. */
656
+ pronunciationWordDetails: (word: string) => string;
657
+ pronunciationSyllables: string;
658
+ pronunciationPhonemes: string;
659
+ /** A syllable the engine also spelled out, e.g. `('ˈhæ', 'ha')`. */
660
+ pronunciationSyllableSpelling: (syllable: string, grapheme: string) => string;
661
+ /** A sound the engine named no symbol for; `ordinal` is 1-based. */
662
+ pronunciationPhonemePosition: (ordinal: number) => string;
663
+ /** Introduces the sounds the engine thought it heard in a sound's place. */
664
+ pronunciationHeardAs: string;
665
+ /** Plays one word out of the learner's own take. */
666
+ pronunciationPlayWord: (word: string) => string;
667
+ pronunciationBreakUnexpected: string;
668
+ pronunciationBreakMissing: string;
669
+ /** Shown only past the caller's own monotone threshold; the SDK sets none. */
670
+ pronunciationMonotone: string;
671
+ /** Names the alphabet the phoneme symbols are written in. */
672
+ pronunciationIpaNote: string;
420
673
  /**
421
674
  * `<ActivityPreview>`, in place of a draft that still has something missing.
422
675
  * Author-facing, not learner-facing — but an editor is translated too.
@@ -475,4 +728,4 @@ declare const DEFAULT_STRINGS: LkStrings;
475
728
  */
476
729
  declare function mergeStrings(base: LkStrings, override?: LkStringsOverride): LkStrings;
477
730
 
478
- export { type ActivityProps as A, DEFAULT_STRINGS as D, type HtmlSanitizer as H, type LkStrings as L, type MediaBudgetBinding as M, type RenderMode as R, type SequenceMediaBudget as S, type LkStringsOverride as a, type MediaTransportStrings as b, type Renderable as c, type RenderableActivity as d, asRenderable as e, asRenderableSequence as f, mergeStrings as m };
731
+ export { type ActivityProps as A, DEFAULT_STRINGS as D, type HtmlSanitizer as H, type LkStrings as L, type MediaBudgetBinding as M, type ReadAloudAssessResult as R, type SequenceMediaBudget as S, type LkStringsOverride as a, type MediaTransportStrings as b, type ReadAloudProps as c, type RecordingBinding as d, type RenderMode as e, type Renderable as f, type RenderableActivity as g, type SequenceRecordingBinding as h, type SequenceRecordingSlot as i, asRenderable as j, asRenderableSequence as k, mergeStrings as m };
@@ -1,4 +1,74 @@
1
- import { ActivityData, ActivityResult, LearnerResponse, ItemOutcome, MediaPlayLedgerEntry, MediaPlayClaim, MediaPlayGrant, InteractionEvent, ThemeTokens, RedactedActivityData, ItemGroup, SequenceEntry, Stimulus } from '@intellectif/lk-core';
1
+ import { SpeechAssessment, GradeRecord, ReadAloudData, RecordingRef, LearnerResponse, ActivityData, ActivityResult, ItemOutcome, MediaPlayLedgerEntry, MediaPlayClaim, MediaPlayGrant, InteractionEvent, ThemeTokens, RedactedActivityData, ItemGroup, SequenceEntry, ReadAloudDimension, ReadAloudWordState, Stimulus } from '@intellectif/lk-core';
2
+ import { R as RecordedTake, S as SpeechRecorderError } from './machine-CuwKqWXC.js';
3
+
4
+ /**
5
+ * What an application's assessor came back with.
6
+ *
7
+ * `code` is a plain `string` and not `SpeechUnscorableCode`: an application's
8
+ * own assessor may refuse a take for a reason the SDK has no name for, and a
9
+ * narrower type would make it unreportable. This component classifies the two
10
+ * codes that mean "nothing was heard" and treats every other one the same way.
11
+ */
12
+ type ReadAloudAssessResult = {
13
+ status: 'graded';
14
+ assessment: SpeechAssessment;
15
+ grade: GradeRecord;
16
+ } | {
17
+ status: 'unscorable';
18
+ code: string;
19
+ assessment?: SpeechAssessment;
20
+ } | {
21
+ status: 'failed';
22
+ retryable: boolean;
23
+ };
24
+ /**
25
+ * How a take reaches the application, and how a judgement comes back.
26
+ *
27
+ * Named `recordingBinding` rather than `recording` because both
28
+ * `ReadAloudData.recording` (the bounds) and `ReadAloudLearnerResponse.recording`
29
+ * (the stored take) already exist: the plain name would read as one of those.
30
+ */
31
+ interface RecordingBinding {
32
+ /**
33
+ * Puts the take in your storage and returns its key. **Required** outside
34
+ * `review`: without it a learner can speak into a control that submits
35
+ * nothing. Settle it — a promise that never does leaves the submit pending
36
+ * for ever.
37
+ */
38
+ upload(take: RecordedTake): Promise<RecordingRef>;
39
+ /**
40
+ * Judges the stored take. `practice` only — an exam never assesses on the
41
+ * client. Optional: a binding without it records, uploads and submits, and
42
+ * the feedback is replaced by a notice.
43
+ */
44
+ assess?(ref: RecordingRef): Promise<ReadAloudAssessResult>;
45
+ /** A playable link to a stored take. `review` only. */
46
+ playbackUrl?(ref: RecordingRef): Promise<string>;
47
+ }
48
+ interface ReadAloudProps extends ActivityProps<ReadAloudData> {
49
+ /** How a take is stored and judged. See {@link RecordingBinding}. */
50
+ recordingBinding?: RecordingBinding;
51
+ /**
52
+ * The evidence behind a stored grade, for `review`. Without it a graded
53
+ * outcome still shows its marks, rebuilt from `outcome.grade.details`; with
54
+ * neither, the score is shown and no marks are.
55
+ */
56
+ assessment?: SpeechAssessment;
57
+ /**
58
+ * Confidence above which a break note is shown, 0..1, forwarded to
59
+ * {@link PronunciationFeedback}. No default — see its own prop.
60
+ */
61
+ breakThreshold?: number;
62
+ /** The same, for the monotone note. */
63
+ monotoneThreshold?: number;
64
+ /**
65
+ * Never called. A read-aloud answer is a key in your storage, and there is
66
+ * none until the take has been uploaded — so there is no intermediate
67
+ * response to report, and reporting the take itself would offer a host a
68
+ * recording it has nowhere to put. `onSubmit` carries the response, once.
69
+ */
70
+ onChange?: (response: LearnerResponse) => void;
71
+ }
2
72
 
3
73
  /**
4
74
  * How an activity is being presented. This is the single switch that decides
@@ -132,8 +202,10 @@ interface ActivityProps<TData extends ActivityData = ActivityData> {
132
202
  * a different one re-declares the language of every SDK string in this
133
203
  * subtree without changing the words.
134
204
  *
135
- * It is NOT `data.locale`, which labels xAPI statements only. Authored
136
- * content in another language belongs on `stimulus.locale`, which
205
+ * It is NOT `data.locale`, which labels xAPI statements and, on a
206
+ * dictation, places the dictation's own words: `<Dictation>` puts it, and
207
+ * the direction it names, on its title, hints, marks and solution. Other
208
+ * authored content in another language belongs on `stimulus.locale`, which
137
209
  * `<StimulusPanel>` puts on the passage alone.
138
210
  */
139
211
  locale?: string;
@@ -189,10 +261,17 @@ declare function asRenderable<TData extends ActivityData>(redacted: RedactedActi
189
261
  * ```
190
262
  *
191
263
  * Pass `renderMode="exam"` (or `"review"`). Redacted data has no answer key, and
192
- * all three built-in activities throw at render in the default `practice` mode
193
- * rather than fail later: `<MultipleChoice>` and `<FillInTheBlanks>` because
194
- * they grade locally, and `<WrittenResponse>` because `practice` still runs its
195
- * local submit path and emits a practice-mode xAPI statement.
264
+ * almost every built-in activity throws at render in the default `practice`
265
+ * mode rather than fail later: `<MultipleChoice>`, `<FillInTheBlanks>`,
266
+ * `<GapSelect>` and `<Dictation>` because they grade locally, and
267
+ * `<WrittenResponse>` because `practice` still runs its local submit path and
268
+ * emits a practice-mode xAPI statement.
269
+ *
270
+ * `<ReadAloud>` is the exception and renders a projection in every mode: a
271
+ * read-aloud item has no answer key to withhold, so `redact()` removes only the
272
+ * authored feedback and leaves the reading, its language and its bounds — which
273
+ * is everything the component puts on screen. It grades nothing locally either;
274
+ * the grade comes back from whatever the application asked to judge the take.
196
275
  */
197
276
  declare function asRenderableSequence(entries: readonly (RedactedActivityData | RedactedItemGroupData)[]): readonly SequenceEntry<RenderableActivity>[];
198
277
  /** Structural shape of a `redactItemGroup()` projection, as it arrives from a server. */
@@ -328,6 +407,47 @@ interface SequenceMediaBudget {
328
407
  /** Translations for the transport chrome. Defaults are English. */
329
408
  strings?: Partial<MediaTransportStrings>;
330
409
  }
410
+ /**
411
+ * Which slot a recording belongs to, stamped on every call the pager makes.
412
+ *
413
+ * Exactly the shape {@link ActivitySequenceProps.onSubmit} already passes, so
414
+ * one identity travels with the answer and with the take that answer points at
415
+ * — and a consumer writes `slotId` in both places rather than reconciling two
416
+ * spellings of "which question was this".
417
+ */
418
+ interface SequenceRecordingSlot {
419
+ /** Identity from `flattenSequence` — stable under shuffling. Store against THIS. */
420
+ slotId: string;
421
+ /** Presented position, which moves under shuffling. */
422
+ index: number;
423
+ activityId: string;
424
+ }
425
+ /**
426
+ * The pager-level half of a read-aloud recording binding: where every take in
427
+ * this sequence is stored, and how a judgement comes back.
428
+ *
429
+ * One prop at both levels, because it is one concept — the media-budget
430
+ * precedent ({@link SequenceMediaBudget} beside {@link MediaBudgetBinding}).
431
+ * The difference is the second argument: a per-slot binding knows which slot it
432
+ * belongs to, so a sequence-level one is told.
433
+ *
434
+ * The SDK records and hands over; it never judges. `assess` is `practice` only
435
+ * and optional — a sequence that only stores takes gets the "assessment is not
436
+ * available" notice rather than a throw — and `playbackUrl` is `review` only.
437
+ * A slot whose activity is not a read-aloud never calls any of them.
438
+ */
439
+ interface SequenceRecordingBinding {
440
+ /**
441
+ * Puts the take in your storage and returns its key. **Required** outside
442
+ * `review`: without it a learner can speak into a control that submits
443
+ * nothing, which the component refuses to render. Settle it.
444
+ */
445
+ upload(take: RecordedTake, slot: SequenceRecordingSlot): Promise<RecordingRef>;
446
+ /** Judges the stored take. `practice` only; an exam never assesses on the client. */
447
+ assess?(ref: RecordingRef, slot: SequenceRecordingSlot): Promise<ReadAloudAssessResult>;
448
+ /** A playable link to a stored take. `review` only. */
449
+ playbackUrl?(ref: RecordingRef, slot: SequenceRecordingSlot): Promise<string>;
450
+ }
331
451
 
332
452
  /**
333
453
  * Every string the SDK's own chrome renders.
@@ -417,6 +537,139 @@ interface LkStrings {
417
537
  questionProgress: (index: number, total: number) => string;
418
538
  /** Shown when no renderer is registered for an activity type. */
419
539
  unsupportedActivity: string;
540
+ /** Accessible name of the box the learner types the recording into. */
541
+ dictationInputLabel: string;
542
+ /** Accessible name of the group holding the recording. */
543
+ dictationRecording: string;
544
+ /** Accessible name of the group holding the slower recording, and its default `alt`. */
545
+ dictationSlowRecording: string;
546
+ /** The progressive-hint button, with how many transcript words are shown so far. */
547
+ dictationRevealNextWord: (revealed: number, total: number) => string;
548
+ /** Hides every revealed hint word again. */
549
+ dictationResetHints: string;
550
+ /** The solution toggle: shows the transcript after the attempt is marked. */
551
+ showSolution: string;
552
+ hideSolution: string;
553
+ /** Accessible name of the revealed transcript. */
554
+ dictationSolutionLabel: string;
555
+ /** Accessible name of the word-by-word marked result. */
556
+ dictationMarksLabel: string;
557
+ /** Tells the learner the marks compare the normalised text, not what they typed. */
558
+ dictationDiffNote: string;
559
+ /**
560
+ * The four sentences a screen reader hears for a marked word — the only
561
+ * channel the marks have for assistive technology; the glyphs and the
562
+ * character diff are decoration.
563
+ */
564
+ dictationWordCorrect: (word: string) => string;
565
+ dictationWordWrong: (word: string, expected: string) => string;
566
+ dictationWordMissing: (expected: string) => string;
567
+ dictationWordExtra: (word: string) => string;
568
+ /** The legend rows; the character-level marks reuse the same four. */
569
+ dictationLegendCorrect: string;
570
+ dictationLegendWrong: string;
571
+ dictationLegendMissing: string;
572
+ dictationLegendExtra: string;
573
+ /** Marked result of an attempt with no words in it once punctuation and spacing are ignored, an empty one included. */
574
+ dictationNothingTyped: string;
575
+ /**
576
+ * Appended to the score announcement, e.g. "4 of 6 words correct." — a whole
577
+ * sentence, because authored feedback may follow it.
578
+ */
579
+ dictationWordsSummary: (correct: number, total: number) => string;
580
+ /** Accessible name of the group holding the model recording. */
581
+ readAloudModelRecording: string;
582
+ /** Accessible name of the group holding the slower model recording, and its default `alt`. */
583
+ readAloudSlowRecording: string;
584
+ /** Starts a take. */
585
+ readAloudRecord: string;
586
+ /** Ends the take in progress. */
587
+ readAloudStop: string;
588
+ /** Throws the take away so the learner can start over. */
589
+ readAloudRerecord: string;
590
+ /** Accessible name of the player for the take the learner just made. */
591
+ readAloudYourRecording: string;
592
+ /**
593
+ * Live progress while recording. Whole seconds, not a `m:ss` clock: a
594
+ * recording is bounded in seconds by the item, and a translation should not
595
+ * have to reimplement a clock to change the word around it.
596
+ *
597
+ * Shown on screen and hidden from assistive technology: it changes every
598
+ * second, and a screen reader that spoke each change would speak into the
599
+ * take being assessed. The two sentences below are what is announced instead.
600
+ */
601
+ readAloudRecordingProgress: (seconds: number, maxSeconds: number) => string;
602
+ /** Announced once when a capture begins. */
603
+ readAloudRecordingStarted: string;
604
+ /**
605
+ * Announced once when a capture ends, by the learner or at its own bound.
606
+ * Carries the length because the progress counter is not announced: a take
607
+ * that reads back as "20 of 20 seconds" is one that stopped itself.
608
+ */
609
+ readAloudRecordingStopped: (seconds: number, maxSeconds: number) => string;
610
+ /** How many takes are left. Called with 0 as well, so the wording is one translation's. */
611
+ readAloudTakesRemaining: (remaining: number, max: number) => string;
612
+ /** `exam` only: hands the item in with no recording at all, deliberately. */
613
+ readAloudSubmitWithoutRecording: string;
614
+ /** Pending, while the take travels to the application's storage. */
615
+ readAloudUploading: string;
616
+ /** The take never reached storage, so nothing was submitted. */
617
+ readAloudUploadFailed: string;
618
+ /** Retries whichever step just failed. */
619
+ readAloudTryAgain: string;
620
+ /** Pending, while the assessor judges the take. */
621
+ readAloudAssessing: string;
622
+ /** The binding stores recordings but judges none, so there is no feedback to show. */
623
+ readAloudAssessmentUnavailable: string;
624
+ /** The assessor found no speech, or too little of it, in the take. */
625
+ readAloudNotHeard: string;
626
+ /** The assessor produced no grade for any other reason. The code itself is never shown. */
627
+ readAloudNotAssessed: string;
628
+ /** The assessment could not be run at all — a failure of the call, not of the reading. */
629
+ readAloudAssessmentFailed: string;
630
+ /**
631
+ * What went wrong with the microphone or with the take. One function rather
632
+ * than five keys, so a translation keeps the five sentences together and the
633
+ * SDK keeps one name for the concept.
634
+ */
635
+ readAloudRecorderError: (reason: SpeechRecorderError) => string;
636
+ /** Accessible name of the whole feedback region. */
637
+ pronunciationFeedbackLabel: string;
638
+ /** Name of one scored dimension, as a learner reads it. */
639
+ pronunciationDimension: (dimension: ReadAloudDimension) => string;
640
+ /** A dimension or a word the engine did not measure. NEVER rendered as 0%. */
641
+ pronunciationNotAssessed: string;
642
+ /** Accessible name of the word-by-word marks. */
643
+ pronunciationWordsLabel: string;
644
+ /** One legend row per marking state — the same four states the marks carry. */
645
+ pronunciationLegend: (state: ReadAloudWordState) => string;
646
+ /**
647
+ * The four sentences a screen reader hears for a marked word: the only
648
+ * channel the marks have for assistive technology, since the glyph and the
649
+ * decoration are both hidden from it.
650
+ */
651
+ pronunciationWordCorrect: (word: string) => string;
652
+ pronunciationWordMispronounced: (word: string) => string;
653
+ pronunciationWordOmitted: (word: string) => string;
654
+ pronunciationWordInserted: (word: string) => string;
655
+ /** Opens one word's syllables, sounds and timings. */
656
+ pronunciationWordDetails: (word: string) => string;
657
+ pronunciationSyllables: string;
658
+ pronunciationPhonemes: string;
659
+ /** A syllable the engine also spelled out, e.g. `('ˈhæ', 'ha')`. */
660
+ pronunciationSyllableSpelling: (syllable: string, grapheme: string) => string;
661
+ /** A sound the engine named no symbol for; `ordinal` is 1-based. */
662
+ pronunciationPhonemePosition: (ordinal: number) => string;
663
+ /** Introduces the sounds the engine thought it heard in a sound's place. */
664
+ pronunciationHeardAs: string;
665
+ /** Plays one word out of the learner's own take. */
666
+ pronunciationPlayWord: (word: string) => string;
667
+ pronunciationBreakUnexpected: string;
668
+ pronunciationBreakMissing: string;
669
+ /** Shown only past the caller's own monotone threshold; the SDK sets none. */
670
+ pronunciationMonotone: string;
671
+ /** Names the alphabet the phoneme symbols are written in. */
672
+ pronunciationIpaNote: string;
420
673
  /**
421
674
  * `<ActivityPreview>`, in place of a draft that still has something missing.
422
675
  * Author-facing, not learner-facing — but an editor is translated too.
@@ -475,4 +728,4 @@ declare const DEFAULT_STRINGS: LkStrings;
475
728
  */
476
729
  declare function mergeStrings(base: LkStrings, override?: LkStringsOverride): LkStrings;
477
730
 
478
- export { type ActivityProps as A, DEFAULT_STRINGS as D, type HtmlSanitizer as H, type LkStrings as L, type MediaBudgetBinding as M, type RenderMode as R, type SequenceMediaBudget as S, type LkStringsOverride as a, type MediaTransportStrings as b, type Renderable as c, type RenderableActivity as d, asRenderable as e, asRenderableSequence as f, mergeStrings as m };
731
+ export { type ActivityProps as A, DEFAULT_STRINGS as D, type HtmlSanitizer as H, type LkStrings as L, type MediaBudgetBinding as M, type ReadAloudAssessResult as R, type SequenceMediaBudget as S, type LkStringsOverride as a, type MediaTransportStrings as b, type ReadAloudProps as c, type RecordingBinding as d, type RenderMode as e, type Renderable as f, type RenderableActivity as g, type SequenceRecordingBinding as h, type SequenceRecordingSlot as i, asRenderable as j, asRenderableSequence as k, mergeStrings as m };
@@ -1,29 +1,29 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkAMGK7DDM_cjs = require('../chunk-AMGK7DDM.cjs');
4
+ var chunkD4DQFTA7_cjs = require('../chunk-D4DQFTA7.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "ThemeProvider", {
9
9
  enumerable: true,
10
- get: function () { return chunkAMGK7DDM_cjs.ThemeProvider; }
10
+ get: function () { return chunkD4DQFTA7_cjs.ThemeProvider; }
11
11
  });
12
12
  Object.defineProperty(exports, "createTailwindTheme", {
13
13
  enumerable: true,
14
- get: function () { return chunkAMGK7DDM_cjs.createTailwindTheme; }
14
+ get: function () { return chunkD4DQFTA7_cjs.createTailwindTheme; }
15
15
  });
16
16
  Object.defineProperty(exports, "darkTheme", {
17
17
  enumerable: true,
18
- get: function () { return chunkAMGK7DDM_cjs.darkTheme; }
18
+ get: function () { return chunkD4DQFTA7_cjs.darkTheme; }
19
19
  });
20
20
  Object.defineProperty(exports, "defaultTheme", {
21
21
  enumerable: true,
22
- get: function () { return chunkAMGK7DDM_cjs.defaultTheme; }
22
+ get: function () { return chunkD4DQFTA7_cjs.defaultTheme; }
23
23
  });
24
24
  Object.defineProperty(exports, "useTheme", {
25
25
  enumerable: true,
26
- get: function () { return chunkAMGK7DDM_cjs.useTheme; }
26
+ get: function () { return chunkD4DQFTA7_cjs.useTheme; }
27
27
  });
28
28
  //# sourceMappingURL=ThemeProvider.cjs.map
29
29
  //# sourceMappingURL=ThemeProvider.cjs.map
@@ -31,10 +31,10 @@ declare function createTailwindTheme(theme: Partial<ThemeTokens>): TailwindTheme
31
31
 
32
32
  /**
33
33
  * Canonical default theme token values. `defaults.css` mirrors these exactly.
34
- * Palette is a neutral monochrome (ElevenLabs-like) so the SDK is brand-neutral
35
- * out of the box; consumers rebrand via `ThemeProvider`. All colour pairs are
36
- * verified to meet WCAG 2.2 AA: 4.5:1 for normal text, 3:1 for UI / focus ring
37
- * (see theme/__tests__/contrast.test.ts).
34
+ * Palette is a neutral monochrome, deliberately unbranded, so the SDK carries
35
+ * nobody's look out of the box; consumers rebrand via `ThemeProvider`. All
36
+ * colour pairs are verified to meet WCAG 2.2 AA: 4.5:1 for normal text, 3:1 for
37
+ * UI / focus ring (see theme/__tests__/contrast.test.ts).
38
38
  */
39
39
  declare const defaultTheme: ThemeTokens;
40
40