@corenel/web-ui 0.13.2 → 0.14.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 (193) hide show
  1. package/dist/Composer.d.ts +30 -1
  2. package/dist/Composer.d.ts.map +1 -1
  3. package/dist/Composer.js +111 -19
  4. package/dist/Composer.js.map +1 -1
  5. package/dist/ContextBar.d.ts +9 -3
  6. package/dist/ContextBar.d.ts.map +1 -1
  7. package/dist/ContextBar.js +14 -7
  8. package/dist/ContextBar.js.map +1 -1
  9. package/dist/ContextManager.d.ts +10 -2
  10. package/dist/ContextManager.d.ts.map +1 -1
  11. package/dist/ContextManager.js +14 -10
  12. package/dist/ContextManager.js.map +1 -1
  13. package/dist/DictateButton.d.ts +21 -1
  14. package/dist/DictateButton.d.ts.map +1 -1
  15. package/dist/DictateButton.js +73 -10
  16. package/dist/DictateButton.js.map +1 -1
  17. package/dist/PickChips.d.ts +6 -0
  18. package/dist/PickChips.d.ts.map +1 -0
  19. package/dist/PickChips.js +55 -0
  20. package/dist/PickChips.js.map +1 -0
  21. package/dist/ProcessDock.d.ts +10 -0
  22. package/dist/ProcessDock.d.ts.map +1 -1
  23. package/dist/ProcessDock.js +24 -1
  24. package/dist/ProcessDock.js.map +1 -1
  25. package/dist/RichContent.d.ts.map +1 -1
  26. package/dist/RichContent.js +102 -24
  27. package/dist/RichContent.js.map +1 -1
  28. package/dist/SummaryTranscript.d.ts +5 -1
  29. package/dist/SummaryTranscript.d.ts.map +1 -1
  30. package/dist/SummaryTranscript.js +5 -3
  31. package/dist/SummaryTranscript.js.map +1 -1
  32. package/dist/TodoBar.d.ts +2 -0
  33. package/dist/TodoBar.d.ts.map +1 -1
  34. package/dist/TodoBar.js +8 -0
  35. package/dist/TodoBar.js.map +1 -1
  36. package/dist/TodoLine.d.ts +11 -0
  37. package/dist/TodoLine.d.ts.map +1 -0
  38. package/dist/TodoLine.js +55 -0
  39. package/dist/TodoLine.js.map +1 -0
  40. package/dist/ToolFold.js +1 -1
  41. package/dist/ToolFold.js.map +1 -1
  42. package/dist/Transcript.d.ts +19 -1
  43. package/dist/Transcript.d.ts.map +1 -1
  44. package/dist/Transcript.js +127 -58
  45. package/dist/Transcript.js.map +1 -1
  46. package/dist/agentChat/AgentChat.d.ts +42 -0
  47. package/dist/agentChat/AgentChat.d.ts.map +1 -1
  48. package/dist/agentChat/AgentChat.js +573 -100
  49. package/dist/agentChat/AgentChat.js.map +1 -1
  50. package/dist/agentChat/ChatSettingsSheet.d.ts +9 -0
  51. package/dist/agentChat/ChatSettingsSheet.d.ts.map +1 -0
  52. package/dist/agentChat/ChatSettingsSheet.js +103 -0
  53. package/dist/agentChat/ChatSettingsSheet.js.map +1 -0
  54. package/dist/agentChat/OptionsDrawer.d.ts +8 -0
  55. package/dist/agentChat/OptionsDrawer.d.ts.map +1 -1
  56. package/dist/agentChat/OptionsDrawer.js +24 -215
  57. package/dist/agentChat/OptionsDrawer.js.map +1 -1
  58. package/dist/agentChat/PlanReview.d.ts +1 -1
  59. package/dist/agentChat/PlanReview.d.ts.map +1 -1
  60. package/dist/agentChat/PlanReview.js +1 -1
  61. package/dist/agentChat/PlanReview.js.map +1 -1
  62. package/dist/agentChat/SourceGroups.d.ts +24 -0
  63. package/dist/agentChat/SourceGroups.d.ts.map +1 -0
  64. package/dist/agentChat/SourceGroups.js +117 -0
  65. package/dist/agentChat/SourceGroups.js.map +1 -0
  66. package/dist/agentChat/controller.d.ts +30 -1
  67. package/dist/agentChat/controller.d.ts.map +1 -1
  68. package/dist/agentChat/controller.js.map +1 -1
  69. package/dist/agentChat/pendingQueue.d.ts +4 -0
  70. package/dist/agentChat/pendingQueue.d.ts.map +1 -1
  71. package/dist/agentChat/pendingQueue.js +7 -0
  72. package/dist/agentChat/pendingQueue.js.map +1 -1
  73. package/dist/agentChat/planTool.d.ts +4 -0
  74. package/dist/agentChat/planTool.d.ts.map +1 -0
  75. package/dist/agentChat/planTool.js +4 -0
  76. package/dist/agentChat/planTool.js.map +1 -0
  77. package/dist/agentChat/testSheetHost.d.ts +3 -0
  78. package/dist/agentChat/testSheetHost.d.ts.map +1 -0
  79. package/dist/agentChat/testSheetHost.js +9 -0
  80. package/dist/agentChat/testSheetHost.js.map +1 -0
  81. package/dist/agentChat/useChatOptions.d.ts +63 -0
  82. package/dist/agentChat/useChatOptions.d.ts.map +1 -0
  83. package/dist/agentChat/useChatOptions.js +156 -0
  84. package/dist/agentChat/useChatOptions.js.map +1 -0
  85. package/dist/chatRefreshContext.d.ts +8 -0
  86. package/dist/chatRefreshContext.d.ts.map +1 -0
  87. package/dist/chatRefreshContext.js +14 -0
  88. package/dist/chatRefreshContext.js.map +1 -0
  89. package/dist/chatSkinContext.d.ts +13 -6
  90. package/dist/chatSkinContext.d.ts.map +1 -1
  91. package/dist/chatSkinContext.js +18 -4
  92. package/dist/chatSkinContext.js.map +1 -1
  93. package/dist/chatSkinCss.d.ts.map +1 -1
  94. package/dist/chatSkinCss.js +108 -22
  95. package/dist/chatSkinCss.js.map +1 -1
  96. package/dist/composerAction.d.ts +16 -0
  97. package/dist/composerAction.d.ts.map +1 -0
  98. package/dist/composerAction.js +20 -0
  99. package/dist/composerAction.js.map +1 -0
  100. package/dist/composerHistory.d.ts.map +1 -1
  101. package/dist/composerHistory.js +4 -1
  102. package/dist/composerHistory.js.map +1 -1
  103. package/dist/fx/LiveAnswer.d.ts.map +1 -1
  104. package/dist/fx/LiveAnswer.js +324 -59
  105. package/dist/fx/LiveAnswer.js.map +1 -1
  106. package/dist/fx/arrivalModes.d.ts +17 -2
  107. package/dist/fx/arrivalModes.d.ts.map +1 -1
  108. package/dist/fx/arrivalModes.js +46 -4
  109. package/dist/fx/arrivalModes.js.map +1 -1
  110. package/dist/fx/pacer.d.ts +41 -0
  111. package/dist/fx/pacer.d.ts.map +1 -0
  112. package/dist/fx/pacer.js +66 -0
  113. package/dist/fx/pacer.js.map +1 -0
  114. package/dist/fx/useReveal.d.ts +16 -1
  115. package/dist/fx/useReveal.d.ts.map +1 -1
  116. package/dist/fx/useReveal.js +101 -41
  117. package/dist/fx/useReveal.js.map +1 -1
  118. package/dist/localAddress.d.ts +2 -0
  119. package/dist/localAddress.d.ts.map +1 -0
  120. package/dist/localAddress.js +56 -0
  121. package/dist/localAddress.js.map +1 -0
  122. package/dist/steps/AfterReply.d.ts +67 -0
  123. package/dist/steps/AfterReply.d.ts.map +1 -0
  124. package/dist/steps/AfterReply.js +217 -0
  125. package/dist/steps/AfterReply.js.map +1 -0
  126. package/dist/steps/ChatApproval.d.ts +18 -0
  127. package/dist/steps/ChatApproval.d.ts.map +1 -0
  128. package/dist/steps/ChatApproval.js +35 -0
  129. package/dist/steps/ChatApproval.js.map +1 -0
  130. package/dist/steps/Delegation.d.ts +77 -0
  131. package/dist/steps/Delegation.d.ts.map +1 -0
  132. package/dist/steps/Delegation.js +188 -0
  133. package/dist/steps/Delegation.js.map +1 -0
  134. package/dist/steps/LiveRail.d.ts +14 -0
  135. package/dist/steps/LiveRail.d.ts.map +1 -0
  136. package/dist/steps/LiveRail.js +16 -0
  137. package/dist/steps/LiveRail.js.map +1 -0
  138. package/dist/steps/StepDetail.d.ts +23 -0
  139. package/dist/steps/StepDetail.d.ts.map +1 -0
  140. package/dist/steps/StepDetail.js +195 -0
  141. package/dist/steps/StepDetail.js.map +1 -0
  142. package/dist/steps/StepDetailHost.d.ts +54 -0
  143. package/dist/steps/StepDetailHost.d.ts.map +1 -0
  144. package/dist/steps/StepDetailHost.js +175 -0
  145. package/dist/steps/StepDetailHost.js.map +1 -0
  146. package/dist/steps/StepRail.d.ts +38 -0
  147. package/dist/steps/StepRail.d.ts.map +1 -0
  148. package/dist/steps/StepRail.js +238 -0
  149. package/dist/steps/StepRail.js.map +1 -0
  150. package/dist/steps/approval.d.ts +73 -0
  151. package/dist/steps/approval.d.ts.map +1 -0
  152. package/dist/steps/approval.js +81 -0
  153. package/dist/steps/approval.js.map +1 -0
  154. package/dist/steps/model.d.ts +140 -0
  155. package/dist/steps/model.d.ts.map +1 -0
  156. package/dist/steps/model.js +433 -0
  157. package/dist/steps/model.js.map +1 -0
  158. package/dist/steps/outcome.d.ts +5 -0
  159. package/dist/steps/outcome.d.ts.map +1 -0
  160. package/dist/steps/outcome.js +34 -0
  161. package/dist/steps/outcome.js.map +1 -0
  162. package/dist/steps/peek.d.ts +35 -0
  163. package/dist/steps/peek.d.ts.map +1 -0
  164. package/dist/steps/peek.js +219 -0
  165. package/dist/steps/peek.js.map +1 -0
  166. package/dist/steps/plan.d.ts +50 -0
  167. package/dist/steps/plan.d.ts.map +1 -0
  168. package/dist/steps/plan.js +242 -0
  169. package/dist/steps/plan.js.map +1 -0
  170. package/dist/steps/useRailDetail.d.ts +25 -0
  171. package/dist/steps/useRailDetail.d.ts.map +1 -0
  172. package/dist/steps/useRailDetail.js +108 -0
  173. package/dist/steps/useRailDetail.js.map +1 -0
  174. package/dist/steps/words.d.ts +40 -0
  175. package/dist/steps/words.d.ts.map +1 -0
  176. package/dist/steps/words.js +247 -0
  177. package/dist/steps/words.js.map +1 -0
  178. package/dist/toolRender.d.ts +27 -1
  179. package/dist/toolRender.d.ts.map +1 -1
  180. package/dist/toolRender.js +72 -4
  181. package/dist/toolRender.js.map +1 -1
  182. package/dist/transcriptSkin.d.ts.map +1 -1
  183. package/dist/transcriptSkin.js +66 -0
  184. package/dist/transcriptSkin.js.map +1 -1
  185. package/dist/transcriptSkinCss.d.ts +35 -0
  186. package/dist/transcriptSkinCss.d.ts.map +1 -1
  187. package/dist/transcriptSkinCss.js +360 -19
  188. package/dist/transcriptSkinCss.js.map +1 -1
  189. package/dist/useHoldPress.d.ts +24 -0
  190. package/dist/useHoldPress.d.ts.map +1 -0
  191. package/dist/useHoldPress.js +85 -0
  192. package/dist/useHoldPress.js.map +1 -0
  193. package/package.json +5 -5
@@ -6,10 +6,6 @@ const MODE = {
6
6
  * a radar contact glows about half a second, and a pencil sketch inks a beat
7
7
  * (~0.55 s) after it is drawn. */
8
8
  const BAND_LAG = { radar: 30, pencil: 33 };
9
- /** Reveal step per tick: typewriter keys at ~30 characters a second, the rest ~60. */
10
- export function paceFor(effect) {
11
- return effect === 'typewriter' ? 1 : 2;
12
- }
13
9
  const isSpace = (ch) => ch !== undefined && /\s/.test(ch);
14
10
  /** The end of the word containing (or starting at) `i`: the next whitespace. */
15
11
  export function bandEnd(text, i) {
@@ -66,6 +62,52 @@ export function committedAt(effect, text, shown, complete = true) {
66
62
  default: return at;
67
63
  }
68
64
  }
65
+ /** A pending line longer than this posts in pieces (netsplit). */
66
+ export const LONG_LINE = 120;
67
+ /** Netsplit: the next piece of a long unbroken line. When the revealed part of
68
+ * the line `from` is in (no line break revealed yet) is longer than LONG_LINE,
69
+ * the end of its last sentence (. ! or ? followed by a space, the space
70
+ * included), else of its last word (after the space); otherwise `from`. */
71
+ export function linePiece(text, from, revealed) {
72
+ const upTo = Math.min(revealed, text.length);
73
+ if (upTo - from <= LONG_LINE)
74
+ return from;
75
+ const nl = text.indexOf('\n', from);
76
+ if (nl >= 0 && nl < upTo)
77
+ return from;
78
+ const seg = text.slice(from, upTo);
79
+ for (let i = seg.length - 2; i >= 0; i--) {
80
+ if ((seg[i] === '.' || seg[i] === '!' || seg[i] === '?') && seg[i + 1] === ' ')
81
+ return from + i + 2;
82
+ }
83
+ const sp = seg.lastIndexOf(' ');
84
+ return sp > 0 ? from + sp + 1 : from;
85
+ }
86
+ /** Netsplit: post at most one more line per `gapMs`. `candidate` is what
87
+ * committedAt allows; the result is `prev` until the gap has passed, then the
88
+ * end of the next line and any blank lines after it (never past the candidate, never back). A zero gap
89
+ * passes the candidate through. `revealed` (the reveal point): a long line
90
+ * with no break yet posts in pieces (linePiece), still one post per gap. */
91
+ export function gateLines(text, prev, candidate, now, gapMs, revealed = candidate) {
92
+ if (candidate <= prev.committed)
93
+ candidate = Math.max(candidate, linePiece(text, prev.committed, revealed));
94
+ if (candidate <= prev.committed)
95
+ return prev;
96
+ if (gapMs <= 0)
97
+ return { committed: candidate, postedAt: now };
98
+ // Only blank lines are waiting: they ride with the line before them, no gap.
99
+ if (/^\n+$/.test(text.slice(prev.committed, candidate)))
100
+ return { committed: candidate, postedAt: prev.postedAt };
101
+ if (now - prev.postedAt < gapMs)
102
+ return prev;
103
+ const nl = text.indexOf('\n', prev.committed);
104
+ let end = nl < 0 ? candidate : nl + 1;
105
+ // Blank lines after a line post with it: a paragraph break is not a line to wait for.
106
+ while (end < candidate && text[end] === '\n')
107
+ end++;
108
+ end = Math.min(end, candidate);
109
+ return { committed: end, postedAt: now };
110
+ }
69
111
  /** True for the effects whose decoration is the trailing band of words. */
70
112
  export function isBandEffect(effect) {
71
113
  return MODE[effect] === 'band';
@@ -1 +1 @@
1
- {"version":3,"file":"arrivalModes.js","sourceRoot":"","sources":["../../fx/arrivalModes.ts"],"names":[],"mappings":"AAmBA,MAAM,IAAI,GAAgC;IACxC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACxH,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAChD,CAAC;AAEF;;kCAEkC;AAClC,MAAM,QAAQ,GAA2C,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAEnF,sFAAsF;AACtF,MAAM,UAAU,OAAO,CAAC,MAAqB;IAC3C,OAAO,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,EAAsB,EAAW,EAAE,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAEvF,gFAAgF;AAChF,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,CAAS;IAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,CAAC,EAAE,CAAC;IACjD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,4EAA4E;AAC5E,4EAA4E;AAC5E,6DAA6D;AAC7D,MAAM,YAAY,GAAG,2CAA2C,CAAC;AAEjE,SAAS,UAAU,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW;IAC1D,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;IACjC,kDAAkD;IAClD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,CAAC,EAAE,CAAC;IAC3C,uEAAuE;IACvE,wEAAwE;IACxE,yEAAyE;IACzE,0DAA0D;IAC1D,mEAAmE;IACnE,0EAA0E;IAC1E,4EAA4E;IAC5E,qCAAqC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,IAAI,GAAG,SAAS,CAAC;IACrB,OAAO,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAE,IAAI,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,IAAI,MAAM;QAAE,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAE,IAAI,EAAE,CAAC;IACzD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,MAAM,CAAC;QAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;uDAIuD;AACvD,MAAM,UAAU,WAAW,CAAC,MAAqB,EAAE,IAAY,EAAE,KAAa,EAAE,QAAQ,GAAG,IAAI;IAC7F,IAAI,QAAQ,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IACzD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,CAAC,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;YAC1C,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;AACjC,CAAC;AAED;mDACmD;AACnD,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,GAAG;SACP,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,CAAS;IAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,KAAK,EAAE,CAAC;IACrE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,oBAAoB,CAAC;AAC1C;uDACuD;AACvD,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAE9B;;gDAEgD;AAChD,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,OAAqB,IAAI,CAAC,MAAM;IAC5E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACrF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACxB,IAAI,OAAO,CAAC,EAAE,CAAC;YAAE,OAAO,GAAG,CAAC;QAC5B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;QACjC,OAAO,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"arrivalModes.js","sourceRoot":"","sources":["../../fx/arrivalModes.ts"],"names":[],"mappings":"AAmBA,MAAM,IAAI,GAAgC;IACxC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACxH,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAChD,CAAC;AAEF;;kCAEkC;AAClC,MAAM,QAAQ,GAA2C,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAEnF,MAAM,OAAO,GAAG,CAAC,EAAsB,EAAW,EAAE,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAEvF,gFAAgF;AAChF,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,CAAS;IAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,CAAC,EAAE,CAAC;IACjD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,4EAA4E;AAC5E,4EAA4E;AAC5E,6DAA6D;AAC7D,MAAM,YAAY,GAAG,2CAA2C,CAAC;AAEjE,SAAS,UAAU,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW;IAC1D,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;IACjC,kDAAkD;IAClD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,CAAC,EAAE,CAAC;IAC3C,uEAAuE;IACvE,wEAAwE;IACxE,yEAAyE;IACzE,0DAA0D;IAC1D,mEAAmE;IACnE,0EAA0E;IAC1E,4EAA4E;IAC5E,qCAAqC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,IAAI,GAAG,SAAS,CAAC;IACrB,OAAO,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAE,IAAI,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,IAAI,MAAM;QAAE,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAE,IAAI,EAAE,CAAC;IACzD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,MAAM,CAAC;QAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;uDAIuD;AACvD,MAAM,UAAU,WAAW,CAAC,MAAqB,EAAE,IAAY,EAAE,KAAa,EAAE,QAAQ,GAAG,IAAI;IAC7F,IAAI,QAAQ,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IACzD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,CAAC,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;YAC1C,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAID,kEAAkE;AAClE,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAE7B;;;2EAG2E;AAC3E,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAY,EAAE,QAAgB;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,IAAI,GAAG,IAAI,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACtG,CAAC;IACD,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvC,CAAC;AAED;;;;4EAI4E;AAC5E,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAc,EAAE,SAAiB,EAAE,GAAW,EAAE,KAAa,EAAE,QAAQ,GAAG,SAAS;IACzH,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5G,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC/D,6EAA6E;IAC7E,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClH,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtC,sFAAsF;IACtF,OAAO,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI;QAAE,GAAG,EAAE,CAAC;IACpD,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC3C,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;AACjC,CAAC;AAED;mDACmD;AACnD,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,GAAG;SACP,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,CAAS;IAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,KAAK,EAAE,CAAC;IACrE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,oBAAoB,CAAC;AAC1C;uDACuD;AACvD,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAE9B;;gDAEgD;AAChD,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,OAAqB,IAAI,CAAC,MAAM;IAC5E,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACrF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACxB,IAAI,OAAO,CAAC,EAAE,CAAC;YAAE,OAAO,GAAG,CAAC;QAC5B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;QACjC,OAAO,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { ArrivalEffect } from '../arrivalEffect';
2
+ export interface PaceConfig {
3
+ /** Characters a second while animating. */
4
+ cps: number;
5
+ /** Backlog (characters) above which everything waiting sweeps in. */
6
+ threshold: number;
7
+ /** How long a sweep takes. */
8
+ sweepMs: number;
9
+ /** Once the text is complete, the most the rest may take. */
10
+ finishMs: number;
11
+ /** Netsplit: least time between two posted lines (0 = none). */
12
+ lineGapMs: number;
13
+ /** Caught up with no new text this long: commit everything. */
14
+ idleMs: number;
15
+ }
16
+ export declare const DEFAULT_PACE: PaceConfig;
17
+ export declare function paceConfig(effect: ArrivalEffect): PaceConfig;
18
+ export interface PacerState {
19
+ shown: number;
20
+ length: number;
21
+ lastAt: number;
22
+ grewAt: number;
23
+ carry: number;
24
+ sweep: {
25
+ from: number;
26
+ to: number;
27
+ startedAt: number;
28
+ } | null;
29
+ /** Chars/s fixed when the text first became complete. */
30
+ finishRate: number | null;
31
+ }
32
+ export interface PacerInput {
33
+ now: number;
34
+ length: number;
35
+ complete: boolean;
36
+ reveal?: boolean;
37
+ }
38
+ export declare function startPacer(now: number, start: number, length: number): PacerState;
39
+ export declare function stepPacer(s: PacerState, input: PacerInput, cfg: PaceConfig): PacerState;
40
+ export declare function isSettled(s: PacerState, now: number, cfg: PaceConfig): boolean;
41
+ //# sourceMappingURL=pacer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pacer.d.ts","sourceRoot":"","sources":["../../fx/pacer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,YAAY,EAAE,UAO1B,CAAC;AAEF,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAI5D;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D,yDAAyD;IACzD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAEjF;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CA4CvF;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAE9E"}
@@ -0,0 +1,66 @@
1
+ export const DEFAULT_PACE = {
2
+ cps: 60,
3
+ threshold: 300,
4
+ sweepMs: 150,
5
+ finishMs: 1000,
6
+ lineGapMs: 0,
7
+ idleMs: 800,
8
+ };
9
+ export function paceConfig(effect) {
10
+ if (effect === 'typewriter')
11
+ return { ...DEFAULT_PACE, cps: 30, threshold: 150 };
12
+ if (effect === 'netsplit')
13
+ return { ...DEFAULT_PACE, lineGapMs: 200 };
14
+ return { ...DEFAULT_PACE };
15
+ }
16
+ export function startPacer(now, start, length) {
17
+ return { shown: start, length, lastAt: now, grewAt: now, carry: 0, sweep: null, finishRate: null };
18
+ }
19
+ export function stepPacer(s, input, cfg) {
20
+ const { now, length, complete, reveal } = input;
21
+ if (length < s.length)
22
+ return startPacer(now, 0, length);
23
+ const grewAt = length > s.length ? now : s.grewAt;
24
+ const dt = Math.max(0, now - s.lastAt);
25
+ const next = { ...s, length, lastAt: now, grewAt };
26
+ let sweep = s.sweep;
27
+ if (!sweep) {
28
+ const backlog = length - s.shown;
29
+ if (backlog > 0 && (reveal || backlog > cfg.threshold)) {
30
+ sweep = { from: s.shown, to: length, startedAt: now };
31
+ }
32
+ }
33
+ if (sweep) {
34
+ const p = Math.min(1, (now - sweep.startedAt) / cfg.sweepMs);
35
+ next.shown = sweep.from + Math.round((sweep.to - sweep.from) * p);
36
+ if (p >= 1) {
37
+ next.sweep = null;
38
+ next.carry = 0;
39
+ }
40
+ else {
41
+ next.sweep = sweep;
42
+ }
43
+ return next;
44
+ }
45
+ const backlog = length - s.shown;
46
+ if (complete && s.finishRate === null) {
47
+ next.finishRate = Math.max(cfg.cps, (backlog * 1000) / cfg.finishMs);
48
+ }
49
+ const rate = complete ? (next.finishRate ?? cfg.cps) : cfg.cps;
50
+ const adv = (rate * dt) / 1000 + s.carry;
51
+ const whole = Math.floor(adv + 1e-9);
52
+ const shown = s.shown + whole;
53
+ if (shown >= length) {
54
+ next.shown = length;
55
+ next.carry = 0;
56
+ }
57
+ else {
58
+ next.shown = shown;
59
+ next.carry = Math.max(0, adv - whole);
60
+ }
61
+ return next;
62
+ }
63
+ export function isSettled(s, now, cfg) {
64
+ return s.sweep === null && s.shown >= s.length && now - s.grewAt >= cfg.idleMs;
65
+ }
66
+ //# sourceMappingURL=pacer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pacer.js","sourceRoot":"","sources":["../../fx/pacer.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,17 @@
1
- export declare function useReveal(text: string, active: boolean, minStep?: number, start?: number): number;
1
+ import type { ArrivalEffect } from '../arrivalEffect';
2
+ export interface RevealOptions {
3
+ active: boolean;
4
+ effect: ArrivalEffect;
5
+ complete: boolean;
6
+ /** A hand-off resumes where the in-progress turn left off. */
7
+ start?: number;
8
+ now?: () => number;
9
+ }
10
+ export interface Reveal {
11
+ shown: number;
12
+ sweeping: boolean;
13
+ settled: boolean;
14
+ reveal: () => void;
15
+ }
16
+ export declare function useReveal(text: string, opts: RevealOptions): Reveal;
2
17
  //# sourceMappingURL=useReveal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useReveal.d.ts","sourceRoot":"","sources":["../../fx/useReveal.ts"],"names":[],"mappings":"AAiBA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAE,MAAiB,EAAE,KAAK,SAAI,GAAG,MAAM,CA2CtG"}
1
+ {"version":3,"file":"useReveal.d.ts","sourceRoot":"","sources":["../../fx/useReveal.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMtD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAOD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CA6FnE"}
@@ -1,59 +1,119 @@
1
1
  /* Paced reveal for arrival effects: how much of the streamed answer to show.
2
2
  *
3
- * About 60 characters a second (callers can go slower), but never more than
4
- * about 2.5 s behind: when the text grows, the pace is re-derived so the whole
5
- * backlog clears within CATCH_UP_TICKS. A fixed rate per backlog, not a
6
- * fraction of what is left: a fraction decays geometrically.
3
+ * The count comes from the pure pacer (pacer.ts): the skin's pace while the
4
+ * backlog is small, one quick sweep when it is large, the rest within about a
5
+ * second once the answer is complete. This hook only owns the clock.
7
6
  *
8
7
  * ONE timer for the life of the reveal. The live answer re-renders on every
9
8
  * streamed delta, often faster than a tick; a timer keyed on the text was
10
- * cleared and restarted by each delta and never got to tick. The text's
11
- * length and the pace live in refs the timer reads instead. */
12
- import { useEffect, useLayoutEffect, useRef, useState } from 'react';
13
- const TICK_MS = 33;
14
- const MIN_STEP = 2; // ~60 cps
15
- const CATCH_UP_TICKS = 75; // ~2.5 s
16
- export function useReveal(text, active, minStep = MIN_STEP, start = 0) {
17
- // `start`: a hand-off resumes where the in-progress turn left off.
18
- const [shown, setShown] = useState(start);
19
- const [prevLen, setPrevLen] = useState(text.length);
20
- const shownRef = useRef(start);
21
- const lenRef = useRef(text.length);
22
- const stepRef = useRef(minStep);
23
- shownRef.current = shown;
24
- // Switched on mid-answer: keep what is already shown, reveal only what
25
- // arrives next. Starting from 0 would blank the answer and replay it.
9
+ * cleared and restarted by each delta and never got to tick. The text's length
10
+ * and the inputs live in refs the timer reads instead. The timer runs only
11
+ * while there is work (a backlog, a sweep, or streaming and not yet settled)
12
+ * and is restarted by new text, completion or reveal().
13
+ *
14
+ * Switched on mid-answer, it starts at text.length: starting from 0 would
15
+ * blank the answer and replay it. */
16
+ import { useCallback, useEffect, useRef, useState } from 'react';
17
+ import { isSettled, paceConfig, startPacer, stepPacer } from './pacer';
18
+ const TICK_MS = 25; // 40 Hz: a tick lands exactly on each 100ms, so 60 chars a second shows 6 per 100ms
19
+ const SWEEP_TICK_MS = 16;
20
+ const noop = () => undefined;
21
+ const defaultNow = () => Date.now();
22
+ export function useReveal(text, opts) {
23
+ const { active, effect, complete, start = 0 } = opts;
24
+ const nowFn = opts.now ?? defaultNow;
25
+ const nowRef = useRef(nowFn);
26
+ nowRef.current = nowFn;
27
+ const [view, setView] = useState(() => ({ shown: Math.min(start, text.length), sweeping: false, settled: false }));
28
+ const pacerRef = useRef(null);
29
+ if (pacerRef.current === null)
30
+ pacerRef.current = startPacer(nowRef.current(), Math.min(start, text.length), text.length);
31
+ const lengthRef = useRef(text.length);
32
+ const completeRef = useRef(complete);
33
+ const cfgRef = useRef(paceConfig(effect));
34
+ const activeRef = useRef(active);
35
+ const revealFlag = useRef(false);
36
+ const timerRef = useRef(null);
37
+ lengthRef.current = text.length;
38
+ completeRef.current = complete;
39
+ cfgRef.current = paceConfig(effect);
40
+ activeRef.current = active;
41
+ // Switched on mid-answer: keep what is shown, reveal only what arrives next.
26
42
  const [prevActive, setPrevActive] = useState(active);
27
43
  if (active !== prevActive) {
28
44
  setPrevActive(active);
29
- if (active)
30
- setShown(text.length);
45
+ if (active) {
46
+ pacerRef.current = startPacer(nowRef.current(), text.length, text.length);
47
+ setView({ shown: text.length, sweeping: false, settled: false });
48
+ }
31
49
  }
32
50
  // A shorter text is a new answer: start it from the beginning.
51
+ const [prevLen, setPrevLen] = useState(text.length);
33
52
  if (text.length !== prevLen) {
34
53
  setPrevLen(text.length);
35
- if (text.length < prevLen)
36
- setShown(0);
54
+ if (text.length > prevLen)
55
+ setView((v) => (v.settled ? { ...v, settled: false } : v));
56
+ if (text.length < prevLen) {
57
+ pacerRef.current = startPacer(nowRef.current(), 0, text.length);
58
+ setView({ shown: 0, sweeping: false, settled: false });
59
+ }
37
60
  }
38
- // Re-derive the pace whenever the text changes.
39
- useLayoutEffect(() => {
40
- lenRef.current = text.length;
41
- const from = text.length < shownRef.current ? 0 : shownRef.current;
42
- stepRef.current = Math.max(minStep, Math.floor((text.length - from) / CATCH_UP_TICKS));
43
- }, [text, minStep]);
61
+ const schedule = useCallback(() => {
62
+ if (timerRef.current !== null || !activeRef.current)
63
+ return;
64
+ // Restarting from idle: the clock starts now, or the idle gap would count as pacing time.
65
+ if (pacerRef.current !== null)
66
+ pacerRef.current = { ...pacerRef.current, lastAt: nowRef.current() };
67
+ const s = pacerRef.current;
68
+ const delay = s !== null && s.sweep !== null ? SWEEP_TICK_MS : TICK_MS;
69
+ timerRef.current = setTimeout(run, delay);
70
+ }, []);
71
+ const run = useCallback(() => {
72
+ timerRef.current = null;
73
+ const prev = pacerRef.current;
74
+ if (prev === null || !activeRef.current)
75
+ return;
76
+ const now = nowRef.current();
77
+ const cfg = cfgRef.current;
78
+ const reveal = revealFlag.current;
79
+ revealFlag.current = false;
80
+ const next = stepPacer(prev, { now, length: lengthRef.current, complete: completeRef.current, reveal }, cfg);
81
+ pacerRef.current = next;
82
+ const caughtUp = next.sweep === null && next.shown >= next.length;
83
+ const settled = isSettled(next, now, cfg) || (completeRef.current && caughtUp);
84
+ /* The step that completes a sweep (or a tap reveal) still reports sweeping:
85
+ * the blocks it brings in are the sweep's last batch and must take its fade,
86
+ * not appear at full opacity. One more tick then clears it. */
87
+ const finishing = prev.sweep !== null && next.sweep === null;
88
+ const pub = { shown: next.shown, sweeping: next.sweep !== null || finishing, settled };
89
+ setView((v) => (v.shown === pub.shown && v.sweeping === pub.sweeping && v.settled === pub.settled ? v : pub));
90
+ const work = finishing || !caughtUp || (!completeRef.current && !settled);
91
+ if (work)
92
+ schedule();
93
+ }, [schedule]);
94
+ // New text, completion or switching on: make sure the timer is running.
44
95
  useEffect(() => {
45
- if (!active)
96
+ if (!active) {
97
+ if (timerRef.current !== null) {
98
+ clearTimeout(timerRef.current);
99
+ timerRef.current = null;
100
+ }
46
101
  return;
47
- const id = setInterval(() => {
48
- setShown((s) => {
49
- const len = lenRef.current;
50
- return s >= len ? s : Math.min(len, s + stepRef.current);
51
- });
52
- }, TICK_MS);
53
- return () => clearInterval(id);
54
- }, [active]);
102
+ }
103
+ schedule();
104
+ }, [active, text.length, complete, schedule]);
105
+ useEffect(() => () => {
106
+ if (timerRef.current !== null) {
107
+ clearTimeout(timerRef.current);
108
+ timerRef.current = null;
109
+ }
110
+ }, []);
111
+ const reveal = useCallback(() => {
112
+ revealFlag.current = true;
113
+ schedule();
114
+ }, [schedule]);
55
115
  if (!active)
56
- return text.length;
57
- return Math.min(shown, text.length);
116
+ return { shown: text.length, sweeping: false, settled: true, reveal: noop };
117
+ return { shown: Math.min(view.shown, text.length), sweeping: view.sweeping, settled: view.settled, reveal };
58
118
  }
59
119
  //# sourceMappingURL=useReveal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useReveal.js","sourceRoot":"","sources":["../../fx/useReveal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;+DAU+D;AAC/D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAErE,MAAM,OAAO,GAAG,EAAE,CAAC;AACnB,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU;AAC9B,MAAM,cAAc,GAAG,EAAE,CAAC,CAAC,SAAS;AAEpC,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,MAAe,EAAE,UAAkB,QAAQ,EAAE,KAAK,GAAG,CAAC;IAC5F,mEAAmE;IACnE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAEzB,uEAAuE;IACvE,sEAAsE;IACtE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,aAAa,CAAC,MAAM,CAAC,CAAC;QACtB,IAAI,MAAM;YAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,+DAA+D;IAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC5B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO;YAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,gDAAgD;IAChD,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QACnE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IACzF,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;YAC1B,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;gBAC3B,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,OAAO,CAAC,CAAC;QACZ,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAChC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"useReveal.js","sourceRoot":"","sources":["../../fx/useReveal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function firstLocalAddress(lines: readonly string[]): string | null;
2
+ //# sourceMappingURL=localAddress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localAddress.d.ts","sourceRoot":"","sources":["../localAddress.ts"],"names":[],"mappings":"AAyCA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CASzE"}
@@ -0,0 +1,56 @@
1
+ /* Finds the first web address a process printed that points at the machine it
2
+ * runs on. Pure text in, address out: whether the person's browser is on that
3
+ * machine is decided by the caller, which owns the connection. */
4
+ /* CSI sequences (colors, cursor moves) and OSC sequences (titles, hyperlinks),
5
+ * the latter ended by BEL or ESC backslash. Written with escapes so the source
6
+ * holds no raw control bytes. */
7
+ const ANSI = /\u001b\[[0-?]*[ -/]*[@-~]|\u001b\][^\u0007\u001b]*(?:\u0007|\u001b\\)/g;
8
+ /* A candidate runs to whitespace, a quote or an angle bracket; trailing log
9
+ * punctuation is trimmed afterwards. */
10
+ const CANDIDATE = /https?:\/\/[^\s"'<>`]+/gi;
11
+ const TRAILING = /[.,;:!?)}"'`]+$/;
12
+ const LOCAL_HOST = /^(localhost|127\.\d+\.\d+\.\d+|\[::1\]|0\.0\.0\.0)$/i;
13
+ const count = (s, ch) => s.split(ch).length - 1;
14
+ /* Trailing punctuation that follows a URL in prose or logs is not part of it.
15
+ * A ']' is dropped only when it has no '[' to close, so [::1] survives. */
16
+ function trimTail(candidate) {
17
+ let c = candidate;
18
+ for (;;) {
19
+ const next = c.replace(TRAILING, '');
20
+ const stripped = next.endsWith(']') && count(next, ']') > count(next, '[') ? next.slice(0, -1) : next;
21
+ if (stripped === c)
22
+ return c;
23
+ c = stripped;
24
+ }
25
+ }
26
+ function localHref(candidate) {
27
+ let url;
28
+ try {
29
+ url = new URL(candidate);
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
35
+ return null;
36
+ if (!LOCAL_HOST.test(url.hostname))
37
+ return null;
38
+ if (url.hostname === '0.0.0.0')
39
+ url.hostname = 'localhost';
40
+ // Credentials a process printed are never carried into the address opened.
41
+ url.username = '';
42
+ url.password = '';
43
+ return url.href;
44
+ }
45
+ export function firstLocalAddress(lines) {
46
+ for (const raw of lines) {
47
+ const text = raw.replace(ANSI, '');
48
+ for (const m of text.matchAll(CANDIDATE)) {
49
+ const href = localHref(trimTail(m[0]));
50
+ if (href)
51
+ return href;
52
+ }
53
+ }
54
+ return null;
55
+ }
56
+ //# sourceMappingURL=localAddress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localAddress.js","sourceRoot":"","sources":["../localAddress.ts"],"names":[],"mappings":"AAAA;;kEAEkE;AAElE;;iCAEiC;AACjC,MAAM,IAAI,GAAG,wEAAwE,CAAC;AAEtF;wCACwC;AACxC,MAAM,SAAS,GAAG,0BAA0B,CAAC;AAC7C,MAAM,QAAQ,GAAG,iBAAiB,CAAC;AACnC,MAAM,UAAU,GAAG,sDAAsD,CAAC;AAE1E,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAU,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAExE;2EAC2E;AAC3E,SAAS,QAAQ,CAAC,SAAiB;IACjC,IAAI,CAAC,GAAG,SAAS,CAAC;IAClB,SAAS,CAAC;QACR,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtG,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC7B,CAAC,GAAG,QAAQ,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,SAAiB;IAClC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IACxD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;IAC3D,2EAA2E;IAC3E,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;IAClB,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;IAClB,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAwB;IACxD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { type JSX } from 'react';
2
+ import type { ConversationTurn, TurnStats } from '@corenel/harness/conversation';
3
+ import type { TurnVerification } from '@corenel/protocol';
4
+ import './rail.css';
5
+ export interface AfterSegment {
6
+ text: string;
7
+ tone: 'plain' | 'bad';
8
+ /** 'time' draws a clock before the text; everything else is words only. */
9
+ kind?: 'time';
10
+ }
11
+ /** >= $0.01 reads "$0.03", a smaller cost "<$0.01", no cost nothing. */
12
+ export declare function fmtCost(cost: number): string;
13
+ /** The line's segments, in order. A mismatch is always here: the detail may be
14
+ * closed, and a change that did not take must never be hidden. */
15
+ export declare function afterSegments(p: {
16
+ steps: number;
17
+ stats?: TurnStats;
18
+ verification?: TurnVerification;
19
+ audit?: {
20
+ lost: number;
21
+ unconfirmed?: boolean;
22
+ };
23
+ included: boolean;
24
+ folded: boolean;
25
+ }): AfterSegment[];
26
+ /** The usage in the words the old stats line used. A collaboration room's log
27
+ * records only cost, with inTok/outTok/ms at 0 meaning "unknown", so those
28
+ * segments are left out rather than stated as zero. */
29
+ export declare function statsParts(stats: TurnStats): {
30
+ segments: string[];
31
+ titleParts: string[];
32
+ };
33
+ /** A token count short enough for a tile: 950, 18.2k, 1.4M. */
34
+ export declare function compactCount(n: number): string;
35
+ export interface UsageTile {
36
+ label: string;
37
+ value: string;
38
+ /** The exact figure and what it counts, for the tooltip. */
39
+ title: string;
40
+ /** The exact figure on screen, when the value is rounded: a tooltip never
41
+ * reaches touch, the keyboard or the phone sheet. */
42
+ exact?: string;
43
+ }
44
+ /** The detail's usage as tiles plus one note line. Same rules as statsParts: a
45
+ * room's log records only cost, so zero tokens or time are left out, not shown
46
+ * as zero. */
47
+ export declare function usageTiles(stats: TurnStats): {
48
+ tiles: UsageTile[];
49
+ note: string;
50
+ };
51
+ /** The context switch's name. It never changes: the switch's state says
52
+ * whether the turn is sent, so the label cannot contradict the knob. "Later
53
+ * turns", not "the next": a turn left in context rides every request after it. */
54
+ export declare const INCLUDED_LABEL = "Send to the model on later turns";
55
+ interface DetailProps {
56
+ turn: ConversationTurn;
57
+ folded: boolean;
58
+ beforeFold: boolean;
59
+ replyText: string;
60
+ onToggleInclude?: (id: string) => void;
61
+ onRetry?: (id: string) => void;
62
+ }
63
+ export declare function AfterReply(p: DetailProps & {
64
+ steps: number;
65
+ }): JSX.Element | null;
66
+ export {};
67
+ //# sourceMappingURL=AfterReply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AfterReply.d.ts","sourceRoot":"","sources":["../../steps/AfterReply.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAO1D,OAAO,YAAY,CAAC;AASpB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IACtB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wEAAwE;AACxE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5C;AAMD;kEACkE;AAClE,wBAAgB,aAAa,CAAC,CAAC,EAAE;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,YAAY,EAAE,CAkBjB;AAED;;uDAEuD;AACvD,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CA4BzF;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd;yDACqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;cAEc;AACd,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG;IAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAsBjF;AAkED;;kFAEkF;AAClF,eAAO,MAAM,cAAc,qCAAqC,CAAC;AAEjE,UAAU,WAAW;IACnB,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AA4DD,wBAAgB,UAAU,CAAC,CAAC,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CA6EjF"}