@joewinke/jatui 0.37.0 → 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.
Files changed (266) hide show
  1. package/dist/artifact-blocks/AttachmentChip.svelte +66 -0
  2. package/dist/artifact-blocks/AttachmentChip.svelte.d.ts +7 -0
  3. package/dist/artifact-blocks/BlockComments.svelte +309 -0
  4. package/dist/artifact-blocks/BlockComments.svelte.d.ts +33 -0
  5. package/dist/artifact-blocks/BlockRenderer.svelte +674 -0
  6. package/dist/artifact-blocks/BlockRenderer.svelte.d.ts +55 -0
  7. package/dist/artifact-blocks/BlockVerdict.svelte +151 -0
  8. package/dist/artifact-blocks/BlockVerdict.svelte.d.ts +13 -0
  9. package/dist/artifact-blocks/BlocksArtifactView.svelte +1616 -0
  10. package/dist/artifact-blocks/BlocksArtifactView.svelte.d.ts +113 -0
  11. package/dist/artifact-blocks/CONTRACT.md +225 -0
  12. package/dist/artifact-blocks/CommentPill.svelte +49 -0
  13. package/dist/artifact-blocks/CommentPill.svelte.d.ts +16 -0
  14. package/dist/artifact-blocks/FoldedRounds.svelte +95 -0
  15. package/dist/artifact-blocks/FoldedRounds.svelte.d.ts +9 -0
  16. package/dist/artifact-blocks/Glyph.svelte +54 -0
  17. package/dist/artifact-blocks/Glyph.svelte.d.ts +10 -0
  18. package/dist/artifact-blocks/HistoryScrubber.svelte +500 -0
  19. package/dist/artifact-blocks/HistoryScrubber.svelte.d.ts +15 -0
  20. package/dist/artifact-blocks/Markdown.svelte +186 -0
  21. package/dist/artifact-blocks/Markdown.svelte.d.ts +30 -0
  22. package/dist/artifact-blocks/NoteComposer.svelte +31 -0
  23. package/dist/artifact-blocks/NoteComposer.svelte.d.ts +8 -0
  24. package/dist/artifact-blocks/PlainComposer.svelte +200 -0
  25. package/dist/artifact-blocks/PlainComposer.svelte.d.ts +15 -0
  26. package/dist/artifact-blocks/SectionTools.svelte +102 -0
  27. package/dist/artifact-blocks/SectionTools.svelte.d.ts +19 -0
  28. package/dist/artifact-blocks/adapter.d.ts +13 -0
  29. package/dist/artifact-blocks/adapter.js +31 -0
  30. package/dist/artifact-blocks/autoSend.d.ts +49 -0
  31. package/dist/artifact-blocks/autoSend.js +103 -0
  32. package/dist/artifact-blocks/blocks/actions/ActionsBlock.svelte +557 -0
  33. package/dist/artifact-blocks/blocks/actions/ActionsBlock.svelte.d.ts +48 -0
  34. package/dist/artifact-blocks/blocks/actions/block.d.ts +8 -0
  35. package/dist/artifact-blocks/blocks/actions/block.js +74 -0
  36. package/dist/artifact-blocks/blocks/actions/requests.d.ts +62 -0
  37. package/dist/artifact-blocks/blocks/actions/requests.js +26 -0
  38. package/dist/artifact-blocks/blocks/actions/schema.d.ts +168 -0
  39. package/dist/artifact-blocks/blocks/actions/schema.js +253 -0
  40. package/dist/artifact-blocks/blocks/callout/CalloutBlock.svelte +779 -0
  41. package/dist/artifact-blocks/blocks/callout/CalloutBlock.svelte.d.ts +40 -0
  42. package/dist/artifact-blocks/blocks/callout/block.d.ts +7 -0
  43. package/dist/artifact-blocks/blocks/callout/block.js +39 -0
  44. package/dist/artifact-blocks/blocks/callout/schema.d.ts +72 -0
  45. package/dist/artifact-blocks/blocks/callout/schema.js +115 -0
  46. package/dist/artifact-blocks/blocks/chart/ChartBlock.svelte +875 -0
  47. package/dist/artifact-blocks/blocks/chart/ChartBlock.svelte.d.ts +59 -0
  48. package/dist/artifact-blocks/blocks/chart/block.d.ts +9 -0
  49. package/dist/artifact-blocks/blocks/chart/block.js +70 -0
  50. package/dist/artifact-blocks/blocks/chart/schema.d.ts +171 -0
  51. package/dist/artifact-blocks/blocks/chart/schema.js +498 -0
  52. package/dist/artifact-blocks/blocks/chart/thumb.d.ts +2 -0
  53. package/dist/artifact-blocks/blocks/chart/thumb.js +201 -0
  54. package/dist/artifact-blocks/blocks/checklist/ChecklistBlock.svelte +1048 -0
  55. package/dist/artifact-blocks/blocks/checklist/ChecklistBlock.svelte.d.ts +16 -0
  56. package/dist/artifact-blocks/blocks/checklist/Icon.svelte +105 -0
  57. package/dist/artifact-blocks/blocks/checklist/Icon.svelte.d.ts +17 -0
  58. package/dist/artifact-blocks/blocks/checklist/block.d.ts +10 -0
  59. package/dist/artifact-blocks/blocks/checklist/block.js +63 -0
  60. package/dist/artifact-blocks/blocks/checklist/itemReview.d.ts +16 -0
  61. package/dist/artifact-blocks/blocks/checklist/itemReview.js +63 -0
  62. package/dist/artifact-blocks/blocks/checklist/labels.d.ts +62 -0
  63. package/dist/artifact-blocks/blocks/checklist/labels.js +96 -0
  64. package/dist/artifact-blocks/blocks/checklist/retest.d.ts +43 -0
  65. package/dist/artifact-blocks/blocks/checklist/retest.js +68 -0
  66. package/dist/artifact-blocks/blocks/checklist/schema.d.ts +84 -0
  67. package/dist/artifact-blocks/blocks/checklist/schema.js +91 -0
  68. package/dist/artifact-blocks/blocks/code/CodeBlock.svelte +128 -0
  69. package/dist/artifact-blocks/blocks/code/CodeBlock.svelte.d.ts +12 -0
  70. package/dist/artifact-blocks/blocks/code/block.d.ts +8 -0
  71. package/dist/artifact-blocks/blocks/code/block.js +31 -0
  72. package/dist/artifact-blocks/blocks/code/highlight.d.ts +34 -0
  73. package/dist/artifact-blocks/blocks/code/highlight.js +280 -0
  74. package/dist/artifact-blocks/blocks/code/schema.d.ts +32 -0
  75. package/dist/artifact-blocks/blocks/code/schema.js +39 -0
  76. package/dist/artifact-blocks/blocks/collage/CollageBlock.svelte +290 -0
  77. package/dist/artifact-blocks/blocks/collage/CollageBlock.svelte.d.ts +29 -0
  78. package/dist/artifact-blocks/blocks/collage/block.d.ts +9 -0
  79. package/dist/artifact-blocks/blocks/collage/block.js +29 -0
  80. package/dist/artifact-blocks/blocks/collage/schema.d.ts +52 -0
  81. package/dist/artifact-blocks/blocks/collage/schema.js +86 -0
  82. package/dist/artifact-blocks/blocks/compare/CompareBlock.svelte +484 -0
  83. package/dist/artifact-blocks/blocks/compare/CompareBlock.svelte.d.ts +25 -0
  84. package/dist/artifact-blocks/blocks/compare/block.d.ts +9 -0
  85. package/dist/artifact-blocks/blocks/compare/block.js +32 -0
  86. package/dist/artifact-blocks/blocks/compare/schema.d.ts +74 -0
  87. package/dist/artifact-blocks/blocks/compare/schema.js +148 -0
  88. package/dist/artifact-blocks/blocks/diagram/DiagramBlock.svelte +392 -0
  89. package/dist/artifact-blocks/blocks/diagram/DiagramBlock.svelte.d.ts +30 -0
  90. package/dist/artifact-blocks/blocks/diagram/block.d.ts +9 -0
  91. package/dist/artifact-blocks/blocks/diagram/block.js +50 -0
  92. package/dist/artifact-blocks/blocks/diagram/constants.d.ts +48 -0
  93. package/dist/artifact-blocks/blocks/diagram/constants.js +53 -0
  94. package/dist/artifact-blocks/blocks/diagram/schema.d.ts +161 -0
  95. package/dist/artifact-blocks/blocks/diagram/schema.js +621 -0
  96. package/dist/artifact-blocks/blocks/diagram/thumb.d.ts +2 -0
  97. package/dist/artifact-blocks/blocks/diagram/thumb.js +157 -0
  98. package/dist/artifact-blocks/blocks/diagram/types.d.ts +74 -0
  99. package/dist/artifact-blocks/blocks/diagram/types.js +1 -0
  100. package/dist/artifact-blocks/blocks/diff/DiffBlock.svelte +81 -0
  101. package/dist/artifact-blocks/blocks/diff/DiffBlock.svelte.d.ts +10 -0
  102. package/dist/artifact-blocks/blocks/diff/block.d.ts +7 -0
  103. package/dist/artifact-blocks/blocks/diff/block.js +36 -0
  104. package/dist/artifact-blocks/blocks/diff/schema.d.ts +18 -0
  105. package/dist/artifact-blocks/blocks/diff/schema.js +35 -0
  106. package/dist/artifact-blocks/blocks/diff-review/DiffReviewBlock.svelte +1055 -0
  107. package/dist/artifact-blocks/blocks/diff-review/DiffReviewBlock.svelte.d.ts +5 -0
  108. package/dist/artifact-blocks/blocks/diff-review/block.d.ts +15 -0
  109. package/dist/artifact-blocks/blocks/diff-review/block.js +64 -0
  110. package/dist/artifact-blocks/blocks/diff-review/decisions.d.ts +57 -0
  111. package/dist/artifact-blocks/blocks/diff-review/decisions.js +80 -0
  112. package/dist/artifact-blocks/blocks/diff-review/schema.d.ts +13 -0
  113. package/dist/artifact-blocks/blocks/diff-review/schema.js +84 -0
  114. package/dist/artifact-blocks/blocks/diff-review/types.d.ts +35 -0
  115. package/dist/artifact-blocks/blocks/diff-review/types.js +1 -0
  116. package/dist/artifact-blocks/blocks/explainer/ExplainerBlock.svelte +145 -0
  117. package/dist/artifact-blocks/blocks/explainer/ExplainerBlock.svelte.d.ts +5 -0
  118. package/dist/artifact-blocks/blocks/explainer/block.d.ts +8 -0
  119. package/dist/artifact-blocks/blocks/explainer/block.js +21 -0
  120. package/dist/artifact-blocks/blocks/explainer/schema.d.ts +26 -0
  121. package/dist/artifact-blocks/blocks/explainer/schema.js +69 -0
  122. package/dist/artifact-blocks/blocks/group-content.d.ts +10 -0
  123. package/dist/artifact-blocks/blocks/group-content.js +16 -0
  124. package/dist/artifact-blocks/blocks/group-data.d.ts +10 -0
  125. package/dist/artifact-blocks/blocks/group-data.js +7 -0
  126. package/dist/artifact-blocks/blocks/group-review.d.ts +10 -0
  127. package/dist/artifact-blocks/blocks/group-review.js +12 -0
  128. package/dist/artifact-blocks/blocks/group-visual.d.ts +17 -0
  129. package/dist/artifact-blocks/blocks/group-visual.js +14 -0
  130. package/dist/artifact-blocks/blocks/map/MapBlock.svelte +413 -0
  131. package/dist/artifact-blocks/blocks/map/MapBlock.svelte.d.ts +53 -0
  132. package/dist/artifact-blocks/blocks/map/block.d.ts +9 -0
  133. package/dist/artifact-blocks/blocks/map/block.js +62 -0
  134. package/dist/artifact-blocks/blocks/map/schema.d.ts +123 -0
  135. package/dist/artifact-blocks/blocks/map/schema.js +113 -0
  136. package/dist/artifact-blocks/blocks/map/thumb.d.ts +2 -0
  137. package/dist/artifact-blocks/blocks/map/thumb.js +69 -0
  138. package/dist/artifact-blocks/blocks/markdown/MarkdownBlock.svelte +33 -0
  139. package/dist/artifact-blocks/blocks/markdown/MarkdownBlock.svelte.d.ts +15 -0
  140. package/dist/artifact-blocks/blocks/markdown/block.d.ts +7 -0
  141. package/dist/artifact-blocks/blocks/markdown/block.js +28 -0
  142. package/dist/artifact-blocks/blocks/markdown/render.d.ts +17 -0
  143. package/dist/artifact-blocks/blocks/markdown/render.js +115 -0
  144. package/dist/artifact-blocks/blocks/markdown/schema.d.ts +10 -0
  145. package/dist/artifact-blocks/blocks/markdown/schema.js +23 -0
  146. package/dist/artifact-blocks/blocks/media-picker/MediaPickerBlock.svelte +2112 -0
  147. package/dist/artifact-blocks/blocks/media-picker/MediaPickerBlock.svelte.d.ts +5 -0
  148. package/dist/artifact-blocks/blocks/media-picker/block.d.ts +24 -0
  149. package/dist/artifact-blocks/blocks/media-picker/block.js +137 -0
  150. package/dist/artifact-blocks/blocks/media-picker/choices.d.ts +28 -0
  151. package/dist/artifact-blocks/blocks/media-picker/choices.js +35 -0
  152. package/dist/artifact-blocks/blocks/media-picker/decisions.d.ts +51 -0
  153. package/dist/artifact-blocks/blocks/media-picker/decisions.js +75 -0
  154. package/dist/artifact-blocks/blocks/media-picker/schema.d.ts +7 -0
  155. package/dist/artifact-blocks/blocks/media-picker/schema.js +199 -0
  156. package/dist/artifact-blocks/blocks/media-picker/types.d.ts +92 -0
  157. package/dist/artifact-blocks/blocks/media-picker/types.js +1 -0
  158. package/dist/artifact-blocks/blocks/media-picker/versions.d.ts +51 -0
  159. package/dist/artifact-blocks/blocks/media-picker/versions.js +118 -0
  160. package/dist/artifact-blocks/blocks/mockup/MockupBlock.svelte +213 -0
  161. package/dist/artifact-blocks/blocks/mockup/MockupBlock.svelte.d.ts +5 -0
  162. package/dist/artifact-blocks/blocks/mockup/block.d.ts +26 -0
  163. package/dist/artifact-blocks/blocks/mockup/block.js +52 -0
  164. package/dist/artifact-blocks/blocks/mockup/doc.d.ts +24 -0
  165. package/dist/artifact-blocks/blocks/mockup/doc.js +44 -0
  166. package/dist/artifact-blocks/blocks/mockup/sandbox.d.ts +21 -0
  167. package/dist/artifact-blocks/blocks/mockup/sandbox.js +27 -0
  168. package/dist/artifact-blocks/blocks/mockup/schema.d.ts +7 -0
  169. package/dist/artifact-blocks/blocks/mockup/schema.js +90 -0
  170. package/dist/artifact-blocks/blocks/mockup/types.d.ts +36 -0
  171. package/dist/artifact-blocks/blocks/mockup/types.js +17 -0
  172. package/dist/artifact-blocks/blocks/program/ProgramBlock.svelte +359 -0
  173. package/dist/artifact-blocks/blocks/program/ProgramBlock.svelte.d.ts +32 -0
  174. package/dist/artifact-blocks/blocks/program/block.d.ts +35 -0
  175. package/dist/artifact-blocks/blocks/program/block.js +68 -0
  176. package/dist/artifact-blocks/blocks/program/schema.d.ts +132 -0
  177. package/dist/artifact-blocks/blocks/program/schema.js +268 -0
  178. package/dist/artifact-blocks/blocks/stats/StatsBlock.svelte +315 -0
  179. package/dist/artifact-blocks/blocks/stats/StatsBlock.svelte.d.ts +24 -0
  180. package/dist/artifact-blocks/blocks/stats/block.d.ts +7 -0
  181. package/dist/artifact-blocks/blocks/stats/block.js +49 -0
  182. package/dist/artifact-blocks/blocks/stats/schema.d.ts +82 -0
  183. package/dist/artifact-blocks/blocks/stats/schema.js +43 -0
  184. package/dist/artifact-blocks/blocks/stats/thumb.d.ts +2 -0
  185. package/dist/artifact-blocks/blocks/stats/thumb.js +102 -0
  186. package/dist/artifact-blocks/blocks/table/TableBlock.svelte +490 -0
  187. package/dist/artifact-blocks/blocks/table/TableBlock.svelte.d.ts +28 -0
  188. package/dist/artifact-blocks/blocks/table/block.d.ts +9 -0
  189. package/dist/artifact-blocks/blocks/table/block.js +100 -0
  190. package/dist/artifact-blocks/blocks/table/schema.d.ts +143 -0
  191. package/dist/artifact-blocks/blocks/table/schema.js +278 -0
  192. package/dist/artifact-blocks/blocks/timeline/TimelineBlock.svelte +347 -0
  193. package/dist/artifact-blocks/blocks/timeline/TimelineBlock.svelte.d.ts +42 -0
  194. package/dist/artifact-blocks/blocks/timeline/block.d.ts +9 -0
  195. package/dist/artifact-blocks/blocks/timeline/block.js +96 -0
  196. package/dist/artifact-blocks/blocks/timeline/constants.d.ts +26 -0
  197. package/dist/artifact-blocks/blocks/timeline/constants.js +27 -0
  198. package/dist/artifact-blocks/blocks/timeline/schema.d.ts +102 -0
  199. package/dist/artifact-blocks/blocks/timeline/schema.js +405 -0
  200. package/dist/artifact-blocks/blocks/timeline/thumb.d.ts +2 -0
  201. package/dist/artifact-blocks/blocks/timeline/thumb.js +117 -0
  202. package/dist/artifact-blocks/blocks/timeline/types.d.ts +66 -0
  203. package/dist/artifact-blocks/blocks/timeline/types.js +1 -0
  204. package/dist/artifact-blocks/blocks/transcript/TranscriptBlock.svelte +169 -0
  205. package/dist/artifact-blocks/blocks/transcript/TranscriptBlock.svelte.d.ts +26 -0
  206. package/dist/artifact-blocks/blocks/transcript/block.d.ts +9 -0
  207. package/dist/artifact-blocks/blocks/transcript/block.js +86 -0
  208. package/dist/artifact-blocks/blocks/transcript/schema.d.ts +114 -0
  209. package/dist/artifact-blocks/blocks/transcript/schema.js +126 -0
  210. package/dist/artifact-blocks/builtins.d.ts +40 -0
  211. package/dist/artifact-blocks/builtins.js +22 -0
  212. package/dist/artifact-blocks/contractBlocks.d.ts +92 -0
  213. package/dist/artifact-blocks/contractBlocks.js +279 -0
  214. package/dist/artifact-blocks/history.d.ts +140 -0
  215. package/dist/artifact-blocks/history.js +363 -0
  216. package/dist/artifact-blocks/index.d.ts +40 -0
  217. package/dist/artifact-blocks/index.js +46 -0
  218. package/dist/artifact-blocks/listen/context.d.ts +30 -0
  219. package/dist/artifact-blocks/listen/context.js +30 -0
  220. package/dist/artifact-blocks/liveData.d.ts +78 -0
  221. package/dist/artifact-blocks/liveData.js +137 -0
  222. package/dist/artifact-blocks/liveDataPoller.d.ts +41 -0
  223. package/dist/artifact-blocks/liveDataPoller.js +140 -0
  224. package/dist/artifact-blocks/openNav.d.ts +46 -0
  225. package/dist/artifact-blocks/openNav.js +106 -0
  226. package/dist/artifact-blocks/pageReviewKeys.d.ts +17 -0
  227. package/dist/artifact-blocks/pageReviewKeys.js +115 -0
  228. package/dist/artifact-blocks/params.d.ts +98 -0
  229. package/dist/artifact-blocks/params.js +159 -0
  230. package/dist/artifact-blocks/registry.d.ts +27 -0
  231. package/dist/artifact-blocks/registry.js +83 -0
  232. package/dist/artifact-blocks/review/BlockIcon.svelte +99 -0
  233. package/dist/artifact-blocks/review/BlockIcon.svelte.d.ts +17 -0
  234. package/dist/artifact-blocks/review/BulkRejectForm.svelte +94 -0
  235. package/dist/artifact-blocks/review/BulkRejectForm.svelte.d.ts +11 -0
  236. package/dist/artifact-blocks/review/BulkUndoBar.svelte +40 -0
  237. package/dist/artifact-blocks/review/BulkUndoBar.svelte.d.ts +9 -0
  238. package/dist/artifact-blocks/review/ItemNote.svelte +193 -0
  239. package/dist/artifact-blocks/review/ItemNote.svelte.d.ts +33 -0
  240. package/dist/artifact-blocks/review/NoteToggle.svelte +52 -0
  241. package/dist/artifact-blocks/review/NoteToggle.svelte.d.ts +12 -0
  242. package/dist/artifact-blocks/review/TeamChip.svelte +71 -0
  243. package/dist/artifact-blocks/review/TeamChip.svelte.d.ts +8 -0
  244. package/dist/artifact-blocks/review/attachments.d.ts +10 -0
  245. package/dist/artifact-blocks/review/attachments.js +37 -0
  246. package/dist/artifact-blocks/review/bulk.d.ts +52 -0
  247. package/dist/artifact-blocks/review/bulk.js +61 -0
  248. package/dist/artifact-blocks/review/itemReview.d.ts +33 -0
  249. package/dist/artifact-blocks/review/itemReview.js +112 -0
  250. package/dist/artifact-blocks/review/roundLines.d.ts +14 -0
  251. package/dist/artifact-blocks/review/roundLines.js +20 -0
  252. package/dist/artifact-blocks/review/rounds.d.ts +86 -0
  253. package/dist/artifact-blocks/review/rounds.js +302 -0
  254. package/dist/artifact-blocks/review/saver.d.ts +23 -0
  255. package/dist/artifact-blocks/review/saver.js +48 -0
  256. package/dist/artifact-blocks/review/team.d.ts +31 -0
  257. package/dist/artifact-blocks/review/team.js +42 -0
  258. package/dist/artifact-blocks/review/visualOrder.d.ts +29 -0
  259. package/dist/artifact-blocks/review/visualOrder.js +66 -0
  260. package/dist/artifact-blocks/review.d.ts +180 -0
  261. package/dist/artifact-blocks/review.js +716 -0
  262. package/dist/artifact-blocks/thumb-kit.d.ts +80 -0
  263. package/dist/artifact-blocks/thumb-kit.js +149 -0
  264. package/dist/artifact-blocks/types.d.ts +513 -0
  265. package/dist/artifact-blocks/types.js +1 -0
  266. package/package.json +11 -2
@@ -0,0 +1,169 @@
1
+ <script lang="ts">
2
+ /**
3
+ * TranscriptBlock — a call recording + its timed speaker transcript,
4
+ * block type "transcript". Built for voice-call review (soak calls).
5
+ *
6
+ * Renders through jatui's VideoPlayer, which owns the hard parts: the
7
+ * timeline band with diarized speaker colouring, click-to-seek transcript
8
+ * rows with active-line autoscroll, chapter flags, and the keyboard map.
9
+ * This block contributes the review layer on top:
10
+ *
11
+ * - flagged segments (`flag: {label, tone}`) become comment dots on the
12
+ * band — hover shows the flag label, clicking seeks to that instant —
13
+ * AND a "Flagged moments" list below the player whose rows seek the
14
+ * player to the line, so a reviewer can work the flags without
15
+ * scrubbing. (VideoPlayer's transcript pane has no per-row hook, so
16
+ * in-pane highlighting is not possible; the dots + the list are the
17
+ * highlight surface.)
18
+ * - ONE timeline: the band transport (`transport="band"`) carries
19
+ * play/pause, time, speed and volume, so the native control bar (a
20
+ * second timeline) never renders. Audio has no stage at all
21
+ * (`kind="audio"`); video keeps its stage at its intrinsic ratio.
22
+ * - resumeKey ties "continue where you left off" to this artifact block,
23
+ * so a review round survives closing the tab.
24
+ *
25
+ * Every string is rendered as text (the player's rows included); media is
26
+ * by URL (https:// or root-relative, validated by urlSchema).
27
+ */
28
+ import VideoPlayer from "../../../components/VideoPlayer.svelte"
29
+ import type { BlockProps } from "../../types.js"
30
+ import {
31
+ FLAG_DOT,
32
+ flagToneOf,
33
+ formatClock,
34
+ toFlagMarkers,
35
+ toVideoChapters,
36
+ toVideoSegments,
37
+ transcriptSchema,
38
+ type TranscriptParams,
39
+ type TranscriptSegment,
40
+ } from "./schema.js"
41
+ import SectionTools from "../../SectionTools.svelte"
42
+
43
+ let { params: rawParams, ctx }: BlockProps<TranscriptParams> = $props()
44
+
45
+ /** Parsed params (defaults filled); corrupt params → empty state. The host
46
+ * validates at publish, so this is belt-and-braces for direct mounts. */
47
+ const EMPTY_PARAMS: TranscriptParams = {
48
+ media: { src: "https://example.invalid/none.mp3", type: "audio" },
49
+ segments: [],
50
+ }
51
+ const parsed = $derived(transcriptSchema.safeParse(rawParams))
52
+ const params = $derived(parsed.success ? parsed.data : EMPTY_PARAMS)
53
+
54
+ const playable = $derived(params.segments.length > 0)
55
+ const isVideo = $derived(params.media.type === "video")
56
+ const vSegments = $derived(toVideoSegments(params.segments))
57
+ const vMarkers = $derived(toFlagMarkers(params.segments))
58
+ const vChapters = $derived(toVideoChapters(params.chapters))
59
+ const flagged = $derived(
60
+ params.segments
61
+ .filter((s) => s.flag != null)
62
+ .slice()
63
+ .sort((a, b) => a.start - b.start),
64
+ )
65
+ /** One voice: the flagged rows need no speaker name either. */
66
+ const multiSpeaker = $derived(
67
+ new Set(params.segments.map((s) => s.speaker)).size > 1,
68
+ )
69
+ const hasSrc = $derived(params.media.src !== "" && playable)
70
+
71
+ const resumeKey = $derived(`artifact:${ctx.artifactId}:${ctx.blockId}`)
72
+
73
+ /** The player instance (seekToTime is an export). */
74
+ let player: ReturnType<typeof VideoPlayer> | null = $state(null)
75
+
76
+ function jumpTo(seg: TranscriptSegment) {
77
+ player?.seekToTime?.(seg.start)
78
+ }
79
+ </script>
80
+
81
+ <section class="artifact-transcript w-full">
82
+ {#if params.title || params.note}
83
+ <header class="mb-3">
84
+ {#if params.title}
85
+ <div class="flex items-center gap-2">
86
+ <h2 class="min-w-0 text-base font-semibold text-base-content">
87
+ {params.title}
88
+ </h2>
89
+ <SectionTools {ctx} inline />
90
+ </div>
91
+ {/if}
92
+ {#if params.note}
93
+ <p class="mt-1 max-w-prose text-sm text-base-content/70">
94
+ {params.note}
95
+ </p>
96
+ {/if}
97
+ </header>
98
+ {/if}
99
+
100
+ {#if hasSrc}
101
+ <VideoPlayer
102
+ bind:this={player}
103
+ src={params.media.src}
104
+ kind={isVideo ? "video" : "audio"}
105
+ transport="band"
106
+ poster={params.media.poster || null}
107
+ aspect={null}
108
+ transcript={vSegments}
109
+ chapters={vChapters}
110
+ markers={vMarkers}
111
+ transcriptPosition={isVideo ? "side" : "below"}
112
+ transcriptMaxHeight="24rem"
113
+ {resumeKey}
114
+ />
115
+ {:else if !playable}
116
+ <p class="text-sm text-base-content/60">
117
+ No transcript segments published for this block.
118
+ </p>
119
+ {/if}
120
+
121
+ {#if flagged.length > 0}
122
+ <section class="mt-5" aria-labelledby="{ctx.blockId}-flags">
123
+ <h3
124
+ id="{ctx.blockId}-flags"
125
+ class="flex items-baseline gap-2 text-sm font-semibold text-base-content"
126
+ >
127
+ Flagged moments
128
+ <span class="text-xs font-normal tabular-nums text-base-content/60"
129
+ >{flagged.length}</span
130
+ >
131
+ </h3>
132
+ <ul class="mt-2 divide-y divide-base-content/10">
133
+ {#each flagged as f, i (i)}
134
+ <li>
135
+ <button
136
+ type="button"
137
+ class="transcript-flag flex w-full items-start gap-3 rounded-field px-2 py-2.5 text-left hover:bg-base-content/5 focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-primary"
138
+ disabled={!hasSrc}
139
+ onclick={() => jumpTo(f)}
140
+ >
141
+ <span
142
+ class="mt-1.5 size-2 shrink-0 rounded-full {FLAG_DOT[
143
+ flagToneOf(f)
144
+ ]}"
145
+ aria-hidden="true"
146
+ ></span>
147
+ <span class="min-w-0 flex-1">
148
+ <span class="flex flex-wrap items-baseline gap-x-2">
149
+ <span class="text-sm font-medium text-base-content"
150
+ >{f.flag!.label}</span
151
+ >
152
+ <span class="text-xs tabular-nums text-base-content/60"
153
+ >{formatClock(f.start)}{multiSpeaker
154
+ ? ` · ${f.speaker}`
155
+ : ""}</span
156
+ >
157
+ </span>
158
+ <span
159
+ class="mt-0.5 line-clamp-2 block max-w-prose text-sm text-base-content/70"
160
+ title={f.text}>{f.text}</span
161
+ >
162
+ </span>
163
+ </button>
164
+ </li>
165
+ {/each}
166
+ </ul>
167
+ </section>
168
+ {/if}
169
+ </section>
@@ -0,0 +1,26 @@
1
+ import type { BlockProps } from "../../types.js";
2
+ declare const TranscriptBlock: import("svelte").Component<BlockProps<{
3
+ media: {
4
+ src: string;
5
+ type?: "audio" | "video" | undefined;
6
+ poster?: string | undefined;
7
+ };
8
+ segments: {
9
+ start: number;
10
+ end: number;
11
+ speaker: string;
12
+ text: string;
13
+ flag?: {
14
+ label: string;
15
+ tone?: "error" | "warning" | "info" | "success" | "primary" | "secondary" | "neutral" | "accent" | undefined;
16
+ } | undefined;
17
+ }[];
18
+ title?: string | undefined;
19
+ note?: string | undefined;
20
+ chapters?: {
21
+ start: number;
22
+ title: string;
23
+ }[] | undefined;
24
+ }>, {}, "">;
25
+ type TranscriptBlock = ReturnType<typeof TranscriptBlock>;
26
+ export default TranscriptBlock;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * transcript block — a call recording (audio or video) with its timed
3
+ * speaker transcript: speaker colours, click-to-seek rows, chapters, and
4
+ * flagged review moments. Built for voice-call review (soak calls).
5
+ */
6
+ import type { ArtifactBlockDef } from "../../types.js";
7
+ import { type TranscriptParams } from "./schema.js";
8
+ declare const def: ArtifactBlockDef<TranscriptParams>;
9
+ export default def;
@@ -0,0 +1,86 @@
1
+ import TranscriptBlock from "./TranscriptBlock.svelte";
2
+ import { transcriptSchema } from "./schema.js";
3
+ const EXAMPLE = {
4
+ title: "Soak call: Ruby, day 6 (afternoon run)",
5
+ note: "Voice agent 'Ruby' calling the Cedar Park list. Reviewer: review the flagged moments first, then the full transcript.",
6
+ media: {
7
+ // A stable public sample so the catalog example is playable/demonstrable
8
+ // as published; real transcripts point at the tenant's own media URLs.
9
+ src: "https://upload.wikimedia.org/wikipedia/commons/c/c8/Example.ogg",
10
+ type: "audio",
11
+ },
12
+ chapters: [
13
+ { start: 0, title: "Opening + consent" },
14
+ { start: 64, title: "Address confirm loop" },
15
+ { start: 182, title: "Spellback + close" },
16
+ ],
17
+ segments: [
18
+ {
19
+ start: 0.4,
20
+ end: 5.1,
21
+ speaker: "Ruby",
22
+ text: "Hi, this is Ruby calling from Plumbers & Sons about your upcoming service visit. Is now a good time?",
23
+ },
24
+ {
25
+ start: 5.6,
26
+ end: 9.2,
27
+ speaker: "Customer",
28
+ text: "Uh, sure, what's this about?",
29
+ },
30
+ {
31
+ start: 9.6,
32
+ end: 18.4,
33
+ speaker: "Ruby",
34
+ text: "You're on the schedule for Thursday between ten and noon. I just need to confirm the service address.",
35
+ },
36
+ {
37
+ start: 19.0,
38
+ end: 27.3,
39
+ speaker: "Customer",
40
+ text: "It's fourteen twelve Coyote Lane, Round Rock.",
41
+ },
42
+ {
43
+ start: 28.0,
44
+ end: 41.5,
45
+ speaker: "Ruby",
46
+ text: "Got it, fourteen twelve Coyote Lane. And can I confirm the best number for a reminder text?",
47
+ flag: {
48
+ label: "Re-asked the address the customer already gave",
49
+ tone: "warning",
50
+ },
51
+ },
52
+ {
53
+ start: 42.1,
54
+ end: 46.0,
55
+ speaker: "Customer",
56
+ text: "That's the number you're calling, so yes.",
57
+ },
58
+ {
59
+ start: 47.0,
60
+ end: 59.9,
61
+ speaker: "Ruby",
62
+ text: "Perfect. You're all set for Thursday. Anything else I can help with today?",
63
+ flag: {
64
+ label: "Never confirmed the spellback it claimed",
65
+ tone: "error",
66
+ },
67
+ },
68
+ {
69
+ start: 60.2,
70
+ end: 63.5,
71
+ speaker: "Customer",
72
+ text: "No, that's it. Thanks.",
73
+ },
74
+ ],
75
+ };
76
+ const def = {
77
+ type: "transcript",
78
+ title: "Transcript (media + speakers)",
79
+ description: "A call recording with its timed speaker transcript — the review surface for voice calls (soak calls, dispatch QA, interview reels). media: {src (https:// or root-relative URL — MOS storage or external), type 'audio'|'video' (default audio), poster? for video}. segments: [{start, end (seconds, floats fine; end > start), speaker (name — drives the player's colour palette), text, flag?}] in any order (1–3000 lines, text ≤ 2000 chars). flag: {label, tone info|success|warning|error (default warning)} marks a reviewer-relevant line: it becomes a click-to-seek dot on the timeline (hover shows the label) AND a row in the 'Flagged moments' list under the player — that list is the review entry point, so flag sparse and specific ('Re-asked the address', 'Hallucinated a med name'), not every hesitation. chapters: [{start, title}] render as timeline flags for navigation. Speaker colours, click-to-seek transcript rows with active-line autoscroll, keyboard map and resume-where-you-left-off are all built in (jatui VideoPlayer) — do NOT add your own player or waveform. Tip: lead with title + note (who was called, what to listen for), flag 3–8 moments per call, and put the verdict in a callout block after this one.",
80
+ schema: transcriptSchema,
81
+ component: TranscriptBlock,
82
+ // mos-8fvt9: the section's Listen + comment sit on the heading row.
83
+ hostsTools: (p) => Boolean(p.title),
84
+ example: EXAMPLE,
85
+ };
86
+ export default def;
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Params schema for the transcript block (media + timed speaker segments).
3
+ * Imported by block.ts (def), TranscriptBlock.svelte (props typing) and the
4
+ * tests — keeps them cycle-free.
5
+ *
6
+ * The mapping helpers here are pure and unit-tested: they turn block params
7
+ * into the jatui VideoPlayer contracts (VideoTranscriptSegment, comment
8
+ * markers for flagged lines, chapters).
9
+ */
10
+ import { z } from "zod";
11
+ import type { VideoChapter, VideoMarker, VideoTranscriptSegment } from "../../../components/VideoPlayer.svelte";
12
+ import type { ToneToken } from "../../params.js";
13
+ export type FlagTone = ToneToken;
14
+ declare const segmentFlagSchema: z.ZodObject<{
15
+ label: z.ZodString;
16
+ tone: z.ZodOptional<z.ZodEnum<{
17
+ error: "error";
18
+ warning: "warning";
19
+ info: "info";
20
+ success: "success";
21
+ primary: "primary";
22
+ secondary: "secondary";
23
+ neutral: "neutral";
24
+ accent: "accent";
25
+ }>>;
26
+ }, z.core.$strip>;
27
+ declare const segmentSchema: z.ZodObject<{
28
+ start: z.ZodNumber;
29
+ end: z.ZodNumber;
30
+ speaker: z.ZodString;
31
+ text: z.ZodString;
32
+ flag: z.ZodOptional<z.ZodObject<{
33
+ label: z.ZodString;
34
+ tone: z.ZodOptional<z.ZodEnum<{
35
+ error: "error";
36
+ warning: "warning";
37
+ info: "info";
38
+ success: "success";
39
+ primary: "primary";
40
+ secondary: "secondary";
41
+ neutral: "neutral";
42
+ accent: "accent";
43
+ }>>;
44
+ }, z.core.$strip>>;
45
+ }, z.core.$strip>;
46
+ declare const chapterSchema: z.ZodObject<{
47
+ start: z.ZodNumber;
48
+ title: z.ZodString;
49
+ }, z.core.$strip>;
50
+ declare const mediaSchema: z.ZodObject<{
51
+ src: z.ZodString;
52
+ type: z.ZodOptional<z.ZodEnum<{
53
+ audio: "audio";
54
+ video: "video";
55
+ }>>;
56
+ poster: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
57
+ }, z.core.$strip>;
58
+ export declare const transcriptSchema: z.ZodObject<{
59
+ title: z.ZodOptional<z.ZodString>;
60
+ note: z.ZodOptional<z.ZodString>;
61
+ media: z.ZodObject<{
62
+ src: z.ZodString;
63
+ type: z.ZodOptional<z.ZodEnum<{
64
+ audio: "audio";
65
+ video: "video";
66
+ }>>;
67
+ poster: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
68
+ }, z.core.$strip>;
69
+ segments: z.ZodArray<z.ZodObject<{
70
+ start: z.ZodNumber;
71
+ end: z.ZodNumber;
72
+ speaker: z.ZodString;
73
+ text: z.ZodString;
74
+ flag: z.ZodOptional<z.ZodObject<{
75
+ label: z.ZodString;
76
+ tone: z.ZodOptional<z.ZodEnum<{
77
+ error: "error";
78
+ warning: "warning";
79
+ info: "info";
80
+ success: "success";
81
+ primary: "primary";
82
+ secondary: "secondary";
83
+ neutral: "neutral";
84
+ accent: "accent";
85
+ }>>;
86
+ }, z.core.$strip>>;
87
+ }, z.core.$strip>>;
88
+ chapters: z.ZodOptional<z.ZodArray<z.ZodObject<{
89
+ start: z.ZodNumber;
90
+ title: z.ZodString;
91
+ }, z.core.$strip>>>;
92
+ }, z.core.$strip>;
93
+ export type SegmentFlag = z.infer<typeof segmentFlagSchema>;
94
+ export type TranscriptSegment = z.infer<typeof segmentSchema>;
95
+ export type TranscriptChapter = z.infer<typeof chapterSchema>;
96
+ export type TranscriptMedia = z.infer<typeof mediaSchema>;
97
+ export type TranscriptParams = z.infer<typeof transcriptSchema>;
98
+ /** Flag tone with default filled. */
99
+ export declare function flagToneOf(s: TranscriptSegment): FlagTone;
100
+ /** Dot classes for flag tones. The flagged list carries the tone as a small
101
+ * dot next to the label (the label itself is body text), so the list reads
102
+ * as a quiet index of moments, not a wall of solid chips. */
103
+ export declare const FLAG_DOT: Record<FlagTone, string>;
104
+ /** Segments → VideoTranscriptSegment[] (speaker doubles as identity so the
105
+ * player's palette stays stable per name). */
106
+ export declare function toVideoSegments(segments: TranscriptSegment[]): VideoTranscriptSegment[];
107
+ /** Flagged segments → comment dots on the player timeline: hover shows the
108
+ * flag label, clicking seeks to the line's start. */
109
+ export declare function toFlagMarkers(segments: TranscriptSegment[]): VideoMarker[];
110
+ /** Chapters → VideoChapter[], sorted by start (the band draws them in order). */
111
+ export declare function toVideoChapters(chapters: TranscriptChapter[] | undefined): VideoChapter[];
112
+ /** m:ss (h:mm:ss past an hour), for the flagged list and time captions. */
113
+ export declare function formatClock(sec: number): string;
114
+ export {};
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Params schema for the transcript block (media + timed speaker segments).
3
+ * Imported by block.ts (def), TranscriptBlock.svelte (props typing) and the
4
+ * tests — keeps them cycle-free.
5
+ *
6
+ * The mapping helpers here are pure and unit-tested: they turn block params
7
+ * into the jatui VideoPlayer contracts (VideoTranscriptSegment, comment
8
+ * markers for flagged lines, chapters).
9
+ */
10
+ import { z } from "zod";
11
+ import { toneSchema, urlSchema, optionalUrlSchema } from "../../params.js";
12
+ const SEGMENTS_MAX = 3000;
13
+ const CHAPTERS_MAX = 50;
14
+ const TEXT_MAX = 2000;
15
+ const segmentFlagSchema = z.object({
16
+ /** Short flag label shown as a chip and as the timeline dot hover text. */
17
+ label: z.string().min(1, "flag label is required").max(120),
18
+ /** Chip tone — any theme token; default "warning". */
19
+ tone: toneSchema.optional(),
20
+ });
21
+ const segmentSchema = z
22
+ .object({
23
+ /** Segment start, seconds from media start (floats fine). */
24
+ start: z.number().min(0),
25
+ /** Segment end, seconds — must be greater than start. */
26
+ end: z.number().min(0),
27
+ /** Speaker name as shown in the transcript pane (drives its palette). */
28
+ speaker: z.string().min(1, "speaker is required").max(80),
29
+ /** What was said (rendered as text — never HTML). */
30
+ text: z.string().min(1, "segment text is required").max(TEXT_MAX),
31
+ /** Reviewer-relevant moment: rendered as a chip in the flagged list and
32
+ * as a click-to-seek dot on the player timeline. */
33
+ flag: segmentFlagSchema.optional(),
34
+ })
35
+ .refine((s) => s.end > s.start, {
36
+ message: "segment end must be greater than start",
37
+ path: ["end"],
38
+ });
39
+ const chapterSchema = z.object({
40
+ /** Chapter start, seconds from media start. */
41
+ start: z.number().min(0),
42
+ /** Chapter title (also the timeline flag hover text). */
43
+ title: z.string().min(1, "chapter title is required").max(120),
44
+ });
45
+ const mediaSchema = z.object({
46
+ /** https:// or root-relative media URL (MOS storage or external). */
47
+ src: urlSchema,
48
+ /** "audio" (voice call) or "video" (screen recording). Default "audio". */
49
+ type: z.enum(["audio", "video"]).optional(),
50
+ /** Poster image for video (unused for audio). */
51
+ poster: optionalUrlSchema,
52
+ });
53
+ export const transcriptSchema = z.object({
54
+ /** Optional heading above the player. */
55
+ title: z.string().max(120).optional(),
56
+ /** One-line context under the title, e.g. who was on the call. */
57
+ note: z.string().max(500).optional(),
58
+ media: mediaSchema,
59
+ segments: z
60
+ .array(segmentSchema)
61
+ .min(1, "at least one segment")
62
+ .max(SEGMENTS_MAX),
63
+ chapters: z.array(chapterSchema).max(CHAPTERS_MAX).optional(),
64
+ });
65
+ /** Flag tone with default filled. */
66
+ export function flagToneOf(s) {
67
+ return s.flag?.tone ?? "warning";
68
+ }
69
+ /** Dot classes for flag tones. The flagged list carries the tone as a small
70
+ * dot next to the label (the label itself is body text), so the list reads
71
+ * as a quiet index of moments, not a wall of solid chips. */
72
+ export const FLAG_DOT = {
73
+ primary: "bg-primary",
74
+ secondary: "bg-secondary",
75
+ accent: "bg-accent",
76
+ neutral: "bg-neutral",
77
+ info: "bg-info",
78
+ success: "bg-success",
79
+ warning: "bg-warning",
80
+ error: "bg-error",
81
+ };
82
+ // ── mapping to the jatui VideoPlayer contracts ─────────────────────────────
83
+ /** Segments → VideoTranscriptSegment[] (speaker doubles as identity so the
84
+ * player's palette stays stable per name). */
85
+ export function toVideoSegments(segments) {
86
+ return segments.map((s, i) => ({
87
+ id: `seg-${i}`,
88
+ startSec: s.start,
89
+ endSec: s.end,
90
+ speakerIdentity: s.speaker,
91
+ speakerName: s.speaker,
92
+ text: s.text,
93
+ }));
94
+ }
95
+ /** Flagged segments → comment dots on the player timeline: hover shows the
96
+ * flag label, clicking seeks to the line's start. */
97
+ export function toFlagMarkers(segments) {
98
+ return segments
99
+ .map((s, i) => ({ s, i }))
100
+ .filter(({ s }) => s.flag != null)
101
+ .map(({ s, i }) => ({
102
+ atSec: s.start,
103
+ kind: "comment",
104
+ id: `flag-${i}`,
105
+ text: s.flag.label,
106
+ }));
107
+ }
108
+ /** Chapters → VideoChapter[], sorted by start (the band draws them in order). */
109
+ export function toVideoChapters(chapters) {
110
+ return (chapters ?? [])
111
+ .slice()
112
+ .sort((a, b) => a.start - b.start)
113
+ .map((c) => ({ startSec: c.start, title: c.title }));
114
+ }
115
+ /** m:ss (h:mm:ss past an hour), for the flagged list and time captions. */
116
+ export function formatClock(sec) {
117
+ if (!Number.isFinite(sec) || sec < 0)
118
+ return "0:00";
119
+ const total = Math.floor(sec);
120
+ const h = Math.floor(total / 3600);
121
+ const m = Math.floor((total % 3600) / 60);
122
+ const s = total % 60;
123
+ const mm = h > 0 ? String(m).padStart(2, "0") : String(m);
124
+ const ss = String(s).padStart(2, "0");
125
+ return h > 0 ? `${h}:${mm}:${ss}` : `${mm}:${ss}`;
126
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The blocks jatui ships (jatui-vsuzi): the core's markdown block plus the
3
+ * four group barrels, one per block task. A block task edits ONLY its own
4
+ * barrel (blocks/group-<group>.ts) — never this file — so the four tasks
5
+ * never collide on a shared list.
6
+ */
7
+ import type { ArtifactBlockDef } from "./types.js";
8
+ /** The groups, in showcase order (each also has a /showcase subpage). */
9
+ export declare const BLOCK_GROUPS: readonly [{
10
+ readonly BLOCKS: ArtifactBlockDef<any>[];
11
+ readonly PENDING: readonly string[];
12
+ readonly id: "data";
13
+ readonly title: "Data";
14
+ readonly task: "jatui-d4lyd";
15
+ }, {
16
+ readonly BLOCKS: ArtifactBlockDef<any>[];
17
+ readonly PENDING: readonly string[];
18
+ readonly id: "content";
19
+ readonly title: "Content";
20
+ readonly task: "jatui-zy9n5";
21
+ }, {
22
+ readonly BLOCKS: ArtifactBlockDef<any>[];
23
+ readonly PENDING: readonly string[];
24
+ readonly id: "visual";
25
+ readonly title: "Visual";
26
+ readonly task: "jatui-399p2";
27
+ }, {
28
+ readonly BLOCKS: ArtifactBlockDef<any>[];
29
+ readonly PENDING: readonly string[];
30
+ readonly id: "review";
31
+ readonly title: "Review / interactive";
32
+ readonly task: "jatui-n5z1x";
33
+ }];
34
+ export declare const BUILTIN_BLOCKS: ArtifactBlockDef<any>[];
35
+ /**
36
+ * MOS block types still being ported (epic jatui-936iz). A spec naming one
37
+ * renders the renderer's "not in this renderer yet" card instead of the
38
+ * generic unknown-type one.
39
+ */
40
+ export declare const PENDING_BLOCK_TYPES: readonly string[];
@@ -0,0 +1,22 @@
1
+ import markdown from "./blocks/markdown/block.js";
2
+ import * as data from "./blocks/group-data.js";
3
+ import * as content from "./blocks/group-content.js";
4
+ import * as visual from "./blocks/group-visual.js";
5
+ import * as review from "./blocks/group-review.js";
6
+ /** The groups, in showcase order (each also has a /showcase subpage). */
7
+ export const BLOCK_GROUPS = [
8
+ { id: "data", title: "Data", task: "jatui-d4lyd", ...data },
9
+ { id: "content", title: "Content", task: "jatui-zy9n5", ...content },
10
+ { id: "visual", title: "Visual", task: "jatui-399p2", ...visual },
11
+ { id: "review", title: "Review / interactive", task: "jatui-n5z1x", ...review },
12
+ ];
13
+ export const BUILTIN_BLOCKS = [
14
+ markdown,
15
+ ...BLOCK_GROUPS.flatMap((g) => g.BLOCKS),
16
+ ];
17
+ /**
18
+ * MOS block types still being ported (epic jatui-936iz). A spec naming one
19
+ * renders the renderer's "not in this renderer yet" card instead of the
20
+ * generic unknown-type one.
21
+ */
22
+ export const PENDING_BLOCK_TYPES = BLOCK_GROUPS.flatMap((g) => [...g.PENDING]);