@miethe/ui 0.2.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/CHANGELOG.md +77 -0
- package/README.md +1536 -0
- package/dist/bulk-actions/Button.d.ts +28 -0
- package/dist/bulk-actions/Button.d.ts.map +1 -0
- package/dist/bulk-actions/Button.js +45 -0
- package/dist/bulk-actions/Button.js.map +1 -0
- package/dist/bulk-actions/bulk-action-bar.d.ts +91 -0
- package/dist/bulk-actions/bulk-action-bar.d.ts.map +1 -0
- package/dist/bulk-actions/bulk-action-bar.js +94 -0
- package/dist/bulk-actions/bulk-action-bar.js.map +1 -0
- package/dist/bulk-actions/index.d.ts +5 -0
- package/dist/bulk-actions/index.d.ts.map +1 -0
- package/dist/bulk-actions/index.js +7 -0
- package/dist/bulk-actions/index.js.map +1 -0
- package/dist/bulk-actions/utils.d.ts +6 -0
- package/dist/bulk-actions/utils.d.ts.map +1 -0
- package/dist/bulk-actions/utils.js +9 -0
- package/dist/bulk-actions/utils.js.map +1 -0
- package/dist/components/ui/alert.d.ts +9 -0
- package/dist/components/ui/alert.d.ts.map +1 -0
- package/dist/components/ui/alert.js +23 -0
- package/dist/components/ui/alert.js.map +1 -0
- package/dist/components/ui/button.d.ts +12 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +34 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +6 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.js +7 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +4 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +7 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/content-viewer/ContentPane.d.ts +107 -0
- package/dist/content-viewer/ContentPane.d.ts.map +1 -0
- package/dist/content-viewer/ContentPane.js +247 -0
- package/dist/content-viewer/ContentPane.js.map +1 -0
- package/dist/content-viewer/ContentViewerProvider.d.ts +83 -0
- package/dist/content-viewer/ContentViewerProvider.d.ts.map +1 -0
- package/dist/content-viewer/ContentViewerProvider.js +92 -0
- package/dist/content-viewer/ContentViewerProvider.js.map +1 -0
- package/dist/content-viewer/FileTree.d.ts +71 -0
- package/dist/content-viewer/FileTree.d.ts.map +1 -0
- package/dist/content-viewer/FileTree.js +294 -0
- package/dist/content-viewer/FileTree.js.map +1 -0
- package/dist/content-viewer/adapters.d.ts +101 -0
- package/dist/content-viewer/adapters.d.ts.map +1 -0
- package/dist/content-viewer/adapters.js +32 -0
- package/dist/content-viewer/adapters.js.map +1 -0
- package/dist/content-viewer/index.d.ts +8 -0
- package/dist/content-viewer/index.d.ts.map +1 -0
- package/dist/content-viewer/index.js +5 -0
- package/dist/content-viewer/index.js.map +1 -0
- package/dist/diff/DiffViewer.d.ts +112 -0
- package/dist/diff/DiffViewer.d.ts.map +1 -0
- package/dist/diff/DiffViewer.js +414 -0
- package/dist/diff/DiffViewer.js.map +1 -0
- package/dist/diff/diff.d.ts +32 -0
- package/dist/diff/diff.d.ts.map +1 -0
- package/dist/diff/diff.js +8 -0
- package/dist/diff/diff.js.map +1 -0
- package/dist/diff/index.d.ts +4 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +3 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/display/FilePreviewPane.d.ts +31 -0
- package/dist/display/FilePreviewPane.d.ts.map +1 -0
- package/dist/display/FilePreviewPane.js +144 -0
- package/dist/display/FilePreviewPane.js.map +1 -0
- package/dist/display/FrontmatterDisplay.d.ts +33 -0
- package/dist/display/FrontmatterDisplay.d.ts.map +1 -0
- package/dist/display/FrontmatterDisplay.js +79 -0
- package/dist/display/FrontmatterDisplay.js.map +1 -0
- package/dist/display/index.d.ts +5 -0
- package/dist/display/index.d.ts.map +1 -0
- package/dist/display/index.js +4 -0
- package/dist/display/index.js.map +1 -0
- package/dist/editor/MarkdownEditor.d.ts +28 -0
- package/dist/editor/MarkdownEditor.d.ts.map +1 -0
- package/dist/editor/MarkdownEditor.js +160 -0
- package/dist/editor/MarkdownEditor.js.map +1 -0
- package/dist/editor/SplitPreview.d.ts +28 -0
- package/dist/editor/SplitPreview.d.ts.map +1 -0
- package/dist/editor/SplitPreview.js +34 -0
- package/dist/editor/SplitPreview.js.map +1 -0
- package/dist/editor/index.d.ts +5 -0
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/editor/index.js +4 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/filters/filters-dropdown.d.ts +24 -0
- package/dist/filters/filters-dropdown.d.ts.map +1 -0
- package/dist/filters/filters-dropdown.js +36 -0
- package/dist/filters/filters-dropdown.js.map +1 -0
- package/dist/filters/index.d.ts +9 -0
- package/dist/filters/index.d.ts.map +1 -0
- package/dist/filters/index.js +5 -0
- package/dist/filters/index.js.map +1 -0
- package/dist/filters/sort-dropdown.d.ts +13 -0
- package/dist/filters/sort-dropdown.d.ts.map +1 -0
- package/dist/filters/sort-dropdown.js +20 -0
- package/dist/filters/sort-dropdown.js.map +1 -0
- package/dist/filters/tag-filter-popover.d.ts +39 -0
- package/dist/filters/tag-filter-popover.d.ts.map +1 -0
- package/dist/filters/tag-filter-popover.js +72 -0
- package/dist/filters/tag-filter-popover.js.map +1 -0
- package/dist/filters/tool-filter-popover.d.ts +42 -0
- package/dist/filters/tool-filter-popover.d.ts.map +1 -0
- package/dist/filters/tool-filter-popover.js +67 -0
- package/dist/filters/tool-filter-popover.js.map +1 -0
- package/dist/hooks/use-debounce.d.ts +9 -0
- package/dist/hooks/use-debounce.d.ts.map +1 -0
- package/dist/hooks/use-debounce.js +21 -0
- package/dist/hooks/use-debounce.js.map +1 -0
- package/dist/hooks/use-intersection-observer.d.ts +11 -0
- package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
- package/dist/hooks/use-intersection-observer.js +25 -0
- package/dist/hooks/use-intersection-observer.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/pickers/EntityPickerDialog.d.ts +233 -0
- package/dist/pickers/EntityPickerDialog.d.ts.map +1 -0
- package/dist/pickers/EntityPickerDialog.js +355 -0
- package/dist/pickers/EntityPickerDialog.js.map +1 -0
- package/dist/pickers/EntityPickerViewToggle.d.ts +8 -0
- package/dist/pickers/EntityPickerViewToggle.d.ts.map +1 -0
- package/dist/pickers/EntityPickerViewToggle.js +17 -0
- package/dist/pickers/EntityPickerViewToggle.js.map +1 -0
- package/dist/pickers/index.d.ts +5 -0
- package/dist/pickers/index.d.ts.map +1 -0
- package/dist/pickers/index.js +3 -0
- package/dist/pickers/index.js.map +1 -0
- package/dist/primitives/Badge.d.ts +16 -0
- package/dist/primitives/Badge.d.ts.map +1 -0
- package/dist/primitives/Badge.js +43 -0
- package/dist/primitives/Badge.js.map +1 -0
- package/dist/primitives/BaseArtifactModal.d.ts +114 -0
- package/dist/primitives/BaseArtifactModal.d.ts.map +1 -0
- package/dist/primitives/BaseArtifactModal.js +76 -0
- package/dist/primitives/BaseArtifactModal.js.map +1 -0
- package/dist/primitives/Dialog.d.ts +20 -0
- package/dist/primitives/Dialog.d.ts.map +1 -0
- package/dist/primitives/Dialog.js +24 -0
- package/dist/primitives/Dialog.js.map +1 -0
- package/dist/primitives/DropdownMenu.d.ts +28 -0
- package/dist/primitives/DropdownMenu.d.ts.map +1 -0
- package/dist/primitives/DropdownMenu.js +34 -0
- package/dist/primitives/DropdownMenu.js.map +1 -0
- package/dist/primitives/EnterpriseOwnerBadge.d.ts +9 -0
- package/dist/primitives/EnterpriseOwnerBadge.d.ts.map +1 -0
- package/dist/primitives/EnterpriseOwnerBadge.js +12 -0
- package/dist/primitives/EnterpriseOwnerBadge.js.map +1 -0
- package/dist/primitives/GroupedSelect.d.ts +30 -0
- package/dist/primitives/GroupedSelect.d.ts.map +1 -0
- package/dist/primitives/GroupedSelect.js +47 -0
- package/dist/primitives/GroupedSelect.js.map +1 -0
- package/dist/primitives/Input.d.ts +6 -0
- package/dist/primitives/Input.d.ts.map +1 -0
- package/dist/primitives/Input.js +9 -0
- package/dist/primitives/Input.js.map +1 -0
- package/dist/primitives/LockIcon.d.ts +11 -0
- package/dist/primitives/LockIcon.d.ts.map +1 -0
- package/dist/primitives/LockIcon.js +15 -0
- package/dist/primitives/LockIcon.js.map +1 -0
- package/dist/primitives/MaskedSecretInput.d.ts +16 -0
- package/dist/primitives/MaskedSecretInput.d.ts.map +1 -0
- package/dist/primitives/MaskedSecretInput.js +42 -0
- package/dist/primitives/MaskedSecretInput.js.map +1 -0
- package/dist/primitives/ModalHeader.d.ts +66 -0
- package/dist/primitives/ModalHeader.d.ts.map +1 -0
- package/dist/primitives/ModalHeader.js +58 -0
- package/dist/primitives/ModalHeader.js.map +1 -0
- package/dist/primitives/Popover.d.ts +9 -0
- package/dist/primitives/Popover.d.ts.map +1 -0
- package/dist/primitives/Popover.js +13 -0
- package/dist/primitives/Popover.js.map +1 -0
- package/dist/primitives/ScrollArea.d.ts +6 -0
- package/dist/primitives/ScrollArea.d.ts.map +1 -0
- package/dist/primitives/ScrollArea.js +11 -0
- package/dist/primitives/ScrollArea.js.map +1 -0
- package/dist/primitives/SearchableCombobox.d.ts +30 -0
- package/dist/primitives/SearchableCombobox.d.ts.map +1 -0
- package/dist/primitives/SearchableCombobox.js +124 -0
- package/dist/primitives/SearchableCombobox.js.map +1 -0
- package/dist/primitives/SearchablePickerDialog.d.ts +20 -0
- package/dist/primitives/SearchablePickerDialog.d.ts.map +1 -0
- package/dist/primitives/SearchablePickerDialog.js +78 -0
- package/dist/primitives/SearchablePickerDialog.js.map +1 -0
- package/dist/primitives/StatusBadge.d.ts +21 -0
- package/dist/primitives/StatusBadge.d.ts.map +1 -0
- package/dist/primitives/StatusBadge.js +25 -0
- package/dist/primitives/StatusBadge.js.map +1 -0
- package/dist/primitives/TabNavigation.d.ts +68 -0
- package/dist/primitives/TabNavigation.d.ts.map +1 -0
- package/dist/primitives/TabNavigation.js +74 -0
- package/dist/primitives/TabNavigation.js.map +1 -0
- package/dist/primitives/Tabs.d.ts +8 -0
- package/dist/primitives/Tabs.d.ts.map +1 -0
- package/dist/primitives/Tabs.js +14 -0
- package/dist/primitives/Tabs.js.map +1 -0
- package/dist/primitives/Tooltip.d.ts +8 -0
- package/dist/primitives/Tooltip.d.ts.map +1 -0
- package/dist/primitives/Tooltip.js +12 -0
- package/dist/primitives/Tooltip.js.map +1 -0
- package/dist/primitives/VerticalTabNavigation.d.ts +75 -0
- package/dist/primitives/VerticalTabNavigation.d.ts.map +1 -0
- package/dist/primitives/VerticalTabNavigation.js +166 -0
- package/dist/primitives/VerticalTabNavigation.js.map +1 -0
- package/dist/primitives/ViewModeToggle.d.ts +12 -0
- package/dist/primitives/ViewModeToggle.d.ts.map +1 -0
- package/dist/primitives/ViewModeToggle.js +56 -0
- package/dist/primitives/ViewModeToggle.js.map +1 -0
- package/dist/primitives/WizardShell.d.ts +81 -0
- package/dist/primitives/WizardShell.d.ts.map +1 -0
- package/dist/primitives/WizardShell.js +73 -0
- package/dist/primitives/WizardShell.js.map +1 -0
- package/dist/primitives/index.d.ts +38 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +24 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/utils.d.ts +6 -0
- package/dist/primitives/utils.d.ts.map +1 -0
- package/dist/primitives/utils.js +9 -0
- package/dist/primitives/utils.js.map +1 -0
- package/dist/types/index.d.ts +63 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +63 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +345 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/perf-marks.d.ts +28 -0
- package/dist/utils/perf-marks.d.ts.map +1 -0
- package/dist/utils/perf-marks.js +45 -0
- package/dist/utils/perf-marks.js.map +1 -0
- package/dist/utils/readme-utils.d.ts +67 -0
- package/dist/utils/readme-utils.d.ts.map +1 -0
- package/dist/utils/readme-utils.js +164 -0
- package/dist/utils/readme-utils.js.map +1 -0
- package/dist/utils/type-colors.d.ts +70 -0
- package/dist/utils/type-colors.d.ts.map +1 -0
- package/dist/utils/type-colors.js +118 -0
- package/dist/utils/type-colors.js.map +1 -0
- package/package.json +131 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { File, FileText, FileCode } from 'lucide-react';
|
|
5
|
+
import { Badge } from '../primitives/Badge';
|
|
6
|
+
import { ScrollArea, ScrollBar } from '../primitives/ScrollArea';
|
|
7
|
+
import { Skeleton } from '../components/ui/skeleton';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Helper Functions
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Detect file type based on file extension
|
|
13
|
+
*/
|
|
14
|
+
function getFileType(path) {
|
|
15
|
+
const ext = path.split('.').pop()?.toLowerCase();
|
|
16
|
+
if (ext === 'md')
|
|
17
|
+
return 'markdown';
|
|
18
|
+
if (['ts', 'tsx', 'js', 'jsx', 'py', 'json', 'yaml', 'yml', 'toml'].includes(ext || ''))
|
|
19
|
+
return 'code';
|
|
20
|
+
return 'text';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Extract filename from path
|
|
24
|
+
*/
|
|
25
|
+
function getFileName(path) {
|
|
26
|
+
return path.split('/').pop() || path;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get tier badge variant and label
|
|
30
|
+
*/
|
|
31
|
+
function getTierConfig(tier) {
|
|
32
|
+
const configs = {
|
|
33
|
+
source: { variant: 'outline', label: 'Source' },
|
|
34
|
+
collection: { variant: 'secondary', label: 'Collection' },
|
|
35
|
+
project: { variant: 'default', label: 'Project' },
|
|
36
|
+
};
|
|
37
|
+
return configs[tier];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Simple markdown to HTML converter (basic subset)
|
|
41
|
+
*/
|
|
42
|
+
function renderMarkdown(markdown) {
|
|
43
|
+
let html = markdown;
|
|
44
|
+
// Headers
|
|
45
|
+
html = html.replace(/^### (.*$)/gim, '<h3 class="text-lg font-semibold mt-4 mb-2">$1</h3>');
|
|
46
|
+
html = html.replace(/^## (.*$)/gim, '<h2 class="text-xl font-semibold mt-6 mb-3">$1</h2>');
|
|
47
|
+
html = html.replace(/^# (.*$)/gim, '<h1 class="text-2xl font-bold mt-8 mb-4">$1</h1>');
|
|
48
|
+
// Bold and italic
|
|
49
|
+
html = html.replace(/\*\*\*(.+?)\*\*\*/g, '<strong><em>$1</em></strong>');
|
|
50
|
+
html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
|
|
51
|
+
html = html.replace(/\*(.+?)\*/g, '<em>$1</em>');
|
|
52
|
+
// Code blocks
|
|
53
|
+
html = html.replace(/```(\w+)?\n([\s\S]*?)```/g, '<pre class="bg-muted rounded-md p-4 my-3 overflow-x-auto"><code class="text-sm font-mono">$2</code></pre>');
|
|
54
|
+
// Inline code
|
|
55
|
+
html = html.replace(/`(.+?)`/g, '<code class="bg-muted px-1.5 py-0.5 rounded text-sm">$1</code>');
|
|
56
|
+
// Links
|
|
57
|
+
html = html.replace(/\[(.+?)\]\((.+?)\)/g, '<a href="$2" class="text-primary underline">$1</a>');
|
|
58
|
+
// Lists
|
|
59
|
+
html = html.replace(/^\* (.+)$/gim, '<li class="ml-4">$1</li>');
|
|
60
|
+
html = html.replace(/^- (.+)$/gim, '<li class="ml-4">$1</li>');
|
|
61
|
+
// Line breaks
|
|
62
|
+
html = html.replace(/\n/g, '<br />');
|
|
63
|
+
return html;
|
|
64
|
+
}
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// Loading Skeleton
|
|
67
|
+
// ============================================================================
|
|
68
|
+
function PreviewSkeleton() {
|
|
69
|
+
return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx("div", { className: "border-b p-4", children: _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Skeleton, { className: "h-5 w-48" }), _jsx(Skeleton, { className: "h-5 w-20" })] }) }), _jsx("div", { className: "flex-1 space-y-3 p-6", children: [...Array(15)].map((_, i) => (_jsx(Skeleton, { className: "h-4", style: { width: `${50 + Math.random() * 50}%` } }, i))) })] }));
|
|
70
|
+
}
|
|
71
|
+
// ============================================================================
|
|
72
|
+
// Empty State
|
|
73
|
+
// ============================================================================
|
|
74
|
+
function EmptyState() {
|
|
75
|
+
return (_jsxs("div", { className: "flex h-full flex-col items-center justify-center py-12 text-center", children: [_jsx(File, { className: "mb-4 h-16 w-16 text-muted-foreground opacity-40" }), _jsx("h3", { className: "mb-2 text-base font-medium text-muted-foreground", children: "No file selected" }), _jsx("p", { className: "max-w-sm text-sm text-muted-foreground", children: "Select a file from the file list to preview its contents" })] }));
|
|
76
|
+
}
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// Error State
|
|
79
|
+
// ============================================================================
|
|
80
|
+
function ErrorState() {
|
|
81
|
+
return (_jsxs("div", { className: "flex h-full flex-col items-center justify-center py-12 text-center", children: [_jsx(FileText, { className: "mb-4 h-16 w-16 text-destructive opacity-50" }), _jsx("h3", { className: "mb-2 text-base font-medium text-destructive", children: "Content unavailable" }), _jsx("p", { className: "max-w-sm text-sm text-muted-foreground", children: "Unable to load file content. The file may be too large or in an unsupported format." })] }));
|
|
82
|
+
}
|
|
83
|
+
function MarkdownContent({ content }) {
|
|
84
|
+
const renderedHtml = useMemo(() => renderMarkdown(content), [content]);
|
|
85
|
+
return (_jsx("div", { className: "prose prose-sm max-w-none dark:prose-invert", dangerouslySetInnerHTML: { __html: renderedHtml } }));
|
|
86
|
+
}
|
|
87
|
+
function CodeContent({ content, filePath }) {
|
|
88
|
+
const language = useMemo(() => {
|
|
89
|
+
const ext = filePath.split('.').pop()?.toLowerCase();
|
|
90
|
+
return ext || 'text';
|
|
91
|
+
}, [filePath]);
|
|
92
|
+
return (_jsxs("div", { className: "relative", children: [_jsx("div", { className: "absolute right-2 top-2", children: _jsx(Badge, { variant: "outline", className: "text-xs", children: language }) }), _jsx("pre", { className: "overflow-x-auto rounded-md bg-muted p-4", children: _jsx("code", { className: "font-mono text-sm leading-relaxed", children: content }) })] }));
|
|
93
|
+
}
|
|
94
|
+
function TextContent({ content }) {
|
|
95
|
+
return (_jsx("pre", { className: "whitespace-pre-wrap break-words font-mono text-sm leading-relaxed", children: content }));
|
|
96
|
+
}
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// Main Component
|
|
99
|
+
// ============================================================================
|
|
100
|
+
/**
|
|
101
|
+
* FilePreviewPane - Displays file content with appropriate rendering
|
|
102
|
+
*
|
|
103
|
+
* Features:
|
|
104
|
+
* - Markdown rendering with basic HTML conversion
|
|
105
|
+
* - Syntax-highlighted code display
|
|
106
|
+
* - Plain text display for other files
|
|
107
|
+
* - Loading skeleton state
|
|
108
|
+
* - Empty state when no file selected
|
|
109
|
+
* - Error state for unavailable content
|
|
110
|
+
* - Tier badge showing which version is displayed
|
|
111
|
+
* - Dark mode support
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```tsx
|
|
115
|
+
* <FilePreviewPane
|
|
116
|
+
* filePath="README.md"
|
|
117
|
+
* content={fileContent}
|
|
118
|
+
* tier="collection"
|
|
119
|
+
* isLoading={false}
|
|
120
|
+
* />
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export function FilePreviewPane({ filePath, content, tier, isLoading }) {
|
|
124
|
+
// Loading state
|
|
125
|
+
if (isLoading) {
|
|
126
|
+
return _jsx(PreviewSkeleton, {});
|
|
127
|
+
}
|
|
128
|
+
// Empty state - no file selected
|
|
129
|
+
if (!filePath) {
|
|
130
|
+
return _jsx(EmptyState, {});
|
|
131
|
+
}
|
|
132
|
+
// Error state - file selected but no content
|
|
133
|
+
if (content === null) {
|
|
134
|
+
return _jsx(ErrorState, {});
|
|
135
|
+
}
|
|
136
|
+
// Get file metadata
|
|
137
|
+
const fileName = getFileName(filePath);
|
|
138
|
+
const fileType = getFileType(filePath);
|
|
139
|
+
const tierConfig = getTierConfig(tier);
|
|
140
|
+
// Select icon based on file type
|
|
141
|
+
const FileIcon = fileType === 'markdown' ? FileText : fileType === 'code' ? FileCode : File;
|
|
142
|
+
return (_jsxs("div", { className: "flex h-full flex-col overflow-hidden", children: [_jsxs("div", { className: "flex items-center justify-between border-b bg-muted/20 px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FileIcon, { className: "h-4 w-4 text-muted-foreground" }), _jsxs("h3", { className: "text-sm font-medium", children: ["File Preview: ", _jsx("span", { className: "font-semibold", children: fileName })] })] }), _jsx(Badge, { variant: tierConfig.variant, children: tierConfig.label })] }), _jsxs(ScrollArea, { className: "flex-1", children: [_jsxs("div", { className: "p-6", children: [fileType === 'markdown' && _jsx(MarkdownContent, { content: content }), fileType === 'code' && _jsx(CodeContent, { content: content, filePath: filePath }), fileType === 'text' && _jsx(TextContent, { content: content })] }), _jsx(ScrollBar, { orientation: "horizontal" })] })] }));
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=FilePreviewPane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilePreviewPane.js","sourceRoot":"","sources":["../../src/display/FilePreviewPane.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface FrontmatterDisplayProps {
|
|
2
|
+
/** Parsed YAML frontmatter object */
|
|
3
|
+
frontmatter: Record<string, unknown>;
|
|
4
|
+
/** Whether to start collapsed. Default: false (expanded) */
|
|
5
|
+
defaultCollapsed?: boolean;
|
|
6
|
+
/** Additional CSS classes */
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* FrontmatterDisplay - Collapsible display for YAML frontmatter
|
|
11
|
+
*
|
|
12
|
+
* Displays parsed YAML frontmatter as key-value pairs with support for:
|
|
13
|
+
* - Arrays rendered as comma-separated values
|
|
14
|
+
* - Nested objects (1 level) rendered as indented key-value pairs
|
|
15
|
+
* - Collapsible with expand/collapse toggle
|
|
16
|
+
* - Max height with scrollable content
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* const frontmatter = {
|
|
21
|
+
* title: 'My Document',
|
|
22
|
+
* tags: ['react', 'typescript'],
|
|
23
|
+
* author: { name: 'John', email: 'john@example.com' }
|
|
24
|
+
* };
|
|
25
|
+
*
|
|
26
|
+
* <FrontmatterDisplay
|
|
27
|
+
* frontmatter={frontmatter}
|
|
28
|
+
* defaultCollapsed={false}
|
|
29
|
+
* />
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function FrontmatterDisplay({ frontmatter, defaultCollapsed, className, }: FrontmatterDisplayProps): import("react/jsx-runtime").JSX.Element | null;
|
|
33
|
+
//# sourceMappingURL=FrontmatterDisplay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrontmatterDisplay.d.ts","sourceRoot":"","sources":["../../src/display/FrontmatterDisplay.tsx"],"names":[],"mappings":"AAYA,MAAM,WAAW,uBAAuB;IACtC,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4DD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,gBAAwB,EACxB,SAAS,GACV,EAAE,uBAAuB,kDAoDzB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { ChevronDown, ChevronUp } from 'lucide-react';
|
|
5
|
+
import { cn } from '../primitives/utils';
|
|
6
|
+
import { Button } from '../components/ui/button';
|
|
7
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../components/ui/collapsible';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Helper Functions
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Render a single value based on its type
|
|
13
|
+
*/
|
|
14
|
+
function renderValue(value) {
|
|
15
|
+
if (value === null || value === undefined) {
|
|
16
|
+
return _jsx("span", { className: "italic text-muted-foreground", children: "null" });
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === 'boolean') {
|
|
19
|
+
return _jsx("span", { className: "text-muted-foreground", children: value ? 'true' : 'false' });
|
|
20
|
+
}
|
|
21
|
+
if (typeof value === 'number') {
|
|
22
|
+
return _jsx("span", { children: value });
|
|
23
|
+
}
|
|
24
|
+
if (typeof value === 'string') {
|
|
25
|
+
return _jsx("span", { children: value });
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(value)) {
|
|
28
|
+
// Render arrays as comma-separated values
|
|
29
|
+
const stringValues = value.map((item) => {
|
|
30
|
+
if (typeof item === 'object' && item !== null) {
|
|
31
|
+
return JSON.stringify(item);
|
|
32
|
+
}
|
|
33
|
+
return String(item);
|
|
34
|
+
});
|
|
35
|
+
return _jsx("span", { children: stringValues.join(', ') });
|
|
36
|
+
}
|
|
37
|
+
if (typeof value === 'object') {
|
|
38
|
+
// For nested objects, render as indented key-value pairs (1 level only)
|
|
39
|
+
return (_jsx("div", { className: "ml-4 mt-1 space-y-1", children: Object.entries(value).map(([nestedKey, nestedValue]) => (_jsxs("div", { className: "text-sm", children: [_jsx("strong", { className: "font-medium text-muted-foreground", children: nestedKey }), ":", ' ', typeof nestedValue === 'object' && nestedValue !== null
|
|
40
|
+
? JSON.stringify(nestedValue)
|
|
41
|
+
: String(nestedValue ?? '')] }, nestedKey))) }));
|
|
42
|
+
}
|
|
43
|
+
return _jsx("span", { children: String(value) });
|
|
44
|
+
}
|
|
45
|
+
// ============================================================================
|
|
46
|
+
// Main Component
|
|
47
|
+
// ============================================================================
|
|
48
|
+
/**
|
|
49
|
+
* FrontmatterDisplay - Collapsible display for YAML frontmatter
|
|
50
|
+
*
|
|
51
|
+
* Displays parsed YAML frontmatter as key-value pairs with support for:
|
|
52
|
+
* - Arrays rendered as comma-separated values
|
|
53
|
+
* - Nested objects (1 level) rendered as indented key-value pairs
|
|
54
|
+
* - Collapsible with expand/collapse toggle
|
|
55
|
+
* - Max height with scrollable content
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```tsx
|
|
59
|
+
* const frontmatter = {
|
|
60
|
+
* title: 'My Document',
|
|
61
|
+
* tags: ['react', 'typescript'],
|
|
62
|
+
* author: { name: 'John', email: 'john@example.com' }
|
|
63
|
+
* };
|
|
64
|
+
*
|
|
65
|
+
* <FrontmatterDisplay
|
|
66
|
+
* frontmatter={frontmatter}
|
|
67
|
+
* defaultCollapsed={false}
|
|
68
|
+
* />
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export function FrontmatterDisplay({ frontmatter, defaultCollapsed = false, className, }) {
|
|
72
|
+
const [isOpen, setIsOpen] = useState(!defaultCollapsed);
|
|
73
|
+
const entries = Object.entries(frontmatter);
|
|
74
|
+
if (entries.length === 0) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return (_jsxs(Collapsible, { open: isOpen, onOpenChange: setIsOpen, className: cn('rounded-md border border-border bg-muted/30 p-3', className), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("h4", { className: "text-sm font-medium text-foreground", children: "Frontmatter" }), _jsx(CollapsibleTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "sm", className: "h-7 px-2", "aria-label": isOpen ? 'Hide frontmatter' : 'Show frontmatter', children: isOpen ? (_jsxs(_Fragment, { children: [_jsx(ChevronUp, { className: "mr-1 h-4 w-4", "aria-hidden": "true" }), "Hide"] })) : (_jsxs(_Fragment, { children: [_jsx(ChevronDown, { className: "mr-1 h-4 w-4", "aria-hidden": "true" }), "Show"] })) }) })] }), _jsx(CollapsibleContent, { className: "overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down", children: _jsx("div", { className: "mt-3 max-h-[300px] space-y-2 overflow-y-auto pr-1", children: entries.map(([key, value]) => (_jsxs("div", { className: "text-sm", children: [_jsx("strong", { className: "font-medium", children: key }), ": ", renderValue(value)] }, key))) }) })] }));
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=FrontmatterDisplay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrontmatterDisplay.js","sourceRoot":"","sources":["../../src/display/FrontmatterDisplay.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { FrontmatterDisplay } from './FrontmatterDisplay';
|
|
2
|
+
export type { FrontmatterDisplayProps } from './FrontmatterDisplay';
|
|
3
|
+
export { FilePreviewPane } from './FilePreviewPane';
|
|
4
|
+
export type { FilePreviewPaneProps } from './FilePreviewPane';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/display/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/display/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface MarkdownEditorProps {
|
|
2
|
+
initialContent: string;
|
|
3
|
+
onChange: (content: string) => void;
|
|
4
|
+
readOnly?: boolean;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* MarkdownEditor - CodeMirror 6 based markdown editor
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - Markdown syntax highlighting
|
|
12
|
+
* - Basic keymaps (undo/redo, etc.)
|
|
13
|
+
* - Theme support (light/dark based on system preference)
|
|
14
|
+
* - onChange callback for content changes
|
|
15
|
+
* - ReadOnly mode support
|
|
16
|
+
* - Proper cleanup on unmount
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <MarkdownEditor
|
|
21
|
+
* initialContent="# Hello World"
|
|
22
|
+
* onChange={(content) => setContent(content)}
|
|
23
|
+
* readOnly={false}
|
|
24
|
+
* />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function MarkdownEditor({ initialContent, onChange, readOnly, className, }: MarkdownEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=MarkdownEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownEditor.d.ts","sourceRoot":"","sources":["../../src/editor/MarkdownEditor.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsFD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,cAAc,EACd,QAAQ,EACR,QAAgB,EAChB,SAAS,GACV,EAAE,mBAAmB,2CA0ErB"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
|
+
import { EditorState } from '@codemirror/state';
|
|
5
|
+
import { EditorView, keymap } from '@codemirror/view';
|
|
6
|
+
import { markdown } from '@codemirror/lang-markdown';
|
|
7
|
+
import { defaultKeymap, history, historyKeymap } from '@codemirror/commands';
|
|
8
|
+
import { cn } from '../primitives/utils';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Theme Extensions
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Light theme extension for CodeMirror
|
|
14
|
+
*/
|
|
15
|
+
const lightTheme = EditorView.theme({
|
|
16
|
+
'&': {
|
|
17
|
+
backgroundColor: 'hsl(var(--background))',
|
|
18
|
+
color: 'hsl(var(--foreground))',
|
|
19
|
+
height: '100%',
|
|
20
|
+
},
|
|
21
|
+
'.cm-content': {
|
|
22
|
+
caretColor: 'hsl(var(--foreground))',
|
|
23
|
+
fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',
|
|
24
|
+
fontSize: '14px',
|
|
25
|
+
lineHeight: '1.6',
|
|
26
|
+
padding: '16px',
|
|
27
|
+
},
|
|
28
|
+
'.cm-cursor, .cm-dropCursor': {
|
|
29
|
+
borderLeftColor: 'hsl(var(--foreground))',
|
|
30
|
+
},
|
|
31
|
+
'&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {
|
|
32
|
+
backgroundColor: 'hsl(var(--accent))',
|
|
33
|
+
},
|
|
34
|
+
'.cm-activeLine': {
|
|
35
|
+
backgroundColor: 'hsl(var(--accent) / 0.1)',
|
|
36
|
+
},
|
|
37
|
+
'.cm-gutters': {
|
|
38
|
+
backgroundColor: 'hsl(var(--muted))',
|
|
39
|
+
color: 'hsl(var(--muted-foreground))',
|
|
40
|
+
border: 'none',
|
|
41
|
+
},
|
|
42
|
+
'.cm-activeLineGutter': {
|
|
43
|
+
backgroundColor: 'hsl(var(--accent) / 0.1)',
|
|
44
|
+
},
|
|
45
|
+
}, { dark: false });
|
|
46
|
+
/**
|
|
47
|
+
* Dark theme extension for CodeMirror
|
|
48
|
+
*/
|
|
49
|
+
const darkTheme = EditorView.theme({
|
|
50
|
+
'&': {
|
|
51
|
+
backgroundColor: 'hsl(var(--background))',
|
|
52
|
+
color: 'hsl(var(--foreground))',
|
|
53
|
+
height: '100%',
|
|
54
|
+
},
|
|
55
|
+
'.cm-content': {
|
|
56
|
+
caretColor: 'hsl(var(--foreground))',
|
|
57
|
+
fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',
|
|
58
|
+
fontSize: '14px',
|
|
59
|
+
lineHeight: '1.6',
|
|
60
|
+
padding: '16px',
|
|
61
|
+
},
|
|
62
|
+
'.cm-cursor, .cm-dropCursor': {
|
|
63
|
+
borderLeftColor: 'hsl(var(--foreground))',
|
|
64
|
+
},
|
|
65
|
+
'&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {
|
|
66
|
+
backgroundColor: 'hsl(var(--accent))',
|
|
67
|
+
},
|
|
68
|
+
'.cm-activeLine': {
|
|
69
|
+
backgroundColor: 'hsl(var(--accent) / 0.1)',
|
|
70
|
+
},
|
|
71
|
+
'.cm-gutters': {
|
|
72
|
+
backgroundColor: 'hsl(var(--muted))',
|
|
73
|
+
color: 'hsl(var(--muted-foreground))',
|
|
74
|
+
border: 'none',
|
|
75
|
+
},
|
|
76
|
+
'.cm-activeLineGutter': {
|
|
77
|
+
backgroundColor: 'hsl(var(--accent) / 0.1)',
|
|
78
|
+
},
|
|
79
|
+
}, { dark: true });
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// Main Component
|
|
82
|
+
// ============================================================================
|
|
83
|
+
/**
|
|
84
|
+
* MarkdownEditor - CodeMirror 6 based markdown editor
|
|
85
|
+
*
|
|
86
|
+
* Features:
|
|
87
|
+
* - Markdown syntax highlighting
|
|
88
|
+
* - Basic keymaps (undo/redo, etc.)
|
|
89
|
+
* - Theme support (light/dark based on system preference)
|
|
90
|
+
* - onChange callback for content changes
|
|
91
|
+
* - ReadOnly mode support
|
|
92
|
+
* - Proper cleanup on unmount
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```tsx
|
|
96
|
+
* <MarkdownEditor
|
|
97
|
+
* initialContent="# Hello World"
|
|
98
|
+
* onChange={(content) => setContent(content)}
|
|
99
|
+
* readOnly={false}
|
|
100
|
+
* />
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export function MarkdownEditor({ initialContent, onChange, readOnly = false, className, }) {
|
|
104
|
+
const containerRef = useRef(null);
|
|
105
|
+
const editorRef = useRef(null);
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
if (!containerRef.current)
|
|
108
|
+
return;
|
|
109
|
+
// Detect dark mode from system preference
|
|
110
|
+
const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
111
|
+
// Create editor state with all extensions
|
|
112
|
+
const startState = EditorState.create({
|
|
113
|
+
doc: initialContent,
|
|
114
|
+
extensions: [
|
|
115
|
+
// Language support
|
|
116
|
+
markdown(),
|
|
117
|
+
// History (undo/redo)
|
|
118
|
+
history(),
|
|
119
|
+
// Keymaps
|
|
120
|
+
keymap.of([...defaultKeymap, ...historyKeymap]),
|
|
121
|
+
// Update listener for onChange callback
|
|
122
|
+
EditorView.updateListener.of((update) => {
|
|
123
|
+
if (update.docChanged) {
|
|
124
|
+
onChange(update.state.doc.toString());
|
|
125
|
+
}
|
|
126
|
+
}),
|
|
127
|
+
// ReadOnly mode
|
|
128
|
+
EditorView.editable.of(!readOnly),
|
|
129
|
+
// Theme based on system preference
|
|
130
|
+
isDarkMode ? darkTheme : lightTheme,
|
|
131
|
+
// Line wrapping
|
|
132
|
+
EditorView.lineWrapping,
|
|
133
|
+
],
|
|
134
|
+
});
|
|
135
|
+
// Create editor view
|
|
136
|
+
const view = new EditorView({
|
|
137
|
+
state: startState,
|
|
138
|
+
parent: containerRef.current,
|
|
139
|
+
});
|
|
140
|
+
editorRef.current = view;
|
|
141
|
+
// Cleanup on unmount
|
|
142
|
+
return () => {
|
|
143
|
+
view.destroy();
|
|
144
|
+
};
|
|
145
|
+
}, []); // Only run once on mount
|
|
146
|
+
// Update content when initialContent changes externally
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
if (editorRef.current && editorRef.current.state.doc.toString() !== initialContent) {
|
|
149
|
+
editorRef.current.dispatch({
|
|
150
|
+
changes: {
|
|
151
|
+
from: 0,
|
|
152
|
+
to: editorRef.current.state.doc.length,
|
|
153
|
+
insert: initialContent,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}, [initialContent]);
|
|
158
|
+
return (_jsx("div", { ref: containerRef, className: cn('h-full w-full overflow-auto rounded-md border', className) }));
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=MarkdownEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownEditor.js","sourceRoot":"","sources":["../../src/editor/MarkdownEditor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface SplitPreviewProps {
|
|
2
|
+
content: string;
|
|
3
|
+
onChange: (content: string) => void;
|
|
4
|
+
isEditing: boolean;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* SplitPreview - Split-view markdown editor with live preview
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - Left side: MarkdownEditor component
|
|
12
|
+
* - Right side: Rendered markdown preview
|
|
13
|
+
* - Real-time preview updates as user types
|
|
14
|
+
* - GitHub Flavored Markdown (GFM) support
|
|
15
|
+
* - Responsive layout (side-by-side on desktop, stacked on mobile)
|
|
16
|
+
* - Scrollable preview area
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* <SplitPreview
|
|
21
|
+
* content={markdownContent}
|
|
22
|
+
* onChange={(content) => setContent(content)}
|
|
23
|
+
* isEditing={true}
|
|
24
|
+
* />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function SplitPreview({ content, onChange, isEditing, className }: SplitPreviewProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=SplitPreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SplitPreview.d.ts","sourceRoot":"","sources":["../../src/editor/SplitPreview.tsx"],"names":[],"mappings":"AAYA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CA+B1F"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import ReactMarkdown from 'react-markdown';
|
|
4
|
+
import remarkGfm from 'remark-gfm';
|
|
5
|
+
import { MarkdownEditor } from './MarkdownEditor';
|
|
6
|
+
import { ScrollArea } from '../primitives/ScrollArea';
|
|
7
|
+
import { cn } from '../primitives/utils';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Main Component
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* SplitPreview - Split-view markdown editor with live preview
|
|
13
|
+
*
|
|
14
|
+
* Features:
|
|
15
|
+
* - Left side: MarkdownEditor component
|
|
16
|
+
* - Right side: Rendered markdown preview
|
|
17
|
+
* - Real-time preview updates as user types
|
|
18
|
+
* - GitHub Flavored Markdown (GFM) support
|
|
19
|
+
* - Responsive layout (side-by-side on desktop, stacked on mobile)
|
|
20
|
+
* - Scrollable preview area
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <SplitPreview
|
|
25
|
+
* content={markdownContent}
|
|
26
|
+
* onChange={(content) => setContent(content)}
|
|
27
|
+
* isEditing={true}
|
|
28
|
+
* />
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function SplitPreview({ content, onChange, isEditing, className }) {
|
|
32
|
+
return (_jsxs("div", { className: cn('flex h-full min-w-0 flex-col gap-4 overflow-hidden lg:flex-row', className), children: [isEditing && (_jsx("div", { className: "min-h-[300px] min-w-0 flex-1 lg:min-h-0", children: _jsx(MarkdownEditor, { initialContent: content, onChange: onChange, className: "h-full" }) })), _jsx("div", { className: cn('min-h-[300px] min-w-0 flex-1 overflow-hidden lg:min-h-0', !isEditing && 'w-full'), children: _jsx("div", { className: "h-full overflow-hidden rounded-md border bg-card", children: _jsx(ScrollArea, { className: "h-full w-full [&>[data-radix-scroll-area-viewport]>div]:!block [&>[data-radix-scroll-area-viewport]>div]:!min-w-0", children: _jsx("div", { className: "prose prose-sm max-w-none overflow-x-hidden break-words p-6 [overflow-wrap:anywhere] [word-break:break-word] dark:prose-invert prose-headings:break-words prose-p:break-words prose-code:break-all prose-pre:overflow-x-auto", children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], children: content || '*No content to preview*' }) }) }) }) })] }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=SplitPreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SplitPreview.js","sourceRoot":"","sources":["../../src/editor/SplitPreview.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAC3C,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAazC,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAqB;IACzF,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CAAC,gEAAgE,EAAE,SAAS,CAAC,aAGzF,SAAS,IAAI,CACZ,cAAK,SAAS,EAAC,yCAAyC,YACtD,KAAC,cAAc,IAAC,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAC,QAAQ,GAAG,GAC9E,CACP,EAGD,cACE,SAAS,EAAE,EAAE,CACX,yDAAyD,EACzD,CAAC,SAAS,IAAI,QAAQ,CACvB,YAED,cAAK,SAAS,EAAC,kDAAkD,YAC/D,KAAC,UAAU,IAAC,SAAS,EAAC,mHAAmH,YACvI,cAAK,SAAS,EAAC,8NAA8N,YAC3O,KAAC,aAAa,IAAC,aAAa,EAAE,CAAC,SAAS,CAAC,YACtC,OAAO,IAAI,yBAAyB,GACvB,GACZ,GACK,GACT,GACF,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/editor/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/editor/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type FilterMode = 'and' | 'or';
|
|
2
|
+
export interface FilterCategoryOption {
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
count?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface FilterCategory {
|
|
8
|
+
id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
options: FilterCategoryOption[];
|
|
11
|
+
selected: string[];
|
|
12
|
+
onChange: (values: string[]) => void;
|
|
13
|
+
}
|
|
14
|
+
export interface FiltersDropdownProps {
|
|
15
|
+
/** Filter categories to render as sub-menus */
|
|
16
|
+
categories: FilterCategory[];
|
|
17
|
+
/** AND/OR mode for combining values within each category */
|
|
18
|
+
filterMode?: FilterMode;
|
|
19
|
+
/** Handler for filter mode changes */
|
|
20
|
+
onFilterModeChange?: (mode: FilterMode) => void;
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function FiltersDropdown({ categories, filterMode, onFilterModeChange, className, }: FiltersDropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=filters-dropdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters-dropdown.d.ts","sourceRoot":"","sources":["../../src/filters/filters-dropdown.tsx"],"names":[],"mappings":"AAwBA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;AAEtC,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,sCAAsC;IACtC,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,UAAkB,EAClB,kBAAkB,EAClB,SAAS,GACV,EAAE,oBAAoB,2CA6JtB"}
|