@genesislcap/ai-assistant 15.19.0 → 15.19.1
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.
- package/package.json +17 -18
- package/api-extractor.json +0 -11
- package/dist/dts/components/chat-driver/chat-driver.compact.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.compact.test.d.ts.map +0 -1
- package/dist/dts/components/chat-driver/chat-driver.invocation-scope.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.invocation-scope.test.d.ts.map +0 -1
- package/dist/dts/components/chat-driver/chat-driver.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.test.d.ts.map +0 -1
- package/dist/dts/components/chat-driver/chat-driver.thinking-policy.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.thinking-policy.test.d.ts.map +0 -1
- package/dist/dts/components/chat-driver/chat-driver.trace-capture.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.trace-capture.test.d.ts.map +0 -1
- package/dist/dts/components/chat-driver/chat-driver.turn-usage.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.turn-usage.test.d.ts.map +0 -1
- package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.test.d.ts +0 -2
- package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.test.d.ts.map +0 -1
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.budget.test.d.ts +0 -2
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.budget.test.d.ts.map +0 -1
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.cost.test.d.ts +0 -2
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.cost.test.d.ts.map +0 -1
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.pin.test.d.ts +0 -2
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.pin.test.d.ts.map +0 -1
- package/dist/dts/components/settings-modal/settings-modal.styles.test.d.ts +0 -2
- package/dist/dts/components/settings-modal/settings-modal.styles.test.d.ts.map +0 -1
- package/dist/dts/components/settings-modal/settings-modal.template.test.d.ts +0 -2
- package/dist/dts/components/settings-modal/settings-modal.template.test.d.ts.map +0 -1
- package/dist/dts/config/define-stateful-agent.test.d.ts +0 -2
- package/dist/dts/config/define-stateful-agent.test.d.ts.map +0 -1
- package/dist/dts/config/validate-providers.test.d.ts +0 -2
- package/dist/dts/config/validate-providers.test.d.ts.map +0 -1
- package/dist/dts/main/blocked-state.test.d.ts +0 -2
- package/dist/dts/main/blocked-state.test.d.ts.map +0 -1
- package/dist/dts/main/budget-meter.test.d.ts +0 -2
- package/dist/dts/main/budget-meter.test.d.ts.map +0 -1
- package/dist/dts/main/cost-session-banking.test.d.ts +0 -2
- package/dist/dts/main/cost-session-banking.test.d.ts.map +0 -1
- package/dist/dts/main/file-attachments.test.d.ts +0 -2
- package/dist/dts/main/file-attachments.test.d.ts.map +0 -1
- package/dist/dts/main/interaction-cost.test.d.ts +0 -2
- package/dist/dts/main/interaction-cost.test.d.ts.map +0 -1
- package/dist/dts/main/main.styles.test.d.ts +0 -2
- package/dist/dts/main/main.styles.test.d.ts.map +0 -1
- package/dist/dts/main/persistence-broken-sources.test.d.ts +0 -2
- package/dist/dts/main/persistence-broken-sources.test.d.ts.map +0 -1
- package/dist/dts/main/popout-interaction-gate.test.d.ts +0 -2
- package/dist/dts/main/popout-interaction-gate.test.d.ts.map +0 -1
- package/dist/dts/state/ai-assistant-slice.test.d.ts +0 -2
- package/dist/dts/state/ai-assistant-slice.test.d.ts.map +0 -1
- package/dist/dts/state/debug-event-log.test.d.ts +0 -2
- package/dist/dts/state/debug-event-log.test.d.ts.map +0 -1
- package/dist/dts/state/driver-registry.test.d.ts +0 -2
- package/dist/dts/state/driver-registry.test.d.ts.map +0 -1
- package/dist/dts/state/interaction-context.test.d.ts +0 -2
- package/dist/dts/state/interaction-context.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/diagnostics-cursors.test.d.ts +0 -2
- package/dist/dts/state/persistence/diagnostics-cursors.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/diagnostics.test.d.ts +0 -2
- package/dist/dts/state/persistence/diagnostics.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/session-persistence-provider.test.d.ts +0 -2
- package/dist/dts/state/persistence/session-persistence-provider.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/session-persistence.integration.test.d.ts +0 -2
- package/dist/dts/state/persistence/session-persistence.integration.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/session-persister.test.d.ts +0 -2
- package/dist/dts/state/persistence/session-persister.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/session-snapshot.test.d.ts +0 -2
- package/dist/dts/state/persistence/session-snapshot.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/stateful-restore.e2e.test.d.ts +0 -2
- package/dist/dts/state/persistence/stateful-restore.e2e.test.d.ts.map +0 -1
- package/dist/dts/utils/animation-exclusivity.test.d.ts +0 -2
- package/dist/dts/utils/animation-exclusivity.test.d.ts.map +0 -1
- package/dist/dts/utils/collect-session-models.test.d.ts +0 -2
- package/dist/dts/utils/collect-session-models.test.d.ts.map +0 -1
- package/dist/dts/utils/condense-history.test.d.ts +0 -2
- package/dist/dts/utils/condense-history.test.d.ts.map +0 -1
- package/dist/dts/utils/cost-session-history.test.d.ts +0 -2
- package/dist/dts/utils/cost-session-history.test.d.ts.map +0 -1
- package/dist/dts/utils/derive-cost-session-title.test.d.ts +0 -2
- package/dist/dts/utils/derive-cost-session-title.test.d.ts.map +0 -1
- package/dist/dts/utils/flatten-sub-agent-messages.test.d.ts +0 -2
- package/dist/dts/utils/flatten-sub-agent-messages.test.d.ts.map +0 -1
- package/dist/dts/utils/history-transform.test.d.ts +0 -2
- package/dist/dts/utils/history-transform.test.d.ts.map +0 -1
- package/dist/dts/utils/message-partition.test.d.ts +0 -2
- package/dist/dts/utils/message-partition.test.d.ts.map +0 -1
- package/dist/dts/utils/resolve-cost-history-config.test.d.ts +0 -2
- package/dist/dts/utils/resolve-cost-history-config.test.d.ts.map +0 -1
- package/dist/dts/utils/resolve-preference-baseline.test.d.ts +0 -2
- package/dist/dts/utils/resolve-preference-baseline.test.d.ts.map +0 -1
- package/dist/dts/utils/strip-agent-handlers.test.d.ts +0 -2
- package/dist/dts/utils/strip-agent-handlers.test.d.ts.map +0 -1
- package/dist/dts/utils/sum-costs.test.d.ts +0 -2
- package/dist/dts/utils/sum-costs.test.d.ts.map +0 -1
- package/dist/dts/utils/sum-tokens.test.d.ts +0 -2
- package/dist/dts/utils/sum-tokens.test.d.ts.map +0 -1
- package/dist/dts/utils/sum-usage.test.d.ts +0 -2
- package/dist/dts/utils/sum-usage.test.d.ts.map +0 -1
- package/dist/dts/utils/usage-rows.test.d.ts +0 -2
- package/dist/dts/utils/usage-rows.test.d.ts.map +0 -1
- package/dist/esm/components/chat-driver/chat-driver.compact.test.js +0 -93
- package/dist/esm/components/chat-driver/chat-driver.invocation-scope.test.js +0 -238
- package/dist/esm/components/chat-driver/chat-driver.test.js +0 -2770
- package/dist/esm/components/chat-driver/chat-driver.thinking-policy.test.js +0 -137
- package/dist/esm/components/chat-driver/chat-driver.trace-capture.test.js +0 -200
- package/dist/esm/components/chat-driver/chat-driver.turn-usage.test.js +0 -268
- package/dist/esm/components/chat-interaction-wrapper/chat-interaction-wrapper.test.js +0 -104
- package/dist/esm/components/orchestrating-driver/orchestrating-driver.budget.test.js +0 -312
- package/dist/esm/components/orchestrating-driver/orchestrating-driver.cost.test.js +0 -76
- package/dist/esm/components/orchestrating-driver/orchestrating-driver.pin.test.js +0 -61
- package/dist/esm/components/settings-modal/settings-modal.styles.test.js +0 -80
- package/dist/esm/components/settings-modal/settings-modal.template.test.js +0 -91
- package/dist/esm/config/define-stateful-agent.test.js +0 -53
- package/dist/esm/config/validate-providers.test.js +0 -100
- package/dist/esm/main/blocked-state.test.js +0 -1065
- package/dist/esm/main/budget-meter.test.js +0 -359
- package/dist/esm/main/cost-session-banking.test.js +0 -538
- package/dist/esm/main/file-attachments.test.js +0 -164
- package/dist/esm/main/interaction-cost.test.js +0 -107
- package/dist/esm/main/main.styles.test.js +0 -161
- package/dist/esm/main/persistence-broken-sources.test.js +0 -180
- package/dist/esm/main/popout-interaction-gate.test.js +0 -54
- package/dist/esm/state/ai-assistant-slice.test.js +0 -229
- package/dist/esm/state/debug-event-log.test.js +0 -117
- package/dist/esm/state/driver-registry.test.js +0 -55
- package/dist/esm/state/interaction-context.test.js +0 -78
- package/dist/esm/state/persistence/diagnostics-cursors.test.js +0 -30
- package/dist/esm/state/persistence/diagnostics.test.js +0 -280
- package/dist/esm/state/persistence/session-persistence-provider.test.js +0 -110
- package/dist/esm/state/persistence/session-persistence.integration.test.js +0 -113
- package/dist/esm/state/persistence/session-persister.test.js +0 -613
- package/dist/esm/state/persistence/session-snapshot.test.js +0 -256
- package/dist/esm/state/persistence/stateful-restore.e2e.test.js +0 -158
- package/dist/esm/utils/animation-exclusivity.test.js +0 -52
- package/dist/esm/utils/collect-session-models.test.js +0 -53
- package/dist/esm/utils/condense-history.test.js +0 -547
- package/dist/esm/utils/cost-session-history.test.js +0 -174
- package/dist/esm/utils/derive-cost-session-title.test.js +0 -37
- package/dist/esm/utils/flatten-sub-agent-messages.test.js +0 -139
- package/dist/esm/utils/history-transform.test.js +0 -158
- package/dist/esm/utils/message-partition.test.js +0 -90
- package/dist/esm/utils/resolve-cost-history-config.test.js +0 -32
- package/dist/esm/utils/resolve-preference-baseline.test.js +0 -69
- package/dist/esm/utils/strip-agent-handlers.test.js +0 -81
- package/dist/esm/utils/sum-costs.test.js +0 -114
- package/dist/esm/utils/sum-tokens.test.js +0 -51
- package/dist/esm/utils/sum-usage.test.js +0 -164
- package/dist/esm/utils/usage-rows.test.js +0 -189
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/license.txt +0 -46
- package/sandbox/tsconfig.json +0 -8
- package/src/channel/ai-activity-bus.ts +0 -209
- package/src/channel/ai-activity-channel.ts +0 -146
- package/src/chat-driver-node.ts +0 -159
- package/src/components/activity-halo/activity-halo.ts +0 -106
- package/src/components/agent-picker/agent-picker.constants.ts +0 -2
- package/src/components/agent-picker/agent-picker.styles.ts +0 -24
- package/src/components/agent-picker/agent-picker.template.ts +0 -54
- package/src/components/agent-picker/agent-picker.ts +0 -99
- package/src/components/agent-picker/index.ts +0 -1
- package/src/components/ai-driver/ai-driver.ts +0 -166
- package/src/components/ai-driver/index.ts +0 -1
- package/src/components/chat-bubble/chat-bubble.styles.ts +0 -194
- package/src/components/chat-bubble/chat-bubble.template.ts +0 -67
- package/src/components/chat-bubble/chat-bubble.ts +0 -436
- package/src/components/chat-bubble/index.ts +0 -1
- package/src/components/chat-driver/align-event-globals.ts +0 -23
- package/src/components/chat-driver/chat-driver.compact.test.ts +0 -131
- package/src/components/chat-driver/chat-driver.invocation-scope.test.ts +0 -285
- package/src/components/chat-driver/chat-driver.test.ts +0 -3679
- package/src/components/chat-driver/chat-driver.thinking-policy.test.ts +0 -185
- package/src/components/chat-driver/chat-driver.trace-capture.test.ts +0 -251
- package/src/components/chat-driver/chat-driver.ts +0 -3925
- package/src/components/chat-driver/chat-driver.turn-usage.test.ts +0 -362
- package/src/components/chat-driver/index.ts +0 -1
- package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.styles.ts +0 -7
- package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.template.ts +0 -6
- package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.test.ts +0 -144
- package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.ts +0 -243
- package/src/components/chat-interaction-wrapper/index.ts +0 -3
- package/src/components/chat-markdown/chat-markdown.ts +0 -89
- package/src/components/chat-markdown/index.ts +0 -1
- package/src/components/flowing-waves-indicator.ts +0 -286
- package/src/components/halo-overlay.ts +0 -184
- package/src/components/orchestrating-driver/index.ts +0 -1
- package/src/components/orchestrating-driver/orchestrating-driver.budget.test.ts +0 -438
- package/src/components/orchestrating-driver/orchestrating-driver.cost.test.ts +0 -107
- package/src/components/orchestrating-driver/orchestrating-driver.pin.test.ts +0 -96
- package/src/components/orchestrating-driver/orchestrating-driver.ts +0 -813
- package/src/components/plasma-orb-indicator.ts +0 -281
- package/src/components/popout-manager/index.ts +0 -1
- package/src/components/popout-manager/popout-manager.ts +0 -212
- package/src/components/settings-modal/index.ts +0 -2
- package/src/components/settings-modal/settings-modal.styles.test.ts +0 -94
- package/src/components/settings-modal/settings-modal.styles.ts +0 -853
- package/src/components/settings-modal/settings-modal.template.test.ts +0 -124
- package/src/components/settings-modal/settings-modal.template.ts +0 -943
- package/src/components/waves-indicator.ts +0 -241
- package/src/config/config.ts +0 -608
- package/src/config/define-stateful-agent.test.ts +0 -64
- package/src/config/define-stateful-agent.ts +0 -642
- package/src/config/fallback-agents.ts +0 -29
- package/src/config/index.ts +0 -2
- package/src/config/validate-providers.test.ts +0 -148
- package/src/config/validate-providers.ts +0 -58
- package/src/index.ts +0 -29
- package/src/main/blocked-state.test.ts +0 -1444
- package/src/main/budget-meter.test.ts +0 -477
- package/src/main/cost-session-banking.test.ts +0 -679
- package/src/main/file-attachments.test.ts +0 -215
- package/src/main/index.ts +0 -3
- package/src/main/interaction-cost.test.ts +0 -140
- package/src/main/main.styles.test.ts +0 -216
- package/src/main/main.styles.ts +0 -995
- package/src/main/main.template.ts +0 -1119
- package/src/main/main.ts +0 -5432
- package/src/main/main.types.ts +0 -225
- package/src/main/persistence-broken-sources.test.ts +0 -219
- package/src/main/popout-interaction-gate.test.ts +0 -87
- package/src/provider/ai-provider-switcher.ts +0 -40
- package/src/provider/assistant-app-settings.ts +0 -84
- package/src/state/ai-assistant-slice.test.ts +0 -336
- package/src/state/ai-assistant-slice.ts +0 -604
- package/src/state/debug-event-log.test.ts +0 -154
- package/src/state/debug-event-log.ts +0 -358
- package/src/state/driver-registry.test.ts +0 -70
- package/src/state/driver-registry.ts +0 -79
- package/src/state/interaction-context.test.ts +0 -90
- package/src/state/interaction-context.ts +0 -101
- package/src/state/persistence/build-timeline-entries.ts +0 -66
- package/src/state/persistence/diagnostics-cursors.test.ts +0 -53
- package/src/state/persistence/diagnostics-cursors.ts +0 -80
- package/src/state/persistence/diagnostics.test.ts +0 -346
- package/src/state/persistence/diagnostics.ts +0 -220
- package/src/state/persistence/index.ts +0 -10
- package/src/state/persistence/persister-registry.ts +0 -55
- package/src/state/persistence/session-persistence-provider.test.ts +0 -136
- package/src/state/persistence/session-persistence-provider.ts +0 -226
- package/src/state/persistence/session-persistence.integration.test.ts +0 -141
- package/src/state/persistence/session-persister.test.ts +0 -787
- package/src/state/persistence/session-persister.ts +0 -917
- package/src/state/persistence/session-snapshot.test.ts +0 -352
- package/src/state/persistence/session-snapshot.ts +0 -344
- package/src/state/persistence/stateful-restore.e2e.test.ts +0 -229
- package/src/state/session-store.ts +0 -56
- package/src/styles/ai-colours.ts +0 -30
- package/src/styles/menu.ts +0 -187
- package/src/styles/settings-section.ts +0 -40
- package/src/suggestions/chat-suggestions.ts +0 -186
- package/src/tags/index.ts +0 -1
- package/src/types/ai-chat-widget.ts +0 -67
- package/src/types/interaction-context.ts +0 -82
- package/src/utils/animated-panel-toggle.ts +0 -62
- package/src/utils/animation-exclusivity.test.ts +0 -72
- package/src/utils/animation-exclusivity.ts +0 -40
- package/src/utils/banked-usage-baselines.ts +0 -90
- package/src/utils/collect-session-models.test.ts +0 -82
- package/src/utils/collect-session-models.ts +0 -65
- package/src/utils/condense-history.test.ts +0 -746
- package/src/utils/condense-history.ts +0 -448
- package/src/utils/cost-session-history.test.ts +0 -226
- package/src/utils/cost-session-history.ts +0 -218
- package/src/utils/derive-cost-session-title.test.ts +0 -63
- package/src/utils/derive-cost-session-title.ts +0 -76
- package/src/utils/flatten-sub-agent-messages.test.ts +0 -163
- package/src/utils/flatten-sub-agent-messages.ts +0 -88
- package/src/utils/format-usd.ts +0 -26
- package/src/utils/history-transform.test.ts +0 -228
- package/src/utils/history-transform.ts +0 -163
- package/src/utils/index.ts +0 -3
- package/src/utils/logger.ts +0 -3
- package/src/utils/message-partition.test.ts +0 -129
- package/src/utils/message-partition.ts +0 -115
- package/src/utils/resolve-cost-history-config.test.ts +0 -38
- package/src/utils/resolve-cost-history-config.ts +0 -38
- package/src/utils/resolve-preference-baseline.test.ts +0 -84
- package/src/utils/resolve-preference-baseline.ts +0 -80
- package/src/utils/strip-agent-handlers.test.ts +0 -99
- package/src/utils/strip-agent-handlers.ts +0 -53
- package/src/utils/sum-costs.test.ts +0 -136
- package/src/utils/sum-costs.ts +0 -18
- package/src/utils/sum-tokens.test.ts +0 -93
- package/src/utils/sum-tokens.ts +0 -68
- package/src/utils/sum-usage.test.ts +0 -191
- package/src/utils/sum-usage.ts +0 -208
- package/src/utils/tool-fold.ts +0 -181
- package/src/utils/usage-rows.test.ts +0 -237
- package/src/utils/usage-rows.ts +0 -187
- package/src/utils/with-timeout.ts +0 -24
- package/tsconfig.json +0 -9
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
import { avoidTreeShaking } from '@genesislcap/foundation-utils';
|
|
2
|
-
import { attr, css, customElement, GenesisElement, html } from '@genesislcap/web-core';
|
|
3
|
-
import {
|
|
4
|
-
AI_COLOUR_AMBER,
|
|
5
|
-
AI_COLOUR_CYAN,
|
|
6
|
-
AI_COLOUR_PINK,
|
|
7
|
-
AI_COLOUR_VIOLET,
|
|
8
|
-
} from '../styles/ai-colours';
|
|
9
|
-
import { AiHaloOverlay } from './halo-overlay';
|
|
10
|
-
|
|
11
|
-
const WAVES_DEFAULT_SIZE = 56;
|
|
12
|
-
/** CSS-ready form of `WAVES_DEFAULT_SIZE` (the `css` tag rejects raw numbers). */
|
|
13
|
-
const WAVES_DEFAULT_SIZE_CSS = `${WAVES_DEFAULT_SIZE}px`;
|
|
14
|
-
|
|
15
|
-
/** SVG coordinate space the waves are drawn in (square; the circle fills it). */
|
|
16
|
-
const VIEWBOX = 120;
|
|
17
|
-
const CENTRE = VIEWBOX / 2;
|
|
18
|
-
/** Horizontal sampling step when tracing each wave path. Lower = smoother. */
|
|
19
|
-
const SAMPLE_STEP = 6;
|
|
20
|
-
/** Milliseconds in one second. */
|
|
21
|
-
const MS_PER_SECOND = 1000;
|
|
22
|
-
/** Baseline frame rate (fps) the wave speeds are tuned against. */
|
|
23
|
-
const BASELINE_FPS = 60;
|
|
24
|
-
/**
|
|
25
|
-
* Frame duration (ms) at the baseline rate. The paths are driven by elapsed
|
|
26
|
-
* wall-clock time divided by this — not by the rAF callback count — so they
|
|
27
|
-
* advance at a constant real-world rate regardless of the display's refresh
|
|
28
|
-
* rate or dropped frames. At the baseline rate the resulting frame index
|
|
29
|
-
* matches the old per-callback counter, preserving the current look.
|
|
30
|
-
*/
|
|
31
|
-
const FRAME_MS = MS_PER_SECOND / BASELINE_FPS;
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Per-wave parameters. Each wave is a travelling sine (amplitude/frequency/phase)
|
|
35
|
-
* plus a slower, longer-wavelength term that makes the line "slosh" like liquid.
|
|
36
|
-
*/
|
|
37
|
-
interface WaveConfig {
|
|
38
|
-
colour: string;
|
|
39
|
-
/** Peak height of the travelling wave, in viewBox units. */
|
|
40
|
-
amplitude: number;
|
|
41
|
-
/** Angular frequency of the travelling wave (radians per viewBox unit). */
|
|
42
|
-
frequency: number;
|
|
43
|
-
/** How fast the travelling wave scrolls (radians per frame). */
|
|
44
|
-
phaseSpeed: number;
|
|
45
|
-
/** Vertical centre offset so the waves stack rather than overlap exactly. */
|
|
46
|
-
verticalOffset: number;
|
|
47
|
-
/** Amplitude of the slow sloshing term. */
|
|
48
|
-
slosh: number;
|
|
49
|
-
/** Angular frequency of the sloshing term (radians per viewBox unit). */
|
|
50
|
-
sloshFrequency: number;
|
|
51
|
-
/** How fast the sloshing term evolves (radians per frame). */
|
|
52
|
-
sloshSpeed: number;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const WAVES: WaveConfig[] = [
|
|
56
|
-
{
|
|
57
|
-
colour: AI_COLOUR_AMBER,
|
|
58
|
-
amplitude: 11,
|
|
59
|
-
frequency: 0.085,
|
|
60
|
-
phaseSpeed: 0.05,
|
|
61
|
-
verticalOffset: -6,
|
|
62
|
-
slosh: 6,
|
|
63
|
-
sloshFrequency: 0.018,
|
|
64
|
-
sloshSpeed: 0.021,
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
colour: AI_COLOUR_PINK,
|
|
68
|
-
amplitude: 14,
|
|
69
|
-
frequency: 0.07,
|
|
70
|
-
phaseSpeed: -0.043,
|
|
71
|
-
verticalOffset: -2,
|
|
72
|
-
slosh: 7,
|
|
73
|
-
sloshFrequency: 0.022,
|
|
74
|
-
sloshSpeed: -0.017,
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
colour: AI_COLOUR_CYAN,
|
|
78
|
-
amplitude: 13,
|
|
79
|
-
frequency: 0.095,
|
|
80
|
-
phaseSpeed: 0.037,
|
|
81
|
-
verticalOffset: 2,
|
|
82
|
-
slosh: 5,
|
|
83
|
-
sloshFrequency: 0.015,
|
|
84
|
-
sloshSpeed: 0.025,
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
colour: AI_COLOUR_VIOLET,
|
|
88
|
-
amplitude: 10,
|
|
89
|
-
frequency: 0.06,
|
|
90
|
-
phaseSpeed: -0.055,
|
|
91
|
-
verticalOffset: 6,
|
|
92
|
-
slosh: 8,
|
|
93
|
-
sloshFrequency: 0.025,
|
|
94
|
-
sloshSpeed: -0.013,
|
|
95
|
-
},
|
|
96
|
-
];
|
|
97
|
-
|
|
98
|
-
const wavePathsMarkup = WAVES.map(
|
|
99
|
-
(w, i) => `<path class="wave" data-wave="${i}" stroke="${w.colour}" />`,
|
|
100
|
-
).join('');
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Animated "waves inside a circle" loading indicator — coloured sine waves that
|
|
104
|
-
* slosh like glowing liquid inside a circular window, ringed by a rotating
|
|
105
|
-
* gradient halo (the same effect as `<ai-halo-overlay>`).
|
|
106
|
-
*
|
|
107
|
-
* Visual sibling of the dots loading indicator; the two are interchangeable
|
|
108
|
-
* styles of the same "assistant is working" state.
|
|
109
|
-
*
|
|
110
|
-
* @example
|
|
111
|
-
* ```html
|
|
112
|
-
* <ai-waves-indicator size="56"></ai-waves-indicator>
|
|
113
|
-
* ```
|
|
114
|
-
*
|
|
115
|
-
* @beta
|
|
116
|
-
*/
|
|
117
|
-
@customElement({
|
|
118
|
-
name: 'ai-waves-indicator',
|
|
119
|
-
template: html<AiWavesIndicator>`
|
|
120
|
-
<div class="window" role="img" aria-label="Assistant is working">
|
|
121
|
-
<svg class="waves" viewBox="0 0 ${VIEWBOX} ${VIEWBOX}" preserveAspectRatio="none">
|
|
122
|
-
<defs>
|
|
123
|
-
<filter id="wave-glow" x="-20%" y="-20%" width="140%" height="140%">
|
|
124
|
-
<feGaussianBlur stdDeviation="1.6" result="blur" />
|
|
125
|
-
<feMerge>
|
|
126
|
-
<feMergeNode in="blur" />
|
|
127
|
-
<feMergeNode in="SourceGraphic" />
|
|
128
|
-
</feMerge>
|
|
129
|
-
</filter>
|
|
130
|
-
</defs>
|
|
131
|
-
<g filter="url(#wave-glow)">${wavePathsMarkup}</g>
|
|
132
|
-
</svg>
|
|
133
|
-
<ai-halo-overlay active border-size="2" glow-opacity="0.5" glow-spread="55"></ai-halo-overlay>
|
|
134
|
-
</div>
|
|
135
|
-
`,
|
|
136
|
-
styles: css`
|
|
137
|
-
:host {
|
|
138
|
-
display: inline-block;
|
|
139
|
-
width: var(--waves-size, ${WAVES_DEFAULT_SIZE_CSS});
|
|
140
|
-
height: var(--waves-size, ${WAVES_DEFAULT_SIZE_CSS});
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
.window {
|
|
144
|
-
position: relative;
|
|
145
|
-
width: 100%;
|
|
146
|
-
height: 100%;
|
|
147
|
-
border-radius: 50%;
|
|
148
|
-
overflow: hidden;
|
|
149
|
-
background: radial-gradient(circle at 50% 32%, #2b3140 0%, #11141c 55%, #05070c 100%);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
.waves {
|
|
153
|
-
position: absolute;
|
|
154
|
-
inset: 0;
|
|
155
|
-
width: 100%;
|
|
156
|
-
height: 100%;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
.wave {
|
|
160
|
-
fill: none;
|
|
161
|
-
stroke-width: 2;
|
|
162
|
-
stroke-linecap: round;
|
|
163
|
-
stroke-linejoin: round;
|
|
164
|
-
}
|
|
165
|
-
`,
|
|
166
|
-
})
|
|
167
|
-
export class AiWavesIndicator extends GenesisElement {
|
|
168
|
-
/** Diameter of the circular window in px. Default: 56. */
|
|
169
|
-
@attr({ converter: { fromView: Number, toView: String } }) size: number = WAVES_DEFAULT_SIZE;
|
|
170
|
-
|
|
171
|
-
sizeChanged() {
|
|
172
|
-
this.style.setProperty('--waves-size', `${this.size}px`);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// A rAF loop drives the wave paths for the same reason `<ai-halo-overlay>`
|
|
176
|
-
// hand-drives its rotation: a pure-CSS approach can't produce per-frame sine
|
|
177
|
-
// geometry, and SMIL/`<animate>` can't express the combined travel + slosh.
|
|
178
|
-
// The paths are keyed to elapsed wall-clock time (see FRAME_MS), not the rAF
|
|
179
|
-
// callback count, so they hold a constant speed even when frames are dropped.
|
|
180
|
-
|
|
181
|
-
private startTime?: number;
|
|
182
|
-
private animFrame?: number;
|
|
183
|
-
private wavePaths?: SVGPathElement[];
|
|
184
|
-
|
|
185
|
-
connectedCallback() {
|
|
186
|
-
super.connectedCallback();
|
|
187
|
-
// Guard against a reconnect starting a second concurrent loop.
|
|
188
|
-
if (this.animFrame === undefined) {
|
|
189
|
-
this.tick();
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
disconnectedCallback() {
|
|
194
|
-
super.disconnectedCallback();
|
|
195
|
-
if (this.animFrame !== undefined) {
|
|
196
|
-
cancelAnimationFrame(this.animFrame);
|
|
197
|
-
this.animFrame = undefined;
|
|
198
|
-
}
|
|
199
|
-
// Reset the clock so a later reconnect restarts the waves cleanly at frame 0.
|
|
200
|
-
this.startTime = undefined;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
private tick(now?: number) {
|
|
204
|
-
// Stop ticking once disconnected (belt-and-braces alongside the cancel in
|
|
205
|
-
// disconnectedCallback) so no frames are scheduled while detached.
|
|
206
|
-
if (!this.isConnected) {
|
|
207
|
-
this.animFrame = undefined;
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
if (!this.wavePaths) {
|
|
211
|
-
const paths = this.shadowRoot?.querySelectorAll<SVGPathElement>('.wave');
|
|
212
|
-
if (paths?.length) this.wavePaths = Array.from(paths);
|
|
213
|
-
}
|
|
214
|
-
// Anchor to the first real rAF timestamp; the initial synchronous call (no
|
|
215
|
-
// timestamp) renders frame 0. `frame` is then elapsed time in 60fps frames.
|
|
216
|
-
if (now !== undefined && this.startTime === undefined) this.startTime = now;
|
|
217
|
-
const frame =
|
|
218
|
-
now === undefined || this.startTime === undefined ? 0 : (now - this.startTime) / FRAME_MS;
|
|
219
|
-
this.wavePaths?.forEach((path, i) => {
|
|
220
|
-
path.setAttribute('d', AiWavesIndicator.buildWavePath(WAVES[i], frame));
|
|
221
|
-
});
|
|
222
|
-
this.animFrame = requestAnimationFrame((t) => this.tick(t));
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/** Trace one wave's polyline `d` attribute for the given frame. */
|
|
226
|
-
private static buildWavePath(cfg: WaveConfig, frame: number): string {
|
|
227
|
-
const segments: string[] = [];
|
|
228
|
-
for (let x = 0; x <= VIEWBOX; x += SAMPLE_STEP) {
|
|
229
|
-
const y =
|
|
230
|
-
CENTRE +
|
|
231
|
-
cfg.verticalOffset +
|
|
232
|
-
cfg.amplitude * Math.sin(x * cfg.frequency + frame * cfg.phaseSpeed) +
|
|
233
|
-
cfg.slosh * Math.sin(x * cfg.sloshFrequency + frame * cfg.sloshSpeed);
|
|
234
|
-
segments.push(`${x},${y.toFixed(2)}`);
|
|
235
|
-
}
|
|
236
|
-
return `M ${segments.join(' L ')}`;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Ensure the halo overlay used for the ring is registered alongside this component.
|
|
241
|
-
avoidTreeShaking(AiHaloOverlay);
|