@joewinke/jatui 0.36.3 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifact-blocks/AttachmentChip.svelte +66 -0
- package/dist/artifact-blocks/AttachmentChip.svelte.d.ts +7 -0
- package/dist/artifact-blocks/BlockComments.svelte +309 -0
- package/dist/artifact-blocks/BlockComments.svelte.d.ts +33 -0
- package/dist/artifact-blocks/BlockRenderer.svelte +674 -0
- package/dist/artifact-blocks/BlockRenderer.svelte.d.ts +55 -0
- package/dist/artifact-blocks/BlockVerdict.svelte +151 -0
- package/dist/artifact-blocks/BlockVerdict.svelte.d.ts +13 -0
- package/dist/artifact-blocks/BlocksArtifactView.svelte +1616 -0
- package/dist/artifact-blocks/BlocksArtifactView.svelte.d.ts +113 -0
- package/dist/artifact-blocks/CONTRACT.md +225 -0
- package/dist/artifact-blocks/CommentPill.svelte +49 -0
- package/dist/artifact-blocks/CommentPill.svelte.d.ts +16 -0
- package/dist/artifact-blocks/FoldedRounds.svelte +95 -0
- package/dist/artifact-blocks/FoldedRounds.svelte.d.ts +9 -0
- package/dist/artifact-blocks/Glyph.svelte +54 -0
- package/dist/artifact-blocks/Glyph.svelte.d.ts +10 -0
- package/dist/artifact-blocks/HistoryScrubber.svelte +500 -0
- package/dist/artifact-blocks/HistoryScrubber.svelte.d.ts +15 -0
- package/dist/artifact-blocks/Markdown.svelte +186 -0
- package/dist/artifact-blocks/Markdown.svelte.d.ts +30 -0
- package/dist/artifact-blocks/NoteComposer.svelte +31 -0
- package/dist/artifact-blocks/NoteComposer.svelte.d.ts +8 -0
- package/dist/artifact-blocks/PlainComposer.svelte +200 -0
- package/dist/artifact-blocks/PlainComposer.svelte.d.ts +15 -0
- package/dist/artifact-blocks/SectionTools.svelte +102 -0
- package/dist/artifact-blocks/SectionTools.svelte.d.ts +19 -0
- package/dist/artifact-blocks/adapter.d.ts +13 -0
- package/dist/artifact-blocks/adapter.js +31 -0
- package/dist/artifact-blocks/autoSend.d.ts +49 -0
- package/dist/artifact-blocks/autoSend.js +103 -0
- package/dist/artifact-blocks/blocks/actions/ActionsBlock.svelte +557 -0
- package/dist/artifact-blocks/blocks/actions/ActionsBlock.svelte.d.ts +48 -0
- package/dist/artifact-blocks/blocks/actions/block.d.ts +8 -0
- package/dist/artifact-blocks/blocks/actions/block.js +74 -0
- package/dist/artifact-blocks/blocks/actions/requests.d.ts +62 -0
- package/dist/artifact-blocks/blocks/actions/requests.js +26 -0
- package/dist/artifact-blocks/blocks/actions/schema.d.ts +168 -0
- package/dist/artifact-blocks/blocks/actions/schema.js +253 -0
- package/dist/artifact-blocks/blocks/callout/CalloutBlock.svelte +779 -0
- package/dist/artifact-blocks/blocks/callout/CalloutBlock.svelte.d.ts +40 -0
- package/dist/artifact-blocks/blocks/callout/block.d.ts +7 -0
- package/dist/artifact-blocks/blocks/callout/block.js +39 -0
- package/dist/artifact-blocks/blocks/callout/schema.d.ts +72 -0
- package/dist/artifact-blocks/blocks/callout/schema.js +115 -0
- package/dist/artifact-blocks/blocks/chart/ChartBlock.svelte +875 -0
- package/dist/artifact-blocks/blocks/chart/ChartBlock.svelte.d.ts +59 -0
- package/dist/artifact-blocks/blocks/chart/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/chart/block.js +70 -0
- package/dist/artifact-blocks/blocks/chart/schema.d.ts +171 -0
- package/dist/artifact-blocks/blocks/chart/schema.js +498 -0
- package/dist/artifact-blocks/blocks/chart/thumb.d.ts +2 -0
- package/dist/artifact-blocks/blocks/chart/thumb.js +201 -0
- package/dist/artifact-blocks/blocks/checklist/ChecklistBlock.svelte +1048 -0
- package/dist/artifact-blocks/blocks/checklist/ChecklistBlock.svelte.d.ts +16 -0
- package/dist/artifact-blocks/blocks/checklist/Icon.svelte +105 -0
- package/dist/artifact-blocks/blocks/checklist/Icon.svelte.d.ts +17 -0
- package/dist/artifact-blocks/blocks/checklist/block.d.ts +10 -0
- package/dist/artifact-blocks/blocks/checklist/block.js +63 -0
- package/dist/artifact-blocks/blocks/checklist/itemReview.d.ts +16 -0
- package/dist/artifact-blocks/blocks/checklist/itemReview.js +63 -0
- package/dist/artifact-blocks/blocks/checklist/labels.d.ts +62 -0
- package/dist/artifact-blocks/blocks/checklist/labels.js +96 -0
- package/dist/artifact-blocks/blocks/checklist/retest.d.ts +43 -0
- package/dist/artifact-blocks/blocks/checklist/retest.js +68 -0
- package/dist/artifact-blocks/blocks/checklist/schema.d.ts +84 -0
- package/dist/artifact-blocks/blocks/checklist/schema.js +91 -0
- package/dist/artifact-blocks/blocks/code/CodeBlock.svelte +128 -0
- package/dist/artifact-blocks/blocks/code/CodeBlock.svelte.d.ts +12 -0
- package/dist/artifact-blocks/blocks/code/block.d.ts +8 -0
- package/dist/artifact-blocks/blocks/code/block.js +31 -0
- package/dist/artifact-blocks/blocks/code/highlight.d.ts +34 -0
- package/dist/artifact-blocks/blocks/code/highlight.js +280 -0
- package/dist/artifact-blocks/blocks/code/schema.d.ts +32 -0
- package/dist/artifact-blocks/blocks/code/schema.js +39 -0
- package/dist/artifact-blocks/blocks/collage/CollageBlock.svelte +290 -0
- package/dist/artifact-blocks/blocks/collage/CollageBlock.svelte.d.ts +29 -0
- package/dist/artifact-blocks/blocks/collage/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/collage/block.js +29 -0
- package/dist/artifact-blocks/blocks/collage/schema.d.ts +52 -0
- package/dist/artifact-blocks/blocks/collage/schema.js +86 -0
- package/dist/artifact-blocks/blocks/compare/CompareBlock.svelte +484 -0
- package/dist/artifact-blocks/blocks/compare/CompareBlock.svelte.d.ts +25 -0
- package/dist/artifact-blocks/blocks/compare/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/compare/block.js +32 -0
- package/dist/artifact-blocks/blocks/compare/schema.d.ts +74 -0
- package/dist/artifact-blocks/blocks/compare/schema.js +148 -0
- package/dist/artifact-blocks/blocks/diagram/DiagramBlock.svelte +392 -0
- package/dist/artifact-blocks/blocks/diagram/DiagramBlock.svelte.d.ts +30 -0
- package/dist/artifact-blocks/blocks/diagram/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/diagram/block.js +50 -0
- package/dist/artifact-blocks/blocks/diagram/constants.d.ts +48 -0
- package/dist/artifact-blocks/blocks/diagram/constants.js +53 -0
- package/dist/artifact-blocks/blocks/diagram/schema.d.ts +161 -0
- package/dist/artifact-blocks/blocks/diagram/schema.js +621 -0
- package/dist/artifact-blocks/blocks/diagram/thumb.d.ts +2 -0
- package/dist/artifact-blocks/blocks/diagram/thumb.js +157 -0
- package/dist/artifact-blocks/blocks/diagram/types.d.ts +74 -0
- package/dist/artifact-blocks/blocks/diagram/types.js +1 -0
- package/dist/artifact-blocks/blocks/diff/DiffBlock.svelte +81 -0
- package/dist/artifact-blocks/blocks/diff/DiffBlock.svelte.d.ts +10 -0
- package/dist/artifact-blocks/blocks/diff/block.d.ts +7 -0
- package/dist/artifact-blocks/blocks/diff/block.js +36 -0
- package/dist/artifact-blocks/blocks/diff/schema.d.ts +18 -0
- package/dist/artifact-blocks/blocks/diff/schema.js +35 -0
- package/dist/artifact-blocks/blocks/diff-review/DiffReviewBlock.svelte +1055 -0
- package/dist/artifact-blocks/blocks/diff-review/DiffReviewBlock.svelte.d.ts +5 -0
- package/dist/artifact-blocks/blocks/diff-review/block.d.ts +15 -0
- package/dist/artifact-blocks/blocks/diff-review/block.js +64 -0
- package/dist/artifact-blocks/blocks/diff-review/decisions.d.ts +57 -0
- package/dist/artifact-blocks/blocks/diff-review/decisions.js +80 -0
- package/dist/artifact-blocks/blocks/diff-review/schema.d.ts +13 -0
- package/dist/artifact-blocks/blocks/diff-review/schema.js +84 -0
- package/dist/artifact-blocks/blocks/diff-review/types.d.ts +35 -0
- package/dist/artifact-blocks/blocks/diff-review/types.js +1 -0
- package/dist/artifact-blocks/blocks/explainer/ExplainerBlock.svelte +145 -0
- package/dist/artifact-blocks/blocks/explainer/ExplainerBlock.svelte.d.ts +5 -0
- package/dist/artifact-blocks/blocks/explainer/block.d.ts +8 -0
- package/dist/artifact-blocks/blocks/explainer/block.js +21 -0
- package/dist/artifact-blocks/blocks/explainer/schema.d.ts +26 -0
- package/dist/artifact-blocks/blocks/explainer/schema.js +69 -0
- package/dist/artifact-blocks/blocks/group-content.d.ts +10 -0
- package/dist/artifact-blocks/blocks/group-content.js +16 -0
- package/dist/artifact-blocks/blocks/group-data.d.ts +10 -0
- package/dist/artifact-blocks/blocks/group-data.js +7 -0
- package/dist/artifact-blocks/blocks/group-review.d.ts +10 -0
- package/dist/artifact-blocks/blocks/group-review.js +12 -0
- package/dist/artifact-blocks/blocks/group-visual.d.ts +17 -0
- package/dist/artifact-blocks/blocks/group-visual.js +14 -0
- package/dist/artifact-blocks/blocks/map/MapBlock.svelte +413 -0
- package/dist/artifact-blocks/blocks/map/MapBlock.svelte.d.ts +53 -0
- package/dist/artifact-blocks/blocks/map/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/map/block.js +62 -0
- package/dist/artifact-blocks/blocks/map/schema.d.ts +123 -0
- package/dist/artifact-blocks/blocks/map/schema.js +113 -0
- package/dist/artifact-blocks/blocks/map/thumb.d.ts +2 -0
- package/dist/artifact-blocks/blocks/map/thumb.js +69 -0
- package/dist/artifact-blocks/blocks/markdown/MarkdownBlock.svelte +33 -0
- package/dist/artifact-blocks/blocks/markdown/MarkdownBlock.svelte.d.ts +15 -0
- package/dist/artifact-blocks/blocks/markdown/block.d.ts +7 -0
- package/dist/artifact-blocks/blocks/markdown/block.js +28 -0
- package/dist/artifact-blocks/blocks/markdown/render.d.ts +17 -0
- package/dist/artifact-blocks/blocks/markdown/render.js +115 -0
- package/dist/artifact-blocks/blocks/markdown/schema.d.ts +10 -0
- package/dist/artifact-blocks/blocks/markdown/schema.js +23 -0
- package/dist/artifact-blocks/blocks/media-picker/MediaPickerBlock.svelte +2112 -0
- package/dist/artifact-blocks/blocks/media-picker/MediaPickerBlock.svelte.d.ts +5 -0
- package/dist/artifact-blocks/blocks/media-picker/block.d.ts +24 -0
- package/dist/artifact-blocks/blocks/media-picker/block.js +137 -0
- package/dist/artifact-blocks/blocks/media-picker/choices.d.ts +28 -0
- package/dist/artifact-blocks/blocks/media-picker/choices.js +35 -0
- package/dist/artifact-blocks/blocks/media-picker/decisions.d.ts +51 -0
- package/dist/artifact-blocks/blocks/media-picker/decisions.js +75 -0
- package/dist/artifact-blocks/blocks/media-picker/schema.d.ts +7 -0
- package/dist/artifact-blocks/blocks/media-picker/schema.js +199 -0
- package/dist/artifact-blocks/blocks/media-picker/types.d.ts +92 -0
- package/dist/artifact-blocks/blocks/media-picker/types.js +1 -0
- package/dist/artifact-blocks/blocks/media-picker/versions.d.ts +51 -0
- package/dist/artifact-blocks/blocks/media-picker/versions.js +118 -0
- package/dist/artifact-blocks/blocks/mockup/MockupBlock.svelte +213 -0
- package/dist/artifact-blocks/blocks/mockup/MockupBlock.svelte.d.ts +5 -0
- package/dist/artifact-blocks/blocks/mockup/block.d.ts +26 -0
- package/dist/artifact-blocks/blocks/mockup/block.js +52 -0
- package/dist/artifact-blocks/blocks/mockup/doc.d.ts +24 -0
- package/dist/artifact-blocks/blocks/mockup/doc.js +44 -0
- package/dist/artifact-blocks/blocks/mockup/sandbox.d.ts +21 -0
- package/dist/artifact-blocks/blocks/mockup/sandbox.js +27 -0
- package/dist/artifact-blocks/blocks/mockup/schema.d.ts +7 -0
- package/dist/artifact-blocks/blocks/mockup/schema.js +90 -0
- package/dist/artifact-blocks/blocks/mockup/types.d.ts +36 -0
- package/dist/artifact-blocks/blocks/mockup/types.js +17 -0
- package/dist/artifact-blocks/blocks/program/ProgramBlock.svelte +359 -0
- package/dist/artifact-blocks/blocks/program/ProgramBlock.svelte.d.ts +32 -0
- package/dist/artifact-blocks/blocks/program/block.d.ts +35 -0
- package/dist/artifact-blocks/blocks/program/block.js +68 -0
- package/dist/artifact-blocks/blocks/program/schema.d.ts +132 -0
- package/dist/artifact-blocks/blocks/program/schema.js +268 -0
- package/dist/artifact-blocks/blocks/stats/StatsBlock.svelte +315 -0
- package/dist/artifact-blocks/blocks/stats/StatsBlock.svelte.d.ts +24 -0
- package/dist/artifact-blocks/blocks/stats/block.d.ts +7 -0
- package/dist/artifact-blocks/blocks/stats/block.js +49 -0
- package/dist/artifact-blocks/blocks/stats/schema.d.ts +82 -0
- package/dist/artifact-blocks/blocks/stats/schema.js +43 -0
- package/dist/artifact-blocks/blocks/stats/thumb.d.ts +2 -0
- package/dist/artifact-blocks/blocks/stats/thumb.js +102 -0
- package/dist/artifact-blocks/blocks/table/TableBlock.svelte +490 -0
- package/dist/artifact-blocks/blocks/table/TableBlock.svelte.d.ts +28 -0
- package/dist/artifact-blocks/blocks/table/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/table/block.js +100 -0
- package/dist/artifact-blocks/blocks/table/schema.d.ts +143 -0
- package/dist/artifact-blocks/blocks/table/schema.js +278 -0
- package/dist/artifact-blocks/blocks/timeline/TimelineBlock.svelte +347 -0
- package/dist/artifact-blocks/blocks/timeline/TimelineBlock.svelte.d.ts +42 -0
- package/dist/artifact-blocks/blocks/timeline/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/timeline/block.js +96 -0
- package/dist/artifact-blocks/blocks/timeline/constants.d.ts +26 -0
- package/dist/artifact-blocks/blocks/timeline/constants.js +27 -0
- package/dist/artifact-blocks/blocks/timeline/schema.d.ts +102 -0
- package/dist/artifact-blocks/blocks/timeline/schema.js +405 -0
- package/dist/artifact-blocks/blocks/timeline/thumb.d.ts +2 -0
- package/dist/artifact-blocks/blocks/timeline/thumb.js +117 -0
- package/dist/artifact-blocks/blocks/timeline/types.d.ts +66 -0
- package/dist/artifact-blocks/blocks/timeline/types.js +1 -0
- package/dist/artifact-blocks/blocks/transcript/TranscriptBlock.svelte +169 -0
- package/dist/artifact-blocks/blocks/transcript/TranscriptBlock.svelte.d.ts +26 -0
- package/dist/artifact-blocks/blocks/transcript/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/transcript/block.js +86 -0
- package/dist/artifact-blocks/blocks/transcript/schema.d.ts +114 -0
- package/dist/artifact-blocks/blocks/transcript/schema.js +126 -0
- package/dist/artifact-blocks/builtins.d.ts +40 -0
- package/dist/artifact-blocks/builtins.js +22 -0
- package/dist/artifact-blocks/contractBlocks.d.ts +92 -0
- package/dist/artifact-blocks/contractBlocks.js +279 -0
- package/dist/artifact-blocks/history.d.ts +140 -0
- package/dist/artifact-blocks/history.js +363 -0
- package/dist/artifact-blocks/index.d.ts +40 -0
- package/dist/artifact-blocks/index.js +46 -0
- package/dist/artifact-blocks/listen/context.d.ts +30 -0
- package/dist/artifact-blocks/listen/context.js +30 -0
- package/dist/artifact-blocks/liveData.d.ts +78 -0
- package/dist/artifact-blocks/liveData.js +137 -0
- package/dist/artifact-blocks/liveDataPoller.d.ts +41 -0
- package/dist/artifact-blocks/liveDataPoller.js +140 -0
- package/dist/artifact-blocks/openNav.d.ts +46 -0
- package/dist/artifact-blocks/openNav.js +106 -0
- package/dist/artifact-blocks/pageReviewKeys.d.ts +17 -0
- package/dist/artifact-blocks/pageReviewKeys.js +115 -0
- package/dist/artifact-blocks/params.d.ts +98 -0
- package/dist/artifact-blocks/params.js +159 -0
- package/dist/artifact-blocks/registry.d.ts +27 -0
- package/dist/artifact-blocks/registry.js +83 -0
- package/dist/artifact-blocks/review/BlockIcon.svelte +99 -0
- package/dist/artifact-blocks/review/BlockIcon.svelte.d.ts +17 -0
- package/dist/artifact-blocks/review/BulkRejectForm.svelte +94 -0
- package/dist/artifact-blocks/review/BulkRejectForm.svelte.d.ts +11 -0
- package/dist/artifact-blocks/review/BulkUndoBar.svelte +40 -0
- package/dist/artifact-blocks/review/BulkUndoBar.svelte.d.ts +9 -0
- package/dist/artifact-blocks/review/ItemNote.svelte +193 -0
- package/dist/artifact-blocks/review/ItemNote.svelte.d.ts +33 -0
- package/dist/artifact-blocks/review/NoteToggle.svelte +52 -0
- package/dist/artifact-blocks/review/NoteToggle.svelte.d.ts +12 -0
- package/dist/artifact-blocks/review/TeamChip.svelte +71 -0
- package/dist/artifact-blocks/review/TeamChip.svelte.d.ts +8 -0
- package/dist/artifact-blocks/review/attachments.d.ts +10 -0
- package/dist/artifact-blocks/review/attachments.js +37 -0
- package/dist/artifact-blocks/review/bulk.d.ts +52 -0
- package/dist/artifact-blocks/review/bulk.js +61 -0
- package/dist/artifact-blocks/review/itemReview.d.ts +33 -0
- package/dist/artifact-blocks/review/itemReview.js +112 -0
- package/dist/artifact-blocks/review/roundLines.d.ts +14 -0
- package/dist/artifact-blocks/review/roundLines.js +20 -0
- package/dist/artifact-blocks/review/rounds.d.ts +86 -0
- package/dist/artifact-blocks/review/rounds.js +302 -0
- package/dist/artifact-blocks/review/saver.d.ts +23 -0
- package/dist/artifact-blocks/review/saver.js +48 -0
- package/dist/artifact-blocks/review/team.d.ts +31 -0
- package/dist/artifact-blocks/review/team.js +42 -0
- package/dist/artifact-blocks/review/visualOrder.d.ts +29 -0
- package/dist/artifact-blocks/review/visualOrder.js +66 -0
- package/dist/artifact-blocks/review.d.ts +180 -0
- package/dist/artifact-blocks/review.js +716 -0
- package/dist/artifact-blocks/thumb-kit.d.ts +80 -0
- package/dist/artifact-blocks/thumb-kit.js +149 -0
- package/dist/artifact-blocks/types.d.ts +513 -0
- package/dist/artifact-blocks/types.js +1 -0
- package/dist/components/Button.svelte +8 -0
- package/dist/components/TextInput.svelte +39 -6
- package/dist/components/TextInput.svelte.d.ts +15 -7
- package/dist/components/basic/Checkbox.svelte +52 -14
- package/dist/components/basic/Checkbox.svelte.d.ts +11 -1
- package/package.json +11 -2
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Params schema for the program block (media + chapters + per-chapter
|
|
3
|
+
* visuals). Imported by block.ts (def), ProgramBlock.svelte (props typing)
|
|
4
|
+
* and the tests — keeps them cycle-free from BlockRenderer.
|
|
5
|
+
*
|
|
6
|
+
* The nested visual is validated through the registry like a top-level
|
|
7
|
+
* block, but the lookup happens LAZILY, inside the refinement closures:
|
|
8
|
+
* registry.ts seeds its catalog from the group barrels, and this schema is
|
|
9
|
+
* loaded through them (registry → builtins → group-content → program/block
|
|
10
|
+
* → schema.ts), so
|
|
11
|
+
* nothing here may touch the registry at module-initialisation time. By
|
|
12
|
+
* refinement time the registry's `defs` map is fully built.
|
|
13
|
+
*
|
|
14
|
+
* The mapping helpers are pure and unit-tested: they turn block params into
|
|
15
|
+
* the jatui VideoPlayer contracts.
|
|
16
|
+
*/
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
import type { VideoTranscriptSegment } from "../../../components/VideoPlayer.svelte";
|
|
19
|
+
/** Chapters per program — a morning brief, not an audiobook. */
|
|
20
|
+
export declare const CHAPTERS_MAX = 30;
|
|
21
|
+
/** Rail status dot: good→success, warn→warning, bad→error, info→info. */
|
|
22
|
+
declare const chapterStatusSchema: z.ZodEnum<{
|
|
23
|
+
warn: "warn";
|
|
24
|
+
info: "info";
|
|
25
|
+
good: "good";
|
|
26
|
+
bad: "bad";
|
|
27
|
+
}>;
|
|
28
|
+
export type ChapterStatus = z.infer<typeof chapterStatusSchema>;
|
|
29
|
+
/**
|
|
30
|
+
* The rail fields this block hands the player, structurally the jatui ≥0.32
|
|
31
|
+
* `VideoChapter` (mos-777hj patch) — written here so the block type-checks
|
|
32
|
+
* against the installed 0.31.x too, where the fields are simply ignored and
|
|
33
|
+
* the rail stays off. One cast site (ProgramBlock) bridges the two.
|
|
34
|
+
*/
|
|
35
|
+
export interface RailChapterData {
|
|
36
|
+
startSec: number;
|
|
37
|
+
/** null = derive at the player (next start / duration). */
|
|
38
|
+
endSec: number | null;
|
|
39
|
+
title: string;
|
|
40
|
+
summary: string | null;
|
|
41
|
+
status: "info" | "success" | "warning" | "error" | null;
|
|
42
|
+
}
|
|
43
|
+
/** Panel status dot classes: the same dot the rail row wears, so a chapter's
|
|
44
|
+
* status reads identically in both places. */
|
|
45
|
+
export declare const STATUS_DOT: Record<ChapterStatus, string>;
|
|
46
|
+
/** Words for the status dot (screen readers; the dot alone is colour). */
|
|
47
|
+
export declare const STATUS_LABEL: Record<ChapterStatus, string>;
|
|
48
|
+
declare const segmentSchema: z.ZodObject<{
|
|
49
|
+
start: z.ZodNumber;
|
|
50
|
+
end: z.ZodNumber;
|
|
51
|
+
speaker: z.ZodString;
|
|
52
|
+
text: z.ZodString;
|
|
53
|
+
chapter: z.ZodOptional<z.ZodString>;
|
|
54
|
+
}, z.core.$strip>;
|
|
55
|
+
declare const chapterSchema: z.ZodObject<{
|
|
56
|
+
id: z.ZodString;
|
|
57
|
+
title: z.ZodString;
|
|
58
|
+
start: z.ZodNumber;
|
|
59
|
+
end: z.ZodOptional<z.ZodNumber>;
|
|
60
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
61
|
+
warn: "warn";
|
|
62
|
+
info: "info";
|
|
63
|
+
good: "good";
|
|
64
|
+
bad: "bad";
|
|
65
|
+
}>>;
|
|
66
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
67
|
+
detail: z.ZodOptional<z.ZodString>;
|
|
68
|
+
visual: z.ZodOptional<z.ZodObject<{
|
|
69
|
+
type: z.ZodString;
|
|
70
|
+
params: z.ZodUnknown;
|
|
71
|
+
}, z.core.$strip>>;
|
|
72
|
+
}, z.core.$strip>;
|
|
73
|
+
declare const mediaSchema: z.ZodObject<{
|
|
74
|
+
src: z.ZodString;
|
|
75
|
+
type: z.ZodOptional<z.ZodEnum<{
|
|
76
|
+
audio: "audio";
|
|
77
|
+
video: "video";
|
|
78
|
+
}>>;
|
|
79
|
+
poster: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
80
|
+
}, z.core.$strip>;
|
|
81
|
+
export declare const programSchema: z.ZodObject<{
|
|
82
|
+
title: z.ZodOptional<z.ZodString>;
|
|
83
|
+
note: z.ZodOptional<z.ZodString>;
|
|
84
|
+
media: z.ZodObject<{
|
|
85
|
+
src: z.ZodString;
|
|
86
|
+
type: z.ZodOptional<z.ZodEnum<{
|
|
87
|
+
audio: "audio";
|
|
88
|
+
video: "video";
|
|
89
|
+
}>>;
|
|
90
|
+
poster: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
91
|
+
}, z.core.$strip>;
|
|
92
|
+
segments: z.ZodArray<z.ZodObject<{
|
|
93
|
+
start: z.ZodNumber;
|
|
94
|
+
end: z.ZodNumber;
|
|
95
|
+
speaker: z.ZodString;
|
|
96
|
+
text: z.ZodString;
|
|
97
|
+
chapter: z.ZodOptional<z.ZodString>;
|
|
98
|
+
}, z.core.$strip>>;
|
|
99
|
+
chapters: z.ZodArray<z.ZodObject<{
|
|
100
|
+
id: z.ZodString;
|
|
101
|
+
title: z.ZodString;
|
|
102
|
+
start: z.ZodNumber;
|
|
103
|
+
end: z.ZodOptional<z.ZodNumber>;
|
|
104
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
105
|
+
warn: "warn";
|
|
106
|
+
info: "info";
|
|
107
|
+
good: "good";
|
|
108
|
+
bad: "bad";
|
|
109
|
+
}>>;
|
|
110
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
111
|
+
detail: z.ZodOptional<z.ZodString>;
|
|
112
|
+
visual: z.ZodOptional<z.ZodObject<{
|
|
113
|
+
type: z.ZodString;
|
|
114
|
+
params: z.ZodUnknown;
|
|
115
|
+
}, z.core.$strip>>;
|
|
116
|
+
}, z.core.$strip>>;
|
|
117
|
+
}, z.core.$strip>;
|
|
118
|
+
export type ProgramSegment = z.infer<typeof segmentSchema>;
|
|
119
|
+
export type ProgramChapter = z.infer<typeof chapterSchema>;
|
|
120
|
+
export type ProgramMedia = z.infer<typeof mediaSchema>;
|
|
121
|
+
export type ProgramParams = z.infer<typeof programSchema>;
|
|
122
|
+
/**
|
|
123
|
+
* Chapters → the player's chapter data, sorted by start. An explicit end
|
|
124
|
+
* wins; otherwise the last tagged segment's end; otherwise null (the player
|
|
125
|
+
* derives from the next chapter's start / media duration).
|
|
126
|
+
*/
|
|
127
|
+
export declare function toVideoChapters(chapters: ProgramChapter[], segments: ProgramSegment[]): RailChapterData[];
|
|
128
|
+
/** Segments → VideoTranscriptSegment[] (the transcript block's mapping). */
|
|
129
|
+
export declare function toVideoSegments(segments: ProgramSegment[]): VideoTranscriptSegment[];
|
|
130
|
+
/** The chapter active at `t` (last chapter with start ≤ t), or null. */
|
|
131
|
+
export declare function chapterAt(chapters: ProgramChapter[], t: number): ProgramChapter | null;
|
|
132
|
+
export {};
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Params schema for the program block (media + chapters + per-chapter
|
|
3
|
+
* visuals). Imported by block.ts (def), ProgramBlock.svelte (props typing)
|
|
4
|
+
* and the tests — keeps them cycle-free from BlockRenderer.
|
|
5
|
+
*
|
|
6
|
+
* The nested visual is validated through the registry like a top-level
|
|
7
|
+
* block, but the lookup happens LAZILY, inside the refinement closures:
|
|
8
|
+
* registry.ts seeds its catalog from the group barrels, and this schema is
|
|
9
|
+
* loaded through them (registry → builtins → group-content → program/block
|
|
10
|
+
* → schema.ts), so
|
|
11
|
+
* nothing here may touch the registry at module-initialisation time. By
|
|
12
|
+
* refinement time the registry's `defs` map is fully built.
|
|
13
|
+
*
|
|
14
|
+
* The mapping helpers are pure and unit-tested: they turn block params into
|
|
15
|
+
* the jatui VideoPlayer contracts.
|
|
16
|
+
*/
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
import { urlSchema, optionalUrlSchema } from "../../params.js";
|
|
19
|
+
import { blockDef } from "../../registry.js";
|
|
20
|
+
import { toVideoSegments as transcriptToVideoSegments } from "../transcript/schema.js";
|
|
21
|
+
/** Chapters per program — a morning brief, not an audiobook. */
|
|
22
|
+
export const CHAPTERS_MAX = 30;
|
|
23
|
+
/** Chapter ids are anchors: #chapter-<id> deep links + rail nav ids. */
|
|
24
|
+
const CHAPTER_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;
|
|
25
|
+
const SUMMARY_MAX = 200;
|
|
26
|
+
/** detail is markdown rendered through the shared sanitized renderer. */
|
|
27
|
+
const DETAIL_MAX = 20000;
|
|
28
|
+
/** Rail status dot: good→success, warn→warning, bad→error, info→info. */
|
|
29
|
+
const chapterStatusSchema = z.enum(["good", "warn", "bad", "info"]);
|
|
30
|
+
/** MOS status → rail dot tone (a missing status renders no dot). */
|
|
31
|
+
function railToneOf(status) {
|
|
32
|
+
switch (status) {
|
|
33
|
+
case "good":
|
|
34
|
+
return "success";
|
|
35
|
+
case "warn":
|
|
36
|
+
return "warning";
|
|
37
|
+
case "bad":
|
|
38
|
+
return "error";
|
|
39
|
+
case "info":
|
|
40
|
+
return "info";
|
|
41
|
+
default:
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Panel status dot classes: the same dot the rail row wears, so a chapter's
|
|
46
|
+
* status reads identically in both places. */
|
|
47
|
+
export const STATUS_DOT = {
|
|
48
|
+
good: "bg-success",
|
|
49
|
+
warn: "bg-warning",
|
|
50
|
+
bad: "bg-error",
|
|
51
|
+
info: "bg-info",
|
|
52
|
+
};
|
|
53
|
+
/** Words for the status dot (screen readers; the dot alone is colour). */
|
|
54
|
+
export const STATUS_LABEL = {
|
|
55
|
+
good: "On track",
|
|
56
|
+
warn: "Needs attention",
|
|
57
|
+
bad: "Problem",
|
|
58
|
+
info: "For information",
|
|
59
|
+
};
|
|
60
|
+
const segmentSchema = z
|
|
61
|
+
.object({
|
|
62
|
+
/** Segment start, seconds from media start (floats fine). */
|
|
63
|
+
start: z.number().min(0),
|
|
64
|
+
/** Segment end, seconds — must be greater than start. */
|
|
65
|
+
end: z.number().min(0),
|
|
66
|
+
/** Speaker name as shown in the transcript pane. */
|
|
67
|
+
speaker: z.string().min(1, "speaker is required").max(80),
|
|
68
|
+
/** What was said (rendered as text — never HTML). */
|
|
69
|
+
text: z.string().min(1, "segment text is required").max(2000),
|
|
70
|
+
/**
|
|
71
|
+
* The chapter this line belongs to (a chapter `id`). When set, the
|
|
72
|
+
* chapter's end derives from the LAST such segment, so a program needs
|
|
73
|
+
* no hand-timed `end`s unless it wants them.
|
|
74
|
+
*/
|
|
75
|
+
chapter: z.string().optional(),
|
|
76
|
+
})
|
|
77
|
+
.refine((s) => s.end > s.start, {
|
|
78
|
+
message: "segment end must be greater than start",
|
|
79
|
+
path: ["end"],
|
|
80
|
+
});
|
|
81
|
+
const chapterSchema = z.object({
|
|
82
|
+
/** Stable id — the rail row's nav id and the #chapter-<id> deep-link key. */
|
|
83
|
+
id: z
|
|
84
|
+
.string()
|
|
85
|
+
.regex(CHAPTER_ID_RE, "chapter id must be lowercase a-z0-9_- (max 64)"),
|
|
86
|
+
/** Chapter title (the rail row's headline). */
|
|
87
|
+
title: z.string().min(1, "chapter title is required").max(120),
|
|
88
|
+
/** Chapter start, seconds from media start. */
|
|
89
|
+
start: z.number().min(0),
|
|
90
|
+
/**
|
|
91
|
+
* Chapter end, seconds. Absent: derived from the next chapter's start
|
|
92
|
+
* (the last runs to the media duration), or from the end of the last
|
|
93
|
+
* segment tagged `chapter: <this id>` — whichever is smaller.
|
|
94
|
+
*/
|
|
95
|
+
end: z.number().min(0).optional(),
|
|
96
|
+
/** Rail status dot. */
|
|
97
|
+
status: chapterStatusSchema.optional(),
|
|
98
|
+
/** One line shown in the rail row under the title. */
|
|
99
|
+
summary: z.string().max(SUMMARY_MAX).optional(),
|
|
100
|
+
/** Markdown rendered in the visual panel (sanitized, links https-only). */
|
|
101
|
+
detail: z.string().max(DETAIL_MAX).optional(),
|
|
102
|
+
/**
|
|
103
|
+
* The chapter's accompanying visual: ONE nested block instance of ANY
|
|
104
|
+
* registered type except `program` (recursion) and a scripted `mockup`
|
|
105
|
+
* (allowScripts). Validated through the registry like a top-level block;
|
|
106
|
+
* errors report at `chapters[i].visual.*`. Counts toward the 2MB spec
|
|
107
|
+
* cap like any other params.
|
|
108
|
+
*/
|
|
109
|
+
visual: z
|
|
110
|
+
.object({
|
|
111
|
+
type: z.string().min(1).max(64),
|
|
112
|
+
params: z.unknown(),
|
|
113
|
+
})
|
|
114
|
+
.optional(),
|
|
115
|
+
});
|
|
116
|
+
const mediaSchema = z.object({
|
|
117
|
+
/** https:// or root-relative media URL (MOS storage or external). */
|
|
118
|
+
src: urlSchema,
|
|
119
|
+
/** "audio" (the brief) or "video". Default "audio". */
|
|
120
|
+
type: z.enum(["audio", "video"]).optional(),
|
|
121
|
+
/** Poster image for video (unused for audio). */
|
|
122
|
+
poster: optionalUrlSchema,
|
|
123
|
+
});
|
|
124
|
+
export const programSchema = z
|
|
125
|
+
.object({
|
|
126
|
+
/** Heading above the player. */
|
|
127
|
+
title: z.string().max(120).optional(),
|
|
128
|
+
/** One-line context under the title. */
|
|
129
|
+
note: z.string().max(500).optional(),
|
|
130
|
+
media: mediaSchema,
|
|
131
|
+
/** Timed speaker segments (the transcript). */
|
|
132
|
+
segments: z.array(segmentSchema).min(1, "at least one segment").max(3000),
|
|
133
|
+
chapters: z
|
|
134
|
+
.array(chapterSchema)
|
|
135
|
+
.min(1, "at least one chapter")
|
|
136
|
+
.max(CHAPTERS_MAX, `at most ${CHAPTERS_MAX} chapters`),
|
|
137
|
+
})
|
|
138
|
+
.superRefine((params, ctx) => {
|
|
139
|
+
// ── chapter ids are unique (they are anchors) ──────────────────────
|
|
140
|
+
const seen = new Set();
|
|
141
|
+
params.chapters.forEach((ch, i) => {
|
|
142
|
+
if (seen.has(ch.id)) {
|
|
143
|
+
ctx.addIssue({
|
|
144
|
+
code: "custom",
|
|
145
|
+
path: ["chapters", i, "id"],
|
|
146
|
+
message: `duplicate chapter id "${ch.id}"`,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
seen.add(ch.id);
|
|
150
|
+
});
|
|
151
|
+
// ── segments may only reference a declared chapter id ─────────────
|
|
152
|
+
params.segments.forEach((seg, i) => {
|
|
153
|
+
if (seg.chapter != null && !seen.has(seg.chapter)) {
|
|
154
|
+
ctx.addIssue({
|
|
155
|
+
code: "custom",
|
|
156
|
+
path: ["segments", i, "chapter"],
|
|
157
|
+
message: `unknown chapter id "${seg.chapter}"`,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
// ── an explicit end must sit after its start ───────────────────────
|
|
162
|
+
params.chapters.forEach((ch, i) => {
|
|
163
|
+
if (ch.end != null && ch.end <= ch.start) {
|
|
164
|
+
ctx.addIssue({
|
|
165
|
+
code: "custom",
|
|
166
|
+
path: ["chapters", i, "end"],
|
|
167
|
+
message: "chapter end must be greater than start",
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
// ── nested visual: validated through the registry (lazily) ─────────
|
|
172
|
+
params.chapters.forEach((ch, i) => {
|
|
173
|
+
const visual = ch.visual;
|
|
174
|
+
if (!visual)
|
|
175
|
+
return;
|
|
176
|
+
const base = ["chapters", i, "visual"];
|
|
177
|
+
if (visual.type === "program") {
|
|
178
|
+
ctx.addIssue({
|
|
179
|
+
code: "custom",
|
|
180
|
+
path: [...base, "type"],
|
|
181
|
+
message: "a program cannot nest a program",
|
|
182
|
+
});
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (visual.type === "mockup" && isScriptedMockup(visual.params)) {
|
|
186
|
+
ctx.addIssue({
|
|
187
|
+
code: "custom",
|
|
188
|
+
path: [...base, "params"],
|
|
189
|
+
message: "a scripted mockup cannot be a chapter visual — nest a plain mockup or another block",
|
|
190
|
+
});
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const def = blockDef(visual.type);
|
|
194
|
+
if (!def) {
|
|
195
|
+
ctx.addIssue({
|
|
196
|
+
code: "custom",
|
|
197
|
+
path: [...base, "type"],
|
|
198
|
+
message: "unknown visual block type (registered types only)",
|
|
199
|
+
});
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const parsed = def.schema.safeParse(visual.params);
|
|
203
|
+
if (!parsed.success) {
|
|
204
|
+
for (const issue of parsed.error.issues.slice(0, 5)) {
|
|
205
|
+
ctx.addIssue({
|
|
206
|
+
code: "custom",
|
|
207
|
+
path: [...base, ...(issue.path.length ? issue.path : ["params"])],
|
|
208
|
+
message: issue.message,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
/** True when a mockup params object turns scripts on. */
|
|
215
|
+
function isScriptedMockup(params) {
|
|
216
|
+
return (typeof params === "object" &&
|
|
217
|
+
params !== null &&
|
|
218
|
+
params.allowScripts === true);
|
|
219
|
+
}
|
|
220
|
+
// ── mapping to the jatui VideoPlayer contracts ─────────────────────────────
|
|
221
|
+
/** End of the LAST segment tagged with `chapterId` (null when none). */
|
|
222
|
+
function lastTaggedSegmentEnd(segments, chapterId) {
|
|
223
|
+
let end = null;
|
|
224
|
+
for (const s of segments) {
|
|
225
|
+
if (s.chapter === chapterId && (end === null || s.end > end))
|
|
226
|
+
end = s.end;
|
|
227
|
+
}
|
|
228
|
+
return end;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Chapters → the player's chapter data, sorted by start. An explicit end
|
|
232
|
+
* wins; otherwise the last tagged segment's end; otherwise null (the player
|
|
233
|
+
* derives from the next chapter's start / media duration).
|
|
234
|
+
*/
|
|
235
|
+
export function toVideoChapters(chapters, segments) {
|
|
236
|
+
return chapters
|
|
237
|
+
.slice()
|
|
238
|
+
.sort((a, b) => a.start - b.start)
|
|
239
|
+
.map((c) => ({
|
|
240
|
+
startSec: c.start,
|
|
241
|
+
endSec: c.end ?? lastTaggedSegmentEnd(segments, c.id),
|
|
242
|
+
title: c.title,
|
|
243
|
+
summary: c.summary ?? null,
|
|
244
|
+
status: railToneOf(c.status),
|
|
245
|
+
}));
|
|
246
|
+
}
|
|
247
|
+
/** Segments → VideoTranscriptSegment[] (the transcript block's mapping). */
|
|
248
|
+
export function toVideoSegments(segments) {
|
|
249
|
+
return transcriptToVideoSegments(segments.map((s) => ({
|
|
250
|
+
start: s.start,
|
|
251
|
+
end: s.end,
|
|
252
|
+
speaker: s.speaker,
|
|
253
|
+
text: s.text,
|
|
254
|
+
})));
|
|
255
|
+
}
|
|
256
|
+
/** The chapter active at `t` (last chapter with start ≤ t), or null. */
|
|
257
|
+
export function chapterAt(chapters, t) {
|
|
258
|
+
if (chapters.length === 0)
|
|
259
|
+
return null;
|
|
260
|
+
let hit = null;
|
|
261
|
+
for (const c of chapters.slice().sort((a, b) => a.start - b.start)) {
|
|
262
|
+
if (c.start <= t)
|
|
263
|
+
hit = c;
|
|
264
|
+
else
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
return hit;
|
|
268
|
+
}
|