@corenel/web-ui 0.13.3 → 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
@@ -0,0 +1,14 @@
1
+ import type { JSX } from 'react';
2
+ import type { ArrivalEffect } from '../arrivalEffect';
3
+ import type { TurnBlock } from './model';
4
+ import { type RerunOpts } from './useRailDetail';
5
+ /** The scope of the live turn's detail ids. At run end the chat moves an open
6
+ * one to its settled twin (StepDetailHost `follow`). */
7
+ export declare const LIVE_SCOPE = "live/";
8
+ /** The in-progress turn's steps on the rail (liveBlocks), each opening its
9
+ * detail in the host above, like a settled turn's. */
10
+ export declare function LiveRail(p: {
11
+ blocks: TurnBlock[];
12
+ nameFx?: ArrivalEffect;
13
+ } & RerunOpts): JSX.Element | null;
14
+ //# sourceMappingURL=LiveRail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveRail.d.ts","sourceRoot":"","sources":["../../steps/LiveRail.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEhE;wDACwD;AACxD,eAAO,MAAM,UAAU,UAAU,CAAC;AAElC;sDACsD;AACtD,wBAAgB,QAAQ,CAAC,CAAC,EAAE;IAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,GAAG,SAAS,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAS3G"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { StepRail } from './StepRail';
3
+ import { useRailDetail } from './useRailDetail';
4
+ /** The scope of the live turn's detail ids. At run end the chat moves an open
5
+ * one to its settled twin (StepDetailHost `follow`). */
6
+ export const LIVE_SCOPE = 'live/';
7
+ /** The in-progress turn's steps on the rail (liveBlocks), each opening its
8
+ * detail in the host above, like a settled turn's. */
9
+ export function LiveRail(p) {
10
+ const { selectedId, openStep } = useRailDetail(LIVE_SCOPE, p.blocks, { onRerun: p.onRerun, canRerun: p.canRerun });
11
+ const rails = p.blocks.filter((b) => b.kind === 'rail');
12
+ if (!rails.length)
13
+ return null;
14
+ return (_jsx(_Fragment, { children: rails.map((b) => _jsx(StepRail, { items: b.items, onOpenStep: openStep, selectedId: selectedId, nameFx: p.nameFx }, b.key)) }));
15
+ }
16
+ //# sourceMappingURL=LiveRail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveRail.js","sourceRoot":"","sources":["../../steps/LiveRail.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAkB,MAAM,iBAAiB,CAAC;AAEhE;wDACwD;AACxD,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC;AAElC;sDACsD;AACtD,MAAM,UAAU,QAAQ,CAAC,CAA8D;IACrF,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnH,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAA6C,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACnG,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,CACL,4BACG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAC,QAAQ,IAAa,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAArF,CAAC,CAAC,GAAG,CAAoF,CAAC,GAC1H,CACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type JSX } from 'react';
2
+ import type { Step } from './model';
3
+ import './rail.css';
4
+ /** The detail's title: what kind of thing the step did, in words. A kind with no
5
+ * fixed title says the step's own line ("Used create issue on github"), not a
6
+ * bare verb. */
7
+ export declare function stepTitle(step: Step): string;
8
+ /** A secondary button that copies `text` and says whether it worked. */
9
+ export declare function CopyButton(p: {
10
+ text: string;
11
+ label?: string;
12
+ }): JSX.Element;
13
+ /** The same copy as an icon for a detail's header. Its name says what happened,
14
+ * so a screen reader hears "Copied" where a sighted reader sees the check. */
15
+ export declare function CopyIconButton(p: {
16
+ text: string;
17
+ label: string;
18
+ }): JSX.Element;
19
+ export declare function StepDetailBody(p: {
20
+ step: Step;
21
+ onRerun?: () => void;
22
+ }): JSX.Element;
23
+ //# sourceMappingURL=StepDetail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepDetail.d.ts","sourceRoot":"","sources":["../../steps/StepDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAI9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAMpC,OAAO,YAAY,CAAC;AA+BpB;;gBAEgB;AAChB,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAO5C;AA4ID,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAG3E;AAED;8EAC8E;AAC9E,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAQ9E;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAqCnF"}
@@ -0,0 +1,195 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from 'react';
3
+ import { KitButton } from '@corenel/ui-kit/kit';
4
+ import { IcCheck, IcCopy, IcX } from '@corenel/ui-kit/icons';
5
+ import { RichArgs, RichResult } from '../RichContent';
6
+ import { firstLine } from './outcome';
7
+ import { capLines, commandMeta, DETAIL_LINE_CAP, lineTone, parseCommandResult, writePeek } from './peek';
8
+ import { durationText } from './StepRail';
9
+ import { BlockedResult, CHECK_FLAG_AT, checkText } from '../toolRender';
10
+ import { hookSummary } from './words';
11
+ import './rail.css';
12
+ /* A step's full detail: what it acted on, where, how it ended, and its output.
13
+ * The host (StepDetailHost) puts it in a Sheet on the phone or the side panel on
14
+ * desktop. Copy output and Run again live here, not on the step line.
15
+ *
16
+ * Huge output stays cheap: at most DETAIL_LINE_CAP lines render, then one line says
17
+ * how many more there are. Copy output always copies everything. */
18
+ const COPIED_MS = 1200;
19
+ const REASON_MAX = 300;
20
+ /** Longest a rendered detail line may be; Copy output still copies the whole line. */
21
+ const LINE_CLIP = 2000;
22
+ function text(v) {
23
+ return typeof v === 'string' ? v : '';
24
+ }
25
+ function clip(s, max) {
26
+ return s.length > max ? `${s.slice(0, max - 1)}…` : s;
27
+ }
28
+ function refused(step) {
29
+ return step.status === 'failed' && step.outcome === 'refused';
30
+ }
31
+ const TITLE_MAX = 80;
32
+ /** The detail's title: what kind of thing the step did, in words. A kind with no
33
+ * fixed title says the step's own line ("Used create issue on github"), not a
34
+ * bare verb. */
35
+ export function stepTitle(step) {
36
+ const { kind, verb, object } = step.words;
37
+ if (kind === 'run' && text(step.args.command))
38
+ return 'Ran a command';
39
+ if (kind === 'write' && text(step.args.path))
40
+ return 'Wrote a file';
41
+ if (kind === 'read' && text(step.args.path))
42
+ return 'Read a file';
43
+ if (kind === 'search' || kind === 'list')
44
+ return 'Explored';
45
+ return clip([verb, object].filter(Boolean).join(' '), TITLE_MAX);
46
+ }
47
+ /** The output the step's main area shows and Copy output copies. */
48
+ function outputOf(step) {
49
+ const source = step.status === 'running' ? text(step.partial) : step.result;
50
+ if (refused(step))
51
+ return step.result;
52
+ const kind = step.words.kind;
53
+ if (kind === 'run')
54
+ return parseCommandResult(step.name, step.args, source).body;
55
+ if (kind === 'write') {
56
+ const content = text(step.args.content);
57
+ return content || source;
58
+ }
59
+ return source;
60
+ }
61
+ /** Why a failed step failed, for the first row. */
62
+ function reasonOf(step) {
63
+ if (refused(step))
64
+ return 'Refused';
65
+ // A command's own words for its failure ("1 failed", "timed out") beat its first
66
+ // line; a passing count ("3 passed") is not a reason.
67
+ if (step.words.kind === 'run') {
68
+ const m = commandMeta(parseCommandResult(step.name, step.args, step.result));
69
+ if (m.tone === 'bad')
70
+ return m.text;
71
+ }
72
+ return clip(firstLine(step.result), REASON_MAX);
73
+ }
74
+ function rowsOf(step) {
75
+ const rows = [];
76
+ if (step.status === 'failed') {
77
+ const reason = reasonOf(step);
78
+ if (reason)
79
+ rows.push({ label: 'Reason', value: reason, tone: 'bad' });
80
+ }
81
+ const a = step.args;
82
+ const add = (label, value) => {
83
+ if (value)
84
+ rows.push({ label, value });
85
+ };
86
+ switch (step.words.kind) {
87
+ case 'run': {
88
+ add('Command', text(a.command) || step.words.object);
89
+ add('Folder', text(a.cwd) || text(a.root) || '.');
90
+ if (step.status !== 'running' && step.status !== 'stopped' && !refused(step)) {
91
+ const r = parseCommandResult(step.name, a, step.result);
92
+ add('Exit', r.timedOut ? 'timed out' : r.exit !== null ? `exit ${r.exit}` : '');
93
+ const ms = typeof step.ms === 'number' ? step.ms : r.ms;
94
+ if (typeof ms === 'number')
95
+ add('Duration', durationText(ms));
96
+ }
97
+ break;
98
+ }
99
+ case 'write': {
100
+ add('Path', text(a.path));
101
+ add('Folder', text(a.root));
102
+ const w = writePeek(a, 0);
103
+ if (w && !refused(step))
104
+ add('Lines', `+${w.added}`);
105
+ break;
106
+ }
107
+ case 'read':
108
+ case 'search':
109
+ case 'list': {
110
+ if (text(a.path))
111
+ add('Path', text(a.path));
112
+ else
113
+ add('Query', text(a.query) || text(a.pattern));
114
+ add('Folder', text(a.root));
115
+ break;
116
+ }
117
+ default:
118
+ break;
119
+ }
120
+ if (step.check)
121
+ rows.push({ label: 'Check', value: checkText(step.check), ...('score' in step.check && step.check.score >= CHECK_FLAG_AT ? { tone: 'bad' } : {}) });
122
+ const s1 = hookSummary(step.hooks, step.check);
123
+ if (s1.states.length)
124
+ rows.push({ label: 'System One', value: s1.states.join(', '), ...(s1.blocked ? { tone: 'bad' } : {}) });
125
+ return rows;
126
+ }
127
+ /** Shown is capped; `more` counts the lines left out. */
128
+ function Output(p) {
129
+ const { shown, more } = capLines(p.body, DETAIL_LINE_CAP);
130
+ if (!shown && !more) {
131
+ return _jsx("div", { className: "tx-detail-output", "data-tx-part": "detail-output", "data-tx-empty": "", children: "No output." });
132
+ }
133
+ const lines = shown.split('\n');
134
+ return (_jsxs("div", { className: "tx-detail-output", "data-tx-part": "detail-output", children: [lines.map((raw, i) => {
135
+ const full = raw.endsWith('\r') ? raw.slice(0, -1) : raw;
136
+ const line = full.length > LINE_CLIP ? full.slice(0, LINE_CLIP) : full;
137
+ const tone = p.toned ? lineTone(line) : 'plain';
138
+ return (_jsxs("div", { className: "tx-detail-line", "data-tx-part": "detail-line", "data-tx-tone": tone, children: [p.numbered ? _jsx("span", { className: "tx-detail-num", "data-tx-part": "detail-num", children: i + 1 }) : null, line, full.length > LINE_CLIP ? (_jsx("span", { className: "tx-detail-clip", "data-tx-part": "detail-clip", children: ` ${(full.length - LINE_CLIP).toLocaleString('en-US')} more characters` })) : null] }, i));
139
+ }), more > 0 ? (_jsx("div", { className: "tx-detail-more", "data-tx-part": "detail-more", children: `${more.toLocaleString('en-US')} more ${more === 1 ? 'line' : 'lines'}. Copy output for all of it.` })) : null] }));
140
+ }
141
+ const COPY_WORDS = { copied: 'Copied', failed: 'Copy failed' };
142
+ /** Copy `text` on demand; the state says whether it worked, for COPIED_MS. */
143
+ function useCopy(text) {
144
+ const [state, setState] = useState('idle');
145
+ const timer = useRef(null);
146
+ const live = useRef(true);
147
+ useEffect(() => {
148
+ live.current = true;
149
+ return () => {
150
+ live.current = false;
151
+ if (timer.current)
152
+ clearTimeout(timer.current);
153
+ };
154
+ }, []);
155
+ const show = (next) => {
156
+ if (!live.current)
157
+ return;
158
+ setState(next);
159
+ if (timer.current)
160
+ clearTimeout(timer.current);
161
+ timer.current = setTimeout(() => setState('idle'), COPIED_MS);
162
+ };
163
+ const copy = () => {
164
+ const board = typeof navigator !== 'undefined' ? navigator.clipboard : undefined;
165
+ if (!board || typeof board.writeText !== 'function') {
166
+ show('failed');
167
+ return;
168
+ }
169
+ board.writeText(text).then(() => show('copied'), () => show('failed'));
170
+ };
171
+ return [state, copy];
172
+ }
173
+ /** A secondary button that copies `text` and says whether it worked. */
174
+ export function CopyButton(p) {
175
+ const [state, copy] = useCopy(p.text);
176
+ return _jsx(KitButton, { variant: "secondary", onClick: copy, children: state === 'idle' ? (p.label ?? 'Copy output') : COPY_WORDS[state] });
177
+ }
178
+ /** The same copy as an icon for a detail's header. Its name says what happened,
179
+ * so a screen reader hears "Copied" where a sighted reader sees the check. */
180
+ export function CopyIconButton(p) {
181
+ const [state, copy] = useCopy(p.text);
182
+ const name = state === 'idle' ? p.label : COPY_WORDS[state];
183
+ return (_jsx("button", { type: "button", className: "tx-detail-icon", "data-tx-part": "detail-icon", "aria-label": name, title: name, onClick: copy, children: state === 'copied' ? _jsx(IcCheck, { size: 16 }) : state === 'failed' ? _jsx(IcX, { size: 16 }) : _jsx(IcCopy, { size: 16 }) }));
184
+ }
185
+ export function StepDetailBody(p) {
186
+ const { step, onRerun } = p;
187
+ const kind = step.words.kind;
188
+ const rows = rowsOf(step);
189
+ const out = outputOf(step);
190
+ const known = kind === 'run' || kind === 'write' || kind === 'read' || kind === 'search' || kind === 'list';
191
+ // Anything else reads as today's tool details, unless its result is too long to render whole.
192
+ const rich = !known && !refused(step) && capLines(step.result, DETAIL_LINE_CAP).more === 0;
193
+ return (_jsxs("div", { className: "tx-detail", "data-tx-part": "detail", "data-tx-kind": kind, "data-tx-status": step.status, children: [rows.length ? (_jsx("dl", { className: "tx-detail-kv", "data-tx-part": "detail-kv", children: rows.map((r) => (_jsxs("div", { className: "tx-detail-row", "data-tx-part": "detail-row", "data-tx-tone": r.tone, children: [_jsx("dt", { children: r.label }), _jsx("dd", { children: r.value })] }, r.label))) })) : null, step.status === 'stopped' ? (_jsx("div", { className: "tx-detail-output", "data-tx-part": "detail-output", "data-tx-empty": "", children: "No result. The run stopped before this step finished." })) : rich ? (_jsxs("div", { className: "tx-detail-rich", "data-tx-part": "detail-output", children: [_jsx(RichArgs, { name: step.name, args: step.args }), _jsx(RichResult, { name: step.name, args: step.args, result: step.result })] })) : (_jsx(Output, { body: out, numbered: kind === 'write' && !refused(step), toned: kind === 'run' })), step.status !== 'running' ? _jsx(BlockedResult, { callId: step.callId, hooks: step.hooks, check: step.check }) : null, _jsxs("div", { className: "tx-detail-actions", "data-tx-part": "detail-actions", children: [_jsx(CopyButton, { text: rich ? step.result : out }), onRerun && kind === 'run' ? _jsx(KitButton, { variant: "secondary", onClick: onRerun, children: "Run again" }) : null] })] }));
194
+ }
195
+ //# sourceMappingURL=StepDetail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepDetail.js","sourceRoot":"","sources":["../../steps/StepDetail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { type JSX, type ReactNode } from 'react';
2
+ import { type KitStatus } from '@corenel/ui-kit/kit';
3
+ import './rail.css';
4
+ export interface DetailTarget {
5
+ id: string;
6
+ title: string;
7
+ status?: KitStatus;
8
+ body: () => ReactNode;
9
+ /** Icon buttons for the header, before Close (the side panel's head, the
10
+ * phone sheet's title row). */
11
+ actions?: () => ReactNode;
12
+ }
13
+ /** What an opener says its open detail looks like NOW. */
14
+ export interface DetailLive {
15
+ body: () => ReactNode;
16
+ status?: KitStatus;
17
+ actions?: () => ReactNode;
18
+ }
19
+ export interface StepDetailApi {
20
+ open(t: DetailTarget): void;
21
+ /** Keep the open detail for `id` current. An opener calls this from a layout
22
+ * effect after every render in which its detail is open; the host re-renders
23
+ * the detail from the newest entry. A call for an id that is not open is ignored. */
24
+ register(id: string, live: DetailLive): void;
25
+ /** An opener that can draw `id` says so while it is mounted (useDetailHold).
26
+ * Once an open detail has been held, it closes when its last holder lets go:
27
+ * the step or turn it showed went away, so a frozen body never stays open. */
28
+ hold(id: string): void;
29
+ release(id: string): void;
30
+ close(): void;
31
+ openId: string | null;
32
+ }
33
+ /** The nearest host's api, or null outside a host. */
34
+ export declare function useStepDetail(): StepDetailApi | null;
35
+ /** Hold `id` while this component is mounted and `id` is not null. An opener
36
+ * passes the id of its open detail when it can still draw it, else null. */
37
+ export declare function useDetailHold(id: string | null): void;
38
+ /** Moves an open detail whose id starts with `from` to the same id under `to`
39
+ * (the live turn's step to its settled twin). The twin must hold it, or it closes. */
40
+ export interface DetailFollow {
41
+ from: string;
42
+ to: string;
43
+ }
44
+ /** True on the phone layout; follows the query live. */
45
+ export declare function useIsPhone(): boolean;
46
+ /** `hidden`: the host's box takes no room (its host shows something else in its
47
+ * place, e.g. a scrubbed-back timeline); the open detail stays as it is. */
48
+ export declare function StepDetailHost(p: {
49
+ children: ReactNode;
50
+ className?: string;
51
+ follow?: DetailFollow;
52
+ hidden?: boolean;
53
+ }): JSX.Element;
54
+ //# sourceMappingURL=StepDetailHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepDetailHost.d.ts","sourceRoot":"","sources":["../../steps/StepDetailHost.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuH,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACtK,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGtF,OAAO,YAAY,CAAC;AAUpB,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,IAAI,EAAE,MAAM,SAAS,CAAC;IACtB;mCAC+B;IAC/B,OAAO,CAAC,EAAE,MAAM,SAAS,CAAC;CAC3B;AAED,0DAA0D;AAC1D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B;;yFAEqF;IACrF,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7C;;kFAE8E;IAC9E,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAOD,sDAAsD;AACtD,wBAAgB,aAAa,IAAI,aAAa,GAAG,IAAI,CAEpD;AAED;4EAC4E;AAC5E,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CASrD;AAED;sFACsF;AACtF,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAE1D,wDAAwD;AACxD,wBAAgB,UAAU,IAAI,OAAO,CAoBpC;AA+CD;4EAC4E;AAC5E,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAqHnI"}
@@ -0,0 +1,175 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
3
+ import { KitSheet, StatusDot, statusWord } from '@corenel/ui-kit/kit';
4
+ import { IcX } from '@corenel/ui-kit/icons';
5
+ import { useEscape } from '@corenel/ui-kit/useEscape';
6
+ import './rail.css';
7
+ const PHONE_QUERY = '(max-width: 768px)';
8
+ const HIDDEN = { display: 'none' };
9
+ const StepDetailContext = createContext(null);
10
+ /** The nearest host's api, or null outside a host. */
11
+ export function useStepDetail() {
12
+ return useContext(StepDetailContext);
13
+ }
14
+ /** Hold `id` while this component is mounted and `id` is not null. An opener
15
+ * passes the id of its open detail when it can still draw it, else null. */
16
+ export function useDetailHold(id) {
17
+ const api = useContext(StepDetailContext);
18
+ const hold = api?.hold;
19
+ const release = api?.release;
20
+ useLayoutEffect(() => {
21
+ if (!id || !hold || !release)
22
+ return undefined;
23
+ hold(id);
24
+ return () => release(id);
25
+ }, [id, hold, release]);
26
+ }
27
+ /** True on the phone layout; follows the query live. */
28
+ export function useIsPhone() {
29
+ const get = () => typeof matchMedia === 'function' && matchMedia(PHONE_QUERY).matches === true;
30
+ const [phone, setPhone] = useState(get);
31
+ useEffect(() => {
32
+ if (typeof matchMedia !== 'function')
33
+ return;
34
+ const mq = matchMedia(PHONE_QUERY);
35
+ const on = () => setPhone(mq.matches === true);
36
+ on();
37
+ if (typeof mq.addEventListener === 'function') {
38
+ mq.addEventListener('change', on);
39
+ return () => mq.removeEventListener('change', on);
40
+ }
41
+ // Older engines only have the deprecated listener pair.
42
+ if (typeof mq.addListener === 'function') {
43
+ mq.addListener(on);
44
+ return () => mq.removeListener(on);
45
+ }
46
+ return undefined;
47
+ }, []);
48
+ return phone;
49
+ }
50
+ function SidePanel(p) {
51
+ const { target, onClose } = p;
52
+ const ref = useRef(null);
53
+ // Move focus into the panel when it opens or shows another step, so Escape and
54
+ // the keyboard act on it; the host returns focus to the opener on close. Keyed
55
+ // on the open, not the id: a follow to the settled twin changes the id while
56
+ // the reader is typing in the composer, and must not take focus from it.
57
+ useEffect(() => {
58
+ ref.current?.focus();
59
+ }, [p.opened]);
60
+ return (_jsxs("aside", { ref: ref, className: "tx-detail-side", "data-tx-part": "detail-side", "aria-label": target.title, tabIndex: -1, children: [_jsxs("div", { className: "tx-detail-head", "data-tx-part": "detail-head", children: [target.status ? (_jsxs("span", { className: "tx-detail-pill", "data-tx-part": "detail-pill", "data-tx-status": target.status, children: [_jsx(StatusDot, { status: target.status }), statusWord(target.status)] })) : null, _jsx("span", { className: "tx-detail-title", "data-tx-part": "detail-title", children: target.title }), p.actions ? _jsx("span", { className: "tx-detail-head-actions", "data-tx-part": "detail-head-actions", children: p.actions }) : null, _jsx("button", { type: "button", className: "tx-detail-close", "data-tx-part": "detail-close", "aria-label": "Close details", onClick: onClose, children: _jsx(IcX, { size: 16 }) })] }), _jsx("div", { className: "tx-detail-scroll", "data-tx-part": "detail-scroll", children: p.body })] }));
61
+ }
62
+ /** The sheet's content. It takes focus on open, and when another step opens in
63
+ * the same sheet (the sheet itself only takes focus when it mounts); not on a
64
+ * follow, which is the same step under its settled id. */
65
+ function SheetBody(p) {
66
+ const ref = useRef(null);
67
+ useEffect(() => {
68
+ ref.current?.focus();
69
+ }, [p.opened]);
70
+ return (_jsx("div", { ref: ref, className: "tx-detail-sheet", "data-tx-part": "detail-sheet", tabIndex: -1, children: p.children }));
71
+ }
72
+ /** `hidden`: the host's box takes no room (its host shows something else in its
73
+ * place, e.g. a scrubbed-back timeline); the open detail stays as it is. */
74
+ export function StepDetailHost(p) {
75
+ const phone = useIsPhone();
76
+ const [target, setTarget] = useState(null);
77
+ // Holders per id, and whether the open detail must have one (it had one, or it
78
+ // was moved to a twin). An opener that never holds keeps its detail open.
79
+ const holders = useRef(new Map());
80
+ const needsHolder = useRef(false);
81
+ const [orphanCheck, setOrphanCheck] = useState(0);
82
+ const opener = useRef(null);
83
+ // Bumped by open() only, so a follow (same step, new id) does not move focus.
84
+ const [opened, setOpened] = useState(0);
85
+ // The openers' newest bodies, read through a subscription so a change made in
86
+ // an opener's commit re-renders the detail (a render-time snapshot would lag).
87
+ const openIdRef = useRef(null);
88
+ const live = useRef(new Map());
89
+ const listeners = useRef(new Set());
90
+ const version = useRef(0);
91
+ const subscribe = useCallback((fn) => {
92
+ listeners.current.add(fn);
93
+ return () => { listeners.current.delete(fn); };
94
+ }, []);
95
+ useSyncExternalStore(subscribe, () => version.current);
96
+ const register = useCallback((id, entry) => {
97
+ if (openIdRef.current !== id)
98
+ return;
99
+ live.current.set(id, entry);
100
+ version.current += 1;
101
+ listeners.current.forEach((fn) => fn());
102
+ }, []);
103
+ const hold = useCallback((id) => {
104
+ holders.current.set(id, (holders.current.get(id) ?? 0) + 1);
105
+ if (openIdRef.current === id)
106
+ needsHolder.current = true;
107
+ }, []);
108
+ const release = useCallback((id) => {
109
+ const n = (holders.current.get(id) ?? 0) - 1;
110
+ if (n > 0)
111
+ holders.current.set(id, n);
112
+ else
113
+ holders.current.delete(id);
114
+ if (n <= 0 && openIdRef.current === id && needsHolder.current)
115
+ setOrphanCheck((c) => c + 1);
116
+ }, []);
117
+ const open = useCallback((t) => {
118
+ const active = typeof document !== 'undefined' ? document.activeElement : null;
119
+ // Opening another step from inside the panel keeps the original opener.
120
+ const inPanel = active instanceof HTMLElement && !!active.closest('.tx-detail-side, [role="dialog"]');
121
+ if (active instanceof HTMLElement && active !== document.body && !inPanel)
122
+ opener.current = active;
123
+ live.current.clear();
124
+ openIdRef.current = t.id;
125
+ needsHolder.current = (holders.current.get(t.id) ?? 0) > 0;
126
+ setTarget(t);
127
+ setOpened((n) => n + 1);
128
+ }, []);
129
+ const close = useCallback(() => {
130
+ live.current.clear();
131
+ openIdRef.current = null;
132
+ needsHolder.current = false;
133
+ setTarget(null);
134
+ const back = opener.current;
135
+ opener.current = null;
136
+ if (back && back.isConnected)
137
+ back.focus();
138
+ }, []);
139
+ // Follow: the open detail moves to its twin in this same render, so the twin
140
+ // sees itself selected in the commit where the original opener goes away.
141
+ const follow = p.follow;
142
+ if (follow && target && target.id.startsWith(follow.from) && !target.id.startsWith(follow.to)) {
143
+ const id = follow.to + target.id.slice(follow.from.length);
144
+ live.current.clear();
145
+ openIdRef.current = id;
146
+ needsHolder.current = true;
147
+ setTarget({ ...target, id });
148
+ }
149
+ // After a commit: an open detail that must have a holder and has none closes.
150
+ useEffect(() => {
151
+ if (target && needsHolder.current && !holders.current.get(target.id))
152
+ close();
153
+ }, [target, orphanCheck, close]);
154
+ const newest = target ? live.current.get(target.id) : undefined;
155
+ // Built only when the target or its registered body changed, so a host render
156
+ // for any other reason (a streamed delta above) does not redraw the detail.
157
+ const view = useMemo(() => (target
158
+ ? {
159
+ ...target,
160
+ body: newest ? newest.body : target.body,
161
+ status: newest && 'status' in newest ? newest.status : target.status,
162
+ actions: newest && 'actions' in newest ? newest.actions : target.actions,
163
+ }
164
+ : null), [target, newest]);
165
+ const bodyEl = useMemo(() => (view ? view.body() : null), [view]);
166
+ const actionsEl = useMemo(() => (view?.actions ? view.actions() : null), [view]);
167
+ const shown = target !== null;
168
+ // The kit Sheet handles Escape on the phone. The side panel joins the shared
169
+ // escape stack, so an overlay above it closes first.
170
+ useEscape(shown && !phone, close);
171
+ const api = useMemo(() => ({ open, register, hold, release, close, openId: target ? target.id : null }), [open, register, hold, release, close, target]);
172
+ const cls = p.className ? `tx-detail-host ${p.className}` : 'tx-detail-host';
173
+ return (_jsxs(StepDetailContext.Provider, { value: api, children: [_jsxs("div", { className: cls, "data-tx-part": "detail-host", style: p.hidden ? HIDDEN : undefined, children: [p.children, view && !phone ? _jsx(SidePanel, { target: view, body: bodyEl, actions: actionsEl, onClose: close, opened: opened }) : null] }), view && phone ? (_jsx(KitSheet, { open: true, label: "Step details", title: view.title, onClose: close, ...(actionsEl ? { titleAction: _jsx("span", { className: "tx-detail-head-actions", "data-tx-part": "detail-head-actions", children: actionsEl }) } : {}), children: _jsx(SheetBody, { opened: opened, children: bodyEl }) })) : null] }));
174
+ }
175
+ //# sourceMappingURL=StepDetailHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepDetailHost.js","sourceRoot":"","sources":["../../steps/StepDetailHost.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type JSX } from 'react';
2
+ import type { ArrivalEffect } from '../arrivalEffect';
3
+ import { type RailItem, type Step } from './model';
4
+ import './rail.css';
5
+ /** Under 10s one decimal ("1.2s"), under 60s whole seconds ("14s"), then "1m 4s". */
6
+ export declare function durationText(ms: number): string;
7
+ /** Inside a rail's custom item: claim the item's dot slot. True when the caller
8
+ * is on a rail and should draw its own dot; false anywhere else. */
9
+ export declare function useOwnRailDot(): boolean;
10
+ /** The longest step words (verb or object) that play the arrival effect. Longer
11
+ * text is plain: FxText locks a character every 45ms and split-flap keeps every
12
+ * tile until the last one lands, so a 200-character command would flip for about
13
+ * nine seconds, mostly past the ellipsis. 32 is about what fits on the phone line. */
14
+ export declare const STEP_FX_MAX_CHARS = 32;
15
+ export interface StepLineProps {
16
+ step: Step;
17
+ peek: boolean;
18
+ /** Called with this line's step. Pass a stable function: the line is memoized,
19
+ * so a settled step does not redraw (or re-read its output) while a run streams. */
20
+ onOpen: (step: Step) => void;
21
+ selected: boolean;
22
+ nameFx?: ArrivalEffect;
23
+ }
24
+ declare function StepLineImpl(p: StepLineProps): JSX.Element;
25
+ export declare const StepLine: import("react").MemoExoticComponent<typeof StepLineImpl>;
26
+ export declare function StepRail(p: {
27
+ items: RailItem[];
28
+ onOpenStep: (step: Step) => void;
29
+ selectedId?: string | null;
30
+ /** Live turn only; the verb animates once. */
31
+ nameFx?: ArrivalEffect;
32
+ /** A turn older than the newest (or any settled turn while one runs): its
33
+ * in-progress task is drawn as a plain heading, not "now", and is not the
34
+ * task the task line jumps to. */
35
+ earlier?: boolean;
36
+ }): JSX.Element;
37
+ export {};
38
+ //# sourceMappingURL=StepRail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepRail.d.ts","sourceRoot":"","sources":["../../steps/StepRail.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsE,KAAK,GAAG,EAAkB,MAAM,OAAO,CAAC;AAGrH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAiB,KAAK,QAAQ,EAAiB,KAAK,IAAI,EAAE,MAAM,SAAS,CAAC;AAGjF,OAAO,YAAY,CAAC;AAcpB,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAM/C;AAmED;oEACoE;AACpE,wBAAgB,aAAa,IAAI,OAAO,CASvC;AAiCD;;;sFAGsF;AACtF,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAmBpC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd;wFACoF;IACpF,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,iBAAS,YAAY,CAAC,CAAC,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CA6BnD;AAED,eAAO,MAAM,QAAQ,0DAAqB,CAAC;AA+K3C,wBAAgB,QAAQ,CAAC,CAAC,EAAE;IAC1B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,8CAA8C;IAC9C,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;sCAEkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,GAAG,CAAC,OAAO,CAMd"}