@sapia-ai/chatbot-v3 1.4.1 → 1.5.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 (37) hide show
  1. package/dist/{EmbeddedVideoPlayer-G554aRrZ.js → EmbeddedVideoPlayer-Dn-boxdp.js} +14 -14
  2. package/dist/{Preview-CSE0hI6e.js → Preview-CtMz5fNh.js} +3 -3
  3. package/dist/api/client.d.ts +2 -1
  4. package/dist/api/types/responses.d.ts +15 -0
  5. package/dist/api.js +2 -2
  6. package/dist/{client-DG-5x86F.js → client-DfRBtXIE.js} +34 -28
  7. package/dist/core/interview/engine.d.ts +12 -3
  8. package/dist/core/persistence.d.ts +4 -0
  9. package/dist/core/store.d.ts +6 -1
  10. package/dist/{dist-DsGdVwdi.js → dist-Cl2Oi3Sl.js} +3 -3
  11. package/dist/{fix-webm-duration-Bie2OG-n.js → fix-webm-duration-CVQSf7rp.js} +2 -2
  12. package/dist/index.js +5454 -5248
  13. package/dist/{jsx-runtime-B5vw3nIj.js → jsx-runtime-CdNykazB.js} +2 -2
  14. package/dist/react/AnswerInput.d.ts +6 -1
  15. package/dist/react/bubbleViewModel.d.ts +21 -1
  16. package/dist/react/strings.d.ts +4 -0
  17. package/dist/react/useVideoRecorder.d.ts +25 -4
  18. package/dist/{react-Dd6J2Pyv.js → react-78ZA32q8.js} +3 -3
  19. package/dist/{react-SKFkpgRr.js → react-BC7MhdYE.js} +3 -3
  20. package/dist/{react-CN-F_7qV.js → react-BIgNJUOD.js} +3 -3
  21. package/dist/{react-B46N_vb_.js → react-BKViU2cv.js} +3 -3
  22. package/dist/{react-abEVBgXB.js → react-BSaO3Elx.js} +3 -3
  23. package/dist/{react-DHdgNnK2.js → react-D4Z0N-x7.js} +2 -2
  24. package/dist/{react-T5LsuM9r.js → react-DEJ3NRa3.js} +3 -3
  25. package/dist/{react-_TUsDaHa.js → react-DlJlpUiG.js} +3 -3
  26. package/dist/{react-CpnhkRge.js → react-eOBKoj54.js} +3 -3
  27. package/dist/ui/chat/SummaryCard/SummaryCard.d.ts +2 -2
  28. package/dist/ui/chat/types.d.ts +5 -0
  29. package/dist/ui/inputs/VideoRecorder/VideoRecorder.d.ts +10 -1
  30. package/dist/ui/inputs/formCard.d.ts +1 -0
  31. package/dist/ui/media/VideoPlayer/VideoPlayer.d.ts +8 -4
  32. package/dist/ui/primitives/Dialog/Dialog.d.ts +2 -0
  33. package/dist/ui/shell/AgcGuidanceDialog/AgcGuidanceDialog.d.ts +13 -0
  34. package/dist/ui/shell/DoneScreen/DoneScreen.d.ts +3 -1
  35. package/dist/ui/shell/LogoTile/LogoTile.d.ts +10 -0
  36. package/dist-umd/sapia-chatbot.umd.js +264 -264
  37. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { L as e } from "./client-DG-5x86F.js";
1
+ import { R as e } from "./client-DfRBtXIE.js";
2
2
  //#region ../../node_modules/.pnpm/react@19.2.7/node_modules/react/cjs/react-jsx-runtime.production.js
3
3
  var t = /* @__PURE__ */ e(((e) => {
4
4
  var t = Symbol.for("react.transitional.element"), n = Symbol.for("react.fragment");
@@ -21,4 +21,4 @@ var t = /* @__PURE__ */ e(((e) => {
21
21
  //#endregion
22
22
  export { n as t };
23
23
 
24
- //# sourceMappingURL=jsx-runtime-B5vw3nIj.js.map
24
+ //# sourceMappingURL=jsx-runtime-CdNykazB.js.map
@@ -1,6 +1,7 @@
1
1
  import { InterviewEngine } from '../core/interview/engine';
2
2
  import { Region } from '../api/config';
3
3
  import { CurrentInputKind, EditingDraft, WordCountRule } from './bubbleViewModel';
4
+ import { SubmittedTakeSource } from './useVideoRecorder';
4
5
  import { UiStrings } from './strings';
5
6
  export type AnswerInputProps = {
6
7
  engine: InterviewEngine;
@@ -16,6 +17,10 @@ export type AnswerInputProps = {
16
17
  placesApiKey?: string;
17
18
  /** Max video answer length in seconds (video questions). */
18
19
  maxVideoSeconds?: number;
20
+ /** The answer a video Retry reopens for review; absent on a first recording. */
21
+ submittedVideo?: SubmittedTakeSource;
22
+ /** Question the video recorder answers, so its take count survives a reload. */
23
+ videoQuestionId?: string;
19
24
  /** Stored answer to open the composer on when re-editing. */
20
25
  draft?: EditingDraft;
21
26
  /**
@@ -36,4 +41,4 @@ export type AnswerInputProps = {
36
41
  expanded: boolean;
37
42
  onExpandedChange: (expanded: boolean) => void;
38
43
  };
39
- export declare const AnswerInput: ({ engine, assessmentId, kind, disabled, wordCountRule, strings, candidateCountryCode, region, placesApiKey, maxVideoSeconds, draft, draftQuestionId, allowPaste, isFeedbackComment, onBlockedPaste, focusOnOpen, expanded, onExpandedChange, }: AnswerInputProps) => import("react").JSX.Element;
44
+ export declare const AnswerInput: ({ engine, assessmentId, kind, disabled, wordCountRule, strings, candidateCountryCode, region, placesApiKey, maxVideoSeconds, submittedVideo, videoQuestionId, draft, draftQuestionId, allowPaste, isFeedbackComment, onBlockedPaste, focusOnOpen, expanded, onExpandedChange, }: AnswerInputProps) => import("react").JSX.Element;
@@ -67,6 +67,13 @@ export declare const currentQuestionId: (bubbles: MessageBubble[], editingQuesti
67
67
  * the retry together.
68
68
  */
69
69
  export declare const isAgcGuidanceAwaitingAnswer: (bubbles: MessageBubble[]) => boolean;
70
+ /**
71
+ * Whether the terms consent is waiting in a dialogue that never drew the AI-use guidance.
72
+ * Dialogues generated before the introduction carried the guidance marker reach consent without
73
+ * the candidate having been told answers are checked for AI content, so the widget raises the
74
+ * guidance as a pop-up there instead. Once consent is answered the moment has passed.
75
+ */
76
+ export declare const isTermsConsentMissingAgcGuidance: (bubbles: MessageBubble[]) => boolean;
70
77
  /** The stored answer of the question under edit, used to seed the composer. */
71
78
  export type EditingDraft = {
72
79
  text: string;
@@ -78,6 +85,17 @@ export type EditingDraft = {
78
85
  * composer renders back into the editor.
79
86
  */
80
87
  export declare const editingAnswerDraft: (bubbles: MessageBubble[], editingQuestionId?: string) => EditingDraft | undefined;
88
+ /** The answer a Retry reopens: the local recording when this session made it, else what to fetch. */
89
+ export type SubmittedVideoTake = {
90
+ questionId: string;
91
+ blob?: Blob;
92
+ extension?: string;
93
+ };
94
+ /**
95
+ * The submitted take behind the video answer being retried, so the recorder can open on it for
96
+ * review. Undefined when nothing is being edited or the edited answer is not a video.
97
+ */
98
+ export declare const editingVideoTake: (bubbles: MessageBubble[], editingQuestionId?: string) => SubmittedVideoTake | undefined;
81
99
  /** Eyebrow/badge copy builders, supplied by react/strings (keeps i18n out of the view-model). */
82
100
  export type QuestionCardLabels = {
83
101
  /** Eyebrow copy per scale, e.g. "Written question {n} of {total}". */
@@ -113,7 +131,9 @@ export type QuestionTotals = Record<QuestionScale, number>;
113
131
  export declare const buildQuestionCards: (bubbles: MessageBubble[], totals: QuestionTotals, labels: QuestionCardLabels) => Map<string, QuestionCard>;
114
132
  /**
115
133
  * Bubble id of the active video question, so its recorder renders inside the
116
- * card. Undefined unless the current question is a (non-edited) video question.
134
+ * card. While a video answer is re-edited this is the edited question's card, so
135
+ * the recorder reopens beside the question it re-answers rather than docking under
136
+ * a transcript that has since moved on. Undefined for any other question.
117
137
  */
118
138
  export declare const activeVideoCardId: (bubbles: MessageBubble[], editingQuestionId?: string) => string | undefined;
119
139
  /** The bottom free-text/PII input is shown only for FTQ-typed questions. */
@@ -66,6 +66,7 @@ export declare const buildStrings: (t: Translator) => {
66
66
  cancelEditLabel: string;
67
67
  editingLabel: string;
68
68
  editBannerLabel: string;
69
+ videoRetryBannerLabel: string;
69
70
  optionsGroupLabel: string;
70
71
  /**
71
72
  * What the candidate is being asked to do with the options. Only a cap below the number on offer
@@ -171,6 +172,7 @@ export declare const buildStrings: (t: Translator) => {
171
172
  videoStopRecording: string;
172
173
  videoReRecord: string;
173
174
  videoSubmit: string;
175
+ videoKeep: string;
174
176
  videoCameraError: string;
175
177
  videoPreview: string;
176
178
  videoCamera: string;
@@ -198,9 +200,11 @@ export declare const buildStrings: (t: Translator) => {
198
200
  agcMessage: (attempt: number) => string;
199
201
  agcEdit: string;
200
202
  agcContinue: string;
203
+ agcGuidanceTitle: string;
201
204
  agcGuidanceBody: string;
202
205
  agcGuidanceCheckbox: string;
203
206
  agcGuidanceTip: string;
207
+ agcGuidanceCta: string;
204
208
  editFailedTitle: string;
205
209
  editFailedMessage: string;
206
210
  editFailedDismiss: string;
@@ -1,6 +1,23 @@
1
1
  import { RecorderMedia, RecorderState } from '../core/media/recorder';
2
2
  /** Max number of takes a candidate may record (client-side UX cap). */
3
3
  export declare const MAX_VIDEO_ATTEMPTS = 5;
4
+ /** Where finished takes are counted, so the cap survives a reload and a Retry. */
5
+ export type VideoTakesScope = {
6
+ assessmentId: string;
7
+ questionId: string;
8
+ };
9
+ /** An answer already submitted: its recording from this session, or a fetch for one from before. */
10
+ export type SubmittedTakeSource = {
11
+ blob?: Blob;
12
+ resolveUrl?: () => Promise<string>;
13
+ };
14
+ export type UseVideoRecorderOptions = {
15
+ media?: RecorderMedia;
16
+ /** Without it the count lives for this mount only. Memoize: effects key on its identity. */
17
+ takes?: VideoTakesScope;
18
+ /** Opens in review on this take instead of on the camera button. Memoize, as for `takes`. */
19
+ submittedTake?: SubmittedTakeSource;
20
+ };
4
21
  export type UseVideoRecorder = {
5
22
  state: RecorderState;
6
23
  videoRef: React.RefObject<HTMLVideoElement | null>;
@@ -9,11 +26,15 @@ export type UseVideoRecorder = {
9
26
  micOn: boolean;
10
27
  /** 3-2-1 countdown value before recording starts, or null when inactive. */
11
28
  countdown: number | null;
12
- /** Current take number and the cap. */
13
- attempts: number;
29
+ /** Takes spent on this question, the one under review included, and the cap. */
30
+ takesUsed: number;
14
31
  maxAttempts: number;
15
- /** Object URL for the recorded take, available in the review phase. */
32
+ /** URL of the take under review: the fresh recording, or the submitted one. */
16
33
  reviewUrl: string | null;
34
+ /** True while the review shows the already-submitted answer rather than a new take. */
35
+ reviewingSubmitted: boolean;
36
+ /** True from a Re-record press until the new take starts recording. */
37
+ retaking: boolean;
17
38
  openCamera: () => void;
18
39
  beginCountdown: () => void;
19
40
  stopRecording: () => void;
@@ -21,4 +42,4 @@ export type UseVideoRecorder = {
21
42
  toggleCamera: () => void;
22
43
  toggleMicrophone: () => void;
23
44
  };
24
- export declare const useVideoRecorder: (maxSeconds: number, media?: RecorderMedia) => UseVideoRecorder;
45
+ export declare const useVideoRecorder: (maxSeconds: number, { media, takes, submittedTake }?: UseVideoRecorderOptions) => UseVideoRecorder;
@@ -1,5 +1,5 @@
1
- import { z as e } from "./client-DG-5x86F.js";
2
- import { t } from "./react-DHdgNnK2.js";
1
+ import { B as e } from "./client-DfRBtXIE.js";
2
+ import { t } from "./react-D4Z0N-x7.js";
3
3
  import { t as n } from "./defineProperty-DiFpLzd2.js";
4
4
  import { a as r, i, n as a, r as o, t as s } from "./classPrivateFieldSet2-DtQPURVD.js";
5
5
  //#region ../../node_modules/.pnpm/super-media-element@1.4.2/node_modules/super-media-element/super-media-element.js
@@ -369,4 +369,4 @@ var P = M({
369
369
  //#endregion
370
370
  export { P as default };
371
371
 
372
- //# sourceMappingURL=react-Dd6J2Pyv.js.map
372
+ //# sourceMappingURL=react-78ZA32q8.js.map
@@ -1,5 +1,5 @@
1
- import { z as e } from "./client-DG-5x86F.js";
2
- import { t } from "./react-DHdgNnK2.js";
1
+ import { B as e } from "./client-DfRBtXIE.js";
2
+ import { t } from "./react-D4Z0N-x7.js";
3
3
  import { t as n } from "./defineProperty-DiFpLzd2.js";
4
4
  import { a as r, i, n as a, r as o, t as s } from "./classPrivateFieldSet2-DtQPURVD.js";
5
5
  import { t as c } from "./dist-FvHBWiRa.js";
@@ -2207,4 +2207,4 @@ var rt = tt({
2207
2207
  //#endregion
2208
2208
  export { rt as default };
2209
2209
 
2210
- //# sourceMappingURL=react-SKFkpgRr.js.map
2210
+ //# sourceMappingURL=react-BC7MhdYE.js.map
@@ -1,5 +1,5 @@
1
- import { z as e } from "./client-DG-5x86F.js";
2
- import { t } from "./react-DHdgNnK2.js";
1
+ import { B as e } from "./client-DfRBtXIE.js";
2
+ import { t } from "./react-D4Z0N-x7.js";
3
3
  import { t as n } from "./defineProperty-DiFpLzd2.js";
4
4
  import { a as r, i, n as a, r as o, t as s } from "./classPrivateFieldSet2-DtQPURVD.js";
5
5
  //#region ../../node_modules/.pnpm/spotify-audio-element@1.0.4/node_modules/spotify-audio-element/dist/spotify-audio-element.js
@@ -309,4 +309,4 @@ var W = H({
309
309
  //#endregion
310
310
  export { W as default };
311
311
 
312
- //# sourceMappingURL=react-CN-F_7qV.js.map
312
+ //# sourceMappingURL=react-BIgNJUOD.js.map
@@ -1,5 +1,5 @@
1
- import { z as e } from "./client-DG-5x86F.js";
2
- import { t } from "./react-DHdgNnK2.js";
1
+ import { B as e } from "./client-DfRBtXIE.js";
2
+ import { t } from "./react-D4Z0N-x7.js";
3
3
  import { t as n } from "./defineProperty-DiFpLzd2.js";
4
4
  import { a as r, i, n as a, r as o, t as s } from "./classPrivateFieldSet2-DtQPURVD.js";
5
5
  import { t as c } from "./dist-FvHBWiRa.js";
@@ -455,4 +455,4 @@ var $ = Z({
455
455
  //#endregion
456
456
  export { $ as default };
457
457
 
458
- //# sourceMappingURL=react-B46N_vb_.js.map
458
+ //# sourceMappingURL=react-BKViU2cv.js.map
@@ -1,5 +1,5 @@
1
- import { z as e } from "./client-DG-5x86F.js";
2
- import { t } from "./react-DHdgNnK2.js";
1
+ import { B as e } from "./client-DfRBtXIE.js";
2
+ import { t } from "./react-D4Z0N-x7.js";
3
3
  import { t as n } from "./defineProperty-DiFpLzd2.js";
4
4
  import { a as r, i, n as a, r as o, t as s } from "./classPrivateFieldSet2-DtQPURVD.js";
5
5
  //#region ../../node_modules/.pnpm/tiktok-video-element@0.1.2/node_modules/tiktok-video-element/dist/tiktok-video-element.js
@@ -332,4 +332,4 @@ var K = W({
332
332
  //#endregion
333
333
  export { K as default };
334
334
 
335
- //# sourceMappingURL=react-abEVBgXB.js.map
335
+ //# sourceMappingURL=react-BSaO3Elx.js.map
@@ -1,4 +1,4 @@
1
- import { L as e } from "./client-DG-5x86F.js";
1
+ import { R as e } from "./client-DfRBtXIE.js";
2
2
  //#region ../../node_modules/.pnpm/react@19.2.7/node_modules/react/cjs/react.production.js
3
3
  var t = /* @__PURE__ */ e(((e) => {
4
4
  var t = Symbol.for("react.transitional.element"), n = Symbol.for("react.portal"), r = Symbol.for("react.fragment"), i = Symbol.for("react.strict_mode"), a = Symbol.for("react.profiler"), o = Symbol.for("react.consumer"), s = Symbol.for("react.context"), c = Symbol.for("react.forward_ref"), l = Symbol.for("react.suspense"), u = Symbol.for("react.memo"), d = Symbol.for("react.lazy"), f = Symbol.for("react.activity"), p = Symbol.iterator;
@@ -292,4 +292,4 @@ var t = /* @__PURE__ */ e(((e) => {
292
292
  //#endregion
293
293
  export { n as t };
294
294
 
295
- //# sourceMappingURL=react-DHdgNnK2.js.map
295
+ //# sourceMappingURL=react-D4Z0N-x7.js.map
@@ -1,5 +1,5 @@
1
- import { z as e } from "./client-DG-5x86F.js";
2
- import { t } from "./react-DHdgNnK2.js";
1
+ import { B as e } from "./client-DfRBtXIE.js";
2
+ import { t } from "./react-D4Z0N-x7.js";
3
3
  import { t as n } from "./defineProperty-DiFpLzd2.js";
4
4
  import { n as r } from "./hls-mBncGwsE.js";
5
5
  import { a as i, i as a, n as o, r as s, t as c } from "./classPrivateFieldSet2-DtQPURVD.js";
@@ -215,4 +215,4 @@ var b = v({
215
215
  //#endregion
216
216
  export { b as default };
217
217
 
218
- //# sourceMappingURL=react-T5LsuM9r.js.map
218
+ //# sourceMappingURL=react-DEJ3NRa3.js.map
@@ -1,5 +1,5 @@
1
- import { z as e } from "./client-DG-5x86F.js";
2
- import { t } from "./react-DHdgNnK2.js";
1
+ import { B as e } from "./client-DfRBtXIE.js";
2
+ import { t } from "./react-D4Z0N-x7.js";
3
3
  import { t as n } from "./defineProperty-DiFpLzd2.js";
4
4
  import { i as r, n as i, t as a } from "./classPrivateFieldSet2-DtQPURVD.js";
5
5
  import { n as o, t as s } from "./dist-BOe6WyvN.js";
@@ -190,4 +190,4 @@ var S = b({
190
190
  //#endregion
191
191
  export { S as default };
192
192
 
193
- //# sourceMappingURL=react-_TUsDaHa.js.map
193
+ //# sourceMappingURL=react-DlJlpUiG.js.map
@@ -1,5 +1,5 @@
1
- import { z as e } from "./client-DG-5x86F.js";
2
- import { t } from "./react-DHdgNnK2.js";
1
+ import { B as e } from "./client-DfRBtXIE.js";
2
+ import { t } from "./react-D4Z0N-x7.js";
3
3
  import { t as n } from "./defineProperty-DiFpLzd2.js";
4
4
  import { a as r, i, n as a, r as o, t as s } from "./classPrivateFieldSet2-DtQPURVD.js";
5
5
  //#region ../../node_modules/.pnpm/twitch-video-element@0.1.6/node_modules/twitch-video-element/dist/twitch-video-element.js
@@ -365,4 +365,4 @@ var J = K({
365
365
  //#endregion
366
366
  export { J as default };
367
367
 
368
- //# sourceMappingURL=react-CpnhkRge.js.map
368
+ //# sourceMappingURL=react-eOBKoj54.js.map
@@ -16,7 +16,7 @@ export type SummaryCategory = {
16
16
  kind?: SummaryKind;
17
17
  };
18
18
  export type SummaryCardProps = {
19
- /** Uppercase label for the total panel, e.g. "TOTAL". */
19
+ /** Label for the total panel, rendered as the translation supplies it, e.g. "Total". */
20
20
  totalLabel: string;
21
21
  /** Resolved total line, e.g. "10 Questions (~ 30 minutes)". */
22
22
  countLabel: string;
@@ -26,7 +26,7 @@ export type SummaryCardProps = {
26
26
  opensNewTab: string;
27
27
  };
28
28
  /**
29
- * "What to expect": an elevated white card with a centred TOTAL panel (question count and time
29
+ * "What to expect": an elevated white card with a centred total panel (question count and time
30
30
  * estimate) and an accent-barred breakdown list — one icon row per question type.
31
31
  */
32
32
  export declare const SummaryCard: ({ totalLabel, countLabel, categories, opensNewTab, }: SummaryCardProps) => import("react").JSX.Element;
@@ -49,6 +49,11 @@ export type ChatVideoItem = {
49
49
  /** For historical answers: fetch a signed playback URL via these. */
50
50
  questionId: string;
51
51
  extension?: string;
52
+ /**
53
+ * Short-lived URL the backend signed when it sent a reloaded answer. Good enough to draw the
54
+ * thumbnail without a request of our own; playback falls back to a fresh URL once it expires.
55
+ */
56
+ previewUrl?: string;
52
57
  /** Upload failed; retry available. */
53
58
  failed?: boolean;
54
59
  };
@@ -6,6 +6,8 @@ export type VideoRecorderLabels = {
6
6
  stopRecording: string;
7
7
  reRecord: string;
8
8
  submit: string;
9
+ /** Primary review action on the already-submitted answer, e.g. "Keep this answer". */
10
+ keep: string;
9
11
  cameraError: string;
10
12
  preview: string;
11
13
  /** Design-only setup/recording labels (optional; fall back to no chrome). */
@@ -49,10 +51,17 @@ export type VideoRecorderProps = {
49
51
  canRetake?: boolean;
50
52
  /** Object URL for the recorded take, played back in review. */
51
53
  reviewUrl?: string | null;
54
+ /** Review shows the answer already submitted, so the primary action keeps it instead of sending. */
55
+ reviewingSubmitted?: boolean;
56
+ /**
57
+ * A Re-record is under way: the camera reopens and the countdown starts on its own. The stage and
58
+ * the Record row hold their place while it does, so the card keeps the height the review had.
59
+ */
60
+ retaking?: boolean;
52
61
  };
53
62
  /**
54
63
  * Camera preview + record/review controls, styled to the Chat-3000 design.
55
64
  * The MediaRecorder lifecycle, countdown, toggles and attempts live in
56
65
  * react/useVideoRecorder; this component only renders state + buttons.
57
66
  */
58
- export declare const VideoRecorder: ({ phase, elapsedSeconds, maxSeconds, hasResult, showPreview, videoRef, disabled, labels, onOpenCamera, onBeginCountdown, onStartRecording, onStopRecording, onReRecord, onSubmit, camOn, micOn, onToggleCamera, onToggleMicrophone, countdown, attemptsLabel, canRetake, reviewUrl, }: VideoRecorderProps) => import("react").JSX.Element;
67
+ export declare const VideoRecorder: ({ phase, elapsedSeconds, maxSeconds, hasResult, showPreview, videoRef, disabled, labels, onOpenCamera, onBeginCountdown, onStartRecording, onStopRecording, onReRecord, onSubmit, camOn, micOn, onToggleCamera, onToggleMicrophone, countdown, attemptsLabel, canRetake, reviewUrl, reviewingSubmitted, retaking, }: VideoRecorderProps) => import("react").JSX.Element;
@@ -1,2 +1,3 @@
1
+ export declare const FORM_CARD_WIDTH_CLASS = "sc:w-full sc:min-w-[min(100%,500px)] sc:max-w-[672px]";
1
2
  export declare const FORM_CARD_CLASS = "sc:w-full sc:min-w-[min(100%,500px)] sc:max-w-[672px] sc:overflow-hidden sc:rounded-2xl sc:border sc:border-line sc:bg-white";
2
3
  export declare const FORM_CTA_CLASS = "sc:w-full sc:rounded-full sc:py-3.5 sc:text-base";
@@ -1,13 +1,17 @@
1
1
  export type VideoPlayerProps = {
2
2
  /** Local recorded blob (just-submitted answer), played without a network call. */
3
3
  blob?: Blob;
4
- /** Lazily resolves a signed playback URL (historical answers). */
4
+ /** Backend-signed URL that came with a reloaded answer; draws the thumbnail, may have expired. */
5
+ previewUrl?: string;
6
+ /** Lazily resolves a fresh signed playback URL (historical answers). */
5
7
  resolveUrl?: () => Promise<string>;
6
8
  playLabel: string;
7
9
  label: string;
8
10
  };
9
11
  /**
10
- * Plays a recorded video answer. Uses the local blob when available, otherwise
11
- * fetches a signed URL on demand. Native <video controls> — keyboard accessible.
12
+ * Plays a recorded video answer. Shows its first frame behind a play button, drawn from the local
13
+ * blob or the URL the backend signed into a reloaded answer; a press plays it in place. With no
14
+ * usable source (none sent, or the signed URL expired) it falls back to a fresh URL on demand.
15
+ * Native <video controls> once playing — keyboard accessible.
12
16
  */
13
- export declare const VideoPlayer: ({ blob, resolveUrl, playLabel, label }: VideoPlayerProps) => import("react").JSX.Element;
17
+ export declare const VideoPlayer: ({ blob, previewUrl, resolveUrl, playLabel, label, }: VideoPlayerProps) => import("react").JSX.Element;
@@ -4,6 +4,8 @@ export type DialogAction = {
4
4
  label: string;
5
5
  onClick: () => void;
6
6
  variant?: ButtonVariant;
7
+ /** Gates the action behind something the candidate has to do in the body first. */
8
+ disabled?: boolean;
7
9
  };
8
10
  export type DialogProps = {
9
11
  open: boolean;
@@ -0,0 +1,13 @@
1
+ export type AgcGuidanceDialogProps = {
2
+ title: string;
3
+ /** Multi-paragraph guidance copy (markdown), written in the translation file. */
4
+ body: string;
5
+ checkboxLabel: string;
6
+ ctaLabel: string;
7
+ onAcknowledge: () => void;
8
+ };
9
+ /**
10
+ * Acknowledging is the only way out: no onClose, because Escape or an overlay click would skip
11
+ * the undertaking the tick represents.
12
+ */
13
+ export declare const AgcGuidanceDialog: ({ title, body, checkboxLabel, ctaLabel, onAcknowledge, }: AgcGuidanceDialogProps) => import("react").JSX.Element;
@@ -6,9 +6,11 @@ export type DoneScreenLabels = {
6
6
  };
7
7
  export type DoneScreenProps = {
8
8
  labels: DoneScreenLabels;
9
+ /** Customer logo; the screen carries no brand mark when it is absent or fails to load. */
10
+ logoUrl?: string;
9
11
  /** Pre-validated absolute URL to continue to; omitted when the host supplied none. */
10
12
  redirectUrl?: string;
11
13
  redirectLabel?: string;
12
14
  };
13
15
  /** Completion screen shown when the interview has ended. */
14
- export declare const DoneScreen: ({ labels, redirectUrl, redirectLabel }: DoneScreenProps) => import("react").JSX.Element;
16
+ export declare const DoneScreen: ({ labels, logoUrl, redirectUrl, redirectLabel }: DoneScreenProps) => import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ export type LogoTileProps = {
2
+ src?: string;
3
+ alt?: string;
4
+ className?: string;
5
+ };
6
+ /**
7
+ * Customer logo on a white square tile. Renders nothing when there is no logo or it fails to
8
+ * load — a broken-image glyph would read as a fault on a candidate-facing surface.
9
+ */
10
+ export declare const LogoTile: ({ src, alt, className }: LogoTileProps) => import("react").JSX.Element | null;