@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
|
@@ -10,40 +10,14 @@ export declare class AiCollaborativeEditor extends LitElement {
|
|
|
10
10
|
cursors: EditorCursor[];
|
|
11
11
|
editable: boolean;
|
|
12
12
|
placeholder: string;
|
|
13
|
-
title: string;
|
|
14
|
-
/** Sync state shown in the footer. Consumers flip this during save. */
|
|
15
|
-
sync: 'idle' | 'saving' | 'saved' | 'error';
|
|
16
|
-
/** ms of cursor inactivity before the user's label fades out. 0 disables. */
|
|
17
|
-
idleFadeDelay: number;
|
|
18
13
|
private _charCount;
|
|
19
14
|
private _wordCount;
|
|
20
|
-
private _idleUsers;
|
|
21
|
-
/** Per-cursor screen positions in textarea-relative pixels. */
|
|
22
|
-
private _cursorPositions;
|
|
23
15
|
private _textarea;
|
|
24
|
-
private _mirror;
|
|
25
|
-
private _idleTimers;
|
|
26
|
-
private _previousPositions;
|
|
27
16
|
updated(changed: Map<string, unknown>): void;
|
|
28
|
-
disconnectedCallback(): void;
|
|
29
17
|
private _updateCounts;
|
|
30
|
-
/**
|
|
31
|
-
* For each remote cursor, measure where its caret would render by inserting
|
|
32
|
-
* a zero-width marker at that offset in a hidden mirror element with the
|
|
33
|
-
* same metrics as the textarea, then reading the rect.
|
|
34
|
-
*
|
|
35
|
-
* Replaces the previous `charWidth = 8.4 / lineHeight = 22.4` heuristic
|
|
36
|
-
* which silently drifted under any zoom or font fallback.
|
|
37
|
-
*/
|
|
38
|
-
private _measureCursors;
|
|
39
|
-
/**
|
|
40
|
-
* When a remote cursor's `position` changes, the user is "active" — clear
|
|
41
|
-
* the idle flag and (re)start a timer that marks them idle after
|
|
42
|
-
* idleFadeDelay ms.
|
|
43
|
-
*/
|
|
44
|
-
private _handleCursorActivity;
|
|
45
18
|
private _onInput;
|
|
46
19
|
private _onSelect;
|
|
20
|
+
private _getCursorPosition;
|
|
47
21
|
render(): import('lit').TemplateResult<1>;
|
|
48
22
|
}
|
|
49
23
|
declare global {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-collaborative-editor.d.ts","sourceRoot":"","sources":["../../../src/components/ai-collaborative-editor/ai-collaborative-editor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ai-collaborative-editor.d.ts","sourceRoot":"","sources":["../../../src/components/ai-collaborative-editor/ai-collaborative-editor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAIrD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBACa,qBAAsB,SAAQ,UAAU;IACnD,OAAgB,MAAM,4BAqHnB;IACyB,OAAO,SAAM;IACd,OAAO,EAAE,YAAY,EAAE,CAAM;IAC3B,QAAQ,UAAQ;IACjB,WAAW,SAAqB;IAEnD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAAK;IAEb,OAAO,CAAC,SAAS,CAAuB;IAElD,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMrD,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,kBAAkB;IAwBjB,MAAM;CAyChB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,yBAAyB,EAAE,qBAAqB,CAAC;KAClD;CACF"}
|
|
@@ -1,118 +1,58 @@
|
|
|
1
|
-
import { css as
|
|
2
|
-
import { property as
|
|
3
|
-
import { h as y, r as
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
(c = e[d]) && (n = (a ? c(t, s, n) : c(n)) || n);
|
|
9
|
-
return a && n && _(t, s, n), n;
|
|
1
|
+
import { css as v, LitElement as b, nothing as f, html as d } from "lit";
|
|
2
|
+
import { property as p, state as g, query as m, customElement as x } from "lit/decorators.js";
|
|
3
|
+
import { h as y, r as _, f as w } from "../../chunks/premium.css-DHekUEUt.js";
|
|
4
|
+
var $ = Object.defineProperty, C = Object.getOwnPropertyDescriptor, a = (t, e, n, i) => {
|
|
5
|
+
for (var r = i > 1 ? void 0 : i ? C(e, n) : e, c = t.length - 1, s; c >= 0; c--)
|
|
6
|
+
(s = t[c]) && (r = (i ? s(e, n, r) : s(r)) || r);
|
|
7
|
+
return i && r && $(e, n, r), r;
|
|
10
8
|
};
|
|
11
|
-
let
|
|
9
|
+
let o = class extends b {
|
|
12
10
|
constructor() {
|
|
13
|
-
super(...arguments), this.content = "", this.cursors = [], this.editable = !0, this.placeholder = "Start typing
|
|
11
|
+
super(...arguments), this.content = "", this.cursors = [], this.editable = !0, this.placeholder = "Start typing...", this._charCount = 0, this._wordCount = 0;
|
|
14
12
|
}
|
|
15
|
-
updated(
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
disconnectedCallback() {
|
|
19
|
-
super.disconnectedCallback();
|
|
20
|
-
for (const e of this._idleTimers.values()) clearTimeout(e);
|
|
21
|
-
this._idleTimers.clear();
|
|
13
|
+
updated(t) {
|
|
14
|
+
t.has("content") && this._updateCounts();
|
|
22
15
|
}
|
|
23
16
|
_updateCounts() {
|
|
24
17
|
this._charCount = this.content.length;
|
|
25
|
-
const
|
|
26
|
-
this._wordCount =
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* For each remote cursor, measure where its caret would render by inserting
|
|
30
|
-
* a zero-width marker at that offset in a hidden mirror element with the
|
|
31
|
-
* same metrics as the textarea, then reading the rect.
|
|
32
|
-
*
|
|
33
|
-
* Replaces the previous `charWidth = 8.4 / lineHeight = 22.4` heuristic
|
|
34
|
-
* which silently drifted under any zoom or font fallback.
|
|
35
|
-
*/
|
|
36
|
-
_measureCursors() {
|
|
37
|
-
if (!this._mirror || !this._textarea) return;
|
|
38
|
-
const e = this._textarea.clientWidth;
|
|
39
|
-
this._mirror.style.width = `${e}px`;
|
|
40
|
-
const t = /* @__PURE__ */ new Map();
|
|
41
|
-
for (const s of this.cursors) {
|
|
42
|
-
const a = Math.max(0, Math.min(this.content.length, s.position)), n = this.content.slice(0, a);
|
|
43
|
-
this._mirror.textContent = "";
|
|
44
|
-
const d = document.createTextNode(n), c = document.createElement("span");
|
|
45
|
-
c.textContent = "", this._mirror.appendChild(d), this._mirror.appendChild(c);
|
|
46
|
-
const u = this._mirror.getBoundingClientRect(), g = c.getBoundingClientRect();
|
|
47
|
-
t.set(s.user, {
|
|
48
|
-
top: g.top - u.top - this._textarea.scrollTop,
|
|
49
|
-
left: g.left - u.left
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
this._cursorPositions = t;
|
|
18
|
+
const t = this.content.trim();
|
|
19
|
+
this._wordCount = t ? t.split(/\s+/).length : 0;
|
|
53
20
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
* idleFadeDelay ms.
|
|
58
|
-
*/
|
|
59
|
-
_handleCursorActivity() {
|
|
60
|
-
if (this.idleFadeDelay <= 0) return;
|
|
61
|
-
const e = /* @__PURE__ */ new Set();
|
|
62
|
-
for (const t of this.cursors)
|
|
63
|
-
if (e.add(t.user), this._previousPositions.get(t.user) !== t.position) {
|
|
64
|
-
this._idleUsers.delete(t.user), this._previousPositions.set(t.user, t.position);
|
|
65
|
-
const a = this._idleTimers.get(t.user);
|
|
66
|
-
a && clearTimeout(a), this._idleTimers.set(t.user, window.setTimeout(() => {
|
|
67
|
-
this._idleUsers.add(t.user), this._idleUsers = new Set(this._idleUsers);
|
|
68
|
-
}, this.idleFadeDelay));
|
|
69
|
-
}
|
|
70
|
-
for (const t of [...this._previousPositions.keys()])
|
|
71
|
-
if (!e.has(t)) {
|
|
72
|
-
this._previousPositions.delete(t);
|
|
73
|
-
const s = this._idleTimers.get(t);
|
|
74
|
-
s && clearTimeout(s), this._idleTimers.delete(t), this._idleUsers.delete(t);
|
|
75
|
-
}
|
|
76
|
-
this.requestUpdate();
|
|
77
|
-
}
|
|
78
|
-
_onInput(e) {
|
|
79
|
-
const t = e.target;
|
|
80
|
-
this.content = t.value, this._updateCounts(), this.dispatchEvent(new CustomEvent("ai-editor-change", {
|
|
21
|
+
_onInput(t) {
|
|
22
|
+
const e = t.target;
|
|
23
|
+
this.content = e.value, this._updateCounts(), this.dispatchEvent(new CustomEvent("ai-editor-change", {
|
|
81
24
|
bubbles: !0,
|
|
82
25
|
composed: !0,
|
|
83
26
|
detail: { content: this.content }
|
|
84
27
|
}));
|
|
85
28
|
}
|
|
86
|
-
_onSelect(
|
|
87
|
-
const
|
|
29
|
+
_onSelect(t) {
|
|
30
|
+
const e = t.target;
|
|
88
31
|
this.dispatchEvent(new CustomEvent("ai-editor-cursor-move", {
|
|
89
32
|
bubbles: !0,
|
|
90
33
|
composed: !0,
|
|
91
34
|
detail: {
|
|
92
|
-
position:
|
|
93
|
-
selectionStart:
|
|
94
|
-
selectionEnd:
|
|
35
|
+
position: e.selectionStart,
|
|
36
|
+
selectionStart: e.selectionStart,
|
|
37
|
+
selectionEnd: e.selectionEnd
|
|
95
38
|
}
|
|
96
39
|
}));
|
|
97
40
|
}
|
|
41
|
+
_getCursorPosition(t) {
|
|
42
|
+
const r = this._textarea ? Math.floor((this._textarea.clientWidth - 24) / 8.4) : 60, s = this.content.substring(0, t).split(`
|
|
43
|
+
`);
|
|
44
|
+
let l = 0;
|
|
45
|
+
for (const u of s)
|
|
46
|
+
l += Math.max(1, Math.ceil((u.length || 1) / r));
|
|
47
|
+
l = Math.max(1, l);
|
|
48
|
+
const h = (s[s.length - 1] || "").length % r;
|
|
49
|
+
return {
|
|
50
|
+
top: 12 + (l - 1) * 22.4,
|
|
51
|
+
left: 12 + h * 8.4
|
|
52
|
+
};
|
|
53
|
+
}
|
|
98
54
|
render() {
|
|
99
|
-
|
|
100
|
-
return o`
|
|
101
|
-
${this.title || this.cursors.length ? o`
|
|
102
|
-
<div class="header">
|
|
103
|
-
${this.title ? o`<h3 class="header-title">${this.title}</h3>` : o`<span class="header-title muted">${this.cursors.length} editor${this.cursors.length === 1 ? "" : "s"} present</span>`}
|
|
104
|
-
${this.cursors.length ? o`
|
|
105
|
-
<div class="avatar-stack" role="list" aria-label="Active editors">
|
|
106
|
-
${this.cursors.map((t) => o`
|
|
107
|
-
<span class="avatar-ring" role="listitem" style="border-color: ${t.color}; background: ${t.color}" title="${t.user}">
|
|
108
|
-
<cg-avatar size="xs" shape="circle" name=${t.user} status="online"></cg-avatar>
|
|
109
|
-
</span>
|
|
110
|
-
`)}
|
|
111
|
-
</div>
|
|
112
|
-
` : p}
|
|
113
|
-
</div>
|
|
114
|
-
` : p}
|
|
115
|
-
|
|
55
|
+
return d`
|
|
116
56
|
<div class="editor-wrap" role="group" aria-label="Collaborative text editor">
|
|
117
57
|
<textarea
|
|
118
58
|
.value=${this.content}
|
|
@@ -122,144 +62,84 @@ let r = class extends m {
|
|
|
122
62
|
@keyup=${this._onSelect}
|
|
123
63
|
@click=${this._onSelect}
|
|
124
64
|
aria-label="Editor content"
|
|
65
|
+
tabindex="0"
|
|
125
66
|
></textarea>
|
|
126
|
-
<div class="mirror" aria-hidden="true"></div>
|
|
127
67
|
<div class="cursors-overlay" aria-hidden="true">
|
|
128
68
|
${this.cursors.map((t) => {
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
class="cursor-marker ${a ? "idle" : ""}"
|
|
135
|
-
style="top: ${s.top}px; left: ${s.left}px"
|
|
136
|
-
>
|
|
137
|
-
<div class="cursor-line" style="background: ${t.color}"></div>
|
|
138
|
-
<span class="cursor-label" style="background: ${t.color}">${t.user}</span>
|
|
69
|
+
const e = this._getCursorPosition(t.position);
|
|
70
|
+
return d`
|
|
71
|
+
<div class="cursor-marker" style="top:${e.top}px;left:${e.left}px">
|
|
72
|
+
<div class="cursor-line" style="background:${t.color}"></div>
|
|
73
|
+
<span class="cursor-label" style="background:${t.color}">${t.user}</span>
|
|
139
74
|
</div>
|
|
140
75
|
`;
|
|
141
76
|
})}
|
|
142
77
|
</div>
|
|
143
78
|
</div>
|
|
144
|
-
|
|
145
79
|
<div class="footer">
|
|
146
80
|
<div class="stats">
|
|
147
81
|
<span>${this._charCount} chars</span>
|
|
148
82
|
<span>${this._wordCount} words</span>
|
|
149
83
|
</div>
|
|
150
|
-
${this.
|
|
151
|
-
<div class="
|
|
152
|
-
${this.
|
|
153
|
-
<
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
`}
|
|
157
|
-
<span>${e}</span>
|
|
84
|
+
${this.cursors.length ? d`
|
|
85
|
+
<div class="presence" aria-label="${this.cursors.length} users present">
|
|
86
|
+
${this.cursors.map((t) => d`
|
|
87
|
+
<span class="presence-dot" style="background:${t.color}" title="${t.user}"></span>
|
|
88
|
+
`)}
|
|
89
|
+
<span>${this.cursors.length} online</span>
|
|
158
90
|
</div>
|
|
159
|
-
` :
|
|
91
|
+
` : f}
|
|
160
92
|
</div>
|
|
161
|
-
|
|
162
|
-
<span class="sr-only" role="status" aria-live="polite" aria-atomic="true">${e}</span>
|
|
163
93
|
`;
|
|
164
94
|
}
|
|
165
95
|
};
|
|
166
|
-
|
|
96
|
+
o.styles = [y, _, w, v`
|
|
167
97
|
:host {
|
|
168
98
|
background: var(--cg-color-surface-container-background);
|
|
169
99
|
color: var(--cg-color-surface-base-text);
|
|
170
100
|
border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);
|
|
171
101
|
border-radius: var(--cg-border-radius-150);
|
|
172
|
-
box-shadow: var(--cg-elevation-1);
|
|
173
102
|
overflow: hidden;
|
|
174
103
|
animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-ease-out) both;
|
|
175
104
|
}
|
|
176
105
|
:host([hidden]) { display: none; }
|
|
177
106
|
|
|
178
|
-
/* ── Header: title + avatar stack ── */
|
|
179
|
-
.header {
|
|
180
|
-
display: flex;
|
|
181
|
-
align-items: center;
|
|
182
|
-
justify-content: space-between;
|
|
183
|
-
gap: var(--cg-spacing-12);
|
|
184
|
-
padding: var(--cg-spacing-12) var(--cg-spacing-16);
|
|
185
|
-
border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-cards-divider);
|
|
186
|
-
}
|
|
187
|
-
.header-title {
|
|
188
|
-
font-size: var(--cg-font-size-sm);
|
|
189
|
-
font-weight: var(--cg-font-weight-semibold);
|
|
190
|
-
color: var(--cg-color-surface-base-text);
|
|
191
|
-
margin: 0;
|
|
192
|
-
}
|
|
193
|
-
.header-title.muted {
|
|
194
|
-
color: var(--cg-color-input-text-placeholder);
|
|
195
|
-
font-weight: var(--cg-font-weight-medium);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/* Stacked avatars — overlap so the row stays compact. */
|
|
199
|
-
.avatar-stack {
|
|
200
|
-
display: inline-flex;
|
|
201
|
-
align-items: center;
|
|
202
|
-
}
|
|
203
|
-
.avatar-ring {
|
|
204
|
-
display: inline-flex;
|
|
205
|
-
border-radius: var(--cg-border-radius-full);
|
|
206
|
-
padding: var(--cg-border-width-100);
|
|
207
|
-
border: var(--cg-border-width-100) solid var(--cg-color-surface-container-background);
|
|
208
|
-
margin-left: calc(-1 * var(--cg-spacing-6));
|
|
209
|
-
transition: transform var(--cg-transition-duration-fast) var(--cg-transition-easing-spring);
|
|
210
|
-
}
|
|
211
|
-
.avatar-ring:first-child { margin-left: 0; }
|
|
212
|
-
.avatar-ring:hover { transform: translateY(calc(-1 * var(--cg-spacing-2))); }
|
|
213
|
-
|
|
214
|
-
/* ── Editor surface ── */
|
|
215
107
|
.editor-wrap {
|
|
216
108
|
position: relative;
|
|
217
|
-
min-height:
|
|
109
|
+
min-height: var(--cg-spacing-192);
|
|
218
110
|
}
|
|
219
111
|
|
|
220
112
|
textarea {
|
|
221
113
|
display: block;
|
|
222
114
|
width: 100%;
|
|
223
|
-
min-height:
|
|
115
|
+
min-height: var(--cg-spacing-192);
|
|
224
116
|
background: transparent;
|
|
225
117
|
color: var(--cg-color-surface-base-text);
|
|
226
118
|
border: none;
|
|
227
119
|
outline: none;
|
|
228
120
|
resize: vertical;
|
|
229
|
-
padding: var(--cg-spacing-
|
|
121
|
+
padding: var(--cg-spacing-12);
|
|
230
122
|
font-family: var(--cg-font-family-mono);
|
|
231
123
|
font-size: var(--cg-font-size-sm);
|
|
232
124
|
line-height: var(--cg-line-height-relaxed);
|
|
233
125
|
box-sizing: border-box;
|
|
234
|
-
caret-color: var(--cg-color-
|
|
126
|
+
caret-color: var(--cg-color-surface-base-text);
|
|
235
127
|
}
|
|
236
|
-
|
|
128
|
+
|
|
129
|
+
textarea::placeholder {
|
|
130
|
+
color: var(--cg-color-input-text-placeholder);
|
|
131
|
+
}
|
|
132
|
+
|
|
237
133
|
textarea:focus-visible {
|
|
238
|
-
|
|
134
|
+
border-radius: var(--cg-border-radius-150);
|
|
135
|
+
box-shadow: inset 0 0 0 var(--cg-border-width-100) var(--cg-overlay-accent-strong);
|
|
239
136
|
}
|
|
137
|
+
|
|
240
138
|
textarea:disabled {
|
|
241
139
|
opacity: 0.5;
|
|
242
140
|
cursor: not-allowed;
|
|
243
141
|
}
|
|
244
142
|
|
|
245
|
-
/* ── Hidden mirror — exact textarea geometry, used to measure
|
|
246
|
-
per-character coordinates for cursor markers. */
|
|
247
|
-
.mirror {
|
|
248
|
-
position: absolute;
|
|
249
|
-
top: 0;
|
|
250
|
-
left: 0;
|
|
251
|
-
visibility: hidden;
|
|
252
|
-
pointer-events: none;
|
|
253
|
-
white-space: pre-wrap;
|
|
254
|
-
word-wrap: break-word;
|
|
255
|
-
overflow-wrap: break-word;
|
|
256
|
-
font-family: var(--cg-font-family-mono);
|
|
257
|
-
font-size: var(--cg-font-size-sm);
|
|
258
|
-
line-height: var(--cg-line-height-relaxed);
|
|
259
|
-
padding: var(--cg-spacing-16);
|
|
260
|
-
box-sizing: border-box;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
143
|
.cursors-overlay {
|
|
264
144
|
position: absolute;
|
|
265
145
|
top: 0;
|
|
@@ -270,118 +150,92 @@ r.styles = [y, w, x, f`
|
|
|
270
150
|
overflow: hidden;
|
|
271
151
|
}
|
|
272
152
|
|
|
273
|
-
/* ── Cursor marker — flag style with smooth transition between
|
|
274
|
-
positions and label fade after inactivity. */
|
|
275
153
|
.cursor-marker {
|
|
276
154
|
position: absolute;
|
|
277
155
|
display: flex;
|
|
278
156
|
flex-direction: column;
|
|
279
|
-
align-items:
|
|
157
|
+
align-items: center;
|
|
280
158
|
pointer-events: none;
|
|
281
159
|
z-index: 2;
|
|
282
|
-
transition:
|
|
283
|
-
top var(--cg-transition-duration-default) var(--cg-transition-easing-ease-out),
|
|
284
|
-
left var(--cg-transition-duration-default) var(--cg-transition-easing-ease-out);
|
|
285
160
|
}
|
|
161
|
+
|
|
286
162
|
.cursor-line {
|
|
287
|
-
width: var(--cg-
|
|
288
|
-
height:
|
|
289
|
-
border-radius: var(--cg-border-
|
|
163
|
+
width: var(--cg-spacing-2);
|
|
164
|
+
height: var(--cg-spacing-20);
|
|
165
|
+
border-radius: var(--cg-border-radius-50);
|
|
290
166
|
}
|
|
167
|
+
|
|
291
168
|
.cursor-label {
|
|
292
169
|
font-size: var(--cg-font-size-xs);
|
|
293
170
|
font-weight: var(--cg-font-weight-semibold);
|
|
294
|
-
padding: var(--cg-spacing-1) var(--cg-spacing-
|
|
171
|
+
padding: var(--cg-spacing-1) var(--cg-spacing-4);
|
|
295
172
|
border-radius: var(--cg-border-radius-50);
|
|
296
173
|
white-space: nowrap;
|
|
297
|
-
margin-top:
|
|
298
|
-
color: var(--cg-color-
|
|
299
|
-
transition: opacity var(--cg-transition-duration-default) var(--cg-transition-easing-default);
|
|
300
|
-
transform: translateY(0);
|
|
301
|
-
}
|
|
302
|
-
.cursor-marker.idle .cursor-label {
|
|
303
|
-
opacity: 0;
|
|
304
|
-
pointer-events: none;
|
|
174
|
+
margin-top: var(--cg-spacing-2);
|
|
175
|
+
color: var(--cg-color-surface-container-background);
|
|
305
176
|
}
|
|
306
177
|
|
|
307
|
-
/* ── Footer ── */
|
|
308
178
|
.footer {
|
|
309
179
|
display: flex;
|
|
310
180
|
justify-content: space-between;
|
|
311
181
|
align-items: center;
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
border-top: var(--cg-border-width-50) solid var(--cg-color-surface-cards-divider);
|
|
182
|
+
padding: var(--cg-spacing-6) var(--cg-spacing-12);
|
|
183
|
+
border-top: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);
|
|
315
184
|
font-size: var(--cg-font-size-xs);
|
|
316
185
|
color: var(--cg-color-input-text-placeholder);
|
|
317
186
|
}
|
|
187
|
+
|
|
318
188
|
.stats {
|
|
319
189
|
display: flex;
|
|
320
190
|
gap: var(--cg-spacing-12);
|
|
321
|
-
font-variant-numeric: tabular-nums;
|
|
322
191
|
}
|
|
323
|
-
|
|
324
|
-
|
|
192
|
+
|
|
193
|
+
.presence {
|
|
194
|
+
display: flex;
|
|
195
|
+
gap: var(--cg-spacing-4);
|
|
325
196
|
align-items: center;
|
|
326
|
-
gap: var(--cg-spacing-6);
|
|
327
197
|
}
|
|
328
|
-
|
|
329
|
-
.
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
198
|
+
|
|
199
|
+
.presence-dot {
|
|
200
|
+
width: var(--cg-spacing-6);
|
|
201
|
+
height: var(--cg-spacing-6);
|
|
202
|
+
border-radius: 50%;
|
|
203
|
+
transition: transform var(--cg-transition-duration-fast) var(--cg-transition-easing-default);
|
|
204
|
+
}
|
|
205
|
+
.presence-dot:hover {
|
|
206
|
+
transform: scale(1.3);
|
|
333
207
|
}
|
|
334
208
|
|
|
335
|
-
/*
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
padding: 0; margin: -1px; overflow: hidden;
|
|
339
|
-
clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
|
|
209
|
+
/* Basic hover transitions on interactive elements */
|
|
210
|
+
textarea:hover {
|
|
211
|
+
border-color: var(--cg-color-surface-cards-border);
|
|
340
212
|
}
|
|
341
213
|
`];
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
],
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
],
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
],
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
],
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
],
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
],
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
],
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
],
|
|
366
|
-
i([
|
|
367
|
-
h()
|
|
368
|
-
], r.prototype, "_wordCount", 2);
|
|
369
|
-
i([
|
|
370
|
-
h()
|
|
371
|
-
], r.prototype, "_idleUsers", 2);
|
|
372
|
-
i([
|
|
373
|
-
h()
|
|
374
|
-
], r.prototype, "_cursorPositions", 2);
|
|
375
|
-
i([
|
|
376
|
-
v("textarea")
|
|
377
|
-
], r.prototype, "_textarea", 2);
|
|
378
|
-
i([
|
|
379
|
-
v(".mirror")
|
|
380
|
-
], r.prototype, "_mirror", 2);
|
|
381
|
-
r = i([
|
|
382
|
-
b("ai-collaborative-editor")
|
|
383
|
-
], r);
|
|
214
|
+
a([
|
|
215
|
+
p({ type: String })
|
|
216
|
+
], o.prototype, "content", 2);
|
|
217
|
+
a([
|
|
218
|
+
p({ type: Array })
|
|
219
|
+
], o.prototype, "cursors", 2);
|
|
220
|
+
a([
|
|
221
|
+
p({ type: Boolean })
|
|
222
|
+
], o.prototype, "editable", 2);
|
|
223
|
+
a([
|
|
224
|
+
p({ type: String })
|
|
225
|
+
], o.prototype, "placeholder", 2);
|
|
226
|
+
a([
|
|
227
|
+
g()
|
|
228
|
+
], o.prototype, "_charCount", 2);
|
|
229
|
+
a([
|
|
230
|
+
g()
|
|
231
|
+
], o.prototype, "_wordCount", 2);
|
|
232
|
+
a([
|
|
233
|
+
m("textarea")
|
|
234
|
+
], o.prototype, "_textarea", 2);
|
|
235
|
+
o = a([
|
|
236
|
+
x("ai-collaborative-editor")
|
|
237
|
+
], o);
|
|
384
238
|
export {
|
|
385
|
-
|
|
239
|
+
o as AiCollaborativeEditor
|
|
386
240
|
};
|
|
387
241
|
//# sourceMappingURL=ai-collaborative-editor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-collaborative-editor.js","sources":["../../../src/components/ai-collaborative-editor/ai-collaborative-editor.ts"],"sourcesContent":["/**\n * @element ai-collaborative-editor\n * Multiplayer monospace editor with live cursor + selection overlays, an\n * avatar-stack presence header (Linear/Figma pattern), word/char counts,\n * smooth cursor transitions, label fade on inactivity, and a Saving…/Saved\n * sync indicator.\n *\n * Cursor positions are measured with a hidden mirror element + per-character\n * Range geometry — accurate across font metrics, zoom level, and word-wrap\n * (the previous hand-rolled char-width math drifted with any font change).\n *\n * @example\n * ```html\n * <ai-collaborative-editor\n * content=\"Hello world\"\n * .cursors=${[{ user: 'Alice', position: 5, color: '#60a5fa' }]}\n * editable\n * ></ai-collaborative-editor>\n * ```\n *\n * @fires {CustomEvent<{content: string}>} ai-editor-change - Content changed\n * @fires {CustomEvent<{position, selectionStart, selectionEnd}>} ai-editor-cursor-move - Cursor moved\n *\n * @cssprop [--cg-color-surface-container-background] - Editor background\n * @cssprop [--cg-font-family-mono] - Editor font family\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeSlideInKeyframes } from '../../styles/index.js';\nimport '../cg-avatar/cg-avatar.js';\nimport '../cg-spinner/cg-spinner.js';\n\nexport interface EditorCursor {\n user: string;\n position: number;\n color: string;\n}\n\n@customElement('ai-collaborative-editor')\nexport class AiCollaborativeEditor extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeSlideInKeyframes, css`\n :host {\n background: var(--cg-color-surface-container-background);\n color: var(--cg-color-surface-base-text);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-150);\n box-shadow: var(--cg-elevation-1);\n overflow: hidden;\n animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-ease-out) both;\n }\n :host([hidden]) { display: none; }\n\n /* ── Header: title + avatar stack ── */\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cg-spacing-12);\n padding: var(--cg-spacing-12) var(--cg-spacing-16);\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-cards-divider);\n }\n .header-title {\n font-size: var(--cg-font-size-sm);\n font-weight: var(--cg-font-weight-semibold);\n color: var(--cg-color-surface-base-text);\n margin: 0;\n }\n .header-title.muted {\n color: var(--cg-color-input-text-placeholder);\n font-weight: var(--cg-font-weight-medium);\n }\n\n /* Stacked avatars — overlap so the row stays compact. */\n .avatar-stack {\n display: inline-flex;\n align-items: center;\n }\n .avatar-ring {\n display: inline-flex;\n border-radius: var(--cg-border-radius-full);\n padding: var(--cg-border-width-100);\n border: var(--cg-border-width-100) solid var(--cg-color-surface-container-background);\n margin-left: calc(-1 * var(--cg-spacing-6));\n transition: transform var(--cg-transition-duration-fast) var(--cg-transition-easing-spring);\n }\n .avatar-ring:first-child { margin-left: 0; }\n .avatar-ring:hover { transform: translateY(calc(-1 * var(--cg-spacing-2))); }\n\n /* ── Editor surface ── */\n .editor-wrap {\n position: relative;\n min-height: 200px;\n }\n\n textarea {\n display: block;\n width: 100%;\n min-height: 200px;\n background: transparent;\n color: var(--cg-color-surface-base-text);\n border: none;\n outline: none;\n resize: vertical;\n padding: var(--cg-spacing-16);\n font-family: var(--cg-font-family-mono);\n font-size: var(--cg-font-size-sm);\n line-height: var(--cg-line-height-relaxed);\n box-sizing: border-box;\n caret-color: var(--cg-color-action-primary-background-default);\n }\n textarea::placeholder { color: var(--cg-color-input-text-placeholder); }\n textarea:focus-visible {\n box-shadow: inset 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n textarea:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* ── Hidden mirror — exact textarea geometry, used to measure\n per-character coordinates for cursor markers. */\n .mirror {\n position: absolute;\n top: 0;\n left: 0;\n visibility: hidden;\n pointer-events: none;\n white-space: pre-wrap;\n word-wrap: break-word;\n overflow-wrap: break-word;\n font-family: var(--cg-font-family-mono);\n font-size: var(--cg-font-size-sm);\n line-height: var(--cg-line-height-relaxed);\n padding: var(--cg-spacing-16);\n box-sizing: border-box;\n }\n\n .cursors-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n overflow: hidden;\n }\n\n /* ── Cursor marker — flag style with smooth transition between\n positions and label fade after inactivity. */\n .cursor-marker {\n position: absolute;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n pointer-events: none;\n z-index: 2;\n transition:\n top var(--cg-transition-duration-default) var(--cg-transition-easing-ease-out),\n left var(--cg-transition-duration-default) var(--cg-transition-easing-ease-out);\n }\n .cursor-line {\n width: var(--cg-border-width-100);\n height: 1.4em;\n border-radius: var(--cg-border-width-50);\n }\n .cursor-label {\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-semibold);\n padding: var(--cg-spacing-1) var(--cg-spacing-6);\n border-radius: var(--cg-border-radius-50);\n white-space: nowrap;\n margin-top: calc(-1 * var(--cg-spacing-1));\n color: var(--cg-color-action-primary-text-default);\n transition: opacity var(--cg-transition-duration-default) var(--cg-transition-easing-default);\n transform: translateY(0);\n }\n .cursor-marker.idle .cursor-label {\n opacity: 0;\n pointer-events: none;\n }\n\n /* ── Footer ── */\n .footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: var(--cg-spacing-12);\n padding: var(--cg-spacing-8) var(--cg-spacing-16);\n border-top: var(--cg-border-width-50) solid var(--cg-color-surface-cards-divider);\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n }\n .stats {\n display: flex;\n gap: var(--cg-spacing-12);\n font-variant-numeric: tabular-nums;\n }\n .sync-state {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-6);\n }\n .sync-state.saved { color: var(--cg-color-status-success-text-default); }\n .sync-state.error { color: var(--cg-color-status-error-text-default); }\n .sync-icon {\n width: var(--cg-spacing-12);\n height: var(--cg-spacing-12);\n }\n\n /* Visually-hidden live region. */\n .sr-only {\n position: absolute; width: 1px; height: 1px;\n padding: 0; margin: -1px; overflow: hidden;\n clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;\n }\n `];\n\n @property({ type: String }) content = '';\n @property({ type: Array }) cursors: EditorCursor[] = [];\n @property({ type: Boolean }) editable = true;\n @property({ type: String }) placeholder = 'Start typing…';\n @property({ type: String }) override title = '';\n /** Sync state shown in the footer. Consumers flip this during save. */\n @property({ reflect: true }) sync: 'idle' | 'saving' | 'saved' | 'error' = 'idle';\n /** ms of cursor inactivity before the user's label fades out. 0 disables. */\n @property({ type: Number, attribute: 'idle-fade-delay' }) idleFadeDelay = 2000;\n\n @state() private _charCount = 0;\n @state() private _wordCount = 0;\n @state() private _idleUsers = new Set<string>();\n /** Per-cursor screen positions in textarea-relative pixels. */\n @state() private _cursorPositions = new Map<string, { top: number; left: number }>();\n\n @query('textarea') private _textarea!: HTMLTextAreaElement;\n @query('.mirror') private _mirror!: HTMLDivElement;\n\n private _idleTimers = new Map<string, number>();\n private _previousPositions = new Map<string, number>();\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('content')) this._updateCounts();\n if (changed.has('content') || changed.has('cursors')) {\n // Recompute cursor screen positions whenever text or remote cursors move.\n this.updateComplete.then(() => this._measureCursors());\n }\n if (changed.has('cursors')) this._handleCursorActivity();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n for (const t of this._idleTimers.values()) clearTimeout(t);\n this._idleTimers.clear();\n }\n\n private _updateCounts(): void {\n this._charCount = this.content.length;\n const trimmed = this.content.trim();\n this._wordCount = trimmed ? trimmed.split(/\\s+/).length : 0;\n }\n\n /**\n * For each remote cursor, measure where its caret would render by inserting\n * a zero-width marker at that offset in a hidden mirror element with the\n * same metrics as the textarea, then reading the rect.\n *\n * Replaces the previous `charWidth = 8.4 / lineHeight = 22.4` heuristic\n * which silently drifted under any zoom or font fallback.\n */\n private _measureCursors(): void {\n if (!this._mirror || !this._textarea) return;\n const mirrorWidth = this._textarea.clientWidth;\n this._mirror.style.width = `${mirrorWidth}px`;\n const next = new Map<string, { top: number; left: number }>();\n for (const c of this.cursors) {\n const pos = Math.max(0, Math.min(this.content.length, c.position));\n const before = this.content.slice(0, pos);\n // Render the text-up-to-cursor + a marker span the mirror can measure.\n this._mirror.textContent = '';\n const beforeNode = document.createTextNode(before);\n const marker = document.createElement('span');\n marker.textContent = ''; // zero-width space\n this._mirror.appendChild(beforeNode);\n this._mirror.appendChild(marker);\n const wrapRect = this._mirror.getBoundingClientRect();\n const markerRect = marker.getBoundingClientRect();\n next.set(c.user, {\n top: markerRect.top - wrapRect.top - this._textarea.scrollTop,\n left: markerRect.left - wrapRect.left,\n });\n }\n this._cursorPositions = next;\n }\n\n /**\n * When a remote cursor's `position` changes, the user is \"active\" — clear\n * the idle flag and (re)start a timer that marks them idle after\n * idleFadeDelay ms.\n */\n private _handleCursorActivity(): void {\n if (this.idleFadeDelay <= 0) return;\n const seen = new Set<string>();\n for (const c of this.cursors) {\n seen.add(c.user);\n const prev = this._previousPositions.get(c.user);\n if (prev !== c.position) {\n this._idleUsers.delete(c.user);\n this._previousPositions.set(c.user, c.position);\n const existing = this._idleTimers.get(c.user);\n if (existing) clearTimeout(existing);\n this._idleTimers.set(c.user, window.setTimeout(() => {\n this._idleUsers.add(c.user);\n this._idleUsers = new Set(this._idleUsers);\n }, this.idleFadeDelay));\n }\n }\n // Remove disconnected users from tracking.\n for (const user of [...this._previousPositions.keys()]) {\n if (!seen.has(user)) {\n this._previousPositions.delete(user);\n const t = this._idleTimers.get(user); if (t) clearTimeout(t);\n this._idleTimers.delete(user);\n this._idleUsers.delete(user);\n }\n }\n this.requestUpdate();\n }\n\n private _onInput(e: Event): void {\n const target = e.target as HTMLTextAreaElement;\n this.content = target.value;\n this._updateCounts();\n this.dispatchEvent(new CustomEvent('ai-editor-change', {\n bubbles: true, composed: true,\n detail: { content: this.content },\n }));\n }\n\n private _onSelect(e: Event): void {\n const target = e.target as HTMLTextAreaElement;\n this.dispatchEvent(new CustomEvent('ai-editor-cursor-move', {\n bubbles: true, composed: true,\n detail: {\n position: target.selectionStart,\n selectionStart: target.selectionStart,\n selectionEnd: target.selectionEnd,\n },\n }));\n }\n\n override render() {\n const syncLabel =\n this.sync === 'saving' ? 'Saving…' :\n this.sync === 'saved' ? 'Saved' :\n this.sync === 'error' ? 'Save failed' : '';\n\n return html`\n ${this.title || this.cursors.length ? html`\n <div class=\"header\">\n ${this.title\n ? html`<h3 class=\"header-title\">${this.title}</h3>`\n : html`<span class=\"header-title muted\">${this.cursors.length} editor${this.cursors.length === 1 ? '' : 's'} present</span>`}\n ${this.cursors.length ? html`\n <div class=\"avatar-stack\" role=\"list\" aria-label=\"Active editors\">\n ${this.cursors.map(c => html`\n <span class=\"avatar-ring\" role=\"listitem\" style=\"border-color: ${c.color}; background: ${c.color}\" title=\"${c.user}\">\n <cg-avatar size=\"xs\" shape=\"circle\" name=${c.user} status=\"online\"></cg-avatar>\n </span>\n `)}\n </div>\n ` : nothing}\n </div>\n ` : nothing}\n\n <div class=\"editor-wrap\" role=\"group\" aria-label=\"Collaborative text editor\">\n <textarea\n .value=${this.content}\n ?disabled=${!this.editable}\n placeholder=${this.placeholder}\n @input=${this._onInput}\n @keyup=${this._onSelect}\n @click=${this._onSelect}\n aria-label=\"Editor content\"\n ></textarea>\n <div class=\"mirror\" aria-hidden=\"true\"></div>\n <div class=\"cursors-overlay\" aria-hidden=\"true\">\n ${this.cursors.map(c => {\n const pos = this._cursorPositions.get(c.user);\n if (!pos) return nothing;\n const idle = this._idleUsers.has(c.user);\n return html`\n <div\n class=\"cursor-marker ${idle ? 'idle' : ''}\"\n style=\"top: ${pos.top}px; left: ${pos.left}px\"\n >\n <div class=\"cursor-line\" style=\"background: ${c.color}\"></div>\n <span class=\"cursor-label\" style=\"background: ${c.color}\">${c.user}</span>\n </div>\n `;\n })}\n </div>\n </div>\n\n <div class=\"footer\">\n <div class=\"stats\">\n <span>${this._charCount} chars</span>\n <span>${this._wordCount} words</span>\n </div>\n ${this.sync !== 'idle' ? html`\n <div class=\"sync-state ${this.sync}\" role=\"status\" aria-live=\"polite\">\n ${this.sync === 'saving' ? html`<cg-spinner size=\"xs\"></cg-spinner>` : html`\n <svg class=\"sync-icon\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n ${this.sync === 'error'\n ? html`<path d=\"M4 4l8 8M12 4l-8 8\"/>`\n : html`<path d=\"M3 8.5l3 3 7-7\"/>`}\n </svg>\n `}\n <span>${syncLabel}</span>\n </div>\n ` : nothing}\n </div>\n\n <span class=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">${syncLabel}</span>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ai-collaborative-editor': AiCollaborativeEditor;\n }\n}\n"],"names":["AiCollaborativeEditor","LitElement","changed","t","trimmed","mirrorWidth","next","c","pos","before","beforeNode","marker","wrapRect","markerRect","seen","existing","user","target","syncLabel","html","nothing","idle","hostBlock","reducedMotion","fadeSlideInKeyframes","css","__decorateClass","property","state","query","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-collaborative-editor.js","sources":["../../../src/components/ai-collaborative-editor/ai-collaborative-editor.ts"],"sourcesContent":["/**\n * @element ai-collaborative-editor\n * Monospace text editor with multi-user cursor presence overlay, word/char counts, and live editing.\n *\n * @example\n * ```html\n * <ai-collaborative-editor\n * content=\"Hello world\"\n * .cursors=${[{user:'Alice', position:5, color:'#60a5fa'}]}\n * editable\n * ></ai-collaborative-editor>\n * ```\n *\n * @fires {CustomEvent<{content: string}>} ai-editor-change - Content changed\n * @fires {CustomEvent<{position, selectionStart, selectionEnd}>} ai-editor-cursor-move - Cursor moved\n *\n * @cssprop [--cg-color-accent=#dfff61] - Caret color and focus ring\n * @cssprop [--cg-font-family-mono] - Editor font family\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeSlideInKeyframes } from '../../styles/index.js';\n\nexport interface EditorCursor {\n user: string;\n position: number;\n color: string;\n}\n\n@customElement('ai-collaborative-editor')\nexport class AiCollaborativeEditor extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeSlideInKeyframes, css`\n :host {\n background: var(--cg-color-surface-container-background);\n color: var(--cg-color-surface-base-text);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-150);\n overflow: hidden;\n animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-ease-out) both;\n }\n :host([hidden]) { display: none; }\n\n .editor-wrap {\n position: relative;\n min-height: var(--cg-spacing-192);\n }\n\n textarea {\n display: block;\n width: 100%;\n min-height: var(--cg-spacing-192);\n background: transparent;\n color: var(--cg-color-surface-base-text);\n border: none;\n outline: none;\n resize: vertical;\n padding: var(--cg-spacing-12);\n font-family: var(--cg-font-family-mono);\n font-size: var(--cg-font-size-sm);\n line-height: var(--cg-line-height-relaxed);\n box-sizing: border-box;\n caret-color: var(--cg-color-surface-base-text);\n }\n\n textarea::placeholder {\n color: var(--cg-color-input-text-placeholder);\n }\n\n textarea:focus-visible {\n border-radius: var(--cg-border-radius-150);\n box-shadow: inset 0 0 0 var(--cg-border-width-100) var(--cg-overlay-accent-strong);\n }\n\n textarea:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .cursors-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n overflow: hidden;\n }\n\n .cursor-marker {\n position: absolute;\n display: flex;\n flex-direction: column;\n align-items: center;\n pointer-events: none;\n z-index: 2;\n }\n\n .cursor-line {\n width: var(--cg-spacing-2);\n height: var(--cg-spacing-20);\n border-radius: var(--cg-border-radius-50);\n }\n\n .cursor-label {\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-semibold);\n padding: var(--cg-spacing-1) var(--cg-spacing-4);\n border-radius: var(--cg-border-radius-50);\n white-space: nowrap;\n margin-top: var(--cg-spacing-2);\n color: var(--cg-color-surface-container-background);\n }\n\n .footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: var(--cg-spacing-6) var(--cg-spacing-12);\n border-top: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n }\n\n .stats {\n display: flex;\n gap: var(--cg-spacing-12);\n }\n\n .presence {\n display: flex;\n gap: var(--cg-spacing-4);\n align-items: center;\n }\n\n .presence-dot {\n width: var(--cg-spacing-6);\n height: var(--cg-spacing-6);\n border-radius: 50%;\n transition: transform var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .presence-dot:hover {\n transform: scale(1.3);\n }\n\n /* Basic hover transitions on interactive elements */\n textarea:hover {\n border-color: var(--cg-color-surface-cards-border);\n }\n `];\n @property({ type: String }) content = '';\n @property({ type: Array }) cursors: EditorCursor[] = [];\n @property({ type: Boolean }) editable = true;\n @property({ type: String }) placeholder = 'Start typing...';\n\n @state() private _charCount = 0;\n @state() private _wordCount = 0;\n\n @query('textarea') private _textarea!: HTMLTextAreaElement;\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('content')) {\n this._updateCounts();\n }\n }\n\n private _updateCounts(): void {\n this._charCount = this.content.length;\n const trimmed = this.content.trim();\n this._wordCount = trimmed ? trimmed.split(/\\s+/).length : 0;\n }\n\n private _onInput(e: Event): void {\n const target = e.target as HTMLTextAreaElement;\n this.content = target.value;\n this._updateCounts();\n this.dispatchEvent(new CustomEvent('ai-editor-change', {\n bubbles: true, composed: true,\n detail: { content: this.content },\n }));\n }\n\n private _onSelect(e: Event): void {\n const target = e.target as HTMLTextAreaElement;\n this.dispatchEvent(new CustomEvent('ai-editor-cursor-move', {\n bubbles: true, composed: true,\n detail: {\n position: target.selectionStart,\n selectionStart: target.selectionStart,\n selectionEnd: target.selectionEnd,\n },\n }));\n }\n\n private _getCursorPosition(position: number): { top: number; left: number } {\n const charWidth = 8.4;\n const lineHeight = 22.4;\n const padding = 12;\n const charsPerLine = this._textarea\n ? Math.floor((this._textarea.clientWidth - padding * 2) / charWidth)\n : 60;\n\n const textBefore = this.content.substring(0, position);\n const lines = textBefore.split('\\n');\n let totalLines = 0;\n for (const line of lines) {\n totalLines += Math.max(1, Math.ceil((line.length || 1) / charsPerLine));\n }\n totalLines = Math.max(1, totalLines);\n const lastLine = lines[lines.length - 1] || '';\n const colInLine = lastLine.length % charsPerLine;\n\n return {\n top: padding + (totalLines - 1) * lineHeight,\n left: padding + colInLine * charWidth,\n };\n }\n\n override render() {\n return html`\n <div class=\"editor-wrap\" role=\"group\" aria-label=\"Collaborative text editor\">\n <textarea\n .value=${this.content}\n ?disabled=${!this.editable}\n placeholder=${this.placeholder}\n @input=${this._onInput}\n @keyup=${this._onSelect}\n @click=${this._onSelect}\n aria-label=\"Editor content\"\n tabindex=\"0\"\n ></textarea>\n <div class=\"cursors-overlay\" aria-hidden=\"true\">\n ${this.cursors.map(c => {\n const pos = this._getCursorPosition(c.position);\n return html`\n <div class=\"cursor-marker\" style=\"top:${pos.top}px;left:${pos.left}px\">\n <div class=\"cursor-line\" style=\"background:${c.color}\"></div>\n <span class=\"cursor-label\" style=\"background:${c.color}\">${c.user}</span>\n </div>\n `;\n })}\n </div>\n </div>\n <div class=\"footer\">\n <div class=\"stats\">\n <span>${this._charCount} chars</span>\n <span>${this._wordCount} words</span>\n </div>\n ${this.cursors.length ? html`\n <div class=\"presence\" aria-label=\"${this.cursors.length} users present\">\n ${this.cursors.map(c => html`\n <span class=\"presence-dot\" style=\"background:${c.color}\" title=\"${c.user}\"></span>\n `)}\n <span>${this.cursors.length} online</span>\n </div>\n ` : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ai-collaborative-editor': AiCollaborativeEditor;\n }\n}\n"],"names":["AiCollaborativeEditor","LitElement","changed","trimmed","e","target","position","charsPerLine","lines","totalLines","line","colInLine","html","c","pos","nothing","hostBlock","reducedMotion","fadeSlideInKeyframes","css","__decorateClass","property","state","query","customElement"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { css as _, LitElement as g, nothing as y, html as v } from "lit";
|
|
2
2
|
import { property as d, state as b, customElement as w } from "lit/decorators.js";
|
|
3
|
-
import { h as E } from "../../chunks/premium.css-
|
|
3
|
+
import { h as E } from "../../chunks/premium.css-DHekUEUt.js";
|
|
4
4
|
import "../cg-command/cg-command.js";
|
|
5
5
|
var I = Object.defineProperty, C = Object.getOwnPropertyDescriptor, l = (t, e, n, o) => {
|
|
6
6
|
for (var r = o > 1 ? void 0 : o ? C(e, n) : e, c = t.length - 1, s; c >= 0; c--)
|