@testgorilla/tgo-ui 11.22.2 → 12.0.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 (227) hide show
  1. package/fesm2022/testgorilla-tgo-ui-components-accordion.mjs +335 -229
  2. package/fesm2022/testgorilla-tgo-ui-components-accordion.mjs.map +1 -1
  3. package/fesm2022/testgorilla-tgo-ui-components-ai-audio-circle.mjs +547 -465
  4. package/fesm2022/testgorilla-tgo-ui-components-ai-audio-circle.mjs.map +1 -1
  5. package/fesm2022/testgorilla-tgo-ui-components-ai-caveat.mjs +160 -75
  6. package/fesm2022/testgorilla-tgo-ui-components-ai-caveat.mjs.map +1 -1
  7. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs +678 -278
  8. package/fesm2022/testgorilla-tgo-ui-components-ai-feedback.mjs.map +1 -1
  9. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs +337 -274
  10. package/fesm2022/testgorilla-tgo-ui-components-alert-banner.mjs.map +1 -1
  11. package/fesm2022/testgorilla-tgo-ui-components-audio-waveform.mjs +351 -192
  12. package/fesm2022/testgorilla-tgo-ui-components-audio-waveform.mjs.map +1 -1
  13. package/fesm2022/testgorilla-tgo-ui-components-autocomplete-v2.mjs +1950 -960
  14. package/fesm2022/testgorilla-tgo-ui-components-autocomplete-v2.mjs.map +1 -1
  15. package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs +1206 -1044
  16. package/fesm2022/testgorilla-tgo-ui-components-autocomplete.mjs.map +1 -1
  17. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs +328 -182
  18. package/fesm2022/testgorilla-tgo-ui-components-avatar.mjs.map +1 -1
  19. package/fesm2022/testgorilla-tgo-ui-components-badge.mjs +383 -203
  20. package/fesm2022/testgorilla-tgo-ui-components-badge.mjs.map +1 -1
  21. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs +553 -261
  22. package/fesm2022/testgorilla-tgo-ui-components-breadcrumb.mjs.map +1 -1
  23. package/fesm2022/testgorilla-tgo-ui-components-button.mjs +709 -739
  24. package/fesm2022/testgorilla-tgo-ui-components-button.mjs.map +1 -1
  25. package/fesm2022/testgorilla-tgo-ui-components-card.mjs +219 -184
  26. package/fesm2022/testgorilla-tgo-ui-components-card.mjs.map +1 -1
  27. package/fesm2022/testgorilla-tgo-ui-components-checkbox.mjs +515 -458
  28. package/fesm2022/testgorilla-tgo-ui-components-checkbox.mjs.map +1 -1
  29. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs +423 -162
  30. package/fesm2022/testgorilla-tgo-ui-components-checklist.mjs.map +1 -1
  31. package/fesm2022/testgorilla-tgo-ui-components-core.mjs +10784 -10996
  32. package/fesm2022/testgorilla-tgo-ui-components-core.mjs.map +1 -1
  33. package/fesm2022/testgorilla-tgo-ui-components-datepicker.mjs +810 -533
  34. package/fesm2022/testgorilla-tgo-ui-components-datepicker.mjs.map +1 -1
  35. package/fesm2022/testgorilla-tgo-ui-components-device-control.mjs +473 -116
  36. package/fesm2022/testgorilla-tgo-ui-components-device-control.mjs.map +1 -1
  37. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs +1149 -540
  38. package/fesm2022/testgorilla-tgo-ui-components-dialog.mjs.map +1 -1
  39. package/fesm2022/testgorilla-tgo-ui-components-divider.mjs +148 -84
  40. package/fesm2022/testgorilla-tgo-ui-components-divider.mjs.map +1 -1
  41. package/fesm2022/testgorilla-tgo-ui-components-donut-chart.mjs +239 -142
  42. package/fesm2022/testgorilla-tgo-ui-components-donut-chart.mjs.map +1 -1
  43. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs +599 -467
  44. package/fesm2022/testgorilla-tgo-ui-components-dropdown.mjs.map +1 -1
  45. package/fesm2022/testgorilla-tgo-ui-components-elevation-shadow.mjs +126 -70
  46. package/fesm2022/testgorilla-tgo-ui-components-elevation-shadow.mjs.map +1 -1
  47. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs +324 -329
  48. package/fesm2022/testgorilla-tgo-ui-components-empty-state.mjs.map +1 -1
  49. package/fesm2022/testgorilla-tgo-ui-components-field.mjs +969 -648
  50. package/fesm2022/testgorilla-tgo-ui-components-field.mjs.map +1 -1
  51. package/fesm2022/testgorilla-tgo-ui-components-file-upload.mjs +553 -419
  52. package/fesm2022/testgorilla-tgo-ui-components-file-upload.mjs.map +1 -1
  53. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs +847 -452
  54. package/fesm2022/testgorilla-tgo-ui-components-filter-button.mjs.map +1 -1
  55. package/fesm2022/testgorilla-tgo-ui-components-gaussian-chart.mjs +398 -302
  56. package/fesm2022/testgorilla-tgo-ui-components-gaussian-chart.mjs.map +1 -1
  57. package/fesm2022/testgorilla-tgo-ui-components-icon-label.mjs +162 -95
  58. package/fesm2022/testgorilla-tgo-ui-components-icon-label.mjs.map +1 -1
  59. package/fesm2022/testgorilla-tgo-ui-components-icon.mjs +1825 -1789
  60. package/fesm2022/testgorilla-tgo-ui-components-icon.mjs.map +1 -1
  61. package/fesm2022/testgorilla-tgo-ui-components-infinite-scroll-table.mjs +1018 -672
  62. package/fesm2022/testgorilla-tgo-ui-components-infinite-scroll-table.mjs.map +1 -1
  63. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs +758 -368
  64. package/fesm2022/testgorilla-tgo-ui-components-inline-field.mjs.map +1 -1
  65. package/fesm2022/testgorilla-tgo-ui-components-logo.mjs +204 -212
  66. package/fesm2022/testgorilla-tgo-ui-components-logo.mjs.map +1 -1
  67. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs +183 -48
  68. package/fesm2022/testgorilla-tgo-ui-components-media-card.mjs.map +1 -1
  69. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs +243 -79
  70. package/fesm2022/testgorilla-tgo-ui-components-media-dialog.mjs.map +1 -1
  71. package/fesm2022/testgorilla-tgo-ui-components-multi-input.mjs +751 -361
  72. package/fesm2022/testgorilla-tgo-ui-components-multi-input.mjs.map +1 -1
  73. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs +1122 -385
  74. package/fesm2022/testgorilla-tgo-ui-components-navbar.mjs.map +1 -1
  75. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs +689 -413
  76. package/fesm2022/testgorilla-tgo-ui-components-overflow-menu.mjs.map +1 -1
  77. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs +227 -92
  78. package/fesm2022/testgorilla-tgo-ui-components-page-header.mjs.map +1 -1
  79. package/fesm2022/testgorilla-tgo-ui-components-paginator.mjs +174 -113
  80. package/fesm2022/testgorilla-tgo-ui-components-paginator.mjs.map +1 -1
  81. package/fesm2022/testgorilla-tgo-ui-components-password-criteria.mjs +367 -165
  82. package/fesm2022/testgorilla-tgo-ui-components-password-criteria.mjs.map +1 -1
  83. package/fesm2022/testgorilla-tgo-ui-components-password-strength.mjs +253 -118
  84. package/fesm2022/testgorilla-tgo-ui-components-password-strength.mjs.map +1 -1
  85. package/fesm2022/testgorilla-tgo-ui-components-phone-input.mjs +730 -444
  86. package/fesm2022/testgorilla-tgo-ui-components-phone-input.mjs.map +1 -1
  87. package/fesm2022/testgorilla-tgo-ui-components-popover.mjs +533 -221
  88. package/fesm2022/testgorilla-tgo-ui-components-popover.mjs.map +1 -1
  89. package/fesm2022/testgorilla-tgo-ui-components-popup-tip.mjs +274 -76
  90. package/fesm2022/testgorilla-tgo-ui-components-popup-tip.mjs.map +1 -1
  91. package/fesm2022/testgorilla-tgo-ui-components-progress-bar.mjs +184 -124
  92. package/fesm2022/testgorilla-tgo-ui-components-progress-bar.mjs.map +1 -1
  93. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs +1223 -574
  94. package/fesm2022/testgorilla-tgo-ui-components-prompt.mjs.map +1 -1
  95. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs +249 -160
  96. package/fesm2022/testgorilla-tgo-ui-components-radial-progress.mjs.map +1 -1
  97. package/fesm2022/testgorilla-tgo-ui-components-radio-button.mjs +447 -439
  98. package/fesm2022/testgorilla-tgo-ui-components-radio-button.mjs.map +1 -1
  99. package/fesm2022/testgorilla-tgo-ui-components-rating.mjs +226 -150
  100. package/fesm2022/testgorilla-tgo-ui-components-rating.mjs.map +1 -1
  101. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs +255 -67
  102. package/fesm2022/testgorilla-tgo-ui-components-scale-table.mjs.map +1 -1
  103. package/fesm2022/testgorilla-tgo-ui-components-scale.mjs +205 -162
  104. package/fesm2022/testgorilla-tgo-ui-components-scale.mjs.map +1 -1
  105. package/fesm2022/testgorilla-tgo-ui-components-segmented-bar.mjs +245 -153
  106. package/fesm2022/testgorilla-tgo-ui-components-segmented-bar.mjs.map +1 -1
  107. package/fesm2022/testgorilla-tgo-ui-components-segmented-button.mjs +274 -140
  108. package/fesm2022/testgorilla-tgo-ui-components-segmented-button.mjs.map +1 -1
  109. package/fesm2022/testgorilla-tgo-ui-components-segmented-toggle.mjs +319 -147
  110. package/fesm2022/testgorilla-tgo-ui-components-segmented-toggle.mjs.map +1 -1
  111. package/fesm2022/testgorilla-tgo-ui-components-selectable-card.mjs +286 -84
  112. package/fesm2022/testgorilla-tgo-ui-components-selectable-card.mjs.map +1 -1
  113. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs +660 -208
  114. package/fesm2022/testgorilla-tgo-ui-components-side-navigation.mjs.map +1 -1
  115. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs +579 -320
  116. package/fesm2022/testgorilla-tgo-ui-components-side-panel.mjs.map +1 -1
  117. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs +419 -200
  118. package/fesm2022/testgorilla-tgo-ui-components-side-sheet.mjs.map +1 -1
  119. package/fesm2022/testgorilla-tgo-ui-components-skeleton.mjs +132 -80
  120. package/fesm2022/testgorilla-tgo-ui-components-skeleton.mjs.map +1 -1
  121. package/fesm2022/testgorilla-tgo-ui-components-slider.mjs +741 -390
  122. package/fesm2022/testgorilla-tgo-ui-components-slider.mjs.map +1 -1
  123. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs +455 -329
  124. package/fesm2022/testgorilla-tgo-ui-components-snackbar.mjs.map +1 -1
  125. package/fesm2022/testgorilla-tgo-ui-components-spider-chart.mjs +543 -514
  126. package/fesm2022/testgorilla-tgo-ui-components-spider-chart.mjs.map +1 -1
  127. package/fesm2022/testgorilla-tgo-ui-components-spinner.mjs +193 -104
  128. package/fesm2022/testgorilla-tgo-ui-components-spinner.mjs.map +1 -1
  129. package/fesm2022/testgorilla-tgo-ui-components-stepper.mjs +760 -524
  130. package/fesm2022/testgorilla-tgo-ui-components-stepper.mjs.map +1 -1
  131. package/fesm2022/testgorilla-tgo-ui-components-table.mjs +714 -415
  132. package/fesm2022/testgorilla-tgo-ui-components-table.mjs.map +1 -1
  133. package/fesm2022/testgorilla-tgo-ui-components-tabs.mjs +847 -438
  134. package/fesm2022/testgorilla-tgo-ui-components-tabs.mjs.map +1 -1
  135. package/fesm2022/testgorilla-tgo-ui-components-tag.mjs +535 -275
  136. package/fesm2022/testgorilla-tgo-ui-components-tag.mjs.map +1 -1
  137. package/fesm2022/testgorilla-tgo-ui-components-toggle.mjs +316 -246
  138. package/fesm2022/testgorilla-tgo-ui-components-toggle.mjs.map +1 -1
  139. package/fesm2022/testgorilla-tgo-ui-components-tooltip.mjs +404 -284
  140. package/fesm2022/testgorilla-tgo-ui-components-tooltip.mjs.map +1 -1
  141. package/fesm2022/testgorilla-tgo-ui-components-universal-skills.mjs +664 -383
  142. package/fesm2022/testgorilla-tgo-ui-components-universal-skills.mjs.map +1 -1
  143. package/fesm2022/testgorilla-tgo-ui-components-validation-error.mjs +201 -112
  144. package/fesm2022/testgorilla-tgo-ui-components-validation-error.mjs.map +1 -1
  145. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs +1014 -458
  146. package/fesm2022/testgorilla-tgo-ui-components-write-with-ai.mjs.map +1 -1
  147. package/fesm2022/testgorilla-tgo-ui.mjs +147 -155
  148. package/fesm2022/testgorilla-tgo-ui.mjs.map +1 -1
  149. package/mcp/catalog.json +1 -1
  150. package/package.json +16 -17
  151. package/projects/tgo-canopy-ui/assets/icons/rebrand/Sequences-filled.svg +3 -0
  152. package/projects/tgo-canopy-ui/assets/icons/rebrand/Sequences-in-line.svg +3 -0
  153. package/projects/tgo-canopy-ui/theme/_palette.scss +23 -18
  154. package/types/testgorilla-tgo-ui-components-accordion.d.ts +214 -158
  155. package/types/testgorilla-tgo-ui-components-ai-audio-circle.d.ts +93 -69
  156. package/types/testgorilla-tgo-ui-components-ai-caveat.d.ts +37 -34
  157. package/types/testgorilla-tgo-ui-components-ai-feedback.d.ts +126 -86
  158. package/types/testgorilla-tgo-ui-components-alert-banner.d.ts +260 -185
  159. package/types/testgorilla-tgo-ui-components-audio-waveform.d.ts +96 -67
  160. package/types/testgorilla-tgo-ui-components-autocomplete-v2.d.ts +455 -256
  161. package/types/testgorilla-tgo-ui-components-autocomplete.d.ts +545 -390
  162. package/types/testgorilla-tgo-ui-components-avatar.d.ts +128 -102
  163. package/types/testgorilla-tgo-ui-components-badge.d.ts +191 -139
  164. package/types/testgorilla-tgo-ui-components-breadcrumb.d.ts +100 -62
  165. package/types/testgorilla-tgo-ui-components-button.d.ts +479 -340
  166. package/types/testgorilla-tgo-ui-components-card.d.ts +153 -114
  167. package/types/testgorilla-tgo-ui-components-checkbox.d.ts +299 -223
  168. package/types/testgorilla-tgo-ui-components-checklist.d.ts +149 -97
  169. package/types/testgorilla-tgo-ui-components-core.d.ts +307 -295
  170. package/types/testgorilla-tgo-ui-components-datepicker.d.ts +404 -299
  171. package/types/testgorilla-tgo-ui-components-device-control.d.ts +151 -81
  172. package/types/testgorilla-tgo-ui-components-dialog.d.ts +442 -329
  173. package/types/testgorilla-tgo-ui-components-divider.d.ts +64 -51
  174. package/types/testgorilla-tgo-ui-components-donut-chart.d.ts +41 -37
  175. package/types/testgorilla-tgo-ui-components-dropdown.d.ts +335 -241
  176. package/types/testgorilla-tgo-ui-components-elevation-shadow.d.ts +48 -43
  177. package/types/testgorilla-tgo-ui-components-empty-state.d.ts +317 -215
  178. package/types/testgorilla-tgo-ui-components-field.d.ts +559 -388
  179. package/types/testgorilla-tgo-ui-components-file-upload.d.ts +230 -168
  180. package/types/testgorilla-tgo-ui-components-filter-button.d.ts +263 -206
  181. package/types/testgorilla-tgo-ui-components-gaussian-chart.d.ts +107 -94
  182. package/types/testgorilla-tgo-ui-components-icon-label.d.ts +84 -61
  183. package/types/testgorilla-tgo-ui-components-icon.d.ts +137 -110
  184. package/types/testgorilla-tgo-ui-components-infinite-scroll-table.d.ts +429 -303
  185. package/types/testgorilla-tgo-ui-components-inline-field.d.ts +338 -254
  186. package/types/testgorilla-tgo-ui-components-logo.d.ts +119 -101
  187. package/types/testgorilla-tgo-ui-components-media-card.d.ts +51 -35
  188. package/types/testgorilla-tgo-ui-components-media-dialog.d.ts +40 -45
  189. package/types/testgorilla-tgo-ui-components-multi-input.d.ts +283 -194
  190. package/types/testgorilla-tgo-ui-components-navbar.d.ts +326 -208
  191. package/types/testgorilla-tgo-ui-components-overflow-menu.d.ts +276 -204
  192. package/types/testgorilla-tgo-ui-components-page-header.d.ts +67 -50
  193. package/types/testgorilla-tgo-ui-components-paginator.d.ts +103 -70
  194. package/types/testgorilla-tgo-ui-components-password-criteria.d.ts +67 -58
  195. package/types/testgorilla-tgo-ui-components-password-strength.d.ts +66 -57
  196. package/types/testgorilla-tgo-ui-components-phone-input.d.ts +217 -175
  197. package/types/testgorilla-tgo-ui-components-popover.d.ts +94 -53
  198. package/types/testgorilla-tgo-ui-components-popup-tip.d.ts +81 -44
  199. package/types/testgorilla-tgo-ui-components-progress-bar.d.ts +115 -84
  200. package/types/testgorilla-tgo-ui-components-prompt.d.ts +315 -219
  201. package/types/testgorilla-tgo-ui-components-radial-progress.d.ts +146 -107
  202. package/types/testgorilla-tgo-ui-components-radio-button.d.ts +296 -219
  203. package/types/testgorilla-tgo-ui-components-rating.d.ts +134 -95
  204. package/types/testgorilla-tgo-ui-components-scale-table.d.ts +67 -47
  205. package/types/testgorilla-tgo-ui-components-scale.d.ts +91 -66
  206. package/types/testgorilla-tgo-ui-components-segmented-bar.d.ts +118 -89
  207. package/types/testgorilla-tgo-ui-components-segmented-button.d.ts +107 -80
  208. package/types/testgorilla-tgo-ui-components-segmented-toggle.d.ts +138 -105
  209. package/types/testgorilla-tgo-ui-components-selectable-card.d.ts +90 -56
  210. package/types/testgorilla-tgo-ui-components-side-navigation.d.ts +183 -107
  211. package/types/testgorilla-tgo-ui-components-side-panel.d.ts +156 -145
  212. package/types/testgorilla-tgo-ui-components-side-sheet.d.ts +98 -89
  213. package/types/testgorilla-tgo-ui-components-skeleton.d.ts +50 -33
  214. package/types/testgorilla-tgo-ui-components-slider.d.ts +278 -198
  215. package/types/testgorilla-tgo-ui-components-snackbar.d.ts +211 -159
  216. package/types/testgorilla-tgo-ui-components-spider-chart.d.ts +140 -121
  217. package/types/testgorilla-tgo-ui-components-spinner.d.ts +93 -72
  218. package/types/testgorilla-tgo-ui-components-stepper.d.ts +480 -338
  219. package/types/testgorilla-tgo-ui-components-table.d.ts +280 -233
  220. package/types/testgorilla-tgo-ui-components-tabs.d.ts +282 -183
  221. package/types/testgorilla-tgo-ui-components-tag.d.ts +266 -193
  222. package/types/testgorilla-tgo-ui-components-toggle.d.ts +180 -132
  223. package/types/testgorilla-tgo-ui-components-tooltip.d.ts +142 -105
  224. package/types/testgorilla-tgo-ui-components-universal-skills.d.ts +165 -144
  225. package/types/testgorilla-tgo-ui-components-validation-error.d.ts +70 -51
  226. package/types/testgorilla-tgo-ui-components-write-with-ai.d.ts +210 -133
  227. package/types/testgorilla-tgo-ui.d.ts +52 -45
@@ -1,468 +1,550 @@
1
- import * as i0 from '@angular/core';
2
- import { input, model, signal, computed, effect, ViewChild, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
3
- import { Color } from '@testgorilla/tgo-ui/components/core';
4
- import { CommonModule } from '@angular/common';
5
-
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, NgModule, ViewChild, computed, effect, input, model, signal } from "@angular/core";
3
+ import { Color } from "@testgorilla/tgo-ui/components/core";
4
+ import { CommonModule } from "@angular/common";
6
5
  var InterviewState;
7
- (function (InterviewState) {
8
- InterviewState["CandidateSpeaking"] = "candidate-speaking";
9
- InterviewState["AiListening"] = "ai-listening";
10
- InterviewState["AiSpeaking"] = "ai-speaking";
11
- InterviewState["Static"] = "static";
6
+ (function(InterviewState) {
7
+ InterviewState["CandidateSpeaking"] = "candidate-speaking";
8
+ InterviewState["AiListening"] = "ai-listening";
9
+ InterviewState["AiSpeaking"] = "ai-speaking";
10
+ InterviewState["Static"] = "static";
12
11
  })(InterviewState || (InterviewState = {}));
13
- class AiAudioCircleComponent {
14
- constructor() {
15
- this.audioTrack = input(...(ngDevMode ? [undefined, { debugName: "audioTrack" }] : /* istanbul ignore next */ []));
16
- this.candidateAudioTrack = input(...(ngDevMode ? [undefined, { debugName: "candidateAudioTrack" }] : /* istanbul ignore next */ []));
17
- this.state = model(InterviewState.AiListening, ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
18
- this.canvasSize = input(350, ...(ngDevMode ? [{ debugName: "canvasSize" }] : /* istanbul ignore next */ []));
19
- this.animated = input(true, ...(ngDevMode ? [{ debugName: "animated" }] : /* istanbul ignore next */ []));
20
- this.isSpeaking = signal(false, ...(ngDevMode ? [{ debugName: "isSpeaking" }] : /* istanbul ignore next */ []));
21
- this.scaleValue = signal(1, ...(ngDevMode ? [{ debugName: "scaleValue" }] : /* istanbul ignore next */ []));
22
- this.currentAmp = 0.02;
23
- this.simTime = 0;
24
- this.baseRadius = computed(() => this.canvasSize() * 0.28, ...(ngDevMode ? [{ debugName: "baseRadius" }] : /* istanbul ignore next */ []));
25
- // Audio detection thresholds
26
- this.AI_SPEAKING_THRESHOLD = 0.02;
27
- this.CANDIDATE_SPEAKING_THRESHOLD = 0.5;
28
- this.SHADOW_COLOR_RGB = this.hexToRgb(Color.BRAND_50);
29
- this.pulseTime = 0;
30
- this.pulseScale = 1;
31
- this.pulseTargetScale = 1;
32
- this.blobs = [];
33
- effect(() => {
34
- const audioTrack = this.audioTrack();
35
- if (audioTrack) {
36
- this.setupAudioAnalysis();
37
- }
38
- });
39
- effect(() => {
40
- const candidateAudioTrack = this.candidateAudioTrack();
41
- if (candidateAudioTrack) {
42
- this.setupCandidateAudioAnalysis();
43
- }
44
- });
45
- }
46
- ngAfterViewInit() {
47
- this.initializeCanvas();
48
- this.initializeBlobs();
49
- this.startAnimations();
50
- }
51
- initializeCanvas() {
52
- if (!this.pulseCanvasRef) {
53
- return;
54
- }
55
- const pulseCanvas = this.pulseCanvasRef.nativeElement;
56
- const dpr = window.devicePixelRatio || 1;
57
- // Setup pulse canvas
58
- const size = this.canvasSize();
59
- pulseCanvas.width = size * dpr;
60
- pulseCanvas.height = size * dpr;
61
- pulseCanvas.style.width = `${size}px`;
62
- pulseCanvas.style.height = `${size}px`;
63
- const ctx = pulseCanvas.getContext('2d');
64
- if (!ctx) {
65
- console.error('[AI_AUDIO_CIRCLE] Failed to get 2d context');
66
- return;
67
- }
68
- this.pulseCtx = ctx;
69
- this.pulseCtx.scale(dpr, dpr);
70
- }
71
- initializeBlobs() {
72
- const size = this.canvasSize();
73
- const centerX = size / 2;
74
- const centerY = size / 2;
75
- const baseRadius = this.baseRadius();
76
- const colors = [
77
- { color: Color.INFORMATIVE_30, opacity: 0.8 },
78
- { color: Color.INFORMATIVE_20, opacity: 0.7 },
79
- { color: Color.BRAND_50, opacity: 0.75 },
80
- { color: Color.BRAND_20, opacity: 0.6 },
81
- { color: Color.INFORMATIVE_30, opacity: 0.65 },
82
- ];
83
- // Use deterministic seed values when not animated for stable visual tests
84
- const seedVelocities = [0.12, -0.08, 0.15, -0.1, 0.06];
85
- const seedRadii = [0.72, 0.65, 0.8, 0.68, 0.76];
86
- this.blobs = colors.map((c, i) => {
87
- const angle = (i / colors.length) * Math.PI * 2;
88
- const dist = baseRadius * 0.25;
89
- return {
90
- x: centerX + Math.cos(angle) * dist,
91
- y: centerY + Math.sin(angle) * dist,
92
- vx: this.animated() ? (Math.random() - 0.5) * 0.4 : seedVelocities[i],
93
- vy: this.animated() ? (Math.random() - 0.5) * 0.4 : seedVelocities[(i + 2) % 5],
94
- radius: baseRadius * (this.animated() ? 0.6 + Math.random() * 0.4 : seedRadii[i]),
95
- color: c.color,
96
- opacity: c.opacity,
97
- };
98
- });
99
- }
100
- setupAudioAnalysis() {
101
- const audioTrack = this.audioTrack();
102
- if (!audioTrack) {
103
- return;
104
- }
105
- try {
106
- this.audioContext ??= new AudioContext();
107
- this.analyser = this.audioContext.createAnalyser();
108
- this.analyser.fftSize = 256;
109
- this.analyser.smoothingTimeConstant = 0.8;
110
- const bufferLength = this.analyser.frequencyBinCount;
111
- this.dataArray = new Uint8Array(bufferLength);
112
- const stream = new MediaStream([audioTrack]);
113
- this.source = this.audioContext.createMediaStreamSource(stream);
114
- this.source.connect(this.analyser);
115
- this.analyzeAudio();
116
- }
117
- catch (error) {
118
- console.error('[AI_AUDIO_CIRCLE] Error setting up audio analysis:', error);
119
- }
120
- }
121
- setupCandidateAudioAnalysis() {
122
- const candidateAudioTrack = this.candidateAudioTrack();
123
- if (!candidateAudioTrack) {
124
- return;
125
- }
126
- try {
127
- this.audioContext ??= new AudioContext();
128
- this.candidateAnalyser = this.audioContext.createAnalyser();
129
- this.candidateAnalyser.fftSize = 256;
130
- this.candidateAnalyser.smoothingTimeConstant = 0.8;
131
- const bufferLength = this.candidateAnalyser.frequencyBinCount;
132
- this.candidateDataArray = new Uint8Array(bufferLength);
133
- const stream = new MediaStream([candidateAudioTrack]);
134
- this.candidateSource = this.audioContext.createMediaStreamSource(stream);
135
- this.candidateSource.connect(this.candidateAnalyser);
136
- }
137
- catch (error) {
138
- console.error('[AI_AUDIO_CIRCLE] Error setting up candidate audio analysis:', error);
139
- }
140
- }
141
- analyzeAudio() {
142
- if (!this.analyser || !this.dataArray) {
143
- return;
144
- }
145
- const analyze = () => {
146
- if (!this.analyser || !this.dataArray) {
147
- return;
148
- }
149
- // Analyze AI audio
150
- this.analyser.getByteFrequencyData(this.dataArray);
151
- const sum = Array.from(this.dataArray).reduce((a, b) => a + b, 0);
152
- const aiVolume = sum / this.dataArray.length / 255;
153
- // Analyze candidate audio if available
154
- let candidateVolume = 0;
155
- if (this.candidateAnalyser && this.candidateDataArray) {
156
- this.candidateAnalyser.getByteFrequencyData(this.candidateDataArray);
157
- const candidateSum = Array.from(this.candidateDataArray).reduce((a, b) => a + b, 0);
158
- candidateVolume = candidateSum / this.candidateDataArray.length / 255;
159
- }
160
- const aiSpeaking = aiVolume > this.AI_SPEAKING_THRESHOLD;
161
- const candidateSpeaking = candidateVolume > this.CANDIDATE_SPEAKING_THRESHOLD;
162
- if (candidateSpeaking) {
163
- this.state.set(InterviewState.CandidateSpeaking);
164
- }
165
- else if (aiSpeaking) {
166
- this.state.set(InterviewState.AiSpeaking);
167
- }
168
- else {
169
- this.state.set(InterviewState.AiListening);
170
- }
171
- this.isSpeaking.set(aiSpeaking);
172
- // Update amplitude for animations
173
- const currentStateValue = this.state();
174
- if (currentStateValue === InterviewState.AiSpeaking && aiSpeaking) {
175
- const target = Math.pow(aiVolume, 0.75) * 1.8;
176
- this.currentAmp += (target - this.currentAmp) * 0.5;
177
- }
178
- else if (currentStateValue === InterviewState.CandidateSpeaking) {
179
- const target = 0.55;
180
- this.currentAmp += (target - this.currentAmp) * 0.1;
181
- }
182
- else {
183
- const fixedBase = 0.2;
184
- this.currentAmp += (fixedBase - this.currentAmp) * 0.05;
185
- }
186
- this.animationFrameId = requestAnimationFrame(analyze);
187
- };
188
- this.animationFrameId = requestAnimationFrame(analyze);
189
- }
190
- startAnimations() {
191
- this.animatePulse = this.animatePulse.bind(this);
192
- this.mainLoop = this.mainLoop.bind(this);
193
- if (!this.animated()) {
194
- // Render a single static frame for deterministic visual tests
195
- this.animatePulse();
196
- return;
197
- }
198
- this.animatePulse();
199
- this.mainLoop();
200
- }
201
- mainLoop() {
202
- this.simTime += 0.05;
203
- const currentStateValue = this.state();
204
- if (currentStateValue === InterviewState.Static) {
205
- // Static: no amplitude updates — the render locks scale at 1.0
206
- }
207
- else if (currentStateValue === InterviewState.AiSpeaking) {
208
- if (this.analyser && this.dataArray) {
209
- // Use real audio amplitude (already handled in analyzeAudio)
210
- }
211
- else {
212
- // Simulated speaking
213
- const rhythm = Math.sin(this.simTime * 0.8) * 0.5 + 0.5;
214
- const spikes = Math.random() * 0.9;
215
- const target = rhythm * spikes;
216
- this.currentAmp += (target - this.currentAmp) * 0.25;
217
- }
218
- }
219
- else if (currentStateValue === InterviewState.CandidateSpeaking) {
220
- const target = 0.55;
221
- this.currentAmp += (target - this.currentAmp) * 0.1;
222
- }
223
- else {
224
- const fixedBase = 0.2;
225
- this.currentAmp += (fixedBase - this.currentAmp) * 0.05;
226
- }
227
- // eslint-disable-next-line @typescript-eslint/unbound-method -- mainLoop is .bind(this)-ed in startAnimations()
228
- requestAnimationFrame(this.mainLoop);
229
- }
230
- animatePulse() {
231
- if (!this.pulseCtx) {
232
- return;
233
- }
234
- const ctx = this.pulseCtx;
235
- this.pulseTime += 0.016;
236
- const size = this.canvasSize();
237
- const centerX = size / 2;
238
- const centerY = size / 2;
239
- const baseRadius = this.baseRadius();
240
- ctx.clearRect(0, 0, size, size);
241
- const currentStateValue = this.state();
242
- const effectiveAmp = this.currentAmp;
243
- const isListening = currentStateValue === InterviewState.AiListening;
244
- const isCandidate = currentStateValue === InterviewState.CandidateSpeaking;
245
- const isAiSpeaking = currentStateValue === InterviewState.AiSpeaking;
246
- const isStatic = currentStateValue === InterviewState.Static;
247
- // Scale logic
248
- if (isStatic) {
249
- // Static: fixed scale at 1.0, no breathing, no amplitude reactivity
250
- this.pulseTargetScale = 1;
251
- this.pulseScale = 1;
252
- }
253
- else if (isCandidate) {
254
- // Candidate speaking: Fixed enlarged scale (115%), no breathing effect
255
- this.pulseTargetScale = 1.15;
256
- const breathing = 0;
257
- this.pulseScale += (this.pulseTargetScale + breathing - this.pulseScale) * 0.08;
258
- }
259
- else {
260
- // AI speaking/listening: Scale reacts to audio amplitude, with optional breathing
261
- // When AI is speaking: effectiveAmp is high, scale grows with voice + erratic wobble
262
- // When AI is listening: effectiveAmp is low (~0.2), scale stays near 1.0 with breathing effect
263
- this.pulseTargetScale = 1 + effectiveAmp * 0.5;
264
- let breathing;
265
- if (isListening) {
266
- breathing = Math.sin(this.pulseTime * 1.5) * 0.035;
267
- }
268
- else if (isAiSpeaking) {
269
- // Erratic movement: overlapping waves at incommensurate frequencies for non-periodic feel
270
- breathing =
271
- Math.sin(this.pulseTime * 2.7) * 0.055 +
272
- Math.cos(this.pulseTime * 1.9) * 0.04 +
273
- Math.sin(this.pulseTime * 4.1 + 1) * 0.025;
274
- }
275
- else {
276
- breathing = 0;
277
- }
278
- const smoothing = isAiSpeaking ? 0.11 : 0.06;
279
- this.pulseScale += (this.pulseTargetScale + breathing - this.pulseScale) * smoothing;
280
- }
281
- const currentRadius = baseRadius * this.pulseScale;
282
- // Draw shadows (skipped in static state)
283
- if (!isStatic) {
284
- for (let i = 3; i >= 1; i--) {
285
- const shadowRadius = currentRadius + i * 10;
286
- const shadowOpacity = 0.35 - i * 0.06;
287
- const shadowGradient = ctx.createRadialGradient(centerX, centerY, currentRadius * 0.98, centerX, centerY, shadowRadius);
288
- shadowGradient.addColorStop(0, `rgba(${this.SHADOW_COLOR_RGB}, ${shadowOpacity})`);
289
- shadowGradient.addColorStop(0.6, `rgba(${this.SHADOW_COLOR_RGB}, ${shadowOpacity * 0.5})`);
290
- shadowGradient.addColorStop(1, `rgba(${this.SHADOW_COLOR_RGB}, 0)`);
291
- ctx.beginPath();
292
- ctx.arc(centerX, centerY, shadowRadius, 0, Math.PI * 2);
293
- ctx.fillStyle = shadowGradient;
294
- ctx.fill();
295
- }
296
- }
297
- // Clip to circle
298
- ctx.save();
299
- ctx.beginPath();
300
- ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);
301
- ctx.clip();
302
- // Background gradient
303
- const bgGradient = ctx.createLinearGradient(centerX - currentRadius, centerY - currentRadius, centerX + currentRadius, centerY + currentRadius);
304
- bgGradient.addColorStop(0, Color.BRAND_50);
305
- bgGradient.addColorStop(0.5, Color.INFORMATIVE_20);
306
- bgGradient.addColorStop(1, Color.INFORMATIVE_30);
307
- ctx.beginPath();
308
- ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);
309
- ctx.fillStyle = bgGradient;
310
- ctx.fill();
311
- // Animate blobs
312
- let speedMultiplier;
313
- let chaosStrength;
314
- if (isCandidate) {
315
- speedMultiplier = 3.0;
316
- chaosStrength = 1.0;
317
- }
318
- else if (isListening) {
319
- speedMultiplier = 2.0;
320
- chaosStrength = 1.0;
321
- }
322
- else {
323
- speedMultiplier = 1.5 + effectiveAmp * 3.0;
324
- chaosStrength = isAiSpeaking ? 1.8 : 1.0;
325
- }
326
- this.blobs.forEach((blob, index) => {
327
- if (!isStatic) {
328
- // Chaos forces
329
- let chaos1 = Math.sin(this.pulseTime * 0.6 + index * 2.5 + blob.x * 0.02) * 0.15;
330
- let chaos2 = Math.cos(this.pulseTime * 0.4 + index * 1.8 + blob.y * 0.015) * 0.12;
331
- let chaos3 = Math.sin(this.pulseTime + index * 0.7) * 0.08;
332
- if (isAiSpeaking) {
333
- chaos1 += Math.sin(this.pulseTime * 3.2 + index * 1.3) * 0.18;
334
- chaos2 += Math.cos(this.pulseTime * 2.5 + index * 2.1) * 0.14;
335
- chaos3 += Math.sin(this.pulseTime * 4.0 + index * 0.5) * 0.1;
336
- }
337
- // Apply forces
338
- const force = 0.045 * speedMultiplier * chaosStrength;
339
- blob.vx += (chaos1 + chaos3 * Math.cos(this.pulseTime * 1.5 + index)) * force;
340
- blob.vy += (chaos2 + chaos3 * Math.sin(this.pulseTime * 1.2 + index)) * force;
341
- // Friction (slightly less when AI speaking for more sustained movement)
342
- const friction = isAiSpeaking ? 0.985 : 0.98;
343
- blob.vx *= friction;
344
- blob.vy *= friction;
345
- // Max velocity (higher when AI speaking for more erratic motion)
346
- const maxVelBase = isListening ? 3.0 : isAiSpeaking ? 6.0 : 4.5;
347
- const maxVel = maxVelBase * speedMultiplier;
348
- const vel = Math.sqrt(blob.vx * blob.vx + blob.vy * blob.vy);
349
- if (vel > maxVel) {
350
- blob.vx = (blob.vx / vel) * maxVel;
351
- blob.vy = (blob.vy / vel) * maxVel;
352
- }
353
- // Update position
354
- blob.x += blob.vx;
355
- blob.y += blob.vy;
356
- // Keep within bounds
357
- const dx = blob.x - centerX;
358
- const dy = blob.y - centerY;
359
- const dist = Math.sqrt(dx * dx + dy * dy);
360
- const maxDist = currentRadius * 0.55;
361
- if (dist > maxDist) {
362
- const angle = Math.atan2(dy, dx);
363
- blob.x = centerX + Math.cos(angle) * maxDist;
364
- blob.y = centerY + Math.sin(angle) * maxDist;
365
- blob.vx -= dx * 0.065;
366
- blob.vy -= dy * 0.065;
367
- }
368
- }
369
- // Parse color to RGB
370
- const rgb = this.hexToRgb(blob.color);
371
- // Draw blob with glow
372
- const blurRadius = blob.radius * 1.3;
373
- const outerGlow = ctx.createRadialGradient(blob.x, blob.y, 0, blob.x, blob.y, blurRadius);
374
- outerGlow.addColorStop(0, `rgba(${rgb}, ${blob.opacity * 0.9})`);
375
- outerGlow.addColorStop(0.2, `rgba(${rgb}, ${blob.opacity * 0.7})`);
376
- outerGlow.addColorStop(0.4, `rgba(${rgb}, ${blob.opacity * 0.5})`);
377
- outerGlow.addColorStop(0.6, `rgba(${rgb}, ${blob.opacity * 0.3})`);
378
- outerGlow.addColorStop(0.8, `rgba(${rgb}, ${blob.opacity * 0.1})`);
379
- outerGlow.addColorStop(1, `rgba(${rgb}, 0)`);
380
- ctx.beginPath();
381
- ctx.arc(blob.x, blob.y, blurRadius, 0, Math.PI * 2);
382
- ctx.fillStyle = outerGlow;
383
- ctx.fill();
384
- });
385
- // Highlight
386
- const highlightGradient = ctx.createRadialGradient(centerX - currentRadius * 0.3, centerY - currentRadius * 0.3, 0, centerX - currentRadius * 0.3, centerY - currentRadius * 0.3, currentRadius * 0.6);
387
- highlightGradient.addColorStop(0, 'rgba(255, 255, 255, 0.12)');
388
- highlightGradient.addColorStop(0.5, 'rgba(255, 255, 255, 0.03)');
389
- highlightGradient.addColorStop(1, 'rgba(255, 255, 255, 0)');
390
- ctx.beginPath();
391
- ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);
392
- ctx.fillStyle = highlightGradient;
393
- ctx.fill();
394
- ctx.restore();
395
- if (this.animated()) {
396
- // eslint-disable-next-line @typescript-eslint/unbound-method -- animatePulse is .bind(this)-ed in startAnimations()
397
- this.pulseAnimationId = requestAnimationFrame(this.animatePulse);
398
- }
399
- }
400
- hexToRgb(hex) {
401
- const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
402
- if (!result) {
403
- return '0, 0, 0';
404
- }
405
- const r = parseInt(result[1], 16);
406
- const g = parseInt(result[2], 16);
407
- const b = parseInt(result[3], 16);
408
- return `${r}, ${g}, ${b}`;
409
- }
410
- cleanup() {
411
- if (this.animationFrameId) {
412
- cancelAnimationFrame(this.animationFrameId);
413
- this.animationFrameId = undefined;
414
- }
415
- if (this.pulseAnimationId) {
416
- cancelAnimationFrame(this.pulseAnimationId);
417
- this.pulseAnimationId = undefined;
418
- }
419
- if (this.source) {
420
- this.source.disconnect();
421
- this.source = undefined;
422
- }
423
- if (this.candidateSource) {
424
- this.candidateSource.disconnect();
425
- this.candidateSource = undefined;
426
- }
427
- if (this.audioContext && this.audioContext.state !== 'closed') {
428
- void this.audioContext.close();
429
- this.audioContext = undefined;
430
- }
431
- this.analyser = undefined;
432
- this.candidateAnalyser = undefined;
433
- this.dataArray = undefined;
434
- this.candidateDataArray = undefined;
435
- }
436
- ngOnDestroy() {
437
- this.cleanup();
438
- }
439
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: AiAudioCircleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
440
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.25", type: AiAudioCircleComponent, isStandalone: true, selector: "ui-ai-audio-circle", inputs: { audioTrack: { classPropertyName: "audioTrack", publicName: "audioTrack", isSignal: true, isRequired: false, transformFunction: null }, candidateAudioTrack: { classPropertyName: "candidateAudioTrack", publicName: "candidateAudioTrack", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: false, transformFunction: null }, animated: { classPropertyName: "animated", publicName: "animated", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { state: "stateChange" }, viewQueries: [{ propertyName: "pulseCanvasRef", first: true, predicate: ["pulseCanvas"], descendants: true }], ngImport: i0, template: "<div class=\"ai-audio-visualizer\">\n <div class=\"canvas-container\">\n <canvas #pulseCanvas></canvas>\n </div>\n</div>\n", styles: [".ai-audio-visualizer{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;height:100%}.canvas-container{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center}canvas{display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
441
- }
442
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: AiAudioCircleComponent, decorators: [{
443
- type: Component,
444
- args: [{ selector: 'ui-ai-audio-circle', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ai-audio-visualizer\">\n <div class=\"canvas-container\">\n <canvas #pulseCanvas></canvas>\n </div>\n</div>\n", styles: [".ai-audio-visualizer{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;height:100%}.canvas-container{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center}canvas{display:block}\n"] }]
445
- }], ctorParameters: () => [], propDecorators: { pulseCanvasRef: [{
446
- type: ViewChild,
447
- args: ['pulseCanvas', { static: false }]
448
- }], audioTrack: [{ type: i0.Input, args: [{ isSignal: true, alias: "audioTrack", required: false }] }], candidateAudioTrack: [{ type: i0.Input, args: [{ isSignal: true, alias: "candidateAudioTrack", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }, { type: i0.Output, args: ["stateChange"] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: false }] }], animated: [{ type: i0.Input, args: [{ isSignal: true, alias: "animated", required: false }] }] } });
449
-
450
- class AiAudioCircleModule {
451
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: AiAudioCircleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
452
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.25", ngImport: i0, type: AiAudioCircleModule, imports: [CommonModule, AiAudioCircleComponent], exports: [AiAudioCircleComponent] }); }
453
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: AiAudioCircleModule, imports: [CommonModule] }); }
454
- }
455
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: AiAudioCircleModule, decorators: [{
456
- type: NgModule,
457
- args: [{
458
- imports: [CommonModule, AiAudioCircleComponent],
459
- exports: [AiAudioCircleComponent],
460
- }]
461
- }] });
462
-
463
- /**
464
- * Generated bundle index. Do not edit.
465
- */
466
-
12
+ var AiAudioCircleComponent = class AiAudioCircleComponent {
13
+ constructor() {
14
+ this.audioTrack = input(...ngDevMode ? [void 0, { debugName: "audioTrack" }] : /* istanbul ignore next */ []);
15
+ this.candidateAudioTrack = input(...ngDevMode ? [void 0, { debugName: "candidateAudioTrack" }] : /* istanbul ignore next */ []);
16
+ this.state = model(InterviewState.AiListening, ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
17
+ this.canvasSize = input(350, ...ngDevMode ? [{ debugName: "canvasSize" }] : /* istanbul ignore next */ []);
18
+ this.animated = input(true, ...ngDevMode ? [{ debugName: "animated" }] : /* istanbul ignore next */ []);
19
+ this.isSpeaking = signal(false, ...ngDevMode ? [{ debugName: "isSpeaking" }] : /* istanbul ignore next */ []);
20
+ this.scaleValue = signal(1, ...ngDevMode ? [{ debugName: "scaleValue" }] : /* istanbul ignore next */ []);
21
+ this.currentAmp = .02;
22
+ this.simTime = 0;
23
+ this.baseRadius = computed(() => this.canvasSize() * .28, ...ngDevMode ? [{ debugName: "baseRadius" }] : /* istanbul ignore next */ []);
24
+ this.AI_SPEAKING_THRESHOLD = .02;
25
+ this.CANDIDATE_SPEAKING_THRESHOLD = .5;
26
+ this.SHADOW_COLOR_RGB = this.hexToRgb(Color.BRAND_50);
27
+ this.pulseTime = 0;
28
+ this.pulseScale = 1;
29
+ this.pulseTargetScale = 1;
30
+ this.blobs = [];
31
+ effect(() => {
32
+ if (this.audioTrack()) this.setupAudioAnalysis();
33
+ });
34
+ effect(() => {
35
+ if (this.candidateAudioTrack()) this.setupCandidateAudioAnalysis();
36
+ });
37
+ }
38
+ ngAfterViewInit() {
39
+ this.initializeCanvas();
40
+ this.initializeBlobs();
41
+ this.startAnimations();
42
+ }
43
+ initializeCanvas() {
44
+ if (!this.pulseCanvasRef) return;
45
+ const pulseCanvas = this.pulseCanvasRef.nativeElement;
46
+ const dpr = window.devicePixelRatio || 1;
47
+ const size = this.canvasSize();
48
+ pulseCanvas.width = size * dpr;
49
+ pulseCanvas.height = size * dpr;
50
+ pulseCanvas.style.width = `${size}px`;
51
+ pulseCanvas.style.height = `${size}px`;
52
+ const ctx = pulseCanvas.getContext("2d");
53
+ if (!ctx) {
54
+ console.error("[AI_AUDIO_CIRCLE] Failed to get 2d context");
55
+ return;
56
+ }
57
+ this.pulseCtx = ctx;
58
+ this.pulseCtx.scale(dpr, dpr);
59
+ }
60
+ initializeBlobs() {
61
+ const size = this.canvasSize();
62
+ const centerX = size / 2;
63
+ const centerY = size / 2;
64
+ const baseRadius = this.baseRadius();
65
+ const colors = [
66
+ {
67
+ color: Color.INFORMATIVE_30,
68
+ opacity: .8
69
+ },
70
+ {
71
+ color: Color.INFORMATIVE_20,
72
+ opacity: .7
73
+ },
74
+ {
75
+ color: Color.BRAND_50,
76
+ opacity: .75
77
+ },
78
+ {
79
+ color: Color.BRAND_20,
80
+ opacity: .6
81
+ },
82
+ {
83
+ color: Color.INFORMATIVE_30,
84
+ opacity: .65
85
+ }
86
+ ];
87
+ const seedVelocities = [
88
+ .12,
89
+ -.08,
90
+ .15,
91
+ -.1,
92
+ .06
93
+ ];
94
+ const seedRadii = [
95
+ .72,
96
+ .65,
97
+ .8,
98
+ .68,
99
+ .76
100
+ ];
101
+ this.blobs = colors.map((c, i) => {
102
+ const angle = i / colors.length * Math.PI * 2;
103
+ const dist = baseRadius * .25;
104
+ return {
105
+ x: centerX + Math.cos(angle) * dist,
106
+ y: centerY + Math.sin(angle) * dist,
107
+ vx: this.animated() ? (Math.random() - .5) * .4 : seedVelocities[i],
108
+ vy: this.animated() ? (Math.random() - .5) * .4 : seedVelocities[(i + 2) % 5],
109
+ radius: baseRadius * (this.animated() ? .6 + Math.random() * .4 : seedRadii[i]),
110
+ color: c.color,
111
+ opacity: c.opacity
112
+ };
113
+ });
114
+ }
115
+ setupAudioAnalysis() {
116
+ const audioTrack = this.audioTrack();
117
+ if (!audioTrack) return;
118
+ try {
119
+ this.audioContext ??= new AudioContext();
120
+ this.analyser = this.audioContext.createAnalyser();
121
+ this.analyser.fftSize = 256;
122
+ this.analyser.smoothingTimeConstant = .8;
123
+ const bufferLength = this.analyser.frequencyBinCount;
124
+ this.dataArray = new Uint8Array(bufferLength);
125
+ const stream = new MediaStream([audioTrack]);
126
+ this.source = this.audioContext.createMediaStreamSource(stream);
127
+ this.source.connect(this.analyser);
128
+ this.analyzeAudio();
129
+ } catch (error) {
130
+ console.error("[AI_AUDIO_CIRCLE] Error setting up audio analysis:", error);
131
+ }
132
+ }
133
+ setupCandidateAudioAnalysis() {
134
+ const candidateAudioTrack = this.candidateAudioTrack();
135
+ if (!candidateAudioTrack) return;
136
+ try {
137
+ this.audioContext ??= new AudioContext();
138
+ this.candidateAnalyser = this.audioContext.createAnalyser();
139
+ this.candidateAnalyser.fftSize = 256;
140
+ this.candidateAnalyser.smoothingTimeConstant = .8;
141
+ const bufferLength = this.candidateAnalyser.frequencyBinCount;
142
+ this.candidateDataArray = new Uint8Array(bufferLength);
143
+ const stream = new MediaStream([candidateAudioTrack]);
144
+ this.candidateSource = this.audioContext.createMediaStreamSource(stream);
145
+ this.candidateSource.connect(this.candidateAnalyser);
146
+ } catch (error) {
147
+ console.error("[AI_AUDIO_CIRCLE] Error setting up candidate audio analysis:", error);
148
+ }
149
+ }
150
+ analyzeAudio() {
151
+ if (!this.analyser || !this.dataArray) return;
152
+ const analyze = () => {
153
+ if (!this.analyser || !this.dataArray) return;
154
+ this.analyser.getByteFrequencyData(this.dataArray);
155
+ const aiVolume = Array.from(this.dataArray).reduce((a, b) => a + b, 0) / this.dataArray.length / 255;
156
+ let candidateVolume = 0;
157
+ if (this.candidateAnalyser && this.candidateDataArray) {
158
+ this.candidateAnalyser.getByteFrequencyData(this.candidateDataArray);
159
+ candidateVolume = Array.from(this.candidateDataArray).reduce((a, b) => a + b, 0) / this.candidateDataArray.length / 255;
160
+ }
161
+ const aiSpeaking = aiVolume > this.AI_SPEAKING_THRESHOLD;
162
+ if (candidateVolume > this.CANDIDATE_SPEAKING_THRESHOLD) this.state.set(InterviewState.CandidateSpeaking);
163
+ else if (aiSpeaking) this.state.set(InterviewState.AiSpeaking);
164
+ else this.state.set(InterviewState.AiListening);
165
+ this.isSpeaking.set(aiSpeaking);
166
+ const currentStateValue = this.state();
167
+ if (currentStateValue === InterviewState.AiSpeaking && aiSpeaking) {
168
+ const target = Math.pow(aiVolume, .75) * 1.8;
169
+ this.currentAmp += (target - this.currentAmp) * .5;
170
+ } else if (currentStateValue === InterviewState.CandidateSpeaking) {
171
+ const target = .55;
172
+ this.currentAmp += (target - this.currentAmp) * .1;
173
+ } else {
174
+ const fixedBase = .2;
175
+ this.currentAmp += (fixedBase - this.currentAmp) * .05;
176
+ }
177
+ this.animationFrameId = requestAnimationFrame(analyze);
178
+ };
179
+ this.animationFrameId = requestAnimationFrame(analyze);
180
+ }
181
+ startAnimations() {
182
+ this.animatePulse = this.animatePulse.bind(this);
183
+ this.mainLoop = this.mainLoop.bind(this);
184
+ if (!this.animated()) {
185
+ this.animatePulse();
186
+ return;
187
+ }
188
+ this.animatePulse();
189
+ this.mainLoop();
190
+ }
191
+ mainLoop() {
192
+ this.simTime += .05;
193
+ const currentStateValue = this.state();
194
+ if (currentStateValue === InterviewState.Static) {} else if (currentStateValue === InterviewState.AiSpeaking) {
195
+ if (this.analyser && this.dataArray) {} else {
196
+ const target = (Math.sin(this.simTime * .8) * .5 + .5) * (Math.random() * .9);
197
+ this.currentAmp += (target - this.currentAmp) * .25;
198
+ }
199
+ } else if (currentStateValue === InterviewState.CandidateSpeaking) {
200
+ const target = .55;
201
+ this.currentAmp += (target - this.currentAmp) * .1;
202
+ } else {
203
+ const fixedBase = .2;
204
+ this.currentAmp += (fixedBase - this.currentAmp) * .05;
205
+ }
206
+ requestAnimationFrame(this.mainLoop);
207
+ }
208
+ animatePulse() {
209
+ if (!this.pulseCtx) return;
210
+ const ctx = this.pulseCtx;
211
+ this.pulseTime += .016;
212
+ const size = this.canvasSize();
213
+ const centerX = size / 2;
214
+ const centerY = size / 2;
215
+ const baseRadius = this.baseRadius();
216
+ ctx.clearRect(0, 0, size, size);
217
+ const currentStateValue = this.state();
218
+ const effectiveAmp = this.currentAmp;
219
+ const isListening = currentStateValue === InterviewState.AiListening;
220
+ const isCandidate = currentStateValue === InterviewState.CandidateSpeaking;
221
+ const isAiSpeaking = currentStateValue === InterviewState.AiSpeaking;
222
+ const isStatic = currentStateValue === InterviewState.Static;
223
+ if (isStatic) {
224
+ this.pulseTargetScale = 1;
225
+ this.pulseScale = 1;
226
+ } else if (isCandidate) {
227
+ this.pulseTargetScale = 1.15;
228
+ const breathing = 0;
229
+ this.pulseScale += (this.pulseTargetScale + breathing - this.pulseScale) * .08;
230
+ } else {
231
+ this.pulseTargetScale = 1 + effectiveAmp * .5;
232
+ let breathing;
233
+ if (isListening) breathing = Math.sin(this.pulseTime * 1.5) * .035;
234
+ else if (isAiSpeaking) breathing = Math.sin(this.pulseTime * 2.7) * .055 + Math.cos(this.pulseTime * 1.9) * .04 + Math.sin(this.pulseTime * 4.1 + 1) * .025;
235
+ else breathing = 0;
236
+ const smoothing = isAiSpeaking ? .11 : .06;
237
+ this.pulseScale += (this.pulseTargetScale + breathing - this.pulseScale) * smoothing;
238
+ }
239
+ const currentRadius = baseRadius * this.pulseScale;
240
+ if (!isStatic) for (let i = 3; i >= 1; i--) {
241
+ const shadowRadius = currentRadius + i * 10;
242
+ const shadowOpacity = .35 - i * .06;
243
+ const shadowGradient = ctx.createRadialGradient(centerX, centerY, currentRadius * .98, centerX, centerY, shadowRadius);
244
+ shadowGradient.addColorStop(0, `rgba(${this.SHADOW_COLOR_RGB}, ${shadowOpacity})`);
245
+ shadowGradient.addColorStop(.6, `rgba(${this.SHADOW_COLOR_RGB}, ${shadowOpacity * .5})`);
246
+ shadowGradient.addColorStop(1, `rgba(${this.SHADOW_COLOR_RGB}, 0)`);
247
+ ctx.beginPath();
248
+ ctx.arc(centerX, centerY, shadowRadius, 0, Math.PI * 2);
249
+ ctx.fillStyle = shadowGradient;
250
+ ctx.fill();
251
+ }
252
+ ctx.save();
253
+ ctx.beginPath();
254
+ ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);
255
+ ctx.clip();
256
+ const bgGradient = ctx.createLinearGradient(centerX - currentRadius, centerY - currentRadius, centerX + currentRadius, centerY + currentRadius);
257
+ bgGradient.addColorStop(0, Color.BRAND_50);
258
+ bgGradient.addColorStop(.5, Color.INFORMATIVE_20);
259
+ bgGradient.addColorStop(1, Color.INFORMATIVE_30);
260
+ ctx.beginPath();
261
+ ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);
262
+ ctx.fillStyle = bgGradient;
263
+ ctx.fill();
264
+ let speedMultiplier;
265
+ let chaosStrength;
266
+ if (isCandidate) {
267
+ speedMultiplier = 3;
268
+ chaosStrength = 1;
269
+ } else if (isListening) {
270
+ speedMultiplier = 2;
271
+ chaosStrength = 1;
272
+ } else {
273
+ speedMultiplier = 1.5 + effectiveAmp * 3;
274
+ chaosStrength = isAiSpeaking ? 1.8 : 1;
275
+ }
276
+ this.blobs.forEach((blob, index) => {
277
+ if (!isStatic) {
278
+ let chaos1 = Math.sin(this.pulseTime * .6 + index * 2.5 + blob.x * .02) * .15;
279
+ let chaos2 = Math.cos(this.pulseTime * .4 + index * 1.8 + blob.y * .015) * .12;
280
+ let chaos3 = Math.sin(this.pulseTime + index * .7) * .08;
281
+ if (isAiSpeaking) {
282
+ chaos1 += Math.sin(this.pulseTime * 3.2 + index * 1.3) * .18;
283
+ chaos2 += Math.cos(this.pulseTime * 2.5 + index * 2.1) * .14;
284
+ chaos3 += Math.sin(this.pulseTime * 4 + index * .5) * .1;
285
+ }
286
+ const force = .045 * speedMultiplier * chaosStrength;
287
+ blob.vx += (chaos1 + chaos3 * Math.cos(this.pulseTime * 1.5 + index)) * force;
288
+ blob.vy += (chaos2 + chaos3 * Math.sin(this.pulseTime * 1.2 + index)) * force;
289
+ const friction = isAiSpeaking ? .985 : .98;
290
+ blob.vx *= friction;
291
+ blob.vy *= friction;
292
+ const maxVel = (isListening ? 3 : isAiSpeaking ? 6 : 4.5) * speedMultiplier;
293
+ const vel = Math.sqrt(blob.vx * blob.vx + blob.vy * blob.vy);
294
+ if (vel > maxVel) {
295
+ blob.vx = blob.vx / vel * maxVel;
296
+ blob.vy = blob.vy / vel * maxVel;
297
+ }
298
+ blob.x += blob.vx;
299
+ blob.y += blob.vy;
300
+ const dx = blob.x - centerX;
301
+ const dy = blob.y - centerY;
302
+ const dist = Math.sqrt(dx * dx + dy * dy);
303
+ const maxDist = currentRadius * .55;
304
+ if (dist > maxDist) {
305
+ const angle = Math.atan2(dy, dx);
306
+ blob.x = centerX + Math.cos(angle) * maxDist;
307
+ blob.y = centerY + Math.sin(angle) * maxDist;
308
+ blob.vx -= dx * .065;
309
+ blob.vy -= dy * .065;
310
+ }
311
+ }
312
+ const rgb = this.hexToRgb(blob.color);
313
+ const blurRadius = blob.radius * 1.3;
314
+ const outerGlow = ctx.createRadialGradient(blob.x, blob.y, 0, blob.x, blob.y, blurRadius);
315
+ outerGlow.addColorStop(0, `rgba(${rgb}, ${blob.opacity * .9})`);
316
+ outerGlow.addColorStop(.2, `rgba(${rgb}, ${blob.opacity * .7})`);
317
+ outerGlow.addColorStop(.4, `rgba(${rgb}, ${blob.opacity * .5})`);
318
+ outerGlow.addColorStop(.6, `rgba(${rgb}, ${blob.opacity * .3})`);
319
+ outerGlow.addColorStop(.8, `rgba(${rgb}, ${blob.opacity * .1})`);
320
+ outerGlow.addColorStop(1, `rgba(${rgb}, 0)`);
321
+ ctx.beginPath();
322
+ ctx.arc(blob.x, blob.y, blurRadius, 0, Math.PI * 2);
323
+ ctx.fillStyle = outerGlow;
324
+ ctx.fill();
325
+ });
326
+ const highlightGradient = ctx.createRadialGradient(centerX - currentRadius * .3, centerY - currentRadius * .3, 0, centerX - currentRadius * .3, centerY - currentRadius * .3, currentRadius * .6);
327
+ highlightGradient.addColorStop(0, "rgba(255, 255, 255, 0.12)");
328
+ highlightGradient.addColorStop(.5, "rgba(255, 255, 255, 0.03)");
329
+ highlightGradient.addColorStop(1, "rgba(255, 255, 255, 0)");
330
+ ctx.beginPath();
331
+ ctx.arc(centerX, centerY, currentRadius, 0, Math.PI * 2);
332
+ ctx.fillStyle = highlightGradient;
333
+ ctx.fill();
334
+ ctx.restore();
335
+ if (this.animated()) this.pulseAnimationId = requestAnimationFrame(this.animatePulse);
336
+ }
337
+ hexToRgb(hex) {
338
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
339
+ if (!result) return "0, 0, 0";
340
+ return `${parseInt(result[1], 16)}, ${parseInt(result[2], 16)}, ${parseInt(result[3], 16)}`;
341
+ }
342
+ cleanup() {
343
+ if (this.animationFrameId) {
344
+ cancelAnimationFrame(this.animationFrameId);
345
+ this.animationFrameId = void 0;
346
+ }
347
+ if (this.pulseAnimationId) {
348
+ cancelAnimationFrame(this.pulseAnimationId);
349
+ this.pulseAnimationId = void 0;
350
+ }
351
+ if (this.source) {
352
+ this.source.disconnect();
353
+ this.source = void 0;
354
+ }
355
+ if (this.candidateSource) {
356
+ this.candidateSource.disconnect();
357
+ this.candidateSource = void 0;
358
+ }
359
+ if (this.audioContext && this.audioContext.state !== "closed") {
360
+ this.audioContext.close();
361
+ this.audioContext = void 0;
362
+ }
363
+ this.analyser = void 0;
364
+ this.candidateAnalyser = void 0;
365
+ this.dataArray = void 0;
366
+ this.candidateDataArray = void 0;
367
+ }
368
+ ngOnDestroy() {
369
+ this.cleanup();
370
+ }
371
+ static {
372
+ this.ɵfac = i0.ɵɵngDeclareFactory({
373
+ minVersion: "12.0.0",
374
+ version: "22.2.4",
375
+ ngImport: i0,
376
+ type: AiAudioCircleComponent,
377
+ deps: [],
378
+ target: i0.ɵɵFactoryTarget.Component
379
+ });
380
+ }
381
+ static {
382
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
383
+ minVersion: "17.1.0",
384
+ version: "22.2.4",
385
+ type: AiAudioCircleComponent,
386
+ isStandalone: true,
387
+ selector: "ui-ai-audio-circle",
388
+ inputs: {
389
+ audioTrack: {
390
+ classPropertyName: "audioTrack",
391
+ publicName: "audioTrack",
392
+ isSignal: true,
393
+ isRequired: false,
394
+ transformFunction: null
395
+ },
396
+ candidateAudioTrack: {
397
+ classPropertyName: "candidateAudioTrack",
398
+ publicName: "candidateAudioTrack",
399
+ isSignal: true,
400
+ isRequired: false,
401
+ transformFunction: null
402
+ },
403
+ state: {
404
+ classPropertyName: "state",
405
+ publicName: "state",
406
+ isSignal: true,
407
+ isRequired: false,
408
+ transformFunction: null
409
+ },
410
+ canvasSize: {
411
+ classPropertyName: "canvasSize",
412
+ publicName: "canvasSize",
413
+ isSignal: true,
414
+ isRequired: false,
415
+ transformFunction: null
416
+ },
417
+ animated: {
418
+ classPropertyName: "animated",
419
+ publicName: "animated",
420
+ isSignal: true,
421
+ isRequired: false,
422
+ transformFunction: null
423
+ }
424
+ },
425
+ outputs: { state: "stateChange" },
426
+ viewQueries: [{
427
+ propertyName: "pulseCanvasRef",
428
+ first: true,
429
+ predicate: ["pulseCanvas"],
430
+ descendants: true
431
+ }],
432
+ ngImport: i0,
433
+ template: "<div class=\"ai-audio-visualizer\">\n <div class=\"canvas-container\">\n <canvas #pulseCanvas></canvas>\n </div>\n</div>\n",
434
+ styles: [".ai-audio-visualizer{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;height:100%}.canvas-container{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center}canvas{display:block}\n"],
435
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
436
+ });
437
+ }
438
+ };
439
+ i0.ɵɵngDeclareClassMetadata({
440
+ minVersion: "12.0.0",
441
+ version: "22.2.4",
442
+ ngImport: i0,
443
+ type: AiAudioCircleComponent,
444
+ decorators: [{
445
+ type: Component,
446
+ args: [{
447
+ selector: "ui-ai-audio-circle",
448
+ changeDetection: ChangeDetectionStrategy.OnPush,
449
+ template: "<div class=\"ai-audio-visualizer\">\n <div class=\"canvas-container\">\n <canvas #pulseCanvas></canvas>\n </div>\n</div>\n",
450
+ styles: [".ai-audio-visualizer{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;height:100%}.canvas-container{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center}canvas{display:block}\n"]
451
+ }]
452
+ }],
453
+ ctorParameters: () => [],
454
+ propDecorators: {
455
+ pulseCanvasRef: [{
456
+ type: ViewChild,
457
+ args: ["pulseCanvas", { static: false }]
458
+ }],
459
+ audioTrack: [{
460
+ type: i0.Input,
461
+ args: [{
462
+ isSignal: true,
463
+ alias: "audioTrack",
464
+ required: false
465
+ }]
466
+ }],
467
+ candidateAudioTrack: [{
468
+ type: i0.Input,
469
+ args: [{
470
+ isSignal: true,
471
+ alias: "candidateAudioTrack",
472
+ required: false
473
+ }]
474
+ }],
475
+ state: [{
476
+ type: i0.Input,
477
+ args: [{
478
+ isSignal: true,
479
+ alias: "state",
480
+ required: false
481
+ }]
482
+ }, {
483
+ type: i0.Output,
484
+ args: ["stateChange"]
485
+ }],
486
+ canvasSize: [{
487
+ type: i0.Input,
488
+ args: [{
489
+ isSignal: true,
490
+ alias: "canvasSize",
491
+ required: false
492
+ }]
493
+ }],
494
+ animated: [{
495
+ type: i0.Input,
496
+ args: [{
497
+ isSignal: true,
498
+ alias: "animated",
499
+ required: false
500
+ }]
501
+ }]
502
+ }
503
+ });
504
+ var AiAudioCircleModule = class AiAudioCircleModule {
505
+ static {
506
+ this.ɵfac = i0.ɵɵngDeclareFactory({
507
+ minVersion: "12.0.0",
508
+ version: "22.2.4",
509
+ ngImport: i0,
510
+ type: AiAudioCircleModule,
511
+ deps: [],
512
+ target: i0.ɵɵFactoryTarget.NgModule
513
+ });
514
+ }
515
+ static {
516
+ this.ɵmod = i0.ɵɵngDeclareNgModule({
517
+ minVersion: "14.0.0",
518
+ version: "22.2.4",
519
+ ngImport: i0,
520
+ type: AiAudioCircleModule,
521
+ imports: [CommonModule, AiAudioCircleComponent],
522
+ exports: [AiAudioCircleComponent]
523
+ });
524
+ }
525
+ static {
526
+ this.ɵinj = i0.ɵɵngDeclareInjector({
527
+ minVersion: "12.0.0",
528
+ version: "22.2.4",
529
+ ngImport: i0,
530
+ type: AiAudioCircleModule,
531
+ imports: [CommonModule]
532
+ });
533
+ }
534
+ };
535
+ i0.ɵɵngDeclareClassMetadata({
536
+ minVersion: "12.0.0",
537
+ version: "22.2.4",
538
+ ngImport: i0,
539
+ type: AiAudioCircleModule,
540
+ decorators: [{
541
+ type: NgModule,
542
+ args: [{
543
+ imports: [CommonModule, AiAudioCircleComponent],
544
+ exports: [AiAudioCircleComponent]
545
+ }]
546
+ }]
547
+ });
467
548
  export { AiAudioCircleComponent, AiAudioCircleModule, InterviewState };
468
- //# sourceMappingURL=testgorilla-tgo-ui-components-ai-audio-circle.mjs.map
549
+
550
+ //# sourceMappingURL=testgorilla-tgo-ui-components-ai-audio-circle.mjs.map