@cognivo/components 0.8.0 → 0.8.2

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 (543) hide show
  1. package/dist/chunks/focus-trap-vlQwKK-3.js +82 -0
  2. package/dist/chunks/focus-trap-vlQwKK-3.js.map +1 -0
  3. package/dist/chunks/{premium.css-9I4kHrsl.js → premium.css-DHekUEUt.js} +25 -25
  4. package/dist/chunks/{premium.css-9I4kHrsl.js.map → premium.css-DHekUEUt.js.map} +1 -1
  5. package/dist/cognivo.min.js +3375 -5270
  6. package/dist/cognivo.min.js.map +1 -1
  7. package/dist/components/ai-ab-test/ai-ab-test.js +1 -1
  8. package/dist/components/ai-accessibility-report/ai-accessibility-report.d.ts.map +1 -1
  9. package/dist/components/ai-accessibility-report/ai-accessibility-report.js +14 -13
  10. package/dist/components/ai-accessibility-report/ai-accessibility-report.js.map +1 -1
  11. package/dist/components/ai-action-preview/ai-action-preview.d.ts.map +1 -1
  12. package/dist/components/ai-action-preview/ai-action-preview.js +15 -14
  13. package/dist/components/ai-action-preview/ai-action-preview.js.map +1 -1
  14. package/dist/components/ai-agent-card/ai-agent-card.js +1 -1
  15. package/dist/components/ai-agent-steps/ai-agent-steps.d.ts +8 -21
  16. package/dist/components/ai-agent-steps/ai-agent-steps.d.ts.map +1 -1
  17. package/dist/components/ai-agent-steps/ai-agent-steps.js +85 -139
  18. package/dist/components/ai-agent-steps/ai-agent-steps.js.map +1 -1
  19. package/dist/components/ai-alert-card/ai-alert-card.js +5 -5
  20. package/dist/components/ai-alert-card/ai-alert-card.js.map +1 -1
  21. package/dist/components/ai-analytics-chart/ai-analytics-chart.d.ts +0 -13
  22. package/dist/components/ai-analytics-chart/ai-analytics-chart.d.ts.map +1 -1
  23. package/dist/components/ai-analytics-chart/ai-analytics-chart.js +75 -125
  24. package/dist/components/ai-analytics-chart/ai-analytics-chart.js.map +1 -1
  25. package/dist/components/ai-annotation/ai-annotation.js +2 -2
  26. package/dist/components/ai-annotation/ai-annotation.js.map +1 -1
  27. package/dist/components/ai-api-key-manager/ai-api-key-manager.d.ts +0 -9
  28. package/dist/components/ai-api-key-manager/ai-api-key-manager.d.ts.map +1 -1
  29. package/dist/components/ai-api-key-manager/ai-api-key-manager.js +115 -276
  30. package/dist/components/ai-api-key-manager/ai-api-key-manager.js.map +1 -1
  31. package/dist/components/ai-app-sidebar/ai-app-sidebar.js +13 -13
  32. package/dist/components/ai-app-sidebar/ai-app-sidebar.js.map +1 -1
  33. package/dist/components/ai-assistant-widget/ai-assistant-widget.d.ts.map +1 -1
  34. package/dist/components/ai-assistant-widget/ai-assistant-widget.js +5 -2
  35. package/dist/components/ai-assistant-widget/ai-assistant-widget.js.map +1 -1
  36. package/dist/components/ai-audio-player/ai-audio-player.d.ts.map +1 -1
  37. package/dist/components/ai-audio-player/ai-audio-player.js +23 -19
  38. package/dist/components/ai-audio-player/ai-audio-player.js.map +1 -1
  39. package/dist/components/ai-avatar/ai-avatar.js +1 -1
  40. package/dist/components/ai-badge/ai-badge.js +1 -1
  41. package/dist/components/ai-batch-progress/ai-batch-progress.js +6 -6
  42. package/dist/components/ai-batch-progress/ai-batch-progress.js.map +1 -1
  43. package/dist/components/ai-cache-indicator/ai-cache-indicator.d.ts +0 -13
  44. package/dist/components/ai-cache-indicator/ai-cache-indicator.d.ts.map +1 -1
  45. package/dist/components/ai-cache-indicator/ai-cache-indicator.js +90 -185
  46. package/dist/components/ai-cache-indicator/ai-cache-indicator.js.map +1 -1
  47. package/dist/components/ai-capture-flow/ai-capture-flow.js +21 -21
  48. package/dist/components/ai-capture-flow/ai-capture-flow.js.map +1 -1
  49. package/dist/components/ai-changelog/ai-changelog.js +26 -26
  50. package/dist/components/ai-changelog/ai-changelog.js.map +1 -1
  51. package/dist/components/ai-chart-summary/ai-chart-summary.d.ts +0 -6
  52. package/dist/components/ai-chart-summary/ai-chart-summary.d.ts.map +1 -1
  53. package/dist/components/ai-chart-summary/ai-chart-summary.js +100 -103
  54. package/dist/components/ai-chart-summary/ai-chart-summary.js.map +1 -1
  55. package/dist/components/ai-chat/ai-chat.d.ts.map +1 -1
  56. package/dist/components/ai-chat/ai-chat.js +9 -3
  57. package/dist/components/ai-chat/ai-chat.js.map +1 -1
  58. package/dist/components/ai-citation/ai-citation.d.ts +0 -6
  59. package/dist/components/ai-citation/ai-citation.d.ts.map +1 -1
  60. package/dist/components/ai-citation/ai-citation.js +64 -90
  61. package/dist/components/ai-citation/ai-citation.js.map +1 -1
  62. package/dist/components/ai-collaborative-editor/ai-collaborative-editor.d.ts +1 -27
  63. package/dist/components/ai-collaborative-editor/ai-collaborative-editor.d.ts.map +1 -1
  64. package/dist/components/ai-collaborative-editor/ai-collaborative-editor.js +114 -260
  65. package/dist/components/ai-collaborative-editor/ai-collaborative-editor.js.map +1 -1
  66. package/dist/components/ai-command-palette/ai-command-palette.js +1 -1
  67. package/dist/components/ai-confidence-badge/ai-confidence-badge.d.ts +11 -9
  68. package/dist/components/ai-confidence-badge/ai-confidence-badge.d.ts.map +1 -1
  69. package/dist/components/ai-confidence-badge/ai-confidence-badge.js +183 -101
  70. package/dist/components/ai-confidence-badge/ai-confidence-badge.js.map +1 -1
  71. package/dist/components/ai-confidence-slider/ai-confidence-slider.js +27 -27
  72. package/dist/components/ai-confidence-slider/ai-confidence-slider.js.map +1 -1
  73. package/dist/components/ai-consent-manager/ai-consent-manager.js +2 -2
  74. package/dist/components/ai-consent-manager/ai-consent-manager.js.map +1 -1
  75. package/dist/components/ai-context-window/ai-context-window.js +19 -19
  76. package/dist/components/ai-context-window/ai-context-window.js.map +1 -1
  77. package/dist/components/ai-copy-button/ai-copy-button.js +4 -4
  78. package/dist/components/ai-copy-button/ai-copy-button.js.map +1 -1
  79. package/dist/components/ai-cost-dashboard/ai-cost-dashboard.js +14 -14
  80. package/dist/components/ai-cost-dashboard/ai-cost-dashboard.js.map +1 -1
  81. package/dist/components/ai-data-card/ai-data-card.js +2 -2
  82. package/dist/components/ai-data-card/ai-data-card.js.map +1 -1
  83. package/dist/components/ai-data-lineage/ai-data-lineage.js +6 -6
  84. package/dist/components/ai-data-lineage/ai-data-lineage.js.map +1 -1
  85. package/dist/components/ai-data-preview/ai-data-preview.d.ts +0 -7
  86. package/dist/components/ai-data-preview/ai-data-preview.d.ts.map +1 -1
  87. package/dist/components/ai-data-preview/ai-data-preview.js +130 -267
  88. package/dist/components/ai-data-preview/ai-data-preview.js.map +1 -1
  89. package/dist/components/ai-data-table/ai-data-table.js +9 -9
  90. package/dist/components/ai-data-table/ai-data-table.js.map +1 -1
  91. package/dist/components/ai-debug-console/ai-debug-console.d.ts +1 -13
  92. package/dist/components/ai-debug-console/ai-debug-console.d.ts.map +1 -1
  93. package/dist/components/ai-debug-console/ai-debug-console.js +134 -340
  94. package/dist/components/ai-debug-console/ai-debug-console.js.map +1 -1
  95. package/dist/components/ai-detection-canvas/ai-detection-canvas.js +2 -2
  96. package/dist/components/ai-detection-canvas/ai-detection-canvas.js.map +1 -1
  97. package/dist/components/ai-diff-panel/ai-diff-panel.js +1 -1
  98. package/dist/components/ai-embedding-viz/ai-embedding-viz.js +4 -4
  99. package/dist/components/ai-embedding-viz/ai-embedding-viz.js.map +1 -1
  100. package/dist/components/ai-empty-state/ai-empty-state.js +1 -1
  101. package/dist/components/ai-error-boundary/ai-error-boundary.d.ts.map +1 -1
  102. package/dist/components/ai-error-boundary/ai-error-boundary.js +26 -21
  103. package/dist/components/ai-error-boundary/ai-error-boundary.js.map +1 -1
  104. package/dist/components/ai-eval-scorecard/ai-eval-scorecard.js +5 -5
  105. package/dist/components/ai-eval-scorecard/ai-eval-scorecard.js.map +1 -1
  106. package/dist/components/ai-feature-flag/ai-feature-flag.d.ts +0 -14
  107. package/dist/components/ai-feature-flag/ai-feature-flag.d.ts.map +1 -1
  108. package/dist/components/ai-feature-flag/ai-feature-flag.js +181 -322
  109. package/dist/components/ai-feature-flag/ai-feature-flag.js.map +1 -1
  110. package/dist/components/ai-feedback/ai-feedback.d.ts.map +1 -1
  111. package/dist/components/ai-feedback/ai-feedback.js +10 -5
  112. package/dist/components/ai-feedback/ai-feedback.js.map +1 -1
  113. package/dist/components/ai-file-upload/ai-file-upload.js +1 -1
  114. package/dist/components/ai-form-generator/ai-form-generator.js +1 -1
  115. package/dist/components/ai-guardrail/ai-guardrail.js +2 -2
  116. package/dist/components/ai-guardrail/ai-guardrail.js.map +1 -1
  117. package/dist/components/ai-heatmap/ai-heatmap.js +1 -1
  118. package/dist/components/ai-insight-card/ai-insight-card.js +4 -4
  119. package/dist/components/ai-insight-card/ai-insight-card.js.map +1 -1
  120. package/dist/components/ai-json-viewer/ai-json-viewer.js +13 -13
  121. package/dist/components/ai-json-viewer/ai-json-viewer.js.map +1 -1
  122. package/dist/components/ai-keyboard-shortcuts/ai-keyboard-shortcuts.js +24 -24
  123. package/dist/components/ai-keyboard-shortcuts/ai-keyboard-shortcuts.js.map +1 -1
  124. package/dist/components/ai-kpi-grid/ai-kpi-grid.js +2 -2
  125. package/dist/components/ai-kpi-grid/ai-kpi-grid.js.map +1 -1
  126. package/dist/components/ai-labeling-board/ai-labeling-board.js +11 -11
  127. package/dist/components/ai-labeling-board/ai-labeling-board.js.map +1 -1
  128. package/dist/components/ai-memory-panel/ai-memory-panel.js +7 -7
  129. package/dist/components/ai-memory-panel/ai-memory-panel.js.map +1 -1
  130. package/dist/components/ai-model-comparison/ai-model-comparison.js +2 -2
  131. package/dist/components/ai-model-comparison/ai-model-comparison.js.map +1 -1
  132. package/dist/components/ai-model-selector/ai-model-selector.js +7 -7
  133. package/dist/components/ai-model-selector/ai-model-selector.js.map +1 -1
  134. package/dist/components/ai-notification-center/ai-notification-center.js +27 -27
  135. package/dist/components/ai-notification-center/ai-notification-center.js.map +1 -1
  136. package/dist/components/ai-onboarding/ai-onboarding.js +5 -5
  137. package/dist/components/ai-onboarding/ai-onboarding.js.map +1 -1
  138. package/dist/components/ai-permission-gate/ai-permission-gate.js +1 -1
  139. package/dist/components/ai-personalization-dash/ai-personalization-dash.js +1 -1
  140. package/dist/components/ai-presence/ai-presence.js +25 -25
  141. package/dist/components/ai-presence/ai-presence.js.map +1 -1
  142. package/dist/components/ai-progress-steps/ai-progress-steps.js +11 -11
  143. package/dist/components/ai-progress-steps/ai-progress-steps.js.map +1 -1
  144. package/dist/components/ai-prompt-editor/ai-prompt-editor.js +1 -1
  145. package/dist/components/ai-prompt-template/ai-prompt-template.js +29 -29
  146. package/dist/components/ai-prompt-template/ai-prompt-template.js.map +1 -1
  147. package/dist/components/ai-rag-panel/ai-rag-panel.js +4 -4
  148. package/dist/components/ai-rag-panel/ai-rag-panel.js.map +1 -1
  149. package/dist/components/ai-reasoning-tree/ai-reasoning-tree.js +16 -16
  150. package/dist/components/ai-reasoning-tree/ai-reasoning-tree.js.map +1 -1
  151. package/dist/components/ai-result-panel/ai-result-panel.js +1 -1
  152. package/dist/components/ai-reveal-animation/ai-reveal-animation.js +3 -3
  153. package/dist/components/ai-reveal-animation/ai-reveal-animation.js.map +1 -1
  154. package/dist/components/ai-reward-signal/ai-reward-signal.js +1 -1
  155. package/dist/components/ai-rich-message/ai-rich-message.d.ts.map +1 -1
  156. package/dist/components/ai-rich-message/ai-rich-message.js +37 -30
  157. package/dist/components/ai-rich-message/ai-rich-message.js.map +1 -1
  158. package/dist/components/ai-scenario-panel/ai-scenario-panel.js +10 -10
  159. package/dist/components/ai-scenario-panel/ai-scenario-panel.js.map +1 -1
  160. package/dist/components/ai-search/ai-search.js +1 -1
  161. package/dist/components/ai-segmentation-viewer/ai-segmentation-viewer.js +3 -3
  162. package/dist/components/ai-segmentation-viewer/ai-segmentation-viewer.js.map +1 -1
  163. package/dist/components/ai-sidebar/ai-sidebar.js +1 -1
  164. package/dist/components/ai-similarity-card/ai-similarity-card.js +1 -1
  165. package/dist/components/ai-source-graph/ai-source-graph.js +2 -2
  166. package/dist/components/ai-source-graph/ai-source-graph.js.map +1 -1
  167. package/dist/components/ai-status-page/ai-status-page.js +15 -15
  168. package/dist/components/ai-status-page/ai-status-page.js.map +1 -1
  169. package/dist/components/ai-streaming-text/ai-streaming-text.js +1 -1
  170. package/dist/components/ai-test-runner/ai-test-runner.d.ts +0 -8
  171. package/dist/components/ai-test-runner/ai-test-runner.d.ts.map +1 -1
  172. package/dist/components/ai-test-runner/ai-test-runner.js +100 -257
  173. package/dist/components/ai-test-runner/ai-test-runner.js.map +1 -1
  174. package/dist/components/ai-thinking/ai-thinking.js +1 -1
  175. package/dist/components/ai-timeline/ai-timeline.js +2 -2
  176. package/dist/components/ai-timeline/ai-timeline.js.map +1 -1
  177. package/dist/components/ai-token-tracker/ai-token-tracker.js +3 -3
  178. package/dist/components/ai-token-tracker/ai-token-tracker.js.map +1 -1
  179. package/dist/components/ai-tool-card-resolver/ai-tool-card-resolver.js +23 -23
  180. package/dist/components/ai-tool-card-resolver/ai-tool-card-resolver.js.map +1 -1
  181. package/dist/components/ai-tool-indicator/ai-tool-indicator.js +3 -3
  182. package/dist/components/ai-tool-indicator/ai-tool-indicator.js.map +1 -1
  183. package/dist/components/ai-transform-slider/ai-transform-slider.js +1 -1
  184. package/dist/components/ai-translation-panel/ai-translation-panel.js +2 -2
  185. package/dist/components/ai-translation-panel/ai-translation-panel.js.map +1 -1
  186. package/dist/components/ai-usage-meter/ai-usage-meter.js +1 -1
  187. package/dist/components/ai-validation-checklist/ai-validation-checklist.d.ts +1 -11
  188. package/dist/components/ai-validation-checklist/ai-validation-checklist.d.ts.map +1 -1
  189. package/dist/components/ai-validation-checklist/ai-validation-checklist.js +133 -187
  190. package/dist/components/ai-validation-checklist/ai-validation-checklist.js.map +1 -1
  191. package/dist/components/ai-version-selector/ai-version-selector.d.ts +0 -4
  192. package/dist/components/ai-version-selector/ai-version-selector.d.ts.map +1 -1
  193. package/dist/components/ai-version-selector/ai-version-selector.js +189 -210
  194. package/dist/components/ai-version-selector/ai-version-selector.js.map +1 -1
  195. package/dist/components/ai-voice-panel/ai-voice-panel.js +28 -28
  196. package/dist/components/ai-voice-panel/ai-voice-panel.js.map +1 -1
  197. package/dist/components/ai-webhook-config/ai-webhook-config.d.ts +0 -17
  198. package/dist/components/ai-webhook-config/ai-webhook-config.d.ts.map +1 -1
  199. package/dist/components/ai-webhook-config/ai-webhook-config.js +281 -221
  200. package/dist/components/ai-webhook-config/ai-webhook-config.js.map +1 -1
  201. package/dist/components/ai-workflow-builder/ai-workflow-builder.js +2 -2
  202. package/dist/components/ai-workflow-builder/ai-workflow-builder.js.map +1 -1
  203. package/dist/components/bias-anchoring/bias-anchoring.js +1 -1
  204. package/dist/components/bias-authority/bias-authority.js +1 -1
  205. package/dist/components/bias-commitment/bias-commitment.js +1 -1
  206. package/dist/components/bias-reciprocity/bias-reciprocity.js +1 -1
  207. package/dist/components/bias-scarcity/bias-scarcity.js +1 -1
  208. package/dist/components/bias-social-proof/bias-social-proof.js +1 -1
  209. package/dist/components/cg-accordion/cg-accordion.d.ts.map +1 -1
  210. package/dist/components/cg-accordion/cg-accordion.js +51 -43
  211. package/dist/components/cg-accordion/cg-accordion.js.map +1 -1
  212. package/dist/components/cg-alert-dialog/cg-alert-dialog.js +18 -18
  213. package/dist/components/cg-alert-dialog/cg-alert-dialog.js.map +1 -1
  214. package/dist/components/cg-aspect-ratio/cg-aspect-ratio.d.ts.map +1 -1
  215. package/dist/components/cg-aspect-ratio/cg-aspect-ratio.js +25 -21
  216. package/dist/components/cg-aspect-ratio/cg-aspect-ratio.js.map +1 -1
  217. package/dist/components/cg-autocomplete/cg-autocomplete.d.ts +1 -0
  218. package/dist/components/cg-autocomplete/cg-autocomplete.d.ts.map +1 -1
  219. package/dist/components/cg-autocomplete/cg-autocomplete.js +59 -43
  220. package/dist/components/cg-autocomplete/cg-autocomplete.js.map +1 -1
  221. package/dist/components/cg-avatar/cg-avatar.d.ts.map +1 -1
  222. package/dist/components/cg-avatar/cg-avatar.js +24 -24
  223. package/dist/components/cg-avatar/cg-avatar.js.map +1 -1
  224. package/dist/components/cg-avatar-group/cg-avatar-group.d.ts.map +1 -1
  225. package/dist/components/cg-avatar-group/cg-avatar-group.js +18 -12
  226. package/dist/components/cg-avatar-group/cg-avatar-group.js.map +1 -1
  227. package/dist/components/cg-badge/cg-badge.d.ts.map +1 -1
  228. package/dist/components/cg-badge/cg-badge.js +26 -20
  229. package/dist/components/cg-badge/cg-badge.js.map +1 -1
  230. package/dist/components/cg-badge-group/cg-badge-group.d.ts +0 -1
  231. package/dist/components/cg-badge-group/cg-badge-group.d.ts.map +1 -1
  232. package/dist/components/cg-badge-group/cg-badge-group.js +31 -29
  233. package/dist/components/cg-badge-group/cg-badge-group.js.map +1 -1
  234. package/dist/components/cg-breadcrumbs/cg-breadcrumbs.js +21 -21
  235. package/dist/components/cg-breadcrumbs/cg-breadcrumbs.js.map +1 -1
  236. package/dist/components/cg-button/cg-button.d.ts +5 -71
  237. package/dist/components/cg-button/cg-button.d.ts.map +1 -1
  238. package/dist/components/cg-button/cg-button.js +63 -172
  239. package/dist/components/cg-button/cg-button.js.map +1 -1
  240. package/dist/components/cg-button-group/cg-button-group.d.ts +2 -0
  241. package/dist/components/cg-button-group/cg-button-group.d.ts.map +1 -1
  242. package/dist/components/cg-button-group/cg-button-group.js +43 -29
  243. package/dist/components/cg-button-group/cg-button-group.js.map +1 -1
  244. package/dist/components/cg-calendar/cg-calendar.d.ts +4 -0
  245. package/dist/components/cg-calendar/cg-calendar.d.ts.map +1 -1
  246. package/dist/components/cg-calendar/cg-calendar.js +28 -12
  247. package/dist/components/cg-calendar/cg-calendar.js.map +1 -1
  248. package/dist/components/cg-callout/cg-callout.d.ts.map +1 -1
  249. package/dist/components/cg-callout/cg-callout.js +49 -48
  250. package/dist/components/cg-callout/cg-callout.js.map +1 -1
  251. package/dist/components/cg-card/cg-card.d.ts +9 -22
  252. package/dist/components/cg-card/cg-card.d.ts.map +1 -1
  253. package/dist/components/cg-card/cg-card.js +28 -56
  254. package/dist/components/cg-card/cg-card.js.map +1 -1
  255. package/dist/components/cg-carousel/cg-carousel.d.ts.map +1 -1
  256. package/dist/components/cg-carousel/cg-carousel.js +19 -13
  257. package/dist/components/cg-carousel/cg-carousel.js.map +1 -1
  258. package/dist/components/cg-chart/cg-chart.d.ts.map +1 -1
  259. package/dist/components/cg-chart/cg-chart.js +63 -58
  260. package/dist/components/cg-chart/cg-chart.js.map +1 -1
  261. package/dist/components/cg-checkbox/cg-checkbox.d.ts +0 -6
  262. package/dist/components/cg-checkbox/cg-checkbox.d.ts.map +1 -1
  263. package/dist/components/cg-checkbox/cg-checkbox.js +51 -51
  264. package/dist/components/cg-checkbox/cg-checkbox.js.map +1 -1
  265. package/dist/components/cg-chip/cg-chip.js +31 -31
  266. package/dist/components/cg-chip/cg-chip.js.map +1 -1
  267. package/dist/components/cg-code-block/cg-code-block.d.ts.map +1 -1
  268. package/dist/components/cg-code-block/cg-code-block.js +36 -34
  269. package/dist/components/cg-code-block/cg-code-block.js.map +1 -1
  270. package/dist/components/cg-collapsible/cg-collapsible.d.ts.map +1 -1
  271. package/dist/components/cg-collapsible/cg-collapsible.js +23 -18
  272. package/dist/components/cg-collapsible/cg-collapsible.js.map +1 -1
  273. package/dist/components/cg-color-picker/cg-color-picker.d.ts +3 -0
  274. package/dist/components/cg-color-picker/cg-color-picker.d.ts.map +1 -1
  275. package/dist/components/cg-color-picker/cg-color-picker.js +189 -91
  276. package/dist/components/cg-color-picker/cg-color-picker.js.map +1 -1
  277. package/dist/components/cg-combobox/cg-combobox.d.ts.map +1 -1
  278. package/dist/components/cg-combobox/cg-combobox.js +13 -6
  279. package/dist/components/cg-combobox/cg-combobox.js.map +1 -1
  280. package/dist/components/cg-command/cg-command.d.ts.map +1 -1
  281. package/dist/components/cg-command/cg-command.js +52 -45
  282. package/dist/components/cg-command/cg-command.js.map +1 -1
  283. package/dist/components/cg-context-menu/cg-context-menu.js +1 -1
  284. package/dist/components/cg-date-picker/cg-date-picker.d.ts.map +1 -1
  285. package/dist/components/cg-date-picker/cg-date-picker.js +36 -34
  286. package/dist/components/cg-date-picker/cg-date-picker.js.map +1 -1
  287. package/dist/components/cg-date-range-picker/cg-date-range-picker.d.ts +2 -0
  288. package/dist/components/cg-date-range-picker/cg-date-range-picker.d.ts.map +1 -1
  289. package/dist/components/cg-date-range-picker/cg-date-range-picker.js +12 -8
  290. package/dist/components/cg-date-range-picker/cg-date-range-picker.js.map +1 -1
  291. package/dist/components/cg-date-time-picker/cg-date-time-picker.d.ts.map +1 -1
  292. package/dist/components/cg-date-time-picker/cg-date-time-picker.js +3 -1
  293. package/dist/components/cg-date-time-picker/cg-date-time-picker.js.map +1 -1
  294. package/dist/components/cg-drawer/cg-drawer.js +3 -3
  295. package/dist/components/cg-drawer/cg-drawer.js.map +1 -1
  296. package/dist/components/cg-dropdown/cg-dropdown.d.ts.map +1 -1
  297. package/dist/components/cg-dropdown/cg-dropdown.js +1 -2
  298. package/dist/components/cg-dropdown/cg-dropdown.js.map +1 -1
  299. package/dist/components/cg-empty-state/cg-empty-state.d.ts +3 -24
  300. package/dist/components/cg-empty-state/cg-empty-state.d.ts.map +1 -1
  301. package/dist/components/cg-empty-state/cg-empty-state.js +51 -74
  302. package/dist/components/cg-empty-state/cg-empty-state.js.map +1 -1
  303. package/dist/components/cg-file-input/cg-file-input.d.ts.map +1 -1
  304. package/dist/components/cg-file-input/cg-file-input.js +9 -10
  305. package/dist/components/cg-file-input/cg-file-input.js.map +1 -1
  306. package/dist/components/cg-focus-scope/cg-focus-scope.js +1 -1
  307. package/dist/components/cg-follow-up/cg-follow-up.d.ts.map +1 -1
  308. package/dist/components/cg-follow-up/cg-follow-up.js +6 -7
  309. package/dist/components/cg-follow-up/cg-follow-up.js.map +1 -1
  310. package/dist/components/cg-form/cg-form.js +17 -17
  311. package/dist/components/cg-form/cg-form.js.map +1 -1
  312. package/dist/components/cg-hover-card/cg-hover-card.d.ts +1 -0
  313. package/dist/components/cg-hover-card/cg-hover-card.d.ts.map +1 -1
  314. package/dist/components/cg-hover-card/cg-hover-card.js +37 -32
  315. package/dist/components/cg-hover-card/cg-hover-card.js.map +1 -1
  316. package/dist/components/cg-icon/cg-icon.d.ts.map +1 -1
  317. package/dist/components/cg-icon/cg-icon.js +44 -37
  318. package/dist/components/cg-icon/cg-icon.js.map +1 -1
  319. package/dist/components/cg-image/cg-image.js +2 -2
  320. package/dist/components/cg-image/cg-image.js.map +1 -1
  321. package/dist/components/cg-image-block/cg-image-block.js +3 -3
  322. package/dist/components/cg-image-block/cg-image-block.js.map +1 -1
  323. package/dist/components/cg-image-gallery/cg-image-gallery.js +20 -20
  324. package/dist/components/cg-image-gallery/cg-image-gallery.js.map +1 -1
  325. package/dist/components/cg-input/cg-input.js +3 -3
  326. package/dist/components/cg-input/cg-input.js.map +1 -1
  327. package/dist/components/cg-kbd/cg-kbd.d.ts.map +1 -1
  328. package/dist/components/cg-kbd/cg-kbd.js +26 -24
  329. package/dist/components/cg-kbd/cg-kbd.js.map +1 -1
  330. package/dist/components/cg-label/cg-label.d.ts +4 -1
  331. package/dist/components/cg-label/cg-label.d.ts.map +1 -1
  332. package/dist/components/cg-label/cg-label.js +44 -41
  333. package/dist/components/cg-label/cg-label.js.map +1 -1
  334. package/dist/components/cg-link/cg-link.js +23 -23
  335. package/dist/components/cg-link/cg-link.js.map +1 -1
  336. package/dist/components/cg-list/cg-list.js +5 -5
  337. package/dist/components/cg-list/cg-list.js.map +1 -1
  338. package/dist/components/cg-listbox/cg-listbox.d.ts.map +1 -1
  339. package/dist/components/cg-listbox/cg-listbox.js +46 -40
  340. package/dist/components/cg-listbox/cg-listbox.js.map +1 -1
  341. package/dist/components/cg-markdown/cg-markdown.d.ts +2 -0
  342. package/dist/components/cg-markdown/cg-markdown.d.ts.map +1 -1
  343. package/dist/components/cg-markdown/cg-markdown.js +171 -121
  344. package/dist/components/cg-markdown/cg-markdown.js.map +1 -1
  345. package/dist/components/cg-menubar/cg-menubar.d.ts +6 -0
  346. package/dist/components/cg-menubar/cg-menubar.d.ts.map +1 -1
  347. package/dist/components/cg-menubar/cg-menubar.js +59 -47
  348. package/dist/components/cg-menubar/cg-menubar.js.map +1 -1
  349. package/dist/components/cg-meter/cg-meter.d.ts.map +1 -1
  350. package/dist/components/cg-meter/cg-meter.js +76 -76
  351. package/dist/components/cg-meter/cg-meter.js.map +1 -1
  352. package/dist/components/cg-metric-card/cg-metric-card.d.ts.map +1 -1
  353. package/dist/components/cg-metric-card/cg-metric-card.js +65 -68
  354. package/dist/components/cg-metric-card/cg-metric-card.js.map +1 -1
  355. package/dist/components/cg-modal/cg-modal.d.ts +3 -0
  356. package/dist/components/cg-modal/cg-modal.d.ts.map +1 -1
  357. package/dist/components/cg-modal/cg-modal.js +82 -83
  358. package/dist/components/cg-modal/cg-modal.js.map +1 -1
  359. package/dist/components/cg-navbar/cg-navbar.d.ts +1 -1
  360. package/dist/components/cg-navbar/cg-navbar.d.ts.map +1 -1
  361. package/dist/components/cg-navbar/cg-navbar.js +64 -55
  362. package/dist/components/cg-navbar/cg-navbar.js.map +1 -1
  363. package/dist/components/cg-navigation-menu/cg-navigation-menu.d.ts +3 -0
  364. package/dist/components/cg-navigation-menu/cg-navigation-menu.d.ts.map +1 -1
  365. package/dist/components/cg-navigation-menu/cg-navigation-menu.js +38 -26
  366. package/dist/components/cg-navigation-menu/cg-navigation-menu.js.map +1 -1
  367. package/dist/components/cg-number-input/cg-number-input.d.ts +1 -0
  368. package/dist/components/cg-number-input/cg-number-input.d.ts.map +1 -1
  369. package/dist/components/cg-number-input/cg-number-input.js +90 -77
  370. package/dist/components/cg-number-input/cg-number-input.js.map +1 -1
  371. package/dist/components/cg-otp-input/cg-otp-input.d.ts.map +1 -1
  372. package/dist/components/cg-otp-input/cg-otp-input.js +70 -60
  373. package/dist/components/cg-otp-input/cg-otp-input.js.map +1 -1
  374. package/dist/components/cg-pagination/cg-pagination.d.ts +2 -0
  375. package/dist/components/cg-pagination/cg-pagination.d.ts.map +1 -1
  376. package/dist/components/cg-pagination/cg-pagination.js +50 -49
  377. package/dist/components/cg-pagination/cg-pagination.js.map +1 -1
  378. package/dist/components/cg-password-input/cg-password-input.d.ts.map +1 -1
  379. package/dist/components/cg-password-input/cg-password-input.js +42 -34
  380. package/dist/components/cg-password-input/cg-password-input.js.map +1 -1
  381. package/dist/components/cg-phone-input/cg-phone-input.d.ts.map +1 -1
  382. package/dist/components/cg-phone-input/cg-phone-input.js +18 -14
  383. package/dist/components/cg-phone-input/cg-phone-input.js.map +1 -1
  384. package/dist/components/cg-popover/cg-popover.d.ts +12 -2
  385. package/dist/components/cg-popover/cg-popover.d.ts.map +1 -1
  386. package/dist/components/cg-popover/cg-popover.js +90 -63
  387. package/dist/components/cg-popover/cg-popover.js.map +1 -1
  388. package/dist/components/cg-portal/cg-portal.d.ts.map +1 -1
  389. package/dist/components/cg-portal/cg-portal.js +42 -41
  390. package/dist/components/cg-portal/cg-portal.js.map +1 -1
  391. package/dist/components/cg-progress-bar/cg-progress-bar.d.ts.map +1 -1
  392. package/dist/components/cg-progress-bar/cg-progress-bar.js +25 -25
  393. package/dist/components/cg-progress-bar/cg-progress-bar.js.map +1 -1
  394. package/dist/components/cg-radio/cg-radio.d.ts +10 -0
  395. package/dist/components/cg-radio/cg-radio.d.ts.map +1 -1
  396. package/dist/components/cg-radio/cg-radio.js +59 -48
  397. package/dist/components/cg-radio/cg-radio.js.map +1 -1
  398. package/dist/components/cg-radio-group/cg-radio-group.d.ts +6 -0
  399. package/dist/components/cg-radio-group/cg-radio-group.d.ts.map +1 -1
  400. package/dist/components/cg-radio-group/cg-radio-group.js +50 -37
  401. package/dist/components/cg-radio-group/cg-radio-group.js.map +1 -1
  402. package/dist/components/cg-rating/cg-rating.d.ts.map +1 -1
  403. package/dist/components/cg-rating/cg-rating.js +56 -54
  404. package/dist/components/cg-rating/cg-rating.js.map +1 -1
  405. package/dist/components/cg-resizable/cg-resizable.d.ts +4 -1
  406. package/dist/components/cg-resizable/cg-resizable.d.ts.map +1 -1
  407. package/dist/components/cg-resizable/cg-resizable.js +45 -35
  408. package/dist/components/cg-resizable/cg-resizable.js.map +1 -1
  409. package/dist/components/cg-scroll-area/cg-scroll-area.d.ts +8 -0
  410. package/dist/components/cg-scroll-area/cg-scroll-area.d.ts.map +1 -1
  411. package/dist/components/cg-scroll-area/cg-scroll-area.js +64 -21
  412. package/dist/components/cg-scroll-area/cg-scroll-area.js.map +1 -1
  413. package/dist/components/cg-segmented-control/cg-segmented-control.d.ts +4 -0
  414. package/dist/components/cg-segmented-control/cg-segmented-control.d.ts.map +1 -1
  415. package/dist/components/cg-segmented-control/cg-segmented-control.js +75 -39
  416. package/dist/components/cg-segmented-control/cg-segmented-control.js.map +1 -1
  417. package/dist/components/cg-select/cg-select.d.ts +4 -2
  418. package/dist/components/cg-select/cg-select.d.ts.map +1 -1
  419. package/dist/components/cg-select/cg-select.js +96 -58
  420. package/dist/components/cg-select/cg-select.js.map +1 -1
  421. package/dist/components/cg-separator/cg-separator.d.ts +1 -2
  422. package/dist/components/cg-separator/cg-separator.d.ts.map +1 -1
  423. package/dist/components/cg-separator/cg-separator.js +5 -8
  424. package/dist/components/cg-separator/cg-separator.js.map +1 -1
  425. package/dist/components/cg-sheet/cg-sheet.d.ts +4 -0
  426. package/dist/components/cg-sheet/cg-sheet.d.ts.map +1 -1
  427. package/dist/components/cg-sheet/cg-sheet.js +80 -43
  428. package/dist/components/cg-sheet/cg-sheet.js.map +1 -1
  429. package/dist/components/cg-sidebar/cg-sidebar.d.ts.map +1 -1
  430. package/dist/components/cg-sidebar/cg-sidebar.js +82 -19
  431. package/dist/components/cg-sidebar/cg-sidebar.js.map +1 -1
  432. package/dist/components/cg-skeleton/cg-skeleton.d.ts +7 -1
  433. package/dist/components/cg-skeleton/cg-skeleton.d.ts.map +1 -1
  434. package/dist/components/cg-skeleton/cg-skeleton.js +61 -63
  435. package/dist/components/cg-skeleton/cg-skeleton.js.map +1 -1
  436. package/dist/components/cg-slider/cg-slider.d.ts.map +1 -1
  437. package/dist/components/cg-slider/cg-slider.js +80 -73
  438. package/dist/components/cg-slider/cg-slider.js.map +1 -1
  439. package/dist/components/cg-spinner/cg-spinner.d.ts.map +1 -1
  440. package/dist/components/cg-spinner/cg-spinner.js +10 -19
  441. package/dist/components/cg-spinner/cg-spinner.js.map +1 -1
  442. package/dist/components/cg-split-button/cg-split-button.d.ts.map +1 -1
  443. package/dist/components/cg-split-button/cg-split-button.js +64 -50
  444. package/dist/components/cg-split-button/cg-split-button.js.map +1 -1
  445. package/dist/components/cg-stack/cg-stack.js +1 -1
  446. package/dist/components/cg-steps/cg-steps.js +1 -1
  447. package/dist/components/cg-switch/cg-switch.d.ts +3 -0
  448. package/dist/components/cg-switch/cg-switch.d.ts.map +1 -1
  449. package/dist/components/cg-switch/cg-switch.js +39 -47
  450. package/dist/components/cg-switch/cg-switch.js.map +1 -1
  451. package/dist/components/cg-table/cg-table.d.ts +0 -7
  452. package/dist/components/cg-table/cg-table.d.ts.map +1 -1
  453. package/dist/components/cg-table/cg-table.js +50 -47
  454. package/dist/components/cg-table/cg-table.js.map +1 -1
  455. package/dist/components/cg-tabs/cg-tabs.js +1 -1
  456. package/dist/components/cg-tag-input/cg-tag-input.js +1 -1
  457. package/dist/components/cg-text/cg-text.js +1 -1
  458. package/dist/components/cg-textarea/cg-textarea.js +1 -1
  459. package/dist/components/cg-time-picker/cg-time-picker.js +1 -1
  460. package/dist/components/cg-toaster/cg-toaster.js +3 -3
  461. package/dist/components/cg-toaster/cg-toaster.js.map +1 -1
  462. package/dist/components/cg-toggle/cg-toggle.js +1 -1
  463. package/dist/components/cg-toggle-group/cg-toggle-group.js +1 -1
  464. package/dist/components/cg-tree-view/cg-tree-view.js +1 -1
  465. package/dist/foundation.d.ts +0 -16
  466. package/dist/foundation.d.ts.map +1 -1
  467. package/dist/foundation.js +174 -206
  468. package/dist/foundation.js.map +1 -1
  469. package/dist/index.d.ts +1 -17
  470. package/dist/index.d.ts.map +1 -1
  471. package/dist/index.js +100 -132
  472. package/dist/index.js.map +1 -1
  473. package/dist/utils/focus-trap.d.ts +19 -2
  474. package/dist/utils/focus-trap.d.ts.map +1 -1
  475. package/package.json +6 -810
  476. package/dist/chunks/focus-trap-BdRNhSPD.js +0 -53
  477. package/dist/chunks/focus-trap-BdRNhSPD.js.map +0 -1
  478. package/dist/components/cg-app-shell/cg-app-shell.d.ts +0 -54
  479. package/dist/components/cg-app-shell/cg-app-shell.d.ts.map +0 -1
  480. package/dist/components/cg-app-shell/cg-app-shell.js +0 -135
  481. package/dist/components/cg-app-shell/cg-app-shell.js.map +0 -1
  482. package/dist/components/cg-auth-shell/cg-auth-shell.d.ts +0 -61
  483. package/dist/components/cg-auth-shell/cg-auth-shell.d.ts.map +0 -1
  484. package/dist/components/cg-auth-shell/cg-auth-shell.js +0 -163
  485. package/dist/components/cg-auth-shell/cg-auth-shell.js.map +0 -1
  486. package/dist/components/cg-definition-list/cg-definition-list.d.ts +0 -99
  487. package/dist/components/cg-definition-list/cg-definition-list.d.ts.map +0 -1
  488. package/dist/components/cg-definition-list/cg-definition-list.js +0 -332
  489. package/dist/components/cg-definition-list/cg-definition-list.js.map +0 -1
  490. package/dist/components/cg-draggable/cg-draggable.d.ts +0 -53
  491. package/dist/components/cg-draggable/cg-draggable.d.ts.map +0 -1
  492. package/dist/components/cg-draggable/cg-draggable.js +0 -136
  493. package/dist/components/cg-draggable/cg-draggable.js.map +0 -1
  494. package/dist/components/cg-droppable/cg-droppable.d.ts +0 -57
  495. package/dist/components/cg-droppable/cg-droppable.d.ts.map +0 -1
  496. package/dist/components/cg-droppable/cg-droppable.js +0 -114
  497. package/dist/components/cg-droppable/cg-droppable.js.map +0 -1
  498. package/dist/components/cg-filter-bar/cg-filter-bar.d.ts +0 -50
  499. package/dist/components/cg-filter-bar/cg-filter-bar.d.ts.map +0 -1
  500. package/dist/components/cg-filter-bar/cg-filter-bar.js +0 -115
  501. package/dist/components/cg-filter-bar/cg-filter-bar.js.map +0 -1
  502. package/dist/components/cg-filter-chip/cg-filter-chip.d.ts +0 -55
  503. package/dist/components/cg-filter-chip/cg-filter-chip.d.ts.map +0 -1
  504. package/dist/components/cg-filter-chip/cg-filter-chip.js +0 -213
  505. package/dist/components/cg-filter-chip/cg-filter-chip.js.map +0 -1
  506. package/dist/components/cg-kanban/cg-kanban.d.ts +0 -44
  507. package/dist/components/cg-kanban/cg-kanban.d.ts.map +0 -1
  508. package/dist/components/cg-kanban/cg-kanban.js +0 -86
  509. package/dist/components/cg-kanban/cg-kanban.js.map +0 -1
  510. package/dist/components/cg-kanban-column/cg-kanban-column.d.ts +0 -58
  511. package/dist/components/cg-kanban-column/cg-kanban-column.d.ts.map +0 -1
  512. package/dist/components/cg-kanban-column/cg-kanban-column.js +0 -144
  513. package/dist/components/cg-kanban-column/cg-kanban-column.js.map +0 -1
  514. package/dist/components/cg-mfa-prompt/cg-mfa-prompt.d.ts +0 -77
  515. package/dist/components/cg-mfa-prompt/cg-mfa-prompt.d.ts.map +0 -1
  516. package/dist/components/cg-mfa-prompt/cg-mfa-prompt.js +0 -245
  517. package/dist/components/cg-mfa-prompt/cg-mfa-prompt.js.map +0 -1
  518. package/dist/components/cg-search-input/cg-search-input.d.ts +0 -62
  519. package/dist/components/cg-search-input/cg-search-input.d.ts.map +0 -1
  520. package/dist/components/cg-search-input/cg-search-input.js +0 -106
  521. package/dist/components/cg-search-input/cg-search-input.js.map +0 -1
  522. package/dist/components/cg-sortable/cg-sortable.d.ts +0 -72
  523. package/dist/components/cg-sortable/cg-sortable.d.ts.map +0 -1
  524. package/dist/components/cg-sortable/cg-sortable.js +0 -177
  525. package/dist/components/cg-sortable/cg-sortable.js.map +0 -1
  526. package/dist/components/cg-theme/cg-theme.d.ts +0 -82
  527. package/dist/components/cg-theme/cg-theme.d.ts.map +0 -1
  528. package/dist/components/cg-theme/cg-theme.js +0 -91
  529. package/dist/components/cg-theme/cg-theme.js.map +0 -1
  530. package/dist/components/cg-theme-editor/cg-theme-editor.d.ts +0 -98
  531. package/dist/components/cg-theme-editor/cg-theme-editor.d.ts.map +0 -1
  532. package/dist/components/cg-theme-editor/cg-theme-editor.js +0 -341
  533. package/dist/components/cg-theme-editor/cg-theme-editor.js.map +0 -1
  534. package/dist/components/cg-timeline/cg-timeline.d.ts +0 -70
  535. package/dist/components/cg-timeline/cg-timeline.d.ts.map +0 -1
  536. package/dist/components/cg-timeline/cg-timeline.js +0 -131
  537. package/dist/components/cg-timeline/cg-timeline.js.map +0 -1
  538. package/dist/components/cg-timeline-event/cg-timeline-event.d.ts +0 -59
  539. package/dist/components/cg-timeline-event/cg-timeline-event.d.ts.map +0 -1
  540. package/dist/components/cg-timeline-event/cg-timeline-event.js +0 -190
  541. package/dist/components/cg-timeline-event/cg-timeline-event.js.map +0 -1
  542. package/dist/utils/drag-manager.d.ts +0 -40
  543. package/dist/utils/drag-manager.d.ts.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { css as p, LitElement as u, html as r, nothing as o } from "lit";
2
2
  import { property as g, customElement as v } from "lit/decorators.js";
3
- import { h as f, r as h } from "../../chunks/premium.css-9I4kHrsl.js";
3
+ import { h as f, r as h } from "../../chunks/premium.css-DHekUEUt.js";
4
4
  var m = Object.defineProperty, b = Object.getOwnPropertyDescriptor, d = (t, a, i, e) => {
5
5
  for (var n = e > 1 ? void 0 : e ? b(a, i) : a, s = t.length - 1, l; s >= 0; s--)
6
6
  (l = t[s]) && (n = (e ? l(a, i, n) : l(n)) || n);
@@ -175,7 +175,7 @@ c.styles = [f, h, p`
175
175
  border: var(--cg-border-width-100) solid var(--cg-color-action-primary-background-default);
176
176
  color: var(--cg-color-action-primary-background-default);
177
177
  box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);
178
- animation: ringPulse 2s ease-in-out infinite;
178
+ animation: ringPulse 2s var(--cg-transition-easing-ease-in-out) infinite;
179
179
  }
180
180
  .dot.complete {
181
181
  background: var(--cg-color-status-success-background-default);
@@ -1 +1 @@
1
- {"version":3,"file":"ai-timeline.js","sources":["../../../src/components/ai-timeline/ai-timeline.ts"],"sourcesContent":["/**\n * @element ai-timeline\n * Vertical execution timeline for AI agents. Shows steps with status indicators,\n * duration bars, tool tags, token metadata, nested sub-steps, and expandable details.\n *\n * @fires {CustomEvent<{index: number, step: TimelineStep}>} ai-timeline-step-click - When a step is clicked\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion } from '../../styles/index.js';\n\nexport interface TimelineStep {\n label: string;\n status: 'pending' | 'active' | 'complete' | 'error';\n type?: 'llm' | 'tool' | 'retrieval' | 'human' | 'default';\n detail?: string;\n duration?: number;\n tools?: string[];\n tokens?: { input?: number; output?: number };\n children?: TimelineStep[];\n}\n\n@customElement('ai-timeline')\nexport class AiTimeline extends LitElement {\n static override styles = [hostBlock, reducedMotion, css`\n .timeline {\n display: flex;\n flex-direction: column;\n }\n\n /* ── Step row ── */\n .step {\n display: flex;\n gap: var(--cg-spacing-16);\n padding: var(--cg-spacing-16);\n position: relative;\n cursor: pointer;\n border-radius: var(--cg-border-radius-100);\n transition: background var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n animation: stepIn var(--cg-transition-duration-slow) var(--cg-transition-easing-ease-out) both;\n animation-delay: calc(var(--step-index, 0) * 50ms);\n }\n .step:hover { background: var(--cg-overlay-dark-subtle); }\n\n @keyframes stepIn {\n from { opacity: 0; transform: translateX(calc(-1 * var(--cg-spacing-6))); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n /* ── Connecting line ── */\n .line-col {\n display: flex;\n flex-direction: column;\n align-items: center;\n flex-shrink: 0;\n width: var(--cg-spacing-24);\n }\n\n .dot {\n width: var(--cg-spacing-24);\n height: var(--cg-spacing-24);\n border-radius: var(--cg-border-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .dot svg {\n width: var(--cg-spacing-12);\n height: var(--cg-spacing-12);\n }\n\n .line {\n flex: 1;\n width: var(--cg-border-width-50);\n background: var(--cg-color-surface-base-divider);\n min-height: var(--cg-spacing-8);\n }\n .step:last-child .line { display: none; }\n .step.complete .line {\n background: var(--cg-color-status-success-text-default);\n opacity: 0.25;\n }\n\n /* ── Dot states ── */\n .dot.pending {\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-100) solid var(--cg-color-surface-cards-border);\n color: var(--cg-color-surface-container-outlined);\n }\n .dot.active {\n background: var(--cg-overlay-accent-strong);\n border: var(--cg-border-width-100) solid var(--cg-color-action-primary-background-default);\n color: var(--cg-color-action-primary-background-default);\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n animation: ringPulse 2s ease-in-out infinite;\n }\n .dot.complete {\n background: var(--cg-color-status-success-background-default);\n border: var(--cg-border-width-100) solid var(--cg-color-status-success-text-default);\n color: var(--cg-color-status-success-text-default);\n }\n .dot.complete svg {\n animation: checkPop var(--cg-transition-duration-slow) var(--cg-transition-easing-ease-out) both;\n }\n .dot.error {\n background: var(--cg-color-status-error-background-default);\n border: var(--cg-border-width-100) solid var(--cg-color-status-error-text-default);\n color: var(--cg-color-status-error-text-default);\n }\n\n @keyframes ringPulse {\n 0%, 100% { box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong); }\n 50% { box-shadow: 0 0 0 6px transparent; }\n }\n @keyframes checkPop {\n from { transform: scale(0); }\n 50% { transform: scale(1.2); }\n to { transform: scale(1); }\n }\n\n /* ── Content ── */\n .content {\n flex: 1;\n min-width: 0;\n padding-top: var(--cg-spacing-2);\n padding-bottom: var(--cg-spacing-12);\n }\n\n .step-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cg-spacing-12);\n }\n .step-label {\n font-size: var(--cg-font-size-sm);\n font-weight: var(--cg-font-weight-medium);\n color: var(--cg-color-surface-base-text);\n line-height: var(--cg-line-height-snug);\n }\n .step.pending .step-label {\n color: var(--cg-color-surface-container-outlined);\n opacity: 0.5;\n }\n .step.complete .step-label {\n color: var(--cg-color-surface-container-outlined);\n }\n .step.error .step-label {\n color: var(--cg-color-status-error-text-default);\n }\n .step.active .step-label {\n background: linear-gradient(110deg, var(--cg-color-surface-base-text) 35%, var(--cg-color-action-primary-background-default) 50%, var(--cg-color-surface-base-text) 65%);\n background-size: 300% 100%;\n background-clip: text;\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n animation: textSweep 1.8s var(--cg-transition-easing-default) infinite;\n }\n @keyframes textSweep {\n 0% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n\n .step-duration {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-surface-container-outlined);\n font-family: var(--cg-font-family-mono);\n white-space: nowrap;\n }\n\n /* ── Duration bar ── */\n .duration-bar {\n height: var(--cg-spacing-4);\n border-radius: var(--cg-border-radius-full);\n background: var(--cg-color-surface-cards-border);\n margin-top: var(--cg-spacing-8);\n overflow: hidden;\n }\n .duration-fill {\n height: 100%;\n border-radius: var(--cg-border-radius-full);\n transition: width var(--cg-transition-duration-slow) var(--cg-transition-easing-default);\n }\n .step.complete .duration-fill { background: var(--cg-color-status-success-text-default); opacity: 0.6; }\n .step.active .duration-fill { background: var(--cg-color-action-primary-background-default); animation: indeterminate 1.5s linear infinite; }\n .step.error .duration-fill { background: var(--cg-color-status-error-text-default); opacity: 0.6; }\n\n @keyframes indeterminate {\n 0% { transform: translateX(-100%); width: 40%; }\n 50% { transform: translateX(100%); width: 40%; }\n 100% { transform: translateX(300%); width: 40%; }\n }\n\n /* ── Token metadata ── */\n .meta {\n display: flex;\n gap: var(--cg-spacing-16);\n margin-top: var(--cg-spacing-8);\n font-size: var(--cg-font-size-xs);\n font-family: var(--cg-font-family-mono);\n color: var(--cg-color-surface-container-outlined);\n }\n .meta-item {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-4);\n }\n .meta-label { opacity: 0.6; }\n\n /* ── Tool tags ── */\n .tools {\n display: flex;\n gap: var(--cg-spacing-8);\n margin-top: var(--cg-spacing-8);\n flex-wrap: wrap;\n }\n .tool-tag {\n font-size: var(--cg-font-size-xs);\n padding: var(--cg-spacing-2) var(--cg-spacing-8);\n border-radius: var(--cg-border-radius-full);\n background: var(--cg-color-surface-cards-background);\n color: var(--cg-color-surface-container-outlined);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n font-family: var(--cg-font-family-mono);\n }\n\n /* ── Detail panel ── */\n .detail {\n margin-top: var(--cg-spacing-12);\n padding: var(--cg-spacing-12) var(--cg-spacing-16);\n background: var(--cg-color-surface-base-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-100);\n font-size: var(--cg-font-size-xs);\n font-family: var(--cg-font-family-mono);\n color: var(--cg-color-surface-container-outlined);\n line-height: var(--cg-line-height-relaxed);\n white-space: pre-wrap;\n max-height: var(--cg-spacing-96);\n overflow-y: auto;\n }\n\n /* ── Nested children ── */\n .children {\n margin-top: var(--cg-spacing-8);\n }\n .children .step {\n padding: var(--cg-spacing-4) var(--cg-spacing-4);\n animation: none;\n }\n .children .dot { width: var(--cg-spacing-16); height: var(--cg-spacing-16); }\n .children .dot svg { width: var(--cg-spacing-8); height: var(--cg-spacing-8); }\n .children .line { min-height: var(--cg-spacing-4); }\n .children .step-label { font-size: var(--cg-font-size-xs); }\n .children .line-col { width: var(--cg-spacing-16); }\n .children .content { padding-bottom: var(--cg-spacing-2); }\n\n /* ── Compact ── */\n :host([compact]) .step { padding: var(--cg-spacing-4) var(--cg-spacing-6); }\n :host([compact]) .dot { width: var(--cg-spacing-16); height: var(--cg-spacing-16); }\n :host([compact]) .dot svg { width: var(--cg-spacing-8); height: var(--cg-spacing-8); }\n :host([compact]) .line-col { width: var(--cg-spacing-16); }\n :host([compact]) .step-label { font-size: var(--cg-font-size-xs); }\n :host([compact]) .detail,\n :host([compact]) .tools,\n :host([compact]) .meta,\n :host([compact]) .children,\n :host([compact]) .duration-bar { display: none; }\n\n .step:focus-visible {\n outline: none;\n box-shadow: inset 0 0 0 2px var(--cg-overlay-accent-strong);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .step { animation: none; }\n .dot.active { animation: none; box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong); }\n .dot.complete svg { animation: none; }\n .step.active .duration-fill { animation: none; width: 50%; }\n .step.active .step-label { animation: none; -webkit-text-fill-color: currentColor; }\n }\n `];\n\n @property({ type: Array }) steps: TimelineStep[] = [];\n @property({ type: Boolean, reflect: true }) compact = false;\n\n private _expandedIndex = -1;\n\n private _getIcon(status: string) {\n if (status === 'complete') return html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>`;\n if (status === 'error') return html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>`;\n if (status === 'active') return html`<svg viewBox=\"0 0 8 8\"><circle cx=\"4\" cy=\"4\" r=\"3\" fill=\"currentColor\"/></svg>`;\n return html`<svg viewBox=\"0 0 8 8\"><circle cx=\"4\" cy=\"4\" r=\"2.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\"/></svg>`;\n }\n\n private _formatDuration(ms?: number): string {\n if (!ms) return '';\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n }\n\n private _formatTokens(n: number): string {\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(n);\n }\n\n private _handleStepClick(index: number) {\n this._expandedIndex = this._expandedIndex === index ? -1 : index;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('ai-timeline-step-click', {\n bubbles: true, composed: true,\n detail: { index, step: this.steps[index] },\n }));\n }\n\n private _getMaxDuration(): number {\n return Math.max(...this.steps.map(s => s.duration || 0), 1);\n }\n\n private _renderStep(step: TimelineStep, isLast: boolean) {\n return html`\n <div class=\"line-col\">\n <div class=\"dot ${step.status}\" aria-hidden=\"true\">${this._getIcon(step.status)}</div>\n ${!isLast ? html`<div class=\"line\"></div>` : nothing}\n </div>\n `;\n }\n\n override render() {\n if (this.steps.length === 0) return nothing;\n const maxDuration = this._getMaxDuration();\n\n return html`\n <div class=\"timeline\" role=\"list\" aria-label=\"Execution timeline\">\n ${this.steps.map((step, i) => html`\n <div class=\"step ${step.status}\" role=\"listitem\" style=\"--step-index: ${i}\"\n aria-current=\"${step.status === 'active' ? 'step' : nothing}\"\n tabindex=\"0\"\n @click=${() => this._handleStepClick(i)}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this._handleStepClick(i); } }}>\n\n ${this._renderStep(step, i === this.steps.length - 1)}\n\n <div class=\"content\">\n <div class=\"step-header\">\n <span class=\"step-label\">${step.label}</span>\n ${step.duration ? html`<span class=\"step-duration\">${this._formatDuration(step.duration)}</span>` : nothing}\n </div>\n\n ${step.duration || step.status === 'active' ? html`\n <div class=\"duration-bar\">\n <div class=\"duration-fill\" style=\"width: ${step.status === 'active' ? '100' : Math.round((step.duration || 0) / maxDuration * 100)}%\"></div>\n </div>\n ` : nothing}\n\n ${step.tokens ? html`\n <div class=\"meta\">\n ${step.tokens.input ? html`<span class=\"meta-item\"><span class=\"meta-label\">in</span> ${this._formatTokens(step.tokens.input)}</span>` : nothing}\n ${step.tokens.output ? html`<span class=\"meta-item\"><span class=\"meta-label\">out</span> ${this._formatTokens(step.tokens.output)}</span>` : nothing}\n </div>\n ` : nothing}\n\n ${step.tools && step.tools.length > 0 ? html`\n <div class=\"tools\">\n ${step.tools.map(t => html`<span class=\"tool-tag\">${t}</span>`)}\n </div>\n ` : nothing}\n\n ${this._expandedIndex === i && step.detail ? html`\n <div class=\"detail\">${step.detail}</div>\n ` : nothing}\n\n ${step.children && step.children.length > 0 ? html`\n <div class=\"children\">\n ${step.children.map((child, ci) => html`\n <div class=\"step ${child.status}\">\n ${this._renderStep(child, ci === step.children!.length - 1)}\n <div class=\"content\">\n <div class=\"step-header\">\n <span class=\"step-label\">${child.label}</span>\n ${child.duration ? html`<span class=\"step-duration\">${this._formatDuration(child.duration)}</span>` : nothing}\n </div>\n </div>\n </div>\n `)}\n </div>\n ` : nothing}\n </div>\n </div>\n `)}\n </div>\n `;\n }\n}\n"],"names":["AiTimeline","LitElement","status","html","ms","n","index","s","step","isLast","nothing","maxDuration","t","child","ci","hostBlock","reducedMotion","css","__decorateClass","property","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"ai-timeline.js","sources":["../../../src/components/ai-timeline/ai-timeline.ts"],"sourcesContent":["/**\n * @element ai-timeline\n * Vertical execution timeline for AI agents. Shows steps with status indicators,\n * duration bars, tool tags, token metadata, nested sub-steps, and expandable details.\n *\n * @fires {CustomEvent<{index: number, step: TimelineStep}>} ai-timeline-step-click - When a step is clicked\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion } from '../../styles/index.js';\n\nexport interface TimelineStep {\n label: string;\n status: 'pending' | 'active' | 'complete' | 'error';\n type?: 'llm' | 'tool' | 'retrieval' | 'human' | 'default';\n detail?: string;\n duration?: number;\n tools?: string[];\n tokens?: { input?: number; output?: number };\n children?: TimelineStep[];\n}\n\n@customElement('ai-timeline')\nexport class AiTimeline extends LitElement {\n static override styles = [hostBlock, reducedMotion, css`\n .timeline {\n display: flex;\n flex-direction: column;\n }\n\n /* ── Step row ── */\n .step {\n display: flex;\n gap: var(--cg-spacing-16);\n padding: var(--cg-spacing-16);\n position: relative;\n cursor: pointer;\n border-radius: var(--cg-border-radius-100);\n transition: background var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n animation: stepIn var(--cg-transition-duration-slow) var(--cg-transition-easing-ease-out) both;\n animation-delay: calc(var(--step-index, 0) * 50ms);\n }\n .step:hover { background: var(--cg-overlay-dark-subtle); }\n\n @keyframes stepIn {\n from { opacity: 0; transform: translateX(calc(-1 * var(--cg-spacing-6))); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n /* ── Connecting line ── */\n .line-col {\n display: flex;\n flex-direction: column;\n align-items: center;\n flex-shrink: 0;\n width: var(--cg-spacing-24);\n }\n\n .dot {\n width: var(--cg-spacing-24);\n height: var(--cg-spacing-24);\n border-radius: var(--cg-border-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .dot svg {\n width: var(--cg-spacing-12);\n height: var(--cg-spacing-12);\n }\n\n .line {\n flex: 1;\n width: var(--cg-border-width-50);\n background: var(--cg-color-surface-base-divider);\n min-height: var(--cg-spacing-8);\n }\n .step:last-child .line { display: none; }\n .step.complete .line {\n background: var(--cg-color-status-success-text-default);\n opacity: 0.25;\n }\n\n /* ── Dot states ── */\n .dot.pending {\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-100) solid var(--cg-color-surface-cards-border);\n color: var(--cg-color-surface-container-outlined);\n }\n .dot.active {\n background: var(--cg-overlay-accent-strong);\n border: var(--cg-border-width-100) solid var(--cg-color-action-primary-background-default);\n color: var(--cg-color-action-primary-background-default);\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n animation: ringPulse 2s var(--cg-transition-easing-ease-in-out) infinite;\n }\n .dot.complete {\n background: var(--cg-color-status-success-background-default);\n border: var(--cg-border-width-100) solid var(--cg-color-status-success-text-default);\n color: var(--cg-color-status-success-text-default);\n }\n .dot.complete svg {\n animation: checkPop var(--cg-transition-duration-slow) var(--cg-transition-easing-ease-out) both;\n }\n .dot.error {\n background: var(--cg-color-status-error-background-default);\n border: var(--cg-border-width-100) solid var(--cg-color-status-error-text-default);\n color: var(--cg-color-status-error-text-default);\n }\n\n @keyframes ringPulse {\n 0%, 100% { box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong); }\n 50% { box-shadow: 0 0 0 6px transparent; }\n }\n @keyframes checkPop {\n from { transform: scale(0); }\n 50% { transform: scale(1.2); }\n to { transform: scale(1); }\n }\n\n /* ── Content ── */\n .content {\n flex: 1;\n min-width: 0;\n padding-top: var(--cg-spacing-2);\n padding-bottom: var(--cg-spacing-12);\n }\n\n .step-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cg-spacing-12);\n }\n .step-label {\n font-size: var(--cg-font-size-sm);\n font-weight: var(--cg-font-weight-medium);\n color: var(--cg-color-surface-base-text);\n line-height: var(--cg-line-height-snug);\n }\n .step.pending .step-label {\n color: var(--cg-color-surface-container-outlined);\n opacity: 0.5;\n }\n .step.complete .step-label {\n color: var(--cg-color-surface-container-outlined);\n }\n .step.error .step-label {\n color: var(--cg-color-status-error-text-default);\n }\n .step.active .step-label {\n background: linear-gradient(110deg, var(--cg-color-surface-base-text) 35%, var(--cg-color-action-primary-background-default) 50%, var(--cg-color-surface-base-text) 65%);\n background-size: 300% 100%;\n background-clip: text;\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n animation: textSweep 1.8s var(--cg-transition-easing-default) infinite;\n }\n @keyframes textSweep {\n 0% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n\n .step-duration {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-surface-container-outlined);\n font-family: var(--cg-font-family-mono);\n white-space: nowrap;\n }\n\n /* ── Duration bar ── */\n .duration-bar {\n height: var(--cg-spacing-4);\n border-radius: var(--cg-border-radius-full);\n background: var(--cg-color-surface-cards-border);\n margin-top: var(--cg-spacing-8);\n overflow: hidden;\n }\n .duration-fill {\n height: 100%;\n border-radius: var(--cg-border-radius-full);\n transition: width var(--cg-transition-duration-slow) var(--cg-transition-easing-default);\n }\n .step.complete .duration-fill { background: var(--cg-color-status-success-text-default); opacity: 0.6; }\n .step.active .duration-fill { background: var(--cg-color-action-primary-background-default); animation: indeterminate 1.5s linear infinite; }\n .step.error .duration-fill { background: var(--cg-color-status-error-text-default); opacity: 0.6; }\n\n @keyframes indeterminate {\n 0% { transform: translateX(-100%); width: 40%; }\n 50% { transform: translateX(100%); width: 40%; }\n 100% { transform: translateX(300%); width: 40%; }\n }\n\n /* ── Token metadata ── */\n .meta {\n display: flex;\n gap: var(--cg-spacing-16);\n margin-top: var(--cg-spacing-8);\n font-size: var(--cg-font-size-xs);\n font-family: var(--cg-font-family-mono);\n color: var(--cg-color-surface-container-outlined);\n }\n .meta-item {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-4);\n }\n .meta-label { opacity: 0.6; }\n\n /* ── Tool tags ── */\n .tools {\n display: flex;\n gap: var(--cg-spacing-8);\n margin-top: var(--cg-spacing-8);\n flex-wrap: wrap;\n }\n .tool-tag {\n font-size: var(--cg-font-size-xs);\n padding: var(--cg-spacing-2) var(--cg-spacing-8);\n border-radius: var(--cg-border-radius-full);\n background: var(--cg-color-surface-cards-background);\n color: var(--cg-color-surface-container-outlined);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n font-family: var(--cg-font-family-mono);\n }\n\n /* ── Detail panel ── */\n .detail {\n margin-top: var(--cg-spacing-12);\n padding: var(--cg-spacing-12) var(--cg-spacing-16);\n background: var(--cg-color-surface-base-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-100);\n font-size: var(--cg-font-size-xs);\n font-family: var(--cg-font-family-mono);\n color: var(--cg-color-surface-container-outlined);\n line-height: var(--cg-line-height-relaxed);\n white-space: pre-wrap;\n max-height: var(--cg-spacing-96);\n overflow-y: auto;\n }\n\n /* ── Nested children ── */\n .children {\n margin-top: var(--cg-spacing-8);\n }\n .children .step {\n padding: var(--cg-spacing-4) var(--cg-spacing-4);\n animation: none;\n }\n .children .dot { width: var(--cg-spacing-16); height: var(--cg-spacing-16); }\n .children .dot svg { width: var(--cg-spacing-8); height: var(--cg-spacing-8); }\n .children .line { min-height: var(--cg-spacing-4); }\n .children .step-label { font-size: var(--cg-font-size-xs); }\n .children .line-col { width: var(--cg-spacing-16); }\n .children .content { padding-bottom: var(--cg-spacing-2); }\n\n /* ── Compact ── */\n :host([compact]) .step { padding: var(--cg-spacing-4) var(--cg-spacing-6); }\n :host([compact]) .dot { width: var(--cg-spacing-16); height: var(--cg-spacing-16); }\n :host([compact]) .dot svg { width: var(--cg-spacing-8); height: var(--cg-spacing-8); }\n :host([compact]) .line-col { width: var(--cg-spacing-16); }\n :host([compact]) .step-label { font-size: var(--cg-font-size-xs); }\n :host([compact]) .detail,\n :host([compact]) .tools,\n :host([compact]) .meta,\n :host([compact]) .children,\n :host([compact]) .duration-bar { display: none; }\n\n .step:focus-visible {\n outline: none;\n box-shadow: inset 0 0 0 2px var(--cg-overlay-accent-strong);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .step { animation: none; }\n .dot.active { animation: none; box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong); }\n .dot.complete svg { animation: none; }\n .step.active .duration-fill { animation: none; width: 50%; }\n .step.active .step-label { animation: none; -webkit-text-fill-color: currentColor; }\n }\n `];\n\n @property({ type: Array }) steps: TimelineStep[] = [];\n @property({ type: Boolean, reflect: true }) compact = false;\n\n private _expandedIndex = -1;\n\n private _getIcon(status: string) {\n if (status === 'complete') return html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>`;\n if (status === 'error') return html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>`;\n if (status === 'active') return html`<svg viewBox=\"0 0 8 8\"><circle cx=\"4\" cy=\"4\" r=\"3\" fill=\"currentColor\"/></svg>`;\n return html`<svg viewBox=\"0 0 8 8\"><circle cx=\"4\" cy=\"4\" r=\"2.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\"/></svg>`;\n }\n\n private _formatDuration(ms?: number): string {\n if (!ms) return '';\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n }\n\n private _formatTokens(n: number): string {\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(n);\n }\n\n private _handleStepClick(index: number) {\n this._expandedIndex = this._expandedIndex === index ? -1 : index;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('ai-timeline-step-click', {\n bubbles: true, composed: true,\n detail: { index, step: this.steps[index] },\n }));\n }\n\n private _getMaxDuration(): number {\n return Math.max(...this.steps.map(s => s.duration || 0), 1);\n }\n\n private _renderStep(step: TimelineStep, isLast: boolean) {\n return html`\n <div class=\"line-col\">\n <div class=\"dot ${step.status}\" aria-hidden=\"true\">${this._getIcon(step.status)}</div>\n ${!isLast ? html`<div class=\"line\"></div>` : nothing}\n </div>\n `;\n }\n\n override render() {\n if (this.steps.length === 0) return nothing;\n const maxDuration = this._getMaxDuration();\n\n return html`\n <div class=\"timeline\" role=\"list\" aria-label=\"Execution timeline\">\n ${this.steps.map((step, i) => html`\n <div class=\"step ${step.status}\" role=\"listitem\" style=\"--step-index: ${i}\"\n aria-current=\"${step.status === 'active' ? 'step' : nothing}\"\n tabindex=\"0\"\n @click=${() => this._handleStepClick(i)}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this._handleStepClick(i); } }}>\n\n ${this._renderStep(step, i === this.steps.length - 1)}\n\n <div class=\"content\">\n <div class=\"step-header\">\n <span class=\"step-label\">${step.label}</span>\n ${step.duration ? html`<span class=\"step-duration\">${this._formatDuration(step.duration)}</span>` : nothing}\n </div>\n\n ${step.duration || step.status === 'active' ? html`\n <div class=\"duration-bar\">\n <div class=\"duration-fill\" style=\"width: ${step.status === 'active' ? '100' : Math.round((step.duration || 0) / maxDuration * 100)}%\"></div>\n </div>\n ` : nothing}\n\n ${step.tokens ? html`\n <div class=\"meta\">\n ${step.tokens.input ? html`<span class=\"meta-item\"><span class=\"meta-label\">in</span> ${this._formatTokens(step.tokens.input)}</span>` : nothing}\n ${step.tokens.output ? html`<span class=\"meta-item\"><span class=\"meta-label\">out</span> ${this._formatTokens(step.tokens.output)}</span>` : nothing}\n </div>\n ` : nothing}\n\n ${step.tools && step.tools.length > 0 ? html`\n <div class=\"tools\">\n ${step.tools.map(t => html`<span class=\"tool-tag\">${t}</span>`)}\n </div>\n ` : nothing}\n\n ${this._expandedIndex === i && step.detail ? html`\n <div class=\"detail\">${step.detail}</div>\n ` : nothing}\n\n ${step.children && step.children.length > 0 ? html`\n <div class=\"children\">\n ${step.children.map((child, ci) => html`\n <div class=\"step ${child.status}\">\n ${this._renderStep(child, ci === step.children!.length - 1)}\n <div class=\"content\">\n <div class=\"step-header\">\n <span class=\"step-label\">${child.label}</span>\n ${child.duration ? html`<span class=\"step-duration\">${this._formatDuration(child.duration)}</span>` : nothing}\n </div>\n </div>\n </div>\n `)}\n </div>\n ` : nothing}\n </div>\n </div>\n `)}\n </div>\n `;\n }\n}\n"],"names":["AiTimeline","LitElement","status","html","ms","n","index","s","step","isLast","nothing","maxDuration","t","child","ci","hostBlock","reducedMotion","css","__decorateClass","property","customElement"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { css as u, LitElement as p, html as i, nothing as g } from "lit";
2
2
  import { property as r, customElement as v } from "lit/decorators.js";
3
- import { h as b, r as f, f as h } from "../../chunks/premium.css-9I4kHrsl.js";
3
+ import { h as b, r as f, f as h } from "../../chunks/premium.css-DHekUEUt.js";
4
4
  var m = Object.defineProperty, y = Object.getOwnPropertyDescriptor, e = (s, o, n, c) => {
5
5
  for (var a = c > 1 ? void 0 : c ? y(o, n) : o, l = s.length - 1, d; l >= 0; l--)
6
6
  (d = s[l]) && (a = (c ? d(o, n, a) : d(a)) || a);
@@ -101,7 +101,7 @@ t.styles = [b, f, h, u`
101
101
  border-radius: var(--cg-border-radius-100);
102
102
  background: var(--cg-color-surface-container-background);
103
103
  border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);
104
- font-size: var(--cg-font-size-xs);
104
+ font-size: var(--cg-font-size-sm);
105
105
  font-family: var(--cg-font-family-mono);
106
106
  color: var(--cg-color-input-text-placeholder);
107
107
  cursor: pointer;
@@ -202,7 +202,7 @@ t.styles = [b, f, h, u`
202
202
 
203
203
  :focus-visible {
204
204
  outline: none;
205
- box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);
205
+ box-shadow: 0 0 0 var(--cg-focus-ring-width) var(--cg-overlay-accent-strong);
206
206
  }
207
207
  `];
208
208
  e([
@@ -1 +1 @@
1
- {"version":3,"file":"ai-token-tracker.js","sources":["../../../src/components/ai-token-tracker/ai-token-tracker.ts"],"sourcesContent":["/**\n * @element ai-token-tracker\n * LLM token usage and cost display with compact (inline badge) and\n * detailed (card with metrics grid) modes. Shows input/output tokens,\n * cost, latency bar, model badge, and optional budget progress bar.\n *\n * @example\n * ```html\n * <ai-token-tracker mode=\"compact\" inputTokens=\"1200\" outputTokens=\"340\" cost=\"0.0042\" latency=\"890\"></ai-token-tracker>\n * <ai-token-tracker mode=\"detailed\" inputTokens=\"1200\" outputTokens=\"340\" cost=\"0.0042\"\n * latency=\"890\" model=\"gpt-4\" budget=\"1.00\"></ai-token-tracker>\n * ```\n *\n * @prop {number} inputTokens - Input token count\n * @prop {number} outputTokens - Output token count\n * @prop {number} cost - Cost in dollars\n * @prop {number} latency - Response latency in ms\n * @prop {string} model - Model name for the badge\n * @prop {number} budget - Max cost budget (shows progress bar when > 0)\n * @prop {'compact'|'detailed'} mode - Display mode (default 'compact')\n *\n * @fires {CustomEvent} ai-token-click - When the compact badge is clicked\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeSlideInKeyframes } from '../../styles/index.js';\n\n@customElement('ai-token-tracker')\nexport class AiTokenTracker extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeSlideInKeyframes, css`\n :host {\n animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n\n /* Compact mode */\n .compact {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-4) var(--cg-spacing-12);\n border-radius: var(--cg-border-radius-100);\n background: var(--cg-color-surface-container-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n font-size: var(--cg-font-size-xs);\n font-family: var(--cg-font-family-mono);\n color: var(--cg-color-input-text-placeholder);\n cursor: pointer;\n transition: border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default), transform var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .compact:hover { border-color: var(--cg-color-input-border-hover); }\n .compact:active { transform: scale(var(--cg-interaction-press-scale)); }\n .compact .sep { color: var(--cg-color-surface-cards-border); }\n .compact .tokens { color: var(--cg-color-surface-base-text); font-weight: var(--cg-font-weight-bold); }\n .compact .cost-val { color: var(--cg-color-status-success-text-default); }\n .compact .latency-val { color: var(--cg-color-input-text-placeholder); }\n\n /* Detailed mode */\n .detailed {\n padding: var(--cg-spacing-20);\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-component-card-radius);\n min-width: 320px;\n }\n\n .detail-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: var(--cg-spacing-16);\n }\n .detail-title {\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-medium);\n color: var(--cg-color-input-text-placeholder);\n text-transform: uppercase;\n letter-spacing: var(--cg-letter-spacing-wide);\n }\n .model-badge {\n font-size: var(--cg-font-size-xs);\n padding: var(--cg-spacing-2) var(--cg-spacing-8);\n border-radius: var(--cg-border-radius-full);\n background: var(--cg-overlay-accent-subtle);\n color: var(--cg-color-surface-base-text);\n font-weight: var(--cg-font-weight-medium);\n }\n\n .metrics {\n display: flex;\n margin-bottom: var(--cg-spacing-16);\n }\n .metric {\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-2);\n padding: 0 var(--cg-spacing-16);\n border-right: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .metric:first-child { padding-left: 0; }\n .metric:last-child { border-right: none; padding-right: 0; }\n .metric-label {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n font-weight: var(--cg-font-weight-medium);\n }\n .metric-value {\n font-size: var(--cg-font-size-lg);\n font-weight: var(--cg-font-weight-semibold);\n font-family: var(--cg-font-family-mono);\n color: var(--cg-color-surface-base-text);\n letter-spacing: var(--cg-letter-spacing-tight);\n }\n .metric-value.green { color: var(--cg-color-status-success-text-default); }\n\n /* Budget */\n .budget {\n padding-top: var(--cg-spacing-12);\n border-top: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .budget-header {\n display: flex;\n justify-content: space-between;\n font-size: var(--cg-font-size-xs);\n margin-bottom: var(--cg-spacing-6);\n }\n .budget-label { color: var(--cg-color-input-text-placeholder); }\n .budget-value { color: var(--cg-color-surface-base-text); font-weight: var(--cg-font-weight-semibold); }\n .budget-bar {\n height: var(--cg-spacing-6);\n border-radius: var(--cg-spacing-4);\n background: var(--cg-color-surface-container-background);\n overflow: hidden;\n }\n .budget-fill {\n height: 100%;\n border-radius: var(--cg-spacing-4);\n transition: width var(--cg-transition-duration-slow) var(--cg-transition-easing-default);\n }\n .budget-fill.ok { background: var(--cg-color-status-success-text-default); }\n .budget-fill.warning { background: var(--cg-color-status-warning-text-default); }\n .budget-fill.danger { background: var(--cg-color-status-error-text-default); }\n\n :focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n `];\n\n @property({ type: Number }) inputTokens: number = 0;\n @property({ type: Number }) outputTokens: number = 0;\n @property({ type: Number }) cost: number = 0;\n @property({ type: Number }) latency: number = 0; // ms\n @property({ type: String }) model: string = '';\n @property({ type: Number }) budget: number = 0; // max cost\n @property({ type: String }) mode: 'compact' | 'detailed' = 'compact';\n\n private get _totalTokens() { return this.inputTokens + this.outputTokens; }\n private get _costStr() { return this.cost > 0 ? `$${this.cost.toFixed(4)}` : '$0'; }\n private get _latencyStr() {\n if (this.latency < 1000) return `${this.latency}ms`;\n return `${(this.latency / 1000).toFixed(1)}s`;\n }\n private get _latencyClass() {\n if (this.latency < 1000) return 'fast';\n if (this.latency < 3000) return 'medium';\n return 'slow';\n }\n private get _budgetPct() {\n if (this.budget <= 0) return 0;\n return Math.min((this.cost / this.budget) * 100, 100);\n }\n private get _budgetClass() {\n const pct = this._budgetPct;\n if (pct < 60) return 'ok';\n if (pct < 85) return 'warning';\n return 'danger';\n }\n\n private _handleClick() {\n this.dispatchEvent(new CustomEvent('ai-token-click', {\n bubbles: true, composed: true,\n detail: { inputTokens: this.inputTokens, outputTokens: this.outputTokens, cost: this.cost, latency: this.latency, model: this.model },\n }));\n }\n\n override render() {\n if (this.mode === 'compact') {\n return html`\n <div class=\"compact\" role=\"status\" aria-live=\"polite\" aria-label=\"Token usage: ${this._totalTokens} tokens, ${this._costStr}, ${this._latencyStr}\"\n @click=${this._handleClick}>\n <span class=\"tokens\">${this._totalTokens.toLocaleString()}</span> tokens\n <span class=\"sep\">·</span>\n <span class=\"cost-val\">${this._costStr}</span>\n <span class=\"sep\">·</span>\n <span class=\"latency-val\">${this._latencyStr}</span>\n </div>\n `;\n }\n\n return html`\n <div class=\"detailed\" role=\"status\" aria-live=\"polite\" aria-label=\"Token usage details\">\n <div class=\"detail-header\">\n <span class=\"detail-title\">Usage</span>\n ${this.model ? html`<span class=\"model-badge\">${this.model}</span>` : nothing}\n </div>\n\n <div class=\"metrics\">\n <div class=\"metric\">\n <span class=\"metric-label\">Input</span>\n <span class=\"metric-value\">${this.inputTokens.toLocaleString()}</span>\n </div>\n <div class=\"metric\">\n <span class=\"metric-label\">Output</span>\n <span class=\"metric-value\">${this.outputTokens.toLocaleString()}</span>\n </div>\n <div class=\"metric\">\n <span class=\"metric-label\">Cost</span>\n <span class=\"metric-value green\">${this._costStr}</span>\n </div>\n <div class=\"metric\">\n <span class=\"metric-label\">Latency</span>\n <span class=\"metric-value\">${this._latencyStr}</span>\n </div>\n </div>\n\n ${this.budget > 0 ? html`\n <div class=\"budget\">\n <div class=\"budget-header\">\n <span class=\"budget-label\">Budget</span>\n <span class=\"budget-value\">${this._costStr} / $${this.budget.toFixed(2)}</span>\n </div>\n <div class=\"budget-bar\">\n <div class=\"budget-fill ${this._budgetClass}\" style=\"width: ${this._budgetPct}%\"></div>\n </div>\n </div>\n ` : nothing}\n </div>\n `;\n }\n}\n"],"names":["AiTokenTracker","LitElement","pct","html","nothing","hostBlock","reducedMotion","fadeSlideInKeyframes","css","__decorateClass","property","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"ai-token-tracker.js","sources":["../../../src/components/ai-token-tracker/ai-token-tracker.ts"],"sourcesContent":["/**\n * @element ai-token-tracker\n * LLM token usage and cost display with compact (inline badge) and\n * detailed (card with metrics grid) modes. Shows input/output tokens,\n * cost, latency bar, model badge, and optional budget progress bar.\n *\n * @example\n * ```html\n * <ai-token-tracker mode=\"compact\" inputTokens=\"1200\" outputTokens=\"340\" cost=\"0.0042\" latency=\"890\"></ai-token-tracker>\n * <ai-token-tracker mode=\"detailed\" inputTokens=\"1200\" outputTokens=\"340\" cost=\"0.0042\"\n * latency=\"890\" model=\"gpt-4\" budget=\"1.00\"></ai-token-tracker>\n * ```\n *\n * @prop {number} inputTokens - Input token count\n * @prop {number} outputTokens - Output token count\n * @prop {number} cost - Cost in dollars\n * @prop {number} latency - Response latency in ms\n * @prop {string} model - Model name for the badge\n * @prop {number} budget - Max cost budget (shows progress bar when > 0)\n * @prop {'compact'|'detailed'} mode - Display mode (default 'compact')\n *\n * @fires {CustomEvent} ai-token-click - When the compact badge is clicked\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeSlideInKeyframes } from '../../styles/index.js';\n\n@customElement('ai-token-tracker')\nexport class AiTokenTracker extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeSlideInKeyframes, css`\n :host {\n animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n\n /* Compact mode */\n .compact {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-4) var(--cg-spacing-12);\n border-radius: var(--cg-border-radius-100);\n background: var(--cg-color-surface-container-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n font-size: var(--cg-font-size-sm);\n font-family: var(--cg-font-family-mono);\n color: var(--cg-color-input-text-placeholder);\n cursor: pointer;\n transition: border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default), transform var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .compact:hover { border-color: var(--cg-color-input-border-hover); }\n .compact:active { transform: scale(var(--cg-interaction-press-scale)); }\n .compact .sep { color: var(--cg-color-surface-cards-border); }\n .compact .tokens { color: var(--cg-color-surface-base-text); font-weight: var(--cg-font-weight-bold); }\n .compact .cost-val { color: var(--cg-color-status-success-text-default); }\n .compact .latency-val { color: var(--cg-color-input-text-placeholder); }\n\n /* Detailed mode */\n .detailed {\n padding: var(--cg-spacing-20);\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-component-card-radius);\n min-width: 320px;\n }\n\n .detail-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: var(--cg-spacing-16);\n }\n .detail-title {\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-medium);\n color: var(--cg-color-input-text-placeholder);\n text-transform: uppercase;\n letter-spacing: var(--cg-letter-spacing-wide);\n }\n .model-badge {\n font-size: var(--cg-font-size-xs);\n padding: var(--cg-spacing-2) var(--cg-spacing-8);\n border-radius: var(--cg-border-radius-full);\n background: var(--cg-overlay-accent-subtle);\n color: var(--cg-color-surface-base-text);\n font-weight: var(--cg-font-weight-medium);\n }\n\n .metrics {\n display: flex;\n margin-bottom: var(--cg-spacing-16);\n }\n .metric {\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-2);\n padding: 0 var(--cg-spacing-16);\n border-right: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .metric:first-child { padding-left: 0; }\n .metric:last-child { border-right: none; padding-right: 0; }\n .metric-label {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n font-weight: var(--cg-font-weight-medium);\n }\n .metric-value {\n font-size: var(--cg-font-size-lg);\n font-weight: var(--cg-font-weight-semibold);\n font-family: var(--cg-font-family-mono);\n color: var(--cg-color-surface-base-text);\n letter-spacing: var(--cg-letter-spacing-tight);\n }\n .metric-value.green { color: var(--cg-color-status-success-text-default); }\n\n /* Budget */\n .budget {\n padding-top: var(--cg-spacing-12);\n border-top: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .budget-header {\n display: flex;\n justify-content: space-between;\n font-size: var(--cg-font-size-xs);\n margin-bottom: var(--cg-spacing-6);\n }\n .budget-label { color: var(--cg-color-input-text-placeholder); }\n .budget-value { color: var(--cg-color-surface-base-text); font-weight: var(--cg-font-weight-semibold); }\n .budget-bar {\n height: var(--cg-spacing-6);\n border-radius: var(--cg-spacing-4);\n background: var(--cg-color-surface-container-background);\n overflow: hidden;\n }\n .budget-fill {\n height: 100%;\n border-radius: var(--cg-spacing-4);\n transition: width var(--cg-transition-duration-slow) var(--cg-transition-easing-default);\n }\n .budget-fill.ok { background: var(--cg-color-status-success-text-default); }\n .budget-fill.warning { background: var(--cg-color-status-warning-text-default); }\n .budget-fill.danger { background: var(--cg-color-status-error-text-default); }\n\n :focus-visible {\n outline: none;\n box-shadow: 0 0 0 var(--cg-focus-ring-width) var(--cg-overlay-accent-strong);\n }\n `];\n\n @property({ type: Number }) inputTokens: number = 0;\n @property({ type: Number }) outputTokens: number = 0;\n @property({ type: Number }) cost: number = 0;\n @property({ type: Number }) latency: number = 0; // ms\n @property({ type: String }) model: string = '';\n @property({ type: Number }) budget: number = 0; // max cost\n @property({ type: String }) mode: 'compact' | 'detailed' = 'compact';\n\n private get _totalTokens() { return this.inputTokens + this.outputTokens; }\n private get _costStr() { return this.cost > 0 ? `$${this.cost.toFixed(4)}` : '$0'; }\n private get _latencyStr() {\n if (this.latency < 1000) return `${this.latency}ms`;\n return `${(this.latency / 1000).toFixed(1)}s`;\n }\n private get _latencyClass() {\n if (this.latency < 1000) return 'fast';\n if (this.latency < 3000) return 'medium';\n return 'slow';\n }\n private get _budgetPct() {\n if (this.budget <= 0) return 0;\n return Math.min((this.cost / this.budget) * 100, 100);\n }\n private get _budgetClass() {\n const pct = this._budgetPct;\n if (pct < 60) return 'ok';\n if (pct < 85) return 'warning';\n return 'danger';\n }\n\n private _handleClick() {\n this.dispatchEvent(new CustomEvent('ai-token-click', {\n bubbles: true, composed: true,\n detail: { inputTokens: this.inputTokens, outputTokens: this.outputTokens, cost: this.cost, latency: this.latency, model: this.model },\n }));\n }\n\n override render() {\n if (this.mode === 'compact') {\n return html`\n <div class=\"compact\" role=\"status\" aria-live=\"polite\" aria-label=\"Token usage: ${this._totalTokens} tokens, ${this._costStr}, ${this._latencyStr}\"\n @click=${this._handleClick}>\n <span class=\"tokens\">${this._totalTokens.toLocaleString()}</span> tokens\n <span class=\"sep\">·</span>\n <span class=\"cost-val\">${this._costStr}</span>\n <span class=\"sep\">·</span>\n <span class=\"latency-val\">${this._latencyStr}</span>\n </div>\n `;\n }\n\n return html`\n <div class=\"detailed\" role=\"status\" aria-live=\"polite\" aria-label=\"Token usage details\">\n <div class=\"detail-header\">\n <span class=\"detail-title\">Usage</span>\n ${this.model ? html`<span class=\"model-badge\">${this.model}</span>` : nothing}\n </div>\n\n <div class=\"metrics\">\n <div class=\"metric\">\n <span class=\"metric-label\">Input</span>\n <span class=\"metric-value\">${this.inputTokens.toLocaleString()}</span>\n </div>\n <div class=\"metric\">\n <span class=\"metric-label\">Output</span>\n <span class=\"metric-value\">${this.outputTokens.toLocaleString()}</span>\n </div>\n <div class=\"metric\">\n <span class=\"metric-label\">Cost</span>\n <span class=\"metric-value green\">${this._costStr}</span>\n </div>\n <div class=\"metric\">\n <span class=\"metric-label\">Latency</span>\n <span class=\"metric-value\">${this._latencyStr}</span>\n </div>\n </div>\n\n ${this.budget > 0 ? html`\n <div class=\"budget\">\n <div class=\"budget-header\">\n <span class=\"budget-label\">Budget</span>\n <span class=\"budget-value\">${this._costStr} / $${this.budget.toFixed(2)}</span>\n </div>\n <div class=\"budget-bar\">\n <div class=\"budget-fill ${this._budgetClass}\" style=\"width: ${this._budgetPct}%\"></div>\n </div>\n </div>\n ` : nothing}\n </div>\n `;\n }\n}\n"],"names":["AiTokenTracker","LitElement","pct","html","nothing","hostBlock","reducedMotion","fadeSlideInKeyframes","css","__decorateClass","property","customElement"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import { css as h, LitElement as g, html as l } from "lit";
2
- import { property as n, state as v, customElement as u } from "lit/decorators.js";
3
- import { h as f, r as p, b, f as m } from "../../chunks/premium.css-9I4kHrsl.js";
4
- var _ = Object.defineProperty, k = Object.getOwnPropertyDescriptor, s = (r, e, a, o) => {
5
- for (var i = o > 1 ? void 0 : o ? k(e, a) : e, c = r.length - 1, d; c >= 0; c--)
6
- (d = r[c]) && (i = (o ? d(e, a, i) : d(i)) || i);
7
- return o && i && _(e, a, i), i;
2
+ import { property as n, state as v, customElement as f } from "lit/decorators.js";
3
+ import { h as u, r as p, b, f as m } from "../../chunks/premium.css-DHekUEUt.js";
4
+ var _ = Object.defineProperty, k = Object.getOwnPropertyDescriptor, s = (r, e, a, t) => {
5
+ for (var i = t > 1 ? void 0 : t ? k(e, a) : e, c = r.length - 1, d; c >= 0; c--)
6
+ (d = r[c]) && (i = (t ? d(e, a, i) : d(i)) || i);
7
+ return t && i && _(e, a, i), i;
8
8
  };
9
- let t = class extends g {
9
+ let o = class extends g {
10
10
  constructor() {
11
11
  super(...arguments), this.toolName = "", this.toolData = null, this.registry = {}, this.loading = !1, this._error = "", this._cachedEl = null, this._cachedKey = "";
12
12
  }
@@ -29,11 +29,11 @@ let t = class extends g {
29
29
  this._abortController?.abort(), this._abortController = new AbortController();
30
30
  try {
31
31
  const a = document.createElement(r);
32
- return a.data = this.toolData, a.toolData = this.toolData, a.addEventListener("ai-tool-card-action", ((o) => {
32
+ return a.data = this.toolData, a.toolData = this.toolData, a.addEventListener("ai-tool-card-action", ((t) => {
33
33
  this._dispatch("ai-tool-card-action", {
34
34
  toolName: this.toolName,
35
- action: o.detail?.action,
36
- data: o.detail?.data
35
+ action: t.detail?.action,
36
+ data: t.detail?.data
37
37
  });
38
38
  }), { signal: this._abortController.signal }), this._cachedEl = a, this._cachedKey = e, a;
39
39
  } catch (a) {
@@ -96,7 +96,7 @@ let t = class extends g {
96
96
  return e ? l`<div class="resolved">${e}</div>` : this._error ? this._renderError() : this._renderFallback();
97
97
  }
98
98
  };
99
- t.styles = [f, p, b, m, h`
99
+ o.styles = [u, p, b, m, h`
100
100
  :host {
101
101
  animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-default);
102
102
  }
@@ -165,7 +165,7 @@ t.styles = [f, p, b, m, h`
165
165
  overflow-x: auto;
166
166
  white-space: pre-wrap;
167
167
  word-break: break-all;
168
- max-height: var(300px);
168
+ max-height: var(--cg-spacing-256);
169
169
  overflow-y: auto;
170
170
  }
171
171
 
@@ -177,13 +177,13 @@ t.styles = [f, p, b, m, h`
177
177
  gap: var(--cg-spacing-8);
178
178
  }
179
179
  .error-icon {
180
- color: var(--cg-color-status-error-text-default);
180
+ color: var(--cg-color-ai-error-text);
181
181
  font-size: var(--cg-font-size-base);
182
182
  flex-shrink: 0;
183
183
  }
184
184
  .error-text {
185
185
  font-size: var(--cg-font-size-sm);
186
- color: var(--cg-color-status-error-text-default);
186
+ color: var(--cg-color-ai-error-text);
187
187
  }
188
188
 
189
189
  /* ── Resolved component host ── */
@@ -203,23 +203,23 @@ t.styles = [f, p, b, m, h`
203
203
  `];
204
204
  s([
205
205
  n({ type: String })
206
- ], t.prototype, "toolName", 2);
206
+ ], o.prototype, "toolName", 2);
207
207
  s([
208
208
  n({ attribute: !1 })
209
- ], t.prototype, "toolData", 2);
209
+ ], o.prototype, "toolData", 2);
210
210
  s([
211
211
  n({ attribute: !1 })
212
- ], t.prototype, "registry", 2);
212
+ ], o.prototype, "registry", 2);
213
213
  s([
214
214
  n({ type: Boolean })
215
- ], t.prototype, "loading", 2);
215
+ ], o.prototype, "loading", 2);
216
216
  s([
217
217
  v()
218
- ], t.prototype, "_error", 2);
219
- t = s([
220
- u("ai-tool-card-resolver")
221
- ], t);
218
+ ], o.prototype, "_error", 2);
219
+ o = s([
220
+ f("ai-tool-card-resolver")
221
+ ], o);
222
222
  export {
223
- t as AiToolCardResolver
223
+ o as AiToolCardResolver
224
224
  };
225
225
  //# sourceMappingURL=ai-tool-card-resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-tool-card-resolver.js","sources":["../../../src/components/ai-tool-card-resolver/ai-tool-card-resolver.ts"],"sourcesContent":["/**\n * @element ai-tool-card-resolver\n * Dynamic card renderer that maps tool call names to registered web\n * components via a registry. Shows a loading skeleton while resolving,\n * falls back to raw JSON display if no match, and includes an error\n * boundary if the resolved component throws.\n *\n * @example\n * ```html\n * <ai-tool-card-resolver\n * toolName=\"invoice\"\n * .toolData=${{ id: 'INV-001', total: 250 }}\n * .registry=${{ invoice: 'app-invoice-card', chart: 'app-chart-card' }}\n * ></ai-tool-card-resolver>\n * ```\n *\n * @prop {string} toolName - Tool call name to resolve (e.g. 'invoice')\n * @prop {unknown} toolData - Data passed to the resolved component\n * @prop {Record<string, string>} registry - Map of tool names to component tag names\n * @prop {boolean} loading - Force loading skeleton display\n *\n * @fires {CustomEvent<{toolName: string, action: string}>} ai-tool-card-action - Proxied from resolved component\n * @fires {CustomEvent<{toolName: string, error: string}>} ai-tool-card-error - When resolution fails\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, shimmerKeyframes, fadeSlideInKeyframes } from '../../styles/index.js';\n\n@customElement('ai-tool-card-resolver')\nexport class AiToolCardResolver extends LitElement {\n static override styles = [hostBlock, reducedMotion, shimmerKeyframes, fadeSlideInKeyframes, css`\n :host {\n animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n\n .card {\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-200);\n overflow: hidden;\n transition: border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .card:hover {\n border-color: var(--cg-color-input-border-hover);\n }\n\n /* ── Loading skeleton ── */\n .skeleton {\n padding: var(--cg-spacing-16);\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-8);\n }\n .skeleton-line {\n height: var(--cg-spacing-12);\n border-radius: var(--cg-border-radius-100);\n background: linear-gradient(\n 90deg,\n var(--cg-color-surface-container-background) 25%,\n var(--cg-color-surface-cards-border) 50%,\n var(--cg-color-surface-container-background) 75%\n );\n background-size: 200% 100%;\n animation: shimmer 1.5s linear infinite;\n }\n .skeleton-line:nth-child(1) { width: 60%; }\n .skeleton-line:nth-child(2) { width: 90%; }\n .skeleton-line:nth-child(3) { width: 75%; }\n\n /* ── Fallback (raw JSON) ── */\n .fallback {\n padding: var(--cg-spacing-16);\n }\n .fallback-header {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n margin-bottom: var(--cg-spacing-12);\n }\n .fallback-icon {\n font-size: var(--cg-font-size-sm);\n color: var(--cg-color-surface-base-text);\n }\n .fallback-title {\n font-size: var(--cg-font-size-sm);\n font-weight: var(--cg-font-weight-semibold);\n color: var(--cg-color-surface-base-text);\n }\n .fallback-json {\n font-family: var(--cg-font-family-mono);\n font-size: var(--cg-font-size-xs);\n line-height: 1.5;\n color: var(--cg-color-input-text-placeholder);\n background: var(--cg-color-surface-base-background);\n border-radius: var(--cg-border-radius-100);\n padding: var(--cg-spacing-12);\n overflow-x: auto;\n white-space: pre-wrap;\n word-break: break-all;\n max-height: var(300px);\n overflow-y: auto;\n }\n\n /* ── Error state ── */\n .error {\n padding: var(--cg-spacing-16);\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n }\n .error-icon {\n color: var(--cg-color-status-error-text-default);\n font-size: var(--cg-font-size-base);\n flex-shrink: 0;\n }\n .error-text {\n font-size: var(--cg-font-size-sm);\n color: var(--cg-color-status-error-text-default);\n }\n\n /* ── Resolved component host ── */\n .resolved {\n padding: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host { animation: none; }\n .skeleton-line { animation: none; }\n }\n\n :focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n `];\n\n /** Tool call name, e.g. \"invoice\" or \"search_results\" */\n @property({ type: String }) toolName = '';\n\n /** The tool's output data (passed as property to resolved component) */\n @property({ attribute: false }) toolData: unknown = null;\n\n /** Registry mapping tool names to component tag names */\n @property({ attribute: false }) registry: Record<string, string> = {};\n\n /** Show loading skeleton */\n @property({ type: Boolean }) loading = false;\n\n @state() private _error = '';\n\n /** Cached resolved element keyed by toolName + tag */\n private _cachedEl: HTMLElement | null = null;\n private _cachedKey = '';\n\n private _dispatch(name: string, detail: unknown) {\n this.dispatchEvent(new CustomEvent(name, {\n bubbles: true, composed: true, detail,\n }));\n }\n\n private _abortController?: AbortController;\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this._abortController?.abort();\n }\n\n private _resolveComponent(): HTMLElement | null {\n const tag = this.registry[this.toolName];\n if (!tag) return null;\n\n const cacheKey = `${this.toolName}::${tag}`;\n\n // Return cached element if key matches, just update data\n if (this._cachedEl && this._cachedKey === cacheKey) {\n (this._cachedEl as unknown as Record<string, unknown>)['data'] = this.toolData;\n (this._cachedEl as unknown as Record<string, unknown>)['toolData'] = this.toolData;\n return this._cachedEl;\n }\n\n // Clean up previous listeners\n this._abortController?.abort();\n this._abortController = new AbortController();\n\n try {\n const el = document.createElement(tag);\n (el as unknown as Record<string, unknown>)['data'] = this.toolData;\n (el as unknown as Record<string, unknown>)['toolData'] = this.toolData;\n el.addEventListener('ai-tool-card-action', ((e: CustomEvent) => {\n this._dispatch('ai-tool-card-action', {\n toolName: this.toolName, action: e.detail?.action, data: e.detail?.data,\n });\n }) as EventListener, { signal: this._abortController.signal });\n\n // Cache the element\n this._cachedEl = el;\n this._cachedKey = cacheKey;\n\n return el;\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Component failed to render';\n this._dispatch('ai-tool-card-error', {\n toolName: this.toolName, error: this._error,\n });\n return null;\n }\n }\n\n private _renderLoading() {\n return html`\n <div class=\"skeleton\" role=\"status\" aria-label=\"Loading tool card\">\n <div class=\"skeleton-line\"></div>\n <div class=\"skeleton-line\"></div>\n <div class=\"skeleton-line\"></div>\n </div>\n `;\n }\n\n private _renderFallback() {\n let jsonStr = '';\n try {\n jsonStr = JSON.stringify(this.toolData, null, 2);\n } catch {\n jsonStr = String(this.toolData);\n }\n return html`\n <div class=\"fallback\">\n <div class=\"fallback-header\">\n <span class=\"fallback-icon\" aria-hidden=\"true\">&#9881;</span>\n <span class=\"fallback-title\">${this.toolName || 'Tool Result'}</span>\n </div>\n <div class=\"fallback-json\" role=\"log\">${jsonStr}</div>\n </div>\n `;\n }\n\n private _renderError() {\n return html`\n <div class=\"error\" role=\"alert\">\n <span class=\"error-icon\" aria-hidden=\"true\">&#9888;</span>\n <span class=\"error-text\">Error resolving \"${this.toolName}\": ${this._error}</span>\n </div>\n `;\n }\n\n override render() {\n return html`\n <div\n class=\"card\"\n role=\"region\"\n aria-label=\"Tool card: ${this.toolName || 'unknown'}\"\n tabindex=\"0\"\n >\n ${this.loading ? this._renderLoading()\n : this._error ? this._renderError()\n : this._renderResolved()}\n </div>\n `;\n }\n\n private _renderResolved() {\n if (!this.toolName) return this._renderFallback();\n\n const tag = this.registry[this.toolName];\n if (!tag) return this._renderFallback();\n\n const el = this._resolveComponent();\n if (!el) return this._error ? this._renderError() : this._renderFallback();\n\n return html`<div class=\"resolved\">${el}</div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ai-tool-card-resolver': AiToolCardResolver;\n }\n}\n"],"names":["AiToolCardResolver","LitElement","name","detail","tag","cacheKey","el","e","err","html","jsonStr","hostBlock","reducedMotion","shimmerKeyframes","fadeSlideInKeyframes","css","__decorateClass","property","state","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"ai-tool-card-resolver.js","sources":["../../../src/components/ai-tool-card-resolver/ai-tool-card-resolver.ts"],"sourcesContent":["/**\n * @element ai-tool-card-resolver\n * Dynamic card renderer that maps tool call names to registered web\n * components via a registry. Shows a loading skeleton while resolving,\n * falls back to raw JSON display if no match, and includes an error\n * boundary if the resolved component throws.\n *\n * @example\n * ```html\n * <ai-tool-card-resolver\n * toolName=\"invoice\"\n * .toolData=${{ id: 'INV-001', total: 250 }}\n * .registry=${{ invoice: 'app-invoice-card', chart: 'app-chart-card' }}\n * ></ai-tool-card-resolver>\n * ```\n *\n * @prop {string} toolName - Tool call name to resolve (e.g. 'invoice')\n * @prop {unknown} toolData - Data passed to the resolved component\n * @prop {Record<string, string>} registry - Map of tool names to component tag names\n * @prop {boolean} loading - Force loading skeleton display\n *\n * @fires {CustomEvent<{toolName: string, action: string}>} ai-tool-card-action - Proxied from resolved component\n * @fires {CustomEvent<{toolName: string, error: string}>} ai-tool-card-error - When resolution fails\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, shimmerKeyframes, fadeSlideInKeyframes } from '../../styles/index.js';\n\n@customElement('ai-tool-card-resolver')\nexport class AiToolCardResolver extends LitElement {\n static override styles = [hostBlock, reducedMotion, shimmerKeyframes, fadeSlideInKeyframes, css`\n :host {\n animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n\n .card {\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-200);\n overflow: hidden;\n transition: border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .card:hover {\n border-color: var(--cg-color-input-border-hover);\n }\n\n /* ── Loading skeleton ── */\n .skeleton {\n padding: var(--cg-spacing-16);\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-8);\n }\n .skeleton-line {\n height: var(--cg-spacing-12);\n border-radius: var(--cg-border-radius-100);\n background: linear-gradient(\n 90deg,\n var(--cg-color-surface-container-background) 25%,\n var(--cg-color-surface-cards-border) 50%,\n var(--cg-color-surface-container-background) 75%\n );\n background-size: 200% 100%;\n animation: shimmer 1.5s linear infinite;\n }\n .skeleton-line:nth-child(1) { width: 60%; }\n .skeleton-line:nth-child(2) { width: 90%; }\n .skeleton-line:nth-child(3) { width: 75%; }\n\n /* ── Fallback (raw JSON) ── */\n .fallback {\n padding: var(--cg-spacing-16);\n }\n .fallback-header {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n margin-bottom: var(--cg-spacing-12);\n }\n .fallback-icon {\n font-size: var(--cg-font-size-sm);\n color: var(--cg-color-surface-base-text);\n }\n .fallback-title {\n font-size: var(--cg-font-size-sm);\n font-weight: var(--cg-font-weight-semibold);\n color: var(--cg-color-surface-base-text);\n }\n .fallback-json {\n font-family: var(--cg-font-family-mono);\n font-size: var(--cg-font-size-xs);\n line-height: 1.5;\n color: var(--cg-color-input-text-placeholder);\n background: var(--cg-color-surface-base-background);\n border-radius: var(--cg-border-radius-100);\n padding: var(--cg-spacing-12);\n overflow-x: auto;\n white-space: pre-wrap;\n word-break: break-all;\n max-height: var(--cg-spacing-256);\n overflow-y: auto;\n }\n\n /* ── Error state ── */\n .error {\n padding: var(--cg-spacing-16);\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n }\n .error-icon {\n color: var(--cg-color-ai-error-text);\n font-size: var(--cg-font-size-base);\n flex-shrink: 0;\n }\n .error-text {\n font-size: var(--cg-font-size-sm);\n color: var(--cg-color-ai-error-text);\n }\n\n /* ── Resolved component host ── */\n .resolved {\n padding: 0;\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host { animation: none; }\n .skeleton-line { animation: none; }\n }\n\n :focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n `];\n\n /** Tool call name, e.g. \"invoice\" or \"search_results\" */\n @property({ type: String }) toolName = '';\n\n /** The tool's output data (passed as property to resolved component) */\n @property({ attribute: false }) toolData: unknown = null;\n\n /** Registry mapping tool names to component tag names */\n @property({ attribute: false }) registry: Record<string, string> = {};\n\n /** Show loading skeleton */\n @property({ type: Boolean }) loading = false;\n\n @state() private _error = '';\n\n /** Cached resolved element keyed by toolName + tag */\n private _cachedEl: HTMLElement | null = null;\n private _cachedKey = '';\n\n private _dispatch(name: string, detail: unknown) {\n this.dispatchEvent(new CustomEvent(name, {\n bubbles: true, composed: true, detail,\n }));\n }\n\n private _abortController?: AbortController;\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this._abortController?.abort();\n }\n\n private _resolveComponent(): HTMLElement | null {\n const tag = this.registry[this.toolName];\n if (!tag) return null;\n\n const cacheKey = `${this.toolName}::${tag}`;\n\n // Return cached element if key matches, just update data\n if (this._cachedEl && this._cachedKey === cacheKey) {\n (this._cachedEl as unknown as Record<string, unknown>)['data'] = this.toolData;\n (this._cachedEl as unknown as Record<string, unknown>)['toolData'] = this.toolData;\n return this._cachedEl;\n }\n\n // Clean up previous listeners\n this._abortController?.abort();\n this._abortController = new AbortController();\n\n try {\n const el = document.createElement(tag);\n (el as unknown as Record<string, unknown>)['data'] = this.toolData;\n (el as unknown as Record<string, unknown>)['toolData'] = this.toolData;\n el.addEventListener('ai-tool-card-action', ((e: CustomEvent) => {\n this._dispatch('ai-tool-card-action', {\n toolName: this.toolName, action: e.detail?.action, data: e.detail?.data,\n });\n }) as EventListener, { signal: this._abortController.signal });\n\n // Cache the element\n this._cachedEl = el;\n this._cachedKey = cacheKey;\n\n return el;\n } catch (err) {\n this._error = err instanceof Error ? err.message : 'Component failed to render';\n this._dispatch('ai-tool-card-error', {\n toolName: this.toolName, error: this._error,\n });\n return null;\n }\n }\n\n private _renderLoading() {\n return html`\n <div class=\"skeleton\" role=\"status\" aria-label=\"Loading tool card\">\n <div class=\"skeleton-line\"></div>\n <div class=\"skeleton-line\"></div>\n <div class=\"skeleton-line\"></div>\n </div>\n `;\n }\n\n private _renderFallback() {\n let jsonStr = '';\n try {\n jsonStr = JSON.stringify(this.toolData, null, 2);\n } catch {\n jsonStr = String(this.toolData);\n }\n return html`\n <div class=\"fallback\">\n <div class=\"fallback-header\">\n <span class=\"fallback-icon\" aria-hidden=\"true\">&#9881;</span>\n <span class=\"fallback-title\">${this.toolName || 'Tool Result'}</span>\n </div>\n <div class=\"fallback-json\" role=\"log\">${jsonStr}</div>\n </div>\n `;\n }\n\n private _renderError() {\n return html`\n <div class=\"error\" role=\"alert\">\n <span class=\"error-icon\" aria-hidden=\"true\">&#9888;</span>\n <span class=\"error-text\">Error resolving \"${this.toolName}\": ${this._error}</span>\n </div>\n `;\n }\n\n override render() {\n return html`\n <div\n class=\"card\"\n role=\"region\"\n aria-label=\"Tool card: ${this.toolName || 'unknown'}\"\n tabindex=\"0\"\n >\n ${this.loading ? this._renderLoading()\n : this._error ? this._renderError()\n : this._renderResolved()}\n </div>\n `;\n }\n\n private _renderResolved() {\n if (!this.toolName) return this._renderFallback();\n\n const tag = this.registry[this.toolName];\n if (!tag) return this._renderFallback();\n\n const el = this._resolveComponent();\n if (!el) return this._error ? this._renderError() : this._renderFallback();\n\n return html`<div class=\"resolved\">${el}</div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ai-tool-card-resolver': AiToolCardResolver;\n }\n}\n"],"names":["AiToolCardResolver","LitElement","name","detail","tag","cacheKey","el","e","err","html","jsonStr","hostBlock","reducedMotion","shimmerKeyframes","fadeSlideInKeyframes","css","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { css as p, LitElement as u, html as t, nothing as d } from "lit";
2
2
  import { property as g, customElement as v } from "lit/decorators.js";
3
- import { h as f, r as h } from "../../chunks/premium.css-9I4kHrsl.js";
3
+ import { h as f, r as h } from "../../chunks/premium.css-DHekUEUt.js";
4
4
  var m = Object.defineProperty, b = Object.getOwnPropertyDescriptor, l = (r, e, o, i) => {
5
5
  for (var a = i > 1 ? void 0 : i ? b(e, o) : e, s = r.length - 1, c; s >= 0; s--)
6
6
  (c = r[s]) && (a = (i ? c(e, o, a) : c(a)) || a);
@@ -74,7 +74,7 @@ n.styles = [f, h, p`
74
74
  border-radius: var(--cg-border-radius-100);
75
75
  background: var(--cg-color-surface-cards-background);
76
76
  border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);
77
- font-size: var(--cg-font-size-xs);
77
+ font-size: var(--cg-font-size-sm);
78
78
  font-weight: var(--cg-font-weight-medium);
79
79
  color: var(--cg-color-surface-container-outlined);
80
80
  cursor: pointer;
@@ -146,7 +146,7 @@ n.styles = [f, h, p`
146
146
  background: var(--cg-color-surface-base-background);
147
147
  border-radius: var(--cg-border-radius-100);
148
148
  border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);
149
- font-size: var(--cg-font-size-xs);
149
+ font-size: var(--cg-font-size-sm);
150
150
  font-family: var(--cg-font-family-mono);
151
151
  color: var(--cg-color-surface-container-outlined);
152
152
  line-height: var(--cg-line-height-relaxed);
@@ -1 +1 @@
1
- {"version":3,"file":"ai-tool-indicator.js","sources":["../../../src/components/ai-tool-indicator/ai-tool-indicator.ts"],"sourcesContent":["/**\n * @element ai-tool-indicator\n * Displays LLM tool/function call progress with humanized names,\n * spinner/check/error icons, and expandable result panels.\n *\n * @fires {CustomEvent<{index: number, tool: ToolCall}>} ai-tool-click - When a tool row is clicked\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion } from '../../styles/index.js';\n\ninterface ToolCall {\n name: string;\n status: 'loading' | 'complete' | 'error';\n result?: string;\n}\n\n@customElement('ai-tool-indicator')\nexport class AiToolIndicator extends LitElement {\n static override styles = [hostBlock, reducedMotion, css`\n .tools {\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-8);\n }\n\n .tool {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-12);\n padding: var(--cg-spacing-16) var(--cg-spacing-20);\n border-radius: var(--cg-border-radius-100);\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-medium);\n color: var(--cg-color-surface-container-outlined);\n cursor: pointer;\n transition: border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default), background var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n animation: slideIn var(--cg-transition-duration-default) var(--cg-transition-easing-ease-out) both;\n animation-delay: calc(var(--tool-index, 0) * 60ms);\n }\n .tool:hover {\n border-color: var(--cg-color-surface-cards-hover-border);\n background: var(--cg-color-surface-cards-hover-background);\n }\n\n @keyframes slideIn {\n from { opacity: 0; transform: translateX(calc(-1 * var(--cg-spacing-8))); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n /* Status icon */\n .status-icon {\n width: var(--cg-spacing-16);\n height: var(--cg-spacing-16);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n /* Spinner */\n .spinner {\n width: var(--cg-spacing-12);\n height: var(--cg-spacing-12);\n border: var(--cg-border-width-100) solid var(--cg-color-loading-spinner-secondary);\n border-top-color: var(--cg-color-loading-spinner-primary);\n border-radius: var(--cg-border-radius-full);\n animation: spin 0.8s linear infinite;\n }\n @keyframes spin { to { transform: rotate(360deg); } }\n\n .check svg, .error-icon svg {\n width: var(--cg-spacing-12);\n height: var(--cg-spacing-12);\n }\n .check { color: var(--cg-color-status-success-text-default); display: flex; }\n .error-icon { color: var(--cg-color-status-error-text-default); display: flex; }\n\n /* Tool name */\n .tool-name { flex: 1; }\n .tool.complete .tool-name { color: var(--cg-color-surface-base-text); }\n .tool.error .tool-name { color: var(--cg-color-status-error-text-default); }\n\n /* Loading shimmer on tool name */\n .tool.loading .tool-name {\n background: linear-gradient(110deg, var(--cg-color-surface-container-outlined) 35%, var(--cg-color-surface-base-text) 50%, var(--cg-color-surface-container-outlined) 65%);\n background-size: 300% 100%;\n background-clip: text;\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n animation: textSweep 1.8s var(--cg-transition-easing-default) infinite;\n }\n @keyframes textSweep {\n 0% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n\n /* Expanded result */\n .result {\n margin-top: var(--cg-spacing-4);\n padding: var(--cg-spacing-12) var(--cg-spacing-16);\n background: var(--cg-color-surface-base-background);\n border-radius: var(--cg-border-radius-100);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n font-size: var(--cg-font-size-xs);\n font-family: var(--cg-font-family-mono);\n color: var(--cg-color-surface-container-outlined);\n line-height: var(--cg-line-height-relaxed);\n white-space: pre-wrap;\n max-height: 200px;\n overflow-y: auto;\n }\n\n /* Compact mode */\n :host([compact]) .tools { flex-direction: row; flex-wrap: wrap; }\n :host([compact]) .tool { padding: var(--cg-spacing-6) var(--cg-spacing-12); }\n :host([compact]) .result { display: none; }\n\n .tool:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .spinner { animation: none; }\n .tool { animation: none; }\n .tool.loading .tool-name { animation: none; -webkit-text-fill-color: currentColor; }\n }\n `];\n\n @property({ type: Array }) tools: ToolCall[] = [];\n @property({ type: Boolean, reflect: true }) compact = false;\n\n private _expandedIndex = -1;\n\n private _humanize(name: string): string {\n const map: Record<string, string> = {\n web_search: 'Searching the web',\n search: 'Searching',\n code_execution: 'Running code',\n code_interpreter: 'Running code',\n database: 'Querying database',\n database_query: 'Querying database',\n file_search: 'Searching files',\n file_read: 'Reading file',\n calculator: 'Calculating',\n image_generation: 'Generating image',\n browser: 'Browsing',\n retrieval: 'Retrieving data',\n api_call: 'Calling API',\n };\n return map[name] || name.replace(/_/g, ' ').replace(/\\b\\w/g, c => c.toUpperCase());\n }\n\n private _handleClick(index: number) {\n this._expandedIndex = this._expandedIndex === index ? -1 : index;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('ai-tool-click', {\n bubbles: true, composed: true,\n detail: { index, tool: this.tools[index] },\n }));\n }\n\n private _renderStatusIcon(status: string) {\n if (status === 'complete') return html`<span class=\"check\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg></span>`;\n if (status === 'error') return html`<span class=\"error-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg></span>`;\n return html`<div class=\"spinner\"></div>`;\n }\n\n override render() {\n if (this.tools.length === 0) return nothing;\n\n return html`\n <div class=\"tools\" role=\"status\" aria-label=\"Tool calls\">\n ${this.tools.map((t, i) => html`\n <div class=\"tool ${t.status}\" style=\"--tool-index: ${i}\"\n role=\"button\" tabindex=\"0\"\n aria-label=\"${this._humanize(t.name)} — ${t.status}\"\n @click=${() => this._handleClick(i)}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this._handleClick(i); } }}>\n <span class=\"status-icon\">${this._renderStatusIcon(t.status)}</span>\n <span class=\"tool-name\">${this._humanize(t.name)}</span>\n </div>\n ${!this.compact && this._expandedIndex === i && t.result ? html`\n <div class=\"result\">${t.result}</div>\n ` : nothing}\n `)}\n </div>\n `;\n }\n}\n"],"names":["AiToolIndicator","LitElement","name","c","index","status","html","nothing","t","i","e","hostBlock","reducedMotion","css","__decorateClass","property","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"ai-tool-indicator.js","sources":["../../../src/components/ai-tool-indicator/ai-tool-indicator.ts"],"sourcesContent":["/**\n * @element ai-tool-indicator\n * Displays LLM tool/function call progress with humanized names,\n * spinner/check/error icons, and expandable result panels.\n *\n * @fires {CustomEvent<{index: number, tool: ToolCall}>} ai-tool-click - When a tool row is clicked\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion } from '../../styles/index.js';\n\ninterface ToolCall {\n name: string;\n status: 'loading' | 'complete' | 'error';\n result?: string;\n}\n\n@customElement('ai-tool-indicator')\nexport class AiToolIndicator extends LitElement {\n static override styles = [hostBlock, reducedMotion, css`\n .tools {\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-8);\n }\n\n .tool {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-12);\n padding: var(--cg-spacing-16) var(--cg-spacing-20);\n border-radius: var(--cg-border-radius-100);\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n font-size: var(--cg-font-size-sm);\n font-weight: var(--cg-font-weight-medium);\n color: var(--cg-color-surface-container-outlined);\n cursor: pointer;\n transition: border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default), background var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n animation: slideIn var(--cg-transition-duration-default) var(--cg-transition-easing-ease-out) both;\n animation-delay: calc(var(--tool-index, 0) * 60ms);\n }\n .tool:hover {\n border-color: var(--cg-color-surface-cards-hover-border);\n background: var(--cg-color-surface-cards-hover-background);\n }\n\n @keyframes slideIn {\n from { opacity: 0; transform: translateX(calc(-1 * var(--cg-spacing-8))); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n /* Status icon */\n .status-icon {\n width: var(--cg-spacing-16);\n height: var(--cg-spacing-16);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n /* Spinner */\n .spinner {\n width: var(--cg-spacing-12);\n height: var(--cg-spacing-12);\n border: var(--cg-border-width-100) solid var(--cg-color-loading-spinner-secondary);\n border-top-color: var(--cg-color-loading-spinner-primary);\n border-radius: var(--cg-border-radius-full);\n animation: spin 0.8s linear infinite;\n }\n @keyframes spin { to { transform: rotate(360deg); } }\n\n .check svg, .error-icon svg {\n width: var(--cg-spacing-12);\n height: var(--cg-spacing-12);\n }\n .check { color: var(--cg-color-status-success-text-default); display: flex; }\n .error-icon { color: var(--cg-color-status-error-text-default); display: flex; }\n\n /* Tool name */\n .tool-name { flex: 1; }\n .tool.complete .tool-name { color: var(--cg-color-surface-base-text); }\n .tool.error .tool-name { color: var(--cg-color-status-error-text-default); }\n\n /* Loading shimmer on tool name */\n .tool.loading .tool-name {\n background: linear-gradient(110deg, var(--cg-color-surface-container-outlined) 35%, var(--cg-color-surface-base-text) 50%, var(--cg-color-surface-container-outlined) 65%);\n background-size: 300% 100%;\n background-clip: text;\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n animation: textSweep 1.8s var(--cg-transition-easing-default) infinite;\n }\n @keyframes textSweep {\n 0% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n\n /* Expanded result */\n .result {\n margin-top: var(--cg-spacing-4);\n padding: var(--cg-spacing-12) var(--cg-spacing-16);\n background: var(--cg-color-surface-base-background);\n border-radius: var(--cg-border-radius-100);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n font-size: var(--cg-font-size-sm);\n font-family: var(--cg-font-family-mono);\n color: var(--cg-color-surface-container-outlined);\n line-height: var(--cg-line-height-relaxed);\n white-space: pre-wrap;\n max-height: 200px;\n overflow-y: auto;\n }\n\n /* Compact mode */\n :host([compact]) .tools { flex-direction: row; flex-wrap: wrap; }\n :host([compact]) .tool { padding: var(--cg-spacing-6) var(--cg-spacing-12); }\n :host([compact]) .result { display: none; }\n\n .tool:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .spinner { animation: none; }\n .tool { animation: none; }\n .tool.loading .tool-name { animation: none; -webkit-text-fill-color: currentColor; }\n }\n `];\n\n @property({ type: Array }) tools: ToolCall[] = [];\n @property({ type: Boolean, reflect: true }) compact = false;\n\n private _expandedIndex = -1;\n\n private _humanize(name: string): string {\n const map: Record<string, string> = {\n web_search: 'Searching the web',\n search: 'Searching',\n code_execution: 'Running code',\n code_interpreter: 'Running code',\n database: 'Querying database',\n database_query: 'Querying database',\n file_search: 'Searching files',\n file_read: 'Reading file',\n calculator: 'Calculating',\n image_generation: 'Generating image',\n browser: 'Browsing',\n retrieval: 'Retrieving data',\n api_call: 'Calling API',\n };\n return map[name] || name.replace(/_/g, ' ').replace(/\\b\\w/g, c => c.toUpperCase());\n }\n\n private _handleClick(index: number) {\n this._expandedIndex = this._expandedIndex === index ? -1 : index;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('ai-tool-click', {\n bubbles: true, composed: true,\n detail: { index, tool: this.tools[index] },\n }));\n }\n\n private _renderStatusIcon(status: string) {\n if (status === 'complete') return html`<span class=\"check\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg></span>`;\n if (status === 'error') return html`<span class=\"error-icon\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg></span>`;\n return html`<div class=\"spinner\"></div>`;\n }\n\n override render() {\n if (this.tools.length === 0) return nothing;\n\n return html`\n <div class=\"tools\" role=\"status\" aria-label=\"Tool calls\">\n ${this.tools.map((t, i) => html`\n <div class=\"tool ${t.status}\" style=\"--tool-index: ${i}\"\n role=\"button\" tabindex=\"0\"\n aria-label=\"${this._humanize(t.name)} — ${t.status}\"\n @click=${() => this._handleClick(i)}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this._handleClick(i); } }}>\n <span class=\"status-icon\">${this._renderStatusIcon(t.status)}</span>\n <span class=\"tool-name\">${this._humanize(t.name)}</span>\n </div>\n ${!this.compact && this._expandedIndex === i && t.result ? html`\n <div class=\"result\">${t.result}</div>\n ` : nothing}\n `)}\n </div>\n `;\n }\n}\n"],"names":["AiToolIndicator","LitElement","name","c","index","status","html","nothing","t","i","e","hostBlock","reducedMotion","css","__decorateClass","property","customElement"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { css as g, LitElement as h, html as c } from "lit";
2
2
  import { property as n, state as p, query as f, customElement as u } from "lit/decorators.js";
3
- import { h as v, r as b, g as m } from "../../chunks/premium.css-9I4kHrsl.js";
3
+ import { h as v, r as b, i as m } from "../../chunks/premium.css-DHekUEUt.js";
4
4
  var y = Object.defineProperty, w = Object.getOwnPropertyDescriptor, a = (t, r, i, s) => {
5
5
  for (var o = s > 1 ? void 0 : s ? w(r, i) : r, d = t.length - 1, l; d >= 0; d--)
6
6
  (l = t[d]) && (o = (s ? l(r, i, o) : l(o)) || o);
@@ -1,6 +1,6 @@
1
1
  import { css as p, LitElement as u, nothing as g, html as c } from "lit";
2
2
  import { property as o, state as v, customElement as h } from "lit/decorators.js";
3
- import { h as b, r as f, g as m } from "../../chunks/premium.css-9I4kHrsl.js";
3
+ import { h as b, r as f, i as m } from "../../chunks/premium.css-DHekUEUt.js";
4
4
  var x = Object.defineProperty, y = Object.getOwnPropertyDescriptor, r = (t, i, e, s) => {
5
5
  for (var n = s > 1 ? void 0 : s ? y(i, e) : i, l = t.length - 1, d; l >= 0; l--)
6
6
  (d = t[l]) && (n = (s ? d(i, e, n) : d(n)) || n);
@@ -273,7 +273,7 @@ a.styles = [b, f, m, p`
273
273
  }
274
274
  .alt-item:hover {
275
275
  border-color: var(--cg-color-input-border-hover);
276
- background: var(--cg-overlay-dark-subtle);
276
+ background: var(--cg-color-surface-cards-hover-background);
277
277
  }
278
278
  .alt-item:active { transform: scale(var(--cg-interaction-press-scale)); }
279
279
  .alt-item:focus-visible {
@@ -1 +1 @@
1
- {"version":3,"file":"ai-translation-panel.js","sources":["../../../src/components/ai-translation-panel/ai-translation-panel.ts"],"sourcesContent":["/**\n * @element ai-translation-panel\n * Split-pane translation interface with language selectors, confidence badge,\n * alternative translations, and copy buttons.\n *\n * Uses cg-button for actions, cg-badge for confidence display.\n *\n * @example\n * ```html\n * <ai-translation-panel\n * sourceText=\"Hello, how are you?\"\n * targetText=\"Hola, como estas?\"\n * sourceLang=\"en\"\n * targetLang=\"es\"\n * confidence=\"0.92\"\n * .alternatives=${[{ text: 'Hola, que tal?', confidence: 0.85 }]}\n * ></ai-translation-panel>\n * ```\n *\n * @fires {CustomEvent<{sourceText, sourceLang, targetLang}>} ai-translation-request - Translation requested\n * @fires {CustomEvent<{text, confidence}>} ai-translation-select-alt - Alternative selected\n * @fires {CustomEvent<{text, side}>} ai-translation-copy - Text copied\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, state, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeInKeyframes } from '../../styles/index.js';\n\ninterface TranslationAlternative {\n text: string;\n confidence: number;\n}\n\n@customElement('ai-translation-panel')\nexport class AiTranslationPanel extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeInKeyframes, css`\n :host {\n animation: fadeIn var(--cg-transition-duration-default) var(--cg-transition-easing-default);\n }\n\n .panel {\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-200);\n overflow: hidden;\n }\n\n /* ── Header ── */\n .header {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-16) var(--cg-spacing-20);\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-cards-divider);\n }\n .header-icon {\n width: var(--cg-spacing-20);\n height: var(--cg-spacing-20);\n color: var(--cg-color-surface-base-text);\n flex-shrink: 0;\n }\n .header-title {\n font-size: var(--cg-font-size-sm);\n font-weight: var(--cg-font-weight-bold);\n color: var(--cg-color-surface-base-text);\n flex: 1;\n }\n\n /* ── Split panes ── */\n .panes {\n display: grid;\n grid-template-columns: 1fr auto 1fr;\n }\n .pane {\n padding: var(--cg-spacing-16) var(--cg-spacing-20);\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-12);\n }\n .divider {\n width: var(--cg-border-width-50);\n background: var(--cg-color-surface-cards-divider);\n }\n\n .pane-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cg-spacing-8);\n }\n /* Lang selector sizing */\n .lang-select {\n min-width: var(--cg-spacing-96);\n }\n\n /* ── Text areas ── */\n .text-area {\n font-size: var(--cg-font-size-sm);\n color: var(--cg-color-surface-base-text);\n line-height: var(--cg-line-height-relaxed);\n min-height: var(--cg-spacing-80);\n word-break: break-word;\n }\n .text-area.muted {\n color: var(--cg-color-input-text-placeholder);\n font-style: italic;\n }\n\n /* ── Loading dots ── */\n .loading-dots {\n display: flex;\n gap: var(--cg-spacing-4);\n padding: var(--cg-spacing-8) 0;\n }\n .loading-dots span {\n width: var(--cg-spacing-6);\n height: var(--cg-spacing-6);\n border-radius: var(--cg-border-radius-full);\n background: var(--cg-color-action-primary-background-default);\n opacity: 0.4;\n animation: dotPulse 1s ease infinite;\n }\n .loading-dots span:nth-child(2) { animation-delay: 0.15s; }\n .loading-dots span:nth-child(3) { animation-delay: 0.3s; }\n @keyframes dotPulse { 50% { opacity: 1; } }\n\n /* ── Alternatives ── */\n .alternatives {\n border-top: var(--cg-border-width-50) solid var(--cg-color-surface-cards-divider);\n padding: var(--cg-spacing-12) var(--cg-spacing-20);\n }\n .alt-label {\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-semibold);\n color: var(--cg-color-input-text-placeholder);\n text-transform: uppercase;\n letter-spacing: var(--cg-letter-spacing-wide);\n margin-bottom: var(--cg-spacing-8);\n }\n .alt-list {\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-6);\n }\n .alt-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-8) var(--cg-spacing-12);\n background: var(--cg-color-surface-container-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-100);\n cursor: pointer;\n transition:\n border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n background var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .alt-item:hover {\n border-color: var(--cg-color-input-border-hover);\n background: var(--cg-overlay-dark-subtle);\n }\n .alt-item:active { transform: scale(var(--cg-interaction-press-scale)); }\n .alt-item:focus-visible {\n outline: none;\n box-shadow:\n 0 0 0 2px var(--cg-color-surface-base-background),\n 0 0 0 4px var(--cg-color-focus-ring);\n }\n .alt-text {\n font-size: var(--cg-font-size-sm);\n color: var(--cg-color-surface-base-text);\n }\n .alt-conf {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n white-space: nowrap;\n }\n\n /* ── Translate bar ── */\n .translate-bar {\n border-top: var(--cg-border-width-50) solid var(--cg-color-surface-cards-divider);\n padding: var(--cg-spacing-12) var(--cg-spacing-20);\n display: flex;\n justify-content: flex-end;\n }\n\n /* ── Rounded variants ── */\n :host([rounded=\"none\"]) .panel { border-radius: 0; }\n :host([rounded=\"sm\"]) .panel { border-radius: var(--cg-border-radius-50); }\n :host([rounded=\"md\"]) .panel { border-radius: var(--cg-border-radius-100); }\n :host([rounded=\"lg\"]) .panel { border-radius: var(--cg-border-radius-200); }\n\n @media (prefers-reduced-motion: reduce) {\n :host { animation: none; }\n .loading-dots span { animation: none; opacity: 0.6; }\n }\n `];\n\n @property({ reflect: true }) rounded: 'none' | 'sm' | 'md' | 'lg' = 'lg';\n @property({ type: String }) sourceText: string = '';\n @property({ type: String }) targetText: string = '';\n @property({ type: String }) sourceLang: string = 'en';\n @property({ type: String }) targetLang: string = 'es';\n @property({ type: Boolean }) loading: boolean = false;\n @property({ type: Number }) confidence: number = 0;\n @property({ type: Array }) alternatives: TranslationAlternative[] = [];\n\n @state() private _copiedSide: 'source' | 'target' | null = null;\n\n private _languages = [\n { code: 'en', label: 'English' },\n { code: 'es', label: 'Spanish' },\n { code: 'fr', label: 'French' },\n { code: 'de', label: 'German' },\n { code: 'pt', label: 'Portuguese' },\n { code: 'it', label: 'Italian' },\n { code: 'ja', label: 'Japanese' },\n { code: 'ko', label: 'Korean' },\n { code: 'zh', label: 'Chinese' },\n ];\n\n private _requestTranslation() {\n this.dispatchEvent(new CustomEvent('ai-translation-request', {\n bubbles: true, composed: true,\n detail: { sourceText: this.sourceText, sourceLang: this.sourceLang, targetLang: this.targetLang },\n }));\n }\n\n private _selectAlt(alt: TranslationAlternative) {\n this.dispatchEvent(new CustomEvent('ai-translation-select-alt', {\n bubbles: true, composed: true,\n detail: { text: alt.text, confidence: alt.confidence },\n }));\n }\n\n private _copy(text: string, side: 'source' | 'target') {\n navigator.clipboard?.writeText(text);\n this._copiedSide = side;\n setTimeout(() => { this._copiedSide = null; }, 2000);\n this.dispatchEvent(new CustomEvent('ai-translation-copy', {\n bubbles: true, composed: true,\n detail: { text, side },\n }));\n }\n\n override render() {\n const confPct = Math.round(this.confidence * 100);\n const isLow = this.confidence > 0 && this.confidence < 0.7;\n\n return html`\n <div class=\"panel\" role=\"region\" aria-label=\"Translation\">\n <div class=\"header\">\n <svg class=\"header-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 8l6 10\"/><path d=\"M4 14h8\"/><path d=\"M2 5h8\"/><path d=\"M7 2v3\"/><path d=\"M22 22l-5-10-5 10\"/><path d=\"M14 18h6\"/></svg>\n <span class=\"header-title\">Translation</span>\n ${this.confidence > 0 ? html`\n <cg-badge\n variant=${isLow ? 'warning' : 'success'}\n label=\"${confPct}% confidence\"\n size=\"sm\"\n rounded=\"full\"\n ></cg-badge>\n ` : nothing}\n </div>\n\n <div class=\"panes\">\n <div class=\"pane\">\n <div class=\"pane-header\">\n <cg-select class=\"lang-select\"\n size=\"sm\"\n label=\"Source\"\n .options=${this._languages.map(l => ({ value: l.code, label: l.label }))}\n .value=${this.sourceLang}\n @cg-change=${(e: CustomEvent) => { this.sourceLang = e.detail.value; }}\n ></cg-select>\n <cg-button variant=\"tertiary\" size=\"sm\"\n status=${this._copiedSide === 'source' ? 'success' : 'idle'}\n label=\"Copy source text\"\n @click=${() => this._copy(this.sourceText, 'source')}>\n <cg-icon slot=\"prefix\" name=${this._copiedSide === 'source' ? 'check' : 'copy'} size=\"xs\"></cg-icon>\n ${this._copiedSide === 'source' ? 'Copied' : 'Copy'}\n </cg-button>\n </div>\n <div class=\"text-area ${!this.sourceText ? 'muted' : ''}\">\n ${this.sourceText || 'Enter text to translate...'}\n </div>\n </div>\n\n <div class=\"divider\" aria-hidden=\"true\"></div>\n\n <div class=\"pane\">\n <div class=\"pane-header\">\n <cg-select class=\"lang-select\"\n size=\"sm\"\n label=\"Target\"\n .options=${this._languages.map(l => ({ value: l.code, label: l.label }))}\n .value=${this.targetLang}\n @cg-change=${(e: CustomEvent) => { this.targetLang = e.detail.value; }}\n ></cg-select>\n <cg-button variant=\"tertiary\" size=\"sm\"\n status=${this._copiedSide === 'target' ? 'success' : 'idle'}\n label=\"Copy translation\"\n @click=${() => this._copy(this.targetText, 'target')}>\n <cg-icon slot=\"prefix\" name=${this._copiedSide === 'target' ? 'check' : 'copy'} size=\"xs\"></cg-icon>\n ${this._copiedSide === 'target' ? 'Copied' : 'Copy'}\n </cg-button>\n </div>\n ${this.loading ? html`\n <div class=\"loading-dots\" role=\"status\" aria-label=\"Translating\">\n <span></span><span></span><span></span>\n </div>\n ` : html`\n <div class=\"text-area ${!this.targetText ? 'muted' : ''}\">\n ${this.targetText || 'Translation will appear here...'}\n </div>\n `}\n </div>\n </div>\n\n ${this.alternatives.length > 0 ? html`\n <div class=\"alternatives\">\n <div class=\"alt-label\">Alternative translations</div>\n <div class=\"alt-list\" role=\"listbox\" aria-label=\"Alternative translations\">\n ${this.alternatives.map(alt => html`\n <div class=\"alt-item\" tabindex=\"0\" role=\"option\"\n @click=${() => this._selectAlt(alt)}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this._selectAlt(alt); } }}>\n <span class=\"alt-text\">${alt.text}</span>\n <span class=\"alt-conf\">${Math.round(alt.confidence * 100)}%</span>\n </div>\n `)}\n </div>\n </div>\n ` : nothing}\n\n <div class=\"translate-bar\">\n <cg-button variant=\"primary\" size=\"sm\"\n ?disabled=${this.loading || !this.sourceText}\n ?loading=${this.loading}\n @click=${this._requestTranslation}>\n ${this.loading ? 'Translating...' : 'Translate'}\n </cg-button>\n </div>\n </div>\n `;\n }\n}\n"],"names":["AiTranslationPanel","LitElement","alt","text","side","confPct","isLow","html","nothing","l","e","hostBlock","reducedMotion","fadeInKeyframes","css","__decorateClass","property","state","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"ai-translation-panel.js","sources":["../../../src/components/ai-translation-panel/ai-translation-panel.ts"],"sourcesContent":["/**\n * @element ai-translation-panel\n * Split-pane translation interface with language selectors, confidence badge,\n * alternative translations, and copy buttons.\n *\n * Uses cg-button for actions, cg-badge for confidence display.\n *\n * @example\n * ```html\n * <ai-translation-panel\n * sourceText=\"Hello, how are you?\"\n * targetText=\"Hola, como estas?\"\n * sourceLang=\"en\"\n * targetLang=\"es\"\n * confidence=\"0.92\"\n * .alternatives=${[{ text: 'Hola, que tal?', confidence: 0.85 }]}\n * ></ai-translation-panel>\n * ```\n *\n * @fires {CustomEvent<{sourceText, sourceLang, targetLang}>} ai-translation-request - Translation requested\n * @fires {CustomEvent<{text, confidence}>} ai-translation-select-alt - Alternative selected\n * @fires {CustomEvent<{text, side}>} ai-translation-copy - Text copied\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, state, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeInKeyframes } from '../../styles/index.js';\n\ninterface TranslationAlternative {\n text: string;\n confidence: number;\n}\n\n@customElement('ai-translation-panel')\nexport class AiTranslationPanel extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeInKeyframes, css`\n :host {\n animation: fadeIn var(--cg-transition-duration-default) var(--cg-transition-easing-default);\n }\n\n .panel {\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-200);\n overflow: hidden;\n }\n\n /* ── Header ── */\n .header {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-16) var(--cg-spacing-20);\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-cards-divider);\n }\n .header-icon {\n width: var(--cg-spacing-20);\n height: var(--cg-spacing-20);\n color: var(--cg-color-surface-base-text);\n flex-shrink: 0;\n }\n .header-title {\n font-size: var(--cg-font-size-sm);\n font-weight: var(--cg-font-weight-bold);\n color: var(--cg-color-surface-base-text);\n flex: 1;\n }\n\n /* ── Split panes ── */\n .panes {\n display: grid;\n grid-template-columns: 1fr auto 1fr;\n }\n .pane {\n padding: var(--cg-spacing-16) var(--cg-spacing-20);\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-12);\n }\n .divider {\n width: var(--cg-border-width-50);\n background: var(--cg-color-surface-cards-divider);\n }\n\n .pane-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cg-spacing-8);\n }\n /* Lang selector sizing */\n .lang-select {\n min-width: var(--cg-spacing-96);\n }\n\n /* ── Text areas ── */\n .text-area {\n font-size: var(--cg-font-size-sm);\n color: var(--cg-color-surface-base-text);\n line-height: var(--cg-line-height-relaxed);\n min-height: var(--cg-spacing-80);\n word-break: break-word;\n }\n .text-area.muted {\n color: var(--cg-color-input-text-placeholder);\n font-style: italic;\n }\n\n /* ── Loading dots ── */\n .loading-dots {\n display: flex;\n gap: var(--cg-spacing-4);\n padding: var(--cg-spacing-8) 0;\n }\n .loading-dots span {\n width: var(--cg-spacing-6);\n height: var(--cg-spacing-6);\n border-radius: var(--cg-border-radius-full);\n background: var(--cg-color-action-primary-background-default);\n opacity: 0.4;\n animation: dotPulse 1s ease infinite;\n }\n .loading-dots span:nth-child(2) { animation-delay: 0.15s; }\n .loading-dots span:nth-child(3) { animation-delay: 0.3s; }\n @keyframes dotPulse { 50% { opacity: 1; } }\n\n /* ── Alternatives ── */\n .alternatives {\n border-top: var(--cg-border-width-50) solid var(--cg-color-surface-cards-divider);\n padding: var(--cg-spacing-12) var(--cg-spacing-20);\n }\n .alt-label {\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-semibold);\n color: var(--cg-color-input-text-placeholder);\n text-transform: uppercase;\n letter-spacing: var(--cg-letter-spacing-wide);\n margin-bottom: var(--cg-spacing-8);\n }\n .alt-list {\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-6);\n }\n .alt-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-8) var(--cg-spacing-12);\n background: var(--cg-color-surface-container-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-100);\n cursor: pointer;\n transition:\n border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n background var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .alt-item:hover {\n border-color: var(--cg-color-input-border-hover);\n background: var(--cg-color-surface-cards-hover-background);\n }\n .alt-item:active { transform: scale(var(--cg-interaction-press-scale)); }\n .alt-item:focus-visible {\n outline: none;\n box-shadow:\n 0 0 0 2px var(--cg-color-surface-base-background),\n 0 0 0 4px var(--cg-color-focus-ring);\n }\n .alt-text {\n font-size: var(--cg-font-size-sm);\n color: var(--cg-color-surface-base-text);\n }\n .alt-conf {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n white-space: nowrap;\n }\n\n /* ── Translate bar ── */\n .translate-bar {\n border-top: var(--cg-border-width-50) solid var(--cg-color-surface-cards-divider);\n padding: var(--cg-spacing-12) var(--cg-spacing-20);\n display: flex;\n justify-content: flex-end;\n }\n\n /* ── Rounded variants ── */\n :host([rounded=\"none\"]) .panel { border-radius: 0; }\n :host([rounded=\"sm\"]) .panel { border-radius: var(--cg-border-radius-50); }\n :host([rounded=\"md\"]) .panel { border-radius: var(--cg-border-radius-100); }\n :host([rounded=\"lg\"]) .panel { border-radius: var(--cg-border-radius-200); }\n\n @media (prefers-reduced-motion: reduce) {\n :host { animation: none; }\n .loading-dots span { animation: none; opacity: 0.6; }\n }\n `];\n\n @property({ reflect: true }) rounded: 'none' | 'sm' | 'md' | 'lg' = 'lg';\n @property({ type: String }) sourceText: string = '';\n @property({ type: String }) targetText: string = '';\n @property({ type: String }) sourceLang: string = 'en';\n @property({ type: String }) targetLang: string = 'es';\n @property({ type: Boolean }) loading: boolean = false;\n @property({ type: Number }) confidence: number = 0;\n @property({ type: Array }) alternatives: TranslationAlternative[] = [];\n\n @state() private _copiedSide: 'source' | 'target' | null = null;\n\n private _languages = [\n { code: 'en', label: 'English' },\n { code: 'es', label: 'Spanish' },\n { code: 'fr', label: 'French' },\n { code: 'de', label: 'German' },\n { code: 'pt', label: 'Portuguese' },\n { code: 'it', label: 'Italian' },\n { code: 'ja', label: 'Japanese' },\n { code: 'ko', label: 'Korean' },\n { code: 'zh', label: 'Chinese' },\n ];\n\n private _requestTranslation() {\n this.dispatchEvent(new CustomEvent('ai-translation-request', {\n bubbles: true, composed: true,\n detail: { sourceText: this.sourceText, sourceLang: this.sourceLang, targetLang: this.targetLang },\n }));\n }\n\n private _selectAlt(alt: TranslationAlternative) {\n this.dispatchEvent(new CustomEvent('ai-translation-select-alt', {\n bubbles: true, composed: true,\n detail: { text: alt.text, confidence: alt.confidence },\n }));\n }\n\n private _copy(text: string, side: 'source' | 'target') {\n navigator.clipboard?.writeText(text);\n this._copiedSide = side;\n setTimeout(() => { this._copiedSide = null; }, 2000);\n this.dispatchEvent(new CustomEvent('ai-translation-copy', {\n bubbles: true, composed: true,\n detail: { text, side },\n }));\n }\n\n override render() {\n const confPct = Math.round(this.confidence * 100);\n const isLow = this.confidence > 0 && this.confidence < 0.7;\n\n return html`\n <div class=\"panel\" role=\"region\" aria-label=\"Translation\">\n <div class=\"header\">\n <svg class=\"header-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 8l6 10\"/><path d=\"M4 14h8\"/><path d=\"M2 5h8\"/><path d=\"M7 2v3\"/><path d=\"M22 22l-5-10-5 10\"/><path d=\"M14 18h6\"/></svg>\n <span class=\"header-title\">Translation</span>\n ${this.confidence > 0 ? html`\n <cg-badge\n variant=${isLow ? 'warning' : 'success'}\n label=\"${confPct}% confidence\"\n size=\"sm\"\n rounded=\"full\"\n ></cg-badge>\n ` : nothing}\n </div>\n\n <div class=\"panes\">\n <div class=\"pane\">\n <div class=\"pane-header\">\n <cg-select class=\"lang-select\"\n size=\"sm\"\n label=\"Source\"\n .options=${this._languages.map(l => ({ value: l.code, label: l.label }))}\n .value=${this.sourceLang}\n @cg-change=${(e: CustomEvent) => { this.sourceLang = e.detail.value; }}\n ></cg-select>\n <cg-button variant=\"tertiary\" size=\"sm\"\n status=${this._copiedSide === 'source' ? 'success' : 'idle'}\n label=\"Copy source text\"\n @click=${() => this._copy(this.sourceText, 'source')}>\n <cg-icon slot=\"prefix\" name=${this._copiedSide === 'source' ? 'check' : 'copy'} size=\"xs\"></cg-icon>\n ${this._copiedSide === 'source' ? 'Copied' : 'Copy'}\n </cg-button>\n </div>\n <div class=\"text-area ${!this.sourceText ? 'muted' : ''}\">\n ${this.sourceText || 'Enter text to translate...'}\n </div>\n </div>\n\n <div class=\"divider\" aria-hidden=\"true\"></div>\n\n <div class=\"pane\">\n <div class=\"pane-header\">\n <cg-select class=\"lang-select\"\n size=\"sm\"\n label=\"Target\"\n .options=${this._languages.map(l => ({ value: l.code, label: l.label }))}\n .value=${this.targetLang}\n @cg-change=${(e: CustomEvent) => { this.targetLang = e.detail.value; }}\n ></cg-select>\n <cg-button variant=\"tertiary\" size=\"sm\"\n status=${this._copiedSide === 'target' ? 'success' : 'idle'}\n label=\"Copy translation\"\n @click=${() => this._copy(this.targetText, 'target')}>\n <cg-icon slot=\"prefix\" name=${this._copiedSide === 'target' ? 'check' : 'copy'} size=\"xs\"></cg-icon>\n ${this._copiedSide === 'target' ? 'Copied' : 'Copy'}\n </cg-button>\n </div>\n ${this.loading ? html`\n <div class=\"loading-dots\" role=\"status\" aria-label=\"Translating\">\n <span></span><span></span><span></span>\n </div>\n ` : html`\n <div class=\"text-area ${!this.targetText ? 'muted' : ''}\">\n ${this.targetText || 'Translation will appear here...'}\n </div>\n `}\n </div>\n </div>\n\n ${this.alternatives.length > 0 ? html`\n <div class=\"alternatives\">\n <div class=\"alt-label\">Alternative translations</div>\n <div class=\"alt-list\" role=\"listbox\" aria-label=\"Alternative translations\">\n ${this.alternatives.map(alt => html`\n <div class=\"alt-item\" tabindex=\"0\" role=\"option\"\n @click=${() => this._selectAlt(alt)}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this._selectAlt(alt); } }}>\n <span class=\"alt-text\">${alt.text}</span>\n <span class=\"alt-conf\">${Math.round(alt.confidence * 100)}%</span>\n </div>\n `)}\n </div>\n </div>\n ` : nothing}\n\n <div class=\"translate-bar\">\n <cg-button variant=\"primary\" size=\"sm\"\n ?disabled=${this.loading || !this.sourceText}\n ?loading=${this.loading}\n @click=${this._requestTranslation}>\n ${this.loading ? 'Translating...' : 'Translate'}\n </cg-button>\n </div>\n </div>\n `;\n }\n}\n"],"names":["AiTranslationPanel","LitElement","alt","text","side","confPct","isLow","html","nothing","l","e","hostBlock","reducedMotion","fadeInKeyframes","css","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { css as _, LitElement as w, html as g, nothing as v } from "lit";
2
2
  import { property as d, state as p, customElement as x } from "lit/decorators.js";
3
- import { a as b, r as y, f as $ } from "../../chunks/premium.css-9I4kHrsl.js";
3
+ import { a as b, r as y, f as $ } from "../../chunks/premium.css-DHekUEUt.js";
4
4
  import "../cg-card/cg-card.js";
5
5
  import "../cg-text/cg-text.js";
6
6
  import "../cg-button/cg-button.js";