@k2b/ui 0.5.0 → 0.6.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/browser/actions/Button.js +11 -2
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/CopyButton.js.map +1 -1
- package/dist/browser/actions/Disclosure.js.map +1 -1
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/RemoveButton.js.map +1 -1
- package/dist/browser/actions/SegmentedControl.js.map +1 -1
- package/dist/browser/actions/SplitButton.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/Tabs.js.map +1 -1
- package/dist/browser/actions/Toolbar.js.map +1 -1
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatContextPopup.js.map +1 -1
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatRoot.js.map +1 -1
- package/dist/browser/chat/ChatTasks.js +1 -1
- package/dist/browser/chat/ChatTasks.js.map +1 -1
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/chat-behavior.js.map +1 -1
- package/dist/browser/chat/composer-document.js.map +1 -1
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartExplorerControls.js.map +1 -1
- package/dist/browser/content/ChartFilterControls.js +1 -1
- package/dist/browser/content/ChartFilterControls.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/CodeDisplay.js.map +1 -1
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/Docs.js.map +1 -1
- package/dist/browser/content/FileBrowser.js.map +1 -1
- package/dist/browser/content/FileGrid.js.map +1 -1
- package/dist/browser/content/FileTree.js.map +1 -1
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/LogEntriesTable.js.map +1 -1
- package/dist/browser/content/MarkdownView.js.map +1 -1
- package/dist/browser/content/Pagination.js.map +1 -1
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/RangePicker.js.map +1 -1
- package/dist/browser/content/StructuredDataPreview.js.map +1 -1
- package/dist/browser/content/ZoomPanViewport.js +396 -0
- package/dist/browser/content/ZoomPanViewport.js.map +1 -0
- package/dist/browser/content/calendar-event-layout.js.map +1 -1
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/chart-cursor.js.map +1 -1
- package/dist/browser/content/chart-explorer.js.map +1 -1
- package/dist/browser/content/chart-inspection.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-map-viewport.js.map +1 -1
- package/dist/browser/content/chart-snapshot.js.map +1 -1
- package/dist/browser/content/chart-state-timeline.js.map +1 -1
- package/dist/browser/content/chart-svg.js.map +1 -1
- package/dist/browser/content/code-highlight.js.map +1 -1
- package/dist/browser/content/collection-selection.js.map +1 -1
- package/dist/browser/content/delimited-preferences.js.map +1 -1
- package/dist/browser/content/file-tree.js.map +1 -1
- package/dist/browser/content/file-view-preview.js.map +1 -1
- package/dist/browser/content/index.js +1 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/zoom-pan.js +54 -0
- package/dist/browser/content/zoom-pan.js.map +1 -0
- package/dist/browser/feedback/InlineGuidance.js.map +1 -1
- package/dist/browser/feedback/Tooltip.js.map +1 -1
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/feedback/index.js.map +1 -1
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/feedback/toast.js.map +1 -1
- package/dist/browser/feedback/tooltip-position.js.map +1 -1
- package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/browser/inputs/Checkbox.js.map +1 -1
- package/dist/browser/inputs/CheckboxCard.js.map +1 -1
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/FileInputs.js.map +1 -1
- package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
- package/dist/browser/inputs/NumberInput.js.map +1 -1
- package/dist/browser/inputs/Select.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/SpecialInputs.js.map +1 -1
- package/dist/browser/inputs/Switch.js.map +1 -1
- package/dist/browser/inputs/TagEditor.js.map +1 -1
- package/dist/browser/inputs/TagsInput.js.map +1 -1
- package/dist/browser/inputs/TemplateEditor.js.map +1 -1
- package/dist/browser/inputs/TextInput.js +2 -1
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/choice.js.map +1 -1
- package/dist/browser/inputs/completion/behaviors.js.map +1 -1
- package/dist/browser/inputs/completion/engine.js.map +1 -1
- package/dist/browser/inputs/completion/index.js.map +1 -1
- package/dist/browser/inputs/completion/overlay.js.map +1 -1
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/inputs/editor-dom.js.map +1 -1
- package/dist/browser/inputs/field-contract.js.map +1 -1
- package/dist/browser/inputs/icon-options.js.map +1 -1
- package/dist/browser/inputs/image-crop.js.map +1 -1
- package/dist/browser/inputs/index.js.map +1 -1
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
- package/dist/browser/inputs/markdown/actions.js.map +1 -1
- package/dist/browser/inputs/markdown/active-formats.js.map +1 -1
- package/dist/browser/inputs/markdown/behaviors.js.map +1 -1
- package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
- package/dist/browser/internal/color.js.map +1 -1
- package/dist/browser/internal/field.js.map +1 -1
- package/dist/browser/internal/portal.js.map +1 -1
- package/dist/browser/intl/Format.js.map +1 -1
- package/dist/browser/intl/index.js.map +1 -1
- package/dist/browser/intl/locale.js.map +1 -1
- package/dist/browser/intl/messages.js +6 -0
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppOverview.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/BottomSheet.js.map +1 -1
- package/dist/browser/layout/DataPanel.js.map +1 -1
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/FloatingWindow.js.map +1 -1
- package/dist/browser/layout/Navigation.js.map +1 -1
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/PanelHeader.js.map +1 -1
- package/dist/browser/layout/Panes.js.map +1 -1
- package/dist/browser/layout/PullToRefresh.js +8 -7
- package/dist/browser/layout/PullToRefresh.js.map +1 -1
- package/dist/browser/layout/ScrollArea.js.map +1 -1
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SettingsCollection.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/app-workspace-state.js.map +1 -1
- package/dist/browser/layout/floating-window-geometry.js.map +1 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/navigation-model.js.map +1 -1
- package/dist/browser/layout/panes-layout.js.map +1 -1
- package/dist/browser/layout/scroll-fade.js.map +1 -1
- package/dist/browser/layout/stable-id.js.map +1 -1
- package/dist/browser/surfaces/Avatar.js.map +1 -1
- package/dist/browser/surfaces/DescriptionList.js.map +1 -1
- package/dist/browser/surfaces/LinkCard.js.map +1 -1
- package/dist/browser/surfaces/NotFoundState.js.map +1 -1
- package/dist/browser/surfaces/NoticeCard.js.map +1 -1
- package/dist/browser/surfaces/Paper.js.map +1 -1
- package/dist/browser/surfaces/Placeholder.js.map +1 -1
- package/dist/browser/surfaces/ProgressBar.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/StatGrid.js.map +1 -1
- package/dist/browser/surfaces/StatusBadge.js.map +1 -1
- package/dist/browser/surfaces/Tag.js.map +1 -1
- package/dist/browser/surfaces/index.js.map +1 -1
- package/dist/browser/widgets/Widget.js.map +1 -1
- package/dist/browser/widgets/WidgetHero.js.map +1 -1
- package/dist/browser/widgets/WidgetList.js.map +1 -1
- package/dist/browser/widgets/WidgetPills.js.map +1 -1
- package/dist/browser/widgets/WidgetStat.js.map +1 -1
- package/dist/browser/widgets/WidgetStatus.js.map +1 -1
- package/dist/ssr/actions/Button.js +16 -6
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/CopyButton.js +2 -1
- package/dist/ssr/actions/CopyButton.js.map +1 -1
- package/dist/ssr/actions/Disclosure.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +7 -6
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +5 -4
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/RemoveButton.js +1 -0
- package/dist/ssr/actions/RemoveButton.js.map +1 -1
- package/dist/ssr/actions/SegmentedControl.js.map +1 -1
- package/dist/ssr/actions/SplitButton.js +1 -0
- package/dist/ssr/actions/SplitButton.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/Tabs.js.map +1 -1
- package/dist/ssr/actions/Toolbar.js.map +1 -1
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +6 -5
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatContextPopup.js.map +1 -1
- package/dist/ssr/chat/ChatPrimitives.js +6 -5
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatRoot.js.map +1 -1
- package/dist/ssr/chat/ChatTasks.js +1 -1
- package/dist/ssr/chat/ChatTasks.js.map +1 -1
- package/dist/ssr/chat/ChatTimeline.js +5 -4
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/chat-behavior.js.map +1 -1
- package/dist/ssr/chat/composer-document.js.map +1 -1
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/content/Calendar.js +2 -1
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartExplorerControls.js +5 -4
- package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
- package/dist/ssr/content/ChartFilterControls.js +3 -2
- package/dist/ssr/content/ChartFilterControls.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/CodeDisplay.js.map +1 -1
- package/dist/ssr/content/DataTable.js +1 -0
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/Docs.js +1 -0
- package/dist/ssr/content/Docs.js.map +1 -1
- package/dist/ssr/content/FileBrowser.js +2 -1
- package/dist/ssr/content/FileBrowser.js.map +1 -1
- package/dist/ssr/content/FileGrid.js.map +1 -1
- package/dist/ssr/content/FileTree.js +2 -1
- package/dist/ssr/content/FileTree.js.map +1 -1
- package/dist/ssr/content/FileView.js +5 -4
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +2 -1
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/LogEntriesTable.js.map +1 -1
- package/dist/ssr/content/MarkdownView.js.map +1 -1
- package/dist/ssr/content/Pagination.js +2 -1
- package/dist/ssr/content/Pagination.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/RangePicker.js.map +1 -1
- package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
- package/dist/ssr/content/ZoomPanViewport.js +300 -0
- package/dist/ssr/content/ZoomPanViewport.js.map +1 -0
- package/dist/ssr/content/calendar-event-layout.js.map +1 -1
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/chart-cursor.js.map +1 -1
- package/dist/ssr/content/chart-explorer.js.map +1 -1
- package/dist/ssr/content/chart-inspection.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-map-viewport.js.map +1 -1
- package/dist/ssr/content/chart-snapshot.js.map +1 -1
- package/dist/ssr/content/chart-state-timeline.js.map +1 -1
- package/dist/ssr/content/chart-svg.js.map +1 -1
- package/dist/ssr/content/code-highlight.js.map +1 -1
- package/dist/ssr/content/collection-selection.js.map +1 -1
- package/dist/ssr/content/delimited-preferences.js.map +1 -1
- package/dist/ssr/content/file-tree.js.map +1 -1
- package/dist/ssr/content/file-view-preview.js.map +1 -1
- package/dist/ssr/content/index.js +1 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/zoom-pan.js +54 -0
- package/dist/ssr/content/zoom-pan.js.map +1 -0
- package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
- package/dist/ssr/feedback/Tooltip.js.map +1 -1
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/feedback/index.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +3 -2
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/feedback/toast.js.map +1 -1
- package/dist/ssr/feedback/tooltip-position.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteEditor.js +3 -2
- package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteSelect.js +5 -4
- package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/ssr/inputs/Checkbox.js +1 -0
- package/dist/ssr/inputs/Checkbox.js.map +1 -1
- package/dist/ssr/inputs/CheckboxCard.js.map +1 -1
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
- package/dist/ssr/inputs/ChoiceInputs.js +1 -0
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js +2 -1
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +4 -3
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/FileInputs.js +2 -1
- package/dist/ssr/inputs/FileInputs.js.map +1 -1
- package/dist/ssr/inputs/MultiSelectInput.js +4 -3
- package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
- package/dist/ssr/inputs/NumberInput.js +2 -1
- package/dist/ssr/inputs/NumberInput.js.map +1 -1
- package/dist/ssr/inputs/Select.js +4 -3
- package/dist/ssr/inputs/Select.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +3 -2
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/SpecialInputs.js +1 -0
- package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
- package/dist/ssr/inputs/Switch.js.map +1 -1
- package/dist/ssr/inputs/TagEditor.js +3 -2
- package/dist/ssr/inputs/TagEditor.js.map +1 -1
- package/dist/ssr/inputs/TagsInput.js.map +1 -1
- package/dist/ssr/inputs/TemplateEditor.js +1 -0
- package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
- package/dist/ssr/inputs/TextInput.js +6 -4
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/choice.js.map +1 -1
- package/dist/ssr/inputs/completion/behaviors.js.map +1 -1
- package/dist/ssr/inputs/completion/engine.js.map +1 -1
- package/dist/ssr/inputs/completion/index.js.map +1 -1
- package/dist/ssr/inputs/completion/overlay.js.map +1 -1
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/inputs/editor-dom.js.map +1 -1
- package/dist/ssr/inputs/field-contract.js.map +1 -1
- package/dist/ssr/inputs/icon-options.js.map +1 -1
- package/dist/ssr/inputs/image-crop.js.map +1 -1
- package/dist/ssr/inputs/index.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/Toolbar.js.map +1 -1
- package/dist/ssr/inputs/markdown/actions.js.map +1 -1
- package/dist/ssr/inputs/markdown/active-formats.js.map +1 -1
- package/dist/ssr/inputs/markdown/behaviors.js.map +1 -1
- package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
- package/dist/ssr/internal/color.js.map +1 -1
- package/dist/ssr/internal/field.js.map +1 -1
- package/dist/ssr/internal/portal.js.map +1 -1
- package/dist/ssr/intl/Format.js.map +1 -1
- package/dist/ssr/intl/index.js.map +1 -1
- package/dist/ssr/intl/locale.js.map +1 -1
- package/dist/ssr/intl/messages.js +6 -0
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppOverview.js +2 -1
- package/dist/ssr/layout/AppOverview.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +7 -6
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/BottomSheet.js.map +1 -1
- package/dist/ssr/layout/DataPanel.js +1 -0
- package/dist/ssr/layout/DataPanel.js.map +1 -1
- package/dist/ssr/layout/DetailPanel.js +1 -0
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +3 -2
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/FloatingWindow.js +1 -0
- package/dist/ssr/layout/FloatingWindow.js.map +1 -1
- package/dist/ssr/layout/Navigation.js +3 -2
- package/dist/ssr/layout/Navigation.js.map +1 -1
- package/dist/ssr/layout/PanelDialog.js +1 -0
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/PanelHeader.js.map +1 -1
- package/dist/ssr/layout/Panes.js.map +1 -1
- package/dist/ssr/layout/PullToRefresh.js +1 -1
- package/dist/ssr/layout/PullToRefresh.js.map +1 -1
- package/dist/ssr/layout/ScrollArea.js.map +1 -1
- package/dist/ssr/layout/Settings.js +2 -1
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SettingsCollection.js +1 -0
- package/dist/ssr/layout/SettingsCollection.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/app-workspace-state.js.map +1 -1
- package/dist/ssr/layout/floating-window-geometry.js.map +1 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/navigation-model.js.map +1 -1
- package/dist/ssr/layout/panes-layout.js.map +1 -1
- package/dist/ssr/layout/scroll-fade.js.map +1 -1
- package/dist/ssr/layout/stable-id.js.map +1 -1
- package/dist/ssr/surfaces/Avatar.js +2 -1
- package/dist/ssr/surfaces/Avatar.js.map +1 -1
- package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
- package/dist/ssr/surfaces/LinkCard.js.map +1 -1
- package/dist/ssr/surfaces/NotFoundState.js.map +1 -1
- package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
- package/dist/ssr/surfaces/Paper.js +2 -1
- package/dist/ssr/surfaces/Paper.js.map +1 -1
- package/dist/ssr/surfaces/Placeholder.js +2 -1
- package/dist/ssr/surfaces/Placeholder.js.map +1 -1
- package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +2 -1
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/StatGrid.js +1 -0
- package/dist/ssr/surfaces/StatGrid.js.map +1 -1
- package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
- package/dist/ssr/surfaces/Tag.js.map +1 -1
- package/dist/ssr/surfaces/index.js.map +1 -1
- package/dist/ssr/widgets/Widget.js +1 -0
- package/dist/ssr/widgets/Widget.js.map +1 -1
- package/dist/ssr/widgets/WidgetHero.js.map +1 -1
- package/dist/ssr/widgets/WidgetList.js.map +1 -1
- package/dist/ssr/widgets/WidgetPills.js.map +1 -1
- package/dist/ssr/widgets/WidgetStat.js +1 -0
- package/dist/ssr/widgets/WidgetStat.js.map +1 -1
- package/dist/ssr/widgets/WidgetStatus.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Button.d.ts +5 -0
- package/dist/types/actions/SplitButton.d.ts +1 -1
- package/dist/types/actions/SpotlightSearch.d.ts +1 -1
- package/dist/types/actions/index.d.ts +1 -1
- package/dist/types/content/ZoomPanViewport.d.ts +33 -0
- package/dist/types/content/index.d.ts +2 -0
- package/dist/types/content/zoom-pan.d.ts +29 -0
- package/dist/types/feedback/prompts.d.ts +4 -3
- package/dist/types/intl/messages.d.ts +3 -0
- package/package.json +9 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[
|
|
1
|
+
{"version":3,"names":[],"sources":["content/chart-snapshot.ts"],"sourcesContent":["import { type ChartDatum, escapeXml } from \"@k2b/stdlib\";\nimport { type ChartKind, type ChartRenderOptions, chartRenderHeight, renderChartSvg } from \"./Chart\";\nimport { type ChartSelection, type ChartTooltip, type ChartTooltipFormatter, isChartDatum } from \"./chart-inspection\";\n\n/** Trusted output of prepareChartSnapshot; never accept arbitrary user SVG. */\nexport type ChartSnapshot = {\n kind: ChartKind;\n svg: string;\n width: number;\n height: number;\n stretch: boolean;\n marks: readonly { key: string; rowKey: string; datum: ChartDatum; tooltip: ChartTooltip; reference?: boolean }[];\n};\n\n// Matches metadata emitted by our SVG renderer, not arbitrary XML.\nconst decodeAttribute = (value: string) =>\n value\n .replace(/"/g, '\"')\n .replace(/'|'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n\n/** Pure SVG preparation for server or browser. Transfer only this output across SSR boundaries. */\nexport function prepareChartSnapshot(\n options: ChartRenderOptions,\n inspection: {\n key: (selection: ChartSelection) => string;\n /** Defaults to the mark key for one-to-one charts. */\n rowKey?: (selection: ChartSelection) => string;\n tooltip: ChartTooltipFormatter;\n reference?: (selection: ChartSelection) => boolean;\n },\n): ChartSnapshot {\n const width = 480;\n const height = chartRenderHeight(options);\n const svg = renderChartSvg({ ...options, interactive: true }, width, height);\n const marks: ChartSnapshot[\"marks\"][number][] = [];\n const keys = new Set<string>();\n for (const match of svg.matchAll(/data-chart-datum=\"([^\"]*)\"/g)) {\n const datum: unknown = JSON.parse(decodeAttribute(match[1]!));\n if (!isChartDatum(datum)) throw new Error(\"Invalid renderer chart metadata\");\n const selection = { kind: options.kind, datum };\n const key = inspection.key(selection);\n if (!key || keys.has(key)) throw new Error(\"Chart snapshot requires a unique nonempty key for every mark\");\n keys.add(key);\n const rowKey = inspection.rowKey?.(selection) ?? key;\n if (!rowKey) throw new Error(\"Chart marks require a nonempty rowKey\");\n marks.push({\n key,\n rowKey,\n datum,\n tooltip: inspection.tooltip(selection),\n ...(inspection.reference?.(selection) ? { reference: true } : {}),\n });\n }\n let markIndex = 0;\n const formattedSvg = svg.replace(\n /(<g data-chart-role=\"[^\"]*\" data-chart-datum=\"[^\"]*\"><title>)[\\s\\S]*?<\\/title>/g,\n (_match, opening: string, offset: number) => {\n const mark = marks[markIndex++]!;\n const tooltip = mark.tooltip;\n const text = [tooltip.title, ...tooltip.rows.map((row) => `${row.label}: ${row.value}`)].filter(Boolean).join(\" · \");\n if (mark.reference) {\n const children = svg.slice(offset, svg.indexOf(\"</g>\", offset));\n const palette = (Number(children.match(/stdlib-chart-series-(\\d+)/)?.[1] ?? mark.datum.seriesIndex ?? 0) % 8) + 1;\n opening = opening.replace(\n \"<g \",\n `<g data-chart-reference=\"true\" style=\"--k2b-chart-reference-color:var(--stdlib-chart-c${palette})\" `,\n );\n }\n return `${opening}${escapeXml(text)}</title>`;\n },\n );\n return { kind: options.kind, svg: formattedSvg, width, height, stretch: ![\"map\", \"pie\", \"donut\", \"gauge\"].includes(options.kind), marks };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["chartDatumSvg","computeDomain","escapeXml","extendDomainToNice","mapRange","niceStep","svgRoot","ROW_HEIGHT","TOP","AXIS_HEIGHT","LEGEND_HEIGHT","MIN_VIEW_FRACTION","finiteDomain","domain","Number","isFinite","stateTimelineDomain","rows","explicit","flatMap","row","intervals","interval","from","to","normalizeStateTimelineViewport","viewport","fullDomain","full","candidate","span","Math","min","max","zoomStateTimelineViewport","delta","anchor","current","fullSpan","minSpan","factor","nextSpan","safeAnchor","anchorValue","panStateTimelineViewport","pixelDelta","plotWidth","timeDelta","stateTimelineHeight","legend","fmt","value","isInteger","String","toFixed","safeHref","href","startsWith","truncate","maxChars","length","slice","interactiveGroup","body","tooltip","ariaLabel","safe","attrs","filter","Boolean","join","title","renderStateTimelineSvg","opts","width","height","showLegend","states","legendHeight","labels","map","label","idealGutter","gutter","plotLeft","plotRight","rowsBottom","stateStyles","Map","state","index","stateKeys","Set","i","stateIndexes","maxLabelChars","floor","forEach","rowIndex","y","labelBody","push","entries","intervalFrom","intervalTo","x","x2","style","get","stateIndex","color","rect","stateLabel","seriesIndex","role","grid","values","key","formatted","xAxis","format","interactive","tickTarget","ticks","tick","className"],"sources":["content/chart-state-timeline.ts"],"sourcesContent":["import { chartDatumSvg, computeDomain, escapeXml, extendDomainToNice, mapRange, niceStep, svgRoot } from \"@k2b/stdlib\";\n\nexport type StateTimelineDomain = readonly [number, number];\n\nexport type StateTimelineInterval = {\n from: number;\n to: number;\n state: string;\n label?: string;\n href?: string;\n tooltip?: string;\n};\n\nexport type StateTimelineRow = {\n label: string;\n href?: string;\n tooltip?: string;\n intervals: StateTimelineInterval[];\n};\n\nexport type StateTimelineState = {\n state: string;\n label?: string;\n color?: string;\n};\n\nexport type StateTimelineChartOptions = {\n rows: StateTimelineRow[];\n states?: StateTimelineState[];\n domain?: StateTimelineDomain;\n xAxis?: { format?: (value: number) => string; label?: string };\n legend?: boolean;\n interactive?: boolean;\n};\n\nconst ROW_HEIGHT = 24;\nconst TOP = 38;\nconst AXIS_HEIGHT = 28;\nconst LEGEND_HEIGHT = 24;\nconst MIN_VIEW_FRACTION = 1 / 64;\n\nconst finiteDomain = (domain: StateTimelineDomain): StateTimelineDomain | null => {\n if (!Number.isFinite(domain[0]) || !Number.isFinite(domain[1]) || domain[0] === domain[1]) return null;\n return domain[0] < domain[1] ? domain : [domain[1], domain[0]];\n};\n\nexport const stateTimelineDomain = (rows: readonly StateTimelineRow[], domain?: StateTimelineDomain): StateTimelineDomain => {\n const explicit = domain ? finiteDomain(domain) : null;\n if (explicit) return explicit;\n return computeDomain(rows.flatMap((row) => row.intervals.flatMap((interval) => [interval.from, interval.to])));\n};\n\nexport const normalizeStateTimelineViewport = (\n viewport: StateTimelineDomain | undefined,\n fullDomain: StateTimelineDomain,\n): StateTimelineDomain => {\n const full = finiteDomain(fullDomain) ?? [0, 1];\n const candidate = viewport ? finiteDomain(viewport) : null;\n if (!candidate) return full;\n const span = Math.min(candidate[1] - candidate[0], full[1] - full[0]);\n const from = Math.max(full[0], Math.min(candidate[0], full[1] - span));\n return [from, from + span];\n};\n\nexport const zoomStateTimelineViewport = (\n viewport: StateTimelineDomain,\n fullDomain: StateTimelineDomain,\n delta: number,\n anchor = 0.5,\n): StateTimelineDomain => {\n const current = normalizeStateTimelineViewport(viewport, fullDomain);\n const fullSpan = fullDomain[1] - fullDomain[0];\n const minSpan = Math.max(1, fullSpan * MIN_VIEW_FRACTION);\n const factor = delta > 0 ? 0.7 : 1 / 0.7;\n const nextSpan = Math.max(minSpan, Math.min(fullSpan, (current[1] - current[0]) * factor));\n const safeAnchor = Math.max(0, Math.min(1, anchor));\n const anchorValue = current[0] + (current[1] - current[0]) * safeAnchor;\n return normalizeStateTimelineViewport([anchorValue - nextSpan * safeAnchor, anchorValue + nextSpan * (1 - safeAnchor)], fullDomain);\n};\n\nexport const panStateTimelineViewport = (\n viewport: StateTimelineDomain,\n fullDomain: StateTimelineDomain,\n pixelDelta: number,\n plotWidth: number,\n): StateTimelineDomain => {\n if (plotWidth <= 0) return normalizeStateTimelineViewport(viewport, fullDomain);\n const current = normalizeStateTimelineViewport(viewport, fullDomain);\n const timeDelta = (-pixelDelta / plotWidth) * (current[1] - current[0]);\n return normalizeStateTimelineViewport([current[0] + timeDelta, current[1] + timeDelta], fullDomain);\n};\n\nexport const stateTimelineHeight = (rows: number, legend = true): number =>\n Math.max(160, TOP + rows * ROW_HEIGHT + AXIS_HEIGHT + (legend ? LEGEND_HEIGHT : 0));\n\nconst fmt = (value: number): string => (Number.isInteger(value) ? String(value) : value.toFixed(2));\n\nconst safeHref = (href: string | undefined): string | null => (href && href.startsWith(\"/\") && !href.startsWith(\"//\") ? href : null);\n\nconst truncate = (value: string, maxChars: number): string =>\n value.length <= maxChars ? value : `${value.slice(0, Math.max(1, maxChars - 1))}…`;\n\nconst interactiveGroup = (body: string, href: string | undefined, tooltip: string | undefined, ariaLabel: string): string => {\n const safe = safeHref(href);\n const attrs = [`aria-label=\"${escapeXml(ariaLabel)}\"`, tooltip ? `data-chart-tooltip=\"${escapeXml(tooltip)}\"` : \"\"]\n .filter(Boolean)\n .join(\" \");\n const title = tooltip ? `<title>${escapeXml(tooltip)}</title>` : \"\";\n return safe\n ? `<a href=\"${escapeXml(safe)}\" ${attrs}>${title}${body}</a>`\n : `<g ${attrs}${tooltip ? ' role=\"img\"' : \"\"}>${title}${body}</g>`;\n};\n\nexport const renderStateTimelineSvg = (\n opts: StateTimelineChartOptions & {\n width: number;\n height: number;\n viewport?: StateTimelineDomain;\n className?: string;\n },\n): string => {\n const { width, height, rows } = opts;\n const fullDomain = stateTimelineDomain(rows, opts.domain);\n const viewport = normalizeStateTimelineViewport(opts.viewport, fullDomain);\n const showLegend = opts.legend !== false && (opts.states?.length ?? 0) > 0;\n const legendHeight = showLegend ? LEGEND_HEIGHT : 0;\n const labels = rows.map((row) => row.label);\n const idealGutter = Math.max(72, ...labels.map((label) => label.length * 6.3 + 20));\n const gutter = Math.min(240, width * 0.35, idealGutter);\n const plotLeft = gutter;\n const plotRight = Math.max(plotLeft + 1, width - 16);\n const rowsBottom = Math.min(height - AXIS_HEIGHT - legendHeight, TOP + rows.length * ROW_HEIGHT);\n const stateStyles = new Map((opts.states ?? []).map((state, index) => [state.state, { ...state, index }]));\n const stateKeys = opts.states?.map((state) => state.state) ?? [...new Set(rows.flatMap((row) => row.intervals.map((i) => i.state)))];\n const stateIndexes = new Map(stateKeys.map((state, index) => [state, index]));\n const body: string[] = [];\n const maxLabelChars = Math.max(4, Math.floor((gutter - 18) / 6.3));\n\n rows.forEach((row, rowIndex) => {\n const y = TOP + rowIndex * ROW_HEIGHT;\n if (y + ROW_HEIGHT > rowsBottom + 1) return;\n const label = truncate(row.label, maxLabelChars);\n const labelBody = `<text class=\"stdlib-chart-state-label\" x=\"${fmt(plotLeft - 8)}\" y=\"${fmt(\n y + ROW_HEIGHT / 2,\n )}\" text-anchor=\"end\" dominant-baseline=\"middle\">${escapeXml(label)}</text>`;\n body.push(interactiveGroup(labelBody, row.href, row.tooltip ?? row.label, row.label));\n\n for (const [index, interval] of row.intervals.entries()) {\n if (!Number.isFinite(interval.from) || !Number.isFinite(interval.to)) continue;\n const intervalFrom = Math.min(interval.from, interval.to);\n const intervalTo = Math.max(interval.from, interval.to);\n if (intervalTo < viewport[0] || intervalFrom > viewport[1]) continue;\n const from = Math.max(viewport[0], intervalFrom);\n const to = Math.min(viewport[1], intervalTo);\n const x = mapRange(from, viewport, [plotLeft, plotRight]);\n const x2 = mapRange(to, viewport, [plotLeft, plotRight]);\n const style = stateStyles.get(interval.state);\n const stateIndex = style?.index ?? stateIndexes.get(interval.state) ?? 0;\n const color = style?.color ? ` fill=\"${escapeXml(style.color)}\"` : \"\";\n const rect = `<rect class=\"stdlib-chart-state-region stdlib-chart-series-${stateIndex % 8}\"${color} x=\"${fmt(\n x,\n )}\" y=\"${fmt(y + 3)}\" width=\"${fmt(Math.max(2, x2 - x))}\" height=\"${ROW_HEIGHT - 6}\" rx=\"3\"/>`;\n const stateLabel = style?.label ?? interval.state;\n body.push(\n interactiveGroup(\n chartDatumSvg(\n rect,\n {\n index,\n seriesIndex: rowIndex,\n role: \"interval\",\n label: row.label,\n anchor: [(x + x2) / 2, y + ROW_HEIGHT / 2],\n grid: [index, rowIndex],\n values: [\n { key: \"state\", value: interval.state, formatted: stateLabel },\n { key: \"from\", value: intervalFrom, formatted: opts.xAxis?.format?.(intervalFrom) },\n { key: \"to\", value: intervalTo, formatted: opts.xAxis?.format?.(intervalTo) },\n { key: \"duration\", value: intervalTo - intervalFrom },\n ...((interval.tooltip ?? interval.label) ? [{ key: \"detail\", value: interval.tooltip ?? interval.label ?? \"\" }] : []),\n ],\n },\n opts.interactive,\n ),\n interval.href,\n interval.tooltip ?? interval.label,\n [row.label, interval.label, stateLabel].filter(Boolean).join(\", \"),\n ),\n );\n }\n });\n\n const tickTarget = Math.max(2, Math.min(8, Math.floor((plotRight - plotLeft) / 110)));\n const ticks = extendDomainToNice(viewport[0], viewport[1], niceStep(viewport[1] - viewport[0], tickTarget)).ticks;\n const format = opts.xAxis?.format ?? ((value: number) => fmt(value));\n for (const tick of ticks) {\n if (tick < viewport[0] || tick > viewport[1]) continue;\n const x = mapRange(tick, viewport, [plotLeft, plotRight]);\n body.push(\n `<line x1=\"${fmt(x)}\" x2=\"${fmt(x)}\" y1=\"${TOP}\" y2=\"${fmt(rowsBottom)}\" stroke=\"currentColor\" opacity=\"0.08\"/>`,\n `<text class=\"stdlib-chart-heatmap-label\" x=\"${fmt(x)}\" y=\"${fmt(rowsBottom + 17)}\" text-anchor=\"middle\">${escapeXml(\n format(tick),\n )}</text>`,\n );\n }\n\n if (opts.xAxis?.label) {\n body.push(\n `<text class=\"stdlib-chart-axis-label\" x=\"${fmt((plotLeft + plotRight) / 2)}\" y=\"${fmt(\n rowsBottom + AXIS_HEIGHT - 2,\n )}\" text-anchor=\"middle\">${escapeXml(opts.xAxis.label)}</text>`,\n );\n }\n\n if (showLegend) {\n body.push('<g class=\"stdlib-chart-legend\">');\n let x = plotLeft;\n const y = height - 9;\n for (const [index, state] of (opts.states ?? []).entries()) {\n const color = state.color ? ` fill=\"${escapeXml(state.color)}\"` : \"\";\n const label = state.label ?? state.state;\n body.push(\n `<rect class=\"stdlib-chart-series-${index % 8}\"${color} x=\"${fmt(x)}\" y=\"${y - 8}\" width=\"8\" height=\"8\" rx=\"2\"/>`,\n `<text class=\"stdlib-chart-heatmap-label\" x=\"${fmt(x + 12)}\" y=\"${y}\" text-anchor=\"start\">${escapeXml(label)}</text>`,\n );\n x += 20 + label.length * 6.2;\n }\n body.push(\"</g>\");\n }\n\n return svgRoot({ width, height, className: opts.className }, body.join(\"\"));\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/chart-state-timeline.ts"],"sourcesContent":["import { chartDatumSvg, computeDomain, escapeXml, extendDomainToNice, mapRange, niceStep, svgRoot } from \"@k2b/stdlib\";\n\nexport type StateTimelineDomain = readonly [number, number];\n\nexport type StateTimelineInterval = {\n from: number;\n to: number;\n state: string;\n label?: string;\n href?: string;\n tooltip?: string;\n};\n\nexport type StateTimelineRow = {\n label: string;\n href?: string;\n tooltip?: string;\n intervals: StateTimelineInterval[];\n};\n\nexport type StateTimelineState = {\n state: string;\n label?: string;\n color?: string;\n};\n\nexport type StateTimelineChartOptions = {\n rows: StateTimelineRow[];\n states?: StateTimelineState[];\n domain?: StateTimelineDomain;\n xAxis?: { format?: (value: number) => string; label?: string };\n legend?: boolean;\n interactive?: boolean;\n};\n\nconst ROW_HEIGHT = 24;\nconst TOP = 38;\nconst AXIS_HEIGHT = 28;\nconst LEGEND_HEIGHT = 24;\nconst MIN_VIEW_FRACTION = 1 / 64;\n\nconst finiteDomain = (domain: StateTimelineDomain): StateTimelineDomain | null => {\n if (!Number.isFinite(domain[0]) || !Number.isFinite(domain[1]) || domain[0] === domain[1]) return null;\n return domain[0] < domain[1] ? domain : [domain[1], domain[0]];\n};\n\nexport const stateTimelineDomain = (rows: readonly StateTimelineRow[], domain?: StateTimelineDomain): StateTimelineDomain => {\n const explicit = domain ? finiteDomain(domain) : null;\n if (explicit) return explicit;\n return computeDomain(rows.flatMap((row) => row.intervals.flatMap((interval) => [interval.from, interval.to])));\n};\n\nexport const normalizeStateTimelineViewport = (\n viewport: StateTimelineDomain | undefined,\n fullDomain: StateTimelineDomain,\n): StateTimelineDomain => {\n const full = finiteDomain(fullDomain) ?? [0, 1];\n const candidate = viewport ? finiteDomain(viewport) : null;\n if (!candidate) return full;\n const span = Math.min(candidate[1] - candidate[0], full[1] - full[0]);\n const from = Math.max(full[0], Math.min(candidate[0], full[1] - span));\n return [from, from + span];\n};\n\nexport const zoomStateTimelineViewport = (\n viewport: StateTimelineDomain,\n fullDomain: StateTimelineDomain,\n delta: number,\n anchor = 0.5,\n): StateTimelineDomain => {\n const current = normalizeStateTimelineViewport(viewport, fullDomain);\n const fullSpan = fullDomain[1] - fullDomain[0];\n const minSpan = Math.max(1, fullSpan * MIN_VIEW_FRACTION);\n const factor = delta > 0 ? 0.7 : 1 / 0.7;\n const nextSpan = Math.max(minSpan, Math.min(fullSpan, (current[1] - current[0]) * factor));\n const safeAnchor = Math.max(0, Math.min(1, anchor));\n const anchorValue = current[0] + (current[1] - current[0]) * safeAnchor;\n return normalizeStateTimelineViewport([anchorValue - nextSpan * safeAnchor, anchorValue + nextSpan * (1 - safeAnchor)], fullDomain);\n};\n\nexport const panStateTimelineViewport = (\n viewport: StateTimelineDomain,\n fullDomain: StateTimelineDomain,\n pixelDelta: number,\n plotWidth: number,\n): StateTimelineDomain => {\n if (plotWidth <= 0) return normalizeStateTimelineViewport(viewport, fullDomain);\n const current = normalizeStateTimelineViewport(viewport, fullDomain);\n const timeDelta = (-pixelDelta / plotWidth) * (current[1] - current[0]);\n return normalizeStateTimelineViewport([current[0] + timeDelta, current[1] + timeDelta], fullDomain);\n};\n\nexport const stateTimelineHeight = (rows: number, legend = true): number =>\n Math.max(160, TOP + rows * ROW_HEIGHT + AXIS_HEIGHT + (legend ? LEGEND_HEIGHT : 0));\n\nconst fmt = (value: number): string => (Number.isInteger(value) ? String(value) : value.toFixed(2));\n\nconst safeHref = (href: string | undefined): string | null => (href && href.startsWith(\"/\") && !href.startsWith(\"//\") ? href : null);\n\nconst truncate = (value: string, maxChars: number): string =>\n value.length <= maxChars ? value : `${value.slice(0, Math.max(1, maxChars - 1))}…`;\n\nconst interactiveGroup = (body: string, href: string | undefined, tooltip: string | undefined, ariaLabel: string): string => {\n const safe = safeHref(href);\n const attrs = [`aria-label=\"${escapeXml(ariaLabel)}\"`, tooltip ? `data-chart-tooltip=\"${escapeXml(tooltip)}\"` : \"\"]\n .filter(Boolean)\n .join(\" \");\n const title = tooltip ? `<title>${escapeXml(tooltip)}</title>` : \"\";\n return safe\n ? `<a href=\"${escapeXml(safe)}\" ${attrs}>${title}${body}</a>`\n : `<g ${attrs}${tooltip ? ' role=\"img\"' : \"\"}>${title}${body}</g>`;\n};\n\nexport const renderStateTimelineSvg = (\n opts: StateTimelineChartOptions & {\n width: number;\n height: number;\n viewport?: StateTimelineDomain;\n className?: string;\n },\n): string => {\n const { width, height, rows } = opts;\n const fullDomain = stateTimelineDomain(rows, opts.domain);\n const viewport = normalizeStateTimelineViewport(opts.viewport, fullDomain);\n const showLegend = opts.legend !== false && (opts.states?.length ?? 0) > 0;\n const legendHeight = showLegend ? LEGEND_HEIGHT : 0;\n const labels = rows.map((row) => row.label);\n const idealGutter = Math.max(72, ...labels.map((label) => label.length * 6.3 + 20));\n const gutter = Math.min(240, width * 0.35, idealGutter);\n const plotLeft = gutter;\n const plotRight = Math.max(plotLeft + 1, width - 16);\n const rowsBottom = Math.min(height - AXIS_HEIGHT - legendHeight, TOP + rows.length * ROW_HEIGHT);\n const stateStyles = new Map((opts.states ?? []).map((state, index) => [state.state, { ...state, index }]));\n const stateKeys = opts.states?.map((state) => state.state) ?? [...new Set(rows.flatMap((row) => row.intervals.map((i) => i.state)))];\n const stateIndexes = new Map(stateKeys.map((state, index) => [state, index]));\n const body: string[] = [];\n const maxLabelChars = Math.max(4, Math.floor((gutter - 18) / 6.3));\n\n rows.forEach((row, rowIndex) => {\n const y = TOP + rowIndex * ROW_HEIGHT;\n if (y + ROW_HEIGHT > rowsBottom + 1) return;\n const label = truncate(row.label, maxLabelChars);\n const labelBody = `<text class=\"stdlib-chart-state-label\" x=\"${fmt(plotLeft - 8)}\" y=\"${fmt(\n y + ROW_HEIGHT / 2,\n )}\" text-anchor=\"end\" dominant-baseline=\"middle\">${escapeXml(label)}</text>`;\n body.push(interactiveGroup(labelBody, row.href, row.tooltip ?? row.label, row.label));\n\n for (const [index, interval] of row.intervals.entries()) {\n if (!Number.isFinite(interval.from) || !Number.isFinite(interval.to)) continue;\n const intervalFrom = Math.min(interval.from, interval.to);\n const intervalTo = Math.max(interval.from, interval.to);\n if (intervalTo < viewport[0] || intervalFrom > viewport[1]) continue;\n const from = Math.max(viewport[0], intervalFrom);\n const to = Math.min(viewport[1], intervalTo);\n const x = mapRange(from, viewport, [plotLeft, plotRight]);\n const x2 = mapRange(to, viewport, [plotLeft, plotRight]);\n const style = stateStyles.get(interval.state);\n const stateIndex = style?.index ?? stateIndexes.get(interval.state) ?? 0;\n const color = style?.color ? ` fill=\"${escapeXml(style.color)}\"` : \"\";\n const rect = `<rect class=\"stdlib-chart-state-region stdlib-chart-series-${stateIndex % 8}\"${color} x=\"${fmt(\n x,\n )}\" y=\"${fmt(y + 3)}\" width=\"${fmt(Math.max(2, x2 - x))}\" height=\"${ROW_HEIGHT - 6}\" rx=\"3\"/>`;\n const stateLabel = style?.label ?? interval.state;\n body.push(\n interactiveGroup(\n chartDatumSvg(\n rect,\n {\n index,\n seriesIndex: rowIndex,\n role: \"interval\",\n label: row.label,\n anchor: [(x + x2) / 2, y + ROW_HEIGHT / 2],\n grid: [index, rowIndex],\n values: [\n { key: \"state\", value: interval.state, formatted: stateLabel },\n { key: \"from\", value: intervalFrom, formatted: opts.xAxis?.format?.(intervalFrom) },\n { key: \"to\", value: intervalTo, formatted: opts.xAxis?.format?.(intervalTo) },\n { key: \"duration\", value: intervalTo - intervalFrom },\n ...((interval.tooltip ?? interval.label) ? [{ key: \"detail\", value: interval.tooltip ?? interval.label ?? \"\" }] : []),\n ],\n },\n opts.interactive,\n ),\n interval.href,\n interval.tooltip ?? interval.label,\n [row.label, interval.label, stateLabel].filter(Boolean).join(\", \"),\n ),\n );\n }\n });\n\n const tickTarget = Math.max(2, Math.min(8, Math.floor((plotRight - plotLeft) / 110)));\n const ticks = extendDomainToNice(viewport[0], viewport[1], niceStep(viewport[1] - viewport[0], tickTarget)).ticks;\n const format = opts.xAxis?.format ?? ((value: number) => fmt(value));\n for (const tick of ticks) {\n if (tick < viewport[0] || tick > viewport[1]) continue;\n const x = mapRange(tick, viewport, [plotLeft, plotRight]);\n body.push(\n `<line x1=\"${fmt(x)}\" x2=\"${fmt(x)}\" y1=\"${TOP}\" y2=\"${fmt(rowsBottom)}\" stroke=\"currentColor\" opacity=\"0.08\"/>`,\n `<text class=\"stdlib-chart-heatmap-label\" x=\"${fmt(x)}\" y=\"${fmt(rowsBottom + 17)}\" text-anchor=\"middle\">${escapeXml(\n format(tick),\n )}</text>`,\n );\n }\n\n if (opts.xAxis?.label) {\n body.push(\n `<text class=\"stdlib-chart-axis-label\" x=\"${fmt((plotLeft + plotRight) / 2)}\" y=\"${fmt(\n rowsBottom + AXIS_HEIGHT - 2,\n )}\" text-anchor=\"middle\">${escapeXml(opts.xAxis.label)}</text>`,\n );\n }\n\n if (showLegend) {\n body.push('<g class=\"stdlib-chart-legend\">');\n let x = plotLeft;\n const y = height - 9;\n for (const [index, state] of (opts.states ?? []).entries()) {\n const color = state.color ? ` fill=\"${escapeXml(state.color)}\"` : \"\";\n const label = state.label ?? state.state;\n body.push(\n `<rect class=\"stdlib-chart-series-${index % 8}\"${color} x=\"${fmt(x)}\" y=\"${y - 8}\" width=\"8\" height=\"8\" rx=\"2\"/>`,\n `<text class=\"stdlib-chart-heatmap-label\" x=\"${fmt(x + 12)}\" y=\"${y}\" text-anchor=\"start\">${escapeXml(label)}</text>`,\n );\n x += 20 + label.length * 6.2;\n }\n body.push(\"</g>\");\n }\n\n return svgRoot({ width, height, className: opts.className }, body.join(\"\"));\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[
|
|
1
|
+
{"version":3,"names":[],"sources":["content/chart-svg.ts"],"sourcesContent":["import type { MapViewport } from \"@k2b/stdlib\";\n\n/** Give maps a CSS-sized viewport while retaining the renderer's projection.\n * The outer SVG uses pixels for headers/legend; the nested geographic viewport\n * keeps one fitted scale across zoom levels and clips only at the plot edges.\n */\nexport function responsiveMapSvg(svg: string, width: number, height: number, viewport: MapViewport): string {\n if (!svg.includes('class=\"stdlib-chart-map-viewport\"')) return svg;\n const zoomScale = 2 ** viewport.zoom;\n return svg\n .replace(/<text class=\"stdlib-chart-(title|subtitle|map-empty)\"[^>]*>/g, (tag) => {\n const centered = tag.replace(/x=\"[^\"]*\"/, 'x=\"50%\"');\n return tag.includes(\"map-empty\") ? centered.replace(/y=\"[^\"]*\"/, 'y=\"50%\"') : centered;\n })\n .replace(/^(<svg\\b[^>]*?) viewBox=\"[^\"]*\"/, \"$1\")\n .replace(/<svg class=\"stdlib-chart-map-viewport\"[^>]*>/, (tag) => {\n const mapWidth = Number(tag.match(/\\bwidth=\"([^\"]+)\"/)?.[1]);\n const mapHeight = Number(tag.match(/\\bheight=\"([^\"]+)\"/)?.[1]);\n const inverse = `calc(max(tan(atan2(${mapWidth}px, ${(mapWidth / width) * 100}cqw)), tan(atan2(${mapHeight}px, ${(mapHeight / height) * 100}cqh))) / ${zoomScale})`;\n const translateX = mapWidth / 2 - ((viewport.longitude + 180) / 360) * mapWidth * zoomScale;\n const translateY = mapHeight / 2 - ((90 - viewport.latitude) / 180) * mapHeight * zoomScale;\n return tag\n .replace(\n /\\b(x|y|width|height)=\"([\\d.]+)\"/g,\n (_match, name: string, value: string) =>\n `${name}=\"${(Number(value) / (name === \"x\" || name === \"width\" ? width : height)) * 100}%\"`,\n )\n .replace(\n \">\",\n ` preserveAspectRatio=\"xMidYMid meet\" style=\"--k2b-map-inverse-scale:${inverse}\"><g class=\"k2b-chart-map-camera\" transform=\"translate(${translateX} ${translateY}) scale(${zoomScale})\">`,\n );\n })\n .replace(\"</svg>\", \"</g></svg>\");\n}\n\n/** Adapt our generated SVGs to a CSS-sized box without rebuilding their geometry.\n * Only stdlib and the local timeline renderer supply this markup; this is not a\n * parser for arbitrary SVG. The viewBox remains the interaction coordinate space.\n */\nexport function responsiveChartSvg(svg: string): string {\n return svg.replace(\"<svg \", '<svg preserveAspectRatio=\"none\" ').replace(/<text\\b[^>]*>/g, (tag) => {\n const x = tag.match(/\\bx=\"(-?[\\d.]+)\"/)?.[1];\n const y = tag.match(/\\by=\"(-?[\\d.]+)\"/)?.[1];\n if (x === undefined || y === undefined) return tag;\n const rotation = tag.match(/\\btransform=\"rotate\\((-?[\\d.]+) [^\\\"]+\\)\"/)?.[1];\n // Individual CSS scale precedes rotation. Use the same text anchor as\n // transform-origin, and avoid applying the SVG rotation pivot twice.\n return tag.replace(\">\", ` style=\"transform-origin:${x}px ${y}px${rotation ? `;transform:rotate(${rotation}deg)` : \"\"}\">`);\n });\n}\n\n/** Add initial controlled selection to our own renderer metadata during SSR. */\nexport function selectedChartSvg(\n svg: string,\n selected:\n | { role: string; index: number; seriesIndex?: number }\n | readonly { role: string; index: number; seriesIndex?: number }[]\n | null\n | undefined,\n): string {\n if (!selected) return svg;\n const targets = \"role\" in selected ? [selected] : selected;\n return svg.replace(/<g\\b[^>]*\\bdata-chart-datum=\"([^\"]*)\"[^>]*>/g, (attribute, encoded: string, offset: number) => {\n const raw = encoded\n .replace(/"/g, '\"')\n .replace(/'|'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n const value: unknown = JSON.parse(raw);\n if (typeof value !== \"object\" || value === null || !(\"role\" in value) || !(\"index\" in value)) return attribute;\n const matches = targets.find(\n (target) =>\n value.role === target.role &&\n value.index === target.index &&\n (\"seriesIndex\" in value ? value.seriesIndex : undefined) === target.seriesIndex,\n );\n if (!matches) return attribute;\n const children = svg.slice(offset, svg.indexOf(\"</g>\", offset));\n const palette = (Number(children.match(/stdlib-chart-series-(\\d+)/)?.[1] ?? matches.seriesIndex ?? 0) % 8) + 1;\n const paint = `--k2b-chart-selection-color:color-mix(in srgb,var(--stdlib-chart-c${palette}) 72%,var(--k2b-chart-highlight-mix))`;\n const opening = attribute.includes('style=\"')\n ? attribute.replace(/style=\"([^\"]*)\"/, (_match: string, style: string) => `style=\"${style};${paint}\"`)\n : attribute.replace(\">\", ` style=\"${paint}\">`);\n return opening.replace(\">\", \" data-selected>\");\n });\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["KEYWORDS","Set","escapeCodeHtml","s","replace","isIdStart","c","test","isIdCont","isDigit","wrap","cls","raw","isCodeLanguage","language","highlightCode","code","out","i","n","length","nl","indexOf","end","slice","close","quote","j","word","has","k","next","prev","assignment","objectKey","functionCall","property","highlightMarkdownLine","line","escaped","heading","exec","highlightMarkdownInline","ref","directive","name","fence","table","task","list","highlightMarkdownDisplay","split","map","join","highlightCodeDisplayLines","lines","fencedLanguage","highlightedFence","undefined","index","highlightCodeDisplay","includes"],"sources":["content/code-highlight.ts"],"sourcesContent":["/**\n * Small safe highlighters for CodeDisplay.\n *\n * These are display-only highlighters: no AST, no runtime parser, no\n * dependency. Every input character is HTML-escaped before being wrapped\n * in token spans, so the returned strings are safe to inject with\n * `innerHTML`.\n */\n\nconst KEYWORDS = new Set([\n \"const\",\n \"let\",\n \"var\",\n \"function\",\n \"return\",\n \"if\",\n \"else\",\n \"for\",\n \"while\",\n \"import\",\n \"from\",\n \"export\",\n \"default\",\n \"async\",\n \"await\",\n \"new\",\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"as\",\n \"type\",\n \"interface\",\n \"void\",\n \"this\",\n \"typeof\",\n \"in\",\n \"of\",\n]);\n\nexport type CodeDisplayLanguage = \"ts\" | \"tsx\" | \"js\" | \"jsx\" | \"script\" | \"markdown\" | \"md\" | \"text\";\n\nexport const escapeCodeHtml = (s: string): string => s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n\nconst isIdStart = (c: string): boolean => /[A-Za-z_$]/.test(c);\nconst isIdCont = (c: string): boolean => /[\\w$]/.test(c);\nconst isDigit = (c: string): boolean => /[0-9]/.test(c);\nconst wrap = (cls: string, raw: string): string => `<span class=\"${cls}\">${escapeCodeHtml(raw)}</span>`;\nconst isCodeLanguage = (language: string | undefined): boolean =>\n language === \"script\" || language === \"js\" || language === \"jsx\" || language === \"ts\" || language === \"tsx\";\n\nexport const highlightCode = (code: string): string => {\n let out = \"\";\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n const c = code[i]!;\n\n if (c === \"/\" && code[i + 1] === \"/\") {\n const nl = code.indexOf(\"\\n\", i);\n const end = nl === -1 ? n : nl;\n out += wrap(\"cd-c\", code.slice(i, end));\n i = end;\n continue;\n }\n\n if (c === \"/\" && code[i + 1] === \"*\") {\n const close = code.indexOf(\"*/\", i + 2);\n const end = close === -1 ? n : close + 2;\n out += wrap(\"cd-c\", code.slice(i, end));\n i = end;\n continue;\n }\n\n if (c === '\"' || c === \"'\" || c === \"`\") {\n const quote = c;\n let j = i + 1;\n while (j < n) {\n if (code[j] === \"\\\\\") {\n j += 2;\n continue;\n }\n if (code[j] === quote) {\n j++;\n break;\n }\n j++;\n }\n out += wrap(\"cd-s\", code.slice(i, j));\n i = j;\n continue;\n }\n\n if (isDigit(c)) {\n let j = i;\n while (j < n && (isDigit(code[j]!) || code[j] === \".\")) j++;\n out += wrap(\"cd-n\", code.slice(i, j));\n i = j;\n continue;\n }\n\n if (isIdStart(c)) {\n let j = i;\n while (j < n && isIdCont(code[j]!)) j++;\n const word = code.slice(i, j);\n let cls = \"\";\n if (KEYWORDS.has(word)) cls = \"cd-k\";\n else if (/^[A-Z]/.test(word)) cls = \"cd-p\";\n else {\n let k = j;\n while (k < n && code[k] === \" \") k++;\n const next = code[k];\n const prev = i > 0 ? code[i - 1] : \"\";\n const assignment = next === \"=\" && code[k + 1] !== \"=\" && code[k + 1] !== \">\";\n const objectKey = next === \":\";\n const functionCall = next === \"(\";\n const property = prev === \".\";\n if (assignment || objectKey) cls = \"cd-a\";\n else if (functionCall || property) cls = \"cd-f\";\n }\n out += cls ? wrap(cls, word) : escapeCodeHtml(word);\n i = j;\n continue;\n }\n\n out += escapeCodeHtml(c);\n i++;\n }\n\n return out;\n};\n\nconst highlightMarkdownLine = (line: string): string => {\n const escaped = escapeCodeHtml(line);\n\n const heading = /^(#{1,6})(\\s.*)$/.exec(escaped);\n if (heading) return `<span class=\"cd-md-syntax\">${heading[1]}</span>${highlightMarkdownInline(heading[2] ?? \"\")}`;\n\n const ref = /^(@[A-Za-z][\\w-]*)$/.exec(escaped);\n if (ref) return `<span class=\"cd-md-ref\">${ref[1]}</span>`;\n\n const directive = /^(\\s*:::)([A-Za-z][\\w-]*)?(.*)$/.exec(escaped);\n if (directive) {\n const name = directive[2] ? `<span class=\"cd-md-directive\">${directive[2]}</span>` : \"\";\n return `${directive[1] ? `<span class=\"cd-md-syntax\">${directive[1]}</span>` : \"\"}${name}${highlightMarkdownInline(directive[3] ?? \"\")}`;\n }\n\n const fence = /^(```)(.*)$/.exec(escaped);\n if (fence) {\n const language = fence[2] ? `<span class=\"cd-md-ref\">${fence[2]}</span>` : \"\";\n return `<span class=\"cd-md-syntax\">${fence[1]}</span>${language}`;\n }\n\n const table = /^(\\s*\\|)(.*)(\\|\\s*)$/.exec(escaped);\n if (table) return `<span class=\"cd-md-syntax\">${table[1]}</span>${table[2]}<span class=\"cd-md-syntax\">${table[3]}</span>`;\n\n const task = /^(\\s*(?:[-*+]|\\d+\\.)\\s+)(\\[[ xX]\\])(\\s+.*)$/.exec(escaped);\n if (task) {\n return `<span class=\"cd-md-syntax\">${task[1]}</span><span class=\"cd-md-checkbox\">${task[2]}</span>${highlightMarkdownInline(task[3] ?? \"\")}`;\n }\n\n const list = /^(\\s*(?:[-*+]|\\d+\\.)\\s+)(.*)$/.exec(escaped);\n if (list) return `<span class=\"cd-md-syntax\">${list[1]}</span>${highlightMarkdownInline(list[2] ?? \"\")}`;\n\n return highlightMarkdownInline(escaped);\n};\n\nconst highlightMarkdownInline = (escaped: string): string =>\n escaped\n .replace(\n /(`)([^`\\n]+?)(`)/g,\n '<span class=\"cd-md-syntax\">$1</span><span class=\"cd-md-code\">$2</span><span class=\"cd-md-syntax\">$3</span>',\n )\n .replace(/(\\*\\*)([^*\\n]+?)(\\*\\*)/g, '<span class=\"cd-md-syntax\">$1</span>$2<span class=\"cd-md-syntax\">$3</span>')\n .replace(/(\\[[^\\]\\n]+?\\])(\\([^)]+\\))/g, '<span class=\"cd-md-link\">$1</span><span class=\"cd-md-syntax\">$2</span>')\n .replace(/(^|\\s)(@[A-Za-z][\\w-]*)/g, '$1<span class=\"cd-md-ref\">$2</span>')\n .replace(/(#[A-Za-z][\\w/-]*)/g, '<span class=\"cd-md-tag\">$1</span>')\n .replace(/(=[A-Z][A-Z0-9_]*\\([^)\\n]*\\))/g, '<span class=\"cd-md-formula\">$1</span>');\n\nexport const highlightMarkdownDisplay = (code: string): string => code.split(\"\\n\").map(highlightMarkdownLine).join(\"\\n\");\n\nexport const highlightCodeDisplayLines = (code: string, language: CodeDisplayLanguage = \"text\"): string[] => {\n const lines = code.split(\"\\n\");\n\n if (language === \"text\") return lines.map((line) => escapeCodeHtml(line || \" \"));\n\n if (language === \"markdown\" || language === \"md\") {\n let fencedLanguage: string | undefined;\n return lines.map((line) => {\n const fence = /^(```)(\\w+)?(.*)$/.exec(line);\n if (fence) {\n const highlightedFence = highlightMarkdownLine(line);\n fencedLanguage = fencedLanguage ? undefined : fence[2];\n return highlightedFence;\n }\n return isCodeLanguage(fencedLanguage) ? highlightCode(line || \" \") : highlightMarkdownLine(line || \" \");\n });\n }\n\n if (lines.length >= 2 && /^```\\w+/.test(lines[0] ?? \"\") && /^```\\s*$/.test(lines[lines.length - 1] ?? \"\")) {\n return lines.map((line, index) => {\n if (index === 0 || index === lines.length - 1) return highlightMarkdownLine(line || \" \");\n return highlightCode(line || \" \");\n });\n }\n\n return lines.map((line) => highlightCode(line || \" \"));\n};\n\nexport const highlightCodeDisplay = (code: string, language: CodeDisplayLanguage = \"text\"): string => {\n if (code.includes(\"\\n\")) return highlightCodeDisplayLines(code, language).join(\"\\n\");\n if (language === \"markdown\" || language === \"md\") return highlightMarkdownDisplay(code);\n if (language === \"text\") return escapeCodeHtml(code);\n return highlightCode(code);\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/code-highlight.ts"],"sourcesContent":["/**\n * Small safe highlighters for CodeDisplay.\n *\n * These are display-only highlighters: no AST, no runtime parser, no\n * dependency. Every input character is HTML-escaped before being wrapped\n * in token spans, so the returned strings are safe to inject with\n * `innerHTML`.\n */\n\nconst KEYWORDS = new Set([\n \"const\",\n \"let\",\n \"var\",\n \"function\",\n \"return\",\n \"if\",\n \"else\",\n \"for\",\n \"while\",\n \"import\",\n \"from\",\n \"export\",\n \"default\",\n \"async\",\n \"await\",\n \"new\",\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"as\",\n \"type\",\n \"interface\",\n \"void\",\n \"this\",\n \"typeof\",\n \"in\",\n \"of\",\n]);\n\nexport type CodeDisplayLanguage = \"ts\" | \"tsx\" | \"js\" | \"jsx\" | \"script\" | \"markdown\" | \"md\" | \"text\";\n\nexport const escapeCodeHtml = (s: string): string => s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n\nconst isIdStart = (c: string): boolean => /[A-Za-z_$]/.test(c);\nconst isIdCont = (c: string): boolean => /[\\w$]/.test(c);\nconst isDigit = (c: string): boolean => /[0-9]/.test(c);\nconst wrap = (cls: string, raw: string): string => `<span class=\"${cls}\">${escapeCodeHtml(raw)}</span>`;\nconst isCodeLanguage = (language: string | undefined): boolean =>\n language === \"script\" || language === \"js\" || language === \"jsx\" || language === \"ts\" || language === \"tsx\";\n\nexport const highlightCode = (code: string): string => {\n let out = \"\";\n let i = 0;\n const n = code.length;\n\n while (i < n) {\n const c = code[i]!;\n\n if (c === \"/\" && code[i + 1] === \"/\") {\n const nl = code.indexOf(\"\\n\", i);\n const end = nl === -1 ? n : nl;\n out += wrap(\"cd-c\", code.slice(i, end));\n i = end;\n continue;\n }\n\n if (c === \"/\" && code[i + 1] === \"*\") {\n const close = code.indexOf(\"*/\", i + 2);\n const end = close === -1 ? n : close + 2;\n out += wrap(\"cd-c\", code.slice(i, end));\n i = end;\n continue;\n }\n\n if (c === '\"' || c === \"'\" || c === \"`\") {\n const quote = c;\n let j = i + 1;\n while (j < n) {\n if (code[j] === \"\\\\\") {\n j += 2;\n continue;\n }\n if (code[j] === quote) {\n j++;\n break;\n }\n j++;\n }\n out += wrap(\"cd-s\", code.slice(i, j));\n i = j;\n continue;\n }\n\n if (isDigit(c)) {\n let j = i;\n while (j < n && (isDigit(code[j]!) || code[j] === \".\")) j++;\n out += wrap(\"cd-n\", code.slice(i, j));\n i = j;\n continue;\n }\n\n if (isIdStart(c)) {\n let j = i;\n while (j < n && isIdCont(code[j]!)) j++;\n const word = code.slice(i, j);\n let cls = \"\";\n if (KEYWORDS.has(word)) cls = \"cd-k\";\n else if (/^[A-Z]/.test(word)) cls = \"cd-p\";\n else {\n let k = j;\n while (k < n && code[k] === \" \") k++;\n const next = code[k];\n const prev = i > 0 ? code[i - 1] : \"\";\n const assignment = next === \"=\" && code[k + 1] !== \"=\" && code[k + 1] !== \">\";\n const objectKey = next === \":\";\n const functionCall = next === \"(\";\n const property = prev === \".\";\n if (assignment || objectKey) cls = \"cd-a\";\n else if (functionCall || property) cls = \"cd-f\";\n }\n out += cls ? wrap(cls, word) : escapeCodeHtml(word);\n i = j;\n continue;\n }\n\n out += escapeCodeHtml(c);\n i++;\n }\n\n return out;\n};\n\nconst highlightMarkdownLine = (line: string): string => {\n const escaped = escapeCodeHtml(line);\n\n const heading = /^(#{1,6})(\\s.*)$/.exec(escaped);\n if (heading) return `<span class=\"cd-md-syntax\">${heading[1]}</span>${highlightMarkdownInline(heading[2] ?? \"\")}`;\n\n const ref = /^(@[A-Za-z][\\w-]*)$/.exec(escaped);\n if (ref) return `<span class=\"cd-md-ref\">${ref[1]}</span>`;\n\n const directive = /^(\\s*:::)([A-Za-z][\\w-]*)?(.*)$/.exec(escaped);\n if (directive) {\n const name = directive[2] ? `<span class=\"cd-md-directive\">${directive[2]}</span>` : \"\";\n return `${directive[1] ? `<span class=\"cd-md-syntax\">${directive[1]}</span>` : \"\"}${name}${highlightMarkdownInline(directive[3] ?? \"\")}`;\n }\n\n const fence = /^(```)(.*)$/.exec(escaped);\n if (fence) {\n const language = fence[2] ? `<span class=\"cd-md-ref\">${fence[2]}</span>` : \"\";\n return `<span class=\"cd-md-syntax\">${fence[1]}</span>${language}`;\n }\n\n const table = /^(\\s*\\|)(.*)(\\|\\s*)$/.exec(escaped);\n if (table) return `<span class=\"cd-md-syntax\">${table[1]}</span>${table[2]}<span class=\"cd-md-syntax\">${table[3]}</span>`;\n\n const task = /^(\\s*(?:[-*+]|\\d+\\.)\\s+)(\\[[ xX]\\])(\\s+.*)$/.exec(escaped);\n if (task) {\n return `<span class=\"cd-md-syntax\">${task[1]}</span><span class=\"cd-md-checkbox\">${task[2]}</span>${highlightMarkdownInline(task[3] ?? \"\")}`;\n }\n\n const list = /^(\\s*(?:[-*+]|\\d+\\.)\\s+)(.*)$/.exec(escaped);\n if (list) return `<span class=\"cd-md-syntax\">${list[1]}</span>${highlightMarkdownInline(list[2] ?? \"\")}`;\n\n return highlightMarkdownInline(escaped);\n};\n\nconst highlightMarkdownInline = (escaped: string): string =>\n escaped\n .replace(\n /(`)([^`\\n]+?)(`)/g,\n '<span class=\"cd-md-syntax\">$1</span><span class=\"cd-md-code\">$2</span><span class=\"cd-md-syntax\">$3</span>',\n )\n .replace(/(\\*\\*)([^*\\n]+?)(\\*\\*)/g, '<span class=\"cd-md-syntax\">$1</span>$2<span class=\"cd-md-syntax\">$3</span>')\n .replace(/(\\[[^\\]\\n]+?\\])(\\([^)]+\\))/g, '<span class=\"cd-md-link\">$1</span><span class=\"cd-md-syntax\">$2</span>')\n .replace(/(^|\\s)(@[A-Za-z][\\w-]*)/g, '$1<span class=\"cd-md-ref\">$2</span>')\n .replace(/(#[A-Za-z][\\w/-]*)/g, '<span class=\"cd-md-tag\">$1</span>')\n .replace(/(=[A-Z][A-Z0-9_]*\\([^)\\n]*\\))/g, '<span class=\"cd-md-formula\">$1</span>');\n\nexport const highlightMarkdownDisplay = (code: string): string => code.split(\"\\n\").map(highlightMarkdownLine).join(\"\\n\");\n\nexport const highlightCodeDisplayLines = (code: string, language: CodeDisplayLanguage = \"text\"): string[] => {\n const lines = code.split(\"\\n\");\n\n if (language === \"text\") return lines.map((line) => escapeCodeHtml(line || \" \"));\n\n if (language === \"markdown\" || language === \"md\") {\n let fencedLanguage: string | undefined;\n return lines.map((line) => {\n const fence = /^(```)(\\w+)?(.*)$/.exec(line);\n if (fence) {\n const highlightedFence = highlightMarkdownLine(line);\n fencedLanguage = fencedLanguage ? undefined : fence[2];\n return highlightedFence;\n }\n return isCodeLanguage(fencedLanguage) ? highlightCode(line || \" \") : highlightMarkdownLine(line || \" \");\n });\n }\n\n if (lines.length >= 2 && /^```\\w+/.test(lines[0] ?? \"\") && /^```\\s*$/.test(lines[lines.length - 1] ?? \"\")) {\n return lines.map((line, index) => {\n if (index === 0 || index === lines.length - 1) return highlightMarkdownLine(line || \" \");\n return highlightCode(line || \" \");\n });\n }\n\n return lines.map((line) => highlightCode(line || \" \"));\n};\n\nexport const highlightCodeDisplay = (code: string, language: CodeDisplayLanguage = \"text\"): string => {\n if (code.includes(\"\\n\")) return highlightCodeDisplayLines(code, language).join(\"\\n\");\n if (language === \"markdown\" || language === \"md\") return highlightMarkdownDisplay(code);\n if (language === \"text\") return escapeCodeHtml(code);\n return highlightCode(code);\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[
|
|
1
|
+
{"version":3,"names":[],"sources":["content/collection-selection.ts"],"sourcesContent":["import { batch, createEffect, createSignal, onCleanup } from \"solid-js\";\n\nexport type SelectionModifiers = { shiftKey?: boolean; ctrlKey?: boolean; metaKey?: boolean };\nexport type CollectionSelection = ReturnType<typeof createCollectionSelection>;\n\n/** One selection and focus model shared by alternate presentations of a collection. */\nexport function createCollectionSelection(options: {\n ids: () => readonly string[];\n initial?: readonly string[];\n onChange?: (ids: readonly string[]) => void;\n}) {\n const [selected, setSelected] = createSignal<ReadonlySet<string>>(new Set(options.initial ?? []));\n const [focused, setFocused] = createSignal<string | null>(options.initial?.[0] ?? null);\n let anchor: string | null = options.initial?.[0] ?? null;\n const elements = new Map<string, HTMLElement>();\n const replace = (ids: readonly string[]) => {\n const allowed = new Set(options.ids());\n const next = new Set(ids.filter((id) => allowed.has(id)));\n if (next.size === selected().size && [...next].every((id) => selected().has(id))) return;\n setSelected(next);\n options.onChange?.([...next]);\n };\n createEffect(() => {\n const ids = options.ids();\n replace([...selected()]);\n if (!focused() || !ids.includes(focused()!)) setFocused(ids[0] ?? null);\n if (anchor && !ids.includes(anchor)) anchor = null;\n });\n const toggle = (id: string) => {\n const next = new Set(selected());\n next.has(id) ? next.delete(id) : next.add(id);\n batch(() => {\n setFocused(id);\n replace([...next]);\n });\n anchor = id;\n };\n const select = (id: string, modifiers: SelectionModifiers = {}) => {\n if (!options.ids().includes(id)) return;\n batch(() => {\n setFocused(id);\n if (modifiers.shiftKey && anchor) {\n const ids = options.ids();\n const from = ids.indexOf(anchor);\n const to = ids.indexOf(id);\n const range = ids.slice(Math.min(from, to), Math.max(from, to) + 1);\n replace(modifiers.ctrlKey || modifiers.metaKey ? [...selected(), ...range] : range);\n } else if (modifiers.ctrlKey || modifiers.metaKey) toggle(id);\n else {\n anchor = id;\n replace([id]);\n }\n });\n };\n const focus = (id: string) => {\n setFocused(id);\n elements.get(id)?.focus({ preventScroll: true });\n elements.get(id)?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n };\n const keyDown = (event: KeyboardEvent, id: string, columns = 1) => {\n const ids = options.ids();\n const index = ids.indexOf(id);\n let next: number | undefined;\n if (event.key === \"ArrowDown\") next = index + columns;\n if (event.key === \"ArrowUp\") next = index - columns;\n if (columns > 1 && event.key === \"ArrowRight\") next = index + 1;\n if (columns > 1 && event.key === \"ArrowLeft\") next = index - 1;\n if (event.key === \"Home\") next = 0;\n if (event.key === \"End\") next = ids.length - 1;\n if (next !== undefined && ids.length) {\n event.preventDefault();\n const target = ids[Math.max(0, Math.min(next, ids.length - 1))]!;\n if (event.shiftKey || (!event.ctrlKey && !event.metaKey)) select(target, event);\n focus(target);\n return true;\n }\n if (event.key === \" \") {\n event.preventDefault();\n toggle(id);\n return true;\n }\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === \"a\") {\n event.preventDefault();\n replace(ids);\n return true;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n replace([]);\n return true;\n }\n return false;\n };\n return {\n selected,\n focused,\n select,\n toggle,\n replace,\n focus,\n keyDown,\n clear: () => replace([]),\n all: () => replace(options.ids()),\n markFocused: (id: string) => setFocused(id),\n register: (id: string, element: HTMLElement) => {\n elements.set(id, element);\n onCleanup(() => {\n if (elements.get(id) === element) elements.delete(id);\n });\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[
|
|
1
|
+
{"version":3,"names":[],"sources":["content/delimited-preferences.ts"],"sourcesContent":["export type DelimitedPreferences = { encoding: string; delimiter: string; view: \"table\" | \"raw\" };\n\n/** Persist presentation choices only, never file contents. Ignore stale or corrupt storage. */\nexport const readDelimitedPreferences = (stored: string | null): DelimitedPreferences => {\n const defaults: DelimitedPreferences = { encoding: \"utf-8\", delimiter: \"auto\", view: \"table\" };\n try {\n const value: unknown = JSON.parse(stored ?? \"null\");\n if (!value || typeof value !== \"object\") return defaults;\n return {\n encoding:\n \"encoding\" in value &&\n typeof value.encoding === \"string\" &&\n [\"utf-8\", \"windows-1252\", \"utf-16le\", \"utf-16be\"].includes(value.encoding)\n ? value.encoding\n : defaults.encoding,\n delimiter:\n \"delimiter\" in value && typeof value.delimiter === \"string\" && [\"auto\", \",\", \";\", \"\\t\", \"|\"].includes(value.delimiter)\n ? value.delimiter\n : defaults.delimiter,\n view: \"view\" in value && value.view === \"raw\" ? \"raw\" : \"table\",\n };\n } catch {\n return defaults;\n }\n};\n\nexport const decodeDelimitedContent = (content: { encoding: \"utf8\" | \"base64\"; content: string }, encoding: string): string =>\n content.encoding === \"utf8\"\n ? content.content\n : new TextDecoder(encoding).decode(Uint8Array.from(atob(content.content), (char) => char.charCodeAt(0)));\n"],"mappings":"AAEA;AACA,OAAO,MAAM,wBAAwB,GAAI,MAAqB,IAA2B;EACvF,MAAM,QAA8B,GAAG;IAAE,QAAQ,EAAE,OAAO;IAAE,SAAS,EAAE,MAAM;IAAE,IAAI,EAAE;EAAQ,CAAC;EAC9F,IAAI;IACF,MAAM,KAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC;IACnD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,OAAO,QAAQ;IACxD,OAAO;MACL,QAAQ,EACN,UAAU,IAAI,KAAK,IACnB,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAClC,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,GACtE,KAAK,CAAC,QAAQ,GACd,QAAQ,CAAC,QAAQ;MACvB,SAAS,EACP,WAAW,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAClH,KAAK,CAAC,SAAS,GACf,QAAQ,CAAC,SAAS;MACxB,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG;IAC1D,CAAC;EACH,CAAC,CAAC,MAAM;IACN,OAAO,QAAQ;EACjB;AACF,CAAC;AAED,OAAO,MAAM,sBAAsB,GAAG,CAAC,OAAyD,EAAE,QAAgB,KAChH,OAAO,CAAC,QAAQ,KAAK,MAAM,GACvB,OAAO,CAAC,OAAO,GACf,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAG,IAAI,IAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[
|
|
1
|
+
{"version":3,"names":[],"sources":["content/file-tree.ts"],"sourcesContent":["/**\n * Tree shaping for FileTree — flat paths in, sorted nodes out.\n *\n * Kept beside the component rather than inside it because it is pure: no JSX,\n * no reactivity, nothing that needs a DOM. That is also what makes it testable\n * — a test importing the .tsx pulls the whole component through Bun's JSX\n * transform, which resolves against the root tsconfig and lands on the React\n * runtime. Same reason `file-view-preview.ts` sits next to FileView.\n */\n\nexport type FileTreeEntry = {\n /** Canonical identity, e.g. \"/input/report.csv\". */\n path: string;\n /** Optional presentation label; path remains the identity and rename target. */\n displayName?: string;\n /** Folders are usually implicit from paths — explicit entries model empty dirs. */\n kind?: \"file\" | \"folder\";\n size?: number;\n mediaType?: string;\n updatedAt?: string;\n /** Icon override (tabler class without \"ti \" prefix); default derives from the name. */\n icon?: string;\n /** Small trailing badge, e.g. \"ro\" on read-only mounts. */\n badge?: string;\n};\n\nexport type TreeNode = {\n entry: FileTreeEntry;\n name: string;\n depth: number;\n isFolder: boolean;\n children: TreeNode[];\n};\n\n/** Containing directory of a path; \"/\" for top-level entries. */\nexport const parentOf = (path: string): string => {\n const index = path.lastIndexOf(\"/\");\n return index <= 0 ? \"/\" : path.slice(0, index);\n};\n\nconst nameOf = (path: string): string => path.slice(path.lastIndexOf(\"/\") + 1) || path;\n\nconst nodesByPath = (nodes: TreeNode[]): Map<string, TreeNode> => {\n const result = new Map<string, TreeNode>();\n const visit = (node: TreeNode) => {\n result.set(node.entry.path, node);\n for (const child of node.children) visit(child);\n };\n for (const node of nodes) visit(node);\n return result;\n};\n\n/**\n * Flat paths → sorted tree (folders first, then files, both alphabetical).\n *\n * Passing the previous tree preserves object identity by path while updating\n * the cached node in place. Solid's keyed `<For>` can then keep rows, rename\n * inputs, and focus alive even when a refetch changes metadata.\n */\nexport const buildTree = (entries: FileTreeEntry[], previous: TreeNode[] = []): TreeNode[] => {\n const byPath = new Map<string, FileTreeEntry>();\n const previousByPath = nodesByPath(previous);\n const folders = new Set<string>();\n const files = new Set(entries.filter((entry) => entry.kind !== \"folder\").map((entry) => entry.path));\n for (const entry of entries) {\n for (let dir = parentOf(entry.path); dir !== \"/\"; dir = parentOf(dir)) {\n if (files.has(dir)) {\n throw new Error(`FileTree entry conflict: \"${dir}\" is a file and cannot contain \"${entry.path}\".`);\n }\n }\n }\n for (const entry of entries) {\n byPath.set(entry.path, entry);\n if (entry.kind === \"folder\") folders.add(entry.path);\n // Register all ancestor folders of every entry.\n for (let dir = parentOf(entry.path); dir !== \"/\"; dir = parentOf(dir)) folders.add(dir);\n }\n const childrenByParent = new Map<string, string[]>();\n for (const path of new Set([...byPath.keys(), ...folders])) {\n if (path === \"/\") continue;\n const parent = parentOf(path);\n const children = childrenByParent.get(parent);\n if (children) children.push(path);\n else childrenByParent.set(parent, [path]);\n }\n\n const nodeFor = (path: string, depth: number): TreeNode => {\n const entry = byPath.get(path) ?? { path, kind: \"folder\" as const };\n const isFolder = folders.has(path);\n const old = previousByPath.get(path);\n if (old) {\n old.entry = entry;\n old.name = nameOf(path);\n old.depth = depth;\n old.isFolder = isFolder;\n return old;\n }\n return { entry, name: nameOf(path), depth, isFolder, children: [] };\n };\n\n const childrenOf = (dir: string, depth: number): TreeNode[] => {\n const nodes = (childrenByParent.get(dir) ?? []).map((path) => {\n const node = nodeFor(path, depth);\n if (node.isFolder) node.children = childrenOf(node.entry.path, depth + 1);\n return node;\n });\n return nodes.sort((a, b) => (a.isFolder === b.isFolder ? a.name.localeCompare(b.name) : a.isFolder ? -1 : 1));\n };\n\n return childrenOf(\"/\", 0);\n};\n\nexport const flattenVisible = (nodes: TreeNode[], expanded: Set<string>): TreeNode[] =>\n nodes.flatMap((node) => [node, ...(node.isFolder && expanded.has(node.entry.path) ? flattenVisible(node.children, expanded) : [])]);\n\nexport const allFolderPaths = (nodes: TreeNode[]): string[] =>\n nodes.flatMap((node) => (node.isFolder ? [node.entry.path, ...allFolderPaths(node.children)] : []));\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MEBIBYTE","maxPreviewBytes","markdown","image","pdf","json","audio","video","text","imageMediaTypes","Set","audioMediaTypes","videoMediaTypes","markdownExtensions","imageExtensions","audioExtensions","videoExtensions","textExtensions","fileViewExtension","path","cleanPath","split","name","slice","lastIndexOf","dot","toLowerCase","normalizedMediaType","mediaType","trim","previewKindByType","file","extension","has","endsWith","startsWith","getFileViewPreviewKind","kind","size","undefined","Number","isFinite","canPreviewFile","parseDelimitedText","input","delimiter","limits","maxRows","Math","max","rows","maxColumns","columns","row","field","quoted","truncated","totalRows","columnsTruncated","pushField","length","push","pushRow","offset","index","character"],"sources":["content/file-view-preview.ts"],"sourcesContent":["export type FileViewFile = {\n path: string;\n mediaType?: string;\n size?: number;\n};\n\nexport type FileViewPreviewKind = \"markdown\" | \"image\" | \"pdf\" | \"json\" | \"delimited-text\" | \"audio\" | \"video\" | \"text\";\n\nconst MEBIBYTE = 1024 * 1024;\n\nconst maxPreviewBytes: Record<FileViewPreviewKind, number> = {\n markdown: 2 * MEBIBYTE,\n image: 25 * MEBIBYTE,\n pdf: 50 * MEBIBYTE,\n json: 2 * MEBIBYTE,\n \"delimited-text\": 2 * MEBIBYTE,\n audio: 50 * MEBIBYTE,\n video: 50 * MEBIBYTE,\n text: 2 * MEBIBYTE,\n};\n\n// SVG remains inert because FileView renders every image through <img>; never inject its markup into the DOM.\nconst imageMediaTypes = new Set([\n \"image/avif\",\n \"image/bmp\",\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/svg+xml\",\n \"image/webp\",\n \"image/x-icon\",\n]);\nconst audioMediaTypes = new Set([\n \"audio/aac\",\n \"audio/flac\",\n \"audio/mp4\",\n \"audio/mpeg\",\n \"audio/ogg\",\n \"audio/wav\",\n \"audio/webm\",\n \"audio/x-wav\",\n]);\nconst videoMediaTypes = new Set([\"video/mp4\", \"video/ogg\", \"video/webm\"]);\n\nconst markdownExtensions = new Set([\"md\", \"markdown\"]);\nconst imageExtensions = new Set([\"avif\", \"bmp\", \"gif\", \"ico\", \"jpeg\", \"jpg\", \"png\", \"svg\", \"webp\"]);\nconst audioExtensions = new Set([\"aac\", \"flac\", \"m4a\", \"mp3\", \"oga\", \"ogg\", \"wav\", \"weba\"]);\nconst videoExtensions = new Set([\"m4v\", \"mp4\", \"ogv\", \"webm\"]);\nconst textExtensions = new Set([\n \"c\",\n \"conf\",\n \"cpp\",\n \"css\",\n \"env\",\n \"go\",\n \"h\",\n \"html\",\n \"ini\",\n \"java\",\n \"js\",\n \"jsx\",\n \"log\",\n \"mjs\",\n \"php\",\n \"py\",\n \"rb\",\n \"rs\",\n \"sh\",\n \"sql\",\n \"toml\",\n \"ts\",\n \"tsx\",\n \"txt\",\n \"xml\",\n \"yaml\",\n \"yml\",\n]);\n\nexport const fileViewExtension = (path: string): string => {\n const cleanPath = path.split(/[?#]/, 1)[0] ?? path;\n const name = cleanPath.slice(cleanPath.lastIndexOf(\"/\") + 1);\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(dot + 1).toLowerCase() : \"\";\n};\n\nconst normalizedMediaType = (mediaType?: string): string => mediaType?.split(\";\", 1)[0]?.trim().toLowerCase() ?? \"\";\n\nconst previewKindByType = (file: FileViewFile): FileViewPreviewKind | null => {\n const extension = fileViewExtension(file.path);\n const mediaType = normalizedMediaType(file.mediaType);\n\n if (mediaType === \"text/markdown\" || markdownExtensions.has(extension)) return \"markdown\";\n if (mediaType === \"application/json\" || mediaType.endsWith(\"+json\") || extension === \"json\") return \"json\";\n if (mediaType === \"text/csv\" || mediaType === \"text/tab-separated-values\" || extension === \"csv\" || extension === \"tsv\") {\n return \"delimited-text\";\n }\n if (mediaType === \"application/pdf\" || extension === \"pdf\") return \"pdf\";\n if (imageMediaTypes.has(mediaType) || imageExtensions.has(extension)) return \"image\";\n if (audioMediaTypes.has(mediaType) || audioExtensions.has(extension)) return \"audio\";\n if (videoMediaTypes.has(mediaType) || videoExtensions.has(extension)) return \"video\";\n if (\n mediaType.startsWith(\"text/\") ||\n mediaType === \"application/javascript\" ||\n mediaType === \"application/sql\" ||\n mediaType === \"application/xml\" ||\n textExtensions.has(extension)\n ) {\n return \"text\";\n }\n return null;\n};\n\n/**\n * Returns the built-in preview kind when FileView can render the file within\n * its bounded client-side limits. Custom renderers remain registry-driven.\n */\nexport const getFileViewPreviewKind = (file: FileViewFile): FileViewPreviewKind | null => {\n const kind = previewKindByType(file);\n if (!kind) return null;\n if (file.size !== undefined && (!Number.isFinite(file.size) || file.size < 0 || file.size > maxPreviewBytes[kind])) {\n return null;\n }\n return kind;\n};\n\n/** Use this to expose preview actions only for files FileView can render. */\nexport const canPreviewFile = (file: FileViewFile): boolean => getFileViewPreviewKind(file) !== null;\n\nexport type DelimitedTextPreview = {\n rows: string[][];\n truncated: boolean;\n totalRows: number;\n columnsTruncated: boolean;\n};\n\nexport const parseDelimitedText = (\n input: string,\n delimiter: string,\n limits: { rows?: number; columns?: number; offset?: number } = {},\n): DelimitedTextPreview => {\n const maxRows = Math.max(1, limits.rows ?? 201);\n const maxColumns = Math.max(1, limits.columns ?? 50);\n const rows: string[][] = [];\n let row: string[] = [];\n let field = \"\";\n let quoted = false;\n let truncated = false;\n let totalRows = 0;\n let columnsTruncated = false;\n\n const pushField = () => {\n if (row.length < maxColumns) row.push(field);\n else {\n truncated = true;\n columnsTruncated = true;\n }\n field = \"\";\n };\n const pushRow = () => {\n if (rows.length < maxRows && (totalRows === 0 || totalRows > (limits.offset ?? 0))) rows.push(row);\n else truncated = true;\n totalRows++;\n row = [];\n };\n\n for (let index = 0; index < input.length; index += 1) {\n const character = input[index]!;\n if (quoted) {\n if (character === '\"' && input[index + 1] === '\"') {\n field += '\"';\n index += 1;\n } else if (character === '\"') {\n quoted = false;\n } else {\n field += character;\n }\n continue;\n }\n\n if (character === '\"' && field.length === 0) quoted = true;\n else if (character === delimiter) pushField();\n else if (character === \"\\n\" || character === \"\\r\") {\n pushField();\n pushRow();\n if (character === \"\\r\" && input[index + 1] === \"\\n\") index += 1;\n } else {\n field += character;\n }\n }\n\n if (field.length > 0 || row.length > 0) {\n pushField();\n pushRow();\n }\n\n return { rows, truncated, totalRows, columnsTruncated };\n};\n"],"mappings":"AAQA,MAAMA,QAAQ,GAAG,IAAI,GAAG,IAAI;AAE5B,MAAMC,eAAoD,GAAG;EAC3DC,QAAQ,EAAE,CAAC,GAAGF,QAAQ;EACtBG,KAAK,EAAE,EAAE,GAAGH,QAAQ;EACpBI,GAAG,EAAE,EAAE,GAAGJ,QAAQ;EAClBK,IAAI,EAAE,CAAC,GAAGL,QAAQ;EAClB,gBAAgB,EAAE,CAAC,GAAGA,QAAQ;EAC9BM,KAAK,EAAE,EAAE,GAAGN,QAAQ;EACpBO,KAAK,EAAE,EAAE,GAAGP,QAAQ;EACpBQ,IAAI,EAAE,CAAC,GAAGR;AACZ,CAAC;;AAED;AACA,MAAMS,eAAe,GAAG,IAAIC,GAAG,CAAC,CAC9B,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,CACf,CAAC;AACF,MAAMC,eAAe,GAAG,IAAID,GAAG,CAAC,CAC9B,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,CACd,CAAC;AACF,MAAME,eAAe,GAAG,IAAIF,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAEzE,MAAMG,kBAAkB,GAAG,IAAIH,GAAG,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACtD,MAAMI,eAAe,GAAG,IAAIJ,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACnG,MAAMK,eAAe,GAAG,IAAIL,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC3F,MAAMM,eAAe,GAAG,IAAIN,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC9D,MAAMO,cAAc,GAAG,IAAIP,GAAG,CAAC,CAC7B,GAAG,EACH,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,GAAG,EACH,MAAM,EACN,KAAK,EACL,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAAK,CACN,CAAC;AAEF,OAAO,MAAMQ,iBAAiB,GAAIC,IAAY,IAAa;EACzD,MAAMC,SAAS,GAAGD,IAAI,CAACE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAIF,IAAI;EAClD,MAAMG,IAAI,GAAGF,SAAS,CAACG,KAAK,CAACH,SAAS,CAACI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;EAC5D,MAAMC,GAAG,GAAGH,IAAI,CAACE,WAAW,CAAC,GAAG,CAAC;EACjC,OAAOC,GAAG,GAAG,CAAC,GAAGH,IAAI,CAACC,KAAK,CAACE,GAAG,GAAG,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,GAAG,EAAE;AACzD,CAAC;AAED,MAAMC,mBAAmB,GAAIC,SAAkB,IAAaA,SAAS,EAAEP,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAEQ,IAAI,CAAC,CAAC,CAACH,WAAW,CAAC,CAAC,IAAI,EAAE;AAEnH,MAAMI,iBAAiB,GAAIC,IAAkB,IAAiC;EAC5E,MAAMC,SAAS,GAAGd,iBAAiB,CAACa,IAAI,CAACZ,IAAI,CAAC;EAC9C,MAAMS,SAAS,GAAGD,mBAAmB,CAACI,IAAI,CAACH,SAAS,CAAC;EAErD,IAAIA,SAAS,KAAK,eAAe,IAAIf,kBAAkB,CAACoB,GAAG,CAACD,SAAS,CAAC,EAAE,OAAO,UAAU;EACzF,IAAIJ,SAAS,KAAK,kBAAkB,IAAIA,SAAS,CAACM,QAAQ,CAAC,OAAO,CAAC,IAAIF,SAAS,KAAK,MAAM,EAAE,OAAO,MAAM;EAC1G,IAAIJ,SAAS,KAAK,UAAU,IAAIA,SAAS,KAAK,2BAA2B,IAAII,SAAS,KAAK,KAAK,IAAIA,SAAS,KAAK,KAAK,EAAE;IACvH,OAAO,gBAAgB;EACzB;EACA,IAAIJ,SAAS,KAAK,iBAAiB,IAAII,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK;EACxE,IAAIvB,eAAe,CAACwB,GAAG,CAACL,SAAS,CAAC,IAAId,eAAe,CAACmB,GAAG,CAACD,SAAS,CAAC,EAAE,OAAO,OAAO;EACpF,IAAIrB,eAAe,CAACsB,GAAG,CAACL,SAAS,CAAC,IAAIb,eAAe,CAACkB,GAAG,CAACD,SAAS,CAAC,EAAE,OAAO,OAAO;EACpF,IAAIpB,eAAe,CAACqB,GAAG,CAACL,SAAS,CAAC,IAAIZ,eAAe,CAACiB,GAAG,CAACD,SAAS,CAAC,EAAE,OAAO,OAAO;EACpF,IACEJ,SAAS,CAACO,UAAU,CAAC,OAAO,CAAC,IAC7BP,SAAS,KAAK,wBAAwB,IACtCA,SAAS,KAAK,iBAAiB,IAC/BA,SAAS,KAAK,iBAAiB,IAC/BX,cAAc,CAACgB,GAAG,CAACD,SAAS,CAAC,EAC7B;IACA,OAAO,MAAM;EACf;EACA,OAAO,IAAI;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAMI,sBAAsB,GAAIL,IAAkB,IAAiC;EACxF,MAAMM,IAAI,GAAGP,iBAAiB,CAACC,IAAI,CAAC;EACpC,IAAI,CAACM,IAAI,EAAE,OAAO,IAAI;EACtB,IAAIN,IAAI,CAACO,IAAI,KAAKC,SAAS,KAAK,CAACC,MAAM,CAACC,QAAQ,CAACV,IAAI,CAACO,IAAI,CAAC,IAAIP,IAAI,CAACO,IAAI,GAAG,CAAC,IAAIP,IAAI,CAACO,IAAI,GAAGrC,eAAe,CAACoC,IAAI,CAAC,CAAC,EAAE;IAClH,OAAO,IAAI;EACb;EACA,OAAOA,IAAI;AACb,CAAC;;AAED;AACA,OAAO,MAAMK,cAAc,GAAIX,IAAkB,IAAcK,sBAAsB,CAACL,IAAI,CAAC,KAAK,IAAI;AASpG,OAAO,MAAMY,kBAAkB,GAAGA,CAChCC,KAAa,EACbC,SAAiB,EACjBC,MAA4D,GAAG,CAAC,CAAC,KACxC;EACzB,MAAMC,OAAO,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,MAAM,CAACI,IAAI,IAAI,GAAG,CAAC;EAC/C,MAAMC,UAAU,GAAGH,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,MAAM,CAACM,OAAO,IAAI,EAAE,CAAC;EACpD,MAAMF,IAAgB,GAAG,EAAE;EAC3B,IAAIG,GAAa,GAAG,EAAE;EACtB,IAAIC,KAAK,GAAG,EAAE;EACd,IAAIC,MAAM,GAAG,KAAK;EAClB,IAAIC,SAAS,GAAG,KAAK;EACrB,IAAIC,SAAS,GAAG,CAAC;EACjB,IAAIC,gBAAgB,GAAG,KAAK;EAE5B,MAAMC,SAAS,GAAGA,CAAA,KAAM;IACtB,IAAIN,GAAG,CAACO,MAAM,GAAGT,UAAU,EAAEE,GAAG,CAACQ,IAAI,CAACP,KAAK,CAAC,CAAC,KACxC;MACHE,SAAS,GAAG,IAAI;MAChBE,gBAAgB,GAAG,IAAI;IACzB;IACAJ,KAAK,GAAG,EAAE;EACZ,CAAC;EACD,MAAMQ,OAAO,GAAGA,CAAA,KAAM;IACpB,IAAIZ,IAAI,CAACU,MAAM,GAAGb,OAAO,KAAKU,SAAS,KAAK,CAAC,IAAIA,SAAS,IAAIX,MAAM,CAACiB,MAAM,IAAI,CAAC,CAAC,CAAC,EAAEb,IAAI,CAACW,IAAI,CAACR,GAAG,CAAC,CAAC,KAC9FG,SAAS,GAAG,IAAI;IACrBC,SAAS,EAAE;IACXJ,GAAG,GAAG,EAAE;EACV,CAAC;EAED,KAAK,IAAIW,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGpB,KAAK,CAACgB,MAAM,EAAEI,KAAK,IAAI,CAAC,EAAE;IACpD,MAAMC,SAAS,GAAGrB,KAAK,CAACoB,KAAK,CAAE;IAC/B,IAAIT,MAAM,EAAE;MACV,IAAIU,SAAS,KAAK,GAAG,IAAIrB,KAAK,CAACoB,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;QACjDV,KAAK,IAAI,GAAG;QACZU,KAAK,IAAI,CAAC;MACZ,CAAC,MAAM,IAAIC,SAAS,KAAK,GAAG,EAAE;QAC5BV,MAAM,GAAG,KAAK;MAChB,CAAC,MAAM;QACLD,KAAK,IAAIW,SAAS;MACpB;MACA;IACF;IAEA,IAAIA,SAAS,KAAK,GAAG,IAAIX,KAAK,CAACM,MAAM,KAAK,CAAC,EAAEL,MAAM,GAAG,IAAI,CAAC,KACtD,IAAIU,SAAS,KAAKpB,SAAS,EAAEc,SAAS,CAAC,CAAC,CAAC,KACzC,IAAIM,SAAS,KAAK,IAAI,IAAIA,SAAS,KAAK,IAAI,EAAE;MACjDN,SAAS,CAAC,CAAC;MACXG,OAAO,CAAC,CAAC;MACT,IAAIG,SAAS,KAAK,IAAI,IAAIrB,KAAK,CAACoB,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,EAAEA,KAAK,IAAI,CAAC;IACjE,CAAC,MAAM;MACLV,KAAK,IAAIW,SAAS;IACpB;EACF;EAEA,IAAIX,KAAK,CAACM,MAAM,GAAG,CAAC,IAAIP,GAAG,CAACO,MAAM,GAAG,CAAC,EAAE;IACtCD,SAAS,CAAC,CAAC;IACXG,OAAO,CAAC,CAAC;EACX;EAEA,OAAO;IAAEZ,IAAI;IAAEM,SAAS;IAAEC,SAAS;IAAEC;EAAiB,CAAC;AACzD,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/file-view-preview.ts"],"sourcesContent":["export type FileViewFile = {\n path: string;\n mediaType?: string;\n size?: number;\n};\n\nexport type FileViewPreviewKind = \"markdown\" | \"image\" | \"pdf\" | \"json\" | \"delimited-text\" | \"audio\" | \"video\" | \"text\";\n\nconst MEBIBYTE = 1024 * 1024;\n\nconst maxPreviewBytes: Record<FileViewPreviewKind, number> = {\n markdown: 2 * MEBIBYTE,\n image: 25 * MEBIBYTE,\n pdf: 50 * MEBIBYTE,\n json: 2 * MEBIBYTE,\n \"delimited-text\": 2 * MEBIBYTE,\n audio: 50 * MEBIBYTE,\n video: 50 * MEBIBYTE,\n text: 2 * MEBIBYTE,\n};\n\n// SVG remains inert because FileView renders every image through <img>; never inject its markup into the DOM.\nconst imageMediaTypes = new Set([\n \"image/avif\",\n \"image/bmp\",\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/svg+xml\",\n \"image/webp\",\n \"image/x-icon\",\n]);\nconst audioMediaTypes = new Set([\n \"audio/aac\",\n \"audio/flac\",\n \"audio/mp4\",\n \"audio/mpeg\",\n \"audio/ogg\",\n \"audio/wav\",\n \"audio/webm\",\n \"audio/x-wav\",\n]);\nconst videoMediaTypes = new Set([\"video/mp4\", \"video/ogg\", \"video/webm\"]);\n\nconst markdownExtensions = new Set([\"md\", \"markdown\"]);\nconst imageExtensions = new Set([\"avif\", \"bmp\", \"gif\", \"ico\", \"jpeg\", \"jpg\", \"png\", \"svg\", \"webp\"]);\nconst audioExtensions = new Set([\"aac\", \"flac\", \"m4a\", \"mp3\", \"oga\", \"ogg\", \"wav\", \"weba\"]);\nconst videoExtensions = new Set([\"m4v\", \"mp4\", \"ogv\", \"webm\"]);\nconst textExtensions = new Set([\n \"c\",\n \"conf\",\n \"cpp\",\n \"css\",\n \"env\",\n \"go\",\n \"h\",\n \"html\",\n \"ini\",\n \"java\",\n \"js\",\n \"jsx\",\n \"log\",\n \"mjs\",\n \"php\",\n \"py\",\n \"rb\",\n \"rs\",\n \"sh\",\n \"sql\",\n \"toml\",\n \"ts\",\n \"tsx\",\n \"txt\",\n \"xml\",\n \"yaml\",\n \"yml\",\n]);\n\nexport const fileViewExtension = (path: string): string => {\n const cleanPath = path.split(/[?#]/, 1)[0] ?? path;\n const name = cleanPath.slice(cleanPath.lastIndexOf(\"/\") + 1);\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(dot + 1).toLowerCase() : \"\";\n};\n\nconst normalizedMediaType = (mediaType?: string): string => mediaType?.split(\";\", 1)[0]?.trim().toLowerCase() ?? \"\";\n\nconst previewKindByType = (file: FileViewFile): FileViewPreviewKind | null => {\n const extension = fileViewExtension(file.path);\n const mediaType = normalizedMediaType(file.mediaType);\n\n if (mediaType === \"text/markdown\" || markdownExtensions.has(extension)) return \"markdown\";\n if (mediaType === \"application/json\" || mediaType.endsWith(\"+json\") || extension === \"json\") return \"json\";\n if (mediaType === \"text/csv\" || mediaType === \"text/tab-separated-values\" || extension === \"csv\" || extension === \"tsv\") {\n return \"delimited-text\";\n }\n if (mediaType === \"application/pdf\" || extension === \"pdf\") return \"pdf\";\n if (imageMediaTypes.has(mediaType) || imageExtensions.has(extension)) return \"image\";\n if (audioMediaTypes.has(mediaType) || audioExtensions.has(extension)) return \"audio\";\n if (videoMediaTypes.has(mediaType) || videoExtensions.has(extension)) return \"video\";\n if (\n mediaType.startsWith(\"text/\") ||\n mediaType === \"application/javascript\" ||\n mediaType === \"application/sql\" ||\n mediaType === \"application/xml\" ||\n textExtensions.has(extension)\n ) {\n return \"text\";\n }\n return null;\n};\n\n/**\n * Returns the built-in preview kind when FileView can render the file within\n * its bounded client-side limits. Custom renderers remain registry-driven.\n */\nexport const getFileViewPreviewKind = (file: FileViewFile): FileViewPreviewKind | null => {\n const kind = previewKindByType(file);\n if (!kind) return null;\n if (file.size !== undefined && (!Number.isFinite(file.size) || file.size < 0 || file.size > maxPreviewBytes[kind])) {\n return null;\n }\n return kind;\n};\n\n/** Use this to expose preview actions only for files FileView can render. */\nexport const canPreviewFile = (file: FileViewFile): boolean => getFileViewPreviewKind(file) !== null;\n\nexport type DelimitedTextPreview = {\n rows: string[][];\n truncated: boolean;\n totalRows: number;\n columnsTruncated: boolean;\n};\n\nexport const parseDelimitedText = (\n input: string,\n delimiter: string,\n limits: { rows?: number; columns?: number; offset?: number } = {},\n): DelimitedTextPreview => {\n const maxRows = Math.max(1, limits.rows ?? 201);\n const maxColumns = Math.max(1, limits.columns ?? 50);\n const rows: string[][] = [];\n let row: string[] = [];\n let field = \"\";\n let quoted = false;\n let truncated = false;\n let totalRows = 0;\n let columnsTruncated = false;\n\n const pushField = () => {\n if (row.length < maxColumns) row.push(field);\n else {\n truncated = true;\n columnsTruncated = true;\n }\n field = \"\";\n };\n const pushRow = () => {\n if (rows.length < maxRows && (totalRows === 0 || totalRows > (limits.offset ?? 0))) rows.push(row);\n else truncated = true;\n totalRows++;\n row = [];\n };\n\n for (let index = 0; index < input.length; index += 1) {\n const character = input[index]!;\n if (quoted) {\n if (character === '\"' && input[index + 1] === '\"') {\n field += '\"';\n index += 1;\n } else if (character === '\"') {\n quoted = false;\n } else {\n field += character;\n }\n continue;\n }\n\n if (character === '\"' && field.length === 0) quoted = true;\n else if (character === delimiter) pushField();\n else if (character === \"\\n\" || character === \"\\r\") {\n pushField();\n pushRow();\n if (character === \"\\r\" && input[index + 1] === \"\\n\") index += 1;\n } else {\n field += character;\n }\n }\n\n if (field.length > 0 || row.length > 0) {\n pushField();\n pushRow();\n }\n\n return { rows, truncated, totalRows, columnsTruncated };\n};\n"],"mappings":"AAQA,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI;AAE5B,MAAM,eAAoD,GAAG;EAC3D,QAAQ,EAAE,CAAC,GAAG,QAAQ;EACtB,KAAK,EAAE,EAAE,GAAG,QAAQ;EACpB,GAAG,EAAE,EAAE,GAAG,QAAQ;EAClB,IAAI,EAAE,CAAC,GAAG,QAAQ;EAClB,gBAAgB,EAAE,CAAC,GAAG,QAAQ;EAC9B,KAAK,EAAE,EAAE,GAAG,QAAQ;EACpB,KAAK,EAAE,EAAE,GAAG,QAAQ;EACpB,IAAI,EAAE,CAAC,GAAG;AACZ,CAAC;;AAED;AACA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAC9B,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,eAAe,EACf,YAAY,EACZ,cAAc,CACf,CAAC;AACF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAC9B,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,CACd,CAAC;AACF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAEzE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACtD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACnG,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC3F,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC9D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAC7B,GAAG,EACH,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,GAAG,EACH,MAAM,EACN,KAAK,EACL,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAAK,CACN,CAAC;AAEF,OAAO,MAAM,iBAAiB,GAAI,IAAY,IAAa;EACzD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;EAClD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;EAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;EACjC,OAAO,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE;AACzD,CAAC;AAED,MAAM,mBAAmB,GAAI,SAAkB,IAAa,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE;AAEnH,MAAM,iBAAiB,GAAI,IAAkB,IAAiC;EAC5E,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;EAC9C,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC;EAErD,IAAI,SAAS,KAAK,eAAe,IAAI,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,UAAU;EACzF,IAAI,SAAS,KAAK,kBAAkB,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,KAAK,MAAM,EAAE,OAAO,MAAM;EAC1G,IAAI,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,2BAA2B,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK,EAAE;IACvH,OAAO,gBAAgB;EACzB;EACA,IAAI,SAAS,KAAK,iBAAiB,IAAI,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK;EACxE,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,OAAO;EACpF,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,OAAO;EACpF,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,OAAO;EACpF,IACE,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,IAC7B,SAAS,KAAK,wBAAwB,IACtC,SAAS,KAAK,iBAAiB,IAC/B,SAAS,KAAK,iBAAiB,IAC/B,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAC7B;IACA,OAAO,MAAM;EACf;EACA,OAAO,IAAI;AACb,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,MAAM,sBAAsB,GAAI,IAAkB,IAAiC;EACxF,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;EACpC,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI;EACtB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE;IAClH,OAAO,IAAI;EACb;EACA,OAAO,IAAI;AACb,CAAC;;AAED;AACA,OAAO,MAAM,cAAc,GAAI,IAAkB,IAAc,sBAAsB,CAAC,IAAI,CAAC,KAAK,IAAI;AASpG,OAAO,MAAM,kBAAkB,GAAG,CAChC,KAAa,EACb,SAAiB,EACjB,MAA4D,GAAG,CAAC,CAAC,KACxC;EACzB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC;EAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;EACpD,MAAM,IAAgB,GAAG,EAAE;EAC3B,IAAI,GAAa,GAAG,EAAE;EACtB,IAAI,KAAK,GAAG,EAAE;EACd,IAAI,MAAM,GAAG,KAAK;EAClB,IAAI,SAAS,GAAG,KAAK;EACrB,IAAI,SAAS,GAAG,CAAC;EACjB,IAAI,gBAAgB,GAAG,KAAK;EAE5B,MAAM,SAAS,GAAG,MAAM;IACtB,IAAI,GAAG,CAAC,MAAM,GAAG,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KACxC;MACH,SAAS,GAAG,IAAI;MAChB,gBAAgB,GAAG,IAAI;IACzB;IACA,KAAK,GAAG,EAAE;EACZ,CAAC;EACD,MAAM,OAAO,GAAG,MAAM;IACpB,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,KAAK,SAAS,KAAK,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAC9F,SAAS,GAAG,IAAI;IACrB,SAAS,EAAE;IACX,GAAG,GAAG,EAAE;EACV,CAAC;EAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;IACpD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAE;IAC/B,IAAI,MAAM,EAAE;MACV,IAAI,SAAS,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;QACjD,KAAK,IAAI,GAAG;QACZ,KAAK,IAAI,CAAC;MACZ,CAAC,MAAM,IAAI,SAAS,KAAK,GAAG,EAAE;QAC5B,MAAM,GAAG,KAAK;MAChB,CAAC,MAAM;QACL,KAAK,IAAI,SAAS;MACpB;MACA;IACF;IAEA,IAAI,SAAS,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,KACtD,IAAI,SAAS,KAAK,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,KACzC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE;MACjD,SAAS,CAAC,CAAC;MACX,OAAO,CAAC,CAAC;MACT,IAAI,SAAS,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,KAAK,IAAI,CAAC;IACjE,CAAC,MAAM;MACL,KAAK,IAAI,SAAS;IACpB;EACF;EAEA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;IACtC,SAAS,CAAC,CAAC;IACX,OAAO,CAAC,CAAC;EACX;EAEA,OAAO;IAAE,IAAI;IAAE,SAAS;IAAE,SAAS;IAAE;EAAiB,CAAC;AACzD,CAAC","ignoreList":[]}
|
|
@@ -22,4 +22,5 @@ export { Pagination } from "./Pagination";
|
|
|
22
22
|
export { default as PdfPreview } from "./PdfPreview";
|
|
23
23
|
export { default as RangePicker } from "./RangePicker";
|
|
24
24
|
export { default as StructuredDataPreview, isStructuredDataValue } from "./StructuredDataPreview";
|
|
25
|
+
export { ZoomPanViewport } from "./ZoomPanViewport";
|
|
25
26
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[
|
|
1
|
+
{"version":3,"names":[],"sources":["content/index.ts"],"sourcesContent":["export type {\n CalendarAttendee,\n CalendarDayBadge,\n CalendarEvent,\n CalendarEventColor,\n CalendarEventRenderContext,\n CalendarEventTimeChange,\n CalendarLabels,\n CalendarProps,\n CalendarRecurrence,\n CalendarResource,\n CalendarView,\n} from \"./Calendar\";\nexport { default as Calendar } from \"./Calendar\";\n\nexport type { ChartKind, ChartLabels, ChartProps, ChartRenderOptions } from \"./Chart\";\nexport { default as Chart } from \"./Chart\";\nexport type { ChartExplorerColumn, ChartExplorerProps } from \"./ChartExplorer\";\nexport { ChartExplorer } from \"./ChartExplorer\";\nexport type { ChartExplorerControlsProps } from \"./ChartExplorerControls\";\nexport { ChartExplorerControls } from \"./ChartExplorerControls\";\nexport { ChartFilterControls, type ChartFilterControlsProps } from \"./ChartFilterControls\";\nexport { ChartSnapshotView } from \"./ChartSnapshotView\";\nexport type { CodeDisplayLanguage, CodeDisplayProps } from \"./CodeDisplay\";\nexport { default as CodeDisplay } from \"./CodeDisplay\";\nexport { type ChartCursor, createChartCursor } from \"./chart-cursor\";\nexport type {\n ChartExplorerCharts,\n ChartExplorerController,\n ChartExplorerData,\n ChartExplorerOptions,\n ChartExplorerRequest,\n ChartExplorerRow,\n ChartExplorerSnapshot,\n} from \"./chart-explorer\";\nexport { createChartExplorer } from \"./chart-explorer\";\nexport type { ChartDatumRef, ChartSelection, ChartTooltip, ChartTooltipFormatter } from \"./chart-inspection\";\nexport type { ChartSnapshot } from \"./chart-snapshot\";\nexport { prepareChartSnapshot } from \"./chart-snapshot\";\nexport type {\n StateTimelineChartOptions,\n StateTimelineDomain,\n StateTimelineInterval,\n StateTimelineRow,\n StateTimelineState,\n} from \"./chart-state-timeline\";\nexport { type CollectionSelection, createCollectionSelection, type SelectionModifiers } from \"./collection-selection\";\nexport type {\n DataTableColumn,\n DataTableControlsProps,\n DataTableFooter,\n DataTableHeaderProps,\n DataTablePanelFooterProps,\n DataTablePanelProps,\n DataTableProps,\n DataTableRenderCell,\n DataTableRenderHeader,\n DataTableSort,\n} from \"./DataTable\";\nexport { default as DataTable } from \"./DataTable\";\nexport type { DocCodeHighlighter, DocCodeProps, DocConcept, DocNoteVariant, DocRow } from \"./Docs\";\nexport { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from \"./Docs\";\nexport { FileBrowserPanel, type FileBrowserPanelProps, type FileSource, openFileBrowser } from \"./FileBrowser\";\nexport { FileGrid, type FileGridProps } from \"./FileGrid\";\nexport { default as FileTree, type FileTreeActions, type FileTreeEntry, type FileTreeProps } from \"./FileTree\";\nexport {\n canPreviewFile,\n default as FileView,\n type FileViewContent,\n type FileViewFile,\n type FileViewPreviewKind,\n type FileViewProps,\n type FileViewRenderer,\n type FileViewRendererProps,\n formatFileViewSize,\n getFileViewPreviewKind,\n} from \"./FileView\";\nexport type { LightboxImage } from \"./Lightbox\";\nexport { default as Lightbox } from \"./Lightbox\";\nexport type { LogTableEntry } from \"./LogEntriesTable\";\nexport { default as LogEntriesTable } from \"./LogEntriesTable\";\nexport { default as MarkdownView, type MarkdownRenderOptions, type MarkdownViewProps, renderSafeMarkdown } from \"./MarkdownView\";\nexport { Pagination, type PaginationProps } from \"./Pagination\";\nexport type { PdfPreviewProps, PdfPreviewRequest } from \"./PdfPreview\";\nexport { default as PdfPreview } from \"./PdfPreview\";\nexport type { RangeOption, RangePickerProps } from \"./RangePicker\";\nexport { default as RangePicker } from \"./RangePicker\";\nexport type { StructuredDataPreviewMode, StructuredDataPreviewProps, StructuredDataValue } from \"./StructuredDataPreview\";\nexport { default as StructuredDataPreview, isStructuredDataValue } from \"./StructuredDataPreview\";\nexport type { ZoomPanAction, ZoomPanFullscreen, ZoomPanViewportProps } from \"./ZoomPanViewport\";\nexport { ZoomPanViewport } from \"./ZoomPanViewport\";\n"],"mappings":"AAaA,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAGhD,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,qBAAqB,QAAQ,yBAAyB;AAC/D,SAAS,mBAAmB,QAAuC,uBAAuB;AAC1F,SAAS,iBAAiB,QAAQ,qBAAqB;AAEvD,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AACtD,SAA2B,iBAAiB,QAAQ,gBAAgB;AAUpE,SAAS,mBAAmB,QAAQ,kBAAkB;AAGtD,SAAS,oBAAoB,QAAQ,kBAAkB;AAQvD,SAAmC,yBAAyB,QAAiC,wBAAwB;AAarH,SAAS,OAAO,IAAI,SAAS,QAAQ,aAAa;AAElD,SAAS,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,QAAQ,QAAQ;AAC/G,SAAS,gBAAgB,EAA+C,eAAe,QAAQ,eAAe;AAC9G,SAAS,QAAQ,QAA4B,YAAY;AACzD,SAAS,OAAO,IAAI,QAAQ,QAAsE,YAAY;AAC9G,SACE,cAAc,EACd,OAAO,IAAI,QAAQ,EAOnB,kBAAkB,EAClB,sBAAsB,QACjB,YAAY;AAEnB,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAEhD,SAAS,OAAO,IAAI,eAAe,QAAQ,mBAAmB;AAC9D,SAAS,OAAO,IAAI,YAAY,EAAsD,kBAAkB,QAAQ,gBAAgB;AAChI,SAAS,UAAU,QAA8B,cAAc;AAE/D,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAEpD,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,OAAO,IAAI,qBAAqB,EAAE,qBAAqB,QAAQ,yBAAyB;AAEjG,SAAS,eAAe,QAAQ,mBAAmB","ignoreList":[]}
|