@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.
- package/dist/chunks/focus-trap-vlQwKK-3.js +82 -0
- package/dist/chunks/focus-trap-vlQwKK-3.js.map +1 -0
- package/dist/chunks/{premium.css-9I4kHrsl.js → premium.css-DHekUEUt.js} +25 -25
- package/dist/chunks/{premium.css-9I4kHrsl.js.map → premium.css-DHekUEUt.js.map} +1 -1
- package/dist/cognivo.min.js +3375 -5270
- package/dist/cognivo.min.js.map +1 -1
- package/dist/components/ai-ab-test/ai-ab-test.js +1 -1
- package/dist/components/ai-accessibility-report/ai-accessibility-report.d.ts.map +1 -1
- package/dist/components/ai-accessibility-report/ai-accessibility-report.js +14 -13
- package/dist/components/ai-accessibility-report/ai-accessibility-report.js.map +1 -1
- package/dist/components/ai-action-preview/ai-action-preview.d.ts.map +1 -1
- package/dist/components/ai-action-preview/ai-action-preview.js +15 -14
- package/dist/components/ai-action-preview/ai-action-preview.js.map +1 -1
- package/dist/components/ai-agent-card/ai-agent-card.js +1 -1
- package/dist/components/ai-agent-steps/ai-agent-steps.d.ts +8 -21
- package/dist/components/ai-agent-steps/ai-agent-steps.d.ts.map +1 -1
- package/dist/components/ai-agent-steps/ai-agent-steps.js +85 -139
- package/dist/components/ai-agent-steps/ai-agent-steps.js.map +1 -1
- package/dist/components/ai-alert-card/ai-alert-card.js +5 -5
- package/dist/components/ai-alert-card/ai-alert-card.js.map +1 -1
- package/dist/components/ai-analytics-chart/ai-analytics-chart.d.ts +0 -13
- package/dist/components/ai-analytics-chart/ai-analytics-chart.d.ts.map +1 -1
- package/dist/components/ai-analytics-chart/ai-analytics-chart.js +75 -125
- package/dist/components/ai-analytics-chart/ai-analytics-chart.js.map +1 -1
- package/dist/components/ai-annotation/ai-annotation.js +2 -2
- package/dist/components/ai-annotation/ai-annotation.js.map +1 -1
- package/dist/components/ai-api-key-manager/ai-api-key-manager.d.ts +0 -9
- package/dist/components/ai-api-key-manager/ai-api-key-manager.d.ts.map +1 -1
- package/dist/components/ai-api-key-manager/ai-api-key-manager.js +115 -276
- package/dist/components/ai-api-key-manager/ai-api-key-manager.js.map +1 -1
- package/dist/components/ai-app-sidebar/ai-app-sidebar.js +13 -13
- package/dist/components/ai-app-sidebar/ai-app-sidebar.js.map +1 -1
- package/dist/components/ai-assistant-widget/ai-assistant-widget.d.ts.map +1 -1
- package/dist/components/ai-assistant-widget/ai-assistant-widget.js +5 -2
- package/dist/components/ai-assistant-widget/ai-assistant-widget.js.map +1 -1
- package/dist/components/ai-audio-player/ai-audio-player.d.ts.map +1 -1
- package/dist/components/ai-audio-player/ai-audio-player.js +23 -19
- package/dist/components/ai-audio-player/ai-audio-player.js.map +1 -1
- package/dist/components/ai-avatar/ai-avatar.js +1 -1
- package/dist/components/ai-badge/ai-badge.js +1 -1
- package/dist/components/ai-batch-progress/ai-batch-progress.js +6 -6
- package/dist/components/ai-batch-progress/ai-batch-progress.js.map +1 -1
- package/dist/components/ai-cache-indicator/ai-cache-indicator.d.ts +0 -13
- package/dist/components/ai-cache-indicator/ai-cache-indicator.d.ts.map +1 -1
- package/dist/components/ai-cache-indicator/ai-cache-indicator.js +90 -185
- package/dist/components/ai-cache-indicator/ai-cache-indicator.js.map +1 -1
- package/dist/components/ai-capture-flow/ai-capture-flow.js +21 -21
- package/dist/components/ai-capture-flow/ai-capture-flow.js.map +1 -1
- package/dist/components/ai-changelog/ai-changelog.js +26 -26
- package/dist/components/ai-changelog/ai-changelog.js.map +1 -1
- package/dist/components/ai-chart-summary/ai-chart-summary.d.ts +0 -6
- package/dist/components/ai-chart-summary/ai-chart-summary.d.ts.map +1 -1
- package/dist/components/ai-chart-summary/ai-chart-summary.js +100 -103
- package/dist/components/ai-chart-summary/ai-chart-summary.js.map +1 -1
- package/dist/components/ai-chat/ai-chat.d.ts.map +1 -1
- package/dist/components/ai-chat/ai-chat.js +9 -3
- package/dist/components/ai-chat/ai-chat.js.map +1 -1
- package/dist/components/ai-citation/ai-citation.d.ts +0 -6
- package/dist/components/ai-citation/ai-citation.d.ts.map +1 -1
- package/dist/components/ai-citation/ai-citation.js +64 -90
- package/dist/components/ai-citation/ai-citation.js.map +1 -1
- package/dist/components/ai-collaborative-editor/ai-collaborative-editor.d.ts +1 -27
- package/dist/components/ai-collaborative-editor/ai-collaborative-editor.d.ts.map +1 -1
- package/dist/components/ai-collaborative-editor/ai-collaborative-editor.js +114 -260
- package/dist/components/ai-collaborative-editor/ai-collaborative-editor.js.map +1 -1
- package/dist/components/ai-command-palette/ai-command-palette.js +1 -1
- package/dist/components/ai-confidence-badge/ai-confidence-badge.d.ts +11 -9
- package/dist/components/ai-confidence-badge/ai-confidence-badge.d.ts.map +1 -1
- package/dist/components/ai-confidence-badge/ai-confidence-badge.js +183 -101
- package/dist/components/ai-confidence-badge/ai-confidence-badge.js.map +1 -1
- package/dist/components/ai-confidence-slider/ai-confidence-slider.js +27 -27
- package/dist/components/ai-confidence-slider/ai-confidence-slider.js.map +1 -1
- package/dist/components/ai-consent-manager/ai-consent-manager.js +2 -2
- package/dist/components/ai-consent-manager/ai-consent-manager.js.map +1 -1
- package/dist/components/ai-context-window/ai-context-window.js +19 -19
- package/dist/components/ai-context-window/ai-context-window.js.map +1 -1
- package/dist/components/ai-copy-button/ai-copy-button.js +4 -4
- package/dist/components/ai-copy-button/ai-copy-button.js.map +1 -1
- package/dist/components/ai-cost-dashboard/ai-cost-dashboard.js +14 -14
- package/dist/components/ai-cost-dashboard/ai-cost-dashboard.js.map +1 -1
- package/dist/components/ai-data-card/ai-data-card.js +2 -2
- package/dist/components/ai-data-card/ai-data-card.js.map +1 -1
- package/dist/components/ai-data-lineage/ai-data-lineage.js +6 -6
- package/dist/components/ai-data-lineage/ai-data-lineage.js.map +1 -1
- package/dist/components/ai-data-preview/ai-data-preview.d.ts +0 -7
- package/dist/components/ai-data-preview/ai-data-preview.d.ts.map +1 -1
- package/dist/components/ai-data-preview/ai-data-preview.js +130 -267
- package/dist/components/ai-data-preview/ai-data-preview.js.map +1 -1
- package/dist/components/ai-data-table/ai-data-table.js +9 -9
- package/dist/components/ai-data-table/ai-data-table.js.map +1 -1
- package/dist/components/ai-debug-console/ai-debug-console.d.ts +1 -13
- package/dist/components/ai-debug-console/ai-debug-console.d.ts.map +1 -1
- package/dist/components/ai-debug-console/ai-debug-console.js +134 -340
- package/dist/components/ai-debug-console/ai-debug-console.js.map +1 -1
- package/dist/components/ai-detection-canvas/ai-detection-canvas.js +2 -2
- package/dist/components/ai-detection-canvas/ai-detection-canvas.js.map +1 -1
- package/dist/components/ai-diff-panel/ai-diff-panel.js +1 -1
- package/dist/components/ai-embedding-viz/ai-embedding-viz.js +4 -4
- package/dist/components/ai-embedding-viz/ai-embedding-viz.js.map +1 -1
- package/dist/components/ai-empty-state/ai-empty-state.js +1 -1
- package/dist/components/ai-error-boundary/ai-error-boundary.d.ts.map +1 -1
- package/dist/components/ai-error-boundary/ai-error-boundary.js +26 -21
- package/dist/components/ai-error-boundary/ai-error-boundary.js.map +1 -1
- package/dist/components/ai-eval-scorecard/ai-eval-scorecard.js +5 -5
- package/dist/components/ai-eval-scorecard/ai-eval-scorecard.js.map +1 -1
- package/dist/components/ai-feature-flag/ai-feature-flag.d.ts +0 -14
- package/dist/components/ai-feature-flag/ai-feature-flag.d.ts.map +1 -1
- package/dist/components/ai-feature-flag/ai-feature-flag.js +181 -322
- package/dist/components/ai-feature-flag/ai-feature-flag.js.map +1 -1
- package/dist/components/ai-feedback/ai-feedback.d.ts.map +1 -1
- package/dist/components/ai-feedback/ai-feedback.js +10 -5
- package/dist/components/ai-feedback/ai-feedback.js.map +1 -1
- package/dist/components/ai-file-upload/ai-file-upload.js +1 -1
- package/dist/components/ai-form-generator/ai-form-generator.js +1 -1
- package/dist/components/ai-guardrail/ai-guardrail.js +2 -2
- package/dist/components/ai-guardrail/ai-guardrail.js.map +1 -1
- package/dist/components/ai-heatmap/ai-heatmap.js +1 -1
- package/dist/components/ai-insight-card/ai-insight-card.js +4 -4
- package/dist/components/ai-insight-card/ai-insight-card.js.map +1 -1
- package/dist/components/ai-json-viewer/ai-json-viewer.js +13 -13
- package/dist/components/ai-json-viewer/ai-json-viewer.js.map +1 -1
- package/dist/components/ai-keyboard-shortcuts/ai-keyboard-shortcuts.js +24 -24
- package/dist/components/ai-keyboard-shortcuts/ai-keyboard-shortcuts.js.map +1 -1
- package/dist/components/ai-kpi-grid/ai-kpi-grid.js +2 -2
- package/dist/components/ai-kpi-grid/ai-kpi-grid.js.map +1 -1
- package/dist/components/ai-labeling-board/ai-labeling-board.js +11 -11
- package/dist/components/ai-labeling-board/ai-labeling-board.js.map +1 -1
- package/dist/components/ai-memory-panel/ai-memory-panel.js +7 -7
- package/dist/components/ai-memory-panel/ai-memory-panel.js.map +1 -1
- package/dist/components/ai-model-comparison/ai-model-comparison.js +2 -2
- package/dist/components/ai-model-comparison/ai-model-comparison.js.map +1 -1
- package/dist/components/ai-model-selector/ai-model-selector.js +7 -7
- package/dist/components/ai-model-selector/ai-model-selector.js.map +1 -1
- package/dist/components/ai-notification-center/ai-notification-center.js +27 -27
- package/dist/components/ai-notification-center/ai-notification-center.js.map +1 -1
- package/dist/components/ai-onboarding/ai-onboarding.js +5 -5
- package/dist/components/ai-onboarding/ai-onboarding.js.map +1 -1
- package/dist/components/ai-permission-gate/ai-permission-gate.js +1 -1
- package/dist/components/ai-personalization-dash/ai-personalization-dash.js +1 -1
- package/dist/components/ai-presence/ai-presence.js +25 -25
- package/dist/components/ai-presence/ai-presence.js.map +1 -1
- package/dist/components/ai-progress-steps/ai-progress-steps.js +11 -11
- package/dist/components/ai-progress-steps/ai-progress-steps.js.map +1 -1
- package/dist/components/ai-prompt-editor/ai-prompt-editor.js +1 -1
- package/dist/components/ai-prompt-template/ai-prompt-template.js +29 -29
- package/dist/components/ai-prompt-template/ai-prompt-template.js.map +1 -1
- package/dist/components/ai-rag-panel/ai-rag-panel.js +4 -4
- package/dist/components/ai-rag-panel/ai-rag-panel.js.map +1 -1
- package/dist/components/ai-reasoning-tree/ai-reasoning-tree.js +16 -16
- package/dist/components/ai-reasoning-tree/ai-reasoning-tree.js.map +1 -1
- package/dist/components/ai-result-panel/ai-result-panel.js +1 -1
- package/dist/components/ai-reveal-animation/ai-reveal-animation.js +3 -3
- package/dist/components/ai-reveal-animation/ai-reveal-animation.js.map +1 -1
- package/dist/components/ai-reward-signal/ai-reward-signal.js +1 -1
- package/dist/components/ai-rich-message/ai-rich-message.d.ts.map +1 -1
- package/dist/components/ai-rich-message/ai-rich-message.js +37 -30
- package/dist/components/ai-rich-message/ai-rich-message.js.map +1 -1
- package/dist/components/ai-scenario-panel/ai-scenario-panel.js +10 -10
- package/dist/components/ai-scenario-panel/ai-scenario-panel.js.map +1 -1
- package/dist/components/ai-search/ai-search.js +1 -1
- package/dist/components/ai-segmentation-viewer/ai-segmentation-viewer.js +3 -3
- package/dist/components/ai-segmentation-viewer/ai-segmentation-viewer.js.map +1 -1
- package/dist/components/ai-sidebar/ai-sidebar.js +1 -1
- package/dist/components/ai-similarity-card/ai-similarity-card.js +1 -1
- package/dist/components/ai-source-graph/ai-source-graph.js +2 -2
- package/dist/components/ai-source-graph/ai-source-graph.js.map +1 -1
- package/dist/components/ai-status-page/ai-status-page.js +15 -15
- package/dist/components/ai-status-page/ai-status-page.js.map +1 -1
- package/dist/components/ai-streaming-text/ai-streaming-text.js +1 -1
- package/dist/components/ai-test-runner/ai-test-runner.d.ts +0 -8
- package/dist/components/ai-test-runner/ai-test-runner.d.ts.map +1 -1
- package/dist/components/ai-test-runner/ai-test-runner.js +100 -257
- package/dist/components/ai-test-runner/ai-test-runner.js.map +1 -1
- package/dist/components/ai-thinking/ai-thinking.js +1 -1
- package/dist/components/ai-timeline/ai-timeline.js +2 -2
- package/dist/components/ai-timeline/ai-timeline.js.map +1 -1
- package/dist/components/ai-token-tracker/ai-token-tracker.js +3 -3
- package/dist/components/ai-token-tracker/ai-token-tracker.js.map +1 -1
- package/dist/components/ai-tool-card-resolver/ai-tool-card-resolver.js +23 -23
- package/dist/components/ai-tool-card-resolver/ai-tool-card-resolver.js.map +1 -1
- package/dist/components/ai-tool-indicator/ai-tool-indicator.js +3 -3
- package/dist/components/ai-tool-indicator/ai-tool-indicator.js.map +1 -1
- package/dist/components/ai-transform-slider/ai-transform-slider.js +1 -1
- package/dist/components/ai-translation-panel/ai-translation-panel.js +2 -2
- package/dist/components/ai-translation-panel/ai-translation-panel.js.map +1 -1
- package/dist/components/ai-usage-meter/ai-usage-meter.js +1 -1
- package/dist/components/ai-validation-checklist/ai-validation-checklist.d.ts +1 -11
- package/dist/components/ai-validation-checklist/ai-validation-checklist.d.ts.map +1 -1
- package/dist/components/ai-validation-checklist/ai-validation-checklist.js +133 -187
- package/dist/components/ai-validation-checklist/ai-validation-checklist.js.map +1 -1
- package/dist/components/ai-version-selector/ai-version-selector.d.ts +0 -4
- package/dist/components/ai-version-selector/ai-version-selector.d.ts.map +1 -1
- package/dist/components/ai-version-selector/ai-version-selector.js +189 -210
- package/dist/components/ai-version-selector/ai-version-selector.js.map +1 -1
- package/dist/components/ai-voice-panel/ai-voice-panel.js +28 -28
- package/dist/components/ai-voice-panel/ai-voice-panel.js.map +1 -1
- package/dist/components/ai-webhook-config/ai-webhook-config.d.ts +0 -17
- package/dist/components/ai-webhook-config/ai-webhook-config.d.ts.map +1 -1
- package/dist/components/ai-webhook-config/ai-webhook-config.js +281 -221
- package/dist/components/ai-webhook-config/ai-webhook-config.js.map +1 -1
- package/dist/components/ai-workflow-builder/ai-workflow-builder.js +2 -2
- package/dist/components/ai-workflow-builder/ai-workflow-builder.js.map +1 -1
- package/dist/components/bias-anchoring/bias-anchoring.js +1 -1
- package/dist/components/bias-authority/bias-authority.js +1 -1
- package/dist/components/bias-commitment/bias-commitment.js +1 -1
- package/dist/components/bias-reciprocity/bias-reciprocity.js +1 -1
- package/dist/components/bias-scarcity/bias-scarcity.js +1 -1
- package/dist/components/bias-social-proof/bias-social-proof.js +1 -1
- package/dist/components/cg-accordion/cg-accordion.d.ts.map +1 -1
- package/dist/components/cg-accordion/cg-accordion.js +51 -43
- package/dist/components/cg-accordion/cg-accordion.js.map +1 -1
- package/dist/components/cg-alert-dialog/cg-alert-dialog.js +18 -18
- package/dist/components/cg-alert-dialog/cg-alert-dialog.js.map +1 -1
- package/dist/components/cg-aspect-ratio/cg-aspect-ratio.d.ts.map +1 -1
- package/dist/components/cg-aspect-ratio/cg-aspect-ratio.js +25 -21
- package/dist/components/cg-aspect-ratio/cg-aspect-ratio.js.map +1 -1
- package/dist/components/cg-autocomplete/cg-autocomplete.d.ts +1 -0
- package/dist/components/cg-autocomplete/cg-autocomplete.d.ts.map +1 -1
- package/dist/components/cg-autocomplete/cg-autocomplete.js +59 -43
- package/dist/components/cg-autocomplete/cg-autocomplete.js.map +1 -1
- package/dist/components/cg-avatar/cg-avatar.d.ts.map +1 -1
- package/dist/components/cg-avatar/cg-avatar.js +24 -24
- package/dist/components/cg-avatar/cg-avatar.js.map +1 -1
- package/dist/components/cg-avatar-group/cg-avatar-group.d.ts.map +1 -1
- package/dist/components/cg-avatar-group/cg-avatar-group.js +18 -12
- package/dist/components/cg-avatar-group/cg-avatar-group.js.map +1 -1
- package/dist/components/cg-badge/cg-badge.d.ts.map +1 -1
- package/dist/components/cg-badge/cg-badge.js +26 -20
- package/dist/components/cg-badge/cg-badge.js.map +1 -1
- package/dist/components/cg-badge-group/cg-badge-group.d.ts +0 -1
- package/dist/components/cg-badge-group/cg-badge-group.d.ts.map +1 -1
- package/dist/components/cg-badge-group/cg-badge-group.js +31 -29
- package/dist/components/cg-badge-group/cg-badge-group.js.map +1 -1
- package/dist/components/cg-breadcrumbs/cg-breadcrumbs.js +21 -21
- package/dist/components/cg-breadcrumbs/cg-breadcrumbs.js.map +1 -1
- package/dist/components/cg-button/cg-button.d.ts +5 -71
- package/dist/components/cg-button/cg-button.d.ts.map +1 -1
- package/dist/components/cg-button/cg-button.js +63 -172
- package/dist/components/cg-button/cg-button.js.map +1 -1
- package/dist/components/cg-button-group/cg-button-group.d.ts +2 -0
- package/dist/components/cg-button-group/cg-button-group.d.ts.map +1 -1
- package/dist/components/cg-button-group/cg-button-group.js +43 -29
- package/dist/components/cg-button-group/cg-button-group.js.map +1 -1
- package/dist/components/cg-calendar/cg-calendar.d.ts +4 -0
- package/dist/components/cg-calendar/cg-calendar.d.ts.map +1 -1
- package/dist/components/cg-calendar/cg-calendar.js +28 -12
- package/dist/components/cg-calendar/cg-calendar.js.map +1 -1
- package/dist/components/cg-callout/cg-callout.d.ts.map +1 -1
- package/dist/components/cg-callout/cg-callout.js +49 -48
- package/dist/components/cg-callout/cg-callout.js.map +1 -1
- package/dist/components/cg-card/cg-card.d.ts +9 -22
- package/dist/components/cg-card/cg-card.d.ts.map +1 -1
- package/dist/components/cg-card/cg-card.js +28 -56
- package/dist/components/cg-card/cg-card.js.map +1 -1
- package/dist/components/cg-carousel/cg-carousel.d.ts.map +1 -1
- package/dist/components/cg-carousel/cg-carousel.js +19 -13
- package/dist/components/cg-carousel/cg-carousel.js.map +1 -1
- package/dist/components/cg-chart/cg-chart.d.ts.map +1 -1
- package/dist/components/cg-chart/cg-chart.js +63 -58
- package/dist/components/cg-chart/cg-chart.js.map +1 -1
- package/dist/components/cg-checkbox/cg-checkbox.d.ts +0 -6
- package/dist/components/cg-checkbox/cg-checkbox.d.ts.map +1 -1
- package/dist/components/cg-checkbox/cg-checkbox.js +51 -51
- package/dist/components/cg-checkbox/cg-checkbox.js.map +1 -1
- package/dist/components/cg-chip/cg-chip.js +31 -31
- package/dist/components/cg-chip/cg-chip.js.map +1 -1
- package/dist/components/cg-code-block/cg-code-block.d.ts.map +1 -1
- package/dist/components/cg-code-block/cg-code-block.js +36 -34
- package/dist/components/cg-code-block/cg-code-block.js.map +1 -1
- package/dist/components/cg-collapsible/cg-collapsible.d.ts.map +1 -1
- package/dist/components/cg-collapsible/cg-collapsible.js +23 -18
- package/dist/components/cg-collapsible/cg-collapsible.js.map +1 -1
- package/dist/components/cg-color-picker/cg-color-picker.d.ts +3 -0
- package/dist/components/cg-color-picker/cg-color-picker.d.ts.map +1 -1
- package/dist/components/cg-color-picker/cg-color-picker.js +189 -91
- package/dist/components/cg-color-picker/cg-color-picker.js.map +1 -1
- package/dist/components/cg-combobox/cg-combobox.d.ts.map +1 -1
- package/dist/components/cg-combobox/cg-combobox.js +13 -6
- package/dist/components/cg-combobox/cg-combobox.js.map +1 -1
- package/dist/components/cg-command/cg-command.d.ts.map +1 -1
- package/dist/components/cg-command/cg-command.js +52 -45
- package/dist/components/cg-command/cg-command.js.map +1 -1
- package/dist/components/cg-context-menu/cg-context-menu.js +1 -1
- package/dist/components/cg-date-picker/cg-date-picker.d.ts.map +1 -1
- package/dist/components/cg-date-picker/cg-date-picker.js +36 -34
- package/dist/components/cg-date-picker/cg-date-picker.js.map +1 -1
- package/dist/components/cg-date-range-picker/cg-date-range-picker.d.ts +2 -0
- package/dist/components/cg-date-range-picker/cg-date-range-picker.d.ts.map +1 -1
- package/dist/components/cg-date-range-picker/cg-date-range-picker.js +12 -8
- package/dist/components/cg-date-range-picker/cg-date-range-picker.js.map +1 -1
- package/dist/components/cg-date-time-picker/cg-date-time-picker.d.ts.map +1 -1
- package/dist/components/cg-date-time-picker/cg-date-time-picker.js +3 -1
- package/dist/components/cg-date-time-picker/cg-date-time-picker.js.map +1 -1
- package/dist/components/cg-drawer/cg-drawer.js +3 -3
- package/dist/components/cg-drawer/cg-drawer.js.map +1 -1
- package/dist/components/cg-dropdown/cg-dropdown.d.ts.map +1 -1
- package/dist/components/cg-dropdown/cg-dropdown.js +1 -2
- package/dist/components/cg-dropdown/cg-dropdown.js.map +1 -1
- package/dist/components/cg-empty-state/cg-empty-state.d.ts +3 -24
- package/dist/components/cg-empty-state/cg-empty-state.d.ts.map +1 -1
- package/dist/components/cg-empty-state/cg-empty-state.js +51 -74
- package/dist/components/cg-empty-state/cg-empty-state.js.map +1 -1
- package/dist/components/cg-file-input/cg-file-input.d.ts.map +1 -1
- package/dist/components/cg-file-input/cg-file-input.js +9 -10
- package/dist/components/cg-file-input/cg-file-input.js.map +1 -1
- package/dist/components/cg-focus-scope/cg-focus-scope.js +1 -1
- package/dist/components/cg-follow-up/cg-follow-up.d.ts.map +1 -1
- package/dist/components/cg-follow-up/cg-follow-up.js +6 -7
- package/dist/components/cg-follow-up/cg-follow-up.js.map +1 -1
- package/dist/components/cg-form/cg-form.js +17 -17
- package/dist/components/cg-form/cg-form.js.map +1 -1
- package/dist/components/cg-hover-card/cg-hover-card.d.ts +1 -0
- package/dist/components/cg-hover-card/cg-hover-card.d.ts.map +1 -1
- package/dist/components/cg-hover-card/cg-hover-card.js +37 -32
- package/dist/components/cg-hover-card/cg-hover-card.js.map +1 -1
- package/dist/components/cg-icon/cg-icon.d.ts.map +1 -1
- package/dist/components/cg-icon/cg-icon.js +44 -37
- package/dist/components/cg-icon/cg-icon.js.map +1 -1
- package/dist/components/cg-image/cg-image.js +2 -2
- package/dist/components/cg-image/cg-image.js.map +1 -1
- package/dist/components/cg-image-block/cg-image-block.js +3 -3
- package/dist/components/cg-image-block/cg-image-block.js.map +1 -1
- package/dist/components/cg-image-gallery/cg-image-gallery.js +20 -20
- package/dist/components/cg-image-gallery/cg-image-gallery.js.map +1 -1
- package/dist/components/cg-input/cg-input.js +3 -3
- package/dist/components/cg-input/cg-input.js.map +1 -1
- package/dist/components/cg-kbd/cg-kbd.d.ts.map +1 -1
- package/dist/components/cg-kbd/cg-kbd.js +26 -24
- package/dist/components/cg-kbd/cg-kbd.js.map +1 -1
- package/dist/components/cg-label/cg-label.d.ts +4 -1
- package/dist/components/cg-label/cg-label.d.ts.map +1 -1
- package/dist/components/cg-label/cg-label.js +44 -41
- package/dist/components/cg-label/cg-label.js.map +1 -1
- package/dist/components/cg-link/cg-link.js +23 -23
- package/dist/components/cg-link/cg-link.js.map +1 -1
- package/dist/components/cg-list/cg-list.js +5 -5
- package/dist/components/cg-list/cg-list.js.map +1 -1
- package/dist/components/cg-listbox/cg-listbox.d.ts.map +1 -1
- package/dist/components/cg-listbox/cg-listbox.js +46 -40
- package/dist/components/cg-listbox/cg-listbox.js.map +1 -1
- package/dist/components/cg-markdown/cg-markdown.d.ts +2 -0
- package/dist/components/cg-markdown/cg-markdown.d.ts.map +1 -1
- package/dist/components/cg-markdown/cg-markdown.js +171 -121
- package/dist/components/cg-markdown/cg-markdown.js.map +1 -1
- package/dist/components/cg-menubar/cg-menubar.d.ts +6 -0
- package/dist/components/cg-menubar/cg-menubar.d.ts.map +1 -1
- package/dist/components/cg-menubar/cg-menubar.js +59 -47
- package/dist/components/cg-menubar/cg-menubar.js.map +1 -1
- package/dist/components/cg-meter/cg-meter.d.ts.map +1 -1
- package/dist/components/cg-meter/cg-meter.js +76 -76
- package/dist/components/cg-meter/cg-meter.js.map +1 -1
- package/dist/components/cg-metric-card/cg-metric-card.d.ts.map +1 -1
- package/dist/components/cg-metric-card/cg-metric-card.js +65 -68
- package/dist/components/cg-metric-card/cg-metric-card.js.map +1 -1
- package/dist/components/cg-modal/cg-modal.d.ts +3 -0
- package/dist/components/cg-modal/cg-modal.d.ts.map +1 -1
- package/dist/components/cg-modal/cg-modal.js +82 -83
- package/dist/components/cg-modal/cg-modal.js.map +1 -1
- package/dist/components/cg-navbar/cg-navbar.d.ts +1 -1
- package/dist/components/cg-navbar/cg-navbar.d.ts.map +1 -1
- package/dist/components/cg-navbar/cg-navbar.js +64 -55
- package/dist/components/cg-navbar/cg-navbar.js.map +1 -1
- package/dist/components/cg-navigation-menu/cg-navigation-menu.d.ts +3 -0
- package/dist/components/cg-navigation-menu/cg-navigation-menu.d.ts.map +1 -1
- package/dist/components/cg-navigation-menu/cg-navigation-menu.js +38 -26
- package/dist/components/cg-navigation-menu/cg-navigation-menu.js.map +1 -1
- package/dist/components/cg-number-input/cg-number-input.d.ts +1 -0
- package/dist/components/cg-number-input/cg-number-input.d.ts.map +1 -1
- package/dist/components/cg-number-input/cg-number-input.js +90 -77
- package/dist/components/cg-number-input/cg-number-input.js.map +1 -1
- package/dist/components/cg-otp-input/cg-otp-input.d.ts.map +1 -1
- package/dist/components/cg-otp-input/cg-otp-input.js +70 -60
- package/dist/components/cg-otp-input/cg-otp-input.js.map +1 -1
- package/dist/components/cg-pagination/cg-pagination.d.ts +2 -0
- package/dist/components/cg-pagination/cg-pagination.d.ts.map +1 -1
- package/dist/components/cg-pagination/cg-pagination.js +50 -49
- package/dist/components/cg-pagination/cg-pagination.js.map +1 -1
- package/dist/components/cg-password-input/cg-password-input.d.ts.map +1 -1
- package/dist/components/cg-password-input/cg-password-input.js +42 -34
- package/dist/components/cg-password-input/cg-password-input.js.map +1 -1
- package/dist/components/cg-phone-input/cg-phone-input.d.ts.map +1 -1
- package/dist/components/cg-phone-input/cg-phone-input.js +18 -14
- package/dist/components/cg-phone-input/cg-phone-input.js.map +1 -1
- package/dist/components/cg-popover/cg-popover.d.ts +12 -2
- package/dist/components/cg-popover/cg-popover.d.ts.map +1 -1
- package/dist/components/cg-popover/cg-popover.js +90 -63
- package/dist/components/cg-popover/cg-popover.js.map +1 -1
- package/dist/components/cg-portal/cg-portal.d.ts.map +1 -1
- package/dist/components/cg-portal/cg-portal.js +42 -41
- package/dist/components/cg-portal/cg-portal.js.map +1 -1
- package/dist/components/cg-progress-bar/cg-progress-bar.d.ts.map +1 -1
- package/dist/components/cg-progress-bar/cg-progress-bar.js +25 -25
- package/dist/components/cg-progress-bar/cg-progress-bar.js.map +1 -1
- package/dist/components/cg-radio/cg-radio.d.ts +10 -0
- package/dist/components/cg-radio/cg-radio.d.ts.map +1 -1
- package/dist/components/cg-radio/cg-radio.js +59 -48
- package/dist/components/cg-radio/cg-radio.js.map +1 -1
- package/dist/components/cg-radio-group/cg-radio-group.d.ts +6 -0
- package/dist/components/cg-radio-group/cg-radio-group.d.ts.map +1 -1
- package/dist/components/cg-radio-group/cg-radio-group.js +50 -37
- package/dist/components/cg-radio-group/cg-radio-group.js.map +1 -1
- package/dist/components/cg-rating/cg-rating.d.ts.map +1 -1
- package/dist/components/cg-rating/cg-rating.js +56 -54
- package/dist/components/cg-rating/cg-rating.js.map +1 -1
- package/dist/components/cg-resizable/cg-resizable.d.ts +4 -1
- package/dist/components/cg-resizable/cg-resizable.d.ts.map +1 -1
- package/dist/components/cg-resizable/cg-resizable.js +45 -35
- package/dist/components/cg-resizable/cg-resizable.js.map +1 -1
- package/dist/components/cg-scroll-area/cg-scroll-area.d.ts +8 -0
- package/dist/components/cg-scroll-area/cg-scroll-area.d.ts.map +1 -1
- package/dist/components/cg-scroll-area/cg-scroll-area.js +64 -21
- package/dist/components/cg-scroll-area/cg-scroll-area.js.map +1 -1
- package/dist/components/cg-segmented-control/cg-segmented-control.d.ts +4 -0
- package/dist/components/cg-segmented-control/cg-segmented-control.d.ts.map +1 -1
- package/dist/components/cg-segmented-control/cg-segmented-control.js +75 -39
- package/dist/components/cg-segmented-control/cg-segmented-control.js.map +1 -1
- package/dist/components/cg-select/cg-select.d.ts +4 -2
- package/dist/components/cg-select/cg-select.d.ts.map +1 -1
- package/dist/components/cg-select/cg-select.js +96 -58
- package/dist/components/cg-select/cg-select.js.map +1 -1
- package/dist/components/cg-separator/cg-separator.d.ts +1 -2
- package/dist/components/cg-separator/cg-separator.d.ts.map +1 -1
- package/dist/components/cg-separator/cg-separator.js +5 -8
- package/dist/components/cg-separator/cg-separator.js.map +1 -1
- package/dist/components/cg-sheet/cg-sheet.d.ts +4 -0
- package/dist/components/cg-sheet/cg-sheet.d.ts.map +1 -1
- package/dist/components/cg-sheet/cg-sheet.js +80 -43
- package/dist/components/cg-sheet/cg-sheet.js.map +1 -1
- package/dist/components/cg-sidebar/cg-sidebar.d.ts.map +1 -1
- package/dist/components/cg-sidebar/cg-sidebar.js +82 -19
- package/dist/components/cg-sidebar/cg-sidebar.js.map +1 -1
- package/dist/components/cg-skeleton/cg-skeleton.d.ts +7 -1
- package/dist/components/cg-skeleton/cg-skeleton.d.ts.map +1 -1
- package/dist/components/cg-skeleton/cg-skeleton.js +61 -63
- package/dist/components/cg-skeleton/cg-skeleton.js.map +1 -1
- package/dist/components/cg-slider/cg-slider.d.ts.map +1 -1
- package/dist/components/cg-slider/cg-slider.js +80 -73
- package/dist/components/cg-slider/cg-slider.js.map +1 -1
- package/dist/components/cg-spinner/cg-spinner.d.ts.map +1 -1
- package/dist/components/cg-spinner/cg-spinner.js +10 -19
- package/dist/components/cg-spinner/cg-spinner.js.map +1 -1
- package/dist/components/cg-split-button/cg-split-button.d.ts.map +1 -1
- package/dist/components/cg-split-button/cg-split-button.js +64 -50
- package/dist/components/cg-split-button/cg-split-button.js.map +1 -1
- package/dist/components/cg-stack/cg-stack.js +1 -1
- package/dist/components/cg-steps/cg-steps.js +1 -1
- package/dist/components/cg-switch/cg-switch.d.ts +3 -0
- package/dist/components/cg-switch/cg-switch.d.ts.map +1 -1
- package/dist/components/cg-switch/cg-switch.js +39 -47
- package/dist/components/cg-switch/cg-switch.js.map +1 -1
- package/dist/components/cg-table/cg-table.d.ts +0 -7
- package/dist/components/cg-table/cg-table.d.ts.map +1 -1
- package/dist/components/cg-table/cg-table.js +50 -47
- package/dist/components/cg-table/cg-table.js.map +1 -1
- package/dist/components/cg-tabs/cg-tabs.js +1 -1
- package/dist/components/cg-tag-input/cg-tag-input.js +1 -1
- package/dist/components/cg-text/cg-text.js +1 -1
- package/dist/components/cg-textarea/cg-textarea.js +1 -1
- package/dist/components/cg-time-picker/cg-time-picker.js +1 -1
- package/dist/components/cg-toaster/cg-toaster.js +3 -3
- package/dist/components/cg-toaster/cg-toaster.js.map +1 -1
- package/dist/components/cg-toggle/cg-toggle.js +1 -1
- package/dist/components/cg-toggle-group/cg-toggle-group.js +1 -1
- package/dist/components/cg-tree-view/cg-tree-view.js +1 -1
- package/dist/foundation.d.ts +0 -16
- package/dist/foundation.d.ts.map +1 -1
- package/dist/foundation.js +174 -206
- package/dist/foundation.js.map +1 -1
- package/dist/index.d.ts +1 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -132
- package/dist/index.js.map +1 -1
- package/dist/utils/focus-trap.d.ts +19 -2
- package/dist/utils/focus-trap.d.ts.map +1 -1
- package/package.json +6 -810
- package/dist/chunks/focus-trap-BdRNhSPD.js +0 -53
- package/dist/chunks/focus-trap-BdRNhSPD.js.map +0 -1
- package/dist/components/cg-app-shell/cg-app-shell.d.ts +0 -54
- package/dist/components/cg-app-shell/cg-app-shell.d.ts.map +0 -1
- package/dist/components/cg-app-shell/cg-app-shell.js +0 -135
- package/dist/components/cg-app-shell/cg-app-shell.js.map +0 -1
- package/dist/components/cg-auth-shell/cg-auth-shell.d.ts +0 -61
- package/dist/components/cg-auth-shell/cg-auth-shell.d.ts.map +0 -1
- package/dist/components/cg-auth-shell/cg-auth-shell.js +0 -163
- package/dist/components/cg-auth-shell/cg-auth-shell.js.map +0 -1
- package/dist/components/cg-definition-list/cg-definition-list.d.ts +0 -99
- package/dist/components/cg-definition-list/cg-definition-list.d.ts.map +0 -1
- package/dist/components/cg-definition-list/cg-definition-list.js +0 -332
- package/dist/components/cg-definition-list/cg-definition-list.js.map +0 -1
- package/dist/components/cg-draggable/cg-draggable.d.ts +0 -53
- package/dist/components/cg-draggable/cg-draggable.d.ts.map +0 -1
- package/dist/components/cg-draggable/cg-draggable.js +0 -136
- package/dist/components/cg-draggable/cg-draggable.js.map +0 -1
- package/dist/components/cg-droppable/cg-droppable.d.ts +0 -57
- package/dist/components/cg-droppable/cg-droppable.d.ts.map +0 -1
- package/dist/components/cg-droppable/cg-droppable.js +0 -114
- package/dist/components/cg-droppable/cg-droppable.js.map +0 -1
- package/dist/components/cg-filter-bar/cg-filter-bar.d.ts +0 -50
- package/dist/components/cg-filter-bar/cg-filter-bar.d.ts.map +0 -1
- package/dist/components/cg-filter-bar/cg-filter-bar.js +0 -115
- package/dist/components/cg-filter-bar/cg-filter-bar.js.map +0 -1
- package/dist/components/cg-filter-chip/cg-filter-chip.d.ts +0 -55
- package/dist/components/cg-filter-chip/cg-filter-chip.d.ts.map +0 -1
- package/dist/components/cg-filter-chip/cg-filter-chip.js +0 -213
- package/dist/components/cg-filter-chip/cg-filter-chip.js.map +0 -1
- package/dist/components/cg-kanban/cg-kanban.d.ts +0 -44
- package/dist/components/cg-kanban/cg-kanban.d.ts.map +0 -1
- package/dist/components/cg-kanban/cg-kanban.js +0 -86
- package/dist/components/cg-kanban/cg-kanban.js.map +0 -1
- package/dist/components/cg-kanban-column/cg-kanban-column.d.ts +0 -58
- package/dist/components/cg-kanban-column/cg-kanban-column.d.ts.map +0 -1
- package/dist/components/cg-kanban-column/cg-kanban-column.js +0 -144
- package/dist/components/cg-kanban-column/cg-kanban-column.js.map +0 -1
- package/dist/components/cg-mfa-prompt/cg-mfa-prompt.d.ts +0 -77
- package/dist/components/cg-mfa-prompt/cg-mfa-prompt.d.ts.map +0 -1
- package/dist/components/cg-mfa-prompt/cg-mfa-prompt.js +0 -245
- package/dist/components/cg-mfa-prompt/cg-mfa-prompt.js.map +0 -1
- package/dist/components/cg-search-input/cg-search-input.d.ts +0 -62
- package/dist/components/cg-search-input/cg-search-input.d.ts.map +0 -1
- package/dist/components/cg-search-input/cg-search-input.js +0 -106
- package/dist/components/cg-search-input/cg-search-input.js.map +0 -1
- package/dist/components/cg-sortable/cg-sortable.d.ts +0 -72
- package/dist/components/cg-sortable/cg-sortable.d.ts.map +0 -1
- package/dist/components/cg-sortable/cg-sortable.js +0 -177
- package/dist/components/cg-sortable/cg-sortable.js.map +0 -1
- package/dist/components/cg-theme/cg-theme.d.ts +0 -82
- package/dist/components/cg-theme/cg-theme.d.ts.map +0 -1
- package/dist/components/cg-theme/cg-theme.js +0 -91
- package/dist/components/cg-theme/cg-theme.js.map +0 -1
- package/dist/components/cg-theme-editor/cg-theme-editor.d.ts +0 -98
- package/dist/components/cg-theme-editor/cg-theme-editor.d.ts.map +0 -1
- package/dist/components/cg-theme-editor/cg-theme-editor.js +0 -341
- package/dist/components/cg-theme-editor/cg-theme-editor.js.map +0 -1
- package/dist/components/cg-timeline/cg-timeline.d.ts +0 -70
- package/dist/components/cg-timeline/cg-timeline.d.ts.map +0 -1
- package/dist/components/cg-timeline/cg-timeline.js +0 -131
- package/dist/components/cg-timeline/cg-timeline.js.map +0 -1
- package/dist/components/cg-timeline-event/cg-timeline-event.d.ts +0 -59
- package/dist/components/cg-timeline-event/cg-timeline-event.d.ts.map +0 -1
- package/dist/components/cg-timeline-event/cg-timeline-event.js +0 -190
- package/dist/components/cg-timeline-event/cg-timeline-event.js.map +0 -1
- package/dist/utils/drag-manager.d.ts +0 -40
- package/dist/utils/drag-manager.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-chat.js","sources":["../../../src/components/ai-chat/ai-chat.ts"],"sourcesContent":["/**\n * @element ai-chat\n * Full-featured AI chat interface with streaming, markdown rendering, message actions, and follow-up chips.\n *\n * @example\n * ```html\n * <ai-chat\n * .aiClient=${myClient}\n * welcomeMessage=\"Ask me anything!\"\n * placeholder=\"Type a message...\"\n * ></ai-chat>\n * ```\n *\n * @fires {CustomEvent<{message: string}>} ai-message-sent - User sent a message\n * @fires {CustomEvent<{message: string}>} ai-response-received - AI response completed\n * @fires {CustomEvent<{error: string}>} ai-error - AI request failed\n * @fires {CustomEvent} ai-chat-stop - User stopped generation\n * @fires {CustomEvent<{content: string}>} ai-chat-copy - Message copied\n * @fires {CustomEvent<{messageId: string}>} ai-chat-regenerate - Regenerate requested\n * @fires {CustomEvent<{messageId: string, rating: 'up'|'down'}>} ai-chat-rate - Message rated\n *\n * @cssprop --cg-component-ai-chat-radius - Chat container border radius\n * @cssprop --cg-component-ai-chat-textarea-max-height - Max height for the input textarea\n * @cssprop --cg-color-surface-cards-background - Chat background\n * @cssprop --cg-color-action-primary-background-default - Send button, links, AI avatar\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, state, customElement, query } from 'lit/decorators.js';\nimport { AiIntent } from '@cognivo/core';\nimport type { AiClient, AiContext, AiRequestOptions, AiResult } from '@cognivo/core';\nimport { hostBlock, reducedMotion } from '../../styles/index.js';\n\ninterface MessageVersion {\n content: string;\n timestamp: number;\n}\n\ninterface Message {\n id: string;\n role: 'user' | 'ai';\n versions: MessageVersion[];\n activeVersion: number;\n isError?: boolean;\n}\n\n@customElement('ai-chat')\nexport class AiChat extends LitElement {\n static override styles = [hostBlock, reducedMotion, css`\n .chat {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: var(--cg-component-ai-chat-min-height);\n max-height: var(--cg-component-ai-chat-max-height);\n background: var(--cg-color-surface-cards-background);\n border-radius: var(--cg-component-ai-chat-radius);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n overflow: hidden;\n }\n\n .wrapper { position: relative; display: flex; flex-direction: column; flex: 1; min-height: 0; overflow: hidden; }\n\n /* ── Messages ── */\n .messages {\n flex: 1;\n overflow-y: auto;\n padding: var(--cg-spacing-24);\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-16);\n scroll-behavior: smooth;\n }\n\n .msg {\n max-width: 85%;\n animation: slideIn var(--cg-transition-duration-slow) var(--cg-transition-easing-default);\n }\n .msg.user { align-self: flex-end; }\n .msg.ai { align-self: flex-start; }\n\n @keyframes slideIn {\n from { opacity: 0; transform: translateY(var(--cg-spacing-8)); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n /* ── Bubble ── */\n .bubble {\n padding: var(--cg-spacing-12) var(--cg-spacing-20);\n border-radius: var(--cg-border-radius-200);\n line-height: var(--cg-line-height-relaxed);\n font-size: var(--cg-font-size-sm);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .msg.user .bubble {\n background: var(--cg-overlay-accent-subtle);\n color: var(--cg-color-surface-base-text);\n border-bottom-right-radius: var(--cg-spacing-4);\n border-color: var(--cg-overlay-accent-medium);\n }\n .msg.ai .bubble {\n background: var(--cg-color-surface-cards-background);\n color: var(--cg-color-surface-base-text);\n border-bottom-left-radius: var(--cg-spacing-4);\n }\n .msg.ai .bubble.error {\n background: var(--cg-color-status-error-background-default);\n color: var(--cg-color-status-error-text-default);\n border-color: var(--cg-color-status-error-border-default);\n }\n\n /* ── Streaming cursor ── */\n .cursor {\n display: inline-block;\n width: var(--cg-spacing-2);\n height: var(--cg-spacing-16);\n background: var(--cg-color-action-primary-background-default);\n margin-left: var(--cg-spacing-1);\n vertical-align: text-bottom;\n animation: blink 1s step-end infinite;\n }\n @keyframes blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n\n /* ── Message actions (layout only — buttons are cg-button) ── */\n .actions {\n display: flex;\n gap: var(--cg-spacing-4);\n margin-top: var(--cg-spacing-6);\n opacity: 0;\n transition: opacity var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .msg:hover .actions, .msg:focus-within .actions { opacity: 1; }\n\n /* ── Version nav ── */\n .version-nav {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-4);\n margin-top: var(--cg-spacing-4);\n }\n .version-label {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-surface-container-outlined);\n }\n\n /* ── Thinking ── */\n .thinking-area {\n align-self: flex-start;\n padding: 0 var(--cg-spacing-20) var(--cg-spacing-4);\n }\n\n /* ── Positioned elements ── */\n .stop-btn { margin: 0 auto var(--cg-spacing-8); }\n .scroll-btn { position: absolute; bottom: var(--cg-spacing-80); right: var(--cg-spacing-20); z-index: 10; }\n .follow-ups { padding: 0 var(--cg-spacing-20) var(--cg-spacing-12); }\n\n /* ── Input area — fused container like ChatGPT/Claude ── */\n .input-area {\n padding: var(--cg-spacing-12) var(--cg-spacing-16);\n flex-shrink: 0;\n }\n .input-box {\n display: flex;\n align-items: flex-end;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-8) var(--cg-spacing-8) var(--cg-spacing-8) var(--cg-spacing-16);\n background: var(--cg-color-input-background-default);\n border: var(--cg-border-width-50) solid var(--cg-color-input-border-default);\n border-radius: var(--cg-border-radius-200);\n transition:\n border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n box-shadow var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .input-box:focus-within {\n border-color: var(--cg-color-input-border-focus);\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n .input-box textarea {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n color: var(--cg-color-input-text-default);\n font: inherit;\n font-size: var(--cg-font-size-sm);\n line-height: var(--cg-line-height-relaxed);\n resize: none;\n padding: var(--cg-spacing-4) 0;\n min-height: var(--cg-spacing-24);\n max-height: var(--cg-component-ai-chat-textarea-max-height);\n }\n .input-box textarea::placeholder {\n color: var(--cg-color-input-text-placeholder);\n }\n /* Shared icon button style for send + mic */\n .icon-btn {\n flex-shrink: 0;\n width: var(--cg-spacing-32);\n height: var(--cg-spacing-32);\n border-radius: var(--cg-border-radius-full);\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition:\n background-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n opacity var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .icon-btn:active:not(:disabled) { transform: scale(var(--cg-interaction-press-scale)); }\n .icon-btn:disabled { opacity: 0.3; cursor: default; }\n\n .send-btn {\n background: var(--cg-color-action-primary-background-default);\n color: var(--cg-color-action-primary-text-default);\n }\n .send-btn:hover:not(:disabled) {\n background: var(--cg-color-action-primary-background-hover);\n }\n\n .mic-btn {\n background: transparent;\n color: var(--cg-color-input-text-placeholder);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .mic-btn:hover:not(:disabled) {\n color: var(--cg-color-surface-base-text);\n border-color: var(--cg-color-input-border-hover);\n }\n .mic-btn.recording {\n color: var(--cg-color-status-error-text-default);\n border-color: var(--cg-color-status-error-text-default);\n background: var(--cg-color-status-error-background-default);\n animation: micPulse 1.5s ease-in-out infinite;\n }\n @keyframes micPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n }\n\n /* ── Empty state ── */\n .empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--cg-color-surface-container-outlined);\n gap: var(--cg-spacing-12);\n text-align: center;\n }\n .empty-text {\n font-size: var(--cg-font-size-base);\n font-weight: var(--cg-font-weight-medium);\n }\n\n /* ── Rounded variants ── */\n :host([rounded=\"none\"]) .chat { border-radius: 0; }\n :host([rounded=\"sm\"]) .chat { border-radius: var(--cg-border-radius-100); }\n :host([rounded=\"md\"]) .chat { border-radius: var(--cg-border-radius-150); }\n :host([rounded=\"lg\"]) .chat { border-radius: var(--cg-component-ai-chat-radius); }\n\n /* Reduced motion */\n @media (prefers-reduced-motion: reduce) {\n .msg { animation: none; }\n .cursor { animation: none; opacity: 1; }\n }\n `];\n\n @property({ reflect: true }) rounded: 'none' | 'sm' | 'md' | 'lg' = 'lg';\n @property({ type: Object }) aiClient: AiClient | null = null;\n @property({ type: Array }) chatDataset: unknown[] = [];\n @property({ type: Boolean }) showActions: boolean = true;\n @property({ type: Boolean }) showFollowUps: boolean = true;\n @property({ type: String }) welcomeMessage: string = 'Ask me about your data!';\n @property({ type: String }) placeholder: string = 'Type a message...';\n @property({ type: Number }) maxMessages: number = 100;\n /** AI intent to invoke (default: 'chat'). Override for domain-specific intents. */\n @property({ type: String }) intent: string = 'chat';\n /** When true and aiClient.streamIntent exists, uses streaming instead of runIntent */\n @property({ type: Boolean }) useStreaming: boolean = false;\n /** Show mic button for voice input (uses Web Speech API) */\n @property({ type: Boolean }) showVoice: boolean = false;\n /** BCP-47 language for voice recognition */\n @property({ type: String }) voiceLanguage: string = 'en-US';\n\n @state() private _messages: Message[] = [];\n @state() private _isRecording: boolean = false;\n @state() private _input: string = '';\n @state() private _isStreaming: boolean = false;\n @state() private _isThinking: boolean = false;\n @state() private _isComposing: boolean = false;\n @state() private _showScrollBtn: boolean = false;\n @state() private _copiedId: string | null = null;\n @state() private _followUps: string[] = [];\n @state() private _streamingContent: string = '';\n\n @query('.messages') private _messagesEl!: HTMLDivElement;\n\n private _msgCounter: number = 0;\n private _abortController: AbortController | null = null;\n private _recognition: SpeechRecognition | null = null;\n private _copyResetTimer: ReturnType<typeof setTimeout> | undefined;\n\n private _genId(): string { return `msg-${++this._msgCounter}`; }\n\n // ── Voice input ──\n\n private _getSpeechRecognition(): SpeechRecognitionCtor | null {\n if (typeof window === 'undefined') return null;\n return window.SpeechRecognition || window.webkitSpeechRecognition || null;\n }\n\n private _toggleVoice() {\n if (this._isRecording) {\n this._stopVoice();\n } else {\n this._startVoice();\n }\n }\n\n private _startVoice() {\n const Ctor = this._getSpeechRecognition();\n if (!Ctor) return;\n\n this._stopVoice();\n const recognition = new Ctor();\n recognition.lang = this.voiceLanguage;\n recognition.continuous = false;\n recognition.interimResults = true;\n\n recognition.onstart = () => {\n this._isRecording = true;\n };\n\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n let interim = '';\n let final = '';\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (!result) continue;\n if (result.isFinal) {\n final += result[0]?.transcript ?? '';\n } else {\n interim += result[0]?.transcript ?? '';\n }\n }\n if (final) {\n this._input = (this._input ? this._input + ' ' : '') + final.trim();\n } else if (interim) {\n // Show interim in textarea placeholder feel — append to input temporarily\n const textarea = this.shadowRoot?.querySelector('textarea');\n if (textarea) textarea.placeholder = interim + '...';\n }\n };\n\n recognition.onend = () => {\n this._isRecording = false;\n this._recognition = null;\n // Restore placeholder\n const textarea = this.shadowRoot?.querySelector('textarea');\n if (textarea) textarea.placeholder = this.placeholder;\n };\n\n recognition.onerror = () => {\n this._isRecording = false;\n this._recognition = null;\n };\n\n this._recognition = recognition;\n try {\n recognition.start();\n } catch {\n this._isRecording = false;\n }\n }\n\n private _stopVoice() {\n if (this._recognition) {\n try { this._recognition.stop(); } catch { /* ignore */ }\n this._recognition = null;\n }\n this._isRecording = false;\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this._stopVoice();\n if (this._copyResetTimer) {\n clearTimeout(this._copyResetTimer);\n this._copyResetTimer = undefined;\n }\n // Abort any in-flight AI request on unmount\n if (this._abortController) {\n try { this._abortController.abort(); } catch { /* ignore */ }\n this._abortController = null;\n }\n }\n\n private _scrollToBottom() {\n requestAnimationFrame(() => {\n if (this._messagesEl) {\n this._messagesEl.scrollTop = this._messagesEl.scrollHeight;\n }\n });\n }\n\n private _handleScroll() {\n if (!this._messagesEl) return;\n const { scrollTop, scrollHeight, clientHeight } = this._messagesEl;\n this._showScrollBtn = scrollHeight - scrollTop - clientHeight > 100;\n }\n\n /** Build conversation history for AI context */\n private _buildHistory(): Array<{ role: string; content: string }> {\n return this._messages.map(m => ({\n role: m.role,\n content: m.versions[m.activeVersion]?.content ?? '',\n }));\n }\n\n /** Enforce maxMessages limit by trimming oldest messages */\n private _trimMessages() {\n if (this._messages.length > this.maxMessages) {\n this._messages = this._messages.slice(this._messages.length - this.maxMessages);\n }\n }\n\n /** Add a message programmatically from outside the component */\n addMessage(role: 'user' | 'ai', content: string): string {\n const id = this._genId();\n this._messages = [...this._messages, {\n id,\n role,\n versions: [{ content, timestamp: Date.now() }],\n activeVersion: 0,\n }];\n this._trimMessages();\n this._scrollToBottom();\n return id;\n }\n\n /** Clear all messages */\n clearMessages() {\n this._messages = [];\n this._followUps = [];\n this._streamingContent = '';\n }\n\n private async _sendMessage() {\n if (!this._input.trim() || !this.aiClient || this._isStreaming || this._isThinking) return;\n\n const text = this._input.trim();\n this._input = '';\n this._followUps = [];\n\n // Reset textarea height after clearing\n const textarea = this.shadowRoot?.querySelector('.input-box textarea') as HTMLTextAreaElement | null;\n if (textarea) { textarea.value = ''; textarea.style.height = 'auto'; }\n\n this._messages = [...this._messages, {\n id: this._genId(),\n role: 'user',\n versions: [{ content: text, timestamp: Date.now() }],\n activeVersion: 0,\n }];\n this._trimMessages();\n\n this.dispatchEvent(new CustomEvent('ai-message-sent', {\n bubbles: true, composed: true,\n detail: { message: text, timestamp: Date.now() },\n }));\n\n await this.updateComplete;\n this._scrollToBottom();\n this._isThinking = true;\n this._abortController = new AbortController();\n\n const context: AiContext = {\n dataset: this.chatDataset.length > 0 ? this.chatDataset : [{ info: 'No data provided' }],\n meta: {\n userQuestion: text,\n conversationHistory: JSON.stringify(this._buildHistory()),\n },\n };\n\n try {\n if (this.useStreaming && this.aiClient.streamIntent) {\n await this._sendStreaming(context);\n } else {\n await this._sendNonStreaming(context);\n }\n } catch (err: unknown) {\n if (this._abortController?.signal.aborted) return;\n this._isThinking = false;\n this._isStreaming = false;\n const errMsg = err instanceof Error ? err.message : 'An error occurred';\n this._messages = [...this._messages, {\n id: this._genId(),\n role: 'ai',\n versions: [{ content: errMsg, timestamp: Date.now() }],\n activeVersion: 0,\n isError: true,\n }];\n this._trimMessages();\n this.dispatchEvent(new CustomEvent('ai-error', {\n bubbles: true, composed: true,\n detail: { error: errMsg, timestamp: Date.now() },\n }));\n } finally {\n this._isStreaming = false;\n this._isThinking = false;\n this._abortController = null;\n await this.updateComplete;\n this._scrollToBottom();\n }\n }\n\n private async _sendNonStreaming(context: AiContext) {\n const options: AiRequestOptions = { signal: this._abortController!.signal };\n const result: AiResult = await this.aiClient!.runIntent(\n this.intent as AiIntent,\n context,\n options,\n );\n\n this._isThinking = false;\n const aiContent = String(\n result.explanation\n || (result.metadata?.content)\n || (result.metadata?.text)\n || 'Analysis complete.'\n );\n\n this._messages = [...this._messages, {\n id: this._genId(),\n role: 'ai',\n versions: [{ content: aiContent, timestamp: Date.now() }],\n activeVersion: 0,\n }];\n this._trimMessages();\n\n this.dispatchEvent(new CustomEvent('ai-response-received', {\n bubbles: true, composed: true,\n detail: { message: aiContent, timestamp: Date.now() },\n }));\n }\n\n private async _sendStreaming(context: AiContext) {\n this._isThinking = false;\n this._isStreaming = true;\n this._streamingContent = '';\n\n const streamId = 'msg-stream';\n this._messages = [...this._messages, {\n id: streamId,\n role: 'ai',\n versions: [{ content: '', timestamp: Date.now() }],\n activeVersion: 0,\n }];\n\n const options: AiRequestOptions = { signal: this._abortController!.signal };\n const generator = this.aiClient!.streamIntent!(\n this.intent as AiIntent,\n context,\n options,\n );\n\n for await (const partial of generator) {\n if (this._abortController?.signal.aborted) break;\n const token = String(partial.explanation || partial.metadata?.content || partial.metadata?.text || '');\n this._streamingContent += token;\n\n this._messages = this._messages.map(m =>\n m.id === streamId\n ? { ...m, versions: [{ content: this._streamingContent, timestamp: Date.now() }] }\n : m\n );\n this._scrollToBottom();\n }\n\n this.completeStream();\n }\n\n /** Append streaming content to a new or existing AI message (for external streaming control) */\n streamResponse(token: string) {\n this._isStreaming = true;\n this._isThinking = false;\n this._streamingContent += token;\n\n const streamId = 'msg-stream';\n const hasStream = this._messages.some(m => m.id === streamId);\n\n if (hasStream) {\n this._messages = this._messages.map(m =>\n m.id === streamId\n ? { ...m, versions: [{ content: this._streamingContent, timestamp: Date.now() }] }\n : m\n );\n } else {\n this._messages = [...this._messages, {\n id: streamId,\n role: 'ai',\n versions: [{ content: this._streamingContent, timestamp: Date.now() }],\n activeVersion: 0,\n }];\n }\n this._scrollToBottom();\n }\n\n /** Complete streaming */\n completeStream(followUps?: string[]) {\n this._isStreaming = false;\n const newId = this._genId();\n\n // Immutable update — replace stream id with permanent id\n this._messages = this._messages.map(m =>\n m.id === 'msg-stream' ? { ...m, id: newId } : m\n );\n this._trimMessages();\n\n const lastMsg = this._messages[this._messages.length - 1];\n this._streamingContent = '';\n if (followUps) this._followUps = followUps;\n\n this.dispatchEvent(new CustomEvent('ai-response-received', {\n bubbles: true, composed: true,\n detail: { message: lastMsg?.versions[0]?.content ?? '', timestamp: Date.now() },\n }));\n }\n\n /** Export conversation as markdown */\n exportConversation(): string {\n return this._messages.map(m => {\n const v = m.versions[m.activeVersion]!;\n return `**${m.role === 'user' ? 'User' : 'AI'}:** ${v.content}`;\n }).join('\\n\\n');\n }\n\n private _handleStop() {\n this._abortController?.abort();\n this._isStreaming = false;\n this._isThinking = false;\n this.dispatchEvent(new CustomEvent('ai-chat-stop', { bubbles: true, composed: true }));\n }\n\n private _handleCopy(msg: Message) {\n const text = msg.versions[msg.activeVersion]!.content;\n navigator.clipboard?.writeText(text);\n this._copiedId = msg.id;\n if (this._copyResetTimer) clearTimeout(this._copyResetTimer);\n this._copyResetTimer = setTimeout(() => { this._copiedId = null; this._copyResetTimer = undefined; }, 2000);\n this.dispatchEvent(new CustomEvent('ai-chat-copy', {\n bubbles: true, composed: true,\n detail: { content: text },\n }));\n }\n\n private _handleRegenerate(msg: Message) {\n this.dispatchEvent(new CustomEvent('ai-chat-regenerate', {\n bubbles: true, composed: true,\n detail: { messageId: msg.id },\n }));\n }\n\n private _handleRate(msg: Message, rating: 'up' | 'down') {\n this.dispatchEvent(new CustomEvent('ai-chat-rate', {\n bubbles: true, composed: true,\n detail: { messageId: msg.id, rating },\n }));\n }\n\n private _handleFollowUp(text: string) {\n this._input = text;\n this._followUps = [];\n this._sendMessage();\n }\n\n private _switchVersion(msg: Message, delta: number) {\n const newIdx = msg.activeVersion + delta;\n if (newIdx >= 0 && newIdx < msg.versions.length) {\n // Immutable update — don't mutate the message directly\n this._messages = this._messages.map(m =>\n m.id === msg.id ? { ...m, activeVersion: newIdx } : m\n );\n }\n }\n\n private _handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter' && !e.shiftKey && !this._isComposing) {\n e.preventDefault();\n this._sendMessage();\n }\n }\n\n override render() {\n if (!this.aiClient) {\n return html`\n <div class=\"chat\">\n <div class=\"empty\" role=\"status\">\n <cg-icon name=\"settings\" size=\"lg\"></cg-icon>\n <div class=\"empty-text\">Set <code>aiClient</code> to start chatting</div>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"chat\">\n <div class=\"wrapper\">\n <div class=\"messages\" role=\"log\" aria-live=\"polite\" aria-label=\"Chat messages\" @scroll=${this._handleScroll}>\n ${this._messages.length === 0 && !this._isThinking ? html`\n <div class=\"empty\">\n <cg-icon name=\"chat\" size=\"lg\"></cg-icon>\n <div class=\"empty-text\">${this.welcomeMessage}</div>\n </div>\n ` : this._messages.map(msg => {\n const v = msg.versions[msg.activeVersion]!;\n return html`\n <div class=\"msg ${msg.role}\" role=\"article\" aria-label=\"${msg.role === 'user' ? 'Your message' : 'AI response'}\">\n <div class=\"msg-content\">\n <div class=\"bubble ${msg.isError ? 'error' : ''}\">\n ${msg.role === 'ai' && !msg.isError\n ? html`<cg-markdown .text=${v.content}></cg-markdown>`\n : v.content}\n ${this._isStreaming && msg.id === 'msg-stream' ? html`<span class=\"cursor\" aria-hidden=\"true\"></span>` : nothing}\n </div>\n\n ${msg.role === 'ai' && this.showActions && !this._isStreaming ? html`\n <div class=\"actions\">\n <cg-button variant=\"tertiary\" size=\"sm\"\n status=${this._copiedId === msg.id ? 'success' : 'idle'}\n @click=${() => this._handleCopy(msg)}\n aria-label=${this._copiedId === msg.id ? 'Copied to clipboard' : 'Copy message'}>\n <cg-icon slot=\"prefix\" name=${this._copiedId === msg.id ? 'check' : 'copy'} size=\"xs\"></cg-icon>\n ${this._copiedId === msg.id ? 'Copied' : 'Copy'}\n </cg-button>\n <cg-button variant=\"tertiary\" size=\"sm\" @click=${() => this._handleRegenerate(msg)} aria-label=\"Regenerate response\">\n <cg-icon slot=\"prefix\" name=\"refresh\" size=\"xs\"></cg-icon> Retry\n </cg-button>\n <cg-button variant=\"tertiary\" size=\"sm\" @click=${() => this._handleRate(msg, 'up')} aria-label=\"Rate good\">\n <cg-icon name=\"star\" size=\"xs\"></cg-icon>\n </cg-button>\n <cg-button variant=\"tertiary\" size=\"sm\" @click=${() => this._handleRate(msg, 'down')} aria-label=\"Rate bad\">\n <cg-icon name=\"warning\" size=\"xs\"></cg-icon>\n </cg-button>\n </div>\n ` : nothing}\n\n ${msg.versions.length > 1 ? html`\n <nav class=\"version-nav\" aria-label=\"Message versions\">\n <cg-button variant=\"tertiary\" size=\"sm\" ?disabled=${msg.activeVersion === 0} @click=${() => this._switchVersion(msg, -1)} aria-label=\"Previous version\">\n <cg-icon name=\"chevron-left\" size=\"xs\"></cg-icon>\n </cg-button>\n <span class=\"version-label\">${msg.activeVersion + 1} / ${msg.versions.length}</span>\n <cg-button variant=\"tertiary\" size=\"sm\" ?disabled=${msg.activeVersion === msg.versions.length - 1} @click=${() => this._switchVersion(msg, 1)} aria-label=\"Next version\">\n <cg-icon name=\"chevron-right\" size=\"xs\"></cg-icon>\n </cg-button>\n </nav>\n ` : nothing}\n </div>\n </div>\n `;\n })}\n\n ${this._isThinking ? html`\n <div class=\"thinking-area\" role=\"status\" aria-label=\"AI is thinking\">\n <ai-thinking text=\"Analyzing\" shimmer delay=\"0\"></ai-thinking>\n </div>\n ` : nothing}\n </div>\n\n ${this._showScrollBtn ? html`\n <cg-button class=\"scroll-btn\" variant=\"secondary\" size=\"sm\" rounded=\"full\"\n @click=${this._scrollToBottom} aria-label=\"Scroll to bottom\">\n <cg-icon name=\"arrow-down\" size=\"xs\"></cg-icon>\n </cg-button>\n ` : nothing}\n\n ${(this._isStreaming || this._isThinking) ? html`\n <cg-button class=\"stop-btn\" type=\"danger\" size=\"sm\" @click=${this._handleStop} aria-label=\"Stop generating\">\n <cg-icon slot=\"prefix\" name=\"close\" size=\"xs\"></cg-icon> Stop generating\n </cg-button>\n ` : nothing}\n\n ${this._followUps.length > 0 && this.showFollowUps ? html`\n <cg-follow-up\n class=\"follow-ups\"\n .items=${this._followUps}\n hideLabel\n variant=\"chips\"\n ?disabled=${this._isStreaming || this._isThinking}\n @cg-follow-up-click=${(e: CustomEvent<{text: string}>) => this._handleFollowUp(e.detail.text)}\n ></cg-follow-up>\n ` : nothing}\n </div>\n\n <div class=\"input-area\">\n <div class=\"input-box\">\n <textarea\n rows=\"1\"\n placeholder=${this.placeholder}\n .value=${this._input}\n ?disabled=${this._isStreaming || this._isThinking}\n @input=${(e: Event) => {\n const ta = e.target as HTMLTextAreaElement;\n this._input = ta.value;\n ta.style.height = 'auto';\n ta.style.height = ta.scrollHeight + 'px';\n }}\n @keydown=${this._handleKeyDown}\n @compositionstart=${() => this._isComposing = true}\n @compositionend=${() => this._isComposing = false}\n aria-label=\"Chat message\"\n ></textarea>\n ${this.showVoice && this._getSpeechRecognition() ? html`\n <button\n class=\"icon-btn mic-btn ${this._isRecording ? 'recording' : ''}\"\n @click=${this._toggleVoice}\n ?disabled=${this._isStreaming || this._isThinking}\n aria-label=\"${this._isRecording ? 'Stop voice input' : 'Start voice input'}\"\n aria-pressed=\"${this._isRecording ? 'true' : 'false'}\"\n >\n <cg-icon name=${this._isRecording ? 'close' : 'mic'} size=\"sm\"></cg-icon>\n </button>\n ` : nothing}\n <button\n class=\"icon-btn send-btn\"\n @click=${this._sendMessage}\n ?disabled=${this._isStreaming || this._isThinking || !this._input.trim()}\n aria-label=\"Send message\"\n >\n <cg-icon name=\"arrow-up\" size=\"sm\"></cg-icon>\n </button>\n </div>\n </div>\n </div>\n `;\n }\n}\n"],"names":["AiChat","LitElement","Ctor","recognition","event","interim","final","i","result","textarea","scrollTop","scrollHeight","clientHeight","m","role","content","id","text","context","err","errMsg","options","aiContent","streamId","generator","partial","token","followUps","newId","lastMsg","v","msg","rating","delta","newIdx","e","html","nothing","ta","hostBlock","reducedMotion","css","__decorateClass","property","state","query","customElement"],"mappings":";;;;;;;;AA8CO,IAAMA,IAAN,cAAqBC,EAAW;AAAA,EAAhC,cAAA;AAAA,UAAA,GAAA,SAAA,GAkOwB,KAAA,UAAuC,MACxC,KAAA,WAA4B,MAC7B,KAAA,cAAyB,CAAA,GACvB,KAAA,cAAuB,IACvB,KAAA,gBAAyB,IAC1B,KAAA,iBAAyB,2BACzB,KAAA,cAAsB,qBACtB,KAAA,cAAsB,KAEtB,KAAA,SAAiB,QAEhB,KAAA,eAAwB,IAExB,KAAA,YAAqB,IAEtB,KAAA,gBAAwB,SAE3C,KAAQ,YAAuB,CAAA,GAC/B,KAAQ,eAAwB,IAChC,KAAQ,SAAiB,IACzB,KAAQ,eAAwB,IAChC,KAAQ,cAAuB,IAC/B,KAAQ,eAAwB,IAChC,KAAQ,iBAA0B,IAClC,KAAQ,YAA2B,MACnC,KAAQ,aAAuB,CAAA,GAC/B,KAAQ,oBAA4B,IAI7C,KAAQ,cAAsB,GAC9B,KAAQ,mBAA2C,MACnD,KAAQ,eAAyC;AAAA,EAAA;AAAA,EAGzC,SAAiB;AAAE,WAAO,OAAO,EAAE,KAAK,WAAW;AAAA,EAAI;AAAA;AAAA,EAIvD,wBAAsD;AAC5D,WAAI,OAAO,SAAW,MAAoB,OACnC,OAAO,qBAAqB,OAAO,2BAA2B;AAAA,EACvE;AAAA,EAEQ,eAAe;AACrB,IAAI,KAAK,eACP,KAAK,WAAA,IAEL,KAAK,YAAA;AAAA,EAET;AAAA,EAEQ,cAAc;AACpB,UAAMC,IAAO,KAAK,sBAAA;AAClB,QAAI,CAACA,EAAM;AAEX,SAAK,WAAA;AACL,UAAMC,IAAc,IAAID,EAAA;AACxB,IAAAC,EAAY,OAAO,KAAK,eACxBA,EAAY,aAAa,IACzBA,EAAY,iBAAiB,IAE7BA,EAAY,UAAU,MAAM;AAC1B,WAAK,eAAe;AAAA,IACtB,GAEAA,EAAY,WAAW,CAACC,MAAkC;AACxD,UAAIC,IAAU,IACVC,IAAQ;AACZ,eAASC,IAAIH,EAAM,aAAaG,IAAIH,EAAM,QAAQ,QAAQG,KAAK;AAC7D,cAAMC,IAASJ,EAAM,QAAQG,CAAC;AAC9B,QAAKC,MACDA,EAAO,UACTF,KAASE,EAAO,CAAC,GAAG,cAAc,KAElCH,KAAWG,EAAO,CAAC,GAAG,cAAc;AAAA,MAExC;AACA,UAAIF;AACF,aAAK,UAAU,KAAK,SAAS,KAAK,SAAS,MAAM,MAAMA,EAAM,KAAA;AAAA,eACpDD,GAAS;AAElB,cAAMI,IAAW,KAAK,YAAY,cAAc,UAAU;AAC1D,QAAIA,MAAUA,EAAS,cAAcJ,IAAU;AAAA,MACjD;AAAA,IACF,GAEAF,EAAY,QAAQ,MAAM;AACxB,WAAK,eAAe,IACpB,KAAK,eAAe;AAEpB,YAAMM,IAAW,KAAK,YAAY,cAAc,UAAU;AAC1D,MAAIA,MAAUA,EAAS,cAAc,KAAK;AAAA,IAC5C,GAEAN,EAAY,UAAU,MAAM;AAC1B,WAAK,eAAe,IACpB,KAAK,eAAe;AAAA,IACtB,GAEA,KAAK,eAAeA;AACpB,QAAI;AACF,MAAAA,EAAY,MAAA;AAAA,IACd,QAAQ;AACN,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,QAAI,KAAK,cAAc;AACrB,UAAI;AAAE,aAAK,aAAa,KAAA;AAAA,MAAQ,QAAQ;AAAA,MAAe;AACvD,WAAK,eAAe;AAAA,IACtB;AACA,SAAK,eAAe;AAAA,EACtB;AAAA,EAES,uBAAuB;AAQ9B,QAPA,MAAM,qBAAA,GACN,KAAK,WAAA,GACD,KAAK,oBACP,aAAa,KAAK,eAAe,GACjC,KAAK,kBAAkB,SAGrB,KAAK,kBAAkB;AACzB,UAAI;AAAE,aAAK,iBAAiB,MAAA;AAAA,MAAS,QAAQ;AAAA,MAAe;AAC5D,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,kBAAkB;AACxB,0BAAsB,MAAM;AAC1B,MAAI,KAAK,gBACP,KAAK,YAAY,YAAY,KAAK,YAAY;AAAA,IAElD,CAAC;AAAA,EACH;AAAA,EAEQ,gBAAgB;AACtB,QAAI,CAAC,KAAK,YAAa;AACvB,UAAM,EAAE,WAAAO,GAAW,cAAAC,GAAc,cAAAC,EAAA,IAAiB,KAAK;AACvD,SAAK,iBAAiBD,IAAeD,IAAYE,IAAe;AAAA,EAClE;AAAA;AAAA,EAGQ,gBAA0D;AAChE,WAAO,KAAK,UAAU,IAAI,CAAAC,OAAM;AAAA,MAC9B,MAAMA,EAAE;AAAA,MACR,SAASA,EAAE,SAASA,EAAE,aAAa,GAAG,WAAW;AAAA,IAAA,EACjD;AAAA,EACJ;AAAA;AAAA,EAGQ,gBAAgB;AACtB,IAAI,KAAK,UAAU,SAAS,KAAK,gBAC/B,KAAK,YAAY,KAAK,UAAU,MAAM,KAAK,UAAU,SAAS,KAAK,WAAW;AAAA,EAElF;AAAA;AAAA,EAGA,WAAWC,GAAqBC,GAAyB;AACvD,UAAMC,IAAK,KAAK,OAAA;AAChB,gBAAK,YAAY,CAAC,GAAG,KAAK,WAAW;AAAA,MACnC,IAAAA;AAAA,MACA,MAAAF;AAAA,MACA,UAAU,CAAC,EAAE,SAAAC,GAAS,WAAW,KAAK,IAAA,GAAO;AAAA,MAC7C,eAAe;AAAA,IAAA,CAChB,GACD,KAAK,cAAA,GACL,KAAK,gBAAA,GACEC;AAAA,EACT;AAAA;AAAA,EAGA,gBAAgB;AACd,SAAK,YAAY,CAAA,GACjB,KAAK,aAAa,CAAA,GAClB,KAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,MAAc,eAAe;AAC3B,QAAI,CAAC,KAAK,OAAO,UAAU,CAAC,KAAK,YAAY,KAAK,gBAAgB,KAAK,YAAa;AAEpF,UAAMC,IAAO,KAAK,OAAO,KAAA;AACzB,SAAK,SAAS,IACd,KAAK,aAAa,CAAA;AAGlB,UAAMR,IAAW,KAAK,YAAY,cAAc,qBAAqB;AACrE,IAAIA,MAAYA,EAAS,QAAQ,IAAIA,EAAS,MAAM,SAAS,SAE7D,KAAK,YAAY,CAAC,GAAG,KAAK,WAAW;AAAA,MACnC,IAAI,KAAK,OAAA;AAAA,MACT,MAAM;AAAA,MACN,UAAU,CAAC,EAAE,SAASQ,GAAM,WAAW,KAAK,IAAA,GAAO;AAAA,MACnD,eAAe;AAAA,IAAA,CAChB,GACD,KAAK,cAAA,GAEL,KAAK,cAAc,IAAI,YAAY,mBAAmB;AAAA,MACpD,SAAS;AAAA,MAAM,UAAU;AAAA,MACzB,QAAQ,EAAE,SAASA,GAAM,WAAW,KAAK,MAAI;AAAA,IAAE,CAChD,CAAC,GAEF,MAAM,KAAK,gBACX,KAAK,gBAAA,GACL,KAAK,cAAc,IACnB,KAAK,mBAAmB,IAAI,gBAAA;AAE5B,UAAMC,IAAqB;AAAA,MACzB,SAAS,KAAK,YAAY,SAAS,IAAI,KAAK,cAAc,CAAC,EAAE,MAAM,oBAAoB;AAAA,MACvF,MAAM;AAAA,QACJ,cAAcD;AAAA,QACd,qBAAqB,KAAK,UAAU,KAAK,eAAe;AAAA,MAAA;AAAA,IAC1D;AAGF,QAAI;AACF,MAAI,KAAK,gBAAgB,KAAK,SAAS,eACrC,MAAM,KAAK,eAAeC,CAAO,IAEjC,MAAM,KAAK,kBAAkBA,CAAO;AAAA,IAExC,SAASC,GAAc;AACrB,UAAI,KAAK,kBAAkB,OAAO,QAAS;AAC3C,WAAK,cAAc,IACnB,KAAK,eAAe;AACpB,YAAMC,IAASD,aAAe,QAAQA,EAAI,UAAU;AACpD,WAAK,YAAY,CAAC,GAAG,KAAK,WAAW;AAAA,QACnC,IAAI,KAAK,OAAA;AAAA,QACT,MAAM;AAAA,QACN,UAAU,CAAC,EAAE,SAASC,GAAQ,WAAW,KAAK,IAAA,GAAO;AAAA,QACrD,eAAe;AAAA,QACf,SAAS;AAAA,MAAA,CACV,GACD,KAAK,cAAA,GACL,KAAK,cAAc,IAAI,YAAY,YAAY;AAAA,QAC7C,SAAS;AAAA,QAAM,UAAU;AAAA,QACzB,QAAQ,EAAE,OAAOA,GAAQ,WAAW,KAAK,MAAI;AAAA,MAAE,CAChD,CAAC;AAAA,IACJ,UAAA;AACE,WAAK,eAAe,IACpB,KAAK,cAAc,IACnB,KAAK,mBAAmB,MACxB,MAAM,KAAK,gBACX,KAAK,gBAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEA,MAAc,kBAAkBF,GAAoB;AAClD,UAAMG,IAA4B,EAAE,QAAQ,KAAK,iBAAkB,OAAA,GAC7Db,IAAmB,MAAM,KAAK,SAAU;AAAA,MAC5C,KAAK;AAAA,MACLU;AAAA,MACAG;AAAA,IAAA;AAGF,SAAK,cAAc;AACnB,UAAMC,IAAY;AAAA,MAChBd,EAAO,eACHA,EAAO,UAAU,WACjBA,EAAO,UAAU,QAClB;AAAA,IAAA;AAGL,SAAK,YAAY,CAAC,GAAG,KAAK,WAAW;AAAA,MACnC,IAAI,KAAK,OAAA;AAAA,MACT,MAAM;AAAA,MACN,UAAU,CAAC,EAAE,SAASc,GAAW,WAAW,KAAK,IAAA,GAAO;AAAA,MACxD,eAAe;AAAA,IAAA,CAChB,GACD,KAAK,cAAA,GAEL,KAAK,cAAc,IAAI,YAAY,wBAAwB;AAAA,MACzD,SAAS;AAAA,MAAM,UAAU;AAAA,MACzB,QAAQ,EAAE,SAASA,GAAW,WAAW,KAAK,MAAI;AAAA,IAAE,CACrD,CAAC;AAAA,EACJ;AAAA,EAEA,MAAc,eAAeJ,GAAoB;AAC/C,SAAK,cAAc,IACnB,KAAK,eAAe,IACpB,KAAK,oBAAoB;AAEzB,UAAMK,IAAW;AACjB,SAAK,YAAY,CAAC,GAAG,KAAK,WAAW;AAAA,MACnC,IAAIA;AAAA,MACJ,MAAM;AAAA,MACN,UAAU,CAAC,EAAE,SAAS,IAAI,WAAW,KAAK,IAAA,GAAO;AAAA,MACjD,eAAe;AAAA,IAAA,CAChB;AAED,UAAMF,IAA4B,EAAE,QAAQ,KAAK,iBAAkB,OAAA,GAC7DG,IAAY,KAAK,SAAU;AAAA,MAC/B,KAAK;AAAA,MACLN;AAAA,MACAG;AAAA,IAAA;AAGF,qBAAiBI,KAAWD,GAAW;AACrC,UAAI,KAAK,kBAAkB,OAAO,QAAS;AAC3C,YAAME,IAAQ,OAAOD,EAAQ,eAAeA,EAAQ,UAAU,WAAWA,EAAQ,UAAU,QAAQ,EAAE;AACrG,WAAK,qBAAqBC,GAE1B,KAAK,YAAY,KAAK,UAAU;AAAA,QAAI,OAClCb,EAAE,OAAOU,IACL,EAAE,GAAGV,GAAG,UAAU,CAAC,EAAE,SAAS,KAAK,mBAAmB,WAAW,KAAK,MAAI,CAAG,MAC7EA;AAAA,MAAA,GAEN,KAAK,gBAAA;AAAA,IACP;AAEA,SAAK,eAAA;AAAA,EACP;AAAA;AAAA,EAGA,eAAea,GAAe;AAC5B,SAAK,eAAe,IACpB,KAAK,cAAc,IACnB,KAAK,qBAAqBA;AAE1B,UAAMH,IAAW;AAGjB,IAFkB,KAAK,UAAU,KAAK,CAAAV,MAAKA,EAAE,OAAOU,CAAQ,IAG1D,KAAK,YAAY,KAAK,UAAU;AAAA,MAAI,OAClCV,EAAE,OAAOU,IACL,EAAE,GAAGV,GAAG,UAAU,CAAC,EAAE,SAAS,KAAK,mBAAmB,WAAW,KAAK,MAAI,CAAG,MAC7EA;AAAA,IAAA,IAGN,KAAK,YAAY,CAAC,GAAG,KAAK,WAAW;AAAA,MACnC,IAAIU;AAAA,MACJ,MAAM;AAAA,MACN,UAAU,CAAC,EAAE,SAAS,KAAK,mBAAmB,WAAW,KAAK,IAAA,GAAO;AAAA,MACrE,eAAe;AAAA,IAAA,CAChB,GAEH,KAAK,gBAAA;AAAA,EACP;AAAA;AAAA,EAGA,eAAeI,GAAsB;AACnC,SAAK,eAAe;AACpB,UAAMC,IAAQ,KAAK,OAAA;AAGnB,SAAK,YAAY,KAAK,UAAU;AAAA,MAAI,CAAAf,MAClCA,EAAE,OAAO,eAAe,EAAE,GAAGA,GAAG,IAAIe,MAAUf;AAAA,IAAA,GAEhD,KAAK,cAAA;AAEL,UAAMgB,IAAU,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC;AACxD,SAAK,oBAAoB,IACrBF,WAAgB,aAAaA,IAEjC,KAAK,cAAc,IAAI,YAAY,wBAAwB;AAAA,MACzD,SAAS;AAAA,MAAM,UAAU;AAAA,MACzB,QAAQ,EAAE,SAASE,GAAS,SAAS,CAAC,GAAG,WAAW,IAAI,WAAW,KAAK,IAAA,EAAI;AAAA,IAAE,CAC/E,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,qBAA6B;AAC3B,WAAO,KAAK,UAAU,IAAI,CAAAhB,MAAK;AAC7B,YAAMiB,IAAIjB,EAAE,SAASA,EAAE,aAAa;AACpC,aAAO,KAAKA,EAAE,SAAS,SAAS,SAAS,IAAI,OAAOiB,EAAE,OAAO;AAAA,IAC/D,CAAC,EAAE,KAAK;AAAA;AAAA,CAAM;AAAA,EAChB;AAAA,EAEQ,cAAc;AACpB,SAAK,kBAAkB,MAAA,GACvB,KAAK,eAAe,IACpB,KAAK,cAAc,IACnB,KAAK,cAAc,IAAI,YAAY,gBAAgB,EAAE,SAAS,IAAM,UAAU,GAAA,CAAM,CAAC;AAAA,EACvF;AAAA,EAEQ,YAAYC,GAAc;AAChC,UAAMd,IAAOc,EAAI,SAASA,EAAI,aAAa,EAAG;AAC9C,cAAU,WAAW,UAAUd,CAAI,GACnC,KAAK,YAAYc,EAAI,IACjB,KAAK,mBAAiB,aAAa,KAAK,eAAe,GAC3D,KAAK,kBAAkB,WAAW,MAAM;AAAE,WAAK,YAAY,MAAM,KAAK,kBAAkB;AAAA,IAAW,GAAG,GAAI,GAC1G,KAAK,cAAc,IAAI,YAAY,gBAAgB;AAAA,MACjD,SAAS;AAAA,MAAM,UAAU;AAAA,MACzB,QAAQ,EAAE,SAASd,EAAA;AAAA,IAAK,CACzB,CAAC;AAAA,EACJ;AAAA,EAEQ,kBAAkBc,GAAc;AACtC,SAAK,cAAc,IAAI,YAAY,sBAAsB;AAAA,MACvD,SAAS;AAAA,MAAM,UAAU;AAAA,MACzB,QAAQ,EAAE,WAAWA,EAAI,GAAA;AAAA,IAAG,CAC7B,CAAC;AAAA,EACJ;AAAA,EAEQ,YAAYA,GAAcC,GAAuB;AACvD,SAAK,cAAc,IAAI,YAAY,gBAAgB;AAAA,MACjD,SAAS;AAAA,MAAM,UAAU;AAAA,MACzB,QAAQ,EAAE,WAAWD,EAAI,IAAI,QAAAC,EAAA;AAAA,IAAO,CACrC,CAAC;AAAA,EACJ;AAAA,EAEQ,gBAAgBf,GAAc;AACpC,SAAK,SAASA,GACd,KAAK,aAAa,CAAA,GAClB,KAAK,aAAA;AAAA,EACP;AAAA,EAEQ,eAAec,GAAcE,GAAe;AAClD,UAAMC,IAASH,EAAI,gBAAgBE;AACnC,IAAIC,KAAU,KAAKA,IAASH,EAAI,SAAS,WAEvC,KAAK,YAAY,KAAK,UAAU;AAAA,MAAI,CAAAlB,MAClCA,EAAE,OAAOkB,EAAI,KAAK,EAAE,GAAGlB,GAAG,eAAeqB,MAAWrB;AAAA,IAAA;AAAA,EAG1D;AAAA,EAEQ,eAAesB,GAAkB;AACvC,IAAIA,EAAE,QAAQ,WAAW,CAACA,EAAE,YAAY,CAAC,KAAK,iBAC5CA,EAAE,eAAA,GACF,KAAK,aAAA;AAAA,EAET;AAAA,EAES,SAAS;AAChB,WAAK,KAAK,WAWHC;AAAA;AAAA;AAAA,mGAGwF,KAAK,aAAa;AAAA,cACvG,KAAK,UAAU,WAAW,KAAK,CAAC,KAAK,cAAcA;AAAA;AAAA;AAAA,0CAGvB,KAAK,cAAc;AAAA;AAAA,gBAE7C,KAAK,UAAU,IAAI,CAAAL,MAAO;AAC5B,YAAMD,IAAIC,EAAI,SAASA,EAAI,aAAa;AACxC,aAAOK;AAAA,kCACaL,EAAI,IAAI,gCAAgCA,EAAI,SAAS,SAAS,iBAAiB,aAAa;AAAA;AAAA,yCAErFA,EAAI,UAAU,UAAU,EAAE;AAAA,wBAC3CA,EAAI,SAAS,QAAQ,CAACA,EAAI,UACxBK,uBAA0BN,EAAE,OAAO,oBACnCA,EAAE,OAAO;AAAA,wBACX,KAAK,gBAAgBC,EAAI,OAAO,eAAeK,qDAAwDC,CAAO;AAAA;AAAA;AAAA,sBAGhHN,EAAI,SAAS,QAAQ,KAAK,eAAe,CAAC,KAAK,eAAeK;AAAA;AAAA;AAAA,mCAGjD,KAAK,cAAcL,EAAI,KAAK,YAAY,MAAM;AAAA,mCAC9C,MAAM,KAAK,YAAYA,CAAG,CAAC;AAAA,uCACvB,KAAK,cAAcA,EAAI,KAAK,wBAAwB,cAAc;AAAA,wDACjD,KAAK,cAAcA,EAAI,KAAK,UAAU,MAAM;AAAA,4BACxE,KAAK,cAAcA,EAAI,KAAK,WAAW,MAAM;AAAA;AAAA,yEAEA,MAAM,KAAK,kBAAkBA,CAAG,CAAC;AAAA;AAAA;AAAA,yEAGjC,MAAM,KAAK,YAAYA,GAAK,IAAI,CAAC;AAAA;AAAA;AAAA,yEAGjC,MAAM,KAAK,YAAYA,GAAK,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA,wBAIpFM,CAAO;AAAA;AAAA,sBAETN,EAAI,SAAS,SAAS,IAAIK;AAAA;AAAA,4EAE4BL,EAAI,kBAAkB,CAAC,WAAW,MAAM,KAAK,eAAeA,GAAK,EAAE,CAAC;AAAA;AAAA;AAAA,sDAG1FA,EAAI,gBAAgB,CAAC,MAAMA,EAAI,SAAS,MAAM;AAAA,4EACxBA,EAAI,kBAAkBA,EAAI,SAAS,SAAS,CAAC,WAAW,MAAM,KAAK,eAAeA,GAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,wBAI7IM,CAAO;AAAA;AAAA;AAAA;AAAA,IAInB,CAAC,CAAC;AAAA;AAAA,cAEA,KAAK,cAAcD;AAAA;AAAA;AAAA;AAAA,gBAIjBC,CAAO;AAAA;AAAA;AAAA,YAGX,KAAK,iBAAiBD;AAAA;AAAA,uBAEX,KAAK,eAAe;AAAA;AAAA;AAAA,cAG7BC,CAAO;AAAA;AAAA,YAER,KAAK,gBAAgB,KAAK,cAAeD;AAAA,yEACmB,KAAK,WAAW;AAAA;AAAA;AAAA,cAG3EC,CAAO;AAAA;AAAA,YAET,KAAK,WAAW,SAAS,KAAK,KAAK,gBAAgBD;AAAA;AAAA;AAAA,uBAGxC,KAAK,UAAU;AAAA;AAAA;AAAA,0BAGZ,KAAK,gBAAgB,KAAK,WAAW;AAAA,oCAC3B,CAACD,MAAmC,KAAK,gBAAgBA,EAAE,OAAO,IAAI,CAAC;AAAA;AAAA,cAE7FE,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAOO,KAAK,WAAW;AAAA,uBACrB,KAAK,MAAM;AAAA,0BACR,KAAK,gBAAgB,KAAK,WAAW;AAAA,uBACxC,CAACF,MAAa;AACrB,YAAMG,IAAKH,EAAE;AACb,WAAK,SAASG,EAAG,OACjBA,EAAG,MAAM,SAAS,QAClBA,EAAG,MAAM,SAASA,EAAG,eAAe;AAAA,IACtC,CAAC;AAAA,yBACU,KAAK,cAAc;AAAA,kCACV,MAAM,KAAK,eAAe,EAAI;AAAA,gCAChC,MAAM,KAAK,eAAe,EAAK;AAAA;AAAA;AAAA,cAGjD,KAAK,aAAa,KAAK,sBAAA,IAA0BF;AAAA;AAAA,0CAErB,KAAK,eAAe,cAAc,EAAE;AAAA,yBACrD,KAAK,YAAY;AAAA,4BACd,KAAK,gBAAgB,KAAK,WAAW;AAAA,8BACnC,KAAK,eAAe,qBAAqB,mBAAmB;AAAA,gCAC1D,KAAK,eAAe,SAAS,OAAO;AAAA;AAAA,gCAEpC,KAAK,eAAe,UAAU,KAAK;AAAA;AAAA,gBAEnDC,CAAO;AAAA;AAAA;AAAA,uBAGA,KAAK,YAAY;AAAA,0BACd,KAAK,gBAAgB,KAAK,eAAe,CAAC,KAAK,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QApIzED;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6IX;AACF;AA5xBapC,EACK,SAAS,CAACuC,GAAWC,GAAeC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA+NnD;AAE4BC,EAAA;AAAA,EAA5BC,EAAS,EAAE,SAAS,GAAA,CAAM;AAAA,GAlOhB3C,EAkOkB,WAAA,WAAA,CAAA;AACD0C,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAnOf3C,EAmOiB,WAAA,YAAA,CAAA;AACD0C,EAAA;AAAA,EAA1BC,EAAS,EAAE,MAAM,MAAA,CAAO;AAAA,GApOd3C,EAoOgB,WAAA,eAAA,CAAA;AACE0C,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GArOhB3C,EAqOkB,WAAA,eAAA,CAAA;AACA0C,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GAtOhB3C,EAsOkB,WAAA,iBAAA,CAAA;AACD0C,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAvOf3C,EAuOiB,WAAA,kBAAA,CAAA;AACA0C,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAxOf3C,EAwOiB,WAAA,eAAA,CAAA;AACA0C,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAzOf3C,EAyOiB,WAAA,eAAA,CAAA;AAEA0C,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GA3Of3C,EA2OiB,WAAA,UAAA,CAAA;AAEC0C,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GA7OhB3C,EA6OkB,WAAA,gBAAA,CAAA;AAEA0C,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GA/OhB3C,EA+OkB,WAAA,aAAA,CAAA;AAED0C,EAAA;AAAA,EAA3BC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAjPf3C,EAiPiB,WAAA,iBAAA,CAAA;AAEX0C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GAnPI5C,EAmPM,WAAA,aAAA,CAAA;AACA0C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GApPI5C,EAoPM,WAAA,gBAAA,CAAA;AACA0C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GArPI5C,EAqPM,WAAA,UAAA,CAAA;AACA0C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GAtPI5C,EAsPM,WAAA,gBAAA,CAAA;AACA0C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GAvPI5C,EAuPM,WAAA,eAAA,CAAA;AACA0C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GAxPI5C,EAwPM,WAAA,gBAAA,CAAA;AACA0C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GAzPI5C,EAyPM,WAAA,kBAAA,CAAA;AACA0C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GA1PI5C,EA0PM,WAAA,aAAA,CAAA;AACA0C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GA3PI5C,EA2PM,WAAA,cAAA,CAAA;AACA0C,EAAA;AAAA,EAAhBE,EAAA;AAAM,GA5PI5C,EA4PM,WAAA,qBAAA,CAAA;AAEW0C,EAAA;AAAA,EAA3BG,EAAM,WAAW;AAAA,GA9PP7C,EA8PiB,WAAA,eAAA,CAAA;AA9PjBA,IAAN0C,EAAA;AAAA,EADNI,EAAc,SAAS;AAAA,GACX9C,CAAA;"}
|
|
1
|
+
{"version":3,"file":"ai-chat.js","sources":["../../../src/components/ai-chat/ai-chat.ts"],"sourcesContent":["/**\n * @element ai-chat\n * Full-featured AI chat interface with streaming, markdown rendering, message actions, and follow-up chips.\n *\n * @example\n * ```html\n * <ai-chat\n * .aiClient=${myClient}\n * welcomeMessage=\"Ask me anything!\"\n * placeholder=\"Type a message...\"\n * ></ai-chat>\n * ```\n *\n * @fires {CustomEvent<{message: string}>} ai-message-sent - User sent a message\n * @fires {CustomEvent<{message: string}>} ai-response-received - AI response completed\n * @fires {CustomEvent<{error: string}>} ai-error - AI request failed\n * @fires {CustomEvent} ai-chat-stop - User stopped generation\n * @fires {CustomEvent<{content: string}>} ai-chat-copy - Message copied\n * @fires {CustomEvent<{messageId: string}>} ai-chat-regenerate - Regenerate requested\n * @fires {CustomEvent<{messageId: string, rating: 'up'|'down'}>} ai-chat-rate - Message rated\n *\n * @cssprop --cg-component-ai-chat-radius - Chat container border radius\n * @cssprop --cg-component-ai-chat-textarea-max-height - Max height for the input textarea\n * @cssprop --cg-color-surface-cards-background - Chat background\n * @cssprop --cg-color-action-primary-background-default - Send button, links, AI avatar\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, state, customElement, query } from 'lit/decorators.js';\nimport { AiIntent } from '@cognivo/core';\nimport type { AiClient, AiContext, AiRequestOptions, AiResult } from '@cognivo/core';\nimport { hostBlock, reducedMotion } from '../../styles/index.js';\n\ninterface MessageVersion {\n content: string;\n timestamp: number;\n}\n\ninterface Message {\n id: string;\n role: 'user' | 'ai';\n versions: MessageVersion[];\n activeVersion: number;\n isError?: boolean;\n}\n\n@customElement('ai-chat')\nexport class AiChat extends LitElement {\n static override styles = [hostBlock, reducedMotion, css`\n .chat {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: var(--cg-component-ai-chat-min-height);\n max-height: var(--cg-component-ai-chat-max-height);\n background: var(--cg-color-surface-cards-background);\n border-radius: var(--cg-component-ai-chat-radius);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n overflow: hidden;\n }\n\n .wrapper { position: relative; display: flex; flex-direction: column; flex: 1; min-height: 0; overflow: hidden; }\n\n /* ── Messages ── */\n .messages {\n flex: 1;\n overflow-y: auto;\n padding: var(--cg-spacing-24);\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-16);\n scroll-behavior: smooth;\n }\n\n .msg {\n max-width: 85%;\n animation: slideIn var(--cg-transition-duration-slow) var(--cg-transition-easing-default);\n }\n .msg.user { align-self: flex-end; }\n .msg.ai { align-self: flex-start; }\n\n @keyframes slideIn {\n from { opacity: 0; transform: translateY(var(--cg-spacing-8)); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n /* ── Bubble ── */\n .bubble {\n padding: var(--cg-spacing-12) var(--cg-spacing-20);\n border-radius: var(--cg-border-radius-200);\n line-height: var(--cg-line-height-relaxed);\n font-size: var(--cg-font-size-sm);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .msg.user .bubble {\n background: var(--cg-overlay-accent-subtle);\n color: var(--cg-color-surface-base-text);\n border-bottom-right-radius: var(--cg-spacing-4);\n border-color: var(--cg-overlay-accent-medium);\n }\n .msg.ai .bubble {\n background: var(--cg-color-surface-cards-background);\n color: var(--cg-color-surface-base-text);\n border-bottom-left-radius: var(--cg-spacing-4);\n }\n .msg.ai .bubble.error {\n background: var(--cg-color-status-error-background-default);\n color: var(--cg-color-status-error-text-default);\n border-color: var(--cg-color-status-error-border-default);\n }\n\n /* ── Streaming cursor ── */\n .cursor {\n display: inline-block;\n width: var(--cg-spacing-2);\n height: var(--cg-spacing-16);\n background: var(--cg-color-ai-streaming-background);\n margin-left: var(--cg-spacing-1);\n vertical-align: text-bottom;\n animation: blink 1s step-end infinite;\n }\n @keyframes blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n\n /* ── Message actions (layout only — buttons are cg-button) ── */\n .actions {\n display: flex;\n gap: var(--cg-spacing-4);\n margin-top: var(--cg-spacing-6);\n opacity: 0;\n transition: opacity var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .msg:hover .actions, .msg:focus-within .actions { opacity: 1; }\n\n /* ── Version nav ── */\n .version-nav {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-4);\n margin-top: var(--cg-spacing-4);\n }\n .version-label {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-surface-container-outlined);\n }\n\n /* ── Thinking ── */\n .thinking-area {\n align-self: flex-start;\n padding: 0 var(--cg-spacing-20) var(--cg-spacing-4);\n }\n\n /* ── Positioned elements ── */\n .stop-btn { margin: 0 auto var(--cg-spacing-8); }\n .scroll-btn { position: absolute; bottom: var(--cg-spacing-80); right: var(--cg-spacing-20); z-index: 10; }\n .follow-ups { padding: 0 var(--cg-spacing-20) var(--cg-spacing-12); }\n\n /* ── Input area — fused container like ChatGPT/Claude ── */\n .input-area {\n padding: var(--cg-spacing-12) var(--cg-spacing-16);\n flex-shrink: 0;\n }\n .input-box {\n display: flex;\n align-items: flex-end;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-8) var(--cg-spacing-8) var(--cg-spacing-8) var(--cg-spacing-16);\n background: var(--cg-color-input-background-default);\n border: var(--cg-border-width-50) solid var(--cg-color-input-border-default);\n border-radius: var(--cg-border-radius-200);\n transition:\n border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n box-shadow var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .input-box:focus-within {\n border-color: var(--cg-color-input-border-focus);\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n .input-box textarea {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n color: var(--cg-color-input-text-default);\n font: inherit;\n font-size: var(--cg-font-size-sm);\n line-height: var(--cg-line-height-relaxed);\n resize: none;\n padding: var(--cg-spacing-4) 0;\n min-height: var(--cg-spacing-24);\n max-height: var(--cg-component-ai-chat-textarea-max-height);\n }\n .input-box textarea::placeholder {\n color: var(--cg-color-input-text-placeholder);\n }\n /* Shared icon button style for send + mic */\n .icon-btn {\n flex-shrink: 0;\n width: var(--cg-spacing-32);\n height: var(--cg-spacing-32);\n border-radius: var(--cg-border-radius-full);\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition:\n background-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n opacity var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .icon-btn:active:not(:disabled) { transform: scale(var(--cg-interaction-press-scale)); }\n .icon-btn:disabled { opacity: 0.3; cursor: default; }\n\n .send-btn {\n background: var(--cg-color-action-primary-background-default);\n color: var(--cg-color-action-primary-text-default);\n }\n .send-btn:hover:not(:disabled) {\n background: var(--cg-color-action-primary-background-hover);\n }\n /* Themeable disabled fill instead of dimming the action color to an unreadable smudge. */\n .send-btn:disabled {\n opacity: 1;\n background: var(--cg-color-action-primary-background-disable);\n color: var(--cg-color-action-primary-text-disable);\n }\n\n .mic-btn {\n background: transparent;\n color: var(--cg-color-input-text-placeholder);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .mic-btn:hover:not(:disabled) {\n color: var(--cg-color-surface-base-text);\n border-color: var(--cg-color-input-border-hover);\n }\n .mic-btn.recording {\n color: var(--cg-color-status-error-text-default);\n border-color: var(--cg-color-status-error-text-default);\n background: var(--cg-color-status-error-background-default);\n animation: micPulse 1.5s ease-in-out infinite;\n }\n @keyframes micPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.6; }\n }\n\n /* ── Empty state ── */\n .empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: var(--cg-color-surface-container-outlined);\n gap: var(--cg-spacing-12);\n text-align: center;\n }\n .empty-text {\n font-size: var(--cg-font-size-base);\n font-weight: var(--cg-font-weight-medium);\n }\n\n /* ── Rounded variants ── */\n :host([rounded=\"none\"]) .chat { border-radius: 0; }\n :host([rounded=\"sm\"]) .chat { border-radius: var(--cg-border-radius-100); }\n :host([rounded=\"md\"]) .chat { border-radius: var(--cg-border-radius-150); }\n :host([rounded=\"lg\"]) .chat { border-radius: var(--cg-component-ai-chat-radius); }\n\n /* Reduced motion */\n @media (prefers-reduced-motion: reduce) {\n .msg { animation: none; }\n .cursor { animation: none; opacity: 1; }\n }\n `];\n\n @property({ reflect: true }) rounded: 'none' | 'sm' | 'md' | 'lg' = 'lg';\n @property({ type: Object }) aiClient: AiClient | null = null;\n @property({ type: Array }) chatDataset: unknown[] = [];\n @property({ type: Boolean }) showActions: boolean = true;\n @property({ type: Boolean }) showFollowUps: boolean = true;\n @property({ type: String }) welcomeMessage: string = 'Ask me about your data!';\n @property({ type: String }) placeholder: string = 'Type a message...';\n @property({ type: Number }) maxMessages: number = 100;\n /** AI intent to invoke (default: 'chat'). Override for domain-specific intents. */\n @property({ type: String }) intent: string = 'chat';\n /** When true and aiClient.streamIntent exists, uses streaming instead of runIntent */\n @property({ type: Boolean }) useStreaming: boolean = false;\n /** Show mic button for voice input (uses Web Speech API) */\n @property({ type: Boolean }) showVoice: boolean = false;\n /** BCP-47 language for voice recognition */\n @property({ type: String }) voiceLanguage: string = 'en-US';\n\n @state() private _messages: Message[] = [];\n @state() private _isRecording: boolean = false;\n @state() private _input: string = '';\n @state() private _isStreaming: boolean = false;\n @state() private _isThinking: boolean = false;\n @state() private _isComposing: boolean = false;\n @state() private _showScrollBtn: boolean = false;\n @state() private _copiedId: string | null = null;\n @state() private _followUps: string[] = [];\n @state() private _streamingContent: string = '';\n\n @query('.messages') private _messagesEl!: HTMLDivElement;\n\n private _msgCounter: number = 0;\n private _abortController: AbortController | null = null;\n private _recognition: SpeechRecognition | null = null;\n private _copyResetTimer: ReturnType<typeof setTimeout> | undefined;\n\n private _genId(): string { return `msg-${++this._msgCounter}`; }\n\n // ── Voice input ──\n\n private _getSpeechRecognition(): SpeechRecognitionCtor | null {\n if (typeof window === 'undefined') return null;\n return window.SpeechRecognition || window.webkitSpeechRecognition || null;\n }\n\n private _toggleVoice() {\n if (this._isRecording) {\n this._stopVoice();\n } else {\n this._startVoice();\n }\n }\n\n private _startVoice() {\n const Ctor = this._getSpeechRecognition();\n if (!Ctor) return;\n\n this._stopVoice();\n const recognition = new Ctor();\n recognition.lang = this.voiceLanguage;\n recognition.continuous = false;\n recognition.interimResults = true;\n\n recognition.onstart = () => {\n this._isRecording = true;\n };\n\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n let interim = '';\n let final = '';\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (!result) continue;\n if (result.isFinal) {\n final += result[0]?.transcript ?? '';\n } else {\n interim += result[0]?.transcript ?? '';\n }\n }\n if (final) {\n this._input = (this._input ? this._input + ' ' : '') + final.trim();\n } else if (interim) {\n // Show interim in textarea placeholder feel — append to input temporarily\n const textarea = this.shadowRoot?.querySelector('textarea');\n if (textarea) textarea.placeholder = interim + '...';\n }\n };\n\n recognition.onend = () => {\n this._isRecording = false;\n this._recognition = null;\n // Restore placeholder\n const textarea = this.shadowRoot?.querySelector('textarea');\n if (textarea) textarea.placeholder = this.placeholder;\n };\n\n recognition.onerror = () => {\n this._isRecording = false;\n this._recognition = null;\n };\n\n this._recognition = recognition;\n try {\n recognition.start();\n } catch {\n this._isRecording = false;\n }\n }\n\n private _stopVoice() {\n if (this._recognition) {\n try { this._recognition.stop(); } catch { /* ignore */ }\n this._recognition = null;\n }\n this._isRecording = false;\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this._stopVoice();\n if (this._copyResetTimer) {\n clearTimeout(this._copyResetTimer);\n this._copyResetTimer = undefined;\n }\n // Abort any in-flight AI request on unmount\n if (this._abortController) {\n try { this._abortController.abort(); } catch { /* ignore */ }\n this._abortController = null;\n }\n }\n\n private _scrollToBottom() {\n requestAnimationFrame(() => {\n if (this._messagesEl) {\n this._messagesEl.scrollTop = this._messagesEl.scrollHeight;\n }\n });\n }\n\n private _handleScroll() {\n if (!this._messagesEl) return;\n const { scrollTop, scrollHeight, clientHeight } = this._messagesEl;\n this._showScrollBtn = scrollHeight - scrollTop - clientHeight > 100;\n }\n\n /** Build conversation history for AI context */\n private _buildHistory(): Array<{ role: string; content: string }> {\n return this._messages.map(m => ({\n role: m.role,\n content: m.versions[m.activeVersion]?.content ?? '',\n }));\n }\n\n /** Enforce maxMessages limit by trimming oldest messages */\n private _trimMessages() {\n if (this._messages.length > this.maxMessages) {\n this._messages = this._messages.slice(this._messages.length - this.maxMessages);\n }\n }\n\n /** Add a message programmatically from outside the component */\n addMessage(role: 'user' | 'ai', content: string): string {\n const id = this._genId();\n this._messages = [...this._messages, {\n id,\n role,\n versions: [{ content, timestamp: Date.now() }],\n activeVersion: 0,\n }];\n this._trimMessages();\n this._scrollToBottom();\n return id;\n }\n\n /** Clear all messages */\n clearMessages() {\n this._messages = [];\n this._followUps = [];\n this._streamingContent = '';\n }\n\n private async _sendMessage() {\n if (!this._input.trim() || !this.aiClient || this._isStreaming || this._isThinking) return;\n\n const text = this._input.trim();\n this._input = '';\n this._followUps = [];\n\n // Reset textarea height after clearing\n const textarea = this.shadowRoot?.querySelector('.input-box textarea') as HTMLTextAreaElement | null;\n if (textarea) { textarea.value = ''; textarea.style.height = 'auto'; }\n\n this._messages = [...this._messages, {\n id: this._genId(),\n role: 'user',\n versions: [{ content: text, timestamp: Date.now() }],\n activeVersion: 0,\n }];\n this._trimMessages();\n\n this.dispatchEvent(new CustomEvent('ai-message-sent', {\n bubbles: true, composed: true,\n detail: { message: text, timestamp: Date.now() },\n }));\n\n await this.updateComplete;\n this._scrollToBottom();\n this._isThinking = true;\n this._abortController = new AbortController();\n\n const context: AiContext = {\n dataset: this.chatDataset.length > 0 ? this.chatDataset : [{ info: 'No data provided' }],\n meta: {\n userQuestion: text,\n conversationHistory: JSON.stringify(this._buildHistory()),\n },\n };\n\n try {\n if (this.useStreaming && this.aiClient.streamIntent) {\n await this._sendStreaming(context);\n } else {\n await this._sendNonStreaming(context);\n }\n } catch (err: unknown) {\n if (this._abortController?.signal.aborted) return;\n this._isThinking = false;\n this._isStreaming = false;\n const errMsg = err instanceof Error ? err.message : 'An error occurred';\n this._messages = [...this._messages, {\n id: this._genId(),\n role: 'ai',\n versions: [{ content: errMsg, timestamp: Date.now() }],\n activeVersion: 0,\n isError: true,\n }];\n this._trimMessages();\n this.dispatchEvent(new CustomEvent('ai-error', {\n bubbles: true, composed: true,\n detail: { error: errMsg, timestamp: Date.now() },\n }));\n } finally {\n this._isStreaming = false;\n this._isThinking = false;\n this._abortController = null;\n await this.updateComplete;\n this._scrollToBottom();\n }\n }\n\n private async _sendNonStreaming(context: AiContext) {\n const options: AiRequestOptions = { signal: this._abortController!.signal };\n const result: AiResult = await this.aiClient!.runIntent(\n this.intent as AiIntent,\n context,\n options,\n );\n\n this._isThinking = false;\n const aiContent = String(\n result.explanation\n || (result.metadata?.content)\n || (result.metadata?.text)\n || 'Analysis complete.'\n );\n\n this._messages = [...this._messages, {\n id: this._genId(),\n role: 'ai',\n versions: [{ content: aiContent, timestamp: Date.now() }],\n activeVersion: 0,\n }];\n this._trimMessages();\n\n this.dispatchEvent(new CustomEvent('ai-response-received', {\n bubbles: true, composed: true,\n detail: { message: aiContent, timestamp: Date.now() },\n }));\n }\n\n private async _sendStreaming(context: AiContext) {\n this._isThinking = false;\n this._isStreaming = true;\n this._streamingContent = '';\n\n const streamId = 'msg-stream';\n this._messages = [...this._messages, {\n id: streamId,\n role: 'ai',\n versions: [{ content: '', timestamp: Date.now() }],\n activeVersion: 0,\n }];\n\n const options: AiRequestOptions = { signal: this._abortController!.signal };\n const generator = this.aiClient!.streamIntent!(\n this.intent as AiIntent,\n context,\n options,\n );\n\n for await (const partial of generator) {\n if (this._abortController?.signal.aborted) break;\n const token = String(partial.explanation || partial.metadata?.content || partial.metadata?.text || '');\n this._streamingContent += token;\n\n this._messages = this._messages.map(m =>\n m.id === streamId\n ? { ...m, versions: [{ content: this._streamingContent, timestamp: Date.now() }] }\n : m\n );\n this._scrollToBottom();\n }\n\n this.completeStream();\n }\n\n /** Append streaming content to a new or existing AI message (for external streaming control) */\n streamResponse(token: string) {\n this._isStreaming = true;\n this._isThinking = false;\n this._streamingContent += token;\n\n const streamId = 'msg-stream';\n const hasStream = this._messages.some(m => m.id === streamId);\n\n if (hasStream) {\n this._messages = this._messages.map(m =>\n m.id === streamId\n ? { ...m, versions: [{ content: this._streamingContent, timestamp: Date.now() }] }\n : m\n );\n } else {\n this._messages = [...this._messages, {\n id: streamId,\n role: 'ai',\n versions: [{ content: this._streamingContent, timestamp: Date.now() }],\n activeVersion: 0,\n }];\n }\n this._scrollToBottom();\n }\n\n /** Complete streaming */\n completeStream(followUps?: string[]) {\n this._isStreaming = false;\n const newId = this._genId();\n\n // Immutable update — replace stream id with permanent id\n this._messages = this._messages.map(m =>\n m.id === 'msg-stream' ? { ...m, id: newId } : m\n );\n this._trimMessages();\n\n const lastMsg = this._messages[this._messages.length - 1];\n this._streamingContent = '';\n if (followUps) this._followUps = followUps;\n\n this.dispatchEvent(new CustomEvent('ai-response-received', {\n bubbles: true, composed: true,\n detail: { message: lastMsg?.versions[0]?.content ?? '', timestamp: Date.now() },\n }));\n }\n\n /** Export conversation as markdown */\n exportConversation(): string {\n return this._messages.map(m => {\n const v = m.versions[m.activeVersion]!;\n return `**${m.role === 'user' ? 'User' : 'AI'}:** ${v.content}`;\n }).join('\\n\\n');\n }\n\n private _handleStop() {\n this._abortController?.abort();\n this._isStreaming = false;\n this._isThinking = false;\n this.dispatchEvent(new CustomEvent('ai-chat-stop', { bubbles: true, composed: true }));\n }\n\n private _handleCopy(msg: Message) {\n const text = msg.versions[msg.activeVersion]!.content;\n navigator.clipboard?.writeText(text);\n this._copiedId = msg.id;\n if (this._copyResetTimer) clearTimeout(this._copyResetTimer);\n this._copyResetTimer = setTimeout(() => { this._copiedId = null; this._copyResetTimer = undefined; }, 2000);\n this.dispatchEvent(new CustomEvent('ai-chat-copy', {\n bubbles: true, composed: true,\n detail: { content: text },\n }));\n }\n\n private _handleRegenerate(msg: Message) {\n this.dispatchEvent(new CustomEvent('ai-chat-regenerate', {\n bubbles: true, composed: true,\n detail: { messageId: msg.id },\n }));\n }\n\n private _handleRate(msg: Message, rating: 'up' | 'down') {\n this.dispatchEvent(new CustomEvent('ai-chat-rate', {\n bubbles: true, composed: true,\n detail: { messageId: msg.id, rating },\n }));\n }\n\n private _handleFollowUp(text: string) {\n this._input = text;\n this._followUps = [];\n this._sendMessage();\n }\n\n private _switchVersion(msg: Message, delta: number) {\n const newIdx = msg.activeVersion + delta;\n if (newIdx >= 0 && newIdx < msg.versions.length) {\n // Immutable update — don't mutate the message directly\n this._messages = this._messages.map(m =>\n m.id === msg.id ? { ...m, activeVersion: newIdx } : m\n );\n }\n }\n\n private _handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter' && !e.shiftKey && !this._isComposing) {\n e.preventDefault();\n this._sendMessage();\n }\n }\n\n override render() {\n if (!this.aiClient) {\n return html`\n <div class=\"chat\">\n <div class=\"empty\" role=\"status\">\n <cg-icon name=\"settings\" size=\"lg\"></cg-icon>\n <div class=\"empty-text\">Set <code>aiClient</code> to start chatting</div>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"chat\">\n <div class=\"wrapper\">\n <div class=\"messages\" role=\"log\" aria-live=\"polite\" aria-label=\"Chat messages\" @scroll=${this._handleScroll}>\n ${this._messages.length === 0 && !this._isThinking ? html`\n <div class=\"empty\">\n <cg-icon name=\"chat\" size=\"lg\"></cg-icon>\n <div class=\"empty-text\">${this.welcomeMessage}</div>\n </div>\n ` : this._messages.map(msg => {\n const v = msg.versions[msg.activeVersion]!;\n return html`\n <div class=\"msg ${msg.role}\" role=\"article\" aria-label=\"${msg.role === 'user' ? 'Your message' : 'AI response'}\">\n <div class=\"msg-content\">\n <div class=\"bubble ${msg.isError ? 'error' : ''}\">\n ${msg.role === 'ai' && !msg.isError\n ? html`<cg-markdown .text=${v.content}></cg-markdown>`\n : v.content}\n ${this._isStreaming && msg.id === 'msg-stream' ? html`<span class=\"cursor\" aria-hidden=\"true\"></span>` : nothing}\n </div>\n\n ${msg.role === 'ai' && this.showActions && !this._isStreaming ? html`\n <div class=\"actions\">\n <cg-button variant=\"tertiary\" size=\"sm\"\n status=${this._copiedId === msg.id ? 'success' : 'idle'}\n @click=${() => this._handleCopy(msg)}\n aria-label=${this._copiedId === msg.id ? 'Copied to clipboard' : 'Copy message'}>\n <cg-icon slot=\"prefix\" name=${this._copiedId === msg.id ? 'check' : 'copy'} size=\"xs\"></cg-icon>\n ${this._copiedId === msg.id ? 'Copied' : 'Copy'}\n </cg-button>\n <cg-button variant=\"tertiary\" size=\"sm\" @click=${() => this._handleRegenerate(msg)} aria-label=\"Regenerate response\">\n <cg-icon slot=\"prefix\" name=\"refresh\" size=\"xs\"></cg-icon> Retry\n </cg-button>\n <cg-button variant=\"tertiary\" size=\"sm\" @click=${() => this._handleRate(msg, 'up')} aria-label=\"Rate good\">\n <cg-icon name=\"star\" size=\"xs\"></cg-icon>\n </cg-button>\n <cg-button variant=\"tertiary\" size=\"sm\" @click=${() => this._handleRate(msg, 'down')} aria-label=\"Rate bad\">\n <cg-icon name=\"warning\" size=\"xs\"></cg-icon>\n </cg-button>\n </div>\n ` : nothing}\n\n ${msg.versions.length > 1 ? html`\n <nav class=\"version-nav\" aria-label=\"Message versions\">\n <cg-button variant=\"tertiary\" size=\"sm\" ?disabled=${msg.activeVersion === 0} @click=${() => this._switchVersion(msg, -1)} aria-label=\"Previous version\">\n <cg-icon name=\"chevron-left\" size=\"xs\"></cg-icon>\n </cg-button>\n <span class=\"version-label\">${msg.activeVersion + 1} / ${msg.versions.length}</span>\n <cg-button variant=\"tertiary\" size=\"sm\" ?disabled=${msg.activeVersion === msg.versions.length - 1} @click=${() => this._switchVersion(msg, 1)} aria-label=\"Next version\">\n <cg-icon name=\"chevron-right\" size=\"xs\"></cg-icon>\n </cg-button>\n </nav>\n ` : nothing}\n </div>\n </div>\n `;\n })}\n\n ${this._isThinking ? html`\n <div class=\"thinking-area\" role=\"status\" aria-label=\"AI is thinking\">\n <ai-thinking text=\"Analyzing\" shimmer delay=\"0\"></ai-thinking>\n </div>\n ` : nothing}\n </div>\n\n ${this._showScrollBtn ? html`\n <cg-button class=\"scroll-btn\" variant=\"secondary\" size=\"sm\" rounded=\"full\"\n @click=${this._scrollToBottom} aria-label=\"Scroll to bottom\">\n <cg-icon name=\"arrow-down\" size=\"xs\"></cg-icon>\n </cg-button>\n ` : nothing}\n\n ${(this._isStreaming || this._isThinking) ? html`\n <cg-button class=\"stop-btn\" type=\"danger\" size=\"sm\" @click=${this._handleStop} aria-label=\"Stop generating\">\n <cg-icon slot=\"prefix\" name=\"close\" size=\"xs\"></cg-icon> Stop generating\n </cg-button>\n ` : nothing}\n\n ${this._followUps.length > 0 && this.showFollowUps ? html`\n <cg-follow-up\n class=\"follow-ups\"\n .items=${this._followUps}\n hideLabel\n variant=\"chips\"\n ?disabled=${this._isStreaming || this._isThinking}\n @cg-follow-up-click=${(e: CustomEvent<{text: string}>) => this._handleFollowUp(e.detail.text)}\n ></cg-follow-up>\n ` : nothing}\n </div>\n\n <div class=\"input-area\">\n <div class=\"input-box\">\n <textarea\n rows=\"1\"\n placeholder=${this.placeholder}\n .value=${this._input}\n ?disabled=${this._isStreaming || this._isThinking}\n @input=${(e: Event) => {\n const ta = e.target as HTMLTextAreaElement;\n this._input = ta.value;\n ta.style.height = 'auto';\n ta.style.height = ta.scrollHeight + 'px';\n }}\n @keydown=${this._handleKeyDown}\n @compositionstart=${() => this._isComposing = true}\n @compositionend=${() => this._isComposing = false}\n aria-label=\"Chat message\"\n ></textarea>\n ${this.showVoice && this._getSpeechRecognition() ? html`\n <button\n class=\"icon-btn mic-btn ${this._isRecording ? 'recording' : ''}\"\n @click=${this._toggleVoice}\n ?disabled=${this._isStreaming || this._isThinking}\n aria-label=\"${this._isRecording ? 'Stop voice input' : 'Start voice input'}\"\n aria-pressed=\"${this._isRecording ? 'true' : 'false'}\"\n >\n <cg-icon name=${this._isRecording ? 'close' : 'mic'} size=\"sm\"></cg-icon>\n </button>\n ` : nothing}\n <button\n class=\"icon-btn send-btn\"\n @click=${this._sendMessage}\n ?disabled=${this._isStreaming || this._isThinking || !this._input.trim()}\n aria-label=\"Send message\"\n >\n <cg-icon name=\"arrow-up\" size=\"sm\"></cg-icon>\n </button>\n </div>\n </div>\n </div>\n `;\n }\n}\n"],"names":["AiChat","LitElement","Ctor","recognition","event","interim","final","i","result","textarea","scrollTop","scrollHeight","clientHeight","m","role","content","id","text","context","err","errMsg","options","aiContent","streamId","generator","partial","token","followUps","newId","lastMsg","v","msg","rating","delta","newIdx","e","html","nothing","ta","hostBlock","reducedMotion","css","__decorateClass","property","state","query","customElement"],"mappings":"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"}
|
|
@@ -13,15 +13,9 @@ export declare class AiCitation extends LitElement {
|
|
|
13
13
|
private _expandedIndex;
|
|
14
14
|
private _sanitizeUrl;
|
|
15
15
|
private _relevanceClass;
|
|
16
|
-
private _relevanceLabel;
|
|
17
16
|
private _handleCiteClick;
|
|
18
17
|
private _renderCard;
|
|
19
18
|
render(): import('lit').TemplateResult<1> | typeof nothing;
|
|
20
19
|
}
|
|
21
|
-
declare global {
|
|
22
|
-
interface HTMLElementTagNameMap {
|
|
23
|
-
'ai-citation': AiCitation;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
20
|
export {};
|
|
27
21
|
//# sourceMappingURL=ai-citation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-citation.d.ts","sourceRoot":"","sources":["../../../src/components/ai-citation/ai-citation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ai-citation.d.ts","sourceRoot":"","sources":["../../../src/components/ai-citation/ai-citation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAa,OAAO,EAAE,MAAM,KAAK,CAAC;AAIrD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBACa,UAAW,SAAQ,UAAU;IACxC,OAAgB,MAAM,4BAgJnB;IAEwB,OAAO,EAAE,cAAc,EAAE,CAAM;IAC9C,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAY;IACnB,UAAU,SAAK;IAElC,OAAO,CAAC,cAAc,CAAM;IAErC,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,WAAW;IAiBV,MAAM;CA2ChB"}
|
|
@@ -1,32 +1,28 @@
|
|
|
1
|
-
import { css as v, LitElement as u, nothing as
|
|
1
|
+
import { css as v, LitElement as u, nothing as c, html as s } from "lit";
|
|
2
2
|
import { property as g, state as p, customElement as h } from "lit/decorators.js";
|
|
3
|
-
import { h as f, r as b } from "../../chunks/premium.css-
|
|
4
|
-
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return i && a && m(t, r, a), a;
|
|
3
|
+
import { h as f, r as b } from "../../chunks/premium.css-DHekUEUt.js";
|
|
4
|
+
var m = Object.defineProperty, x = Object.getOwnPropertyDescriptor, n = (e, i, t, a) => {
|
|
5
|
+
for (var r = a > 1 ? void 0 : a ? x(i, t) : i, l = e.length - 1, d; l >= 0; l--)
|
|
6
|
+
(d = e[l]) && (r = (a ? d(i, t, r) : d(r)) || r);
|
|
7
|
+
return a && r && m(i, t, r), r;
|
|
9
8
|
};
|
|
10
|
-
let
|
|
9
|
+
let o = class extends u {
|
|
11
10
|
constructor() {
|
|
12
11
|
super(...arguments), this.sources = [], this.mode = "inline", this.maxVisible = 5, this._expandedIndex = -1;
|
|
13
12
|
}
|
|
14
13
|
_sanitizeUrl(e) {
|
|
15
14
|
if (!e) return;
|
|
16
|
-
const
|
|
17
|
-
if (!
|
|
18
|
-
const
|
|
19
|
-
if (
|
|
20
|
-
if (
|
|
21
|
-
const
|
|
22
|
-
if (
|
|
15
|
+
const i = e.trim();
|
|
16
|
+
if (!i) return;
|
|
17
|
+
const t = i.toLowerCase().replace(/[\s\u0000-\u001f]/g, "");
|
|
18
|
+
if (t.startsWith("javascript:") || t.startsWith("data:") || t.startsWith("vbscript:")) return;
|
|
19
|
+
if (t.startsWith("http:") || t.startsWith("https:") || t.startsWith("//")) return i;
|
|
20
|
+
const a = i.indexOf(":"), r = i.indexOf("/");
|
|
21
|
+
if (a === -1 || r !== -1 && r < a) return i;
|
|
23
22
|
}
|
|
24
23
|
_relevanceClass(e) {
|
|
25
24
|
return e ? e >= 0.7 ? "high" : e >= 0.4 ? "medium" : "low" : "low";
|
|
26
25
|
}
|
|
27
|
-
_relevanceLabel(e) {
|
|
28
|
-
return e == null ? "Relevance unknown" : `Relevance: ${Math.round(e * 100)}%`;
|
|
29
|
-
}
|
|
30
26
|
_handleCiteClick(e) {
|
|
31
27
|
this._expandedIndex = this._expandedIndex === e ? -1 : e, this.dispatchEvent(new CustomEvent("ai-citation-click", {
|
|
32
28
|
bubbles: !0,
|
|
@@ -34,66 +30,62 @@ let c = class extends u {
|
|
|
34
30
|
detail: { index: e, source: this.sources[e] }
|
|
35
31
|
}));
|
|
36
32
|
}
|
|
37
|
-
_renderCard(e,
|
|
38
|
-
const
|
|
39
|
-
return
|
|
33
|
+
_renderCard(e, i) {
|
|
34
|
+
const t = this._sanitizeUrl(e.url);
|
|
35
|
+
return s`
|
|
40
36
|
<div class="source-card">
|
|
41
37
|
<div class="source-header">
|
|
42
|
-
<div class="source-number">${
|
|
43
|
-
${
|
|
44
|
-
<
|
|
45
|
-
<span class="relevance-dot ${this._relevanceClass(e.relevance)}" aria-label=${this._relevanceLabel(e.relevance)}></span>
|
|
46
|
-
</cg-tooltip>
|
|
38
|
+
<div class="source-number">${i + 1}</div>
|
|
39
|
+
${t ? s`<a class="source-title" href="${t}" target="_blank" rel="noopener">${e.title}</a>` : s`<span class="source-title">${e.title}</span>`}
|
|
40
|
+
<div class="relevance-dot ${this._relevanceClass(e.relevance)}" title="Relevance: ${e.relevance ? Math.round(e.relevance * 100) + "%" : "unknown"}"></div>
|
|
47
41
|
</div>
|
|
48
|
-
${e.excerpt ?
|
|
49
|
-
${
|
|
42
|
+
${e.excerpt ? s`<div class="source-excerpt">${e.excerpt}</div>` : c}
|
|
43
|
+
${t ? s`<div class="source-url">${t}</div>` : c}
|
|
50
44
|
</div>
|
|
51
45
|
`;
|
|
52
46
|
}
|
|
53
47
|
render() {
|
|
54
|
-
if (!this.sources.length) return
|
|
48
|
+
if (!this.sources.length) return c;
|
|
55
49
|
if (this.mode === "list")
|
|
56
|
-
return
|
|
50
|
+
return s`
|
|
57
51
|
<div class="list">
|
|
58
52
|
<div class="sources-label">Sources (${this.sources.length})</div>
|
|
59
|
-
${this.sources.map((
|
|
60
|
-
const
|
|
61
|
-
return
|
|
53
|
+
${this.sources.map((t, a) => {
|
|
54
|
+
const r = this._sanitizeUrl(t.url);
|
|
55
|
+
return s`
|
|
62
56
|
<div class="list-item">
|
|
63
|
-
<div class="source-number">${
|
|
57
|
+
<div class="source-number">${a + 1}</div>
|
|
64
58
|
<div class="list-content">
|
|
65
59
|
<div class="list-title">
|
|
66
|
-
${
|
|
60
|
+
${r ? s`<a href="${r}" target="_blank" rel="noopener">${t.title}</a>` : t.title}
|
|
67
61
|
</div>
|
|
68
|
-
${
|
|
62
|
+
${t.excerpt ? s`<div class="list-excerpt">${t.excerpt}</div>` : c}
|
|
69
63
|
</div>
|
|
70
|
-
<
|
|
71
|
-
<span class="relevance-dot ${this._relevanceClass(r.relevance)}" aria-label=${this._relevanceLabel(r.relevance)}></span>
|
|
72
|
-
</cg-tooltip>
|
|
64
|
+
<div class="relevance-dot ${this._relevanceClass(t.relevance)}"></div>
|
|
73
65
|
</div>
|
|
74
66
|
`;
|
|
75
67
|
})}
|
|
76
68
|
</div>
|
|
77
69
|
`;
|
|
78
|
-
const e = this.sources.slice(0, this.maxVisible),
|
|
79
|
-
return
|
|
80
|
-
<
|
|
81
|
-
${e.map((
|
|
82
|
-
<button
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
>${
|
|
89
|
-
${this._expandedIndex ===
|
|
70
|
+
const e = this.sources.slice(0, this.maxVisible), i = this.sources.length - this.maxVisible;
|
|
71
|
+
return s`
|
|
72
|
+
<div class="inline">
|
|
73
|
+
${e.map((t, a) => s`
|
|
74
|
+
<span class="cite-badge" tabindex="0" role="button"
|
|
75
|
+
aria-label="Source ${a + 1}: ${t.title}"
|
|
76
|
+
@click=${() => this._handleCiteClick(a)}
|
|
77
|
+
@keydown=${(r) => {
|
|
78
|
+
(r.key === "Enter" || r.key === " ") && (r.preventDefault(), this._handleCiteClick(a));
|
|
79
|
+
}}
|
|
80
|
+
>${a + 1}</span>
|
|
81
|
+
${this._expandedIndex === a ? this._renderCard(t, a) : c}
|
|
90
82
|
`)}
|
|
91
|
-
${
|
|
92
|
-
</
|
|
83
|
+
${i > 0 ? s`<span class="cite-badge" style="width:auto; padding:0 var(--cg-spacing-4);">+${i}</span>` : c}
|
|
84
|
+
</div>
|
|
93
85
|
`;
|
|
94
86
|
}
|
|
95
87
|
};
|
|
96
|
-
|
|
88
|
+
o.styles = [f, b, v`
|
|
97
89
|
/* ── Inline mode ── */
|
|
98
90
|
.inline { display: inline; }
|
|
99
91
|
|
|
@@ -112,8 +104,6 @@ c.styles = [f, b, v`
|
|
|
112
104
|
vertical-align: super;
|
|
113
105
|
margin: 0 var(--cg-spacing-1);
|
|
114
106
|
border: var(--cg-border-width-50) solid transparent;
|
|
115
|
-
padding: 0;
|
|
116
|
-
font-family: inherit;
|
|
117
107
|
transition:
|
|
118
108
|
background-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),
|
|
119
109
|
border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);
|
|
@@ -124,19 +114,14 @@ c.styles = [f, b, v`
|
|
|
124
114
|
}
|
|
125
115
|
.cite-badge:focus-visible {
|
|
126
116
|
outline: none;
|
|
127
|
-
box-shadow: 0 0 0 var(--cg-border-width-300) var(--cg-
|
|
128
|
-
}
|
|
129
|
-
.cite-badge.more {
|
|
130
|
-
width: auto;
|
|
131
|
-
padding: 0 var(--cg-spacing-4);
|
|
132
|
-
cursor: default;
|
|
117
|
+
box-shadow: 0 0 0 var(--cg-border-width-300) var(--cg-color-focus-ring);
|
|
133
118
|
}
|
|
134
119
|
|
|
135
120
|
/* ── Source card (expanded) ── */
|
|
136
121
|
.source-card {
|
|
137
122
|
background: var(--cg-color-surface-cards-background);
|
|
138
123
|
border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);
|
|
139
|
-
border-radius: var(--cg-
|
|
124
|
+
border-radius: var(--cg-border-radius-100);
|
|
140
125
|
padding: var(--cg-spacing-12);
|
|
141
126
|
margin: var(--cg-spacing-8) 0;
|
|
142
127
|
max-width: 400px;
|
|
@@ -153,7 +138,7 @@ c.styles = [f, b, v`
|
|
|
153
138
|
height: var(--cg-spacing-20);
|
|
154
139
|
border-radius: var(--cg-border-radius-50);
|
|
155
140
|
background: var(--cg-overlay-accent-light);
|
|
156
|
-
color: var(--cg-color-surface-
|
|
141
|
+
color: var(--cg-color-surface-base-text);
|
|
157
142
|
font-size: var(--cg-font-size-xs);
|
|
158
143
|
font-weight: var(--cg-font-weight-bold);
|
|
159
144
|
display: flex;
|
|
@@ -164,30 +149,24 @@ c.styles = [f, b, v`
|
|
|
164
149
|
.source-title {
|
|
165
150
|
font-size: var(--cg-font-size-sm);
|
|
166
151
|
font-weight: var(--cg-font-weight-medium);
|
|
167
|
-
color: var(--cg-color-surface-
|
|
152
|
+
color: var(--cg-color-surface-base-text);
|
|
168
153
|
text-decoration: none;
|
|
169
154
|
flex: 1;
|
|
170
155
|
min-width: 0;
|
|
171
156
|
overflow: hidden;
|
|
172
157
|
text-overflow: ellipsis;
|
|
173
158
|
white-space: nowrap;
|
|
174
|
-
border-radius: var(--cg-border-radius-50);
|
|
175
159
|
}
|
|
176
160
|
a.source-title:hover { text-decoration: underline; }
|
|
177
|
-
a.source-title:focus-visible {
|
|
178
|
-
outline: none;
|
|
179
|
-
box-shadow: 0 0 0 var(--cg-border-width-300) var(--cg-color-focus-ring);
|
|
180
|
-
}
|
|
181
161
|
|
|
182
|
-
/* Relevance dot — uses ai-confidence tier-3 tokens (theme-aware) */
|
|
183
162
|
.relevance-dot {
|
|
184
|
-
width: var(--cg-spacing-
|
|
185
|
-
height: var(--cg-spacing-
|
|
163
|
+
width: var(--cg-spacing-6);
|
|
164
|
+
height: var(--cg-spacing-6);
|
|
186
165
|
border-radius: var(--cg-border-radius-full);
|
|
187
166
|
flex-shrink: 0;
|
|
188
167
|
}
|
|
189
|
-
.relevance-dot.high { background: var(--cg-
|
|
190
|
-
.relevance-dot.medium { background: var(--cg-
|
|
168
|
+
.relevance-dot.high { background: var(--cg-color-status-success-text-default); }
|
|
169
|
+
.relevance-dot.medium { background: var(--cg-color-status-warning-text-default); }
|
|
191
170
|
.relevance-dot.low { background: var(--cg-color-input-text-placeholder); }
|
|
192
171
|
|
|
193
172
|
.source-excerpt {
|
|
@@ -228,18 +207,13 @@ c.styles = [f, b, v`
|
|
|
228
207
|
.list-title {
|
|
229
208
|
font-size: var(--cg-font-size-sm);
|
|
230
209
|
font-weight: var(--cg-font-weight-medium);
|
|
231
|
-
color: var(--cg-color-surface-
|
|
210
|
+
color: var(--cg-color-surface-base-text);
|
|
232
211
|
}
|
|
233
212
|
.list-title a {
|
|
234
|
-
color: var(--cg-color-surface-
|
|
213
|
+
color: var(--cg-color-surface-base-text);
|
|
235
214
|
text-decoration: none;
|
|
236
|
-
border-radius: var(--cg-border-radius-50);
|
|
237
215
|
}
|
|
238
216
|
.list-title a:hover { text-decoration: underline; }
|
|
239
|
-
.list-title a:focus-visible {
|
|
240
|
-
outline: none;
|
|
241
|
-
box-shadow: 0 0 0 var(--cg-border-width-300) var(--cg-color-focus-ring);
|
|
242
|
-
}
|
|
243
217
|
.list-excerpt {
|
|
244
218
|
font-size: var(--cg-font-size-xs);
|
|
245
219
|
color: var(--cg-color-input-text-placeholder);
|
|
@@ -249,7 +223,7 @@ c.styles = [f, b, v`
|
|
|
249
223
|
|
|
250
224
|
.sources-label {
|
|
251
225
|
font-size: var(--cg-font-size-xs);
|
|
252
|
-
font-weight: var(--cg-font-weight-
|
|
226
|
+
font-weight: var(--cg-font-weight-medium);
|
|
253
227
|
color: var(--cg-color-input-text-placeholder);
|
|
254
228
|
text-transform: uppercase;
|
|
255
229
|
letter-spacing: var(--cg-letter-spacing-wide);
|
|
@@ -258,20 +232,20 @@ c.styles = [f, b, v`
|
|
|
258
232
|
`];
|
|
259
233
|
n([
|
|
260
234
|
g({ type: Array })
|
|
261
|
-
],
|
|
235
|
+
], o.prototype, "sources", 2);
|
|
262
236
|
n([
|
|
263
237
|
g()
|
|
264
|
-
],
|
|
238
|
+
], o.prototype, "mode", 2);
|
|
265
239
|
n([
|
|
266
240
|
g({ type: Number })
|
|
267
|
-
],
|
|
241
|
+
], o.prototype, "maxVisible", 2);
|
|
268
242
|
n([
|
|
269
243
|
p()
|
|
270
|
-
],
|
|
271
|
-
|
|
244
|
+
], o.prototype, "_expandedIndex", 2);
|
|
245
|
+
o = n([
|
|
272
246
|
h("ai-citation")
|
|
273
|
-
],
|
|
247
|
+
], o);
|
|
274
248
|
export {
|
|
275
|
-
|
|
249
|
+
o as AiCitation
|
|
276
250
|
};
|
|
277
251
|
//# sourceMappingURL=ai-citation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-citation.js","sources":["../../../src/components/ai-citation/ai-citation.ts"],"sourcesContent":["/**\n * @element ai-citation\n * Inline numbered citation badges or bibliography list with expandable\n * source cards. Two modes:\n * - inline: small superscript-style number badges next to AI text;\n * clicking a badge expands a source card below.\n * - list: bibliography-style ordered list (Sources section).\n *\n * Dogfooded primitives: <cg-tooltip> for the relevance dot.\n *\n * @fires {CustomEvent<{index: number, source: CitationSource}>} ai-citation-click\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, state, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion } from '../../styles/index.js';\nimport '../cg-tooltip/cg-tooltip.js';\n\ninterface CitationSource {\n title: string;\n url?: string;\n excerpt?: string;\n relevance?: number;\n}\n\n@customElement('ai-citation')\nexport class AiCitation extends LitElement {\n static override styles = [hostBlock, reducedMotion, css`\n /* ── Inline mode ── */\n .inline { display: inline; }\n\n .cite-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--cg-spacing-16);\n height: var(--cg-spacing-16);\n border-radius: var(--cg-border-radius-50);\n background: var(--cg-overlay-accent-light);\n color: var(--cg-color-surface-base-text);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-bold);\n cursor: pointer;\n vertical-align: super;\n margin: 0 var(--cg-spacing-1);\n border: var(--cg-border-width-50) solid transparent;\n padding: 0;\n font-family: inherit;\n transition:\n background-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .cite-badge:hover {\n background: var(--cg-overlay-accent-medium);\n border-color: var(--cg-overlay-accent-strong);\n }\n .cite-badge:focus-visible {\n outline: none;\n box-shadow: 0 0 0 var(--cg-border-width-300) var(--cg-overlay-accent-strong);\n }\n .cite-badge.more {\n width: auto;\n padding: 0 var(--cg-spacing-4);\n cursor: default;\n }\n\n /* ── Source card (expanded) ── */\n .source-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-component-card-radius);\n padding: var(--cg-spacing-12);\n margin: var(--cg-spacing-8) 0;\n max-width: 400px;\n }\n\n .source-header {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n margin-bottom: var(--cg-spacing-6);\n }\n .source-number {\n width: var(--cg-spacing-20);\n height: var(--cg-spacing-20);\n border-radius: var(--cg-border-radius-50);\n background: var(--cg-overlay-accent-light);\n color: var(--cg-color-surface-cards-text);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-bold);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .source-title {\n font-size: var(--cg-font-size-sm);\n font-weight: var(--cg-font-weight-medium);\n color: var(--cg-color-surface-cards-text);\n text-decoration: none;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n border-radius: var(--cg-border-radius-50);\n }\n a.source-title:hover { text-decoration: underline; }\n a.source-title:focus-visible {\n outline: none;\n box-shadow: 0 0 0 var(--cg-border-width-300) var(--cg-color-focus-ring);\n }\n\n /* Relevance dot — uses ai-confidence tier-3 tokens (theme-aware) */\n .relevance-dot {\n width: var(--cg-spacing-8);\n height: var(--cg-spacing-8);\n border-radius: var(--cg-border-radius-full);\n flex-shrink: 0;\n }\n .relevance-dot.high { background: var(--cg-ai-confidence-high-color); }\n .relevance-dot.medium { background: var(--cg-ai-confidence-medium-color); }\n .relevance-dot.low { background: var(--cg-color-input-text-placeholder); }\n\n .source-excerpt {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n line-height: var(--cg-line-height-snug);\n margin-top: var(--cg-spacing-6);\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n .source-url {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n margin-top: var(--cg-spacing-4);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* ── List mode ── */\n .list {\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-2);\n }\n .list-item {\n display: flex;\n align-items: flex-start;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-8) 0;\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .list-item:last-child { border-bottom: none; }\n\n .list-content { flex: 1; min-width: 0; }\n .list-title {\n font-size: var(--cg-font-size-sm);\n font-weight: var(--cg-font-weight-medium);\n color: var(--cg-color-surface-cards-text);\n }\n .list-title a {\n color: var(--cg-color-surface-cards-text);\n text-decoration: none;\n border-radius: var(--cg-border-radius-50);\n }\n .list-title a:hover { text-decoration: underline; }\n .list-title a:focus-visible {\n outline: none;\n box-shadow: 0 0 0 var(--cg-border-width-300) var(--cg-color-focus-ring);\n }\n .list-excerpt {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n line-height: var(--cg-line-height-snug);\n margin-top: var(--cg-spacing-4);\n }\n\n .sources-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 `];\n\n @property({ type: Array }) sources: CitationSource[] = [];\n @property() mode: 'inline' | 'list' = 'inline';\n @property({ type: Number }) maxVisible = 5;\n\n @state() private _expandedIndex = -1;\n\n private _sanitizeUrl(url?: string): string | undefined {\n if (!url) return undefined;\n const trimmed = url.trim();\n if (!trimmed) return undefined;\n const lower = trimmed.toLowerCase().replace(/[\\s\\u0000-\\u001f]/g, '');\n if (lower.startsWith('javascript:') || lower.startsWith('data:') || lower.startsWith('vbscript:')) return undefined;\n if (lower.startsWith('http:') || lower.startsWith('https:') || lower.startsWith('//')) return trimmed;\n const colonIndex = trimmed.indexOf(':');\n const slashIndex = trimmed.indexOf('/');\n if (colonIndex === -1 || (slashIndex !== -1 && slashIndex < colonIndex)) return trimmed;\n return undefined;\n }\n\n private _relevanceClass(r?: number): string {\n if (!r) return 'low';\n return r >= 0.7 ? 'high' : r >= 0.4 ? 'medium' : 'low';\n }\n\n private _relevanceLabel(r?: number): string {\n if (r === undefined || r === null) return 'Relevance unknown';\n return `Relevance: ${Math.round(r * 100)}%`;\n }\n\n private _handleCiteClick(index: number) {\n this._expandedIndex = this._expandedIndex === index ? -1 : index;\n this.dispatchEvent(new CustomEvent('ai-citation-click', {\n bubbles: true, composed: true,\n detail: { index, source: this.sources[index] },\n }));\n }\n\n private _renderCard(source: CitationSource, index: number) {\n const safeUrl = this._sanitizeUrl(source.url);\n return html`\n <div class=\"source-card\">\n <div class=\"source-header\">\n <div class=\"source-number\">${index + 1}</div>\n ${safeUrl\n ? html`<a class=\"source-title\" href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener\">${source.title}</a>`\n : html`<span class=\"source-title\">${source.title}</span>`}\n <cg-tooltip content=${this._relevanceLabel(source.relevance)} position=\"top\">\n <span class=\"relevance-dot ${this._relevanceClass(source.relevance)}\" aria-label=${this._relevanceLabel(source.relevance)}></span>\n </cg-tooltip>\n </div>\n ${source.excerpt ? html`<div class=\"source-excerpt\">${source.excerpt}</div>` : nothing}\n ${safeUrl ? html`<div class=\"source-url\">${safeUrl}</div>` : nothing}\n </div>\n `;\n }\n\n override render() {\n if (!this.sources.length) return nothing;\n\n if (this.mode === 'list') {\n return html`\n <div class=\"list\">\n <div class=\"sources-label\">Sources (${this.sources.length})</div>\n ${this.sources.map((s, i) => {\n const safeUrl = this._sanitizeUrl(s.url);\n return html`\n <div class=\"list-item\">\n <div class=\"source-number\">${i + 1}</div>\n <div class=\"list-content\">\n <div class=\"list-title\">\n ${safeUrl ? html`<a href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener\">${s.title}</a>` : s.title}\n </div>\n ${s.excerpt ? html`<div class=\"list-excerpt\">${s.excerpt}</div>` : nothing}\n </div>\n <cg-tooltip content=${this._relevanceLabel(s.relevance)} position=\"top\">\n <span class=\"relevance-dot ${this._relevanceClass(s.relevance)}\" aria-label=${this._relevanceLabel(s.relevance)}></span>\n </cg-tooltip>\n </div>\n `;\n })}\n </div>\n `;\n }\n\n const visible = this.sources.slice(0, this.maxVisible);\n const remaining = this.sources.length - this.maxVisible;\n\n return html`\n <span class=\"inline\">\n ${visible.map((s, i) => html`\n <button\n type=\"button\"\n class=\"cite-badge\"\n aria-label=\"Source ${i + 1}: ${s.title}\"\n aria-expanded=\"${this._expandedIndex === i}\"\n @click=${() => this._handleCiteClick(i)}\n >${i + 1}</button>\n ${this._expandedIndex === i ? this._renderCard(s, i) : nothing}\n `)}\n ${remaining > 0 ? html`<span class=\"cite-badge more\" aria-label=\"${remaining} more source${remaining > 1 ? 's' : ''}\">+${remaining}</span>` : nothing}\n </span>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ai-citation': AiCitation;\n }\n}\n"],"names":["AiCitation","LitElement","url","trimmed","lower","colonIndex","slashIndex","r","index","source","safeUrl","html","nothing","s","visible","remaining","hostBlock","reducedMotion","css","__decorateClass","property","state","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-citation.js","sources":["../../../src/components/ai-citation/ai-citation.ts"],"sourcesContent":["/**\n * @element ai-citation\n * Inline numbered citation badges or bibliography list with expandable source cards.\n *\n * @fires {CustomEvent<{index: number, source: CitationSource}>} ai-citation-click\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, state, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion } from '../../styles/index.js';\n\ninterface CitationSource {\n title: string;\n url?: string;\n excerpt?: string;\n relevance?: number;\n}\n\n@customElement('ai-citation')\nexport class AiCitation extends LitElement {\n static override styles = [hostBlock, reducedMotion, css`\n /* ── Inline mode ── */\n .inline { display: inline; }\n\n .cite-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--cg-spacing-16);\n height: var(--cg-spacing-16);\n border-radius: var(--cg-border-radius-50);\n background: var(--cg-overlay-accent-light);\n color: var(--cg-color-surface-base-text);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-bold);\n cursor: pointer;\n vertical-align: super;\n margin: 0 var(--cg-spacing-1);\n border: var(--cg-border-width-50) solid transparent;\n transition:\n background-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .cite-badge:hover {\n background: var(--cg-overlay-accent-medium);\n border-color: var(--cg-overlay-accent-strong);\n }\n .cite-badge:focus-visible {\n outline: none;\n box-shadow: 0 0 0 var(--cg-border-width-300) var(--cg-color-focus-ring);\n }\n\n /* ── Source card (expanded) ── */\n .source-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-100);\n padding: var(--cg-spacing-12);\n margin: var(--cg-spacing-8) 0;\n max-width: 400px;\n }\n\n .source-header {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n margin-bottom: var(--cg-spacing-6);\n }\n .source-number {\n width: var(--cg-spacing-20);\n height: var(--cg-spacing-20);\n border-radius: var(--cg-border-radius-50);\n background: var(--cg-overlay-accent-light);\n color: var(--cg-color-surface-base-text);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-bold);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n .source-title {\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 text-decoration: none;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n a.source-title:hover { text-decoration: underline; }\n\n .relevance-dot {\n width: var(--cg-spacing-6);\n height: var(--cg-spacing-6);\n border-radius: var(--cg-border-radius-full);\n flex-shrink: 0;\n }\n .relevance-dot.high { background: var(--cg-color-status-success-text-default); }\n .relevance-dot.medium { background: var(--cg-color-status-warning-text-default); }\n .relevance-dot.low { background: var(--cg-color-input-text-placeholder); }\n\n .source-excerpt {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n line-height: var(--cg-line-height-snug);\n margin-top: var(--cg-spacing-6);\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n .source-url {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n margin-top: var(--cg-spacing-4);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* ── List mode ── */\n .list {\n display: flex;\n flex-direction: column;\n gap: var(--cg-spacing-2);\n }\n .list-item {\n display: flex;\n align-items: flex-start;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-8) 0;\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .list-item:last-child { border-bottom: none; }\n\n .list-content { flex: 1; min-width: 0; }\n .list-title {\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 }\n .list-title a {\n color: var(--cg-color-surface-base-text);\n text-decoration: none;\n }\n .list-title a:hover { text-decoration: underline; }\n .list-excerpt {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n line-height: var(--cg-line-height-snug);\n margin-top: var(--cg-spacing-4);\n }\n\n .sources-label {\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 margin-bottom: var(--cg-spacing-8);\n }\n `];\n\n @property({ type: Array }) sources: CitationSource[] = [];\n @property() mode: 'inline' | 'list' = 'inline';\n @property({ type: Number }) maxVisible = 5;\n\n @state() private _expandedIndex = -1;\n\n private _sanitizeUrl(url?: string): string | undefined {\n if (!url) return undefined;\n const trimmed = url.trim();\n if (!trimmed) return undefined;\n const lower = trimmed.toLowerCase().replace(/[\\s\\u0000-\\u001f]/g, '');\n if (lower.startsWith('javascript:') || lower.startsWith('data:') || lower.startsWith('vbscript:')) return undefined;\n if (lower.startsWith('http:') || lower.startsWith('https:') || lower.startsWith('//')) return trimmed;\n const colonIndex = trimmed.indexOf(':');\n const slashIndex = trimmed.indexOf('/');\n if (colonIndex === -1 || (slashIndex !== -1 && slashIndex < colonIndex)) return trimmed;\n return undefined;\n }\n\n private _relevanceClass(r?: number): string {\n if (!r) return 'low';\n return r >= 0.7 ? 'high' : r >= 0.4 ? 'medium' : 'low';\n }\n\n private _handleCiteClick(index: number) {\n this._expandedIndex = this._expandedIndex === index ? -1 : index;\n this.dispatchEvent(new CustomEvent('ai-citation-click', {\n bubbles: true, composed: true,\n detail: { index, source: this.sources[index] },\n }));\n }\n\n private _renderCard(source: CitationSource, index: number) {\n const safeUrl = this._sanitizeUrl(source.url);\n return html`\n <div class=\"source-card\">\n <div class=\"source-header\">\n <div class=\"source-number\">${index + 1}</div>\n ${safeUrl\n ? html`<a class=\"source-title\" href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener\">${source.title}</a>`\n : html`<span class=\"source-title\">${source.title}</span>`}\n <div class=\"relevance-dot ${this._relevanceClass(source.relevance)}\" title=\"Relevance: ${source.relevance ? Math.round(source.relevance * 100) + '%' : 'unknown'}\"></div>\n </div>\n ${source.excerpt ? html`<div class=\"source-excerpt\">${source.excerpt}</div>` : nothing}\n ${safeUrl ? html`<div class=\"source-url\">${safeUrl}</div>` : nothing}\n </div>\n `;\n }\n\n override render() {\n if (!this.sources.length) return nothing;\n\n if (this.mode === 'list') {\n return html`\n <div class=\"list\">\n <div class=\"sources-label\">Sources (${this.sources.length})</div>\n ${this.sources.map((s, i) => {\n const safeUrl = this._sanitizeUrl(s.url);\n return html`\n <div class=\"list-item\">\n <div class=\"source-number\">${i + 1}</div>\n <div class=\"list-content\">\n <div class=\"list-title\">\n ${safeUrl ? html`<a href=\"${safeUrl}\" target=\"_blank\" rel=\"noopener\">${s.title}</a>` : s.title}\n </div>\n ${s.excerpt ? html`<div class=\"list-excerpt\">${s.excerpt}</div>` : nothing}\n </div>\n <div class=\"relevance-dot ${this._relevanceClass(s.relevance)}\"></div>\n </div>\n `;\n })}\n </div>\n `;\n }\n\n const visible = this.sources.slice(0, this.maxVisible);\n const remaining = this.sources.length - this.maxVisible;\n\n return html`\n <div class=\"inline\">\n ${visible.map((s, i) => html`\n <span class=\"cite-badge\" tabindex=\"0\" role=\"button\"\n aria-label=\"Source ${i + 1}: ${s.title}\"\n @click=${() => this._handleCiteClick(i)}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this._handleCiteClick(i); } }}\n >${i + 1}</span>\n ${this._expandedIndex === i ? this._renderCard(s, i) : nothing}\n `)}\n ${remaining > 0 ? html`<span class=\"cite-badge\" style=\"width:auto; padding:0 var(--cg-spacing-4);\">+${remaining}</span>` : nothing}\n </div>\n `;\n }\n}\n"],"names":["AiCitation","LitElement","url","trimmed","lower","colonIndex","slashIndex","r","index","source","safeUrl","html","nothing","s","i","visible","remaining","e","hostBlock","reducedMotion","css","__decorateClass","property","state","customElement"],"mappings":"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"}
|