@lostgradient/cinder 0.8.0 → 0.11.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 (371) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +2 -2
  3. package/components.json +140 -18
  4. package/dist/components/_internal/command-list-context.d.ts +3 -3
  5. package/dist/components/_internal/create-command-list-state.svelte.d.ts +11 -11
  6. package/dist/components/access-gate/index.js +435 -218
  7. package/dist/components/approval-card/approval-card-actions.svelte.d.ts +16 -0
  8. package/dist/components/approval-card/approval-card-state.d.ts +65 -0
  9. package/dist/components/approval-card/approval-card.css +269 -92
  10. package/dist/components/approval-card/approval-card.schema.js +10 -31
  11. package/dist/components/approval-card/approval-card.svelte.d.ts +3 -3
  12. package/dist/components/approval-card/approval-card.types.d.ts +14 -28
  13. package/dist/components/approval-card/index.d.ts +1 -1
  14. package/dist/components/approval-card/index.js +4268 -2884
  15. package/dist/components/card/card.css +5 -0
  16. package/dist/components/card/card.schema.js +2 -2
  17. package/dist/components/card/card.types.d.ts +2 -2
  18. package/dist/components/card/index.js +2 -1
  19. package/dist/components/chat/builders.d.ts +17 -8
  20. package/dist/components/chat/chat.schema.js +44 -2
  21. package/dist/components/chat/chat.svelte.d.ts +4 -2
  22. package/dist/components/chat/chat.types.d.ts +34 -3
  23. package/dist/components/chat/container/chat.svelte.d.ts +4 -2
  24. package/dist/components/chat/conversation-model.d.ts +1 -1
  25. package/dist/components/chat/index.d.ts +4 -4
  26. package/dist/components/chat/index.js +2767 -6278
  27. package/dist/components/chat/input/chat-attachment-serialization.d.ts +9 -0
  28. package/dist/components/chat/input/chat-input.svelte.d.ts +22 -1
  29. package/dist/components/chat/input/index.d.ts +1 -0
  30. package/dist/components/chat/utilities/conversation.d.ts +6 -6
  31. package/dist/components/chat-composer-popover/chat-composer-popover-filter.d.ts +11 -0
  32. package/dist/components/chat-composer-popover/chat-composer-popover.css +7 -0
  33. package/dist/components/chat-composer-popover/chat-composer-popover.css.d.ts +1 -0
  34. package/dist/components/chat-composer-popover/chat-composer-popover.schema.d.ts +3 -0
  35. package/dist/components/chat-composer-popover/chat-composer-popover.schema.js +150 -0
  36. package/dist/components/chat-composer-popover/chat-composer-popover.svelte.d.ts +46 -0
  37. package/dist/components/chat-composer-popover/chat-composer-popover.types.d.ts +77 -0
  38. package/dist/components/chat-composer-popover/chat-composer-popover.variables.d.ts +2 -0
  39. package/dist/components/chat-composer-popover/chat-composer-popover.variables.js +61 -0
  40. package/dist/components/chat-composer-popover/index.d.ts +6 -0
  41. package/dist/components/chat-composer-popover/index.js +3285 -0
  42. package/dist/components/chat-conversation-header/index.js +577 -4537
  43. package/dist/components/chat-conversation-list/index.js +24 -3984
  44. package/dist/components/code-block/code-block.schema.js +5 -1
  45. package/dist/components/code-block/code-block.types.d.ts +6 -0
  46. package/dist/components/code-block/index.js +4 -4
  47. package/dist/components/command-item/index.js +7 -6
  48. package/dist/components/command-menu/command-menu.schema.js +5 -1
  49. package/dist/components/command-menu/command-menu.types.d.ts +2 -0
  50. package/dist/components/command-menu/index.js +48 -19
  51. package/dist/components/command-palette/index.js +40 -14
  52. package/dist/components/connection-indicator/connection-indicator.css +136 -0
  53. package/dist/components/connection-indicator/connection-indicator.css.d.ts +1 -0
  54. package/dist/components/connection-indicator/connection-indicator.schema.d.ts +3 -0
  55. package/dist/components/connection-indicator/connection-indicator.schema.js +89 -0
  56. package/dist/components/connection-indicator/connection-indicator.svelte.d.ts +21 -0
  57. package/dist/components/connection-indicator/connection-indicator.types.d.ts +46 -0
  58. package/dist/components/connection-indicator/connection-indicator.variables.d.ts +2 -0
  59. package/dist/components/connection-indicator/connection-indicator.variables.js +61 -0
  60. package/dist/components/connection-indicator/index.d.ts +5 -0
  61. package/dist/components/connection-indicator/index.js +409 -0
  62. package/dist/components/container/container.schema.js +4 -4
  63. package/dist/components/event-stream-viewer/index.js +44 -44
  64. package/dist/components/experimental/json-viewer/index.js +44 -44
  65. package/dist/components/invocation-rule-builder/index.d.ts +1 -1
  66. package/dist/components/invocation-rule-builder/index.js +305 -150
  67. package/dist/components/invocation-rule-builder/invocation-rule-builder.css +28 -0
  68. package/dist/components/invocation-rule-builder/invocation-rule-builder.schema.js +89 -5
  69. package/dist/components/invocation-rule-builder/invocation-rule-builder.svelte.d.ts +2 -1
  70. package/dist/components/invocation-rule-builder/invocation-rule-builder.types.d.ts +114 -16
  71. package/dist/components/json-schema-editor/index.js +5 -2
  72. package/dist/components/json-viewer/index.js +44 -44
  73. package/dist/components/json-viewer/json-viewer.css +10 -6
  74. package/dist/components/payload-inspector/index.d.ts +1 -1
  75. package/dist/components/payload-inspector/index.js +306 -1422
  76. package/dist/components/payload-inspector/payload-inspector.css +15 -75
  77. package/dist/components/payload-inspector/payload-inspector.schema.js +5 -41
  78. package/dist/components/payload-inspector/payload-inspector.svelte.d.ts +5 -5
  79. package/dist/components/payload-inspector/payload-inspector.types.d.ts +10 -56
  80. package/dist/components/run-step-timeline/index.d.ts +1 -1
  81. package/dist/components/run-step-timeline/index.js +992 -559
  82. package/dist/components/run-step-timeline/run-step-branch-disclosure.svelte.d.ts +17 -0
  83. package/dist/components/run-step-timeline/run-step-timeline.css +124 -0
  84. package/dist/components/run-step-timeline/run-step-timeline.schema.js +873 -350
  85. package/dist/components/run-step-timeline/run-step-timeline.svelte.d.ts +1 -15
  86. package/dist/components/run-step-timeline/run-step-timeline.types.d.ts +182 -5
  87. package/dist/components/run-step-timeline/run-step-timeline.utilities.d.ts +52 -0
  88. package/dist/components/schedule-builder/index.d.ts +5 -0
  89. package/dist/components/schedule-builder/index.js +3176 -0
  90. package/dist/components/schedule-builder/schedule-builder.css +121 -0
  91. package/dist/components/schedule-builder/schedule-builder.css.d.ts +1 -0
  92. package/dist/components/schedule-builder/schedule-builder.schema.d.ts +3 -0
  93. package/dist/components/schedule-builder/schedule-builder.schema.js +141 -0
  94. package/dist/components/schedule-builder/schedule-builder.svelte.d.ts +22 -0
  95. package/dist/components/schedule-builder/schedule-builder.types.d.ts +130 -0
  96. package/dist/components/schedule-builder/schedule-builder.utilities.d.ts +78 -0
  97. package/dist/components/schedule-builder/schedule-builder.variables.d.ts +2 -0
  98. package/dist/components/schedule-builder/schedule-builder.variables.js +61 -0
  99. package/dist/components/tab/index.js +5 -2
  100. package/dist/components/tab/tab.schema.js +7 -3
  101. package/dist/components/tab/tab.svelte.d.ts +2 -1
  102. package/dist/components/tab/tab.types.d.ts +8 -2
  103. package/dist/components/tabs/index.js +5 -2
  104. package/dist/components/tag-input/index.js +22 -4
  105. package/dist/components/tag-input/tag-input.schema.js +5 -1
  106. package/dist/components/tag-input/tag-input.types.d.ts +4 -0
  107. package/dist/components/team-section/index.js +2 -1
  108. package/dist/components/testimonial-section/index.js +2 -1
  109. package/dist/index.d.ts +10 -4
  110. package/dist/index.js +28577 -30168
  111. package/dist/server/components/access-gate/index.js +3 -1
  112. package/dist/server/components/accordion/index.js +2 -2
  113. package/dist/server/components/alert-dialog/index.js +2 -2
  114. package/dist/server/components/approval-card/index.js +15 -19
  115. package/dist/server/components/autocomplete/index.js +7 -7
  116. package/dist/server/components/avatar-group/index.js +5 -5
  117. package/dist/server/components/button-group/index.js +3 -5
  118. package/dist/server/components/card/index.js +2 -2
  119. package/dist/server/components/chat/index.js +15 -12
  120. package/dist/server/components/chat-composer-popover/index.js +26 -0
  121. package/dist/server/components/chat-conversation-header/index.js +10 -11
  122. package/dist/server/components/chat-conversation-list/index.js +4 -5
  123. package/dist/server/components/checkbox/index.js +3 -3
  124. package/dist/server/components/choice-grid/index.js +2 -2
  125. package/dist/server/components/code-block/index.js +2 -2
  126. package/dist/server/components/color-field/index.js +3 -3
  127. package/dist/server/components/combobox/index.js +6 -6
  128. package/dist/server/components/command-item/index.js +5 -3
  129. package/dist/server/components/command-menu/index.js +6 -4
  130. package/dist/server/components/command-palette/index.js +2 -2
  131. package/dist/server/components/confirm-dialog/index.js +2 -2
  132. package/dist/server/components/connection-indicator/index.js +16 -0
  133. package/dist/server/components/context-menu/index.js +5 -5
  134. package/dist/server/components/data-table/index.js +5 -5
  135. package/dist/server/components/date-picker/index.js +6 -6
  136. package/dist/server/components/date-range-field/index.js +7 -7
  137. package/dist/server/components/description-list/index.js +3 -5
  138. package/dist/server/components/diff-viewer/index.js +9 -8
  139. package/dist/server/components/drawer/index.js +3 -3
  140. package/dist/server/components/dropdown/index.js +4 -4
  141. package/dist/server/components/event-stream-viewer/index.js +2 -2
  142. package/dist/server/components/experimental/json-viewer/index.js +2 -2
  143. package/dist/server/components/faceted-filter-bar/index.js +1 -1
  144. package/dist/server/components/hover-card/index.js +1 -1
  145. package/dist/server/components/input/index.js +3 -3
  146. package/dist/server/components/invocation-rule-builder/index.js +1 -1
  147. package/dist/server/components/json-schema-editor/index.js +24 -23
  148. package/dist/server/components/json-viewer/index.js +2 -2
  149. package/dist/server/components/markdown-editor/index.js +13 -13
  150. package/dist/server/components/modal/index.js +1 -1
  151. package/dist/server/components/multi-select/index.js +1 -1
  152. package/dist/server/components/newsletter-section/index.js +3 -3
  153. package/dist/server/components/payload-inspector/index.js +4 -16
  154. package/dist/server/components/popover/index.js +5 -5
  155. package/dist/server/components/review-editor/index.js +27 -26
  156. package/dist/server/components/run-step-timeline/index.js +2 -2
  157. package/dist/server/components/schedule-builder/index.js +30 -0
  158. package/dist/server/components/schema-form/index.js +4 -4
  159. package/dist/server/components/secret-value-field/index.js +3 -5
  160. package/dist/server/components/segment/index.js +3 -3
  161. package/dist/server/components/segmented-control/index.js +4 -4
  162. package/dist/server/components/selection-popover/index.js +4 -4
  163. package/dist/server/components/sheet/index.js +2 -2
  164. package/dist/server/components/side-navigation/index.js +2 -2
  165. package/dist/server/components/sidebar/index.js +3 -3
  166. package/dist/server/components/tab/index.js +2 -2
  167. package/dist/server/components/table/index.js +3 -3
  168. package/dist/server/components/tabs/index.js +4 -4
  169. package/dist/server/components/tag-input/index.js +3 -3
  170. package/dist/server/components/team-section/index.js +8 -8
  171. package/dist/server/components/testimonial-section/index.js +2 -2
  172. package/dist/server/components/time-field/index.js +5 -3
  173. package/dist/server/components/toggle/index.js +2 -2
  174. package/dist/server/components/tooltip/index.js +1 -1
  175. package/dist/server/index.js +235 -211
  176. package/dist/server/{index.server-20y4mdhm.js → index.server-0chhpkg7.js} +40 -14
  177. package/dist/server/index.server-0sx92swg.js +9 -0
  178. package/dist/server/{index.server-ecm1vs3g.js → index.server-1nq7z1qw.js} +1 -1
  179. package/dist/server/{index.server-s9khh4ry.js → index.server-2bbwajb2.js} +3 -5
  180. package/dist/server/index.server-2hqrv7ca.js +9 -0
  181. package/dist/server/{index.server-69epaape.js → index.server-2qj6s2mh.js} +1 -1
  182. package/dist/server/{index.server-gxf0d1p5.js → index.server-2s5h1d05.js} +2 -2
  183. package/dist/server/{index.server-qfa2rxzx.js → index.server-2zdbz3rj.js} +3 -5
  184. package/dist/server/{index.server-pt8b65mt.js → index.server-38aywdk1.js} +1 -1
  185. package/dist/server/{index.server-0jhra85x.js → index.server-3w72dxz7.js} +4 -4
  186. package/dist/server/{index.server-rermas0k.js → index.server-47v2fhp4.js} +4 -4
  187. package/dist/server/{index.server-v4zabrsx.js → index.server-4x4hgvqe.js} +434 -26
  188. package/dist/server/{index.server-9j5sym59.js → index.server-4x91gzy1.js} +2 -2
  189. package/dist/server/{index.server-q48q15g7.js → index.server-4y2jtvv1.js} +4 -2
  190. package/dist/server/{index.server-j3ddzcaa.js → index.server-5gzyqv78.js} +6 -6
  191. package/dist/server/index.server-67qgdypc.js +9 -0
  192. package/dist/server/index.server-6hnfzc7f.js +263 -0
  193. package/dist/server/{index.server-9jete4xx.js → index.server-6sh11ap6.js} +4 -4
  194. package/dist/server/{index.server-4ztq565m.js → index.server-85p4ydph.js} +1 -1
  195. package/dist/server/{index.server-4nk7gy0q.js → index.server-894t97kv.js} +1 -1
  196. package/dist/server/{index.server-1vscnped.js → index.server-8dt36sdm.js} +2 -1
  197. package/dist/server/{index.server-bfsbp9dz.js → index.server-8xvc73zh.js} +4 -4
  198. package/dist/server/{index.server-cvnw3hw9.js → index.server-9kz37z89.js} +1 -1
  199. package/dist/server/{index.server-kc1k02tk.js → index.server-9ykk1kbg.js} +1 -1
  200. package/dist/server/{index.server-g789yep6.js → index.server-aqethy0w.js} +2 -2
  201. package/dist/server/index.server-be9bpqeh.js +93 -0
  202. package/dist/server/{index.server-wc9aggfz.js → index.server-bmxbsk4y.js} +7 -7
  203. package/dist/server/{index.server-f3z7tpxr.js → index.server-c42b462p.js} +2 -4
  204. package/dist/server/{index.server-7vyzen5x.js → index.server-c5qv3p61.js} +171 -63
  205. package/dist/server/index.server-cch0eed5.js +144 -0
  206. package/dist/server/{index.server-q89dz8h1.js → index.server-d3pqthtp.js} +4 -3
  207. package/dist/server/{index.server-jk4rx4aa.js → index.server-dmmvwy6p.js} +1 -1
  208. package/dist/server/{index.server-hcfnae5y.js → index.server-dwwqssey.js} +4 -4
  209. package/dist/server/{index.server-e8x1hgw6.js → index.server-dz1r9xw5.js} +4 -4
  210. package/dist/server/{index.server-wm7mk5kw.js → index.server-ez5hp0ya.js} +1 -1
  211. package/dist/server/{index.server-wc8dbm5e.js → index.server-g95bk8rc.js} +4 -2
  212. package/dist/server/index.server-gkazv439.js +576 -0
  213. package/dist/server/index.server-gmh5ar16.js +2 -0
  214. package/dist/server/{index.server-dp9j2kkr.js → index.server-h0cvwvhy.js} +1 -1
  215. package/dist/server/{index.server-cbtg8rq5.js → index.server-h89zk5ev.js} +8 -8
  216. package/dist/server/{index.server-pacrqvyz.js → index.server-h90pjrez.js} +1 -1
  217. package/dist/server/{index.server-p8d04em5.js → index.server-hcsd5gdb.js} +6 -2
  218. package/dist/server/{index.server-n39drzes.js → index.server-hpeavvnq.js} +1 -1
  219. package/dist/server/{index.server-1p3patnj.js → index.server-hx91ng7z.js} +1 -1
  220. package/dist/server/{index.server-mehav5vs.js → index.server-jdcq5zza.js} +7 -7
  221. package/dist/server/{index.server-jync915v.js → index.server-jfrssta6.js} +25 -25
  222. package/dist/server/{index.server-jtj3r53y.js → index.server-jgb8yh5k.js} +1 -1
  223. package/dist/server/{index.server-ejyf7e48.js → index.server-jj76374p.js} +1 -1
  224. package/dist/server/{index.server-w1g5q9j9.js → index.server-jtgw9d23.js} +4 -2
  225. package/dist/server/{index.server-hd8gpehd.js → index.server-jxseyx33.js} +1 -1
  226. package/dist/server/{index.server-kg2sepsr.js → index.server-krqvnt6p.js} +14 -15
  227. package/dist/server/{index.server-0e1m3agz.js → index.server-ks49bprh.js} +1 -1
  228. package/dist/server/{index.server-f0hma3jp.js → index.server-kt0ncrqs.js} +1 -1
  229. package/dist/server/index.server-m0ezemav.js +170 -0
  230. package/dist/server/index.server-m191rm44.js +79 -0
  231. package/dist/server/{index.server-z721a5gp.js → index.server-n82rcv0m.js} +4 -4
  232. package/dist/server/{index.server-rhhmdxtz.js → index.server-np3c7kx0.js} +4 -4
  233. package/dist/server/{index.server-hpcs7tmh.js → index.server-p56xxef1.js} +1 -1
  234. package/dist/server/{index.server-w83kmcrx.js → index.server-pag862vz.js} +10 -10
  235. package/dist/server/index.server-qbkxz7r2.js +750 -0
  236. package/dist/server/{index.server-sh2rxejg.js → index.server-qke3ekjt.js} +1 -1
  237. package/dist/server/{index.server-73x2d3j3.js → index.server-rbpvcrr3.js} +1 -1
  238. package/dist/server/{index.server-8cxs4kya.js → index.server-rga8sc7j.js} +41 -44
  239. package/dist/server/{index.server-e3fnv1g6.js → index.server-sedjxt36.js} +5 -5
  240. package/dist/server/{index.server-pen9pxt6.js → index.server-sf3nk3j2.js} +2 -2
  241. package/dist/server/{index.server-f23vtaw4.js → index.server-tcay903b.js} +8 -7
  242. package/dist/server/{index.server-7fp0epev.js → index.server-veastatv.js} +4 -4
  243. package/dist/server/{index.server-jeqg2d22.js → index.server-xeqtpv61.js} +1 -1
  244. package/dist/server/{index.server-9s4na701.js → index.server-xjnge1yw.js} +4 -4
  245. package/dist/server/index.server-xtjjmsyq.js +315 -0
  246. package/dist/server/{index.server-hhxjaeen.js → index.server-xz99aed4.js} +4 -4
  247. package/dist/server/{index.server-vne4rzfa.js → index.server-y4n8vc08.js} +1 -1
  248. package/dist/server/{index.server-5d01cn4f.js → index.server-y83kqayt.js} +4 -4
  249. package/dist/server/{index.server-1nh09ck7.js → index.server-yhzydqxe.js} +5 -5
  250. package/dist/server/index.server-z38bxms8.js +734 -0
  251. package/dist/server/{index.server-atjc1qcq.js → index.server-z7hxtqs1.js} +1 -1
  252. package/dist/server/{index.server-w6k62afr.js → index.server-ze1ymmbw.js} +2 -2
  253. package/dist/server/{index.server-914v805w.js → index.server-zgd1g8mk.js} +1 -1
  254. package/dist/server/{index.server-aeexcxdp.js → index.server-zh3r8vfd.js} +1 -1
  255. package/dist/server/{index.server-10jb2jzm.js → index.server-zsjf8enc.js} +4 -4
  256. package/package.json +102 -5
  257. package/src/components/_internal/command-list-context.ts +3 -3
  258. package/src/components/_internal/create-command-list-state.svelte.ts +39 -13
  259. package/src/components/approval-card/approval-card-actions.svelte +168 -0
  260. package/src/components/approval-card/approval-card-state.ts +152 -1
  261. package/src/components/approval-card/approval-card.css +269 -92
  262. package/src/components/approval-card/approval-card.examples.json +3 -3
  263. package/src/components/approval-card/approval-card.schema.json +9 -30
  264. package/src/components/approval-card/approval-card.schema.ts +13 -31
  265. package/src/components/approval-card/approval-card.svelte +176 -470
  266. package/src/components/approval-card/approval-card.types.ts +15 -28
  267. package/src/components/approval-card/index.ts +1 -0
  268. package/src/components/card/card.css +5 -0
  269. package/src/components/card/card.schema.json +1 -1
  270. package/src/components/card/card.schema.ts +1 -1
  271. package/src/components/card/card.svelte +1 -0
  272. package/src/components/card/card.types.ts +2 -2
  273. package/src/components/chat/builders.ts +445 -14
  274. package/src/components/chat/chat.schema.json +36 -1
  275. package/src/components/chat/chat.schema.ts +44 -1
  276. package/src/components/chat/chat.svelte +12 -0
  277. package/src/components/chat/chat.types.ts +35 -3
  278. package/src/components/chat/container/chat.svelte +73 -3
  279. package/src/components/chat/conversation-model.ts +1 -0
  280. package/src/components/chat/index.ts +16 -3
  281. package/src/components/chat/input/chat-attachment-serialization.ts +63 -0
  282. package/src/components/chat/input/chat-input.svelte +22 -5
  283. package/src/components/chat/input/index.ts +5 -0
  284. package/src/components/chat/utilities/conversation.ts +33 -15
  285. package/src/components/chat-composer-popover/chat-composer-popover-filter.ts +68 -0
  286. package/src/components/chat-composer-popover/chat-composer-popover.css +7 -0
  287. package/src/components/chat-composer-popover/chat-composer-popover.examples.json +13 -0
  288. package/src/components/chat-composer-popover/chat-composer-popover.schema.json +90 -0
  289. package/src/components/chat-composer-popover/chat-composer-popover.schema.ts +95 -0
  290. package/src/components/chat-composer-popover/chat-composer-popover.svelte +234 -0
  291. package/src/components/chat-composer-popover/chat-composer-popover.types.ts +88 -0
  292. package/src/components/chat-composer-popover/chat-composer-popover.variables.json +1 -0
  293. package/src/components/chat-composer-popover/chat-composer-popover.variables.ts +3 -0
  294. package/src/components/chat-composer-popover/index.ts +19 -0
  295. package/src/components/code-block/code-block.schema.json +4 -0
  296. package/src/components/code-block/code-block.schema.ts +5 -0
  297. package/src/components/code-block/code-block.svelte +3 -3
  298. package/src/components/code-block/code-block.types.ts +6 -0
  299. package/src/components/command-item/command-item.svelte +7 -6
  300. package/src/components/command-menu/command-menu.schema.json +4 -0
  301. package/src/components/command-menu/command-menu.schema.ts +4 -0
  302. package/src/components/command-menu/command-menu.svelte +16 -5
  303. package/src/components/command-menu/command-menu.types.ts +2 -0
  304. package/src/components/connection-indicator/connection-indicator.css +136 -0
  305. package/src/components/connection-indicator/connection-indicator.examples.json +31 -0
  306. package/src/components/connection-indicator/connection-indicator.schema.json +29 -0
  307. package/src/components/connection-indicator/connection-indicator.schema.ts +36 -0
  308. package/src/components/connection-indicator/connection-indicator.svelte +63 -0
  309. package/src/components/connection-indicator/connection-indicator.types.ts +58 -0
  310. package/src/components/connection-indicator/connection-indicator.variables.json +1 -0
  311. package/src/components/connection-indicator/connection-indicator.variables.ts +3 -0
  312. package/src/components/connection-indicator/index.ts +10 -0
  313. package/src/components/container/container.schema.json +3 -3
  314. package/src/components/container/container.schema.ts +3 -3
  315. package/src/components/invocation-rule-builder/index.ts +4 -0
  316. package/src/components/invocation-rule-builder/invocation-rule-builder.css +28 -0
  317. package/src/components/invocation-rule-builder/invocation-rule-builder.examples.json +6 -0
  318. package/src/components/invocation-rule-builder/invocation-rule-builder.schema.json +76 -3
  319. package/src/components/invocation-rule-builder/invocation-rule-builder.schema.ts +83 -3
  320. package/src/components/invocation-rule-builder/invocation-rule-builder.svelte +326 -113
  321. package/src/components/invocation-rule-builder/invocation-rule-builder.types.ts +157 -43
  322. package/src/components/json-viewer/_json-viewer-node.svelte +15 -1
  323. package/src/components/json-viewer/json-viewer.css +10 -6
  324. package/src/components/payload-inspector/index.ts +0 -2
  325. package/src/components/payload-inspector/payload-inspector.css +15 -75
  326. package/src/components/payload-inspector/payload-inspector.examples.json +5 -5
  327. package/src/components/payload-inspector/payload-inspector.schema.json +3 -31
  328. package/src/components/payload-inspector/payload-inspector.schema.ts +3 -36
  329. package/src/components/payload-inspector/payload-inspector.svelte +46 -239
  330. package/src/components/payload-inspector/payload-inspector.types.ts +10 -58
  331. package/src/components/run-step-timeline/index.ts +8 -0
  332. package/src/components/run-step-timeline/run-step-branch-disclosure.svelte +16 -0
  333. package/src/components/run-step-timeline/run-step-timeline.css +124 -0
  334. package/src/components/run-step-timeline/run-step-timeline.examples.json +18 -0
  335. package/src/components/run-step-timeline/run-step-timeline.schema.json +872 -349
  336. package/src/components/run-step-timeline/run-step-timeline.schema.ts +931 -349
  337. package/src/components/run-step-timeline/run-step-timeline.svelte +387 -268
  338. package/src/components/run-step-timeline/run-step-timeline.types.ts +192 -5
  339. package/src/components/run-step-timeline/run-step-timeline.utilities.ts +242 -0
  340. package/src/components/schedule-builder/index.ts +14 -0
  341. package/src/components/schedule-builder/schedule-builder.css +121 -0
  342. package/src/components/schedule-builder/schedule-builder.examples.json +31 -0
  343. package/src/components/schedule-builder/schedule-builder.schema.json +78 -0
  344. package/src/components/schedule-builder/schedule-builder.schema.ts +86 -0
  345. package/src/components/schedule-builder/schedule-builder.svelte +629 -0
  346. package/src/components/schedule-builder/schedule-builder.types.ts +137 -0
  347. package/src/components/schedule-builder/schedule-builder.utilities.ts +344 -0
  348. package/src/components/schedule-builder/schedule-builder.variables.json +1 -0
  349. package/src/components/schedule-builder/schedule-builder.variables.ts +3 -0
  350. package/src/components/tab/tab.schema.json +6 -2
  351. package/src/components/tab/tab.schema.ts +8 -2
  352. package/src/components/tab/tab.svelte +9 -5
  353. package/src/components/tab/tab.types.ts +8 -2
  354. package/src/components/tag-input/tag-input.schema.json +4 -0
  355. package/src/components/tag-input/tag-input.schema.ts +4 -0
  356. package/src/components/tag-input/tag-input.svelte +20 -3
  357. package/src/components/tag-input/tag-input.types.ts +4 -0
  358. package/src/index.ts +41 -5
  359. package/src/styles/components.css +3 -0
  360. package/dist/server/index-49we2xfs.js +0 -344
  361. package/dist/server/index-8fhvxk30.js +0 -265
  362. package/dist/server/index-x2ysg8ds.js +0 -388
  363. package/dist/server/index.server-20j0jh30.js +0 -9
  364. package/dist/server/index.server-dc35kh7d.js +0 -1835
  365. package/dist/server/index.server-kd4b0342.js +0 -607
  366. package/dist/server/index.server-n5cdmsz4.js +0 -30
  367. package/dist/server/index.server-pxg74pyp.js +0 -393
  368. package/dist/server/index.server-rjap4k7y.js +0 -1389
  369. package/dist/server/index.server-vt6sn9y4.js +0 -447
  370. package/dist/server/index.server-w63n618v.js +0 -9
  371. package/dist/server/index.server-y2pa1k46.js +0 -9
@@ -6,152 +6,170 @@ export {};
6
6
  import { classNames } from '../../utilities/class-names.ts';
7
7
  import Badge from '../badge/badge.svelte';
8
8
  import Collapsible from '../collapsible/collapsible.svelte';
9
+ import RunStepBranchDisclosure from './run-step-branch-disclosure.svelte';
9
10
  import Link from '../link/link.svelte';
10
11
  import Progress from '../progress/progress.svelte';
11
12
  import StatusDot from '../status-dot/status-dot.svelte';
13
+ import { actionsCountLabel, badgeVariant, branchGroupHasCurrentStep, branchOutcomeSummary, branchStartsCollapsed, hasProgress, hiddenNestedStepLabel, isCurrent, isTerminal, laneOutcomeBadgeVariant, laneOutcomeLabel, metadataItems, safeStepLinkHref, statusDotStatus, statusLabel, } from './run-step-timeline.utilities.ts';
12
14
  const MAX_NESTED_STEP_DEPTH = 3;
13
15
  let { steps, label, class: className, children, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledby, ...rest } = $props();
14
16
  const resolvedAriaLabel = $derived(ariaLabelledby === undefined && ariaLabel === undefined ? label : ariaLabel);
15
- const renderedSteps = $derived(flattenRunSteps(steps));
16
- // Map generic RunStepStatus onto StatusDot status tokens.
17
- function statusDotStatus(status) {
18
- switch (status) {
19
- case 'succeeded':
20
- return 'success';
21
- case 'failed':
22
- return 'danger';
23
- case 'running':
24
- return 'online';
25
- case 'retrying':
26
- return 'warning';
27
- case 'waiting_approval':
28
- return 'accent';
29
- case 'cancelled':
30
- return 'offline';
31
- case 'skipped':
32
- return 'neutral';
33
- case 'pending':
34
- return 'pending';
35
- }
17
+ const renderedEntries = $derived(flattenEntries(steps));
18
+ function isBranchGroup(entry) {
19
+ return 'kind' in entry && entry.kind === 'branch';
36
20
  }
37
- // Human-readable label for the StatusDot accessible name.
38
- function statusLabel(status) {
39
- switch (status) {
40
- case 'pending':
41
- return 'Pending';
42
- case 'running':
43
- return 'Running';
44
- case 'succeeded':
45
- return 'Succeeded';
46
- case 'failed':
47
- return 'Failed';
48
- case 'cancelled':
49
- return 'Cancelled';
50
- case 'skipped':
51
- return 'Skipped';
52
- case 'retrying':
53
- return 'Retrying';
54
- case 'waiting_approval':
55
- return 'Waiting approval';
21
+ // Flatten the top-level entries, keeping contiguous runs of steps together so
22
+ // the connector rail spans them, and emitting a standalone row for each
23
+ // branch group (which renders its own parallel sub-lanes).
24
+ function flattenEntries(entries) {
25
+ const result = [];
26
+ let stepRun = [];
27
+ const flushRun = () => {
28
+ if (stepRun.length === 0)
29
+ return;
30
+ result.push(...flattenSteps(stepRun, ''));
31
+ stepRun = [];
32
+ };
33
+ for (const entry of entries) {
34
+ if (isBranchGroup(entry)) {
35
+ flushRun();
36
+ result.push({
37
+ kind: 'branch',
38
+ group: entry,
39
+ // A raw `%` can never appear in an escaped step-path segment
40
+ // (escapeStepPathSegment turns `%` into `%25`), so this branch key
41
+ // cannot collide with any step's path key.
42
+ pathKey: `%branch/${escapeStepPathSegment(entry.id)}`,
43
+ connectorAfter: 'hidden',
44
+ });
45
+ }
46
+ else {
47
+ stepRun.push(entry);
48
+ }
56
49
  }
50
+ flushRun();
51
+ // `flattenSteps` computes `aria-current` within each contiguous run; on the
52
+ // outer rail, keep a SINGLE deepest current row across the whole timeline so
53
+ // a branch group between two active runs doesn't produce two current rows.
54
+ // `applyGlobalRailConnectors` then reconnects the rail across run/branch
55
+ // boundaries — each run is flattened in isolation, so its last row and the
56
+ // branch rows would otherwise both hide their connector and split one
57
+ // ordered run (step → branch → step) into disconnected rails.
58
+ // `applyGlobalTopLevelCompensates` likewise resolves `compensates` for
59
+ // top-level steps across the whole rail, since a compensating step can be
60
+ // separated from its forward sibling by a branch group (different run).
61
+ return applyGlobalRailConnectors(applyGlobalTopLevelCompensates(applyGlobalRailAriaCurrent(result)));
57
62
  }
58
- function badgeVariant(status) {
59
- switch (status) {
60
- case 'succeeded':
61
- return 'success';
62
- case 'failed':
63
- return 'danger';
64
- case 'running':
65
- return 'info';
66
- case 'retrying':
67
- return 'warning';
68
- case 'waiting_approval':
69
- return 'accent';
70
- case 'cancelled':
71
- return 'neutral';
72
- case 'skipped':
73
- return 'neutral';
74
- case 'pending':
75
- return 'neutral';
63
+ // Resolve `compensates` for TOP-LEVEL steps across the entire outer rail. Each
64
+ // contiguous run is flattened in isolation, so a compensating top-level step
65
+ // separated from its forward sibling by a branch group (e.g. `charge → branch
66
+ // → refund` where refund compensates charge) would never find it in its own
67
+ // run's label map. Nested steps are unaffected: a branch group never nests
68
+ // inside a step's children, so nested siblings always share a run and are
69
+ // already resolved correctly by `flattenSteps`.
70
+ function applyGlobalTopLevelCompensates(rows) {
71
+ const topLevelLabelByPathKey = new Map();
72
+ for (const row of rows) {
73
+ if (row.kind === 'step' && row.depth === 0) {
74
+ topLevelLabelByPathKey.set(row.pathKey, row.step.label);
75
+ }
76
76
  }
77
+ return rows.map((row) => {
78
+ if (row.kind !== 'step' || row.depth !== 0 || row.step.compensates === undefined)
79
+ return row;
80
+ return {
81
+ ...row,
82
+ compensatesLabel: resolveSiblingCompensatesLabel(row, topLevelLabelByPathKey),
83
+ };
84
+ });
77
85
  }
78
- // Whether this status is a terminal state (no further changes expected).
79
- function isTerminal(status) {
80
- return (status === 'succeeded' ||
81
- status === 'failed' ||
82
- status === 'cancelled' ||
83
- status === 'skipped');
84
- }
85
- function isCurrent(status) {
86
- return status === 'running' || status === 'retrying' || status === 'waiting_approval';
87
- }
88
- // Whether this step has a progress bar to show.
89
- function hasProgress(step) {
90
- return step.progress !== undefined && isCurrent(step.status);
86
+ // A rail row's effective depth for connector purposes. Branch groups always
87
+ // render at the top level, so they sit at depth 0.
88
+ function railRowDepth(row) {
89
+ return row.kind === 'branch' ? 0 : row.depth;
91
90
  }
92
- // Metadata items for a step, as term/definition pairs.
93
- function metadataItems(step) {
94
- const items = [];
95
- if (step.startTime !== undefined) {
96
- items.push({ term: 'Started', definition: step.startTime });
97
- }
98
- if (step.endTime !== undefined) {
99
- items.push({ term: 'Ended', definition: step.endTime });
100
- }
101
- if (step.duration !== undefined) {
102
- items.push({ term: 'Duration', definition: step.duration });
103
- }
104
- if (step.attemptCount !== undefined && step.attemptCount > 1) {
105
- items.push({ term: 'Attempts', definition: String(step.attemptCount) });
106
- }
107
- return items;
108
- }
109
- function actionsCountLabel(actionsCount) {
110
- return actionsCount === 1 ? '1 action' : `${actionsCount} actions`;
91
+ // Recompute each top-level row's downward connector against the ACTUAL next
92
+ // rendered row (including branch rows), rather than the per-run view that
93
+ // `flattenSteps` sees. A connector shows unless the row is last or the next
94
+ // row dedents to a shallower level — so a depth-0 step followed by a branch,
95
+ // and a branch followed by another run, both stay linked.
96
+ function applyGlobalRailConnectors(rows) {
97
+ return rows.map((row, index) => {
98
+ const next = rows[index + 1];
99
+ const connectorAfter = next === undefined || railRowDepth(next) < railRowDepth(row) ? 'hidden' : 'visible';
100
+ return { ...row, connectorAfter };
101
+ });
111
102
  }
112
- function hiddenNestedStepLabel(hiddenStepCount) {
113
- return hiddenStepCount === 1
114
- ? '1 nested step hidden'
115
- : `${hiddenStepCount} nested steps hidden`;
103
+ // The "current depth" of a rail row: deeper is more current. A depth-limit row
104
+ // that hides a current descendant counts one level below its own depth.
105
+ function rowCurrentDepth(row) {
106
+ if (row.kind === 'depth-limit')
107
+ return row.hiddenCurrent ? row.depth + 1 : -1;
108
+ if (row.kind === 'step')
109
+ return isCurrent(row.step.status) ? row.depth : -1;
110
+ return -1;
116
111
  }
117
- function safeStepLinkHref(href) {
118
- const trimmedHref = href.trim();
119
- if (trimmedHref === '')
120
- return undefined;
121
- if (/[\u0000-\u001F\u007F]/.test(trimmedHref))
122
- return undefined;
123
- if (trimmedHref.includes('\\'))
124
- return undefined;
125
- const leadingSeparators = trimmedHref.match(/^[\\/]+/)?.[0] ?? '';
126
- if (leadingSeparators.length > 1)
127
- return undefined;
128
- if (/^[A-Za-z][A-Za-z\d+.-]*:/.test(trimmedHref)) {
129
- try {
130
- const parsedUrl = new URL(trimmedHref);
131
- return parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:'
132
- ? trimmedHref
133
- : undefined;
134
- }
135
- catch {
136
- return undefined;
112
+ // Reduce the rail to a single `aria-current="step"` row: the deepest current
113
+ // step across all top-level runs. Branch groups do not participate.
114
+ function applyGlobalRailAriaCurrent(rows) {
115
+ let deepestRow;
116
+ let deepestDepth = -1;
117
+ for (const row of rows) {
118
+ const depth = rowCurrentDepth(row);
119
+ if (depth > deepestDepth) {
120
+ deepestDepth = depth;
121
+ deepestRow = row;
137
122
  }
138
123
  }
139
- return trimmedHref;
124
+ return rows.map((row) => row.kind === 'branch' ? row : { ...row, ariaCurrent: row === deepestRow });
140
125
  }
141
- function flattenRunSteps(steps) {
126
+ // Flatten a RunStep[] (with nested children) into rendered rows, computing the
127
+ // connector rail, the single deepest `aria-current` row, and resolved
128
+ // compensation labels. Reused for the main rail and for each branch lane.
129
+ function flattenSteps(list, pathPrefix) {
142
130
  const rows = [];
143
- appendRunStepRows(rows, steps, 0, '');
131
+ appendRunStepRows(rows, list, 0, pathPrefix);
144
132
  const currentRowIndex = deepestCurrentStepIndex(rows);
145
- return rows.map((row, index) => ({
146
- ...row,
147
- connectorAfter: rows[index + 1] === undefined || (rows[index + 1]?.depth ?? 0) < row.depth
148
- ? 'hidden'
149
- : 'visible',
150
- ariaCurrent: index === currentRowIndex,
151
- }));
133
+ // Index every step row by its unique path key (built from the escaped id
134
+ // chain). A `compensates` id then resolves to a true SIBLING — a step under
135
+ // the same parent rather than any same-id descendant elsewhere in the run
136
+ // or lane. Iterating the already-bounded, depth-capped rows also avoids
137
+ // recursing the full step tree, which could overflow the stack.
138
+ const labelByPathKey = new Map();
139
+ for (const row of rows) {
140
+ if (row.kind === 'step')
141
+ labelByPathKey.set(row.pathKey, row.step.label);
142
+ }
143
+ return rows.map((row, index) => {
144
+ const next = rows[index + 1];
145
+ const connectorAfter = next === undefined || next.depth < row.depth ? 'hidden' : 'visible';
146
+ const ariaCurrent = index === currentRowIndex;
147
+ if (row.kind === 'depth-limit') {
148
+ return { ...row, connectorAfter, ariaCurrent };
149
+ }
150
+ return {
151
+ ...row,
152
+ connectorAfter,
153
+ ariaCurrent,
154
+ compensatesLabel: resolveSiblingCompensatesLabel(row, labelByPathKey),
155
+ };
156
+ });
157
+ }
158
+ // Resolve a step's `compensates` id to the label of a sibling step (one under
159
+ // the same parent), or `undefined` when there is no such sibling. Never
160
+ // resolves to the step itself.
161
+ function resolveSiblingCompensatesLabel(row, labelByPathKey) {
162
+ if (row.step.compensates === undefined)
163
+ return undefined;
164
+ const lastSeparator = row.pathKey.lastIndexOf('/');
165
+ const parentPrefix = lastSeparator === -1 ? '' : row.pathKey.slice(0, lastSeparator);
166
+ const siblingPathKey = nestedStepPathKey(parentPrefix, row.step.compensates);
167
+ if (siblingPathKey === row.pathKey)
168
+ return undefined;
169
+ return labelByPathKey.get(siblingPathKey);
152
170
  }
153
- function appendRunStepRows(rows, steps, depth, pathPrefix) {
154
- for (const step of steps) {
171
+ function appendRunStepRows(rows, list, depth, pathPrefix) {
172
+ for (const step of list) {
155
173
  const pathKey = nestedStepPathKey(pathPrefix, step.id);
156
174
  rows.push({ kind: 'step', step, depth, pathKey });
157
175
  if (step.children && step.children.length > 0) {
@@ -178,10 +196,10 @@ function nestedStepPathKey(pathPrefix, stepId) {
178
196
  function escapeStepPathSegment(stepId) {
179
197
  return stepId.replaceAll('%', '%25').replaceAll('/', '%2F');
180
198
  }
181
- function summarizeNestedRunSteps(steps) {
199
+ function summarizeNestedRunSteps(list) {
182
200
  let count = 0;
183
201
  let hasCurrent = false;
184
- const stack = [...steps];
202
+ const stack = [...list];
185
203
  while (stack.length > 0) {
186
204
  const step = stack.pop();
187
205
  if (step === undefined)
@@ -189,10 +207,10 @@ function summarizeNestedRunSteps(steps) {
189
207
  count += 1;
190
208
  if (isCurrent(step.status))
191
209
  hasCurrent = true;
192
- const children = step.children;
193
- if (children) {
194
- for (let index = children.length - 1; index >= 0; index -= 1) {
195
- const child = children[index];
210
+ const stepChildren = step.children;
211
+ if (stepChildren) {
212
+ for (let index = stepChildren.length - 1; index >= 0; index -= 1) {
213
+ const child = stepChildren[index];
196
214
  if (child)
197
215
  stack.push(child);
198
216
  }
@@ -216,162 +234,263 @@ function deepestCurrentStepIndex(rows) {
216
234
  });
217
235
  return currentIndex;
218
236
  }
237
+ function laneRows(lane) {
238
+ return flattenSteps(lane.steps, '');
239
+ }
240
+ function laneStateLabel(lane) {
241
+ return lane.outcome === undefined ? 'racing' : laneOutcomeLabel(lane.outcome).toLowerCase();
242
+ }
219
243
  </script>
220
244
 
245
+ {#snippet stepItem(row: RenderedStepRow)}
246
+ {@const step = row.step}
247
+ {@const terminal = isTerminal(step.status)}
248
+ {@const metadata = metadataItems(step)}
249
+ <li
250
+ class="cinder-run-step-timeline__item"
251
+ data-cinder-status={step.status}
252
+ data-cinder-depth={row.depth}
253
+ data-cinder-path={row.pathKey}
254
+ data-cinder-terminal={terminal ? '' : undefined}
255
+ data-cinder-rewound={step.rewound ? '' : undefined}
256
+ data-cinder-compensation={row.compensatesLabel !== undefined ? '' : undefined}
257
+ data-cinder-connector-after={row.connectorAfter}
258
+ aria-current={row.ariaCurrent ? 'step' : undefined}
259
+ style:--_cinder-rst-depth={row.depth}
260
+ >
261
+ <div class="cinder-run-step-timeline__event">
262
+ <span class="cinder-run-step-timeline__marker" aria-hidden="true" inert>
263
+ <StatusDot
264
+ status={statusDotStatus(step.status)}
265
+ label={statusLabel(step.status)}
266
+ showLabel={false}
267
+ size="md"
268
+ />
269
+ </span>
270
+
271
+ <div class="cinder-run-step-timeline__content">
272
+ <div class="cinder-run-step-timeline__header">
273
+ <span class="cinder-run-step-timeline__label">{step.label}</span>
274
+ {#if step.link}
275
+ {@const safeLinkHref = safeStepLinkHref(step.link.href)}
276
+ {#if safeLinkHref}
277
+ <Link href={safeLinkHref} class="cinder-run-step-timeline__link">
278
+ {step.link.label}
279
+ </Link>
280
+ {:else}
281
+ <span class="cinder-run-step-timeline__link cinder-run-step-timeline__link--unsafe">
282
+ {step.link.label}
283
+ </span>
284
+ {/if}
285
+ {/if}
286
+ <Badge
287
+ class="cinder-run-step-timeline__status"
288
+ variant={badgeVariant(step.status)}
289
+ size="xs"
290
+ aria-label={`Status: ${statusLabel(step.status)}`}
291
+ >
292
+ {statusLabel(step.status)}
293
+ </Badge>
294
+ {#if step.rewound}
295
+ <Badge
296
+ class="cinder-run-step-timeline__flag"
297
+ variant="neutral"
298
+ size="xs"
299
+ aria-label="State: rewound — speculatively executed, then unwound"
300
+ >
301
+ Rewound
302
+ </Badge>
303
+ {/if}
304
+ {#if row.compensatesLabel !== undefined}
305
+ <Badge
306
+ class="cinder-run-step-timeline__flag"
307
+ variant="warning"
308
+ size="xs"
309
+ aria-label={`Compensates ${row.compensatesLabel} — reverses the forward step`}
310
+ >
311
+ Compensates {row.compensatesLabel}
312
+ </Badge>
313
+ {/if}
314
+ {#if step.attemptCount !== undefined && step.attemptCount > 1}
315
+ <Badge variant="neutral" size="xs" mono>attempt {step.attemptCount}</Badge>
316
+ {/if}
317
+ {#if step.actionsCount !== undefined && step.actionsCount > 0}
318
+ <Badge variant="neutral" size="xs" mono>{actionsCountLabel(step.actionsCount)}</Badge>
319
+ {/if}
320
+ </div>
321
+
322
+ {#if hasProgress(step)}
323
+ <div class="cinder-run-step-timeline__progress">
324
+ <Progress
325
+ value={step.progress ?? 0}
326
+ max={step.progressMax ?? 100}
327
+ size="sm"
328
+ ariaLabel={`${step.label} progress`}
329
+ />
330
+ </div>
331
+ {/if}
332
+
333
+ {#if metadata.length > 0}
334
+ <dl class="cinder-run-step-timeline__meta">
335
+ {#each metadata as item (item.term)}
336
+ <div class="cinder-run-step-timeline__meta-row">
337
+ <dt class="cinder-run-step-timeline__meta-term">{item.term}</dt>
338
+ <dd class="cinder-run-step-timeline__meta-definition">{item.definition}</dd>
339
+ </div>
340
+ {/each}
341
+ </dl>
342
+ {/if}
343
+
344
+ {#if step.details && step.details.length > 0}
345
+ <div class="cinder-run-step-timeline__details">
346
+ {#each step.details as detail (detail.id)}
347
+ <Collapsible trigger={detail.label}>
348
+ <pre class="cinder-run-step-timeline__detail-content">{detail.content}</pre>
349
+ </Collapsible>
350
+ {/each}
351
+ </div>
352
+ {/if}
353
+
354
+ {#if children}
355
+ <div class="cinder-run-step-timeline__body">
356
+ {@render children(step)}
357
+ </div>
358
+ {/if}
359
+ </div>
360
+ </div>
361
+ </li>
362
+ {/snippet}
363
+
364
+ {#snippet depthLimitItem(row: RenderedDepthLimitRow)}
365
+ <li
366
+ class="cinder-run-step-timeline__item"
367
+ data-cinder-status="depth-limit"
368
+ data-cinder-depth={row.depth}
369
+ data-cinder-path={row.pathKey}
370
+ data-cinder-connector-after={row.connectorAfter}
371
+ data-cinder-depth-limit
372
+ aria-current={row.ariaCurrent ? 'step' : undefined}
373
+ style:--_cinder-rst-depth={row.depth}
374
+ >
375
+ <div class="cinder-run-step-timeline__event">
376
+ <span class="cinder-run-step-timeline__marker" aria-hidden="true" inert>
377
+ <StatusDot status="neutral" label="Nested steps hidden" showLabel={false} size="md" />
378
+ </span>
379
+
380
+ <div class="cinder-run-step-timeline__content">
381
+ <div class="cinder-run-step-timeline__header">
382
+ <span class="cinder-run-step-timeline__label">
383
+ {hiddenNestedStepLabel(row.hiddenStepCount)}
384
+ </span>
385
+ <Badge
386
+ class="cinder-run-step-timeline__status"
387
+ variant="neutral"
388
+ size="xs"
389
+ aria-label="Status: Nested child steps hidden"
390
+ >
391
+ Depth cap
392
+ </Badge>
393
+ </div>
394
+ <p class="cinder-run-step-timeline__body">
395
+ Additional child-workflow steps are hidden because the timeline depth cap was reached.
396
+ </p>
397
+ </div>
398
+ </div>
399
+ </li>
400
+ {/snippet}
401
+
402
+ {#snippet stepRail(rows: RenderedStepLike[])}
403
+ {#each rows as row (row.pathKey)}
404
+ {#if row.kind === 'depth-limit'}
405
+ {@render depthLimitItem(row)}
406
+ {:else}
407
+ {@render stepItem(row)}
408
+ {/if}
409
+ {/each}
410
+ {/snippet}
411
+
221
412
  <ol
222
413
  {...rest}
223
414
  class={classNames('cinder-run-step-timeline', className)}
224
415
  aria-label={resolvedAriaLabel}
225
416
  aria-labelledby={ariaLabelledby}
226
417
  >
227
- {#each renderedSteps as row (row.pathKey)}
228
- {#if row.kind === 'depth-limit'}
418
+ {#each renderedEntries as entry (entry.pathKey)}
419
+ {#if entry.kind === 'branch'}
420
+ {@const group = entry.group}
421
+ {@const summary = branchOutcomeSummary(group.lanes)}
422
+ {@const initialOpen =
423
+ !branchStartsCollapsed(group.lanes.length, group.collapseThreshold, group.collapsed) ||
424
+ (group.collapsed === undefined && branchGroupHasCurrentStep(group))}
229
425
  <li
230
- class="cinder-run-step-timeline__item"
231
- data-cinder-status="depth-limit"
232
- data-cinder-depth={row.depth}
233
- data-cinder-path={row.pathKey}
234
- data-cinder-connector-after={row.connectorAfter}
235
- data-cinder-depth-limit
236
- aria-current={row.ariaCurrent ? 'step' : undefined}
237
- style:--_cinder-rst-depth={row.depth}
426
+ class="cinder-run-step-timeline__item cinder-run-step-timeline__item--branch"
427
+ data-cinder-status="branch"
428
+ data-cinder-depth="0"
429
+ data-cinder-path={entry.pathKey}
430
+ data-cinder-connector-after={entry.connectorAfter}
238
431
  >
239
432
  <div class="cinder-run-step-timeline__event">
240
433
  <span class="cinder-run-step-timeline__marker" aria-hidden="true" inert>
241
- <StatusDot status="neutral" label="Nested steps hidden" showLabel={false} size="md" />
434
+ <StatusDot status="accent" label="Branch group" showLabel={false} size="md" />
242
435
  </span>
243
436
 
244
- <div class="cinder-run-step-timeline__content">
245
- <div class="cinder-run-step-timeline__header">
246
- <span class="cinder-run-step-timeline__label">
247
- {hiddenNestedStepLabel(row.hiddenStepCount)}
248
- </span>
249
- <Badge
250
- class="cinder-run-step-timeline__status"
251
- variant="neutral"
252
- size="xs"
253
- aria-label="Status: Nested child steps hidden"
254
- >
255
- Depth cap
256
- </Badge>
257
- </div>
258
- <p class="cinder-run-step-timeline__body">
259
- Additional child-workflow steps are hidden because the timeline depth cap was reached.
260
- </p>
261
- </div>
262
- </div>
263
- </li>
264
- {:else}
265
- {@const step = row.step}
266
- {@const terminal = isTerminal(step.status)}
267
- {@const metadata = metadataItems(step)}
268
- <li
269
- class="cinder-run-step-timeline__item"
270
- data-cinder-status={step.status}
271
- data-cinder-depth={row.depth}
272
- data-cinder-path={row.pathKey}
273
- data-cinder-terminal={terminal ? '' : undefined}
274
- data-cinder-connector-after={row.connectorAfter}
275
- aria-current={row.ariaCurrent ? 'step' : undefined}
276
- style:--_cinder-rst-depth={row.depth}
277
- >
278
- <div class="cinder-run-step-timeline__event">
279
- <!-- Marker: StatusDot on the rail -->
280
- <span class="cinder-run-step-timeline__marker" aria-hidden="true" inert>
281
- <StatusDot
282
- status={statusDotStatus(step.status)}
283
- label={statusLabel(step.status)}
284
- showLabel={false}
285
- size="md"
286
- />
287
- </span>
437
+ <div class="cinder-run-step-timeline__content cinder-run-step-timeline__branch">
438
+ <RunStepBranchDisclosure
439
+ {initialOpen}
440
+ class="cinder-run-step-timeline__branch-disclosure"
441
+ triggerAriaLabel={`Branch group: ${group.label}. ${summary}.`}
442
+ >
443
+ {#snippet trigger()}
444
+ <span class="cinder-run-step-timeline__branch-heading">
445
+ <span class="cinder-run-step-timeline__label">{group.label}</span>
446
+ <Badge variant="accent" size="xs" aria-label={`Branch group outcome: ${summary}`}>
447
+ {summary}
448
+ </Badge>
449
+ </span>
450
+ {/snippet}
288
451
 
289
- <!-- Step content -->
290
- <div class="cinder-run-step-timeline__content">
291
- <!-- Header row: label + status badge -->
292
- <div class="cinder-run-step-timeline__header">
293
- <span class="cinder-run-step-timeline__label">{step.label}</span>
294
- {#if step.link}
295
- {@const safeLinkHref = safeStepLinkHref(step.link.href)}
296
- {#if safeLinkHref}
297
- <Link href={safeLinkHref} class="cinder-run-step-timeline__link">
298
- {step.link.label}
299
- </Link>
300
- {:else}
301
- <span
302
- class="cinder-run-step-timeline__link cinder-run-step-timeline__link--unsafe"
452
+ <ul class="cinder-run-step-timeline__lanes" aria-label={`${group.label} branches`}>
453
+ {#each group.lanes as lane (lane.id)}
454
+ <li
455
+ class="cinder-run-step-timeline__lane"
456
+ data-cinder-outcome={lane.outcome ?? 'racing'}
457
+ aria-label={`Branch ${lane.label ?? lane.id}: ${laneStateLabel(lane)}`}
303
458
  >
304
- {step.link.label}
305
- </span>
306
- {/if}
307
- {/if}
308
- <Badge
309
- class="cinder-run-step-timeline__status"
310
- variant={badgeVariant(step.status)}
311
- size="xs"
312
- aria-label={`Status: ${statusLabel(step.status)}`}
313
- >
314
- {statusLabel(step.status)}
315
- </Badge>
316
- {#if step.attemptCount !== undefined && step.attemptCount > 1}
317
- <Badge variant="neutral" size="xs" mono>attempt {step.attemptCount}</Badge>
318
- {/if}
319
- {#if step.actionsCount !== undefined && step.actionsCount > 0}
320
- <Badge variant="neutral" size="xs" mono
321
- >{actionsCountLabel(step.actionsCount)}</Badge
322
- >
323
- {/if}
324
- </div>
325
-
326
- <!-- Progress bar (only shown for current statuses with explicit progress) -->
327
- {#if hasProgress(step)}
328
- <div class="cinder-run-step-timeline__progress">
329
- <Progress
330
- value={step.progress ?? 0}
331
- max={step.progressMax ?? 100}
332
- size="sm"
333
- ariaLabel={`${step.label} progress`}
334
- />
335
- </div>
336
- {/if}
337
-
338
- <!-- Metadata: start/end/duration/attempts -->
339
- {#if metadata.length > 0}
340
- <dl class="cinder-run-step-timeline__meta">
341
- {#each metadata as item (item.term)}
342
- <div class="cinder-run-step-timeline__meta-row">
343
- <dt class="cinder-run-step-timeline__meta-term">{item.term}</dt>
344
- <dd class="cinder-run-step-timeline__meta-definition">{item.definition}</dd>
345
- </div>
459
+ <div class="cinder-run-step-timeline__lane-header">
460
+ <span class="cinder-run-step-timeline__lane-label">
461
+ {lane.label ?? lane.id}
462
+ </span>
463
+ {#if lane.outcome !== undefined}
464
+ <Badge
465
+ variant={laneOutcomeBadgeVariant(lane.outcome)}
466
+ size="xs"
467
+ aria-label={`Outcome: ${laneOutcomeLabel(lane.outcome)}`}
468
+ >
469
+ {laneOutcomeLabel(lane.outcome)}
470
+ </Badge>
471
+ {:else}
472
+ <Badge variant="info" size="xs" aria-label="Outcome: still racing">
473
+ Racing
474
+ </Badge>
475
+ {/if}
476
+ </div>
477
+ <ol
478
+ class="cinder-run-step-timeline cinder-run-step-timeline__lane-steps"
479
+ aria-label={`${lane.label ?? lane.id} steps`}
480
+ >
481
+ {@render stepRail(laneRows(lane))}
482
+ </ol>
483
+ </li>
346
484
  {/each}
347
- </dl>
348
- {/if}
349
-
350
- <!-- Expandable details (logs, payloads, errors) -->
351
- {#if step.details && step.details.length > 0}
352
- <div class="cinder-run-step-timeline__details">
353
- <!-- No idBase: let each Collapsible mint its own collision-free
354
- id via $props.id(). Passing detail.id here would reuse a
355
- consumer-supplied value that is only unique within a step, so
356
- two steps with a detail id like "logs" would produce duplicate
357
- DOM ids and cross-wired aria-controls. -->
358
- {#each step.details as detail (detail.id)}
359
- <Collapsible trigger={detail.label}>
360
- <pre class="cinder-run-step-timeline__detail-content">{detail.content}</pre>
361
- </Collapsible>
362
- {/each}
363
- </div>
364
- {/if}
365
-
366
- <!-- Optional per-step body slot -->
367
- {#if children}
368
- <div class="cinder-run-step-timeline__body">
369
- {@render children(step)}
370
- </div>
371
- {/if}
485
+ </ul>
486
+ </RunStepBranchDisclosure>
372
487
  </div>
373
488
  </div>
374
489
  </li>
490
+ {:else if entry.kind === 'depth-limit'}
491
+ {@render depthLimitItem(entry)}
492
+ {:else}
493
+ {@render stepItem(entry)}
375
494
  {/if}
376
495
  {/each}
377
496
  </ol>