@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
|
|
1
|
+
import { css as w, LitElement as y, html as v } from "lit";
|
|
2
2
|
import { property as k, customElement as x } from "lit/decorators.js";
|
|
3
|
-
import { h as
|
|
4
|
-
var S = Object.defineProperty,
|
|
5
|
-
for (var
|
|
6
|
-
(l =
|
|
7
|
-
return
|
|
3
|
+
import { h as $, r as C } from "../../chunks/premium.css-DHekUEUt.js";
|
|
4
|
+
var S = Object.defineProperty, _ = Object.getOwnPropertyDescriptor, b = (e, r, o, t) => {
|
|
5
|
+
for (var a = t > 1 ? void 0 : t ? _(r, o) : r, h = e.length - 1, l; h >= 0; h--)
|
|
6
|
+
(l = e[h]) && (a = (t ? l(r, o, a) : l(a)) || a);
|
|
7
|
+
return t && a && S(r, o, a), a;
|
|
8
8
|
};
|
|
9
|
-
const
|
|
9
|
+
const T = /* @__PURE__ */ new Set([
|
|
10
10
|
"h1",
|
|
11
11
|
"h2",
|
|
12
12
|
"h3",
|
|
@@ -65,45 +65,45 @@ const _ = /* @__PURE__ */ new Set([
|
|
|
65
65
|
li: /* @__PURE__ */ new Set(["class"]),
|
|
66
66
|
span: /* @__PURE__ */ new Set(["class", "aria-hidden"]),
|
|
67
67
|
button: /* @__PURE__ */ new Set(["class", "type", "aria-label"])
|
|
68
|
-
},
|
|
69
|
-
function E(
|
|
70
|
-
return
|
|
68
|
+
}, f = /^(https?:|mailto:|#|\/)/i, z = /* @__PURE__ */ new Set(["note", "tip", "important", "warning", "caution"]);
|
|
69
|
+
function E(e) {
|
|
70
|
+
return e.replace(/[`*_~]/g, "").toLowerCase().trim().replace(/[^\w\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
71
71
|
}
|
|
72
|
-
function m(
|
|
73
|
-
return
|
|
72
|
+
function m(e) {
|
|
73
|
+
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
74
74
|
}
|
|
75
|
-
function A(
|
|
76
|
-
return
|
|
75
|
+
function A(e) {
|
|
76
|
+
return e.startsWith("```") || /^#{1,6} /.test(e) || /^-{3,}$/.test(e.trim()) || e.startsWith("> ") || e === ">" || /^[-*] /.test(e) || /^\d+\. /.test(e) || /^\|.+\|\s*$/.test(e);
|
|
77
77
|
}
|
|
78
|
-
function O(
|
|
79
|
-
const
|
|
80
|
-
function
|
|
81
|
-
for (const
|
|
82
|
-
if (
|
|
83
|
-
l.appendChild(document.createTextNode(
|
|
78
|
+
function O(e) {
|
|
79
|
+
const r = new DOMParser().parseFromString(e, "text/html"), o = document.createDocumentFragment();
|
|
80
|
+
function t(h, l) {
|
|
81
|
+
for (const n of Array.from(h.childNodes)) {
|
|
82
|
+
if (n.nodeType === Node.TEXT_NODE) {
|
|
83
|
+
l.appendChild(document.createTextNode(n.textContent ?? ""));
|
|
84
84
|
continue;
|
|
85
85
|
}
|
|
86
|
-
if (
|
|
87
|
-
const
|
|
88
|
-
if (!
|
|
89
|
-
|
|
86
|
+
if (n.nodeType !== Node.ELEMENT_NODE) continue;
|
|
87
|
+
const i = n, c = i.tagName.toLowerCase();
|
|
88
|
+
if (!T.has(c)) {
|
|
89
|
+
t(i, l);
|
|
90
90
|
continue;
|
|
91
91
|
}
|
|
92
|
-
const
|
|
93
|
-
if (
|
|
94
|
-
for (const
|
|
95
|
-
if (!
|
|
96
|
-
const
|
|
97
|
-
(
|
|
92
|
+
const d = document.createElement(c), g = L[c];
|
|
93
|
+
if (g)
|
|
94
|
+
for (const s of Array.from(i.attributes)) {
|
|
95
|
+
if (!g.has(s.name.toLowerCase())) continue;
|
|
96
|
+
const u = s.value.trim().toLowerCase();
|
|
97
|
+
(s.name === "href" || s.name === "src") && !f.test(u) || d.setAttribute(s.name, s.value);
|
|
98
98
|
}
|
|
99
|
-
l.appendChild(
|
|
99
|
+
l.appendChild(d), t(i, d);
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
-
|
|
103
|
-
const
|
|
104
|
-
return
|
|
102
|
+
t(r.body, o);
|
|
103
|
+
const a = document.createElement("div");
|
|
104
|
+
return a.appendChild(o), a.innerHTML;
|
|
105
105
|
}
|
|
106
|
-
let
|
|
106
|
+
let p = class extends y {
|
|
107
107
|
constructor() {
|
|
108
108
|
super(...arguments), this.text = "";
|
|
109
109
|
}
|
|
@@ -116,125 +116,155 @@ let u = class extends w {
|
|
|
116
116
|
* rules (---), unordered lists (-), ordered lists (1.), and paragraphs.
|
|
117
117
|
* Inline: bold (**), italic (*), inline code (`), links ([text](url)).
|
|
118
118
|
*/
|
|
119
|
-
_render(
|
|
120
|
-
const
|
|
119
|
+
_render(e) {
|
|
120
|
+
const r = e.replace(/\r\n/g, `
|
|
121
121
|
`).split(`
|
|
122
|
-
`),
|
|
123
|
-
let
|
|
124
|
-
for (;
|
|
125
|
-
const
|
|
126
|
-
if (
|
|
127
|
-
const
|
|
128
|
-
for (
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const
|
|
132
|
-
`)),
|
|
133
|
-
|
|
134
|
-
`<div class="code-block"><div class="code-header">${
|
|
122
|
+
`), o = [];
|
|
123
|
+
let t = 0;
|
|
124
|
+
for (; t < r.length; ) {
|
|
125
|
+
const a = r[t];
|
|
126
|
+
if (a.startsWith("```")) {
|
|
127
|
+
const n = a.slice(3).trim(), i = [];
|
|
128
|
+
for (t++; t < r.length && !r[t].startsWith("```"); )
|
|
129
|
+
i.push(r[t]), t++;
|
|
130
|
+
t < r.length && t++;
|
|
131
|
+
const c = m(i.join(`
|
|
132
|
+
`)), d = /^\w+$/.test(n) ? n : "", g = d ? ` class="language-${d}"` : "", s = `<span class="code-lang">${d}</span>`;
|
|
133
|
+
o.push(
|
|
134
|
+
`<div class="code-block"><div class="code-header">${s}<button class="code-copy" type="button" aria-label="Copy code">Copy</button></div><pre><code${g}>${c}</code></pre></div>`
|
|
135
135
|
);
|
|
136
136
|
continue;
|
|
137
137
|
}
|
|
138
|
-
const
|
|
139
|
-
if (
|
|
140
|
-
const
|
|
141
|
-
|
|
138
|
+
const h = /^(#{1,6}) (.+)$/.exec(a);
|
|
139
|
+
if (h) {
|
|
140
|
+
const n = h[1].length, i = h[2], c = E(i), d = this._inline(i), g = c ? ` <a class="anchor" href="#${c}" aria-label="Permalink to this heading">#</a>` : "", s = c ? ` id="${c}"` : "";
|
|
141
|
+
o.push(`<h${n}${s}>${d}${g}</h${n}>`), t++;
|
|
142
142
|
continue;
|
|
143
143
|
}
|
|
144
|
-
if (/^-{3,}$/.test(
|
|
145
|
-
|
|
144
|
+
if (/^-{3,}$/.test(a.trim())) {
|
|
145
|
+
o.push("<hr/>"), t++;
|
|
146
146
|
continue;
|
|
147
147
|
}
|
|
148
|
-
if (
|
|
149
|
-
const
|
|
150
|
-
for (;
|
|
151
|
-
|
|
152
|
-
const
|
|
153
|
-
if (
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
148
|
+
if (a.startsWith("> ") || a === ">") {
|
|
149
|
+
const n = [];
|
|
150
|
+
for (; t < r.length && (r[t].startsWith("> ") || r[t] === ">"); )
|
|
151
|
+
n.push(r[t].replace(/^> ?/, "")), t++;
|
|
152
|
+
const i = /^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*$/i.exec(n[0] ?? "");
|
|
153
|
+
if (i && z.has(i[1].toLowerCase())) {
|
|
154
|
+
const c = i[1].toLowerCase(), d = c.charAt(0).toUpperCase() + c.slice(1), g = this._render(n.slice(1).join(`
|
|
155
|
+
`));
|
|
156
|
+
o.push(
|
|
157
|
+
`<blockquote class="alert alert-${c}"><div class="alert-header"><span class="alert-label">${d}</span></div><div class="alert-body">${g}</div></blockquote>`
|
|
157
158
|
);
|
|
158
159
|
} else
|
|
159
|
-
|
|
160
|
+
o.push(`<blockquote>${this._inline(n.join(" "))}</blockquote>`);
|
|
160
161
|
continue;
|
|
161
162
|
}
|
|
162
|
-
if (/^[-*] /.test(
|
|
163
|
-
const
|
|
164
|
-
let
|
|
165
|
-
for (;
|
|
166
|
-
const
|
|
167
|
-
if (
|
|
168
|
-
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
`<li class="task"><span class="${
|
|
163
|
+
if (/^[-*] /.test(a)) {
|
|
164
|
+
const n = [];
|
|
165
|
+
let i = !1;
|
|
166
|
+
for (; t < r.length && /^[-*] /.test(r[t]); ) {
|
|
167
|
+
const d = r[t].slice(2), g = /^\[([ xX])\]\s+(.*)$/.exec(d);
|
|
168
|
+
if (g) {
|
|
169
|
+
i = !0;
|
|
170
|
+
const s = g[1].toLowerCase() === "x", u = s ? "task-check task-check-on" : "task-check";
|
|
171
|
+
n.push(
|
|
172
|
+
`<li class="task"><span class="${u}" aria-hidden="true"></span><span class="sr-only">${s ? "Done: " : "To do: "}</span>` + this._inline(g[2]) + "</li>"
|
|
172
173
|
);
|
|
173
174
|
} else
|
|
174
|
-
|
|
175
|
-
|
|
175
|
+
n.push(`<li>${this._inline(d)}</li>`);
|
|
176
|
+
t++;
|
|
176
177
|
}
|
|
177
|
-
const
|
|
178
|
-
|
|
178
|
+
const c = i ? ' class="task-list"' : "";
|
|
179
|
+
o.push(`<ul${c}>${n.join("")}</ul>`);
|
|
179
180
|
continue;
|
|
180
181
|
}
|
|
181
|
-
if (/^\d+\. /.test(
|
|
182
|
+
if (/^\d+\. /.test(a)) {
|
|
183
|
+
const n = [];
|
|
184
|
+
for (; t < r.length && /^\d+\. /.test(r[t]); )
|
|
185
|
+
n.push(`<li>${this._inline(r[t].replace(/^\d+\. /, ""))}</li>`), t++;
|
|
186
|
+
o.push(`<ol>${n.join("")}</ol>`);
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (/^\|.+\|\s*$/.test(a) && t + 1 < r.length && /^\|(\s*:?-+:?\s*\|)+\s*$/.test(r[t + 1])) {
|
|
190
|
+
const n = (s) => s.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map((u) => this._inline(u.trim())), i = n(a);
|
|
191
|
+
t += 2;
|
|
182
192
|
const c = [];
|
|
183
|
-
for (;
|
|
184
|
-
c.push(
|
|
185
|
-
|
|
193
|
+
for (; t < r.length && /^\|.+\|\s*$/.test(r[t]); )
|
|
194
|
+
c.push(n(r[t])), t++;
|
|
195
|
+
const d = `<thead><tr>${i.map((s) => `<th>${s}</th>`).join("")}</tr></thead>`, g = c.length ? `<tbody>${c.map((s) => `<tr>${s.map((u) => `<td>${u}</td>`).join("")}</tr>`).join("")}</tbody>` : "";
|
|
196
|
+
o.push(`<table>${d}${g}</table>`);
|
|
186
197
|
continue;
|
|
187
198
|
}
|
|
188
|
-
if (
|
|
189
|
-
|
|
199
|
+
if (a.trim() === "") {
|
|
200
|
+
t++;
|
|
190
201
|
continue;
|
|
191
202
|
}
|
|
192
|
-
const l = [];
|
|
193
|
-
for (
|
|
194
|
-
l.push(t
|
|
195
|
-
|
|
203
|
+
const l = [a];
|
|
204
|
+
for (t++; t < r.length && r[t].trim() !== "" && !A(r[t]); )
|
|
205
|
+
l.push(r[t]), t++;
|
|
206
|
+
o.push(`<p>${this._inline(l.join(" "))}</p>`);
|
|
196
207
|
}
|
|
197
|
-
return
|
|
208
|
+
return o.join("");
|
|
198
209
|
}
|
|
199
210
|
/**
|
|
200
211
|
* Applies inline formatting. Escapes HTML first, then processes
|
|
201
212
|
* inline code (via placeholder to avoid interference), bold, italic,
|
|
202
213
|
* and links with URL safety checks.
|
|
203
214
|
*/
|
|
204
|
-
_inline(
|
|
205
|
-
const
|
|
206
|
-
let
|
|
207
|
-
return
|
|
215
|
+
_inline(e) {
|
|
216
|
+
const r = [];
|
|
217
|
+
let o = e.replace(/`([^`]+)`/g, (t, a) => (r.push(m(a)), `\0CODE${r.length - 1}\0`));
|
|
218
|
+
return o = m(o), o = o.replace(/\*\*([^*\n]+)\*\*/g, "<strong>$1</strong>").replace(/\*([^*\n]+)\*/g, "<em>$1</em>"), o = o.replace(
|
|
219
|
+
/!\[([^\]]*)\]\(((?:[^()\s]|\([^)]*\))+)\)/g,
|
|
220
|
+
(t, a, h) => {
|
|
221
|
+
const l = h.trim();
|
|
222
|
+
return f.test(l) ? `<img src="${l}" alt="${a}">` : a;
|
|
223
|
+
}
|
|
224
|
+
), o = o.replace(
|
|
208
225
|
/\[([^\]]+)\]\(((?:[^()\s]|\([^)]*\))+)\)/g,
|
|
209
|
-
(
|
|
210
|
-
const l =
|
|
211
|
-
return `<a href="${
|
|
226
|
+
(t, a, h) => {
|
|
227
|
+
const l = h.trim();
|
|
228
|
+
return `<a href="${f.test(l) ? l : "about:blank"}" target="_blank" rel="noopener">${a}</a>`;
|
|
212
229
|
}
|
|
213
|
-
),
|
|
230
|
+
), o = o.replace(/\x00CODE(\d+)\x00/g, (t, a) => `<code>${r[Number(a)]}</code>`), o;
|
|
214
231
|
}
|
|
215
|
-
updated(
|
|
216
|
-
|
|
217
|
-
this.shadowRoot?.querySelectorAll(".code-copy")?.forEach((
|
|
232
|
+
updated(e) {
|
|
233
|
+
e.has("text") && requestAnimationFrame(() => {
|
|
234
|
+
this.shadowRoot?.querySelectorAll(".code-copy")?.forEach((o) => this._bindCopyButton(o)), this.shadowRoot?.querySelectorAll(".anchor").forEach((o) => this._bindAnchor(o));
|
|
218
235
|
});
|
|
219
236
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
const e =
|
|
237
|
+
firstUpdated() {
|
|
238
|
+
requestAnimationFrame(() => {
|
|
239
|
+
const e = location.hash.slice(1);
|
|
240
|
+
e && this.shadowRoot?.getElementById(e)?.scrollIntoView({ block: "start" });
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
_bindAnchor(e) {
|
|
244
|
+
e.dataset.cgBound || (e.dataset.cgBound = "1", e.addEventListener("click", (r) => {
|
|
245
|
+
r.preventDefault();
|
|
246
|
+
const o = e.getAttribute("href")?.slice(1);
|
|
247
|
+
o && (history.replaceState(null, "", `#${o}`), this.shadowRoot?.getElementById(o)?.scrollIntoView({ block: "start" }));
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
250
|
+
_bindCopyButton(e) {
|
|
251
|
+
e.dataset.cgBound || (e.dataset.cgBound = "1", e.setAttribute("aria-live", "polite"), e.addEventListener("click", async () => {
|
|
252
|
+
const t = e.closest(".code-block")?.querySelector("pre")?.textContent ?? "";
|
|
223
253
|
try {
|
|
224
|
-
await navigator.clipboard?.writeText(
|
|
225
|
-
const
|
|
226
|
-
|
|
227
|
-
|
|
254
|
+
await navigator.clipboard?.writeText(t);
|
|
255
|
+
const a = e.textContent;
|
|
256
|
+
e.textContent = "Copied", setTimeout(() => {
|
|
257
|
+
e.textContent === "Copied" && (e.textContent = a);
|
|
228
258
|
}, 1200);
|
|
229
259
|
} catch {
|
|
230
260
|
}
|
|
231
261
|
}));
|
|
232
262
|
}
|
|
233
263
|
render() {
|
|
234
|
-
return
|
|
264
|
+
return typeof DOMParser > "u" ? v`<div class="md"></div>` : v`<div class="md" .innerHTML=${O(this._render(this.text))}></div>`;
|
|
235
265
|
}
|
|
236
266
|
};
|
|
237
|
-
|
|
267
|
+
p.styles = [$, C, w`
|
|
238
268
|
:host {
|
|
239
269
|
color: var(--cg-color-surface-base-text);
|
|
240
270
|
/* Prose body — 16px is the document-typography norm (Tailwind Typography,
|
|
@@ -251,7 +281,7 @@ u.styles = [C, $, b`
|
|
|
251
281
|
color: var(--cg-color-surface-base-text);
|
|
252
282
|
margin: var(--cg-spacing-32) 0 var(--cg-spacing-12);
|
|
253
283
|
line-height: var(--cg-line-height-tight);
|
|
254
|
-
letter-spacing: -
|
|
284
|
+
letter-spacing: var(--cg-letter-spacing-tight);
|
|
255
285
|
text-wrap: balance;
|
|
256
286
|
}
|
|
257
287
|
.md h2 {
|
|
@@ -260,7 +290,7 @@ u.styles = [C, $, b`
|
|
|
260
290
|
color: var(--cg-color-surface-base-text);
|
|
261
291
|
margin: var(--cg-spacing-24) 0 var(--cg-spacing-8);
|
|
262
292
|
line-height: var(--cg-line-height-tight);
|
|
263
|
-
letter-spacing: -
|
|
293
|
+
letter-spacing: var(--cg-letter-spacing-tight);
|
|
264
294
|
text-wrap: balance;
|
|
265
295
|
}
|
|
266
296
|
.md h3 {
|
|
@@ -318,7 +348,7 @@ u.styles = [C, $, b`
|
|
|
318
348
|
font-size: var(--cg-font-size-xs);
|
|
319
349
|
color: var(--cg-color-surface-container-outlined);
|
|
320
350
|
text-transform: lowercase;
|
|
321
|
-
letter-spacing:
|
|
351
|
+
letter-spacing: var(--cg-letter-spacing-wide);
|
|
322
352
|
}
|
|
323
353
|
.md .code-copy {
|
|
324
354
|
background: transparent;
|
|
@@ -384,7 +414,7 @@ u.styles = [C, $, b`
|
|
|
384
414
|
.md .alert-label {
|
|
385
415
|
font-weight: var(--cg-font-weight-semibold);
|
|
386
416
|
font-size: var(--cg-font-size-sm);
|
|
387
|
-
letter-spacing:
|
|
417
|
+
letter-spacing: var(--cg-letter-spacing-normal);
|
|
388
418
|
}
|
|
389
419
|
.md .alert-body { font-style: normal; }
|
|
390
420
|
.md .alert-body :is(p, ul, ol):first-child { margin-top: 0; }
|
|
@@ -451,6 +481,19 @@ u.styles = [C, $, b`
|
|
|
451
481
|
line-height: 1;
|
|
452
482
|
}
|
|
453
483
|
|
|
484
|
+
/* Rule 10 — visually hidden, screen-reader-only state text. */
|
|
485
|
+
.sr-only {
|
|
486
|
+
position: absolute;
|
|
487
|
+
width: 1px;
|
|
488
|
+
height: 1px;
|
|
489
|
+
padding: 0;
|
|
490
|
+
margin: -1px;
|
|
491
|
+
overflow: hidden;
|
|
492
|
+
clip: rect(0, 0, 0, 0);
|
|
493
|
+
white-space: nowrap;
|
|
494
|
+
border: 0;
|
|
495
|
+
}
|
|
496
|
+
|
|
454
497
|
/* ── Heading anchors — visible on heading hover, "#" link to the slugged id. */
|
|
455
498
|
.md :is(h1, h2, h3, h4, h5, h6) .anchor {
|
|
456
499
|
display: inline-block;
|
|
@@ -468,7 +511,7 @@ u.styles = [C, $, b`
|
|
|
468
511
|
.md a {
|
|
469
512
|
color: var(--cg-color-accent-text);
|
|
470
513
|
text-decoration: underline;
|
|
471
|
-
text-decoration-thickness:
|
|
514
|
+
text-decoration-thickness: var(--cg-border-width-50);
|
|
472
515
|
text-underline-offset: var(--cg-spacing-4);
|
|
473
516
|
text-decoration-color: color-mix(in oklch, currentColor 40%, transparent);
|
|
474
517
|
transition: text-decoration-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);
|
|
@@ -510,6 +553,13 @@ u.styles = [C, $, b`
|
|
|
510
553
|
color: var(--cg-color-surface-base-text);
|
|
511
554
|
}
|
|
512
555
|
|
|
556
|
+
/* ── Images ── contained to the prose column. */
|
|
557
|
+
.md img {
|
|
558
|
+
max-width: 100%;
|
|
559
|
+
height: auto;
|
|
560
|
+
border-radius: var(--cg-border-radius-100);
|
|
561
|
+
}
|
|
562
|
+
|
|
513
563
|
/* ── Table ── */
|
|
514
564
|
.md table {
|
|
515
565
|
width: 100%;
|
|
@@ -530,13 +580,13 @@ u.styles = [C, $, b`
|
|
|
530
580
|
border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-container-border);
|
|
531
581
|
}
|
|
532
582
|
`];
|
|
533
|
-
|
|
583
|
+
b([
|
|
534
584
|
k()
|
|
535
|
-
],
|
|
536
|
-
|
|
585
|
+
], p.prototype, "text", 2);
|
|
586
|
+
p = b([
|
|
537
587
|
x("cg-markdown")
|
|
538
|
-
],
|
|
588
|
+
], p);
|
|
539
589
|
export {
|
|
540
|
-
|
|
590
|
+
p as CgMarkdown
|
|
541
591
|
};
|
|
542
592
|
//# sourceMappingURL=cg-markdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cg-markdown.js","sources":["../../../src/components/cg-markdown/cg-markdown.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion } from '../../styles/index.js';\n\n/** Allowed HTML tags after markdown parsing */\nconst ALLOWED_TAGS = new Set([\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'br', 'hr',\n 'strong', 'b', 'em', 'i', 'u', 's', 'del', 'ins',\n 'code', 'pre', 'blockquote',\n 'ul', 'ol', 'li',\n 'a', 'img',\n 'table', 'thead', 'tbody', 'tr', 'th', 'td',\n 'div', 'span', 'sub', 'sup', 'mark', 'abbr',\n 'button',\n]);\n\n/** Allowed attributes per tag — anything not listed is stripped */\nconst ALLOWED_ATTRS: Record<string, Set<string>> = {\n // Heading anchors get an id derived from slugified heading text.\n h1: new Set(['id']), h2: new Set(['id']), h3: new Set(['id']),\n h4: new Set(['id']), h5: new Set(['id']), h6: new Set(['id']),\n a: new Set(['href', 'target', 'rel', 'class', 'aria-label']),\n img: new Set(['src', 'alt', 'width', 'height']),\n td: new Set(['colspan', 'rowspan']),\n th: new Set(['colspan', 'rowspan']),\n code: new Set(['class']),\n // Class-based variants (alert types, task lists, code-block chrome).\n blockquote: new Set(['class']),\n div: new Set(['class']),\n ul: new Set(['class']),\n li: new Set(['class']),\n span: new Set(['class', 'aria-hidden']),\n button: new Set(['class', 'type', 'aria-label']),\n};\n\n/** Safe URL protocols for href/src attributes */\nconst SAFE_PROTOCOLS = /^(https?:|mailto:|#|\\/)/i;\n\n/** GitHub-style alert variants — case-insensitive markers as the first line of a blockquote. */\nconst ALERT_TYPES = new Set(['note', 'tip', 'important', 'warning', 'caution']);\n\n/** Slugify heading text into a URL-safe id. Only emits [a-z0-9-]; safe to interpolate. */\nfunction slugify(text: string): string {\n return text\n .replace(/[`*_~]/g, '')\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/** Escape HTML-special characters in text content. */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\n/** Returns true if the line starts a block-level markdown element. */\nfunction isBlockStart(line: string): boolean {\n return (\n line.startsWith('```') ||\n /^#{1,6} /.test(line) ||\n /^-{3,}$/.test(line.trim()) ||\n line.startsWith('> ') ||\n line === '>' ||\n /^[-*] /.test(line) ||\n /^\\d+\\. /.test(line)\n );\n}\n\n/**\n * DOM-based HTML sanitizer. Parses with the browser's HTML parser,\n * walks the tree, and strips anything not explicitly allowed.\n * Immune to encoding tricks, nested contexts, and regex bypasses.\n */\nfunction sanitizeHtml(raw: string): string {\n const doc = new DOMParser().parseFromString(raw, 'text/html');\n const fragment = document.createDocumentFragment();\n\n function walk(source: Node, target: Node) {\n for (const child of Array.from(source.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n target.appendChild(document.createTextNode(child.textContent ?? ''));\n continue;\n }\n if (child.nodeType !== Node.ELEMENT_NODE) continue;\n const el = child as Element;\n const tag = el.tagName.toLowerCase();\n if (!ALLOWED_TAGS.has(tag)) {\n // Skip the element but keep its text children\n walk(el, target);\n continue;\n }\n const clean = document.createElement(tag);\n const allowed = ALLOWED_ATTRS[tag];\n if (allowed) {\n for (const attr of Array.from(el.attributes)) {\n if (!allowed.has(attr.name.toLowerCase())) continue;\n const val = attr.value.trim().toLowerCase();\n if ((attr.name === 'href' || attr.name === 'src') && !SAFE_PROTOCOLS.test(val)) continue;\n clean.setAttribute(attr.name, attr.value);\n }\n }\n target.appendChild(clean);\n walk(el, clean);\n }\n }\n\n walk(doc.body, fragment);\n const container = document.createElement('div');\n container.appendChild(fragment);\n return container.innerHTML;\n}\n\n/**\n * <cg-markdown> — Lightweight markdown renderer for LLM output.\n *\n * @example\n * ```html\n * <cg-markdown text=\"## Hello\\n\\nThis is **bold**.\"></cg-markdown>\n * ```\n *\n * @cssprop --cg-color-surface-base-text - Body text color\n * @cssprop --cg-font-size-sm - Body font size (14px)\n */\n@customElement('cg-markdown')\nexport class CgMarkdown extends LitElement {\n static override styles = [hostBlock, reducedMotion, css`\n :host {\n color: var(--cg-color-surface-base-text);\n /* Prose body — 16px is the document-typography norm (Tailwind Typography,\n GitHub, Vercel docs). 14px is for UI density, not reading. */\n font-size: var(--cg-font-size-base);\n line-height: var(--cg-line-height-loose);\n }\n\n /* Headings — asymmetric margins (bigger top than bottom) create clear\n section breaks, the document-typography pattern from Tailwind Typography. */\n .md h1 {\n font-size: var(--cg-font-size-2xl);\n font-weight: var(--cg-font-weight-bold);\n color: var(--cg-color-surface-base-text);\n margin: var(--cg-spacing-32) 0 var(--cg-spacing-12);\n line-height: var(--cg-line-height-tight);\n letter-spacing: -0.02em;\n text-wrap: balance;\n }\n .md h2 {\n font-size: var(--cg-font-size-xl);\n font-weight: var(--cg-font-weight-bold);\n color: var(--cg-color-surface-base-text);\n margin: var(--cg-spacing-24) 0 var(--cg-spacing-8);\n line-height: var(--cg-line-height-tight);\n letter-spacing: -0.01em;\n text-wrap: balance;\n }\n .md h3 {\n font-size: var(--cg-font-size-lg);\n font-weight: var(--cg-font-weight-semibold);\n color: var(--cg-color-surface-base-text);\n margin: var(--cg-spacing-20) 0 var(--cg-spacing-6);\n line-height: var(--cg-line-height-snug);\n }\n\n /* Anchored headings — when consumers add ids, deep-links should clear any\n sticky header by default. Caller can override with the css-prop. */\n .md :is(h1, h2, h3, h4, h5, h6) {\n scroll-margin-top: var(--cg-component-markdown-scroll-margin);\n }\n\n .md p {\n margin: var(--cg-spacing-16) 0;\n text-wrap: pretty;\n }\n\n .md strong { font-weight: var(--cg-font-weight-semibold); }\n .md em { font-style: italic; }\n\n /* ── Inline code ── em-relative size so it scales with the body. */\n .md code {\n background: var(--cg-overlay-dark-subtle);\n padding: 0.15em 0.35em;\n border-radius: var(--cg-border-radius-50);\n font-family: var(--cg-font-family-mono);\n font-size: 0.875em;\n }\n\n /* ── Code block — wrapped with header chrome (lang label + copy button).\n 12px radius reads as \"code\", not \"card\" (was 20px).\n Matches GitHub / Vercel / Linear / Tailwind Typography. */\n .md .code-block {\n margin: var(--cg-spacing-16) 0;\n background: var(--cg-color-code-background);\n border: var(--cg-border-width-50) solid var(--cg-color-code-border);\n border-radius: var(--cg-border-radius-100);\n overflow: hidden;\n }\n .md .code-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-6) var(--cg-spacing-12);\n background: var(--cg-overlay-dark-subtle);\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-code-border);\n }\n .md .code-lang {\n font-family: var(--cg-font-family-mono);\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-surface-container-outlined);\n text-transform: lowercase;\n letter-spacing: 0.02em;\n }\n .md .code-copy {\n background: transparent;\n border: var(--cg-border-width-50) solid var(--cg-color-code-border);\n color: var(--cg-color-surface-container-outlined);\n padding: var(--cg-spacing-2) var(--cg-spacing-8);\n border-radius: var(--cg-border-radius-50);\n font-family: var(--cg-font-family-primary);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-medium);\n cursor: pointer;\n transition:\n background var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n transform var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .md .code-copy:hover {\n background: var(--cg-color-action-tertiary-background-hover);\n color: var(--cg-color-surface-base-text);\n }\n .md .code-copy:active { transform: scale(var(--cg-interaction-press-scale)); }\n .md .code-copy:focus-visible {\n outline: none;\n box-shadow:\n 0 0 0 var(--cg-focus-ring-offset) var(--cg-color-focus-ring-offset),\n 0 0 0 calc(var(--cg-focus-ring-offset) + var(--cg-focus-ring-width)) var(--cg-color-focus-ring);\n }\n .md pre {\n background: transparent;\n color: var(--cg-color-code-text);\n padding: var(--cg-spacing-16);\n border: 0;\n border-radius: 0;\n overflow-x: auto;\n font-family: var(--cg-font-family-mono);\n font-size: 0.875em;\n line-height: var(--cg-line-height-relaxed);\n margin: 0;\n }\n .md pre code {\n background: none;\n padding: 0;\n color: inherit;\n font-size: inherit;\n border-radius: 0;\n }\n\n /* ── GitHub-style alerts — 5 semantic variants (note, tip, important, warning, caution). */\n .md .alert {\n border-left: var(--cg-border-width-300) solid;\n padding: var(--cg-spacing-12) var(--cg-spacing-16);\n margin: var(--cg-spacing-16) 0;\n border-radius: 0 var(--cg-border-radius-50) var(--cg-border-radius-50) 0;\n font-style: normal;\n color: var(--cg-color-surface-base-text);\n }\n .md .alert-header {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-6);\n margin-bottom: var(--cg-spacing-6);\n }\n .md .alert-label {\n font-weight: var(--cg-font-weight-semibold);\n font-size: var(--cg-font-size-sm);\n letter-spacing: 0.01em;\n }\n .md .alert-body { font-style: normal; }\n .md .alert-body :is(p, ul, ol):first-child { margin-top: 0; }\n .md .alert-body :is(p, ul, ol):last-child { margin-bottom: 0; }\n\n .md .alert-note {\n border-left-color: var(--cg-color-status-info-text-default);\n background: var(--cg-color-status-info-background-default);\n }\n .md .alert-note .alert-label { color: var(--cg-color-status-info-text-default); }\n\n .md .alert-tip {\n border-left-color: var(--cg-color-status-success-text-default);\n background: var(--cg-color-status-success-background-default);\n }\n .md .alert-tip .alert-label { color: var(--cg-color-status-success-text-default); }\n\n .md .alert-important {\n border-left-color: var(--cg-color-accent-text);\n background: var(--cg-overlay-accent-light);\n }\n .md .alert-important .alert-label { color: var(--cg-color-accent-text); }\n\n .md .alert-warning {\n border-left-color: var(--cg-color-status-warning-text-default);\n background: var(--cg-color-status-warning-background-default);\n }\n .md .alert-warning .alert-label { color: var(--cg-color-status-warning-text-default); }\n\n .md .alert-caution {\n border-left-color: var(--cg-color-status-error-text-default);\n background: var(--cg-color-status-error-background-default);\n }\n .md .alert-caution .alert-label { color: var(--cg-color-status-error-text-default); }\n\n /* ── Task lists — checkbox-prefixed list items. */\n .md .task-list { padding-left: 0; list-style: none; }\n .md .task-list .task {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n }\n .md .task-check {\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 flex-shrink: 0;\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-50);\n background: transparent;\n }\n .md .task-check-on {\n background: var(--cg-color-action-primary-background-default);\n border-color: var(--cg-color-action-primary-border-default);\n position: relative;\n }\n .md .task-check-on::after {\n content: '✓';\n color: var(--cg-color-action-primary-text-default);\n font-size: 0.75em;\n font-weight: var(--cg-font-weight-bold);\n line-height: 1;\n }\n\n /* ── Heading anchors — visible on heading hover, \"#\" link to the slugged id. */\n .md :is(h1, h2, h3, h4, h5, h6) .anchor {\n display: inline-block;\n margin-left: var(--cg-spacing-6);\n color: var(--cg-color-surface-container-outlined);\n text-decoration: none;\n opacity: 0;\n transition: opacity var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .md :is(h1, h2, h3, h4, h5, h6):hover .anchor,\n .md :is(h1, h2, h3, h4, h5, h6) .anchor:focus-visible { opacity: 1; }\n .md .anchor:hover { color: var(--cg-color-accent-text); }\n\n /* ── Links ── 4px underline-offset reads as polished prose (not UI). */\n .md a {\n color: var(--cg-color-accent-text);\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: var(--cg-spacing-4);\n text-decoration-color: color-mix(in oklch, currentColor 40%, transparent);\n transition: text-decoration-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .md a:hover { text-decoration-color: currentColor; }\n\n /* ── Lists ── more breathable item spacing for readable prose. */\n .md ul, .md ol {\n margin: var(--cg-spacing-16) 0;\n padding-left: var(--cg-spacing-24);\n }\n .md li { margin: var(--cg-spacing-6) 0; }\n\n /* ── Blockquote ── */\n .md blockquote {\n border-left: var(--cg-border-width-300) solid var(--cg-color-action-primary-border-default);\n padding-left: var(--cg-spacing-16);\n color: var(--cg-color-surface-container-outlined);\n margin: var(--cg-spacing-16) 0;\n font-style: italic;\n }\n\n /* ── HR ── premium gradient rule (Stripe / Vercel pattern). */\n .md hr {\n border: 0;\n height: var(--cg-border-width-50);\n background: linear-gradient(\n to right,\n transparent,\n var(--cg-color-surface-container-border),\n transparent\n );\n margin: var(--cg-spacing-32) 0;\n }\n\n /* ── Selection highlight ── matches the brand accent. */\n .md ::selection {\n background: var(--cg-overlay-accent-light);\n color: var(--cg-color-surface-base-text);\n }\n\n /* ── Table ── */\n .md table {\n width: 100%;\n border-collapse: collapse;\n margin: var(--cg-spacing-12) 0;\n font-size: var(--cg-font-size-sm);\n }\n .md th {\n text-align: left;\n padding: var(--cg-spacing-8) var(--cg-spacing-12);\n border-bottom: var(--cg-border-width-100) solid var(--cg-color-surface-container-border);\n font-weight: var(--cg-font-weight-semibold);\n color: var(--cg-color-surface-container-outlined);\n font-size: var(--cg-font-size-xs);\n }\n .md td {\n padding: var(--cg-spacing-8) var(--cg-spacing-12);\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-container-border);\n }\n `];\n\n @property() text = '';\n\n /**\n * Line-based markdown parser. Classifies each line into a block type,\n * groups consecutive same-type lines, and renders each block with\n * inline formatting applied to text content.\n *\n * Handles: headings (#), code fences (```), blockquotes (>), horizontal\n * rules (---), unordered lists (-), ordered lists (1.), and paragraphs.\n * Inline: bold (**), italic (*), inline code (`), links ([text](url)).\n */\n private _render(md: string): string {\n const lines = md.replace(/\\r\\n/g, '\\n').split('\\n');\n const blocks: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i]!;\n\n // Fenced code block — wrapped with header chrome (lang label + copy button)\n if (line.startsWith('```')) {\n const lang = line.slice(3).trim();\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i]!.startsWith('```')) {\n codeLines.push(lines[i]!);\n i++;\n }\n if (i < lines.length) i++; // skip closing fence\n const code = escapeHtml(codeLines.join('\\n'));\n const langClean = /^\\w+$/.test(lang) ? lang : '';\n const langClass = langClean ? ` class=\"language-${langClean}\"` : '';\n const langLabel = `<span class=\"code-lang\">${langClean}</span>`;\n blocks.push(\n `<div class=\"code-block\">` +\n `<div class=\"code-header\">${langLabel}` +\n `<button class=\"code-copy\" type=\"button\" aria-label=\"Copy code\">Copy</button>` +\n `</div>` +\n `<pre><code${langClass}>${code}</code></pre>` +\n `</div>`,\n );\n continue;\n }\n\n // Heading (# through ######) — auto-anchored with id + hover-visible \"#\" link\n const headingMatch = /^(#{1,6}) (.+)$/.exec(line);\n if (headingMatch) {\n const level = headingMatch[1]!.length;\n const text = headingMatch[2]!;\n const slug = slugify(text);\n const inline = this._inline(text);\n const anchor = slug\n ? ` <a class=\"anchor\" href=\"#${slug}\" aria-label=\"Permalink to this heading\">#</a>`\n : '';\n const idAttr = slug ? ` id=\"${slug}\"` : '';\n blocks.push(`<h${level}${idAttr}>${inline}${anchor}</h${level}>`);\n i++;\n continue;\n }\n\n // Horizontal rule\n if (/^-{3,}$/.test(line.trim())) {\n blocks.push('<hr/>');\n i++;\n continue;\n }\n\n // Blockquote (consecutive > lines) — first line may be an alert marker\n // `[!NOTE]`, `[!TIP]`, `[!IMPORTANT]`, `[!WARNING]`, `[!CAUTION]`.\n if (line.startsWith('> ') || line === '>') {\n const quoteLines: string[] = [];\n while (i < lines.length && (lines[i]!.startsWith('> ') || lines[i] === '>')) {\n quoteLines.push(lines[i]!.replace(/^> ?/, ''));\n i++;\n }\n const alertMatch = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*$/i.exec(quoteLines[0] ?? '');\n if (alertMatch && ALERT_TYPES.has(alertMatch[1]!.toLowerCase())) {\n const type = alertMatch[1]!.toLowerCase();\n const label = type.charAt(0).toUpperCase() + type.slice(1);\n const body = quoteLines.slice(1).join(' ');\n blocks.push(\n `<blockquote class=\"alert alert-${type}\">` +\n `<div class=\"alert-header\"><span class=\"alert-label\">${label}</span></div>` +\n `<div class=\"alert-body\">${this._inline(body)}</div>` +\n `</blockquote>`,\n );\n } else {\n blocks.push(`<blockquote>${this._inline(quoteLines.join(' '))}</blockquote>`);\n }\n continue;\n }\n\n // Unordered list (consecutive - items) — items can be plain or task `- [ ]` / `- [x]`\n if (/^[-*] /.test(line)) {\n const items: string[] = [];\n let isTaskList = false;\n while (i < lines.length && /^[-*] /.test(lines[i]!)) {\n const itemContent = lines[i]!.slice(2);\n const taskMatch = /^\\[([ xX])\\]\\s+(.*)$/.exec(itemContent);\n if (taskMatch) {\n isTaskList = true;\n const checked = taskMatch[1]!.toLowerCase() === 'x';\n const checkClass = checked ? 'task-check task-check-on' : 'task-check';\n items.push(\n `<li class=\"task\">` +\n `<span class=\"${checkClass}\" aria-hidden=\"true\"></span>` +\n this._inline(taskMatch[2]!) +\n `</li>`,\n );\n } else {\n items.push(`<li>${this._inline(itemContent)}</li>`);\n }\n i++;\n }\n const listClass = isTaskList ? ' class=\"task-list\"' : '';\n blocks.push(`<ul${listClass}>${items.join('')}</ul>`);\n continue;\n }\n\n // Ordered list (consecutive 1. 2. 3. items)\n if (/^\\d+\\. /.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\d+\\. /.test(lines[i]!)) {\n items.push(`<li>${this._inline(lines[i]!.replace(/^\\d+\\. /, ''))}</li>`);\n i++;\n }\n blocks.push(`<ol>${items.join('')}</ol>`);\n continue;\n }\n\n // Blank line — paragraph separator\n if (line.trim() === '') {\n i++;\n continue;\n }\n\n // Paragraph — consecutive non-blank, non-block lines joined with spaces\n const paraLines: string[] = [];\n while (i < lines.length && lines[i]!.trim() !== '' && !isBlockStart(lines[i]!)) {\n paraLines.push(lines[i]!);\n i++;\n }\n blocks.push(`<p>${this._inline(paraLines.join(' '))}</p>`);\n }\n\n return blocks.join('');\n }\n\n /**\n * Applies inline formatting. Escapes HTML first, then processes\n * inline code (via placeholder to avoid interference), bold, italic,\n * and links with URL safety checks.\n */\n private _inline(text: string): string {\n // Extract inline code as placeholders so bold/italic regex don't touch it\n const codeStash: string[] = [];\n let working = text.replace(/`([^`]+)`/g, (_, code: string) => {\n codeStash.push(escapeHtml(code));\n return `\\x00CODE${codeStash.length - 1}\\x00`;\n });\n\n // Escape remaining HTML\n working = escapeHtml(working);\n\n // Bold before italic so ** doesn't get half-eaten by *\n working = working\n .replace(/\\*\\*([^*\\n]+)\\*\\*/g, '<strong>$1</strong>')\n .replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n\n // Links — handle URLs with balanced single-level parens\n working = working.replace(\n /\\[([^\\]]+)\\]\\(((?:[^()\\s]|\\([^)]*\\))+)\\)/g,\n (_m, label: string, url: string) => {\n const trimmed = url.trim();\n const safe = SAFE_PROTOCOLS.test(trimmed) ? trimmed : 'about:blank';\n return `<a href=\"${safe}\" target=\"_blank\" rel=\"noopener\">${label}</a>`;\n },\n );\n\n // Restore inline code\n working = working.replace(/\\x00CODE(\\d+)\\x00/g, (_m, idx: string) => {\n return `<code>${codeStash[Number(idx)]}</code>`;\n });\n\n return working;\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('text')) {\n // Bind copy-button click handlers AFTER Lit has applied innerHTML.\n // The buttons come from sanitized HTML so they have no inline handlers.\n requestAnimationFrame(() => {\n const buttons = this.shadowRoot?.querySelectorAll<HTMLButtonElement>('.code-copy');\n buttons?.forEach(btn => this._bindCopyButton(btn));\n });\n }\n }\n\n private _bindCopyButton(btn: HTMLButtonElement): void {\n if (btn.dataset['cgBound']) return;\n btn.dataset['cgBound'] = '1';\n btn.addEventListener('click', async () => {\n const block = btn.closest('.code-block');\n const pre = block?.querySelector('pre');\n const codeText = pre?.textContent ?? '';\n try {\n await navigator.clipboard?.writeText(codeText);\n const original = btn.textContent;\n btn.textContent = 'Copied';\n setTimeout(() => {\n if (btn.textContent === 'Copied') btn.textContent = original;\n }, 1200);\n } catch {\n // Clipboard API may be blocked (insecure context, permission denied);\n // silently fail — the code is still selectable.\n }\n });\n }\n\n override render() {\n return html`<div class=\"md\" .innerHTML=${sanitizeHtml(this._render(this.text))}></div>`;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'cg-markdown': CgMarkdown; } }\n"],"names":["ALLOWED_TAGS","ALLOWED_ATTRS","SAFE_PROTOCOLS","ALERT_TYPES","slugify","text","escapeHtml","isBlockStart","line","sanitizeHtml","raw","doc","fragment","walk","source","target","child","el","tag","clean","allowed","attr","val","container","CgMarkdown","LitElement","md","lines","blocks","i","lang","codeLines","code","langClean","langClass","langLabel","headingMatch","level","slug","inline","anchor","idAttr","quoteLines","alertMatch","type","label","body","items","isTaskList","itemContent","taskMatch","checkClass","listClass","paraLines","codeStash","working","_","_m","url","trimmed","idx","changed","btn","codeText","original","html","hostBlock","reducedMotion","css","__decorateClass","property","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cg-markdown.js","sources":["../../../src/components/cg-markdown/cg-markdown.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { hostBlock, reducedMotion } from '../../styles/index.js';\n\n/** Allowed HTML tags after markdown parsing */\nconst ALLOWED_TAGS = new Set([\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'br', 'hr',\n 'strong', 'b', 'em', 'i', 'u', 's', 'del', 'ins',\n 'code', 'pre', 'blockquote',\n 'ul', 'ol', 'li',\n 'a', 'img',\n 'table', 'thead', 'tbody', 'tr', 'th', 'td',\n 'div', 'span', 'sub', 'sup', 'mark', 'abbr',\n 'button',\n]);\n\n/** Allowed attributes per tag — anything not listed is stripped */\nconst ALLOWED_ATTRS: Record<string, Set<string>> = {\n // Heading anchors get an id derived from slugified heading text.\n h1: new Set(['id']), h2: new Set(['id']), h3: new Set(['id']),\n h4: new Set(['id']), h5: new Set(['id']), h6: new Set(['id']),\n a: new Set(['href', 'target', 'rel', 'class', 'aria-label']),\n img: new Set(['src', 'alt', 'width', 'height']),\n td: new Set(['colspan', 'rowspan']),\n th: new Set(['colspan', 'rowspan']),\n code: new Set(['class']),\n // Class-based variants (alert types, task lists, code-block chrome).\n blockquote: new Set(['class']),\n div: new Set(['class']),\n ul: new Set(['class']),\n li: new Set(['class']),\n span: new Set(['class', 'aria-hidden']),\n button: new Set(['class', 'type', 'aria-label']),\n};\n\n/** Safe URL protocols for href/src attributes */\nconst SAFE_PROTOCOLS = /^(https?:|mailto:|#|\\/)/i;\n\n/** GitHub-style alert variants — case-insensitive markers as the first line of a blockquote. */\nconst ALERT_TYPES = new Set(['note', 'tip', 'important', 'warning', 'caution']);\n\n/** Slugify heading text into a URL-safe id. Only emits [a-z0-9-]; safe to interpolate. */\nfunction slugify(text: string): string {\n return text\n .replace(/[`*_~]/g, '')\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/** Escape HTML-special characters in text content. */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\n/** Returns true if the line starts a block-level markdown element. */\nfunction isBlockStart(line: string): boolean {\n return (\n line.startsWith('```') ||\n /^#{1,6} /.test(line) ||\n /^-{3,}$/.test(line.trim()) ||\n line.startsWith('> ') ||\n line === '>' ||\n /^[-*] /.test(line) ||\n /^\\d+\\. /.test(line) ||\n /^\\|.+\\|\\s*$/.test(line)\n );\n}\n\n/**\n * DOM-based HTML sanitizer. Parses with the browser's HTML parser,\n * walks the tree, and strips anything not explicitly allowed.\n * Immune to encoding tricks, nested contexts, and regex bypasses.\n */\nfunction sanitizeHtml(raw: string): string {\n const doc = new DOMParser().parseFromString(raw, 'text/html');\n const fragment = document.createDocumentFragment();\n\n function walk(source: Node, target: Node) {\n for (const child of Array.from(source.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n target.appendChild(document.createTextNode(child.textContent ?? ''));\n continue;\n }\n if (child.nodeType !== Node.ELEMENT_NODE) continue;\n const el = child as Element;\n const tag = el.tagName.toLowerCase();\n if (!ALLOWED_TAGS.has(tag)) {\n // Skip the element but keep its text children\n walk(el, target);\n continue;\n }\n const clean = document.createElement(tag);\n const allowed = ALLOWED_ATTRS[tag];\n if (allowed) {\n for (const attr of Array.from(el.attributes)) {\n if (!allowed.has(attr.name.toLowerCase())) continue;\n const val = attr.value.trim().toLowerCase();\n if ((attr.name === 'href' || attr.name === 'src') && !SAFE_PROTOCOLS.test(val)) continue;\n clean.setAttribute(attr.name, attr.value);\n }\n }\n target.appendChild(clean);\n walk(el, clean);\n }\n }\n\n walk(doc.body, fragment);\n const container = document.createElement('div');\n container.appendChild(fragment);\n return container.innerHTML;\n}\n\n/**\n * <cg-markdown> — Lightweight markdown renderer for LLM output.\n *\n * @example\n * ```html\n * <cg-markdown text=\"## Hello\\n\\nThis is **bold**.\"></cg-markdown>\n * ```\n *\n * @cssprop --cg-color-surface-base-text - Body text color\n * @cssprop --cg-font-size-sm - Body font size (14px)\n */\n@customElement('cg-markdown')\nexport class CgMarkdown extends LitElement {\n static override styles = [hostBlock, reducedMotion, css`\n :host {\n color: var(--cg-color-surface-base-text);\n /* Prose body — 16px is the document-typography norm (Tailwind Typography,\n GitHub, Vercel docs). 14px is for UI density, not reading. */\n font-size: var(--cg-font-size-base);\n line-height: var(--cg-line-height-loose);\n }\n\n /* Headings — asymmetric margins (bigger top than bottom) create clear\n section breaks, the document-typography pattern from Tailwind Typography. */\n .md h1 {\n font-size: var(--cg-font-size-2xl);\n font-weight: var(--cg-font-weight-bold);\n color: var(--cg-color-surface-base-text);\n margin: var(--cg-spacing-32) 0 var(--cg-spacing-12);\n line-height: var(--cg-line-height-tight);\n letter-spacing: var(--cg-letter-spacing-tight);\n text-wrap: balance;\n }\n .md h2 {\n font-size: var(--cg-font-size-xl);\n font-weight: var(--cg-font-weight-bold);\n color: var(--cg-color-surface-base-text);\n margin: var(--cg-spacing-24) 0 var(--cg-spacing-8);\n line-height: var(--cg-line-height-tight);\n letter-spacing: var(--cg-letter-spacing-tight);\n text-wrap: balance;\n }\n .md h3 {\n font-size: var(--cg-font-size-lg);\n font-weight: var(--cg-font-weight-semibold);\n color: var(--cg-color-surface-base-text);\n margin: var(--cg-spacing-20) 0 var(--cg-spacing-6);\n line-height: var(--cg-line-height-snug);\n }\n\n /* Anchored headings — when consumers add ids, deep-links should clear any\n sticky header by default. Caller can override with the css-prop. */\n .md :is(h1, h2, h3, h4, h5, h6) {\n scroll-margin-top: var(--cg-component-markdown-scroll-margin);\n }\n\n .md p {\n margin: var(--cg-spacing-16) 0;\n text-wrap: pretty;\n }\n\n .md strong { font-weight: var(--cg-font-weight-semibold); }\n .md em { font-style: italic; }\n\n /* ── Inline code ── em-relative size so it scales with the body. */\n .md code {\n background: var(--cg-overlay-dark-subtle);\n padding: 0.15em 0.35em;\n border-radius: var(--cg-border-radius-50);\n font-family: var(--cg-font-family-mono);\n font-size: 0.875em;\n }\n\n /* ── Code block — wrapped with header chrome (lang label + copy button).\n 12px radius reads as \"code\", not \"card\" (was 20px).\n Matches GitHub / Vercel / Linear / Tailwind Typography. */\n .md .code-block {\n margin: var(--cg-spacing-16) 0;\n background: var(--cg-color-code-background);\n border: var(--cg-border-width-50) solid var(--cg-color-code-border);\n border-radius: var(--cg-border-radius-100);\n overflow: hidden;\n }\n .md .code-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--cg-spacing-8);\n padding: var(--cg-spacing-6) var(--cg-spacing-12);\n background: var(--cg-overlay-dark-subtle);\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-code-border);\n }\n .md .code-lang {\n font-family: var(--cg-font-family-mono);\n font-size: var(--cg-font-size-xs);\n color: var(--cg-color-surface-container-outlined);\n text-transform: lowercase;\n letter-spacing: var(--cg-letter-spacing-wide);\n }\n .md .code-copy {\n background: transparent;\n border: var(--cg-border-width-50) solid var(--cg-color-code-border);\n color: var(--cg-color-surface-container-outlined);\n padding: var(--cg-spacing-2) var(--cg-spacing-8);\n border-radius: var(--cg-border-radius-50);\n font-family: var(--cg-font-family-primary);\n font-size: var(--cg-font-size-xs);\n font-weight: var(--cg-font-weight-medium);\n cursor: pointer;\n transition:\n background var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n color var(--cg-transition-duration-fast) var(--cg-transition-easing-default),\n transform var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .md .code-copy:hover {\n background: var(--cg-color-action-tertiary-background-hover);\n color: var(--cg-color-surface-base-text);\n }\n .md .code-copy:active { transform: scale(var(--cg-interaction-press-scale)); }\n .md .code-copy:focus-visible {\n outline: none;\n box-shadow:\n 0 0 0 var(--cg-focus-ring-offset) var(--cg-color-focus-ring-offset),\n 0 0 0 calc(var(--cg-focus-ring-offset) + var(--cg-focus-ring-width)) var(--cg-color-focus-ring);\n }\n .md pre {\n background: transparent;\n color: var(--cg-color-code-text);\n padding: var(--cg-spacing-16);\n border: 0;\n border-radius: 0;\n overflow-x: auto;\n font-family: var(--cg-font-family-mono);\n font-size: 0.875em;\n line-height: var(--cg-line-height-relaxed);\n margin: 0;\n }\n .md pre code {\n background: none;\n padding: 0;\n color: inherit;\n font-size: inherit;\n border-radius: 0;\n }\n\n /* ── GitHub-style alerts — 5 semantic variants (note, tip, important, warning, caution). */\n .md .alert {\n border-left: var(--cg-border-width-300) solid;\n padding: var(--cg-spacing-12) var(--cg-spacing-16);\n margin: var(--cg-spacing-16) 0;\n border-radius: 0 var(--cg-border-radius-50) var(--cg-border-radius-50) 0;\n font-style: normal;\n color: var(--cg-color-surface-base-text);\n }\n .md .alert-header {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-6);\n margin-bottom: var(--cg-spacing-6);\n }\n .md .alert-label {\n font-weight: var(--cg-font-weight-semibold);\n font-size: var(--cg-font-size-sm);\n letter-spacing: var(--cg-letter-spacing-normal);\n }\n .md .alert-body { font-style: normal; }\n .md .alert-body :is(p, ul, ol):first-child { margin-top: 0; }\n .md .alert-body :is(p, ul, ol):last-child { margin-bottom: 0; }\n\n .md .alert-note {\n border-left-color: var(--cg-color-status-info-text-default);\n background: var(--cg-color-status-info-background-default);\n }\n .md .alert-note .alert-label { color: var(--cg-color-status-info-text-default); }\n\n .md .alert-tip {\n border-left-color: var(--cg-color-status-success-text-default);\n background: var(--cg-color-status-success-background-default);\n }\n .md .alert-tip .alert-label { color: var(--cg-color-status-success-text-default); }\n\n .md .alert-important {\n border-left-color: var(--cg-color-accent-text);\n background: var(--cg-overlay-accent-light);\n }\n .md .alert-important .alert-label { color: var(--cg-color-accent-text); }\n\n .md .alert-warning {\n border-left-color: var(--cg-color-status-warning-text-default);\n background: var(--cg-color-status-warning-background-default);\n }\n .md .alert-warning .alert-label { color: var(--cg-color-status-warning-text-default); }\n\n .md .alert-caution {\n border-left-color: var(--cg-color-status-error-text-default);\n background: var(--cg-color-status-error-background-default);\n }\n .md .alert-caution .alert-label { color: var(--cg-color-status-error-text-default); }\n\n /* ── Task lists — checkbox-prefixed list items. */\n .md .task-list { padding-left: 0; list-style: none; }\n .md .task-list .task {\n display: flex;\n align-items: center;\n gap: var(--cg-spacing-8);\n }\n .md .task-check {\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 flex-shrink: 0;\n border: var(--cg-border-width-50) solid var(--cg-color-surface-cards-border);\n border-radius: var(--cg-border-radius-50);\n background: transparent;\n }\n .md .task-check-on {\n background: var(--cg-color-action-primary-background-default);\n border-color: var(--cg-color-action-primary-border-default);\n position: relative;\n }\n .md .task-check-on::after {\n content: '✓';\n color: var(--cg-color-action-primary-text-default);\n font-size: 0.75em;\n font-weight: var(--cg-font-weight-bold);\n line-height: 1;\n }\n\n /* Rule 10 — visually hidden, screen-reader-only state text. */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n /* ── Heading anchors — visible on heading hover, \"#\" link to the slugged id. */\n .md :is(h1, h2, h3, h4, h5, h6) .anchor {\n display: inline-block;\n margin-left: var(--cg-spacing-6);\n color: var(--cg-color-surface-container-outlined);\n text-decoration: none;\n opacity: 0;\n transition: opacity var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .md :is(h1, h2, h3, h4, h5, h6):hover .anchor,\n .md :is(h1, h2, h3, h4, h5, h6) .anchor:focus-visible { opacity: 1; }\n .md .anchor:hover { color: var(--cg-color-accent-text); }\n\n /* ── Links ── 4px underline-offset reads as polished prose (not UI). */\n .md a {\n color: var(--cg-color-accent-text);\n text-decoration: underline;\n text-decoration-thickness: var(--cg-border-width-50);\n text-underline-offset: var(--cg-spacing-4);\n text-decoration-color: color-mix(in oklch, currentColor 40%, transparent);\n transition: text-decoration-color var(--cg-transition-duration-fast) var(--cg-transition-easing-default);\n }\n .md a:hover { text-decoration-color: currentColor; }\n\n /* ── Lists ── more breathable item spacing for readable prose. */\n .md ul, .md ol {\n margin: var(--cg-spacing-16) 0;\n padding-left: var(--cg-spacing-24);\n }\n .md li { margin: var(--cg-spacing-6) 0; }\n\n /* ── Blockquote ── */\n .md blockquote {\n border-left: var(--cg-border-width-300) solid var(--cg-color-action-primary-border-default);\n padding-left: var(--cg-spacing-16);\n color: var(--cg-color-surface-container-outlined);\n margin: var(--cg-spacing-16) 0;\n font-style: italic;\n }\n\n /* ── HR ── premium gradient rule (Stripe / Vercel pattern). */\n .md hr {\n border: 0;\n height: var(--cg-border-width-50);\n background: linear-gradient(\n to right,\n transparent,\n var(--cg-color-surface-container-border),\n transparent\n );\n margin: var(--cg-spacing-32) 0;\n }\n\n /* ── Selection highlight ── matches the brand accent. */\n .md ::selection {\n background: var(--cg-overlay-accent-light);\n color: var(--cg-color-surface-base-text);\n }\n\n /* ── Images ── contained to the prose column. */\n .md img {\n max-width: 100%;\n height: auto;\n border-radius: var(--cg-border-radius-100);\n }\n\n /* ── Table ── */\n .md table {\n width: 100%;\n border-collapse: collapse;\n margin: var(--cg-spacing-12) 0;\n font-size: var(--cg-font-size-sm);\n }\n .md th {\n text-align: left;\n padding: var(--cg-spacing-8) var(--cg-spacing-12);\n border-bottom: var(--cg-border-width-100) solid var(--cg-color-surface-container-border);\n font-weight: var(--cg-font-weight-semibold);\n color: var(--cg-color-surface-container-outlined);\n font-size: var(--cg-font-size-xs);\n }\n .md td {\n padding: var(--cg-spacing-8) var(--cg-spacing-12);\n border-bottom: var(--cg-border-width-50) solid var(--cg-color-surface-container-border);\n }\n `];\n\n @property() text = '';\n\n /**\n * Line-based markdown parser. Classifies each line into a block type,\n * groups consecutive same-type lines, and renders each block with\n * inline formatting applied to text content.\n *\n * Handles: headings (#), code fences (```), blockquotes (>), horizontal\n * rules (---), unordered lists (-), ordered lists (1.), and paragraphs.\n * Inline: bold (**), italic (*), inline code (`), links ([text](url)).\n */\n private _render(md: string): string {\n const lines = md.replace(/\\r\\n/g, '\\n').split('\\n');\n const blocks: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i]!;\n\n // Fenced code block — wrapped with header chrome (lang label + copy button)\n if (line.startsWith('```')) {\n const lang = line.slice(3).trim();\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i]!.startsWith('```')) {\n codeLines.push(lines[i]!);\n i++;\n }\n if (i < lines.length) i++; // skip closing fence\n const code = escapeHtml(codeLines.join('\\n'));\n const langClean = /^\\w+$/.test(lang) ? lang : '';\n const langClass = langClean ? ` class=\"language-${langClean}\"` : '';\n const langLabel = `<span class=\"code-lang\">${langClean}</span>`;\n blocks.push(\n `<div class=\"code-block\">` +\n `<div class=\"code-header\">${langLabel}` +\n `<button class=\"code-copy\" type=\"button\" aria-label=\"Copy code\">Copy</button>` +\n `</div>` +\n `<pre><code${langClass}>${code}</code></pre>` +\n `</div>`,\n );\n continue;\n }\n\n // Heading (# through ######) — auto-anchored with id + hover-visible \"#\" link\n const headingMatch = /^(#{1,6}) (.+)$/.exec(line);\n if (headingMatch) {\n const level = headingMatch[1]!.length;\n const text = headingMatch[2]!;\n const slug = slugify(text);\n const inline = this._inline(text);\n const anchor = slug\n ? ` <a class=\"anchor\" href=\"#${slug}\" aria-label=\"Permalink to this heading\">#</a>`\n : '';\n const idAttr = slug ? ` id=\"${slug}\"` : '';\n blocks.push(`<h${level}${idAttr}>${inline}${anchor}</h${level}>`);\n i++;\n continue;\n }\n\n // Horizontal rule\n if (/^-{3,}$/.test(line.trim())) {\n blocks.push('<hr/>');\n i++;\n continue;\n }\n\n // Blockquote (consecutive > lines) — first line may be an alert marker\n // `[!NOTE]`, `[!TIP]`, `[!IMPORTANT]`, `[!WARNING]`, `[!CAUTION]`.\n if (line.startsWith('> ') || line === '>') {\n const quoteLines: string[] = [];\n while (i < lines.length && (lines[i]!.startsWith('> ') || lines[i] === '>')) {\n quoteLines.push(lines[i]!.replace(/^> ?/, ''));\n i++;\n }\n const alertMatch = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*$/i.exec(quoteLines[0] ?? '');\n if (alertMatch && ALERT_TYPES.has(alertMatch[1]!.toLowerCase())) {\n const type = alertMatch[1]!.toLowerCase();\n const label = type.charAt(0).toUpperCase() + type.slice(1);\n // Run the body through the block parser so lists and paragraphs\n // inside alerts render as real blocks, not flattened inline text.\n const body = this._render(quoteLines.slice(1).join('\\n'));\n blocks.push(\n `<blockquote class=\"alert alert-${type}\">` +\n `<div class=\"alert-header\"><span class=\"alert-label\">${label}</span></div>` +\n `<div class=\"alert-body\">${body}</div>` +\n `</blockquote>`,\n );\n } else {\n blocks.push(`<blockquote>${this._inline(quoteLines.join(' '))}</blockquote>`);\n }\n continue;\n }\n\n // Unordered list (consecutive - items) — items can be plain or task `- [ ]` / `- [x]`\n if (/^[-*] /.test(line)) {\n const items: string[] = [];\n let isTaskList = false;\n while (i < lines.length && /^[-*] /.test(lines[i]!)) {\n const itemContent = lines[i]!.slice(2);\n const taskMatch = /^\\[([ xX])\\]\\s+(.*)$/.exec(itemContent);\n if (taskMatch) {\n isTaskList = true;\n const checked = taskMatch[1]!.toLowerCase() === 'x';\n const checkClass = checked ? 'task-check task-check-on' : 'task-check';\n items.push(\n `<li class=\"task\">` +\n `<span class=\"${checkClass}\" aria-hidden=\"true\"></span>` +\n `<span class=\"sr-only\">${checked ? 'Done: ' : 'To do: '}</span>` +\n this._inline(taskMatch[2]!) +\n `</li>`,\n );\n } else {\n items.push(`<li>${this._inline(itemContent)}</li>`);\n }\n i++;\n }\n const listClass = isTaskList ? ' class=\"task-list\"' : '';\n blocks.push(`<ul${listClass}>${items.join('')}</ul>`);\n continue;\n }\n\n // Ordered list (consecutive 1. 2. 3. items)\n if (/^\\d+\\. /.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\d+\\. /.test(lines[i]!)) {\n items.push(`<li>${this._inline(lines[i]!.replace(/^\\d+\\. /, ''))}</li>`);\n i++;\n }\n blocks.push(`<ol>${items.join('')}</ol>`);\n continue;\n }\n\n // GFM pipe table — header row, then a |---|---| separator row, then body rows\n if (/^\\|.+\\|\\s*$/.test(line) && i + 1 < lines.length && /^\\|(\\s*:?-+:?\\s*\\|)+\\s*$/.test(lines[i + 1]!)) {\n const splitRow = (row: string): string[] =>\n row.trim().replace(/^\\|/, '').replace(/\\|$/, '').split('|').map(cell => this._inline(cell.trim()));\n const headers = splitRow(line);\n i += 2; // consume header + separator\n const bodyRows: string[][] = [];\n while (i < lines.length && /^\\|.+\\|\\s*$/.test(lines[i]!)) {\n bodyRows.push(splitRow(lines[i]!));\n i++;\n }\n const thead = `<thead><tr>${headers.map(h => `<th>${h}</th>`).join('')}</tr></thead>`;\n const tbody = bodyRows.length\n ? `<tbody>${bodyRows.map(r => `<tr>${r.map(c => `<td>${c}</td>`).join('')}</tr>`).join('')}</tbody>`\n : '';\n blocks.push(`<table>${thead}${tbody}</table>`);\n continue;\n }\n\n // Blank line — paragraph separator\n if (line.trim() === '') {\n i++;\n continue;\n }\n\n // Paragraph — consecutive non-blank, non-block lines joined with spaces.\n // The first line is consumed unconditionally: a pipe row without a\n // separator line is a block start that no branch above claims, and\n // skipping the consume would loop forever.\n const paraLines: string[] = [line];\n i++;\n while (i < lines.length && lines[i]!.trim() !== '' && !isBlockStart(lines[i]!)) {\n paraLines.push(lines[i]!);\n i++;\n }\n blocks.push(`<p>${this._inline(paraLines.join(' '))}</p>`);\n }\n\n return blocks.join('');\n }\n\n /**\n * Applies inline formatting. Escapes HTML first, then processes\n * inline code (via placeholder to avoid interference), bold, italic,\n * and links with URL safety checks.\n */\n private _inline(text: string): string {\n // Extract inline code as placeholders so bold/italic regex don't touch it\n const codeStash: string[] = [];\n let working = text.replace(/`([^`]+)`/g, (_, code: string) => {\n codeStash.push(escapeHtml(code));\n return `\\x00CODE${codeStash.length - 1}\\x00`;\n });\n\n // Escape remaining HTML\n working = escapeHtml(working);\n\n // Bold before italic so ** doesn't get half-eaten by *\n working = working\n .replace(/\\*\\*([^*\\n]+)\\*\\*/g, '<strong>$1</strong>')\n .replace(/\\*([^*\\n]+)\\*/g, '<em>$1</em>');\n\n // Images — must run BEFORE links so  isn't half-eaten by the\n // link rule. Unsafe protocols degrade to the alt text; the DOM sanitizer\n // re-validates src as a backstop.\n working = working.replace(\n /!\\[([^\\]]*)\\]\\(((?:[^()\\s]|\\([^)]*\\))+)\\)/g,\n (_m, alt: string, url: string) => {\n const trimmed = url.trim();\n return SAFE_PROTOCOLS.test(trimmed) ? `<img src=\"${trimmed}\" alt=\"${alt}\">` : alt;\n },\n );\n\n // Links — handle URLs with balanced single-level parens\n working = working.replace(\n /\\[([^\\]]+)\\]\\(((?:[^()\\s]|\\([^)]*\\))+)\\)/g,\n (_m, label: string, url: string) => {\n const trimmed = url.trim();\n const safe = SAFE_PROTOCOLS.test(trimmed) ? trimmed : 'about:blank';\n return `<a href=\"${safe}\" target=\"_blank\" rel=\"noopener\">${label}</a>`;\n },\n );\n\n // Restore inline code\n working = working.replace(/\\x00CODE(\\d+)\\x00/g, (_m, idx: string) => {\n return `<code>${codeStash[Number(idx)]}</code>`;\n });\n\n return working;\n }\n\n override updated(changed: Map<string, unknown>): void {\n if (changed.has('text')) {\n // Bind copy-button click handlers AFTER Lit has applied innerHTML.\n // The buttons come from sanitized HTML so they have no inline handlers.\n requestAnimationFrame(() => {\n const buttons = this.shadowRoot?.querySelectorAll<HTMLButtonElement>('.code-copy');\n buttons?.forEach(btn => this._bindCopyButton(btn));\n this.shadowRoot?.querySelectorAll<HTMLAnchorElement>('.anchor').forEach(a => this._bindAnchor(a));\n });\n }\n }\n\n override firstUpdated(): void {\n // Deep-link support: fragment navigation can't reach shadow-root ids, so\n // resolve the initial location.hash ourselves once content is rendered.\n requestAnimationFrame(() => {\n const slug = location.hash.slice(1);\n if (!slug) return;\n this.shadowRoot?.getElementById(slug)?.scrollIntoView({ block: 'start' });\n });\n }\n\n private _bindAnchor(a: HTMLAnchorElement): void {\n if (a.dataset['cgBound']) return;\n a.dataset['cgBound'] = '1';\n a.addEventListener('click', (e) => {\n // Browsers can't fragment-navigate into a shadow root — scroll manually\n // (scroll-margin-top's tier-3 token applies to scrollIntoView).\n e.preventDefault();\n const slug = a.getAttribute('href')?.slice(1);\n if (!slug) return;\n history.replaceState(null, '', `#${slug}`);\n this.shadowRoot?.getElementById(slug)?.scrollIntoView({ block: 'start' });\n });\n }\n\n private _bindCopyButton(btn: HTMLButtonElement): void {\n if (btn.dataset['cgBound']) return;\n btn.dataset['cgBound'] = '1';\n // Announce the Copy -> Copied swap to screen readers (set post-sanitize\n // via JS so the sanitizer allowlist stays unchanged).\n btn.setAttribute('aria-live', 'polite');\n btn.addEventListener('click', async () => {\n const block = btn.closest('.code-block');\n const pre = block?.querySelector('pre');\n const codeText = pre?.textContent ?? '';\n try {\n await navigator.clipboard?.writeText(codeText);\n const original = btn.textContent;\n btn.textContent = 'Copied';\n setTimeout(() => {\n if (btn.textContent === 'Copied') btn.textContent = original;\n }, 1200);\n } catch {\n // Clipboard API may be blocked (insecure context, permission denied);\n // silently fail — the code is still selectable.\n }\n });\n }\n\n override render() {\n // SSR has no DOMParser/document — emit an empty prose container and let\n // the client fill it on hydration.\n if (typeof DOMParser === 'undefined') {\n return html`<div class=\"md\"></div>`;\n }\n return html`<div class=\"md\" .innerHTML=${sanitizeHtml(this._render(this.text))}></div>`;\n }\n}\n\ndeclare global { interface HTMLElementTagNameMap { 'cg-markdown': CgMarkdown; } }\n"],"names":["ALLOWED_TAGS","ALLOWED_ATTRS","SAFE_PROTOCOLS","ALERT_TYPES","slugify","text","escapeHtml","isBlockStart","line","sanitizeHtml","raw","doc","fragment","walk","source","target","child","el","tag","clean","allowed","attr","val","container","CgMarkdown","LitElement","md","lines","blocks","i","lang","codeLines","code","langClean","langClass","langLabel","headingMatch","level","slug","inline","anchor","idAttr","quoteLines","alertMatch","type","label","body","items","isTaskList","itemContent","taskMatch","checked","checkClass","listClass","splitRow","row","cell","headers","bodyRows","thead","h","tbody","r","c","paraLines","codeStash","working","_","_m","alt","url","trimmed","idx","changed","btn","a","e","codeText","original","html","hostBlock","reducedMotion","css","__decorateClass","property","customElement"],"mappings":"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"}
|