@k2b/ui 0.50.0 → 0.52.0
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/base.css +35 -1
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/CommandList.js +861 -0
- package/dist/browser/actions/CommandList.js.map +1 -0
- package/dist/browser/actions/CommandMenu.js +237 -0
- package/dist/browser/actions/CommandMenu.js.map +1 -0
- package/dist/browser/actions/Dropdown.js +43 -10
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/Toolbar.js +8 -2
- package/dist/browser/actions/Toolbar.js.map +1 -1
- package/dist/browser/actions/command-dock.js +47 -0
- package/dist/browser/actions/command-dock.js.map +1 -0
- package/dist/browser/actions/command-items.js +84 -0
- package/dist/browser/actions/command-items.js.map +1 -0
- package/dist/browser/actions/command-messages.js +42 -0
- package/dist/browser/actions/command-messages.js.map +1 -0
- package/dist/browser/actions/index.js +1 -0
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/charts/core/area.js +3 -5
- package/dist/browser/charts/core/area.js.map +1 -1
- package/dist/browser/charts/core/bar-labels.js +5 -0
- package/dist/browser/charts/core/bar-labels.js.map +1 -0
- package/dist/browser/charts/core/bubble.js +166 -0
- package/dist/browser/charts/core/bubble.js.map +1 -0
- package/dist/browser/charts/core/calendar.js +1 -1
- package/dist/browser/charts/core/calendar.js.map +1 -1
- package/dist/browser/charts/core/chart-messages.js +17 -0
- package/dist/browser/charts/core/chart-messages.js.map +1 -0
- package/dist/browser/charts/core/default-styles.js +83 -0
- package/dist/browser/charts/core/default-styles.js.map +1 -0
- package/dist/browser/charts/core/funnel-layout.js +79 -0
- package/dist/browser/charts/core/funnel-layout.js.map +1 -0
- package/dist/browser/charts/core/funnel.js +27 -0
- package/dist/browser/charts/core/funnel.js.map +1 -0
- package/dist/browser/charts/core/hbar-layout.js +118 -0
- package/dist/browser/charts/core/hbar-layout.js.map +1 -0
- package/dist/browser/charts/core/hbar.js +39 -0
- package/dist/browser/charts/core/hbar.js.map +1 -0
- package/dist/browser/charts/core/index.js +12 -2
- package/dist/browser/charts/core/index.js.map +1 -1
- package/dist/browser/charts/core/map.js +116 -0
- package/dist/browser/charts/core/map.js.map +1 -0
- package/dist/browser/charts/core/pareto.js +120 -0
- package/dist/browser/charts/core/pareto.js.map +1 -0
- package/dist/browser/charts/core/radar.js +101 -0
- package/dist/browser/charts/core/radar.js.map +1 -0
- package/dist/browser/charts/core/registry.js +33 -16
- package/dist/browser/charts/core/registry.js.map +1 -1
- package/dist/browser/charts/core/render-size.js +15 -0
- package/dist/browser/charts/core/render-size.js.map +1 -0
- package/dist/browser/charts/core/render.js +39 -10
- package/dist/browser/charts/core/render.js.map +1 -1
- package/dist/browser/charts/core/snapshot.js +4 -4
- package/dist/browser/charts/core/snapshot.js.map +1 -1
- package/dist/browser/charts/core/svg-barGauge.js +67 -0
- package/dist/browser/charts/core/svg-barGauge.js.map +1 -0
- package/dist/browser/charts/core/svg-boxplot.js +127 -0
- package/dist/browser/charts/core/svg-boxplot.js.map +1 -0
- package/dist/browser/charts/core/svg-common.js +1065 -0
- package/dist/browser/charts/core/svg-common.js.map +1 -0
- package/dist/browser/charts/core/svg-gauge.js +185 -0
- package/dist/browser/charts/core/svg-gauge.js.map +1 -0
- package/dist/browser/charts/core/svg-heatmap.js +80 -0
- package/dist/browser/charts/core/svg-heatmap.js.map +1 -0
- package/dist/browser/charts/core/svg-histogram.js +73 -0
- package/dist/browser/charts/core/svg-histogram.js.map +1 -0
- package/dist/browser/charts/core/svg-renderers.js +638 -0
- package/dist/browser/charts/core/svg-renderers.js.map +1 -0
- package/dist/browser/charts/core/svg-scatter.js +114 -0
- package/dist/browser/charts/core/svg-scatter.js.map +1 -0
- package/dist/browser/charts/core/svg.js +4 -2525
- package/dist/browser/charts/core/svg.js.map +1 -1
- package/dist/browser/charts/core/treemap.js +138 -0
- package/dist/browser/charts/core/treemap.js.map +1 -0
- package/dist/browser/charts/core/types.js +0 -2
- package/dist/browser/charts/core/types.js.map +1 -1
- package/dist/browser/charts/core/waterfall.js +162 -0
- package/dist/browser/charts/core/waterfall.js.map +1 -0
- package/dist/browser/charts/description.js +2 -0
- package/dist/browser/charts/description.js.map +1 -0
- package/dist/browser/charts.js.map +1 -1
- package/dist/browser/content/Chart.js +14 -628
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartRoot.js +646 -0
- package/dist/browser/content/ChartRoot.js.map +1 -0
- package/dist/browser/content/ChartSnapshotView.js +4 -1
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/ChartSparkline.js +24 -0
- package/dist/browser/content/ChartSparkline.js.map +1 -0
- package/dist/browser/content/DataTable.js +186 -193
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/FileView.js +111 -61
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/Lightbox.js +62 -30
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/MapView.js +30 -28
- package/dist/browser/content/MapView.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +84 -52
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/PdfViewer.js +588 -0
- package/dist/browser/content/PdfViewer.js.map +1 -0
- package/dist/browser/content/ThumbnailStrip.js +174 -0
- package/dist/browser/content/ThumbnailStrip.js.map +1 -0
- package/dist/browser/content/chart-bar.js +344 -16
- package/dist/browser/content/chart-bar.js.map +1 -1
- package/dist/browser/content/chart-inspection-core.js +50 -29
- package/dist/browser/content/chart-inspection-core.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js +1 -1
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-message-catalog.js +28 -0
- package/dist/browser/content/chart-message-catalog.js.map +1 -1
- package/dist/browser/content/chart-state-timeline.js +1 -1
- package/dist/browser/content/chart-state-timeline.js.map +1 -1
- package/dist/browser/content/chart-svg.js +2 -1
- package/dist/browser/content/chart-svg.js.map +1 -1
- package/dist/browser/content/index.js +2 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/pdf-document.js +29 -0
- package/dist/browser/content/pdf-document.js.map +1 -0
- package/dist/browser/content/pdf-limits.js +31 -0
- package/dist/browser/content/pdf-limits.js.map +1 -0
- package/dist/browser/content/pdf-messages.js +34 -2
- package/dist/browser/content/pdf-messages.js.map +1 -1
- package/dist/browser/content/pdf-viewer-engine.js +57 -0
- package/dist/browser/content/pdf-viewer-worker.js +28 -0
- package/dist/browser/content/thumbnail-strip-messages.js +24 -0
- package/dist/browser/content/thumbnail-strip-messages.js.map +1 -0
- package/dist/browser/inputs/ChoiceInputs.js +150 -76
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/ChoiceSlider.js +75 -58
- package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +113 -98
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/PeriodPicker.js +874 -0
- package/dist/browser/inputs/PeriodPicker.js.map +1 -0
- package/dist/browser/inputs/index.js +5 -1
- package/dist/browser/inputs/index.js.map +1 -1
- package/dist/browser/inputs/input-messages.js +8 -2
- package/dist/browser/inputs/input-messages.js.map +1 -1
- package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/inputs/markdown/MarkdownSelectionToolbar.js +330 -0
- package/dist/browser/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
- package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
- package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
- package/dist/browser/inputs/period-picker-messages.js +71 -0
- package/dist/browser/inputs/period-picker-messages.js.map +1 -0
- package/dist/browser/inputs/period.js +263 -0
- package/dist/browser/inputs/period.js.map +1 -0
- package/dist/browser/internal/field.js +96 -77
- package/dist/browser/internal/field.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +7 -5
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/DetailPanel.js +147 -120
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/Discussion.js +101 -108
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/PanelDialog.js +92 -68
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/DescriptionList.js +5 -2
- package/dist/browser/surfaces/DescriptionList.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +95 -78
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/delta-badge.js +16 -2
- package/dist/browser/surfaces/delta-badge.js.map +1 -1
- package/dist/browser/surfaces/stat-cell-messages.js +4 -2
- package/dist/browser/surfaces/stat-cell-messages.js.map +1 -1
- package/dist/browser/widgets/DashboardFrame.js +315 -0
- package/dist/browser/widgets/DashboardFrame.js.map +1 -0
- package/dist/browser/widgets/index.js +1 -0
- package/dist/browser/widgets/index.js.map +1 -1
- package/dist/licenses/pdfjs-dist.txt +177 -0
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/CommandList.js +638 -0
- package/dist/ssr/actions/CommandList.js.map +1 -0
- package/dist/ssr/actions/CommandMenu.js +197 -0
- package/dist/ssr/actions/CommandMenu.js.map +1 -0
- package/dist/ssr/actions/Dropdown.js +43 -10
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/Toolbar.js +8 -2
- package/dist/ssr/actions/Toolbar.js.map +1 -1
- package/dist/ssr/actions/command-dock.js +47 -0
- package/dist/ssr/actions/command-dock.js.map +1 -0
- package/dist/ssr/actions/command-items.js +84 -0
- package/dist/ssr/actions/command-items.js.map +1 -0
- package/dist/ssr/actions/command-messages.js +42 -0
- package/dist/ssr/actions/command-messages.js.map +1 -0
- package/dist/ssr/actions/index.js +1 -0
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/charts/core/area.js +3 -5
- package/dist/ssr/charts/core/area.js.map +1 -1
- package/dist/ssr/charts/core/bar-labels.js +5 -0
- package/dist/ssr/charts/core/bar-labels.js.map +1 -0
- package/dist/ssr/charts/core/bubble.js +166 -0
- package/dist/ssr/charts/core/bubble.js.map +1 -0
- package/dist/ssr/charts/core/calendar.js +1 -1
- package/dist/ssr/charts/core/calendar.js.map +1 -1
- package/dist/ssr/charts/core/chart-messages.js +17 -0
- package/dist/ssr/charts/core/chart-messages.js.map +1 -0
- package/dist/ssr/charts/core/default-styles.js +83 -0
- package/dist/ssr/charts/core/default-styles.js.map +1 -0
- package/dist/ssr/charts/core/funnel-layout.js +79 -0
- package/dist/ssr/charts/core/funnel-layout.js.map +1 -0
- package/dist/ssr/charts/core/funnel.js +27 -0
- package/dist/ssr/charts/core/funnel.js.map +1 -0
- package/dist/ssr/charts/core/hbar-layout.js +118 -0
- package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
- package/dist/ssr/charts/core/hbar.js +39 -0
- package/dist/ssr/charts/core/hbar.js.map +1 -0
- package/dist/ssr/charts/core/index.js +12 -2
- package/dist/ssr/charts/core/index.js.map +1 -1
- package/dist/ssr/charts/core/map.js +116 -0
- package/dist/ssr/charts/core/map.js.map +1 -0
- package/dist/ssr/charts/core/pareto.js +120 -0
- package/dist/ssr/charts/core/pareto.js.map +1 -0
- package/dist/ssr/charts/core/radar.js +101 -0
- package/dist/ssr/charts/core/radar.js.map +1 -0
- package/dist/ssr/charts/core/registry.js +33 -16
- package/dist/ssr/charts/core/registry.js.map +1 -1
- package/dist/ssr/charts/core/render-size.js +15 -0
- package/dist/ssr/charts/core/render-size.js.map +1 -0
- package/dist/ssr/charts/core/render.js +39 -10
- package/dist/ssr/charts/core/render.js.map +1 -1
- package/dist/ssr/charts/core/snapshot.js +4 -4
- package/dist/ssr/charts/core/snapshot.js.map +1 -1
- package/dist/ssr/charts/core/svg-barGauge.js +67 -0
- package/dist/ssr/charts/core/svg-barGauge.js.map +1 -0
- package/dist/ssr/charts/core/svg-boxplot.js +127 -0
- package/dist/ssr/charts/core/svg-boxplot.js.map +1 -0
- package/dist/ssr/charts/core/svg-common.js +1065 -0
- package/dist/ssr/charts/core/svg-common.js.map +1 -0
- package/dist/ssr/charts/core/svg-gauge.js +185 -0
- package/dist/ssr/charts/core/svg-gauge.js.map +1 -0
- package/dist/ssr/charts/core/svg-heatmap.js +80 -0
- package/dist/ssr/charts/core/svg-heatmap.js.map +1 -0
- package/dist/ssr/charts/core/svg-histogram.js +73 -0
- package/dist/ssr/charts/core/svg-histogram.js.map +1 -0
- package/dist/ssr/charts/core/svg-renderers.js +638 -0
- package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
- package/dist/ssr/charts/core/svg-scatter.js +114 -0
- package/dist/ssr/charts/core/svg-scatter.js.map +1 -0
- package/dist/ssr/charts/core/svg.js +4 -2525
- package/dist/ssr/charts/core/svg.js.map +1 -1
- package/dist/ssr/charts/core/treemap.js +138 -0
- package/dist/ssr/charts/core/treemap.js.map +1 -0
- package/dist/ssr/charts/core/types.js +0 -2
- package/dist/ssr/charts/core/types.js.map +1 -1
- package/dist/ssr/charts/core/waterfall.js +162 -0
- package/dist/ssr/charts/core/waterfall.js.map +1 -0
- package/dist/ssr/charts/description.js +2 -0
- package/dist/ssr/charts/description.js.map +1 -0
- package/dist/ssr/charts.js.map +1 -1
- package/dist/ssr/content/Chart.js +14 -471
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartRoot.js +489 -0
- package/dist/ssr/content/ChartRoot.js.map +1 -0
- package/dist/ssr/content/ChartSnapshotView.js +1 -0
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/ChartSparkline.js +24 -0
- package/dist/ssr/content/ChartSparkline.js.map +1 -0
- package/dist/ssr/content/DataTable.js +12 -16
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/FileView.js +56 -7
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +39 -10
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/MapView.js +9 -9
- package/dist/ssr/content/MapView.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +49 -20
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/PdfViewer.js +484 -0
- package/dist/ssr/content/PdfViewer.js.map +1 -0
- package/dist/ssr/content/ThumbnailStrip.js +103 -0
- package/dist/ssr/content/ThumbnailStrip.js.map +1 -0
- package/dist/ssr/content/chart-bar.js +344 -16
- package/dist/ssr/content/chart-bar.js.map +1 -1
- package/dist/ssr/content/chart-inspection-core.js +50 -29
- package/dist/ssr/content/chart-inspection-core.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js +1 -1
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-message-catalog.js +28 -0
- package/dist/ssr/content/chart-message-catalog.js.map +1 -1
- package/dist/ssr/content/chart-state-timeline.js +1 -1
- package/dist/ssr/content/chart-state-timeline.js.map +1 -1
- package/dist/ssr/content/chart-svg.js +2 -1
- package/dist/ssr/content/chart-svg.js.map +1 -1
- package/dist/ssr/content/index.js +2 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/pdf-document.js +29 -0
- package/dist/ssr/content/pdf-document.js.map +1 -0
- package/dist/ssr/content/pdf-limits.js +31 -0
- package/dist/ssr/content/pdf-limits.js.map +1 -0
- package/dist/ssr/content/pdf-messages.js +34 -2
- package/dist/ssr/content/pdf-messages.js.map +1 -1
- package/dist/ssr/content/thumbnail-strip-messages.js +24 -0
- package/dist/ssr/content/thumbnail-strip-messages.js.map +1 -0
- package/dist/ssr/inputs/ChoiceInputs.js +69 -17
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/ChoiceSlider.js +17 -12
- package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +14 -9
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/PeriodPicker.js +598 -0
- package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
- package/dist/ssr/inputs/index.js +5 -1
- package/dist/ssr/inputs/index.js.map +1 -1
- package/dist/ssr/inputs/input-messages.js +8 -2
- package/dist/ssr/inputs/input-messages.js.map +1 -1
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/ssr/inputs/markdown/MarkdownSelectionToolbar.js +293 -0
- package/dist/ssr/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
- package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
- package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
- package/dist/ssr/inputs/period-picker-messages.js +71 -0
- package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
- package/dist/ssr/inputs/period.js +263 -0
- package/dist/ssr/inputs/period.js.map +1 -0
- package/dist/ssr/internal/field.js +36 -24
- package/dist/ssr/internal/field.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +5 -1
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/DetailPanel.js +27 -4
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +16 -2
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/PanelDialog.js +40 -26
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/DescriptionList.js +1 -1
- package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +31 -21
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/delta-badge.js +16 -2
- package/dist/ssr/surfaces/delta-badge.js.map +1 -1
- package/dist/ssr/surfaces/stat-cell-messages.js +4 -2
- package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -1
- package/dist/ssr/widgets/DashboardFrame.js +195 -0
- package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
- package/dist/ssr/widgets/index.js +1 -0
- package/dist/ssr/widgets/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Button.d.ts +1 -1
- package/dist/types/actions/CommandList.d.ts +120 -0
- package/dist/types/actions/CommandMenu.d.ts +39 -0
- package/dist/types/actions/Dropdown.d.ts +17 -0
- package/dist/types/actions/Toolbar.d.ts +2 -0
- package/dist/types/actions/command-dock.d.ts +8 -0
- package/dist/types/actions/command-items.d.ts +134 -0
- package/dist/types/actions/command-messages.d.ts +19 -0
- package/dist/types/actions/index.d.ts +3 -0
- package/dist/types/charts/core/bar-labels.d.ts +1 -0
- package/dist/types/charts/core/bubble.d.ts +66 -0
- package/dist/types/charts/core/calendar.d.ts +1 -1
- package/dist/types/charts/core/chart-messages.d.ts +5 -0
- package/dist/types/charts/core/default-styles.d.ts +1 -0
- package/dist/types/charts/core/funnel-layout.d.ts +43 -0
- package/dist/types/charts/core/funnel.d.ts +13 -0
- package/dist/types/charts/core/hbar-layout.d.ts +74 -0
- package/dist/types/charts/core/hbar.d.ts +13 -0
- package/dist/types/charts/core/index.d.ts +12 -2
- package/dist/types/charts/core/map.d.ts +3 -0
- package/dist/types/charts/core/pareto.d.ts +40 -0
- package/dist/types/charts/core/radar.d.ts +47 -0
- package/dist/types/charts/core/registry.d.ts +27 -11
- package/dist/types/charts/core/render-size.d.ts +7 -0
- package/dist/types/charts/core/render.d.ts +1 -4
- package/dist/types/charts/core/snapshot.d.ts +2 -2
- package/dist/types/charts/core/svg-barGauge.d.ts +3 -0
- package/dist/types/charts/core/svg-boxplot.d.ts +18 -0
- package/dist/types/charts/core/svg-common.d.ts +612 -0
- package/dist/types/charts/core/svg-gauge.d.ts +6 -0
- package/dist/types/charts/core/svg-heatmap.d.ts +6 -0
- package/dist/types/charts/core/svg-histogram.d.ts +16 -0
- package/dist/types/charts/core/svg-renderers.d.ts +118 -0
- package/dist/types/charts/core/svg-scatter.d.ts +23 -0
- package/dist/types/charts/core/svg.d.ts +4 -698
- package/dist/types/charts/core/treemap.d.ts +45 -0
- package/dist/types/charts/core/types.d.ts +1 -12
- package/dist/types/charts/core/waterfall.d.ts +68 -0
- package/dist/types/charts/description.d.ts +289 -0
- package/dist/types/charts.d.ts +1 -0
- package/dist/types/content/Chart.d.ts +3 -91
- package/dist/types/content/ChartRoot.d.ts +92 -0
- package/dist/types/content/ChartSparkline.d.ts +5 -0
- package/dist/types/content/Lightbox.d.ts +2 -0
- package/dist/types/content/PdfViewer.d.ts +32 -0
- package/dist/types/content/ThumbnailStrip.d.ts +29 -0
- package/dist/types/content/chart-bar.d.ts +131 -2
- package/dist/types/content/chart-inspection-core.d.ts +7 -0
- package/dist/types/content/chart-inspection.d.ts +1 -0
- package/dist/types/content/chart-message-catalog.d.ts +8 -0
- package/dist/types/content/index.d.ts +3 -0
- package/dist/types/content/pdf-document.d.ts +5 -0
- package/dist/types/content/pdf-engine.d.ts +9 -0
- package/dist/types/content/pdf-limits.d.ts +43 -0
- package/dist/types/content/pdf-messages.d.ts +16 -0
- package/dist/types/content/thumbnail-strip-messages.d.ts +10 -0
- package/dist/types/inputs/ChoiceInputs.d.ts +6 -0
- package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
- package/dist/types/inputs/DatePicker.d.ts +22 -0
- package/dist/types/inputs/PeriodPicker.d.ts +24 -0
- package/dist/types/inputs/index.d.ts +10 -2
- package/dist/types/inputs/input-messages.d.ts +3 -0
- package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
- package/dist/types/inputs/markdown/MarkdownSelectionToolbar.d.ts +19 -0
- package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
- package/dist/types/inputs/period-picker-messages.d.ts +34 -0
- package/dist/types/inputs/period.d.ts +134 -0
- package/dist/types/internal/field.d.ts +2 -0
- package/dist/types/layout/DetailPanel.d.ts +12 -0
- package/dist/types/layout/PanelDialog.d.ts +5 -0
- package/dist/types/layout/index.d.ts +1 -1
- package/dist/types/surfaces/DescriptionList.d.ts +5 -0
- package/dist/types/surfaces/StatCell.d.ts +6 -1
- package/dist/types/surfaces/stat-cell-messages.d.ts +1 -0
- package/dist/types/widgets/DashboardFrame.d.ts +61 -0
- package/dist/types/widgets/index.d.ts +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
2
|
+
import { escape as _$escape } from "solid-js/web";
|
|
3
|
+
import { ssrStyleProperty as _$ssrStyleProperty } from "solid-js/web";
|
|
4
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
5
|
+
var _tmpl$ = ["<div style=\"", "\">", "", "", "", "", "", "", "", "</div>"];
|
|
6
|
+
import { i18n } from "@k2b/stdlib";
|
|
7
|
+
import { batch, createEffect, createMemo, createSignal, onCleanup, onMount, Show } from "solid-js";
|
|
8
|
+
import { SelectionToolbar } from "../../actions/SelectionToolbar";
|
|
9
|
+
import { Toolbar } from "../../actions/Toolbar";
|
|
10
|
+
import { useLocale } from "../../intl/locale";
|
|
11
|
+
import { insertLink, toggleBold, toggleBulletList, toggleCode, toggleItalic, toggleNumberedList, toggleQuote } from "./actions";
|
|
12
|
+
import { computeActiveFormats } from "./active-formats";
|
|
13
|
+
const selectionMessages = i18n.define({
|
|
14
|
+
baseLocale: "en",
|
|
15
|
+
messages: {
|
|
16
|
+
en: {
|
|
17
|
+
bold: "Bold",
|
|
18
|
+
italic: "Italic",
|
|
19
|
+
inlineCode: "Inline code",
|
|
20
|
+
link: "Link",
|
|
21
|
+
bulletList: "Bullet list",
|
|
22
|
+
numberedList: "Numbered list",
|
|
23
|
+
quote: "Quote",
|
|
24
|
+
selectionFormatting: "Format selection"
|
|
25
|
+
},
|
|
26
|
+
de: {
|
|
27
|
+
bold: "Fett",
|
|
28
|
+
italic: "Kursiv",
|
|
29
|
+
inlineCode: "Inline-Code",
|
|
30
|
+
link: "Link",
|
|
31
|
+
bulletList: "Aufzählung",
|
|
32
|
+
numberedList: "Nummerierte Liste",
|
|
33
|
+
quote: "Zitat",
|
|
34
|
+
selectionFormatting: "Auswahl formatieren"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
export const checkSelectionMessages = () => selectionMessages.check();
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The box of a text range's first line in the editor's mirrored presentation layer, or nothing when that line is
|
|
42
|
+
* scrolled out of the surface. The layer holds the same text as the textarea, so its text nodes map offsets to places.
|
|
43
|
+
*/
|
|
44
|
+
export const textRangeBox = (layer, surface, start, end) => {
|
|
45
|
+
const walker = document.createTreeWalker(layer, 4 /* NodeFilter.SHOW_TEXT */);
|
|
46
|
+
let offset = 0;
|
|
47
|
+
let from;
|
|
48
|
+
let to;
|
|
49
|
+
for (let node = walker.nextNode(); node; node = walker.nextNode()) {
|
|
50
|
+
const length = node.textContent?.length ?? 0;
|
|
51
|
+
if (!from && start <= offset + length) from = [node, start - offset];
|
|
52
|
+
if (end <= offset + length) {
|
|
53
|
+
to = [node, end - offset];
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
offset += length;
|
|
57
|
+
}
|
|
58
|
+
if (!from || !to) return null;
|
|
59
|
+
const range = document.createRange();
|
|
60
|
+
range.setStart(...from);
|
|
61
|
+
range.setEnd(...to);
|
|
62
|
+
const rects = Array.from(range.getClientRects()).filter(rect => rect.width > 0 || rect.height > 0);
|
|
63
|
+
const first = rects[0];
|
|
64
|
+
if (!first) return null;
|
|
65
|
+
const line = rects.filter(rect => Math.abs(rect.top - first.top) < 4);
|
|
66
|
+
const multiline = line.length < rects.length;
|
|
67
|
+
const right = multiline ? layer.getBoundingClientRect().right : Math.max(...line.map(rect => rect.right));
|
|
68
|
+
const visible = surface.getBoundingClientRect();
|
|
69
|
+
if (first.bottom <= visible.top || first.top >= visible.bottom) return null;
|
|
70
|
+
return new DOMRect(first.left, first.top, Math.max(1, right - first.left), first.height);
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* A small formatting toolbar that floats above selected text in a `MarkdownEditor`: bold, italic, code, link, lists, and
|
|
74
|
+
* quote. Place it beside an editor with `noToolbar` and pass the editor's textarea. It appears once the pointer lets go
|
|
75
|
+
* of a selection and closes on Escape, a collapsed selection, or when the focus leaves both text and toolbar. Touch
|
|
76
|
+
* devices keep their own selection menu, so nothing of it renders there; the keyboard shortcuts work everywhere. It
|
|
77
|
+
* listens to the textarea itself, so editors without it carry none of its code.
|
|
78
|
+
*/
|
|
79
|
+
export function MarkdownSelectionToolbar(props) {
|
|
80
|
+
return _$createComponent(Show, {
|
|
81
|
+
get when() {
|
|
82
|
+
return props.textarea;
|
|
83
|
+
},
|
|
84
|
+
children: textarea => _$createComponent(SelectionFormatting, {
|
|
85
|
+
get textarea() {
|
|
86
|
+
return textarea();
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function SelectionFormatting(props) {
|
|
92
|
+
const locale = useLocale();
|
|
93
|
+
const messages = () => selectionMessages.resolve([locale()]).t;
|
|
94
|
+
const textarea = props.textarea;
|
|
95
|
+
// The editor's surface and its presentation layer: the same text as the textarea, laid out the same way.
|
|
96
|
+
const surface = textarea.parentElement ?? textarea;
|
|
97
|
+
const layer = surface.querySelector(".k2b-markdown-editor__preview") ?? surface;
|
|
98
|
+
const [revision, setRevision] = createSignal(0);
|
|
99
|
+
const bump = () => setRevision(value => value + 1);
|
|
100
|
+
const [finePointer, setFinePointer] = createSignal(false);
|
|
101
|
+
const [dragging, setDragging] = createSignal(false);
|
|
102
|
+
const [textFocused, setTextFocused] = createSignal(document.activeElement === textarea);
|
|
103
|
+
const [toolbarFocused, setToolbarFocused] = createSignal(false);
|
|
104
|
+
const [dismissed, setDismissed] = createSignal();
|
|
105
|
+
let root;
|
|
106
|
+
const selectionKey = () => `${textarea.selectionStart}:${textarea.selectionEnd}`;
|
|
107
|
+
const anchor = () => {
|
|
108
|
+
revision();
|
|
109
|
+
if (textarea.disabled || !finePointer() || dragging() || !(textFocused() || toolbarFocused())) return null;
|
|
110
|
+
if (textarea.selectionStart === textarea.selectionEnd || dismissed() === selectionKey()) return null;
|
|
111
|
+
return textRangeBox(layer, surface, textarea.selectionStart, textarea.selectionEnd);
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// Escape closes the toolbar for that one selection: a collapsed selection forgets it, so selecting the same words
|
|
115
|
+
// again shows it again.
|
|
116
|
+
createEffect(() => {
|
|
117
|
+
revision();
|
|
118
|
+
if (textarea.selectionStart === textarea.selectionEnd) setDismissed(undefined);
|
|
119
|
+
});
|
|
120
|
+
onMount(() => {
|
|
121
|
+
const query = window.matchMedia("(pointer: coarse)");
|
|
122
|
+
const update = () => setFinePointer(!query.matches);
|
|
123
|
+
update();
|
|
124
|
+
const press = () => {
|
|
125
|
+
setDismissed(undefined);
|
|
126
|
+
setDragging(true);
|
|
127
|
+
const release = () => {
|
|
128
|
+
setDragging(false);
|
|
129
|
+
document.removeEventListener("pointerup", release, true);
|
|
130
|
+
document.removeEventListener("pointercancel", release, true);
|
|
131
|
+
};
|
|
132
|
+
document.addEventListener("pointerup", release, true);
|
|
133
|
+
document.addEventListener("pointercancel", release, true);
|
|
134
|
+
};
|
|
135
|
+
const key = event => {
|
|
136
|
+
if (event.key === "Escape") {
|
|
137
|
+
if (event.defaultPrevented || !anchor()) return;
|
|
138
|
+
event.preventDefault();
|
|
139
|
+
setDismissed(selectionKey());
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Selection changes can arrive as one event, so the next key that may select again forgets Escape too.
|
|
143
|
+
if (!["Shift", "Control", "Meta", "Alt"].includes(event.key)) setDismissed(undefined);
|
|
144
|
+
};
|
|
145
|
+
const focus = () => setTextFocused(true);
|
|
146
|
+
const blur = event => batch(() => {
|
|
147
|
+
// Tab into the toolbar keeps it open: the toolbar takes the focus in the same move.
|
|
148
|
+
if (event.relatedTarget instanceof Node && root?.contains(event.relatedTarget)) setToolbarFocused(true);
|
|
149
|
+
setTextFocused(false);
|
|
150
|
+
});
|
|
151
|
+
const selection = () => {
|
|
152
|
+
if (document.activeElement === textarea) bump();
|
|
153
|
+
};
|
|
154
|
+
// The presentation layer renders a frame after an edit; the toolbar measures again once it did.
|
|
155
|
+
const layerElement = layer;
|
|
156
|
+
const layerObserver = new MutationObserver(bump);
|
|
157
|
+
layerObserver.observe(layerElement, {
|
|
158
|
+
childList: true,
|
|
159
|
+
subtree: true,
|
|
160
|
+
characterData: true
|
|
161
|
+
});
|
|
162
|
+
query.addEventListener("change", update);
|
|
163
|
+
textarea.addEventListener("pointerdown", press);
|
|
164
|
+
textarea.addEventListener("keydown", key);
|
|
165
|
+
textarea.addEventListener("focus", focus);
|
|
166
|
+
textarea.addEventListener("blur", blur);
|
|
167
|
+
textarea.addEventListener("input", bump);
|
|
168
|
+
// The toolbar hides while its line is scrolled away and shows again when it returns.
|
|
169
|
+
textarea.addEventListener("scroll", bump);
|
|
170
|
+
document.addEventListener("selectionchange", selection);
|
|
171
|
+
onCleanup(() => {
|
|
172
|
+
layerObserver.disconnect();
|
|
173
|
+
query.removeEventListener("change", update);
|
|
174
|
+
textarea.removeEventListener("pointerdown", press);
|
|
175
|
+
textarea.removeEventListener("keydown", key);
|
|
176
|
+
textarea.removeEventListener("focus", focus);
|
|
177
|
+
textarea.removeEventListener("blur", blur);
|
|
178
|
+
textarea.removeEventListener("input", bump);
|
|
179
|
+
textarea.removeEventListener("scroll", bump);
|
|
180
|
+
document.removeEventListener("selectionchange", selection);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
const run = format => () => format(textarea);
|
|
184
|
+
const formats = createMemo(() => {
|
|
185
|
+
revision();
|
|
186
|
+
return computeActiveFormats(textarea);
|
|
187
|
+
});
|
|
188
|
+
const pressed = format => formats().has(format);
|
|
189
|
+
|
|
190
|
+
// Touch devices keep their own selection menu: the toolbar is not rendered there at all, so nothing of it mounts
|
|
191
|
+
// or animates.
|
|
192
|
+
return _$createComponent(Show, {
|
|
193
|
+
get when() {
|
|
194
|
+
return finePointer();
|
|
195
|
+
},
|
|
196
|
+
get children() {
|
|
197
|
+
return _$createComponent(SelectionToolbar, {
|
|
198
|
+
get label() {
|
|
199
|
+
return messages().selectionFormatting;
|
|
200
|
+
},
|
|
201
|
+
anchor: anchor,
|
|
202
|
+
onEscape: () => {
|
|
203
|
+
setDismissed(selectionKey());
|
|
204
|
+
textarea.focus();
|
|
205
|
+
},
|
|
206
|
+
get children() {
|
|
207
|
+
return _$ssr(_tmpl$, _$ssrStyleProperty("display:", "contents"), _$escape(_$createComponent(Toolbar.Action, {
|
|
208
|
+
get label() {
|
|
209
|
+
return messages().bold;
|
|
210
|
+
},
|
|
211
|
+
icon: "ti ti-bold",
|
|
212
|
+
get pressed() {
|
|
213
|
+
return pressed("bold");
|
|
214
|
+
},
|
|
215
|
+
keys: "mod+b",
|
|
216
|
+
get onClick() {
|
|
217
|
+
return run(toggleBold);
|
|
218
|
+
}
|
|
219
|
+
})), _$escape(_$createComponent(Toolbar.Action, {
|
|
220
|
+
get label() {
|
|
221
|
+
return messages().italic;
|
|
222
|
+
},
|
|
223
|
+
icon: "ti ti-italic",
|
|
224
|
+
get pressed() {
|
|
225
|
+
return pressed("italic");
|
|
226
|
+
},
|
|
227
|
+
keys: "mod+i",
|
|
228
|
+
get onClick() {
|
|
229
|
+
return run(toggleItalic);
|
|
230
|
+
}
|
|
231
|
+
})), _$escape(_$createComponent(Toolbar.Action, {
|
|
232
|
+
get label() {
|
|
233
|
+
return messages().inlineCode;
|
|
234
|
+
},
|
|
235
|
+
icon: "ti ti-code",
|
|
236
|
+
get pressed() {
|
|
237
|
+
return pressed("code");
|
|
238
|
+
},
|
|
239
|
+
keys: "mod+e",
|
|
240
|
+
get onClick() {
|
|
241
|
+
return run(toggleCode);
|
|
242
|
+
}
|
|
243
|
+
})), _$escape(_$createComponent(Toolbar.Action, {
|
|
244
|
+
get label() {
|
|
245
|
+
return messages().link;
|
|
246
|
+
},
|
|
247
|
+
icon: "ti ti-link",
|
|
248
|
+
keys: "mod+k",
|
|
249
|
+
get onClick() {
|
|
250
|
+
return run(insertLink);
|
|
251
|
+
}
|
|
252
|
+
})), _$escape(_$createComponent(Toolbar.Separator, {})), _$escape(_$createComponent(Toolbar.Action, {
|
|
253
|
+
get label() {
|
|
254
|
+
return messages().bulletList;
|
|
255
|
+
},
|
|
256
|
+
icon: "ti ti-list",
|
|
257
|
+
get pressed() {
|
|
258
|
+
return pressed("bullet");
|
|
259
|
+
},
|
|
260
|
+
keys: "mod+shift+8",
|
|
261
|
+
get onClick() {
|
|
262
|
+
return run(toggleBulletList);
|
|
263
|
+
}
|
|
264
|
+
})), _$escape(_$createComponent(Toolbar.Action, {
|
|
265
|
+
get label() {
|
|
266
|
+
return messages().numberedList;
|
|
267
|
+
},
|
|
268
|
+
icon: "ti ti-list-numbers",
|
|
269
|
+
get pressed() {
|
|
270
|
+
return pressed("ordered");
|
|
271
|
+
},
|
|
272
|
+
keys: "mod+shift+7",
|
|
273
|
+
get onClick() {
|
|
274
|
+
return run(toggleNumberedList);
|
|
275
|
+
}
|
|
276
|
+
})), _$escape(_$createComponent(Toolbar.Action, {
|
|
277
|
+
get label() {
|
|
278
|
+
return messages().quote;
|
|
279
|
+
},
|
|
280
|
+
icon: "ti ti-quote",
|
|
281
|
+
get pressed() {
|
|
282
|
+
return pressed("quote");
|
|
283
|
+
},
|
|
284
|
+
get onClick() {
|
|
285
|
+
return run(toggleQuote);
|
|
286
|
+
}
|
|
287
|
+
})));
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=MarkdownSelectionToolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/markdown/MarkdownSelectionToolbar.tsx"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { batch, createEffect, createMemo, createSignal, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { SelectionToolbar } from \"../../actions/SelectionToolbar\";\nimport { Toolbar } from \"../../actions/Toolbar\";\nimport { useLocale } from \"../../intl/locale\";\nimport { insertLink, toggleBold, toggleBulletList, toggleCode, toggleItalic, toggleNumberedList, toggleQuote } from \"./actions\";\nimport { computeActiveFormats } from \"./active-formats\";\n\nconst selectionMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n bold: \"Bold\",\n italic: \"Italic\",\n inlineCode: \"Inline code\",\n link: \"Link\",\n bulletList: \"Bullet list\",\n numberedList: \"Numbered list\",\n quote: \"Quote\",\n selectionFormatting: \"Format selection\",\n },\n de: {\n bold: \"Fett\",\n italic: \"Kursiv\",\n inlineCode: \"Inline-Code\",\n link: \"Link\",\n bulletList: \"Aufzählung\",\n numberedList: \"Nummerierte Liste\",\n quote: \"Zitat\",\n selectionFormatting: \"Auswahl formatieren\",\n },\n },\n});\n\nexport const checkSelectionMessages = () => selectionMessages.check();\n\n/**\n * The box of a text range's first line in the editor's mirrored presentation layer, or nothing when that line is\n * scrolled out of the surface. The layer holds the same text as the textarea, so its text nodes map offsets to places.\n */\nexport const textRangeBox = (layer: HTMLElement, surface: HTMLElement, start: number, end: number): DOMRect | null => {\n const walker = document.createTreeWalker(layer, 4 /* NodeFilter.SHOW_TEXT */);\n let offset = 0;\n let from: [Node, number] | undefined;\n let to: [Node, number] | undefined;\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n const length = node.textContent?.length ?? 0;\n if (!from && start <= offset + length) from = [node, start - offset];\n if (end <= offset + length) {\n to = [node, end - offset];\n break;\n }\n offset += length;\n }\n if (!from || !to) return null;\n const range = document.createRange();\n range.setStart(...from);\n range.setEnd(...to);\n const rects = Array.from(range.getClientRects()).filter((rect) => rect.width > 0 || rect.height > 0);\n const first = rects[0];\n if (!first) return null;\n const line = rects.filter((rect) => Math.abs(rect.top - first.top) < 4);\n const multiline = line.length < rects.length;\n const right = multiline ? layer.getBoundingClientRect().right : Math.max(...line.map((rect) => rect.right));\n const visible = surface.getBoundingClientRect();\n if (first.bottom <= visible.top || first.top >= visible.bottom) return null;\n return new DOMRect(first.left, first.top, Math.max(1, right - first.left), first.height);\n};\n\nexport type MarkdownSelectionToolbarProps = {\n /** The editor's textarea, from `MarkdownEditor`'s `textareaRef`. The toolbar attaches once it is there. */\n textarea: HTMLTextAreaElement | undefined;\n};\n\n/**\n * A small formatting toolbar that floats above selected text in a `MarkdownEditor`: bold, italic, code, link, lists, and\n * quote. Place it beside an editor with `noToolbar` and pass the editor's textarea. It appears once the pointer lets go\n * of a selection and closes on Escape, a collapsed selection, or when the focus leaves both text and toolbar. Touch\n * devices keep their own selection menu, so nothing of it renders there; the keyboard shortcuts work everywhere. It\n * listens to the textarea itself, so editors without it carry none of its code.\n */\nexport function MarkdownSelectionToolbar(props: MarkdownSelectionToolbarProps): JSX.Element {\n return <Show when={props.textarea}>{(textarea) => <SelectionFormatting textarea={textarea()} />}</Show>;\n}\n\nfunction SelectionFormatting(props: { textarea: HTMLTextAreaElement }): JSX.Element {\n const locale = useLocale();\n const messages = () => selectionMessages.resolve([locale()]).t;\n const textarea = props.textarea;\n // The editor's surface and its presentation layer: the same text as the textarea, laid out the same way.\n const surface = textarea.parentElement ?? textarea;\n const layer = surface.querySelector<HTMLElement>(\".k2b-markdown-editor__preview\") ?? surface;\n const [revision, setRevision] = createSignal(0);\n const bump = () => setRevision((value) => value + 1);\n const [finePointer, setFinePointer] = createSignal(false);\n const [dragging, setDragging] = createSignal(false);\n const [textFocused, setTextFocused] = createSignal(document.activeElement === textarea);\n const [toolbarFocused, setToolbarFocused] = createSignal(false);\n const [dismissed, setDismissed] = createSignal<string>();\n let root: HTMLDivElement | undefined;\n\n const selectionKey = () => `${textarea.selectionStart}:${textarea.selectionEnd}`;\n const anchor = () => {\n revision();\n if (textarea.disabled || !finePointer() || dragging() || !(textFocused() || toolbarFocused())) return null;\n if (textarea.selectionStart === textarea.selectionEnd || dismissed() === selectionKey()) return null;\n return textRangeBox(layer, surface, textarea.selectionStart, textarea.selectionEnd);\n };\n\n // Escape closes the toolbar for that one selection: a collapsed selection forgets it, so selecting the same words\n // again shows it again.\n createEffect(() => {\n revision();\n if (textarea.selectionStart === textarea.selectionEnd) setDismissed(undefined);\n });\n\n onMount(() => {\n const query = window.matchMedia(\"(pointer: coarse)\");\n const update = () => setFinePointer(!query.matches);\n update();\n const press = () => {\n setDismissed(undefined);\n setDragging(true);\n const release = () => {\n setDragging(false);\n document.removeEventListener(\"pointerup\", release, true);\n document.removeEventListener(\"pointercancel\", release, true);\n };\n document.addEventListener(\"pointerup\", release, true);\n document.addEventListener(\"pointercancel\", release, true);\n };\n const key = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n if (event.defaultPrevented || !anchor()) return;\n event.preventDefault();\n setDismissed(selectionKey());\n return;\n }\n // Selection changes can arrive as one event, so the next key that may select again forgets Escape too.\n if (![\"Shift\", \"Control\", \"Meta\", \"Alt\"].includes(event.key)) setDismissed(undefined);\n };\n const focus = () => setTextFocused(true);\n const blur = (event: FocusEvent) =>\n batch(() => {\n // Tab into the toolbar keeps it open: the toolbar takes the focus in the same move.\n if (event.relatedTarget instanceof Node && root?.contains(event.relatedTarget)) setToolbarFocused(true);\n setTextFocused(false);\n });\n const selection = () => {\n if (document.activeElement === textarea) bump();\n };\n // The presentation layer renders a frame after an edit; the toolbar measures again once it did.\n const layerElement = layer;\n const layerObserver = new MutationObserver(bump);\n layerObserver.observe(layerElement, { childList: true, subtree: true, characterData: true });\n query.addEventListener(\"change\", update);\n textarea.addEventListener(\"pointerdown\", press);\n textarea.addEventListener(\"keydown\", key);\n textarea.addEventListener(\"focus\", focus);\n textarea.addEventListener(\"blur\", blur);\n textarea.addEventListener(\"input\", bump);\n // The toolbar hides while its line is scrolled away and shows again when it returns.\n textarea.addEventListener(\"scroll\", bump);\n document.addEventListener(\"selectionchange\", selection);\n onCleanup(() => {\n layerObserver.disconnect();\n query.removeEventListener(\"change\", update);\n textarea.removeEventListener(\"pointerdown\", press);\n textarea.removeEventListener(\"keydown\", key);\n textarea.removeEventListener(\"focus\", focus);\n textarea.removeEventListener(\"blur\", blur);\n textarea.removeEventListener(\"input\", bump);\n textarea.removeEventListener(\"scroll\", bump);\n document.removeEventListener(\"selectionchange\", selection);\n });\n });\n\n const run = (format: (textarea: HTMLTextAreaElement) => void) => () => format(textarea);\n const formats = createMemo(() => {\n revision();\n return computeActiveFormats(textarea);\n });\n const pressed = (format: string) => formats().has(format);\n\n // Touch devices keep their own selection menu: the toolbar is not rendered there at all, so nothing of it mounts\n // or animates.\n return (\n <Show when={finePointer()}>\n <SelectionToolbar\n label={messages().selectionFormatting}\n anchor={anchor}\n onEscape={() => {\n setDismissed(selectionKey());\n textarea.focus();\n }}\n >\n <div\n ref={root}\n style={{ display: \"contents\" }}\n onFocusIn={() => setToolbarFocused(true)}\n onFocusOut={(event) => {\n if (!(event.relatedTarget instanceof Node && event.currentTarget.contains(event.relatedTarget))) setToolbarFocused(false);\n }}\n >\n <Toolbar.Action label={messages().bold} icon=\"ti ti-bold\" pressed={pressed(\"bold\")} keys=\"mod+b\" onClick={run(toggleBold)} />\n <Toolbar.Action\n label={messages().italic}\n icon=\"ti ti-italic\"\n pressed={pressed(\"italic\")}\n keys=\"mod+i\"\n onClick={run(toggleItalic)}\n />\n <Toolbar.Action\n label={messages().inlineCode}\n icon=\"ti ti-code\"\n pressed={pressed(\"code\")}\n keys=\"mod+e\"\n onClick={run(toggleCode)}\n />\n <Toolbar.Action label={messages().link} icon=\"ti ti-link\" keys=\"mod+k\" onClick={run(insertLink)} />\n <Toolbar.Separator />\n <Toolbar.Action\n label={messages().bulletList}\n icon=\"ti ti-list\"\n pressed={pressed(\"bullet\")}\n keys=\"mod+shift+8\"\n onClick={run(toggleBulletList)}\n />\n <Toolbar.Action\n label={messages().numberedList}\n icon=\"ti ti-list-numbers\"\n pressed={pressed(\"ordered\")}\n keys=\"mod+shift+7\"\n onClick={run(toggleNumberedList)}\n />\n <Toolbar.Action label={messages().quote} icon=\"ti ti-quote\" pressed={pressed(\"quote\")} onClick={run(toggleQuote)} />\n </div>\n </SelectionToolbar>\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
2
|
+
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
3
|
+
import { escape as _$escape } from "solid-js/web";
|
|
4
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
5
|
+
var _tmpl$ = ["<div popover=\"manual\" class=\"k2b-autocomplete__options\" data-commands", " role=\"presentation\">", "</div>"],
|
|
6
|
+
_tmpl$2 = ["<label class=\"k2b-dropdown__search\"><i class=\"ti ti-search\" aria-hidden=\"true\"></i><input type=\"search\" role=\"combobox\"", " aria-expanded=\"true\"", " aria-autocomplete=\"list\"", " autocomplete=\"off\" spellcheck=\"false\" enterkeyhint=\"go\"", "></label>"];
|
|
7
|
+
import { createEffect, createMemo, createSignal, onCleanup, onMount, Show } from "solid-js";
|
|
8
|
+
import { CommandList, commandListKey, commandOptionId, createCommandNavigator } from "../../actions/CommandList";
|
|
9
|
+
import { dockCommandList, followComposer } from "../../actions/command-dock";
|
|
10
|
+
import { commandPlace } from "../../actions/command-items";
|
|
11
|
+
import { useCommandMessages } from "../../actions/command-messages";
|
|
12
|
+
import { detectQuery } from "../completion";
|
|
13
|
+
import { isInCodeZone } from "./code-zone";
|
|
14
|
+
/** Replaces a range of the text the way typing would, so undo keeps working; an empty text deletes. */
|
|
15
|
+
const replace = (textarea, start, end, text) => {
|
|
16
|
+
textarea.focus();
|
|
17
|
+
textarea.setSelectionRange(start, end);
|
|
18
|
+
if (start === end && text === "") return;
|
|
19
|
+
try {
|
|
20
|
+
if (document.execCommand?.(text === "" ? "delete" : "insertText", false, text)) return;
|
|
21
|
+
} catch {
|
|
22
|
+
// Fall through to the standards-based replacement.
|
|
23
|
+
}
|
|
24
|
+
textarea.setRangeText(text, start, end, "end");
|
|
25
|
+
textarea.dispatchEvent(new Event("input", {
|
|
26
|
+
bubbles: true
|
|
27
|
+
}));
|
|
28
|
+
};
|
|
29
|
+
const trigger = {
|
|
30
|
+
trigger: "/",
|
|
31
|
+
suggest: () => []
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Slash commands for a `MarkdownEditor`: `/` at the start of a line or after a space opens the entries docked above the
|
|
36
|
+
* composer, as wide as it is. Place it beside the editor and pass the editor's textarea. It listens to the textarea itself, so editors without
|
|
37
|
+
* commands carry none of it: native listeners run before the editor's own, and a key it uses is marked handled with
|
|
38
|
+
* `preventDefault`, which the editor respects.
|
|
39
|
+
*/
|
|
40
|
+
export function SlashCommands(props) {
|
|
41
|
+
return _$createComponent(Show, {
|
|
42
|
+
get when() {
|
|
43
|
+
return props.textarea;
|
|
44
|
+
},
|
|
45
|
+
children: textarea => _$createComponent(AttachedCommands, {
|
|
46
|
+
get textarea() {
|
|
47
|
+
return textarea();
|
|
48
|
+
},
|
|
49
|
+
get items() {
|
|
50
|
+
return props.items;
|
|
51
|
+
},
|
|
52
|
+
get composer() {
|
|
53
|
+
return props.composer;
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function AttachedCommands(props) {
|
|
59
|
+
const messages = useCommandMessages();
|
|
60
|
+
const textarea = props.textarea;
|
|
61
|
+
const id = `${textarea.id || "k2b-markdown"}-commands`;
|
|
62
|
+
const composer = () => props.composer ?? textarea.closest(".k2b-markdown-editor") ?? textarea;
|
|
63
|
+
const [context, setContext] = createSignal(null);
|
|
64
|
+
/**
|
|
65
|
+
* The list as a command left it: the `/query` is gone from the text, but the list stays at its slash while the
|
|
66
|
+
* command runs or after it failed, until the person types, leaves, or presses Escape.
|
|
67
|
+
*/
|
|
68
|
+
const [held, setHeld] = createSignal();
|
|
69
|
+
/** Where Escape closed the commands; they stay closed while the caret stays in that `/query`. */
|
|
70
|
+
let dismissedAt = null;
|
|
71
|
+
/**
|
|
72
|
+
* How deep the list is. A further list has its own search field: the `/query` leaves the text, the focus moves into
|
|
73
|
+
* the field, and the composer's text stays as it is while the person searches.
|
|
74
|
+
*/
|
|
75
|
+
const [depth, setDepth] = createSignal(0);
|
|
76
|
+
const [search, setSearch] = createSignal("");
|
|
77
|
+
let searchField;
|
|
78
|
+
/** Set while this part moves the focus between the text and the search field itself. */
|
|
79
|
+
let moving = false;
|
|
80
|
+
/** Puts the focus back in the text at `at`, where the slash stood. */
|
|
81
|
+
const focusText = at => {
|
|
82
|
+
moving = true;
|
|
83
|
+
try {
|
|
84
|
+
textarea.focus();
|
|
85
|
+
textarea.setSelectionRange(at, at);
|
|
86
|
+
} finally {
|
|
87
|
+
moving = false;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
/** Set while this part edits the text itself, so its own edit does not count as the person typing. */
|
|
91
|
+
let editing = false;
|
|
92
|
+
let popover;
|
|
93
|
+
const edit = (start, end, text) => {
|
|
94
|
+
editing = true;
|
|
95
|
+
try {
|
|
96
|
+
replace(textarea, start, end, text);
|
|
97
|
+
} finally {
|
|
98
|
+
editing = false;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const nav = createCommandNavigator({
|
|
102
|
+
items: () => props.items,
|
|
103
|
+
query: () => depth() > 0 ? search() : context()?.query ?? held()?.query ?? "",
|
|
104
|
+
onText: item => {
|
|
105
|
+
// After a command failed, the held list has no `/query` left; a snippet goes where it stood.
|
|
106
|
+
const current = context();
|
|
107
|
+
const start = current?.start ?? held()?.start;
|
|
108
|
+
if (start === undefined) return;
|
|
109
|
+
close();
|
|
110
|
+
edit(start, current?.end ?? start, item.text ?? "");
|
|
111
|
+
},
|
|
112
|
+
beforeRun: () => {
|
|
113
|
+
const current = context();
|
|
114
|
+
if (!current) return;
|
|
115
|
+
// The list stays where it was while the `/query` leaves the text.
|
|
116
|
+
setHeld({
|
|
117
|
+
start: current.start,
|
|
118
|
+
query: current.query
|
|
119
|
+
});
|
|
120
|
+
setContext(null);
|
|
121
|
+
edit(current.start, current.end, "");
|
|
122
|
+
},
|
|
123
|
+
// While the `/query` is in the text, the context leaves it out; once a command removed it, the text is as it is.
|
|
124
|
+
context: () => {
|
|
125
|
+
const current = context();
|
|
126
|
+
const start = current?.start ?? held()?.start ?? textarea.selectionStart;
|
|
127
|
+
const place = commandPlace(textarea.value, start, current?.end ?? start);
|
|
128
|
+
return {
|
|
129
|
+
...place,
|
|
130
|
+
selection: current ? {
|
|
131
|
+
start,
|
|
132
|
+
end: start
|
|
133
|
+
} : {
|
|
134
|
+
start: textarea.selectionStart,
|
|
135
|
+
end: textarea.selectionEnd
|
|
136
|
+
},
|
|
137
|
+
insert: text => edit(textarea.selectionStart, textarea.selectionEnd, text)
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
// A finished command leaves the focus in the text where the slash stood; its outcome, if any, shows in the list's place.
|
|
141
|
+
afterRun: () => {
|
|
142
|
+
const at = held()?.start;
|
|
143
|
+
close();
|
|
144
|
+
if (at !== undefined && document.activeElement !== textarea) focusText(at);
|
|
145
|
+
},
|
|
146
|
+
active: () => context() !== null || held() !== undefined,
|
|
147
|
+
onStep: next => {
|
|
148
|
+
const previous = depth();
|
|
149
|
+
if (next === 0) {
|
|
150
|
+
// Back to the first list: the typed `/query` comes back, and the text has the focus again. The list keeps its
|
|
151
|
+
// place throughout: the context returns before the held state goes, and the focus is in the text before the
|
|
152
|
+
// search field leaves, since a browser blurs a focused field that is removed, which would close the list.
|
|
153
|
+
const at = held();
|
|
154
|
+
if (at) {
|
|
155
|
+
const text = `/${at.query}`;
|
|
156
|
+
setContext({
|
|
157
|
+
start: at.start,
|
|
158
|
+
end: at.start + text.length,
|
|
159
|
+
text,
|
|
160
|
+
query: at.query,
|
|
161
|
+
completion: trigger
|
|
162
|
+
});
|
|
163
|
+
setHeld(undefined);
|
|
164
|
+
moving = true;
|
|
165
|
+
try {
|
|
166
|
+
edit(at.start, at.start, text);
|
|
167
|
+
} finally {
|
|
168
|
+
moving = false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
setDepth(0);
|
|
172
|
+
setSearch("");
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
setDepth(next);
|
|
176
|
+
setSearch("");
|
|
177
|
+
if (previous === 0) {
|
|
178
|
+
// Into a further list: the `/query` leaves the text, and the list stays where it was.
|
|
179
|
+
const current = context();
|
|
180
|
+
if (current) {
|
|
181
|
+
setHeld({
|
|
182
|
+
start: current.start,
|
|
183
|
+
query: current.query
|
|
184
|
+
});
|
|
185
|
+
setContext(null);
|
|
186
|
+
edit(current.start, current.end, "");
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
queueMicrotask(() => {
|
|
190
|
+
moving = true;
|
|
191
|
+
try {
|
|
192
|
+
searchField?.focus({
|
|
193
|
+
preventScroll: true
|
|
194
|
+
});
|
|
195
|
+
} finally {
|
|
196
|
+
moving = false;
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
// Entries on their way, or a list that could not load, show too, so the person sees what happens.
|
|
202
|
+
const open = createMemo(() => nav.outcome() !== undefined || held() !== undefined || context() !== null && (nav.step() !== undefined || nav.entries().length > 0 || nav.load().state !== "ready"));
|
|
203
|
+
const close = () => {
|
|
204
|
+
setContext(null);
|
|
205
|
+
setHeld(undefined);
|
|
206
|
+
setDepth(0);
|
|
207
|
+
setSearch("");
|
|
208
|
+
nav.reset();
|
|
209
|
+
};
|
|
210
|
+
const detect = () => {
|
|
211
|
+
if (editing) return;
|
|
212
|
+
// Typing after a command ran or failed moves on: the held list closes, the command keeps running.
|
|
213
|
+
if (held()) close();
|
|
214
|
+
const found = document.activeElement === textarea ? detectQuery(textarea, [trigger], {
|
|
215
|
+
isExcluded: isInCodeZone
|
|
216
|
+
}) : null;
|
|
217
|
+
// Commands start at the line start or after a space, never inside `https://` or after a bracket.
|
|
218
|
+
const usable = found && (found.start === 0 || /\s/.test(textarea.value[found.start - 1] ?? "")) ? found : null;
|
|
219
|
+
if (usable?.start !== context()?.start) {
|
|
220
|
+
if (usable?.start !== dismissedAt) dismissedAt = null;
|
|
221
|
+
close();
|
|
222
|
+
}
|
|
223
|
+
if (usable && usable.start !== dismissedAt) {
|
|
224
|
+
// A new `/` takes the place at once, even from an outcome still in its least time.
|
|
225
|
+
if (usable.start !== context()?.start) nav.clearOutcome();
|
|
226
|
+
setContext(usable);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
/** The person typed: an outcome clears once it showed long enough, and a new `/` opens the list. */
|
|
230
|
+
const typed = () => {
|
|
231
|
+
if (!editing) nav.typedOn();
|
|
232
|
+
detect();
|
|
233
|
+
};
|
|
234
|
+
/** An outcome's button leaves the focus in the text, where the person goes on writing. */
|
|
235
|
+
const backToText = () => {
|
|
236
|
+
if (document.activeElement === textarea) return;
|
|
237
|
+
moving = true;
|
|
238
|
+
try {
|
|
239
|
+
textarea.focus({
|
|
240
|
+
preventScroll: true
|
|
241
|
+
});
|
|
242
|
+
} finally {
|
|
243
|
+
moving = false;
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
const position = () => {
|
|
247
|
+
if (!popover?.isConnected) return;
|
|
248
|
+
if (!popover.matches(":popover-open")) popover.showPopover?.();
|
|
249
|
+
dockCommandList(popover, composer());
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
// The textarea points at the list while it shows, as a combobox does.
|
|
253
|
+
createEffect(() => {
|
|
254
|
+
const marked = nav.entries()[nav.active()];
|
|
255
|
+
// In a further list the search field points at it instead.
|
|
256
|
+
const pointing = open() && depth() === 0 && !nav.outcome();
|
|
257
|
+
const active = pointing && marked && !marked.disabled ? commandOptionId(id, nav.active()) : undefined;
|
|
258
|
+
if (pointing) textarea.setAttribute("aria-controls", id);else if (textarea.getAttribute("aria-controls") === id) textarea.removeAttribute("aria-controls");
|
|
259
|
+
if (active) textarea.setAttribute("aria-activedescendant", active);else if (textarea.getAttribute("aria-activedescendant")?.startsWith(`${id}-`)) textarea.removeAttribute("aria-activedescendant");
|
|
260
|
+
});
|
|
261
|
+
// Opening, and entries that arrive while the `/` waits, such as from a reactive source, show the list.
|
|
262
|
+
createEffect(() => {
|
|
263
|
+
if (!open()) return;
|
|
264
|
+
queueMicrotask(position);
|
|
265
|
+
// The composer grows with its text, and a phone's keyboard moves the visible viewport.
|
|
266
|
+
onCleanup(followComposer(composer(), position));
|
|
267
|
+
});
|
|
268
|
+
onMount(() => {
|
|
269
|
+
const key = event => {
|
|
270
|
+
if (!open() || event.defaultPrevented) return;
|
|
271
|
+
const current = context();
|
|
272
|
+
if (event.key === "Escape" && !current) {
|
|
273
|
+
// Escape stops a running command and closes the list it held, or clears an outcome at once.
|
|
274
|
+
event.preventDefault();
|
|
275
|
+
nav.abort();
|
|
276
|
+
nav.clearOutcome();
|
|
277
|
+
close();
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
// An outcome is no list: other keys are the person writing on.
|
|
281
|
+
if (!current && nav.outcome()) return;
|
|
282
|
+
if (commandListKey(nav, event, current?.query ?? "")) event.preventDefault();else if (event.key === "Escape" && current) {
|
|
283
|
+
event.preventDefault();
|
|
284
|
+
dismissedAt = current.start;
|
|
285
|
+
close();
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
const selection = () => {
|
|
289
|
+
if (document.activeElement === textarea && !held()) detect();
|
|
290
|
+
};
|
|
291
|
+
const blur = event => {
|
|
292
|
+
if (moving || event.relatedTarget instanceof Node && popover?.contains(event.relatedTarget)) return;
|
|
293
|
+
close();
|
|
294
|
+
dismissedAt = null;
|
|
295
|
+
};
|
|
296
|
+
textarea.addEventListener("keydown", key);
|
|
297
|
+
textarea.addEventListener("input", typed);
|
|
298
|
+
textarea.addEventListener("blur", blur);
|
|
299
|
+
document.addEventListener("selectionchange", selection);
|
|
300
|
+
// A `/` typed while this module loaded opens the list now.
|
|
301
|
+
detect();
|
|
302
|
+
onCleanup(() => {
|
|
303
|
+
textarea.removeEventListener("keydown", key);
|
|
304
|
+
textarea.removeEventListener("input", typed);
|
|
305
|
+
textarea.removeEventListener("blur", blur);
|
|
306
|
+
document.removeEventListener("selectionchange", selection);
|
|
307
|
+
popover?.hidePopover?.();
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
return _$createComponent(Show, {
|
|
311
|
+
get when() {
|
|
312
|
+
return open();
|
|
313
|
+
},
|
|
314
|
+
get children() {
|
|
315
|
+
return _$ssr(_tmpl$, _$ssrAttribute("data-outcome", _$escape(nav.outcome()?.state, true), false), _$escape(_$createComponent(CommandList, {
|
|
316
|
+
onOutcomeAction: backToText,
|
|
317
|
+
navigator: nav,
|
|
318
|
+
id: id,
|
|
319
|
+
get label() {
|
|
320
|
+
return messages().commands;
|
|
321
|
+
},
|
|
322
|
+
get query() {
|
|
323
|
+
return nav.query;
|
|
324
|
+
},
|
|
325
|
+
get header() {
|
|
326
|
+
return _$createComponent(Show, {
|
|
327
|
+
get when() {
|
|
328
|
+
return depth() > 0;
|
|
329
|
+
},
|
|
330
|
+
get children() {
|
|
331
|
+
return _$ssr(_tmpl$2, _$ssrAttribute("aria-label", _$escape(nav.step()?.next?.label, true), false), _$ssrAttribute("aria-controls", _$escape(id, true), false), _$ssrAttribute("aria-activedescendant", nav.entries()[nav.active()] && !nav.entries()[nav.active()].disabled ? _$escape(commandOptionId(id, nav.active()), true) : _$escape(undefined, true), false), _$ssrAttribute("placeholder", _$escape(nav.step()?.next?.label, true), false) + _$ssrAttribute("value", _$escape(search(), true), false) + _$ssrAttribute("readonly", _$escape(nav.busy(), true), false));
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
})));
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=SlashCommands.js.map
|