@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,12 +1,12 @@
|
|
|
1
|
-
import { css as v, LitElement as
|
|
2
|
-
import { property as p, state as
|
|
3
|
-
import { h as _, r as m, f as k } from "../../chunks/premium.css-
|
|
1
|
+
import { css as v, LitElement as $, html as a } from "lit";
|
|
2
|
+
import { property as p, state as y, customElement as x } from "lit/decorators.js";
|
|
3
|
+
import { h as _, r as m, f as k } from "../../chunks/premium.css-DHekUEUt.js";
|
|
4
4
|
var w = Object.defineProperty, C = Object.getOwnPropertyDescriptor, d = (e, t, s, o) => {
|
|
5
5
|
for (var r = o > 1 ? void 0 : o ? C(t, s) : t, n = e.length - 1, i; n >= 0; n--)
|
|
6
6
|
(i = e[n]) && (r = (o ? i(t, s, r) : i(r)) || r);
|
|
7
7
|
return o && r && w(t, s, r), r;
|
|
8
8
|
};
|
|
9
|
-
let l = class extends
|
|
9
|
+
let l = class extends $ {
|
|
10
10
|
constructor() {
|
|
11
11
|
super(...arguments), this.rounded = "lg", this.data = null, this.expanded = !0, this.maxDepth = 5, this._collapsed = /* @__PURE__ */ new Set(), this._seen = /* @__PURE__ */ new WeakSet();
|
|
12
12
|
}
|
|
@@ -65,7 +65,7 @@ l.styles = [_, m, k, v`
|
|
|
65
65
|
:host {
|
|
66
66
|
font-family: var(--cg-font-family-mono);
|
|
67
67
|
font-size: var(--cg-font-size-sm);
|
|
68
|
-
line-height:
|
|
68
|
+
line-height: var(--cg-line-height-relaxed);
|
|
69
69
|
color: var(--cg-color-surface-base-text);
|
|
70
70
|
animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-ease-out) both;
|
|
71
71
|
}
|
|
@@ -84,16 +84,16 @@ l.styles = [_, m, k, v`
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
.key {
|
|
87
|
-
color: var(--cg-color-status-info-text);
|
|
87
|
+
color: var(--cg-color-status-info-text-default);
|
|
88
88
|
cursor: pointer;
|
|
89
89
|
}
|
|
90
90
|
.key:hover {
|
|
91
91
|
text-decoration: underline;
|
|
92
92
|
}
|
|
93
93
|
.key:focus-visible {
|
|
94
|
-
outline:
|
|
95
|
-
outline-offset:
|
|
96
|
-
border-radius: var(--cg-border-radius-
|
|
94
|
+
outline: var(--cg-border-width-100) solid var(--cg-color-focus-ring);
|
|
95
|
+
outline-offset: var(--cg-outline-offset-default);
|
|
96
|
+
border-radius: var(--cg-border-radius-50);
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
.string { color: var(--cg-color-status-success-text-default); }
|
|
@@ -114,15 +114,15 @@ l.styles = [_, m, k, v`
|
|
|
114
114
|
padding: 0;
|
|
115
115
|
font-size: var(--cg-font-size-xs);
|
|
116
116
|
vertical-align: middle;
|
|
117
|
-
border-radius: var(--cg-border-radius-
|
|
117
|
+
border-radius: var(--cg-border-radius-50);
|
|
118
118
|
transition: color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);
|
|
119
119
|
}
|
|
120
120
|
.toggle:hover {
|
|
121
121
|
color: var(--cg-color-surface-base-text);
|
|
122
122
|
}
|
|
123
123
|
.toggle:focus-visible {
|
|
124
|
-
outline:
|
|
125
|
-
outline-offset:
|
|
124
|
+
outline: var(--cg-border-width-100) solid var(--cg-color-focus-ring);
|
|
125
|
+
outline-offset: var(--cg-outline-offset-default);
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
.collapsed-hint {
|
|
@@ -162,7 +162,7 @@ d([
|
|
|
162
162
|
p({ type: Number, attribute: "max-depth" })
|
|
163
163
|
], l.prototype, "maxDepth", 2);
|
|
164
164
|
d([
|
|
165
|
-
|
|
165
|
+
y()
|
|
166
166
|
], l.prototype, "_collapsed", 2);
|
|
167
167
|
l = d([
|
|
168
168
|
x("ai-json-viewer")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-json-viewer.js","sources":["../../../src/components/ai-json-viewer/ai-json-viewer.ts"],"sourcesContent":["/**\n * @element ai-json-viewer\n * Interactive JSON tree viewer with collapsible nodes, syntax highlighting,\n * and circular reference detection. Supports nested objects and arrays\n * with expand/collapse per node and item counts.\n *\n * @example\n * ```html\n * <ai-json-viewer .data=${{ name: 'Claude', version: 3 }} expanded max-depth=\"4\"></ai-json-viewer>\n * ```\n *\n * @prop {unknown} data - JSON-serializable data to display\n * @prop {boolean} expanded - Whether nodes start expanded (default true)\n * @prop {number} maxDepth - Maximum nesting depth before auto-collapse (default 5)\n *\n * @fires {CustomEvent<{path: string}>} ai-json-path-click - When a key label is clicked\n *\n * @cssprop [--cg-font-family-mono] - Monospace font for the viewer\n * @cssprop [--cg-color-surface] - Background color of the root container\n * @cssprop [--cg-color-accent] - Accent color for number values\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeSlideInKeyframes } from '../../styles/index.js';\n\n@customElement('ai-json-viewer')\nexport class AiJsonViewer extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeSlideInKeyframes, css`\n :host {\n font-family: var(--cg-font-family-mono);\n font-size: var(--cg-font-size-sm);\n line-height: 1.6;\n color: var(--cg-color-surface-base-text);\n animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-ease-out) both;\n }\n :host([hidden]) { display: none; }\n\n .root {\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) var(--cg-spacing-16);\n overflow-x: auto;\n }\n\n .line {\n white-space: pre;\n }\n\n .key {\n color: var(--cg-color-status-info-text);\n cursor: pointer;\n }\n .key:hover {\n text-decoration: underline;\n }\n .key:focus-visible {\n outline: 2px solid var(--cg-overlay-accent-strong);\n outline-offset: 1px;\n border-radius: var(--cg-border-radius-25);\n }\n\n .string { color: var(--cg-color-status-success-text-default); }\n .number { color: var(--cg-color-surface-base-text); }\n .boolean { color: var(--cg-color-status-success-text-default); }\n .null { color: var(--cg-color-input-text-placeholder); font-style: italic; }\n\n .toggle {\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 background: none;\n border: none;\n color: var(--cg-color-input-text-placeholder);\n cursor: pointer;\n padding: 0;\n font-size: var(--cg-font-size-xs);\n vertical-align: middle;\n border-radius: var(--cg-border-radius-25);\n transition: color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .toggle:hover {\n color: var(--cg-color-surface-base-text);\n }\n .toggle:focus-visible {\n outline: 2px solid var(--cg-overlay-accent-strong);\n outline-offset: 1px;\n }\n\n .collapsed-hint {\n color: var(--cg-color-input-text-placeholder);\n font-style: italic;\n font-size: var(--cg-font-size-xs);\n }\n\n .line-count {\n display: inline;\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xs);\n margin-left: var(--cg-spacing-4);\n }\n\n .bracket {\n color: var(--cg-color-input-text-placeholder);\n }\n\n /* ── Rounded variants ── */\n :host([rounded=\"none\"]) .root { border-radius: 0; }\n :host([rounded=\"sm\"]) .root { border-radius: var(--cg-border-radius-50); }\n :host([rounded=\"md\"]) .root { border-radius: var(--cg-border-radius-100); }\n :host([rounded=\"lg\"]) .root { border-radius: var(--cg-border-radius-150); }\n :host([rounded=\"full\"]) .root { border-radius: var(--cg-border-radius-full); }\n `];\n @property({ reflect: true }) rounded: 'none' | 'sm' | 'md' | 'lg' | 'full' = 'lg';\n @property({ attribute: false }) data: unknown = null;\n @property({ type: Boolean }) expanded = true;\n @property({ type: Number, attribute: 'max-depth' }) maxDepth = 5;\n\n @state() private _collapsed: Set<string> = new Set();\n\n private _isCollapsed(path: string): boolean {\n if (this.expanded) {\n return this._collapsed.has(path);\n }\n return !this._collapsed.has(path);\n }\n\n private _togglePath(path: string): void {\n const next = new Set(this._collapsed);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n this._collapsed = next;\n }\n\n private _emitPathClick(path: string): void {\n this.dispatchEvent(new CustomEvent('ai-json-path-click', {\n detail: { path },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _countItems(val: unknown): number {\n if (Array.isArray(val)) return val.length;\n if (val && typeof val === 'object') return Object.keys(val).length;\n return 0;\n }\n\n private _seen = new WeakSet();\n\n private _renderValue(val: unknown, path: string, depth: number, isLast: boolean): unknown {\n const comma = isLast ? '' : ',';\n\n // Circular reference detection\n if (val !== null && typeof val === 'object') {\n if (this._seen.has(val as object)) {\n return html`<span class=\"null\">[Circular]</span>${comma}`;\n }\n this._seen.add(val as object);\n }\n\n if (val === null) {\n return html`<span class=\"null\">null</span>${comma}`;\n }\n if (typeof val === 'string') {\n return html`<span class=\"string\">\"${val}\"</span>${comma}`;\n }\n if (typeof val === 'number') {\n return html`<span class=\"number\">${val}</span>${comma}`;\n }\n if (typeof val === 'boolean') {\n return html`<span class=\"boolean\">${val}</span>${comma}`;\n }\n\n if (Array.isArray(val)) {\n return this._renderArray(val, path, depth, comma);\n }\n if (typeof val === 'object') {\n return this._renderObject(val as Record<string, unknown>, path, depth, comma);\n }\n\n return html`<span class=\"string\">${String(val)}</span>${comma}`;\n }\n\n private _renderArray(arr: unknown[], path: string, depth: number, comma: string): unknown {\n const collapsed = this._isCollapsed(path);\n const count = arr.length;\n const indent = ' '.repeat(depth);\n const childIndent = ' '.repeat(depth + 1);\n\n if (count === 0) {\n return html`<span class=\"bracket\">[]</span>${comma}`;\n }\n\n if (collapsed || depth >= this.maxDepth) {\n return html`<button class=\"toggle\" tabindex=\"0\" aria-label=\"Expand array\" @click=${() => this._togglePath(path)}>\\u25B6</button><span class=\"bracket\">[</span><span class=\"collapsed-hint\"> ${count} items </span><span class=\"bracket\">]</span>${comma}`;\n }\n\n return html`<button class=\"toggle\" tabindex=\"0\" aria-label=\"Collapse array\" @click=${() => this._togglePath(path)}>\\u25BC</button><span class=\"bracket\">[</span>\n${arr.map((item, i) => html`<div class=\"line\">${childIndent}${this._renderValue(item, `${path}[${i}]`, depth + 1, i === count - 1)}</div>`)}\n<div class=\"line\">${indent}<span class=\"bracket\">]</span>${comma}<span class=\"line-count\">// ${count} items</span></div>`;\n }\n\n private _renderObject(obj: Record<string, unknown>, path: string, depth: number, comma: string): unknown {\n const collapsed = this._isCollapsed(path);\n const keys = Object.keys(obj);\n const count = keys.length;\n const indent = ' '.repeat(depth);\n const childIndent = ' '.repeat(depth + 1);\n\n if (count === 0) {\n return html`<span class=\"bracket\">{}</span>${comma}`;\n }\n\n if (collapsed || depth >= this.maxDepth) {\n return html`<button class=\"toggle\" tabindex=\"0\" aria-label=\"Expand object\" @click=${() => this._togglePath(path)}>\\u25B6</button><span class=\"bracket\">{</span><span class=\"collapsed-hint\"> ${count} keys </span><span class=\"bracket\">}</span>${comma}`;\n }\n\n return html`<button class=\"toggle\" tabindex=\"0\" aria-label=\"Collapse object\" @click=${() => this._togglePath(path)}>\\u25BC</button><span class=\"bracket\">{</span>\n${keys.map((key, i) => {\n const childPath = path ? `${path}.${key}` : key;\n return html`<div class=\"line\">${childIndent}<span class=\"key\" tabindex=\"0\" role=\"button\" aria-label=\"Copy path: ${childPath}\" @click=${() => this._emitPathClick(childPath)} @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter') this._emitPathClick(childPath); }}>\"${key}\"</span>: ${this._renderValue(obj[key], childPath, depth + 1, i === count - 1)}</div>`;\n})}\n<div class=\"line\">${indent}<span class=\"bracket\">}</span>${comma}<span class=\"line-count\">// ${count} keys</span></div>`;\n }\n\n override render() {\n this._seen = new WeakSet(); // Reset cycle detection each render\n return html`\n <div class=\"root\" role=\"tree\" aria-label=\"JSON viewer\">\n <div class=\"line\">${this._renderValue(this.data, '$', 0, true)}</div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ai-json-viewer': AiJsonViewer;\n }\n}\n"],"names":["AiJsonViewer","LitElement","path","next","val","depth","isLast","comma","html","arr","collapsed","count","indent","childIndent","item","i","obj","keys","key","childPath","e","hostBlock","reducedMotion","fadeSlideInKeyframes","css","__decorateClass","property","state","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-json-viewer.js","sources":["../../../src/components/ai-json-viewer/ai-json-viewer.ts"],"sourcesContent":["/**\n * @element ai-json-viewer\n * Interactive JSON tree viewer with collapsible nodes, syntax highlighting,\n * and circular reference detection. Supports nested objects and arrays\n * with expand/collapse per node and item counts.\n *\n * @example\n * ```html\n * <ai-json-viewer .data=${{ name: 'Claude', version: 3 }} expanded max-depth=\"4\"></ai-json-viewer>\n * ```\n *\n * @prop {unknown} data - JSON-serializable data to display\n * @prop {boolean} expanded - Whether nodes start expanded (default true)\n * @prop {number} maxDepth - Maximum nesting depth before auto-collapse (default 5)\n *\n * @fires {CustomEvent<{path: string}>} ai-json-path-click - When a key label is clicked\n *\n * @cssprop [--cg-font-family-mono] - Monospace font for the viewer\n * @cssprop [--cg-color-surface] - Background color of the root container\n * @cssprop [--cg-color-accent] - Accent color for number values\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeSlideInKeyframes } from '../../styles/index.js';\n\n@customElement('ai-json-viewer')\nexport class AiJsonViewer extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeSlideInKeyframes, css`\n :host {\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 color: var(--cg-color-surface-base-text);\n animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-ease-out) both;\n }\n :host([hidden]) { display: none; }\n\n .root {\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) var(--cg-spacing-16);\n overflow-x: auto;\n }\n\n .line {\n white-space: pre;\n }\n\n .key {\n color: var(--cg-color-status-info-text-default);\n cursor: pointer;\n }\n .key:hover {\n text-decoration: underline;\n }\n .key:focus-visible {\n outline: var(--cg-border-width-100) solid var(--cg-color-focus-ring);\n outline-offset: var(--cg-outline-offset-default);\n border-radius: var(--cg-border-radius-50);\n }\n\n .string { color: var(--cg-color-status-success-text-default); }\n .number { color: var(--cg-color-surface-base-text); }\n .boolean { color: var(--cg-color-status-success-text-default); }\n .null { color: var(--cg-color-input-text-placeholder); font-style: italic; }\n\n .toggle {\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 background: none;\n border: none;\n color: var(--cg-color-input-text-placeholder);\n cursor: pointer;\n padding: 0;\n font-size: var(--cg-font-size-xs);\n vertical-align: middle;\n border-radius: var(--cg-border-radius-50);\n transition: color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .toggle:hover {\n color: var(--cg-color-surface-base-text);\n }\n .toggle:focus-visible {\n outline: var(--cg-border-width-100) solid var(--cg-color-focus-ring);\n outline-offset: var(--cg-outline-offset-default);\n }\n\n .collapsed-hint {\n color: var(--cg-color-input-text-placeholder);\n font-style: italic;\n font-size: var(--cg-font-size-xs);\n }\n\n .line-count {\n display: inline;\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xs);\n margin-left: var(--cg-spacing-4);\n }\n\n .bracket {\n color: var(--cg-color-input-text-placeholder);\n }\n\n /* ── Rounded variants ── */\n :host([rounded=\"none\"]) .root { border-radius: 0; }\n :host([rounded=\"sm\"]) .root { border-radius: var(--cg-border-radius-50); }\n :host([rounded=\"md\"]) .root { border-radius: var(--cg-border-radius-100); }\n :host([rounded=\"lg\"]) .root { border-radius: var(--cg-border-radius-150); }\n :host([rounded=\"full\"]) .root { border-radius: var(--cg-border-radius-full); }\n `];\n @property({ reflect: true }) rounded: 'none' | 'sm' | 'md' | 'lg' | 'full' = 'lg';\n @property({ attribute: false }) data: unknown = null;\n @property({ type: Boolean }) expanded = true;\n @property({ type: Number, attribute: 'max-depth' }) maxDepth = 5;\n\n @state() private _collapsed: Set<string> = new Set();\n\n private _isCollapsed(path: string): boolean {\n if (this.expanded) {\n return this._collapsed.has(path);\n }\n return !this._collapsed.has(path);\n }\n\n private _togglePath(path: string): void {\n const next = new Set(this._collapsed);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n this._collapsed = next;\n }\n\n private _emitPathClick(path: string): void {\n this.dispatchEvent(new CustomEvent('ai-json-path-click', {\n detail: { path },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _countItems(val: unknown): number {\n if (Array.isArray(val)) return val.length;\n if (val && typeof val === 'object') return Object.keys(val).length;\n return 0;\n }\n\n private _seen = new WeakSet();\n\n private _renderValue(val: unknown, path: string, depth: number, isLast: boolean): unknown {\n const comma = isLast ? '' : ',';\n\n // Circular reference detection\n if (val !== null && typeof val === 'object') {\n if (this._seen.has(val as object)) {\n return html`<span class=\"null\">[Circular]</span>${comma}`;\n }\n this._seen.add(val as object);\n }\n\n if (val === null) {\n return html`<span class=\"null\">null</span>${comma}`;\n }\n if (typeof val === 'string') {\n return html`<span class=\"string\">\"${val}\"</span>${comma}`;\n }\n if (typeof val === 'number') {\n return html`<span class=\"number\">${val}</span>${comma}`;\n }\n if (typeof val === 'boolean') {\n return html`<span class=\"boolean\">${val}</span>${comma}`;\n }\n\n if (Array.isArray(val)) {\n return this._renderArray(val, path, depth, comma);\n }\n if (typeof val === 'object') {\n return this._renderObject(val as Record<string, unknown>, path, depth, comma);\n }\n\n return html`<span class=\"string\">${String(val)}</span>${comma}`;\n }\n\n private _renderArray(arr: unknown[], path: string, depth: number, comma: string): unknown {\n const collapsed = this._isCollapsed(path);\n const count = arr.length;\n const indent = ' '.repeat(depth);\n const childIndent = ' '.repeat(depth + 1);\n\n if (count === 0) {\n return html`<span class=\"bracket\">[]</span>${comma}`;\n }\n\n if (collapsed || depth >= this.maxDepth) {\n return html`<button class=\"toggle\" tabindex=\"0\" aria-label=\"Expand array\" @click=${() => this._togglePath(path)}>\\u25B6</button><span class=\"bracket\">[</span><span class=\"collapsed-hint\"> ${count} items </span><span class=\"bracket\">]</span>${comma}`;\n }\n\n return html`<button class=\"toggle\" tabindex=\"0\" aria-label=\"Collapse array\" @click=${() => this._togglePath(path)}>\\u25BC</button><span class=\"bracket\">[</span>\n${arr.map((item, i) => html`<div class=\"line\">${childIndent}${this._renderValue(item, `${path}[${i}]`, depth + 1, i === count - 1)}</div>`)}\n<div class=\"line\">${indent}<span class=\"bracket\">]</span>${comma}<span class=\"line-count\">// ${count} items</span></div>`;\n }\n\n private _renderObject(obj: Record<string, unknown>, path: string, depth: number, comma: string): unknown {\n const collapsed = this._isCollapsed(path);\n const keys = Object.keys(obj);\n const count = keys.length;\n const indent = ' '.repeat(depth);\n const childIndent = ' '.repeat(depth + 1);\n\n if (count === 0) {\n return html`<span class=\"bracket\">{}</span>${comma}`;\n }\n\n if (collapsed || depth >= this.maxDepth) {\n return html`<button class=\"toggle\" tabindex=\"0\" aria-label=\"Expand object\" @click=${() => this._togglePath(path)}>\\u25B6</button><span class=\"bracket\">{</span><span class=\"collapsed-hint\"> ${count} keys </span><span class=\"bracket\">}</span>${comma}`;\n }\n\n return html`<button class=\"toggle\" tabindex=\"0\" aria-label=\"Collapse object\" @click=${() => this._togglePath(path)}>\\u25BC</button><span class=\"bracket\">{</span>\n${keys.map((key, i) => {\n const childPath = path ? `${path}.${key}` : key;\n return html`<div class=\"line\">${childIndent}<span class=\"key\" tabindex=\"0\" role=\"button\" aria-label=\"Copy path: ${childPath}\" @click=${() => this._emitPathClick(childPath)} @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter') this._emitPathClick(childPath); }}>\"${key}\"</span>: ${this._renderValue(obj[key], childPath, depth + 1, i === count - 1)}</div>`;\n})}\n<div class=\"line\">${indent}<span class=\"bracket\">}</span>${comma}<span class=\"line-count\">// ${count} keys</span></div>`;\n }\n\n override render() {\n this._seen = new WeakSet(); // Reset cycle detection each render\n return html`\n <div class=\"root\" role=\"tree\" aria-label=\"JSON viewer\">\n <div class=\"line\">${this._renderValue(this.data, '$', 0, true)}</div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ai-json-viewer': AiJsonViewer;\n }\n}\n"],"names":["AiJsonViewer","LitElement","path","next","val","depth","isLast","comma","html","arr","collapsed","count","indent","childIndent","item","i","obj","keys","key","childPath","e","hostBlock","reducedMotion","fadeSlideInKeyframes","css","__decorateClass","property","state","customElement"],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { css as
|
|
2
|
-
import { property as g, state as h, customElement as
|
|
3
|
-
import { h as
|
|
4
|
-
var y = Object.defineProperty, x = Object.getOwnPropertyDescriptor, l = (
|
|
5
|
-
for (var s =
|
|
6
|
-
(n =
|
|
7
|
-
return
|
|
1
|
+
import { css as u, LitElement as p, nothing as d, html as a } from "lit";
|
|
2
|
+
import { property as g, state as h, customElement as f } from "lit/decorators.js";
|
|
3
|
+
import { h as v, r as b, f as m } from "../../chunks/premium.css-DHekUEUt.js";
|
|
4
|
+
var y = Object.defineProperty, x = Object.getOwnPropertyDescriptor, l = (o, e, r, t) => {
|
|
5
|
+
for (var s = t > 1 ? void 0 : t ? x(e, r) : e, i = o.length - 1, n; i >= 0; i--)
|
|
6
|
+
(n = o[i]) && (s = (t ? n(e, r, s) : n(s)) || s);
|
|
7
|
+
return t && s && y(e, r, s), s;
|
|
8
8
|
};
|
|
9
|
-
let c = class extends
|
|
9
|
+
let c = class extends p {
|
|
10
10
|
constructor() {
|
|
11
|
-
super(...arguments), this.shortcuts = [], this.open = !1, this._search = "", this._handleKeyDown = (
|
|
12
|
-
|
|
11
|
+
super(...arguments), this.shortcuts = [], this.open = !1, this._search = "", this._handleKeyDown = (o) => {
|
|
12
|
+
o.key === "Escape" && this.open && this._close();
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
15
|
connectedCallback() {
|
|
@@ -23,22 +23,22 @@ let c = class extends u {
|
|
|
23
23
|
}
|
|
24
24
|
_filtered() {
|
|
25
25
|
if (!this._search) return this.shortcuts;
|
|
26
|
-
const
|
|
26
|
+
const o = this._search.toLowerCase();
|
|
27
27
|
return this.shortcuts.filter(
|
|
28
|
-
(e) => e.description.toLowerCase().includes(
|
|
28
|
+
(e) => e.description.toLowerCase().includes(o) || e.keys.some((r) => r.toLowerCase().includes(o)) || e.category?.toLowerCase().includes(o)
|
|
29
29
|
);
|
|
30
30
|
}
|
|
31
|
-
_grouped(
|
|
31
|
+
_grouped(o) {
|
|
32
32
|
const e = /* @__PURE__ */ new Map();
|
|
33
|
-
for (const r of
|
|
34
|
-
const
|
|
35
|
-
e.has(
|
|
33
|
+
for (const r of o) {
|
|
34
|
+
const t = r.category || "General";
|
|
35
|
+
e.has(t) || e.set(t, []), e.get(t).push(r);
|
|
36
36
|
}
|
|
37
37
|
return e;
|
|
38
38
|
}
|
|
39
39
|
render() {
|
|
40
40
|
if (!this.open) return d;
|
|
41
|
-
const
|
|
41
|
+
const o = this._filtered(), e = this._grouped(o);
|
|
42
42
|
return a`
|
|
43
43
|
<div class="overlay" @click=${(r) => {
|
|
44
44
|
r.target === r.currentTarget && this._close();
|
|
@@ -59,9 +59,9 @@ let c = class extends u {
|
|
|
59
59
|
aria-label="Search shortcuts"
|
|
60
60
|
/>
|
|
61
61
|
<div class="shortcuts-list" role="list">
|
|
62
|
-
${
|
|
62
|
+
${o.length === 0 ? a`<div class="no-results">No shortcuts found</div>` : Array.from(e.entries()).map(([r, t]) => a`
|
|
63
63
|
<div class="category-label">${r}</div>
|
|
64
|
-
${
|
|
64
|
+
${t.map((s) => a`
|
|
65
65
|
<div class="shortcut-row" role="listitem">
|
|
66
66
|
<span class="shortcut-desc">${s.description}</span>
|
|
67
67
|
<span class="key-group">
|
|
@@ -79,7 +79,7 @@ let c = class extends u {
|
|
|
79
79
|
`;
|
|
80
80
|
}
|
|
81
81
|
};
|
|
82
|
-
c.styles = [
|
|
82
|
+
c.styles = [v, b, m, u`
|
|
83
83
|
:host {
|
|
84
84
|
animation: fadeSlideIn var(--cg-transition-duration-default) var(--cg-transition-easing-ease-out) both;
|
|
85
85
|
}
|
|
@@ -88,7 +88,7 @@ c.styles = [f, b, m, p`
|
|
|
88
88
|
.overlay {
|
|
89
89
|
position: fixed;
|
|
90
90
|
inset: 0;
|
|
91
|
-
background: var(--cg-overlay-
|
|
91
|
+
background: var(--cg-color-modal-overlay-background);
|
|
92
92
|
backdrop-filter: blur(2px);
|
|
93
93
|
display: flex;
|
|
94
94
|
align-items: center;
|
|
@@ -133,7 +133,7 @@ c.styles = [f, b, m, p`
|
|
|
133
133
|
}
|
|
134
134
|
.close-btn:hover { color: var(--cg-color-surface-base-text); }
|
|
135
135
|
.close-btn:focus-visible {
|
|
136
|
-
outline: 2px solid var(--cg-
|
|
136
|
+
outline: 2px solid var(--cg-color-focus-ring);
|
|
137
137
|
outline-offset: var(--cg-outline-offset-default);
|
|
138
138
|
}
|
|
139
139
|
|
|
@@ -153,7 +153,7 @@ c.styles = [f, b, m, p`
|
|
|
153
153
|
color: var(--cg-color-input-text-placeholder);
|
|
154
154
|
}
|
|
155
155
|
.search-input:focus-visible {
|
|
156
|
-
outline: 2px solid var(--cg-
|
|
156
|
+
outline: 2px solid var(--cg-color-focus-ring);
|
|
157
157
|
outline-offset: var(--cg-outline-offset-default);
|
|
158
158
|
}
|
|
159
159
|
|
|
@@ -232,7 +232,7 @@ l([
|
|
|
232
232
|
h()
|
|
233
233
|
], c.prototype, "_search", 2);
|
|
234
234
|
c = l([
|
|
235
|
-
|
|
235
|
+
f("ai-keyboard-shortcuts")
|
|
236
236
|
], c);
|
|
237
237
|
export {
|
|
238
238
|
c as AiKeyboardShortcuts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-keyboard-shortcuts.js","sources":["../../../src/components/ai-keyboard-shortcuts/ai-keyboard-shortcuts.ts"],"sourcesContent":["/**\n * @element ai-keyboard-shortcuts\n * Modal overlay displaying grouped keyboard shortcuts with searchable\n * key badge UI. Closes on Escape or backdrop click.\n *\n * @example\n * ```html\n * <ai-keyboard-shortcuts\n * .shortcuts=${[{ keys: ['Ctrl', 'K'], description: 'Open search', category: 'Navigation' }]}\n * open\n * ></ai-keyboard-shortcuts>\n * ```\n *\n * @prop {ShortcutEntry[]} shortcuts - Array of shortcut definitions with keys, description, category\n * @prop {boolean} open - Whether the modal is visible\n *\n * @fires ai-shortcuts-close - When the modal is dismissed\n *\n * @cssprop [--cg-font-family-mono] - Font for key badges\n * @cssprop [--cg-color-bg-primary] - Modal background color\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, state, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeSlideInKeyframes } from '../../styles/index.js';\n\nexport interface ShortcutEntry {\n keys: string[];\n description: string;\n category?: string;\n}\n\n@customElement('ai-keyboard-shortcuts')\nexport class AiKeyboardShortcuts extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeSlideInKeyframes, css`\n :host {\n animation: fadeSlideIn var(--cg-transition-duration-default) var(--cg-transition-easing-ease-out) both;\n }\n :host([hidden]) { display: none; }\n\n .overlay {\n position: fixed;\n inset: 0;\n background: var(--cg-overlay-dark-strong);\n backdrop-filter: blur(2px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: var(--cg-z-index-top);\n }\n\n .modal {\n background: var(--cg-color-surface-base-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-150);\n padding: var(--cg-spacing-24);\n max-width: 520px;\n width: 90vw;\n max-height: 70vh;\n display: flex;\n flex-direction: column;\n }\n\n .modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--cg-spacing-16);\n }\n\n .modal-title {\n color: var(--cg-color-surface-base-text);\n font-size: var(--cg-font-size-lg);\n font-weight: var(--cg-font-weight-bold);\n }\n\n .close-btn {\n background: none;\n border: none;\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xl);\n cursor: pointer;\n padding: var(--cg-spacing-4);\n border-radius: var(--cg-border-radius-50);\n line-height: 1;\n }\n .close-btn:hover { color: var(--cg-color-surface-base-text); }\n .close-btn:focus-visible {\n outline: 2px solid var(--cg-overlay-accent-strong);\n outline-offset: var(--cg-outline-offset-default);\n }\n\n .search-input {\n width: 100%;\n padding: var(--cg-spacing-8) var(--cg-spacing-12);\n border-radius: var(--cg-border-radius-100);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n background: var(--cg-color-surface-container-background);\n color: var(--cg-color-surface-base-text);\n font-size: var(--cg-font-size-sm);\n font-family: inherit;\n margin-bottom: var(--cg-spacing-16);\n box-sizing: border-box;\n }\n .search-input::placeholder {\n color: var(--cg-color-input-text-placeholder);\n }\n .search-input:focus-visible {\n outline: 2px solid var(--cg-overlay-accent-strong);\n outline-offset: var(--cg-outline-offset-default);\n }\n\n .shortcuts-list {\n overflow-y: auto;\n flex: 1;\n }\n\n .category-label {\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-bold);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: var(--cg-spacing-8) 0 var(--cg-spacing-6);\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n margin-bottom: var(--cg-spacing-4);\n }\n\n .shortcut-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--cg-spacing-8) var(--cg-spacing-4);\n }\n\n .shortcut-desc {\n color: var(--cg-color-surface-base-text);\n font-size: var(--cg-font-size-sm);\n }\n\n .key-group {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-4);\n flex-shrink: 0;\n }\n\n .key-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--cg-spacing-24);\n height: var(--cg-spacing-24);\n padding: 0 var(--cg-spacing-6);\n background: var(--cg-color-surface-container-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-bottom-width: 3px;\n border-radius: var(--cg-border-radius-50);\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 font-family: var(--cg-font-family-mono);\n white-space: nowrap;\n }\n\n .key-plus {\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xs);\n }\n\n .no-results {\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-sm);\n text-align: center;\n padding: var(--cg-spacing-16);\n }\n `];\n @property({ type: Array }) shortcuts: ShortcutEntry[] = [];\n @property({ type: Boolean, reflect: true }) open = false;\n\n @state() private _search = '';\n\n private _handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.open) {\n this._close();\n }\n };\n\n override connectedCallback() {\n super.connectedCallback();\n document.addEventListener('keydown', this._handleKeyDown);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('keydown', this._handleKeyDown);\n }\n\n private _close() {\n this.open = false;\n this._search = '';\n this.dispatchEvent(new CustomEvent('ai-shortcuts-close', { bubbles: true, composed: true }));\n }\n\n private _filtered(): ShortcutEntry[] {\n if (!this._search) return this.shortcuts;\n const q = this._search.toLowerCase();\n return this.shortcuts.filter(s =>\n s.description.toLowerCase().includes(q) ||\n s.keys.some(k => k.toLowerCase().includes(q)) ||\n (s.category?.toLowerCase().includes(q))\n );\n }\n\n private _grouped(items: ShortcutEntry[]): Map<string, ShortcutEntry[]> {\n const map = new Map<string, ShortcutEntry[]>();\n for (const item of items) {\n const cat = item.category || 'General';\n if (!map.has(cat)) map.set(cat, []);\n map.get(cat)!.push(item);\n }\n return map;\n }\n\n override render() {\n if (!this.open) return nothing;\n const filtered = this._filtered();\n const grouped = this._grouped(filtered);\n\n return html`\n <div class=\"overlay\" @click=${(e: Event) => { if (e.target === e.currentTarget) this._close(); }}>\n <div class=\"modal\" role=\"dialog\" aria-label=\"Keyboard shortcuts\" aria-modal=\"true\">\n <div class=\"modal-header\">\n <span class=\"modal-title\">Keyboard Shortcuts</span>\n <button class=\"close-btn\" aria-label=\"Close shortcuts\" @click=${this._close}><svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg></button>\n </div>\n <input\n class=\"search-input\"\n type=\"text\"\n placeholder=\"Search shortcuts...\"\n .value=${this._search}\n @input=${(e: Event) => { this._search = (e.target as HTMLInputElement).value; }}\n aria-label=\"Search shortcuts\"\n />\n <div class=\"shortcuts-list\" role=\"list\">\n ${filtered.length === 0\n ? html`<div class=\"no-results\">No shortcuts found</div>`\n : Array.from(grouped.entries()).map(([cat, items]) => html`\n <div class=\"category-label\">${cat}</div>\n ${items.map(s => html`\n <div class=\"shortcut-row\" role=\"listitem\">\n <span class=\"shortcut-desc\">${s.description}</span>\n <span class=\"key-group\">\n ${s.keys.map((k, i) => html`\n ${i > 0 ? html`<span class=\"key-plus\">+</span>` : nothing}\n <span class=\"key-badge\">${k}</span>\n `)}\n </span>\n </div>\n `)}\n `)}\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ai-keyboard-shortcuts': AiKeyboardShortcuts;\n }\n}\n"],"names":["AiKeyboardShortcuts","LitElement","e","q","s","k","items","map","item","cat","nothing","filtered","grouped","html","i","hostBlock","reducedMotion","fadeSlideInKeyframes","css","__decorateClass","property","state","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-keyboard-shortcuts.js","sources":["../../../src/components/ai-keyboard-shortcuts/ai-keyboard-shortcuts.ts"],"sourcesContent":["/**\n * @element ai-keyboard-shortcuts\n * Modal overlay displaying grouped keyboard shortcuts with searchable\n * key badge UI. Closes on Escape or backdrop click.\n *\n * @example\n * ```html\n * <ai-keyboard-shortcuts\n * .shortcuts=${[{ keys: ['Ctrl', 'K'], description: 'Open search', category: 'Navigation' }]}\n * open\n * ></ai-keyboard-shortcuts>\n * ```\n *\n * @prop {ShortcutEntry[]} shortcuts - Array of shortcut definitions with keys, description, category\n * @prop {boolean} open - Whether the modal is visible\n *\n * @fires ai-shortcuts-close - When the modal is dismissed\n *\n * @cssprop [--cg-font-family-mono] - Font for key badges\n * @cssprop [--cg-color-bg-primary] - Modal background color\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, state, customElement } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeSlideInKeyframes } from '../../styles/index.js';\n\nexport interface ShortcutEntry {\n keys: string[];\n description: string;\n category?: string;\n}\n\n@customElement('ai-keyboard-shortcuts')\nexport class AiKeyboardShortcuts extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeSlideInKeyframes, css`\n :host {\n animation: fadeSlideIn var(--cg-transition-duration-default) var(--cg-transition-easing-ease-out) both;\n }\n :host([hidden]) { display: none; }\n\n .overlay {\n position: fixed;\n inset: 0;\n background: var(--cg-color-modal-overlay-background);\n backdrop-filter: blur(2px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: var(--cg-z-index-top);\n }\n\n .modal {\n background: var(--cg-color-surface-base-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-150);\n padding: var(--cg-spacing-24);\n max-width: 520px;\n width: 90vw;\n max-height: 70vh;\n display: flex;\n flex-direction: column;\n }\n\n .modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--cg-spacing-16);\n }\n\n .modal-title {\n color: var(--cg-color-surface-base-text);\n font-size: var(--cg-font-size-lg);\n font-weight: var(--cg-font-weight-bold);\n }\n\n .close-btn {\n background: none;\n border: none;\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xl);\n cursor: pointer;\n padding: var(--cg-spacing-4);\n border-radius: var(--cg-border-radius-50);\n line-height: 1;\n }\n .close-btn:hover { color: var(--cg-color-surface-base-text); }\n .close-btn:focus-visible {\n outline: 2px solid var(--cg-color-focus-ring);\n outline-offset: var(--cg-outline-offset-default);\n }\n\n .search-input {\n width: 100%;\n padding: var(--cg-spacing-8) var(--cg-spacing-12);\n border-radius: var(--cg-border-radius-100);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n background: var(--cg-color-surface-container-background);\n color: var(--cg-color-surface-base-text);\n font-size: var(--cg-font-size-sm);\n font-family: inherit;\n margin-bottom: var(--cg-spacing-16);\n box-sizing: border-box;\n }\n .search-input::placeholder {\n color: var(--cg-color-input-text-placeholder);\n }\n .search-input:focus-visible {\n outline: 2px solid var(--cg-color-focus-ring);\n outline-offset: var(--cg-outline-offset-default);\n }\n\n .shortcuts-list {\n overflow-y: auto;\n flex: 1;\n }\n\n .category-label {\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-bold);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n padding: var(--cg-spacing-8) 0 var(--cg-spacing-6);\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n margin-bottom: var(--cg-spacing-4);\n }\n\n .shortcut-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--cg-spacing-8) var(--cg-spacing-4);\n }\n\n .shortcut-desc {\n color: var(--cg-color-surface-base-text);\n font-size: var(--cg-font-size-sm);\n }\n\n .key-group {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-4);\n flex-shrink: 0;\n }\n\n .key-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--cg-spacing-24);\n height: var(--cg-spacing-24);\n padding: 0 var(--cg-spacing-6);\n background: var(--cg-color-surface-container-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-bottom-width: 3px;\n border-radius: var(--cg-border-radius-50);\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 font-family: var(--cg-font-family-mono);\n white-space: nowrap;\n }\n\n .key-plus {\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xs);\n }\n\n .no-results {\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-sm);\n text-align: center;\n padding: var(--cg-spacing-16);\n }\n `];\n @property({ type: Array }) shortcuts: ShortcutEntry[] = [];\n @property({ type: Boolean, reflect: true }) open = false;\n\n @state() private _search = '';\n\n private _handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.open) {\n this._close();\n }\n };\n\n override connectedCallback() {\n super.connectedCallback();\n document.addEventListener('keydown', this._handleKeyDown);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('keydown', this._handleKeyDown);\n }\n\n private _close() {\n this.open = false;\n this._search = '';\n this.dispatchEvent(new CustomEvent('ai-shortcuts-close', { bubbles: true, composed: true }));\n }\n\n private _filtered(): ShortcutEntry[] {\n if (!this._search) return this.shortcuts;\n const q = this._search.toLowerCase();\n return this.shortcuts.filter(s =>\n s.description.toLowerCase().includes(q) ||\n s.keys.some(k => k.toLowerCase().includes(q)) ||\n (s.category?.toLowerCase().includes(q))\n );\n }\n\n private _grouped(items: ShortcutEntry[]): Map<string, ShortcutEntry[]> {\n const map = new Map<string, ShortcutEntry[]>();\n for (const item of items) {\n const cat = item.category || 'General';\n if (!map.has(cat)) map.set(cat, []);\n map.get(cat)!.push(item);\n }\n return map;\n }\n\n override render() {\n if (!this.open) return nothing;\n const filtered = this._filtered();\n const grouped = this._grouped(filtered);\n\n return html`\n <div class=\"overlay\" @click=${(e: Event) => { if (e.target === e.currentTarget) this._close(); }}>\n <div class=\"modal\" role=\"dialog\" aria-label=\"Keyboard shortcuts\" aria-modal=\"true\">\n <div class=\"modal-header\">\n <span class=\"modal-title\">Keyboard Shortcuts</span>\n <button class=\"close-btn\" aria-label=\"Close shortcuts\" @click=${this._close}><svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg></button>\n </div>\n <input\n class=\"search-input\"\n type=\"text\"\n placeholder=\"Search shortcuts...\"\n .value=${this._search}\n @input=${(e: Event) => { this._search = (e.target as HTMLInputElement).value; }}\n aria-label=\"Search shortcuts\"\n />\n <div class=\"shortcuts-list\" role=\"list\">\n ${filtered.length === 0\n ? html`<div class=\"no-results\">No shortcuts found</div>`\n : Array.from(grouped.entries()).map(([cat, items]) => html`\n <div class=\"category-label\">${cat}</div>\n ${items.map(s => html`\n <div class=\"shortcut-row\" role=\"listitem\">\n <span class=\"shortcut-desc\">${s.description}</span>\n <span class=\"key-group\">\n ${s.keys.map((k, i) => html`\n ${i > 0 ? html`<span class=\"key-plus\">+</span>` : nothing}\n <span class=\"key-badge\">${k}</span>\n `)}\n </span>\n </div>\n `)}\n `)}\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ai-keyboard-shortcuts': AiKeyboardShortcuts;\n }\n}\n"],"names":["AiKeyboardShortcuts","LitElement","e","q","s","k","items","map","item","cat","nothing","filtered","grouped","html","i","hostBlock","reducedMotion","fadeSlideInKeyframes","css","__decorateClass","property","state","customElement"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { css as v, LitElement as u, html as i, nothing as g } from "lit";
|
|
2
2
|
import { property as c, customElement as p } from "lit/decorators.js";
|
|
3
|
-
import { h, r as b, f, b as m } from "../../chunks/premium.css-
|
|
3
|
+
import { h, r as b, f, b as m } from "../../chunks/premium.css-DHekUEUt.js";
|
|
4
4
|
var k = Object.defineProperty, w = Object.getOwnPropertyDescriptor, o = (r, e, l, s) => {
|
|
5
5
|
for (var a = s > 1 ? void 0 : s ? w(e, l) : e, n = r.length - 1, d; n >= 0; n--)
|
|
6
6
|
(d = r[n]) && (a = (s ? d(e, l, a) : d(a)) || a);
|
|
@@ -103,7 +103,7 @@ t.styles = [h, b, f, m, v`
|
|
|
103
103
|
.kpi:hover { background: var(--cg-color-action-secondary-background-hover); }
|
|
104
104
|
.kpi:focus-visible {
|
|
105
105
|
outline: none;
|
|
106
|
-
box-shadow: inset 0 0 0
|
|
106
|
+
box-shadow: inset 0 0 0 var(--cg-border-width-100) var(--cg-overlay-accent-strong);
|
|
107
107
|
}
|
|
108
108
|
/* Single column — no right border, just bottom */
|
|
109
109
|
:host([columns="1"]) .kpi {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-kpi-grid.js","sources":["../../../src/components/ai-kpi-grid/ai-kpi-grid.ts"],"sourcesContent":["/**\n * @element ai-kpi-grid\n * Dashboard card displaying multiple KPI metrics in a configurable grid.\n * Each cell shows label, value, trend arrow, and optional icon.\n * Includes a loading skeleton state.\n *\n * @example\n * ```html\n * <ai-kpi-grid\n * title=\"Performance\"\n * columns=\"3\"\n * .kpis=${[{ label: 'Revenue', value: '$12.4K', delta: '+8.2%', trend: 'up' }]}\n * ></ai-kpi-grid>\n * ```\n *\n * @prop {string} title - Card header title\n * @prop {KpiItem[]} kpis - Array of KPI items with label, value, delta, trend, icon\n * @prop {number} columns - Number of grid columns (default 2)\n * @prop {boolean} loading - Show skeleton loading state\n *\n * @fires {CustomEvent<{label: string, value: string}>} ai-kpi-click - When a KPI cell is clicked\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeSlideInKeyframes, shimmerKeyframes } from '../../styles/index.js';\n\ninterface KpiItem {\n label: string;\n value: string;\n delta?: string;\n trend?: 'up' | 'down' | 'neutral';\n icon?: string;\n}\n\n@customElement('ai-kpi-grid')\nexport class AiKpiGrid extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeSlideInKeyframes, shimmerKeyframes, css`\n :host {\n animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n\n .card {\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-component-card-radius);\n }\n\n .card-title {\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-medium);\n color: var(--cg-color-input-text-placeholder);\n padding: var(--cg-spacing-16) var(--cg-spacing-20) var(--cg-spacing-8);\n text-transform: uppercase;\n letter-spacing: var(--cg-letter-spacing-wide);\n }\n\n /* Inset grid container */\n .grid {\n display: grid;\n margin: 0 var(--cg-spacing-12) var(--cg-spacing-12);\n background: var(--cg-overlay-dark-subtle);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-125);\n overflow: hidden;\n }\n\n /* ── KPI cell ── */\n .kpi {\n padding: var(--cg-spacing-16) var(--cg-spacing-20);\n cursor: pointer;\n transition: background-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n /* Borders via box-shadow trick — inner dividers only, no doubling */\n box-shadow:\n inset calc(-1 * var(--cg-border-width-50)) 0 0 var(--cg-color-surface-cards-border),\n inset 0 calc(-1 * var(--cg-border-width-50)) 0 var(--cg-color-surface-cards-border);\n }\n .kpi:hover { background: var(--cg-color-action-secondary-background-hover); }\n .kpi:focus-visible {\n outline: none;\n box-shadow: inset 0 0 0
|
|
1
|
+
{"version":3,"file":"ai-kpi-grid.js","sources":["../../../src/components/ai-kpi-grid/ai-kpi-grid.ts"],"sourcesContent":["/**\n * @element ai-kpi-grid\n * Dashboard card displaying multiple KPI metrics in a configurable grid.\n * Each cell shows label, value, trend arrow, and optional icon.\n * Includes a loading skeleton state.\n *\n * @example\n * ```html\n * <ai-kpi-grid\n * title=\"Performance\"\n * columns=\"3\"\n * .kpis=${[{ label: 'Revenue', value: '$12.4K', delta: '+8.2%', trend: 'up' }]}\n * ></ai-kpi-grid>\n * ```\n *\n * @prop {string} title - Card header title\n * @prop {KpiItem[]} kpis - Array of KPI items with label, value, delta, trend, icon\n * @prop {number} columns - Number of grid columns (default 2)\n * @prop {boolean} loading - Show skeleton loading state\n *\n * @fires {CustomEvent<{label: string, value: string}>} ai-kpi-click - When a KPI cell is clicked\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeSlideInKeyframes, shimmerKeyframes } from '../../styles/index.js';\n\ninterface KpiItem {\n label: string;\n value: string;\n delta?: string;\n trend?: 'up' | 'down' | 'neutral';\n icon?: string;\n}\n\n@customElement('ai-kpi-grid')\nexport class AiKpiGrid extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeSlideInKeyframes, shimmerKeyframes, css`\n :host {\n animation: fadeSlideIn var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n\n .card {\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-component-card-radius);\n }\n\n .card-title {\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-medium);\n color: var(--cg-color-input-text-placeholder);\n padding: var(--cg-spacing-16) var(--cg-spacing-20) var(--cg-spacing-8);\n text-transform: uppercase;\n letter-spacing: var(--cg-letter-spacing-wide);\n }\n\n /* Inset grid container */\n .grid {\n display: grid;\n margin: 0 var(--cg-spacing-12) var(--cg-spacing-12);\n background: var(--cg-overlay-dark-subtle);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-125);\n overflow: hidden;\n }\n\n /* ── KPI cell ── */\n .kpi {\n padding: var(--cg-spacing-16) var(--cg-spacing-20);\n cursor: pointer;\n transition: background-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n /* Borders via box-shadow trick — inner dividers only, no doubling */\n box-shadow:\n inset calc(-1 * var(--cg-border-width-50)) 0 0 var(--cg-color-surface-cards-border),\n inset 0 calc(-1 * var(--cg-border-width-50)) 0 var(--cg-color-surface-cards-border);\n }\n .kpi:hover { background: var(--cg-color-action-secondary-background-hover); }\n .kpi:focus-visible {\n outline: none;\n box-shadow: inset 0 0 0 var(--cg-border-width-100) var(--cg-overlay-accent-strong);\n }\n /* Single column — no right border, just bottom */\n :host([columns=\"1\"]) .kpi {\n box-shadow: inset 0 calc(-1 * var(--cg-border-width-50)) 0 var(--cg-color-surface-cards-border);\n }\n :host([columns=\"1\"]) .kpi:last-child { box-shadow: none; }\n\n\n .kpi-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 margin-bottom: var(--cg-spacing-4);\n }\n\n .kpi-value {\n font-size: var(--cg-font-size-xl);\n font-weight: var(--cg-font-weight-semibold);\n color: var(--cg-color-surface-base-text);\n line-height: var(--cg-line-height-tight);\n letter-spacing: var(--cg-letter-spacing-tight);\n margin-bottom: var(--cg-spacing-4);\n }\n\n .kpi-delta {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-4);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-medium);\n }\n .kpi-delta.up { color: var(--cg-color-status-success-text-default); }\n .kpi-delta.down { color: var(--cg-color-status-error-text-default); }\n .kpi-delta.neutral { color: var(--cg-color-input-text-placeholder); }\n\n /* ── Loading skeleton ── */\n .skeleton-cell {\n padding: var(--cg-spacing-16) var(--cg-spacing-20);\n }\n .skel-line {\n border-radius: var(--cg-border-radius-50);\n background: linear-gradient(\n 90deg,\n var(--cg-color-surface-container-background) 25%,\n var(--cg-color-surface-cards-border) 50%,\n var(--cg-color-surface-container-background) 75%\n );\n background-size: 200% 100%;\n animation: shimmer 1.5s linear infinite;\n }\n .skel-label { width: 60%; height: var(--cg-spacing-8); margin-bottom: var(--cg-spacing-8); }\n .skel-value { width: 50%; height: var(--cg-spacing-20); margin-bottom: var(--cg-spacing-6); }\n .skel-delta { width: 40%; height: var(--cg-spacing-8); }\n\n `];\n @property({ type: String }) override title = '';\n @property({ attribute: false }) kpis: KpiItem[] = [];\n @property({ type: Number, reflect: true }) columns = 2;\n @property({ type: Boolean }) loading = false;\n\n private _handleKpiClick(kpi: KpiItem) {\n this.dispatchEvent(new CustomEvent('ai-kpi-click', {\n bubbles: true, composed: true,\n detail: { label: kpi.label, value: kpi.value },\n }));\n }\n\n private _trendArrow(trend?: string): string {\n if (trend === 'up') return '\\u2191';\n if (trend === 'down') return '\\u2193';\n return '\\u2192';\n }\n\n private _renderSkeleton() {\n const cells = Array.from({ length: this.columns * 2 });\n return cells.map(() => html`\n <div class=\"skeleton-cell\" aria-hidden=\"true\">\n <div class=\"skel-line skel-label\"></div>\n <div class=\"skel-line skel-value\"></div>\n <div class=\"skel-line skel-delta\"></div>\n </div>\n `);\n }\n\n override render() {\n return html`\n <div class=\"card\" role=\"region\" aria-label=\"${this.title || 'KPI Grid'}\">\n ${this.title ? html`<div class=\"card-title\">${this.title}</div>` : nothing}\n <div class=\"grid\" style=\"grid-template-columns: repeat(${this.columns}, 1fr)\">\n ${this.loading ? this._renderSkeleton() : this.kpis.map(kpi => html`\n <div\n class=\"kpi\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=\"${kpi.label}: ${kpi.value}${kpi.delta ? `, ${kpi.delta}` : ''}\"\n @click=${() => this._handleKpiClick(kpi)}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); this._handleKpiClick(kpi); } }}\n >\n <div class=\"kpi-label\">${kpi.label}</div>\n <div class=\"kpi-value\">${kpi.value}</div>\n ${kpi.delta ? html`\n <span class=\"kpi-delta ${kpi.trend || 'neutral'}\">\n <span class=\"arrow\" aria-hidden=\"true\">${this._trendArrow(kpi.trend)}</span>\n ${kpi.delta}\n </span>\n ` : nothing}\n </div>\n `)}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ai-kpi-grid': AiKpiGrid;\n }\n}\n"],"names":["AiKpiGrid","LitElement","kpi","trend","html","nothing","hostBlock","reducedMotion","fadeSlideInKeyframes","shimmerKeyframes","css","__decorateClass","property","customElement"],"mappings":";;;;;;;;AAmCO,IAAMA,IAAN,cAAwBC,EAAW;AAAA,EAAnC,cAAA;AAAA,UAAA,GAAA,SAAA,GAoGuB,KAAS,QAAQ,IACb,KAAA,OAAkB,CAAA,GACP,KAAA,UAAU,GACxB,KAAA,UAAU;AAAA,EAAA;AAAA,EAE/B,gBAAgBC,GAAc;AACpC,SAAK,cAAc,IAAI,YAAY,gBAAgB;AAAA,MACjD,SAAS;AAAA,MAAM,UAAU;AAAA,MACzB,QAAQ,EAAE,OAAOA,EAAI,OAAO,OAAOA,EAAI,MAAA;AAAA,IAAM,CAC9C,CAAC;AAAA,EACJ;AAAA,EAEQ,YAAYC,GAAwB;AAC1C,WAAIA,MAAU,OAAa,MACvBA,MAAU,SAAe,MACtB;AAAA,EACT;AAAA,EAEQ,kBAAkB;AAExB,WADc,MAAM,KAAK,EAAE,QAAQ,KAAK,UAAU,GAAG,EACxC,IAAI,MAAMC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMtB;AAAA,EACH;AAAA,EAES,SAAS;AAChB,WAAOA;AAAA,oDACyC,KAAK,SAAS,UAAU;AAAA,UAClE,KAAK,QAAQA,4BAA+B,KAAK,KAAK,WAAWC,CAAO;AAAA,iEACjB,KAAK,OAAO;AAAA,YACjE,KAAK,UAAU,KAAK,gBAAA,IAAoB,KAAK,KAAK,IAAI,CAAAH,MAAOE;AAAA;AAAA;AAAA;AAAA;AAAA,4BAK7CF,EAAI,KAAK,KAAKA,EAAI,KAAK,GAAGA,EAAI,QAAQ,KAAKA,EAAI,KAAK,KAAK,EAAE;AAAA,uBAChE,MAAM,KAAK,gBAAgBA,CAAG,CAAC;AAAA,yBAC7B,CAAC,MAAqB;AAAE,OAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SAAO,EAAE,eAAA,GAAkB,KAAK,gBAAgBA,CAAG;AAAA,IAAK,CAAC;AAAA;AAAA,uCAEtGA,EAAI,KAAK;AAAA,uCACTA,EAAI,KAAK;AAAA,gBAChCA,EAAI,QAAQE;AAAA,yCACaF,EAAI,SAAS,SAAS;AAAA,2DACJ,KAAK,YAAYA,EAAI,KAAK,CAAC;AAAA,oBAClEA,EAAI,KAAK;AAAA;AAAA,kBAEXG,CAAO;AAAA;AAAA,WAEd,CAAC;AAAA;AAAA;AAAA;AAAA,EAIV;AACF;AA7JaL,EACK,SAAS,CAACM,GAAWC,GAAeC,GAAsBC,GAAkBC;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,GAkG3F;AACoCC,EAAA;AAAA,EAApCC,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GApGfZ,EAoG0B,WAAA,SAAA,CAAA;AACLW,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GArGnBZ,EAqGqB,WAAA,QAAA,CAAA;AACWW,EAAA;AAAA,EAA1CC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAtG9BZ,EAsGgC,WAAA,WAAA,CAAA;AACdW,EAAA;AAAA,EAA5BC,EAAS,EAAE,MAAM,QAAA,CAAS;AAAA,GAvGhBZ,EAuGkB,WAAA,WAAA,CAAA;AAvGlBA,IAANW,EAAA;AAAA,EADNE,EAAc,aAAa;AAAA,GACfb,CAAA;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { css as
|
|
1
|
+
import { css as p, LitElement as v, nothing as g, html as l } from "lit";
|
|
2
2
|
import { property as b, state as u, customElement as h } from "lit/decorators.js";
|
|
3
|
-
import { h as f, r as m,
|
|
3
|
+
import { h as f, r as m, i as x } from "../../chunks/premium.css-DHekUEUt.js";
|
|
4
4
|
var w = Object.defineProperty, y = Object.getOwnPropertyDescriptor, n = (a, r, o, i) => {
|
|
5
5
|
for (var e = i > 1 ? void 0 : i ? y(r, o) : r, s = a.length - 1, d; s >= 0; s--)
|
|
6
6
|
(d = a[s]) && (e = (i ? d(r, o, e) : d(e)) || e);
|
|
7
7
|
return i && e && w(r, o, e), e;
|
|
8
8
|
};
|
|
9
|
-
let c = class extends
|
|
9
|
+
let c = class extends v {
|
|
10
10
|
constructor() {
|
|
11
11
|
super(...arguments), this.items = [], this.labels = [], this.allowCustomLabels = !1, this.mode = "list", this._activeLabel = "";
|
|
12
12
|
}
|
|
@@ -141,7 +141,7 @@ let c = class extends p {
|
|
|
141
141
|
`;
|
|
142
142
|
}
|
|
143
143
|
};
|
|
144
|
-
c.styles = [f, m, x,
|
|
144
|
+
c.styles = [f, m, x, p`
|
|
145
145
|
:host {
|
|
146
146
|
animation: fadeIn var(--cg-transition-duration-default) var(--cg-transition-easing-default);
|
|
147
147
|
}
|
|
@@ -202,7 +202,7 @@ c.styles = [f, m, x, v`
|
|
|
202
202
|
}
|
|
203
203
|
.palette-btn:focus-visible {
|
|
204
204
|
outline: none;
|
|
205
|
-
box-shadow: 0 0 0 3px var(--cg-
|
|
205
|
+
box-shadow: 0 0 0 3px var(--cg-color-focus-ring);
|
|
206
206
|
}
|
|
207
207
|
.palette-dot {
|
|
208
208
|
width: var(--cg-spacing-6);
|
|
@@ -257,7 +257,7 @@ c.styles = [f, m, x, v`
|
|
|
257
257
|
}
|
|
258
258
|
.item-row:focus-visible {
|
|
259
259
|
outline: none;
|
|
260
|
-
box-shadow: 0 0 0 3px var(--cg-
|
|
260
|
+
box-shadow: 0 0 0 3px var(--cg-color-focus-ring);
|
|
261
261
|
}
|
|
262
262
|
.item-row.clickable {
|
|
263
263
|
cursor: pointer;
|
|
@@ -268,7 +268,7 @@ c.styles = [f, m, x, v`
|
|
|
268
268
|
.item-content {
|
|
269
269
|
flex: 1;
|
|
270
270
|
font-size: var(--cg-font-size-sm);
|
|
271
|
-
color: var(--cg-color-surface-base-text)
|
|
271
|
+
color: var(--cg-color-surface-base-text);
|
|
272
272
|
line-height: var(--cg-line-height-normal);
|
|
273
273
|
}
|
|
274
274
|
.item-meta {
|
|
@@ -306,7 +306,7 @@ c.styles = [f, m, x, v`
|
|
|
306
306
|
background: var(--cg-color-surface-cards-border);
|
|
307
307
|
border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);
|
|
308
308
|
border-radius: var(--cg-border-radius-50);
|
|
309
|
-
color: var(--cg-color-surface-base-text)
|
|
309
|
+
color: var(--cg-color-surface-base-text);
|
|
310
310
|
font-size: var(--cg-font-size-xs);
|
|
311
311
|
padding: var(--cg-spacing-4) var(--cg-spacing-8);
|
|
312
312
|
cursor: pointer;
|
|
@@ -314,7 +314,7 @@ c.styles = [f, m, x, v`
|
|
|
314
314
|
}
|
|
315
315
|
.label-select:focus-visible {
|
|
316
316
|
outline: none;
|
|
317
|
-
box-shadow: 0 0 0 3px var(--cg-
|
|
317
|
+
box-shadow: 0 0 0 3px var(--cg-color-focus-ring);
|
|
318
318
|
}
|
|
319
319
|
|
|
320
320
|
/* ── Remove label button ── */
|
|
@@ -334,7 +334,7 @@ c.styles = [f, m, x, v`
|
|
|
334
334
|
}
|
|
335
335
|
.remove-btn:focus-visible {
|
|
336
336
|
outline: none;
|
|
337
|
-
box-shadow: 0 0 0 3px var(--cg-
|
|
337
|
+
box-shadow: 0 0 0 3px var(--cg-color-focus-ring);
|
|
338
338
|
}
|
|
339
339
|
.remove-btn svg {
|
|
340
340
|
width: var(--cg-spacing-12);
|
|
@@ -362,7 +362,7 @@ c.styles = [f, m, x, v`
|
|
|
362
362
|
}
|
|
363
363
|
.stat-count {
|
|
364
364
|
font-weight: var(--cg-font-weight-bold);
|
|
365
|
-
color: var(--cg-color-surface-base-text)
|
|
365
|
+
color: var(--cg-color-surface-base-text);
|
|
366
366
|
}
|
|
367
367
|
|
|
368
368
|
@media (prefers-reduced-motion: reduce) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-labeling-board.js","sources":["../../../src/components/ai-labeling-board/ai-labeling-board.ts"],"sourcesContent":["/**\n * @element ai-labeling-board\n * Data labeling board with label palette, assignable items, and per-label stats.\n * Supports list mode (dropdown per row) and click mode (select label then click items).\n *\n * @example\n * ```html\n * <ai-labeling-board\n * mode=\"list\"\n * allowCustomLabels\n * .items=${[{ id: '1', content: 'Sample text', label: 'positive' }]}\n * .labels=${[{ id: 'positive', name: 'Positive', color: '#4ade80' }, { id: 'negative', name: 'Negative', color: '#f87171' }]}\n * ></ai-labeling-board>\n * ```\n *\n * @fires {CustomEvent<{itemId: string, labelId: string}>} ai-label-assign - Label assigned to item\n * @fires {CustomEvent<{itemId: string}>} ai-label-remove - Label removed from item\n * @fires {CustomEvent<{name: string, color: string}>} ai-label-create - New custom label created\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, customElement, state } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeInKeyframes } from '../../styles/index.js';\n\ninterface LabelItem {\n id: string;\n content: string;\n label?: string;\n metadata?: string;\n}\n\ninterface LabelDef {\n id: string;\n name: string;\n color: string;\n}\n\n@customElement('ai-labeling-board')\nexport class AiLabelingBoard extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeInKeyframes, css`\n :host {\n animation: fadeIn var(--cg-transition-duration-default) var(--cg-transition-easing-default);\n }\n\n .panel {\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-component-card-radius);\n overflow: hidden;\n }\n\n .header {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-20) var(--cg-spacing-20) var(--cg-spacing-12);\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 }\n .header-count {\n margin-left: auto;\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n }\n\n /* ── Label palette (click mode) ── */\n .palette {\n display: flex;\n flex-wrap: wrap;\n gap: var(--cg-spacing-6);\n padding: var(--cg-spacing-12) var(--cg-spacing-20);\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .palette-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-6);\n padding: var(--cg-spacing-4) var(--cg-spacing-12);\n border-radius: var(--cg-border-radius-full);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n background: var(--cg-color-surface-base-background);\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-semibold);\n cursor: pointer;\n transition: border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .palette-btn:hover {\n border-color: var(--cg-color-input-border-hover);\n }\n .palette-btn.active {\n border-color: var(--_label-color, var(--cg-color-surface-base-text));\n color: var(--_label-color, var(--cg-color-surface-base-text));\n }\n .palette-btn:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n .palette-dot {\n width: var(--cg-spacing-6);\n height: var(--cg-spacing-6);\n border-radius: var(--cg-border-radius-full);\n }\n\n /* ── Add custom label ── */\n .add-label-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-4);\n padding: var(--cg-spacing-4) var(--cg-spacing-12);\n border-radius: var(--cg-border-radius-full);\n border: var(--cg-border-width-50) dashed var(--cg-color-surface-cards-border);\n background: none;\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xs);\n cursor: pointer;\n transition: border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .add-label-btn:hover {\n border-color: var(--cg-color-input-border-hover);\n color: var(--cg-color-input-text-placeholder);\n }\n\n /* ── Items list (inset) ── */\n .items {\n display: flex;\n flex-direction: column;\n margin: 0 var(--cg-spacing-12);\n background: var(--cg-overlay-dark-subtle);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-125);\n overflow: hidden;\n }\n .item-row {\n display: flex;\n align-items: center;\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-border);\n transition: background-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n cursor: default;\n }\n .item-row:last-child {\n border-bottom: none;\n }\n .item-row:hover {\n background: var(--cg-color-action-secondary-background-hover);\n }\n .item-row:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n .item-row.clickable {\n cursor: pointer;\n }\n .item-row.unlabeled {\n opacity: 0.5;\n }\n .item-content {\n flex: 1;\n font-size: var(--cg-font-size-sm);\n color: var(--cg-color-surface-base-text));\n line-height: var(--cg-line-height-normal);\n }\n .item-meta {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n margin-top: var(--cg-spacing-2);\n }\n\n /* ── Label pill on item ── */\n .item-label-pill {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-4);\n padding: var(--cg-spacing-2) var(--cg-spacing-8);\n border-radius: var(--cg-border-radius-full);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-semibold);\n white-space: nowrap;\n flex-shrink: 0;\n }\n .item-label-pill.unlabeled {\n background: var(--cg-overlay-dark-subtle);\n color: var(--cg-color-input-text-placeholder);\n border: var(--cg-border-width-50) dashed var(--cg-color-surface-cards-border);\n }\n .item-label-pill:hover { opacity: 0.8; }\n .item-label-dot {\n width: var(--cg-spacing-6);\n height: var(--cg-spacing-6);\n border-radius: var(--cg-border-radius-full);\n }\n\n /* ── Dropdown select (list mode) ── */\n .label-select {\n background: var(--cg-color-surface-cards-border);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-50);\n color: var(--cg-color-surface-base-text));\n font-size: var(--cg-font-size-xs);\n padding: var(--cg-spacing-4) var(--cg-spacing-8);\n cursor: pointer;\n flex-shrink: 0;\n }\n .label-select:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n\n /* ── Remove label button ── */\n .remove-btn {\n background: none;\n border: none;\n color: var(--cg-color-input-text-placeholder);\n cursor: pointer;\n padding: var(--cg-spacing-2);\n display: flex;\n align-items: center;\n border-radius: var(--cg-border-radius-full);\n transition: color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .remove-btn:hover {\n color: var(--cg-color-status-error-text-default);\n }\n .remove-btn:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-overlay-accent-strong);\n }\n .remove-btn svg {\n width: var(--cg-spacing-12);\n height: var(--cg-spacing-12);\n }\n\n /* ── Stats bar ── */\n .stats {\n padding: var(--cg-spacing-12) var(--cg-spacing-20);\n display: flex;\n flex-wrap: wrap;\n gap: var(--cg-spacing-12);\n }\n .stat {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-6);\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n }\n .stat-dot {\n width: var(--cg-spacing-6);\n height: var(--cg-spacing-6);\n border-radius: var(--cg-border-radius-full);\n }\n .stat-count {\n font-weight: var(--cg-font-weight-bold);\n color: var(--cg-color-surface-base-text));\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host { animation: none; }\n }\n `];\n\n @property({ type: Array }) items: LabelItem[] = [];\n @property({ type: Array }) labels: LabelDef[] = [];\n @property({ type: Boolean }) allowCustomLabels: boolean = false;\n @property({ type: String }) mode: 'click' | 'list' = 'list';\n\n @state() private _activeLabel: string = '';\n\n private _getLabel(id?: string): LabelDef | undefined {\n return this.labels.find(l => l.id === id);\n }\n\n private _assignLabel(itemId: string, labelId: string) {\n this.dispatchEvent(new CustomEvent('ai-label-assign', {\n bubbles: true, composed: true,\n detail: { itemId, labelId },\n }));\n }\n\n private _removeLabel(itemId: string, e: Event) {\n e.stopPropagation();\n this.dispatchEvent(new CustomEvent('ai-label-remove', {\n bubbles: true, composed: true,\n detail: { itemId },\n }));\n }\n\n private _cycleLabel(itemId: string) {\n const item = this.items.find(i => i.id === itemId);\n if (!item) return;\n const currentIdx = this.labels.findIndex(l => l.id === item.label);\n const nextIdx = (currentIdx + 1) % (this.labels.length + 1);\n if (nextIdx === this.labels.length) {\n // Cycle back to unlabeled\n this.dispatchEvent(new CustomEvent('ai-label-remove', { bubbles: true, composed: true, detail: { itemId } }));\n } else {\n this._assignLabel(itemId, this.labels[nextIdx]!.id);\n }\n }\n\n private _handleItemClick(item: LabelItem) {\n if (this.mode !== 'click' || !this._activeLabel) return;\n this._assignLabel(item.id, this._activeLabel);\n }\n\n private _handleSelectChange(itemId: string, e: Event) {\n const value = (e.target as HTMLSelectElement).value;\n if (value) {\n this._assignLabel(itemId, value);\n }\n }\n\n private _createLabel() {\n const name = 'New Label';\n const colors = ['#60a5fa', '#c084fc', '#fb923c', '#4ade80', '#f87171', '#fbbf24'];\n const color = colors[this.labels.length % colors.length] ?? '#60a5fa';\n this.dispatchEvent(new CustomEvent('ai-label-create', {\n bubbles: true, composed: true,\n detail: { name, color },\n }));\n }\n\n private _handleKeyDown(e: KeyboardEvent, item: LabelItem) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._handleItemClick(item);\n }\n }\n\n override render() {\n const labeledCount = this.items.filter(i => i.label).length;\n const totalCount = this.items.length;\n\n // Stats: count per label\n const stats = this.labels.map(l => ({\n ...l,\n count: this.items.filter(i => i.label === l.id).length,\n }));\n const unlabeledCount = this.items.filter(i => !i.label).length;\n\n return html`\n <div class=\"panel\">\n <div class=\"header\">\n <span class=\"header-title\">Labeling</span>\n <span class=\"header-count\">${labeledCount}/${totalCount} labeled</span>\n </div>\n\n ${this.mode === 'click' ? html`\n <div class=\"palette\">\n ${this.labels.map(l => html`\n <button class=\"palette-btn ${this._activeLabel === l.id ? 'active' : ''}\"\n style=\"--_label-color: ${l.color}\"\n @click=${() => { this._activeLabel = this._activeLabel === l.id ? '' : l.id; }}>\n <span class=\"palette-dot\" style=\"background: ${l.color}\"></span>\n ${l.name}\n </button>\n `)}\n ${this.allowCustomLabels ? html`\n <button class=\"add-label-btn\" @click=${this._createLabel}>+ Add</button>\n ` : nothing}\n </div>\n ` : nothing}\n\n <div class=\"items\">\n ${this.items.map(item => {\n const label = this._getLabel(item.label);\n const isUnlabeled = !item.label;\n return html`\n <div class=\"item-row ${this.mode === 'click' ? 'clickable' : ''} ${isUnlabeled ? 'unlabeled' : ''}\"\n tabindex=${this.mode === 'click' ? '0' : '-1'}\n role=${this.mode === 'click' ? 'button' : 'listitem'}\n @click=${() => this._handleItemClick(item)}\n @keydown=${(e: KeyboardEvent) => this._handleKeyDown(e, item)}>\n <div class=\"item-content\">\n ${item.content}\n ${item.metadata ? html`<div class=\"item-meta\">${item.metadata}</div>` : nothing}\n </div>\n\n ${label ? html`\n <span class=\"item-label-pill\" role=\"button\" tabindex=\"0\"\n style=\"background: color-mix(in srgb, ${label.color} 12%, transparent); color: ${label.color}; cursor: pointer;\"\n @click=${(e: Event) => { e.stopPropagation(); this._cycleLabel(item.id); }}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); e.stopPropagation(); this._cycleLabel(item.id); } }}>\n <span class=\"item-label-dot\" style=\"background: ${label.color}\"></span>\n ${label.name}\n </span>\n ` : html`\n <span class=\"item-label-pill unlabeled\" role=\"button\" tabindex=\"0\"\n @click=${(e: Event) => { e.stopPropagation(); this._cycleLabel(item.id); }}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); e.stopPropagation(); this._cycleLabel(item.id); } }}>\n Assign\n </span>\n `}\n </div>\n `;\n })}\n </div>\n\n <div class=\"stats\">\n ${stats.map(s => html`\n <div class=\"stat\">\n <span class=\"stat-dot\" style=\"background: ${s.color}\"></span>\n ${s.name}: <span class=\"stat-count\">${s.count}</span>\n </div>\n `)}\n ${unlabeledCount > 0 ? html`\n <div class=\"stat\">\n <span class=\"stat-dot\" style=\"background: var(--cg-color-input-text-placeholder)\"></span>\n Unlabeled: <span class=\"stat-count\">${unlabeledCount}</span>\n </div>\n ` : nothing}\n </div>\n </div>\n `;\n }\n}\n"],"names":["AiLabelingBoard","LitElement","id","l","itemId","labelId","e","item","i","nextIdx","value","name","colors","color","labeledCount","totalCount","stats","unlabeledCount","html","nothing","label","isUnlabeled","s","hostBlock","reducedMotion","fadeInKeyframes","css","__decorateClass","property","state","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-labeling-board.js","sources":["../../../src/components/ai-labeling-board/ai-labeling-board.ts"],"sourcesContent":["/**\n * @element ai-labeling-board\n * Data labeling board with label palette, assignable items, and per-label stats.\n * Supports list mode (dropdown per row) and click mode (select label then click items).\n *\n * @example\n * ```html\n * <ai-labeling-board\n * mode=\"list\"\n * allowCustomLabels\n * .items=${[{ id: '1', content: 'Sample text', label: 'positive' }]}\n * .labels=${[{ id: 'positive', name: 'Positive', color: '#4ade80' }, { id: 'negative', name: 'Negative', color: '#f87171' }]}\n * ></ai-labeling-board>\n * ```\n *\n * @fires {CustomEvent<{itemId: string, labelId: string}>} ai-label-assign - Label assigned to item\n * @fires {CustomEvent<{itemId: string}>} ai-label-remove - Label removed from item\n * @fires {CustomEvent<{name: string, color: string}>} ai-label-create - New custom label created\n */\nimport { LitElement, html, css, nothing } from 'lit';\nimport { property, customElement, state } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion, fadeInKeyframes } from '../../styles/index.js';\n\ninterface LabelItem {\n id: string;\n content: string;\n label?: string;\n metadata?: string;\n}\n\ninterface LabelDef {\n id: string;\n name: string;\n color: string;\n}\n\n@customElement('ai-labeling-board')\nexport class AiLabelingBoard extends LitElement {\n static override styles = [hostBlock, reducedMotion, fadeInKeyframes, css`\n :host {\n animation: fadeIn var(--cg-transition-duration-default) var(--cg-transition-easing-default);\n }\n\n .panel {\n background: var(--cg-color-surface-cards-background);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-component-card-radius);\n overflow: hidden;\n }\n\n .header {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-20) var(--cg-spacing-20) var(--cg-spacing-12);\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 }\n .header-count {\n margin-left: auto;\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n }\n\n /* ── Label palette (click mode) ── */\n .palette {\n display: flex;\n flex-wrap: wrap;\n gap: var(--cg-spacing-6);\n padding: var(--cg-spacing-12) var(--cg-spacing-20);\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n }\n .palette-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-6);\n padding: var(--cg-spacing-4) var(--cg-spacing-12);\n border-radius: var(--cg-border-radius-full);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n background: var(--cg-color-surface-base-background);\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-semibold);\n cursor: pointer;\n transition: border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .palette-btn:hover {\n border-color: var(--cg-color-input-border-hover);\n }\n .palette-btn.active {\n border-color: var(--_label-color, var(--cg-color-surface-base-text));\n color: var(--_label-color, var(--cg-color-surface-base-text));\n }\n .palette-btn:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-color-focus-ring);\n }\n .palette-dot {\n width: var(--cg-spacing-6);\n height: var(--cg-spacing-6);\n border-radius: var(--cg-border-radius-full);\n }\n\n /* ── Add custom label ── */\n .add-label-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-4);\n padding: var(--cg-spacing-4) var(--cg-spacing-12);\n border-radius: var(--cg-border-radius-full);\n border: var(--cg-border-width-50) dashed var(--cg-color-surface-cards-border);\n background: none;\n color: var(--cg-color-input-text-placeholder);\n font-size: var(--cg-font-size-xs);\n cursor: pointer;\n transition: border-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .add-label-btn:hover {\n border-color: var(--cg-color-input-border-hover);\n color: var(--cg-color-input-text-placeholder);\n }\n\n /* ── Items list (inset) ── */\n .items {\n display: flex;\n flex-direction: column;\n margin: 0 var(--cg-spacing-12);\n background: var(--cg-overlay-dark-subtle);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-125);\n overflow: hidden;\n }\n .item-row {\n display: flex;\n align-items: center;\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-border);\n transition: background-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n cursor: default;\n }\n .item-row:last-child {\n border-bottom: none;\n }\n .item-row:hover {\n background: var(--cg-color-action-secondary-background-hover);\n }\n .item-row:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-color-focus-ring);\n }\n .item-row.clickable {\n cursor: pointer;\n }\n .item-row.unlabeled {\n opacity: 0.5;\n }\n .item-content {\n flex: 1;\n font-size: var(--cg-font-size-sm);\n color: var(--cg-color-surface-base-text);\n line-height: var(--cg-line-height-normal);\n }\n .item-meta {\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n margin-top: var(--cg-spacing-2);\n }\n\n /* ── Label pill on item ── */\n .item-label-pill {\n display: inline-flex;\n align-items: center;\n gap: var(--cg-spacing-4);\n padding: var(--cg-spacing-2) var(--cg-spacing-8);\n border-radius: var(--cg-border-radius-full);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-semibold);\n white-space: nowrap;\n flex-shrink: 0;\n }\n .item-label-pill.unlabeled {\n background: var(--cg-overlay-dark-subtle);\n color: var(--cg-color-input-text-placeholder);\n border: var(--cg-border-width-50) dashed var(--cg-color-surface-cards-border);\n }\n .item-label-pill:hover { opacity: 0.8; }\n .item-label-dot {\n width: var(--cg-spacing-6);\n height: var(--cg-spacing-6);\n border-radius: var(--cg-border-radius-full);\n }\n\n /* ── Dropdown select (list mode) ── */\n .label-select {\n background: var(--cg-color-surface-cards-border);\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-50);\n color: var(--cg-color-surface-base-text);\n font-size: var(--cg-font-size-xs);\n padding: var(--cg-spacing-4) var(--cg-spacing-8);\n cursor: pointer;\n flex-shrink: 0;\n }\n .label-select:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-color-focus-ring);\n }\n\n /* ── Remove label button ── */\n .remove-btn {\n background: none;\n border: none;\n color: var(--cg-color-input-text-placeholder);\n cursor: pointer;\n padding: var(--cg-spacing-2);\n display: flex;\n align-items: center;\n border-radius: var(--cg-border-radius-full);\n transition: color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .remove-btn:hover {\n color: var(--cg-color-status-error-text-default);\n }\n .remove-btn:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--cg-color-focus-ring);\n }\n .remove-btn svg {\n width: var(--cg-spacing-12);\n height: var(--cg-spacing-12);\n }\n\n /* ── Stats bar ── */\n .stats {\n padding: var(--cg-spacing-12) var(--cg-spacing-20);\n display: flex;\n flex-wrap: wrap;\n gap: var(--cg-spacing-12);\n }\n .stat {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-6);\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-input-text-placeholder);\n }\n .stat-dot {\n width: var(--cg-spacing-6);\n height: var(--cg-spacing-6);\n border-radius: var(--cg-border-radius-full);\n }\n .stat-count {\n font-weight: var(--cg-font-weight-bold);\n color: var(--cg-color-surface-base-text);\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host { animation: none; }\n }\n `];\n\n @property({ type: Array }) items: LabelItem[] = [];\n @property({ type: Array }) labels: LabelDef[] = [];\n @property({ type: Boolean }) allowCustomLabels: boolean = false;\n @property({ type: String }) mode: 'click' | 'list' = 'list';\n\n @state() private _activeLabel: string = '';\n\n private _getLabel(id?: string): LabelDef | undefined {\n return this.labels.find(l => l.id === id);\n }\n\n private _assignLabel(itemId: string, labelId: string) {\n this.dispatchEvent(new CustomEvent('ai-label-assign', {\n bubbles: true, composed: true,\n detail: { itemId, labelId },\n }));\n }\n\n private _removeLabel(itemId: string, e: Event) {\n e.stopPropagation();\n this.dispatchEvent(new CustomEvent('ai-label-remove', {\n bubbles: true, composed: true,\n detail: { itemId },\n }));\n }\n\n private _cycleLabel(itemId: string) {\n const item = this.items.find(i => i.id === itemId);\n if (!item) return;\n const currentIdx = this.labels.findIndex(l => l.id === item.label);\n const nextIdx = (currentIdx + 1) % (this.labels.length + 1);\n if (nextIdx === this.labels.length) {\n // Cycle back to unlabeled\n this.dispatchEvent(new CustomEvent('ai-label-remove', { bubbles: true, composed: true, detail: { itemId } }));\n } else {\n this._assignLabel(itemId, this.labels[nextIdx]!.id);\n }\n }\n\n private _handleItemClick(item: LabelItem) {\n if (this.mode !== 'click' || !this._activeLabel) return;\n this._assignLabel(item.id, this._activeLabel);\n }\n\n private _handleSelectChange(itemId: string, e: Event) {\n const value = (e.target as HTMLSelectElement).value;\n if (value) {\n this._assignLabel(itemId, value);\n }\n }\n\n private _createLabel() {\n const name = 'New Label';\n const colors = ['#60a5fa', '#c084fc', '#fb923c', '#4ade80', '#f87171', '#fbbf24'];\n const color = colors[this.labels.length % colors.length] ?? '#60a5fa';\n this.dispatchEvent(new CustomEvent('ai-label-create', {\n bubbles: true, composed: true,\n detail: { name, color },\n }));\n }\n\n private _handleKeyDown(e: KeyboardEvent, item: LabelItem) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._handleItemClick(item);\n }\n }\n\n override render() {\n const labeledCount = this.items.filter(i => i.label).length;\n const totalCount = this.items.length;\n\n // Stats: count per label\n const stats = this.labels.map(l => ({\n ...l,\n count: this.items.filter(i => i.label === l.id).length,\n }));\n const unlabeledCount = this.items.filter(i => !i.label).length;\n\n return html`\n <div class=\"panel\">\n <div class=\"header\">\n <span class=\"header-title\">Labeling</span>\n <span class=\"header-count\">${labeledCount}/${totalCount} labeled</span>\n </div>\n\n ${this.mode === 'click' ? html`\n <div class=\"palette\">\n ${this.labels.map(l => html`\n <button class=\"palette-btn ${this._activeLabel === l.id ? 'active' : ''}\"\n style=\"--_label-color: ${l.color}\"\n @click=${() => { this._activeLabel = this._activeLabel === l.id ? '' : l.id; }}>\n <span class=\"palette-dot\" style=\"background: ${l.color}\"></span>\n ${l.name}\n </button>\n `)}\n ${this.allowCustomLabels ? html`\n <button class=\"add-label-btn\" @click=${this._createLabel}>+ Add</button>\n ` : nothing}\n </div>\n ` : nothing}\n\n <div class=\"items\">\n ${this.items.map(item => {\n const label = this._getLabel(item.label);\n const isUnlabeled = !item.label;\n return html`\n <div class=\"item-row ${this.mode === 'click' ? 'clickable' : ''} ${isUnlabeled ? 'unlabeled' : ''}\"\n tabindex=${this.mode === 'click' ? '0' : '-1'}\n role=${this.mode === 'click' ? 'button' : 'listitem'}\n @click=${() => this._handleItemClick(item)}\n @keydown=${(e: KeyboardEvent) => this._handleKeyDown(e, item)}>\n <div class=\"item-content\">\n ${item.content}\n ${item.metadata ? html`<div class=\"item-meta\">${item.metadata}</div>` : nothing}\n </div>\n\n ${label ? html`\n <span class=\"item-label-pill\" role=\"button\" tabindex=\"0\"\n style=\"background: color-mix(in srgb, ${label.color} 12%, transparent); color: ${label.color}; cursor: pointer;\"\n @click=${(e: Event) => { e.stopPropagation(); this._cycleLabel(item.id); }}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); e.stopPropagation(); this._cycleLabel(item.id); } }}>\n <span class=\"item-label-dot\" style=\"background: ${label.color}\"></span>\n ${label.name}\n </span>\n ` : html`\n <span class=\"item-label-pill unlabeled\" role=\"button\" tabindex=\"0\"\n @click=${(e: Event) => { e.stopPropagation(); this._cycleLabel(item.id); }}\n @keydown=${(e: KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); e.stopPropagation(); this._cycleLabel(item.id); } }}>\n Assign\n </span>\n `}\n </div>\n `;\n })}\n </div>\n\n <div class=\"stats\">\n ${stats.map(s => html`\n <div class=\"stat\">\n <span class=\"stat-dot\" style=\"background: ${s.color}\"></span>\n ${s.name}: <span class=\"stat-count\">${s.count}</span>\n </div>\n `)}\n ${unlabeledCount > 0 ? html`\n <div class=\"stat\">\n <span class=\"stat-dot\" style=\"background: var(--cg-color-input-text-placeholder)\"></span>\n Unlabeled: <span class=\"stat-count\">${unlabeledCount}</span>\n </div>\n ` : nothing}\n </div>\n </div>\n `;\n }\n}\n"],"names":["AiLabelingBoard","LitElement","id","l","itemId","labelId","e","item","i","nextIdx","value","name","colors","color","labeledCount","totalCount","stats","unlabeledCount","html","nothing","label","isUnlabeled","s","hostBlock","reducedMotion","fadeInKeyframes","css","__decorateClass","property","state","customElement"],"mappings":"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"}
|