@visuno/angular 0.0.0-stage → 0.1.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 (175) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +56 -2
  3. package/account-table/account-table.component.d.ts +72 -0
  4. package/action-log/action-log.component.d.ts +41 -0
  5. package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
  6. package/agent-inbox/agent-inbox.component.d.ts +75 -0
  7. package/agent-lanes/agent-lanes.component.d.ts +152 -0
  8. package/agent-phases/agent-phases.component.d.ts +62 -0
  9. package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
  10. package/agent-tree/agent-tree.component.d.ts +80 -0
  11. package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
  12. package/artifact-card/artifact-card.component.d.ts +145 -0
  13. package/attachment-tray/attachment-tray.component.d.ts +84 -0
  14. package/badge/badge.component.d.ts +25 -0
  15. package/bar-chart/bar-chart.component.d.ts +87 -0
  16. package/browser-session/browser-session.component.d.ts +70 -0
  17. package/buttons/buttons.component.d.ts +63 -0
  18. package/card/card.component.d.ts +21 -0
  19. package/change-review/change-review.component.d.ts +97 -0
  20. package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
  21. package/code-viewer/code-viewer.component.d.ts +86 -0
  22. package/composer/composer.component.d.ts +114 -0
  23. package/context-meter/context-meter.component.d.ts +60 -0
  24. package/core/icon.component.d.ts +10 -0
  25. package/core/reduced-motion.service.d.ts +15 -0
  26. package/decision-prompt/decision-prompt.component.d.ts +56 -0
  27. package/design-review/design-review.component.d.ts +108 -0
  28. package/design-tuner/design-tuner.component.d.ts +75 -0
  29. package/details-panel/details-panel.component.d.ts +150 -0
  30. package/donut-chart/donut-chart.component.d.ts +63 -0
  31. package/draft-review/draft-review.component.d.ts +128 -0
  32. package/error-recovery/error-recovery.component.d.ts +59 -0
  33. package/esm2022/account-table/account-table.component.mjs +399 -0
  34. package/esm2022/action-log/action-log.component.mjs +177 -0
  35. package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
  36. package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
  37. package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
  38. package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
  39. package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
  40. package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
  41. package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
  42. package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
  43. package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
  44. package/esm2022/badge/badge.component.mjs +97 -0
  45. package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
  46. package/esm2022/browser-session/browser-session.component.mjs +352 -0
  47. package/esm2022/buttons/buttons.component.mjs +215 -0
  48. package/esm2022/card/card.component.mjs +107 -0
  49. package/esm2022/change-review/change-review.component.mjs +398 -0
  50. package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
  51. package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
  52. package/esm2022/composer/composer.component.mjs +743 -0
  53. package/esm2022/context-meter/context-meter.component.mjs +275 -0
  54. package/esm2022/core/icon.component.mjs +111 -0
  55. package/esm2022/core/reduced-motion.service.mjs +34 -0
  56. package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
  57. package/esm2022/design-review/design-review.component.mjs +428 -0
  58. package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
  59. package/esm2022/details-panel/details-panel.component.mjs +537 -0
  60. package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
  61. package/esm2022/draft-review/draft-review.component.mjs +549 -0
  62. package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
  63. package/esm2022/eval-results/eval-results.component.mjs +368 -0
  64. package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
  65. package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
  66. package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
  67. package/esm2022/grid/grid.component.mjs +66 -0
  68. package/esm2022/health-score/health-score.component.mjs +420 -0
  69. package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
  70. package/esm2022/image-generation/image-generation.component.mjs +1028 -0
  71. package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
  72. package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
  73. package/esm2022/line-chart/line-chart.component.mjs +417 -0
  74. package/esm2022/live-answer/live-answer.component.mjs +411 -0
  75. package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
  76. package/esm2022/modal/modal.component.mjs +202 -0
  77. package/esm2022/model-picker/model-picker.component.mjs +491 -0
  78. package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
  79. package/esm2022/plan-review/plan-review.component.mjs +432 -0
  80. package/esm2022/progress/progress.component.mjs +503 -0
  81. package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
  82. package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
  83. package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
  84. package/esm2022/public-api.mjs +88 -0
  85. package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
  86. package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
  87. package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
  88. package/esm2022/response-versions/response-versions.component.mjs +288 -0
  89. package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
  90. package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
  91. package/esm2022/run-cost/run-cost.component.mjs +215 -0
  92. package/esm2022/run-queue/run-queue.component.mjs +481 -0
  93. package/esm2022/run-summary/run-summary.component.mjs +331 -0
  94. package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
  95. package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
  96. package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
  97. package/esm2022/source-stack/source-stack.component.mjs +245 -0
  98. package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
  99. package/esm2022/status-pill/status-pill.component.mjs +305 -0
  100. package/esm2022/steering/steering.component.mjs +343 -0
  101. package/esm2022/step-loader/step-loader.component.mjs +209 -0
  102. package/esm2022/task-table/task-table.component.mjs +534 -0
  103. package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
  104. package/esm2022/thinking/thinking.component.mjs +276 -0
  105. package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
  106. package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
  107. package/esm2022/toast/toast.component.mjs +195 -0
  108. package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
  109. package/esm2022/tool-call/tool-call.component.mjs +273 -0
  110. package/esm2022/tooltip/tooltip.component.mjs +417 -0
  111. package/esm2022/top-pages/top-pages.component.mjs +240 -0
  112. package/esm2022/trace-view/trace-view.component.mjs +440 -0
  113. package/esm2022/visuno-angular.mjs +5 -0
  114. package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
  115. package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
  116. package/esm2022/web-search/web-search.component.mjs +374 -0
  117. package/eval-results/eval-results.component.d.ts +67 -0
  118. package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
  119. package/fesm2022/visuno-angular.mjs +31992 -0
  120. package/fesm2022/visuno-angular.mjs.map +1 -0
  121. package/field-extraction/field-extraction.component.d.ts +82 -0
  122. package/funnel-chart/funnel-chart.component.d.ts +70 -0
  123. package/grid/grid.component.d.ts +22 -0
  124. package/health-score/health-score.component.d.ts +87 -0
  125. package/human-handoff/human-handoff.component.d.ts +125 -0
  126. package/image-generation/image-generation.component.d.ts +253 -0
  127. package/index.d.ts +5 -0
  128. package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
  129. package/launch-checklist/launch-checklist.component.d.ts +46 -0
  130. package/line-chart/line-chart.component.d.ts +89 -0
  131. package/live-answer/live-answer.component.d.ts +110 -0
  132. package/metric-insight/metric-insight.component.d.ts +110 -0
  133. package/modal/modal.component.d.ts +37 -0
  134. package/model-picker/model-picker.component.d.ts +97 -0
  135. package/package.json +51 -4
  136. package/permission-gate/permission-gate.component.d.ts +100 -0
  137. package/plan-review/plan-review.component.d.ts +86 -0
  138. package/progress/progress.component.d.ts +91 -0
  139. package/prompt-library/prompt-library.component.d.ts +121 -0
  140. package/prompt-starters/prompt-starters.component.d.ts +65 -0
  141. package/proposal-card/proposal-card.component.d.ts +101 -0
  142. package/public-api.d.ts +82 -0
  143. package/radar-chart/radar-chart.component.d.ts +110 -0
  144. package/radial-goals/radial-goals.component.d.ts +90 -0
  145. package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
  146. package/response-versions/response-versions.component.d.ts +54 -0
  147. package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
  148. package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
  149. package/run-cost/run-cost.component.d.ts +43 -0
  150. package/run-queue/run-queue.component.d.ts +93 -0
  151. package/run-summary/run-summary.component.d.ts +81 -0
  152. package/scatter-chart/scatter-chart.component.d.ts +139 -0
  153. package/score-breakdown/score-breakdown.component.d.ts +107 -0
  154. package/segmented-control/segmented-control.component.d.ts +44 -0
  155. package/source-stack/source-stack.component.d.ts +60 -0
  156. package/stat-cards/stat-cards.component.d.ts +86 -0
  157. package/status-pill/status-pill.component.d.ts +64 -0
  158. package/steering/steering.component.d.ts +75 -0
  159. package/step-loader/step-loader.component.d.ts +40 -0
  160. package/styles.css +424 -0
  161. package/task-table/task-table.component.d.ts +114 -0
  162. package/terminal-stream/terminal-stream.component.d.ts +110 -0
  163. package/thinking/thinking.component.d.ts +63 -0
  164. package/thinking-states/thinking-states.component.d.ts +51 -0
  165. package/thread-panel/thread-panel.component.d.ts +75 -0
  166. package/toast/toast.component.d.ts +56 -0
  167. package/toast-stack/toast-stack.component.d.ts +72 -0
  168. package/tokens.css +424 -0
  169. package/tool-call/tool-call.component.d.ts +61 -0
  170. package/tooltip/tooltip.component.d.ts +89 -0
  171. package/top-pages/top-pages.component.d.ts +75 -0
  172. package/trace-view/trace-view.component.d.ts +95 -0
  173. package/voice-capture/voice-capture.component.d.ts +103 -0
  174. package/voice-orb/voice-orb.component.d.ts +78 -0
  175. package/web-search/web-search.component.d.ts +77 -0
package/LICENSE ADDED
@@ -0,0 +1,24 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 SDK Industries
4
+
5
+ Ported from an upstream set of MIT-licensed UI components. The Vanilla, Angular
6
+ and Flutter ports are native derivative works.
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software is
13
+ furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in all
16
+ copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,57 @@
1
- # Temporary Holding Version
1
+ # @visuno/angular
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ [Visuno](https://visuno.dev) UI components for **Angular** — one design across
4
+ Vanilla, React, Angular and Flutter, driven by a single shared set of design
5
+ tokens so the look and behavior stay identical wherever you build.
6
+
7
+ **📖 Documentation:** [visuno.github.io/docs](https://visuno.github.io/docs/)
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npm install @visuno/angular
13
+ ```
14
+
15
+ Angular 18+ is a peer dependency. All components are **standalone**.
16
+
17
+ ## Usage
18
+
19
+ Import the tokens stylesheet once globally — either in `angular.json`:
20
+
21
+ ```json
22
+ "styles": ["node_modules/@visuno/angular/styles.css", "src/styles.css"]
23
+ ```
24
+
25
+ or in your global `src/styles.css`:
26
+
27
+ ```css
28
+ @import '@visuno/angular/styles.css';
29
+ ```
30
+
31
+ Then import and use the standalone components:
32
+
33
+ ```ts
34
+ import { Component } from '@angular/core';
35
+ import { StatusPillComponent, BadgeComponent } from '@visuno/angular';
36
+
37
+ @Component({
38
+ selector: 'app-example',
39
+ standalone: true,
40
+ imports: [StatusPillComponent, BadgeComponent],
41
+ template: `
42
+ <vo-status-pill state="reading" label="Reading repo" />
43
+ <vo-badge tone="success">Production</vo-badge>
44
+ `,
45
+ })
46
+ export class ExampleComponent {}
47
+ ```
48
+
49
+ ## Theming
50
+
51
+ Dark mode via `data-theme="dark"` and the soft style via `data-style="soft"` on
52
+ `<html>` (or any ancestor). All visuals come from the shared `--vo-*` tokens.
53
+
54
+ ## License
55
+
56
+ MIT. Ported from an upstream set of MIT-licensed components; the ports are
57
+ native derivative works.
@@ -0,0 +1,72 @@
1
+ import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** The tag colours a plan can take. */
4
+ export type AccountTableTone = 'blue' | 'purple' | 'green' | 'orange' | 'red' | 'yellow' | 'pink' | 'teal';
5
+ /** One account row. */
6
+ export interface AccountTableAccount {
7
+ /** Also the account's key, and its first letter makes the logo. */
8
+ name: string;
9
+ /** The logo's colour, like 'var(--vo-av-b)'. Takes white ink for the letter. */
10
+ color: string;
11
+ plan: string;
12
+ seats: number;
13
+ /** 0 to 100. Green from 80, amber from 60, red below. */
14
+ health: number;
15
+ /** Already formatted, like "$14,400". */
16
+ mrr: string;
17
+ /** What the agent noticed, shown when the row opens. */
18
+ note?: string;
19
+ }
20
+ /** A button in the open row's note, like Draft email. */
21
+ export interface AccountTableAction {
22
+ label: string;
23
+ doneLabel?: string;
24
+ /** Return a promise and it spins until it settles, then shows `doneLabel`. */
25
+ onClick: (account: AccountTableAccount) => void | Promise<unknown>;
26
+ }
27
+ export declare class AccountTableComponent implements OnChanges {
28
+ accounts: AccountTableAccount[];
29
+ /** The plan filters after All. Defaults to the plans in `accounts`, in first-seen order. */
30
+ plans?: string[];
31
+ /** The tag colour for each plan. Defaults to Enterprise purple, Pro blue, Team teal. */
32
+ planTones: Record<string, AccountTableTone>;
33
+ /** The plan filter, or '' for All. Leave undefined to let the chips drive it. */
34
+ plan?: string;
35
+ defaultPlan: string;
36
+ planChange: EventEmitter<string>;
37
+ /** The search text. Matches account names. */
38
+ query?: string;
39
+ defaultQuery: string;
40
+ queryChange: EventEmitter<string>;
41
+ /** The account whose row is open, or null. */
42
+ open?: string | null;
43
+ defaultOpen: string | null;
44
+ openChange: EventEmitter<string | null>;
45
+ /** A button in the open row's note. */
46
+ action?: AccountTableAction;
47
+ placeholder: string;
48
+ /** Shown when nothing matches the search and filter. */
49
+ emptyLabel: string;
50
+ private readonly motion;
51
+ filter: string;
52
+ text: string;
53
+ opened: string | null;
54
+ draft: 'idle' | 'busy' | 'done';
55
+ /** Replays the stagger whenever the search or filter changes. */
56
+ animate: boolean;
57
+ private draftFor;
58
+ private alive;
59
+ ngOnChanges(changes: SimpleChanges): void;
60
+ tabs(): string[];
61
+ rows(): AccountTableAccount[];
62
+ toneClass(plan: string): string;
63
+ healthColor(h: number): string;
64
+ onText(value: string): void;
65
+ setFilter(p: string): void;
66
+ toggle(name: string): void;
67
+ onRowKey(e: KeyboardEvent, name: string): void;
68
+ runAction(e: Event, a: AccountTableAccount): void;
69
+ private replay;
70
+ static ɵfac: i0.ɵɵFactoryDeclaration<AccountTableComponent, never>;
71
+ static ɵcmp: i0.ɵɵComponentDeclaration<AccountTableComponent, "vo-account-table", never, { "accounts": { "alias": "accounts"; "required": false; }; "plans": { "alias": "plans"; "required": false; }; "planTones": { "alias": "planTones"; "required": false; }; "plan": { "alias": "plan"; "required": false; }; "defaultPlan": { "alias": "defaultPlan"; "required": false; }; "query": { "alias": "query"; "required": false; }; "defaultQuery": { "alias": "defaultQuery"; "required": false; }; "open": { "alias": "open"; "required": false; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; }; "action": { "alias": "action"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; }; }, { "planChange": "planChange"; "queryChange": "queryChange"; "openChange": "openChange"; }, never, never, true, never>;
72
+ }
@@ -0,0 +1,41 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { type VoIconName } from '../core/icon.component';
3
+ import * as i0 from "@angular/core";
4
+ /** One tool call in the log. */
5
+ export interface Action {
6
+ /** The tool's icon, like 'file-text', 'search', 'edit', 'term' or 'pr'. */
7
+ icon: VoIconName;
8
+ /** What the agent did. HTML is allowed (wrap file names in <code>). */
9
+ title: string;
10
+ /** The quiet line under it, like "src/pages, 212 lines". HTML is allowed. */
11
+ detail?: string;
12
+ /** running shows a spinner, done a check and the time. */
13
+ state: 'running' | 'done';
14
+ /** How long it took, like "0.4s". Shown once the action is done. */
15
+ time?: string;
16
+ /** What opens under the row, like a diff or test output. HTML is allowed;
17
+ * lines in <span class="vo-a"> or "vo-x" read as added or removed. */
18
+ output?: string;
19
+ }
20
+ export declare class ActionLogComponent {
21
+ /** The tool calls, newest at the end. */
22
+ actions: Action[];
23
+ title: string;
24
+ /** Shows a spinner in the header while true, and a green dot once false. */
25
+ running: boolean;
26
+ /** The words beside it. Defaults to "Running step N", then "N steps, Xs". */
27
+ status?: string;
28
+ /** Sits flat in a chat thread (the default). Set false to give it a card. */
29
+ bare: boolean;
30
+ /** Emitted when a row opens or closes, with its index and the new open state. */
31
+ toggleRow: EventEmitter<{
32
+ index: number;
33
+ open: boolean;
34
+ }>;
35
+ private readonly open;
36
+ isOpen(i: number): boolean;
37
+ toggle(i: number): void;
38
+ get words(): string;
39
+ static ɵfac: i0.ɵɵFactoryDeclaration<ActionLogComponent, never>;
40
+ static ɵcmp: i0.ɵɵComponentDeclaration<ActionLogComponent, "vo-action-log", never, { "actions": { "alias": "actions"; "required": false; }; "title": { "alias": "title"; "required": false; }; "running": { "alias": "running"; "required": false; }; "status": { "alias": "status"; "required": false; }; "bare": { "alias": "bare"; "required": false; }; }, { "toggleRow": "toggleRow"; }, never, never, true, never>;
41
+ }
@@ -0,0 +1,67 @@
1
+ import { AfterViewInit, ChangeDetectorRef, ElementRef, EventEmitter, OnDestroy } from '@angular/core';
2
+ import { ReducedMotionService } from '../core/reduced-motion.service';
3
+ import * as i0 from "@angular/core";
4
+ /** One series: a switch option with its 168 hourly values. */
5
+ export interface ActivityHeatmapSeries {
6
+ key: string;
7
+ /** The switch label, like "Agent". */
8
+ label: string;
9
+ /** 168 values from 0 to 1, one an hour, Monday 12am first. */
10
+ values: number[];
11
+ /** What a full cell counts, for the tips, like 40. */
12
+ max: number;
13
+ /** What it counts, for the tips, like "runs". */
14
+ unit: string;
15
+ /** The line under the title while this series shows, like "Busiest overnight, when the queue runs". */
16
+ note?: string;
17
+ }
18
+ /** One cell's render state: its tint, its per-cell transition and its tip. */
19
+ interface Cell {
20
+ alpha: number;
21
+ transition: string;
22
+ tip: string;
23
+ }
24
+ export declare class ActivityHeatmapComponent implements AfterViewInit, OnDestroy {
25
+ private readonly reduced;
26
+ private readonly cdr;
27
+ /** One or more series; the switch shows when there are two or more. */
28
+ series: ActivityHeatmapSeries[];
29
+ /** The series on show, by key. Leave it out to let the switch pick it. */
30
+ set value(v: string | undefined);
31
+ defaultValue?: string;
32
+ /** Header text. */
33
+ title: string;
34
+ /** The line under the title before the cells fill in, and when a series has no note. */
35
+ period: string;
36
+ className: string;
37
+ valueChange: EventEmitter<string>;
38
+ sc: ElementRef<HTMLDivElement>;
39
+ readonly dayLabels: string[];
40
+ readonly hours: string[];
41
+ readonly legend: number[];
42
+ key: string;
43
+ cells: Cell[];
44
+ stText: string;
45
+ stOut: boolean;
46
+ knobLeft: number;
47
+ knobWidth: number;
48
+ private controlled;
49
+ private ready;
50
+ private drawn;
51
+ private timers;
52
+ private ro?;
53
+ private moved;
54
+ get current(): ActivityHeatmapSeries | undefined;
55
+ get gridLabel(): string;
56
+ constructor(reduced: ReducedMotionService, cdr: ChangeDetectorRef);
57
+ ngAfterViewInit(): void;
58
+ select(key: string): void;
59
+ private draw;
60
+ private placeKnob;
61
+ private setupScroll;
62
+ private later;
63
+ ngOnDestroy(): void;
64
+ static ɵfac: i0.ɵɵFactoryDeclaration<ActivityHeatmapComponent, never>;
65
+ static ɵcmp: i0.ɵɵComponentDeclaration<ActivityHeatmapComponent, "vo-activity-heatmap", never, { "series": { "alias": "series"; "required": true; }; "value": { "alias": "value"; "required": false; }; "defaultValue": { "alias": "defaultValue"; "required": false; }; "title": { "alias": "title"; "required": false; }; "period": { "alias": "period"; "required": false; }; "className": { "alias": "className"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
66
+ }
67
+ export {};
@@ -0,0 +1,75 @@
1
+ import { AfterViewInit, EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** Which part of the inbox a run sits in. */
4
+ export type InboxGroup = 'needs' | 'running' | 'done';
5
+ /** One agent run in the inbox. */
6
+ export interface InboxRun {
7
+ id: string;
8
+ /** What the run is for, like "Publish the pricing page". */
9
+ title: string;
10
+ /** Which agent runs it. Its first letter marks the row, and a finished run shows it under the title. */
11
+ agent: string;
12
+ /** The mark's fill, like 'var(--vo-av-l)'. An avatar colour brings its own ink, any other colour takes white initials. Defaults to the accent. */
13
+ color?: string;
14
+ group: InboxGroup;
15
+ /** The line under the title: why it needs you, or what it is doing now. A finished run shows its agent instead. */
16
+ detail?: string;
17
+ /** Marks a run that needs you because it failed: its row turns red and offers Retry instead of Approve. */
18
+ failed?: boolean;
19
+ /** More on the failure, in a tooltip on its detail line. */
20
+ why?: string;
21
+ /** How long a running run has been going, in seconds. Its clock counts on from here. */
22
+ seconds?: number;
23
+ /** When a finished run ended, like "12m ago". */
24
+ ended?: string;
25
+ }
26
+ /** A view-model row the template renders, derived from an InboxRun for one group. */
27
+ interface Row {
28
+ run: InboxRun;
29
+ group: InboxGroup;
30
+ fail: boolean;
31
+ col: string;
32
+ ink: string;
33
+ detail: string;
34
+ initial: string;
35
+ seconds: number;
36
+ }
37
+ export declare class AgentInboxComponent implements AfterViewInit, OnChanges, OnDestroy {
38
+ /** The runs to show. */
39
+ runs: InboxRun[];
40
+ /** Defaults to "Inbox". */
41
+ title: string;
42
+ /** The line beside the title. Defaults to "2 need you", then "2 running", then "All clear · 4 done today". */
43
+ status?: string;
44
+ /** An extra class on the panel. */
45
+ className?: string;
46
+ /** Emitted by Approve on a run that needs you and hasn't failed. */
47
+ approve: EventEmitter<string>;
48
+ /** Emitted by Retry on a failed run. */
49
+ retry: EventEmitter<string>;
50
+ private list?;
51
+ private readonly reduced;
52
+ stShown: string;
53
+ stOut: boolean;
54
+ private stTimer?;
55
+ private tick;
56
+ private base;
57
+ private ticker?;
58
+ private where;
59
+ private groupOf;
60
+ private firstMeasure;
61
+ private moveTimers;
62
+ get visibleGroups(): [InboxGroup, string][];
63
+ rowsOf(g: InboxGroup): Row[];
64
+ fmt(s: number): string;
65
+ private secs;
66
+ private line;
67
+ private setLine;
68
+ ngAfterViewInit(): void;
69
+ ngOnChanges(changes: SimpleChanges): void;
70
+ private measure;
71
+ ngOnDestroy(): void;
72
+ static ɵfac: i0.ɵɵFactoryDeclaration<AgentInboxComponent, never>;
73
+ static ɵcmp: i0.ɵɵComponentDeclaration<AgentInboxComponent, "vo-agent-inbox", never, { "runs": { "alias": "runs"; "required": true; }; "title": { "alias": "title"; "required": false; }; "status": { "alias": "status"; "required": false; }; "className": { "alias": "className"; "required": false; }; }, { "approve": "approve"; "retry": "retry"; }, never, never, true, never>;
74
+ }
75
+ export {};
@@ -0,0 +1,152 @@
1
+ import { AfterViewInit, EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
+ import { type VoIconName } from '../core/icon.component';
3
+ import { ReducedMotionService } from '../core/reduced-motion.service';
4
+ import * as i0 from "@angular/core";
5
+ export type LaneStatus = 'queued' | 'waiting' | 'working' | 'paused' | 'done';
6
+ export type LaneTone = 'blue' | 'purple' | 'green' | 'orange' | 'red' | 'yellow' | 'pink' | 'teal';
7
+ /** One entry in a lane's log, shown when the lane is opened. */
8
+ export interface LaneLog {
9
+ text: string;
10
+ time?: string;
11
+ }
12
+ /** One agent's lane: its name, hue, status, the step track and its log. */
13
+ export interface AgentLane {
14
+ key: string;
15
+ /** Like "Researcher". */
16
+ name: string;
17
+ icon: VoIconName;
18
+ /** The lane's hue: its badge, its track, its Working tag and its stretch of the relay line. Defaults to blue. */
19
+ tone?: LaneTone;
20
+ /** working breathes, shimmers and fills the next step, paused holds it, done fills the badge with its hue. */
21
+ status: LaneStatus;
22
+ /** What the agent is doing now, or what it is waiting for. It crossfades when it changes, and shimmers while the agent works. */
23
+ activity: string;
24
+ /** How many steps the track is cut into. Defaults to 3. */
25
+ steps?: number;
26
+ /** How many steps are finished. The next one fills while the agent works. */
27
+ done?: number;
28
+ /** How far the agent is through the step in hand, from 0 to 1. Leave it out and that step fills part way. */
29
+ progress?: number;
30
+ /** What the agent did, shown when the lane is opened. New entries slide in. */
31
+ log?: LaneLog[];
32
+ }
33
+ /** One agent passing work to another: a light runs down the relay line between their badges. */
34
+ export interface AgentHandoff {
35
+ /** Key of the lane handing over. */
36
+ from: string;
37
+ /** Key of the lane taking it. */
38
+ to: string;
39
+ /** What changes hands, like "the brief". */
40
+ what: string;
41
+ }
42
+ /** A lane prepared for the template. */
43
+ interface LaneView {
44
+ lane: AgentLane;
45
+ status: LaneStatus;
46
+ tone: string;
47
+ live: boolean;
48
+ sent: boolean;
49
+ got: boolean;
50
+ ping: boolean;
51
+ open: boolean;
52
+ bars: BarView[];
53
+ }
54
+ /** One segment of a lane's step track. */
55
+ interface BarView {
56
+ on: boolean;
57
+ run: boolean;
58
+ ind: boolean;
59
+ progress?: number;
60
+ }
61
+ /** The hand-off line kept on screen (with its exit state while it leaves). */
62
+ interface HandView {
63
+ key: string;
64
+ from: string;
65
+ to: string;
66
+ what: string;
67
+ fromName: string;
68
+ toName: string;
69
+ fromTone: string;
70
+ toTone: string;
71
+ open: boolean;
72
+ leaving: boolean;
73
+ lit: boolean;
74
+ }
75
+ /** A lit stretch of the relay line, drawn from one badge down to the next. */
76
+ interface StrokeView {
77
+ key: string;
78
+ from: string;
79
+ to: string;
80
+ fromTone: string;
81
+ toTone: string;
82
+ }
83
+ /** Several agents working in parallel, each in its own lane and hue, with hand-offs down a relay line. */
84
+ export declare class AgentLanesComponent implements AfterViewInit, OnChanges, OnDestroy {
85
+ private readonly reduced;
86
+ lanes: AgentLane[];
87
+ /** Header text. Defaults to "N agents working", "All agents paused" or "All N agents finished". */
88
+ title?: string;
89
+ /** Seconds to show as m:ss. Leave it out to let the header count while agents work. */
90
+ seconds?: number;
91
+ /** Whether every agent is paused. Working lanes then show Paused and the clock stops. */
92
+ set paused(value: boolean | undefined);
93
+ defaultPaused: boolean;
94
+ /** Adds the Pause all / Resume button, until every lane is done (React: onPausedChange wired). */
95
+ pauseWired: boolean;
96
+ /** The handoff to show. Set it back to undefined and its line slides away; the stretch it crossed stays lit. */
97
+ handoff?: AgentHandoff;
98
+ /** Keys of the lanes that are open. Leave it out to let each row toggle itself. */
99
+ set expanded(value: string[] | undefined);
100
+ defaultExpanded: string[];
101
+ /** Sits flat in a chat thread (the default). Set false to give it a card of its own. */
102
+ bare: boolean;
103
+ pausedChange: EventEmitter<boolean>;
104
+ expandedChange: EventEmitter<string[]>;
105
+ private rowsRef?;
106
+ private pausedControlled;
107
+ private expandedControlled;
108
+ private innerPaused;
109
+ private innerExpanded;
110
+ private counted;
111
+ private tick?;
112
+ private kept?;
113
+ private keptTimer?;
114
+ private handOpen;
115
+ private openFrame?;
116
+ private handRaf?;
117
+ private relayed;
118
+ private drawing?;
119
+ private pinged?;
120
+ private drawTimer?;
121
+ private pingTimer?;
122
+ private lastHandKey;
123
+ private ro?;
124
+ constructor(reduced: ReducedMotionService);
125
+ get isPaused(): boolean;
126
+ private get expandedKeys();
127
+ togglePaused(): void;
128
+ toggleLane(key: string): void;
129
+ get finished(): boolean;
130
+ get head(): string;
131
+ get clockText(): string;
132
+ get total(): number;
133
+ get stepsDone(): number;
134
+ get views(): LaneView[];
135
+ private nameOf;
136
+ private toneOf;
137
+ /** The hand-off line to render before the lane it is handed to, or undefined. */
138
+ handFor(laneKey: string): HandView | undefined;
139
+ get strokes(): StrokeView[];
140
+ ngAfterViewInit(): void;
141
+ ngOnChanges(changes: SimpleChanges): void;
142
+ private onHandoffChange;
143
+ private scheduleOpen;
144
+ private startDraw;
145
+ /** Lay each lit stroke from the sender's badge down to the taker's, in the gap between them. */
146
+ private placeStrokes;
147
+ private startCounter;
148
+ ngOnDestroy(): void;
149
+ static ɵfac: i0.ɵɵFactoryDeclaration<AgentLanesComponent, never>;
150
+ static ɵcmp: i0.ɵɵComponentDeclaration<AgentLanesComponent, "vo-agent-lanes", never, { "lanes": { "alias": "lanes"; "required": false; }; "title": { "alias": "title"; "required": false; }; "seconds": { "alias": "seconds"; "required": false; }; "paused": { "alias": "paused"; "required": false; }; "defaultPaused": { "alias": "defaultPaused"; "required": false; }; "pauseWired": { "alias": "pauseWired"; "required": false; }; "handoff": { "alias": "handoff"; "required": false; }; "expanded": { "alias": "expanded"; "required": false; }; "defaultExpanded": { "alias": "defaultExpanded"; "required": false; }; "bare": { "alias": "bare"; "required": false; }; }, { "pausedChange": "pausedChange"; "expandedChange": "expandedChange"; }, never, never, true, never>;
151
+ }
152
+ export {};
@@ -0,0 +1,62 @@
1
+ import { AfterViewInit, EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
+ import { type VoIconName } from '../core/icon.component';
3
+ import * as i0 from "@angular/core";
4
+ export type AgentPhase = 'thinking' | 'searching' | 'reading' | 'waiting' | 'writing' | 'done';
5
+ /** A step that failed: the line turns red and says so, with Retry. */
6
+ export interface AgentPhasesError {
7
+ text: string;
8
+ detail?: string;
9
+ onRetry: () => void;
10
+ }
11
+ /** Shown while the phase takes long: "Still working…", with Stop. */
12
+ export interface AgentPhasesSlow {
13
+ text: string;
14
+ onStop?: () => void;
15
+ }
16
+ /** What the agent waits for in the waiting phase, with Approve and Not now. */
17
+ export interface AgentPhasesAsk {
18
+ text: string;
19
+ approveLabel?: string;
20
+ onApprove: () => void;
21
+ onDecline?: () => void;
22
+ }
23
+ /** One line for which phase the agent is in, from thinking to done. */
24
+ export declare class AgentPhasesComponent implements AfterViewInit, OnChanges, OnDestroy {
25
+ phase: AgentPhase;
26
+ /** What the line says. Defaults to the phase's name; once done, "Thought for 12s". */
27
+ label?: string;
28
+ /** Seconds so far. Counts by itself while left out (and stops while waiting). */
29
+ seconds?: number;
30
+ error?: AgentPhasesError;
31
+ slow?: AgentPhasesSlow;
32
+ ask?: AgentPhasesAsk;
33
+ /** Seconds each phase took, by phase, for the list a finished line opens to. */
34
+ took: Partial<Record<AgentPhase, number>>;
35
+ /** Whether the finished line is open. Leave it out to let the header toggle it. */
36
+ open?: boolean;
37
+ defaultOpen: boolean;
38
+ openChange: EventEmitter<boolean>;
39
+ readonly order: AgentPhase[];
40
+ isOpen: boolean;
41
+ said: string;
42
+ private counted;
43
+ private secondTimer?;
44
+ private lastSaid;
45
+ private viewReady;
46
+ get done(): boolean;
47
+ get at(): number;
48
+ get p(): string;
49
+ get secs(): number;
50
+ get line(): string;
51
+ get phaseIcon(): VoIconName;
52
+ get listPhases(): AgentPhase[];
53
+ name(ph: AgentPhase): string;
54
+ ngAfterViewInit(): void;
55
+ ngOnChanges(changes: SimpleChanges): void;
56
+ toggle(): void;
57
+ private startSeconds;
58
+ private announce;
59
+ ngOnDestroy(): void;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<AgentPhasesComponent, never>;
61
+ static ɵcmp: i0.ɵɵComponentDeclaration<AgentPhasesComponent, "vo-agent-phases", never, { "phase": { "alias": "phase"; "required": false; }; "label": { "alias": "label"; "required": false; }; "seconds": { "alias": "seconds"; "required": false; }; "error": { "alias": "error"; "required": false; }; "slow": { "alias": "slow"; "required": false; }; "ask": { "alias": "ask"; "required": false; }; "took": { "alias": "took"; "required": false; }; "open": { "alias": "open"; "required": false; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; }; }, { "openChange": "openChange"; }, never, never, true, never>;
62
+ }
@@ -0,0 +1,113 @@
1
+ import { AfterViewChecked } from '@angular/core';
2
+ import { type VoIconName } from '../core/icon.component';
3
+ import * as i0 from "@angular/core";
4
+ /** What a step is: the model thinking or writing (purple), a tool like a file
5
+ read or a test run (teal), or an app the agent works in, like Figma or GitHub
6
+ (orange). */
7
+ export type StepKind = 'model' | 'tool' | 'app';
8
+ /** An app's own mark in place of the icon. */
9
+ export type BrandName = 'figma' | 'github' | 'slack';
10
+ export interface TimelineStep {
11
+ label: string;
12
+ icon?: VoIconName;
13
+ /** An app's own mark in place of the icon, like 'figma', 'github' or 'slack'. */
14
+ brand?: BrandName;
15
+ /** Colours the step's bar, icon and live time, and counts it in the key. */
16
+ kind?: StepKind;
17
+ /** Seconds into the run when the step started. */
18
+ start: number;
19
+ /** How long it took, in seconds. */
20
+ duration: number;
21
+ /** Bar colour, any CSS colour. Defaults to the kind's colour, or chart blue. */
22
+ color?: string;
23
+ /** What the step cost, in dollars. */
24
+ cost?: number;
25
+ /** Hatches the bar red and tags the label, for a step that failed. */
26
+ failed?: boolean;
27
+ /** The tag on a failed step, like "2 failed". Defaults to "Failed". */
28
+ tag?: string;
29
+ /** Added to the bar's tooltip, like "2 tests failed". */
30
+ note?: string;
31
+ /** A retry of the failed step just before it: a dashed line joins them. */
32
+ retry?: boolean;
33
+ }
34
+ export interface TimelineStat {
35
+ /** Like "11.4s". */
36
+ value: string;
37
+ /** Like "total". */
38
+ label: string;
39
+ icon?: VoIconName;
40
+ }
41
+ type State = 'wait' | 'run' | 'done' | 'fail';
42
+ /** A rendered row, with everything the template needs for one step. */
43
+ interface Row {
44
+ s: TimelineStep;
45
+ i: number;
46
+ state: State;
47
+ color: string;
48
+ kt: string;
49
+ kb: string;
50
+ left: string;
51
+ width: string;
52
+ tip: string;
53
+ dur: string;
54
+ bump: boolean;
55
+ link?: {
56
+ left: string;
57
+ width: string;
58
+ };
59
+ }
60
+ /** A key entry: one kind with its colour and how long it has run. */
61
+ interface KeyItem {
62
+ kind: StepKind;
63
+ label: string;
64
+ color: string;
65
+ per: string;
66
+ }
67
+ /** One agent run drawn as a Gantt chart. */
68
+ export declare class AgentRunTimelineComponent implements AfterViewChecked {
69
+ /** Like "Run 4821, update the pricing page". */
70
+ title: string;
71
+ steps: TimelineStep[];
72
+ /** Seconds into the run. Bars grow to it; the playhead sits on it. Leave it out
73
+ once the run has finished. */
74
+ time?: number;
75
+ /** Seconds the axis covers. Defaults to the end of the last step, rounded up to
76
+ a multiple of 4. */
77
+ span?: number;
78
+ /** Labels on the axis, in seconds. Defaults to quarters of the span. */
79
+ ticks?: number[];
80
+ /** The line under the title. */
81
+ status?: string;
82
+ /** The figures in the footer once the run is done. */
83
+ stats?: TimelineStat[];
84
+ /** The names of the kinds in the key. Defaults to Model, Tools and Apps. */
85
+ kindLabels?: Partial<Record<StepKind, string>>;
86
+ /** Sits flat in a chat thread (the default). Set false for a card of its own. */
87
+ bare: boolean;
88
+ private gridRef?;
89
+ private readonly motion;
90
+ private lastLive;
91
+ private seenRunning;
92
+ readonly pctOf: (n: number) => string;
93
+ readonly secOf: (n: number) => string;
94
+ get end(): number;
95
+ get axisSpan(): number;
96
+ get done(): boolean;
97
+ get t(): number;
98
+ get playhead(): string;
99
+ get nowText(): string;
100
+ get tickValues(): number[];
101
+ private state;
102
+ private ran;
103
+ get line(): string;
104
+ get keyItems(): KeyItem[];
105
+ get rows(): Row[];
106
+ get figures(): TimelineStat[];
107
+ brandBox(name: BrandName): string;
108
+ brandShape(name: BrandName): string;
109
+ ngAfterViewChecked(): void;
110
+ static ɵfac: i0.ɵɵFactoryDeclaration<AgentRunTimelineComponent, never>;
111
+ static ɵcmp: i0.ɵɵComponentDeclaration<AgentRunTimelineComponent, "vo-agent-run-timeline", never, { "title": { "alias": "title"; "required": false; }; "steps": { "alias": "steps"; "required": false; }; "time": { "alias": "time"; "required": false; }; "span": { "alias": "span"; "required": false; }; "ticks": { "alias": "ticks"; "required": false; }; "status": { "alias": "status"; "required": false; }; "stats": { "alias": "stats"; "required": false; }; "kindLabels": { "alias": "kindLabels"; "required": false; }; "bare": { "alias": "bare"; "required": false; }; }, {}, never, never, true, never>;
112
+ }
113
+ export {};