@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,36 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Filter, Check } from 'lucide-react';
|
|
5
|
+
import { Button } from '../components/ui/button';
|
|
6
|
+
import { Badge } from '../primitives/Badge';
|
|
7
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from '../primitives/DropdownMenu';
|
|
8
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '../primitives/Tooltip';
|
|
9
|
+
import { cn } from '../primitives/utils';
|
|
10
|
+
export function FiltersDropdown({ categories, filterMode = 'and', onFilterModeChange, className, }) {
|
|
11
|
+
const activeFilterCount = categories.reduce((total, category) => total + category.selected.length, 0);
|
|
12
|
+
return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", size: "sm", className: cn('gap-2', className), children: [_jsx(Filter, { className: "h-4 w-4", "aria-hidden": "true" }), "Filters", activeFilterCount > 0 && (_jsx(Badge, { variant: "secondary", className: "ml-1 h-5 min-w-[1.25rem] px-1", children: activeFilterCount }))] }) }), _jsxs(DropdownMenuContent, { align: "start", className: "w-56", children: [_jsxs("div", { className: "flex items-center justify-between px-2 py-1.5", children: [_jsx("span", { className: "text-sm font-semibold", children: "Filter By" }), onFilterModeChange && (_jsx(TooltipProvider, { delayDuration: 300, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex items-center rounded-md border bg-muted/50 p-0.5", role: "radiogroup", "aria-label": "Filter combination mode", children: [_jsx("button", { type: "button", role: "radio", "aria-checked": filterMode === 'and', className: cn('rounded px-2 py-0.5 text-[11px] font-medium transition-colors', filterMode === 'and'
|
|
13
|
+
? 'bg-background text-foreground shadow-sm'
|
|
14
|
+
: 'text-muted-foreground hover:text-foreground'), onClick: (e) => {
|
|
15
|
+
e.preventDefault();
|
|
16
|
+
e.stopPropagation();
|
|
17
|
+
onFilterModeChange('and');
|
|
18
|
+
}, children: "AND" }), _jsx("button", { type: "button", role: "radio", "aria-checked": filterMode === 'or', className: cn('rounded px-2 py-0.5 text-[11px] font-medium transition-colors', filterMode === 'or'
|
|
19
|
+
? 'bg-background text-foreground shadow-sm'
|
|
20
|
+
: 'text-muted-foreground hover:text-foreground'), onClick: (e) => {
|
|
21
|
+
e.preventDefault();
|
|
22
|
+
e.stopPropagation();
|
|
23
|
+
onFilterModeChange('or');
|
|
24
|
+
}, children: "OR" })] }) }), _jsx(TooltipContent, { side: "bottom", className: "max-w-[220px] text-xs", children: "Applies within each filter. Across filters is always AND." })] }) }))] }), onFilterModeChange && (_jsxs("p", { className: "px-2 pb-1 text-[10px] leading-tight text-muted-foreground", children: [filterMode === 'and' ? 'Match all' : 'Match any', " selected values within each filter. Across filters is always AND."] })), _jsx(DropdownMenuSeparator, {}), categories.map((category) => (_jsxs(React.Fragment, { children: [_jsxs(DropdownMenuSub, { children: [_jsx(DropdownMenuSubTrigger, { children: _jsxs("span", { className: "flex items-center gap-2", children: [category.label, category.selected.length > 0 && (_jsx(Badge, { variant: "secondary", className: "ml-auto h-5 min-w-[1.25rem] px-1 text-[10px]", children: category.selected.length }))] }) }), _jsxs(DropdownMenuSubContent, { className: "w-48 max-h-60 overflow-y-auto", children: [category.selected.length > 0 && (_jsxs(_Fragment, { children: [_jsx(DropdownMenuItem, { onSelect: (e) => e.preventDefault(), onClick: () => category.onChange([]), children: _jsx("span", { className: "text-xs text-muted-foreground", children: "Clear all" }) }), _jsx(DropdownMenuSeparator, {})] })), category.options.map((option) => {
|
|
25
|
+
const isSelected = category.selected.includes(option.value);
|
|
26
|
+
return (_jsx(DropdownMenuItem, { onSelect: (e) => e.preventDefault(), onClick: () => {
|
|
27
|
+
if (isSelected) {
|
|
28
|
+
category.onChange(category.selected.filter((v) => v !== option.value));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
category.onChange([...category.selected, option.value]);
|
|
32
|
+
}
|
|
33
|
+
}, children: _jsxs("span", { className: "flex w-full items-center gap-2", children: [_jsx("div", { className: cn('flex h-4 w-4 shrink-0 items-center justify-center rounded border', isSelected ? 'border-primary bg-primary' : 'border-input'), children: isSelected && (_jsx(Check, { className: "h-3 w-3 text-primary-foreground" })) }), _jsx("span", { className: "truncate", children: option.label }), option.count != null && option.count > 0 && (_jsx("span", { className: "ml-auto text-xs text-muted-foreground", children: option.count }))] }) }, option.value));
|
|
34
|
+
})] })] }), _jsx(DropdownMenuSeparator, {})] }, category.id)))] })] }));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=filters-dropdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters-dropdown.js","sourceRoot":"","sources":["../../src/filters/filters-dropdown.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { TagFilterPopover, TagFilterBar } from './tag-filter-popover';
|
|
2
|
+
export type { TagFilterPopoverProps, AvailableTag } from './tag-filter-popover';
|
|
3
|
+
export { ToolFilterPopover, ToolFilterBar } from './tool-filter-popover';
|
|
4
|
+
export type { ToolFilterPopoverProps, AvailableTool } from './tool-filter-popover';
|
|
5
|
+
export { FiltersDropdown } from './filters-dropdown';
|
|
6
|
+
export type { FilterCategory, FilterCategoryOption, FilterMode, FiltersDropdownProps, } from './filters-dropdown';
|
|
7
|
+
export { SortDropdown } from './sort-dropdown';
|
|
8
|
+
export type { SortOption, SortDropdownProps } from './sort-dropdown';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACtE,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,UAAU,EACV,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { TagFilterPopover, TagFilterBar } from './tag-filter-popover';
|
|
2
|
+
export { ToolFilterPopover, ToolFilterBar } from './tool-filter-popover';
|
|
3
|
+
export { FiltersDropdown } from './filters-dropdown';
|
|
4
|
+
export { SortDropdown } from './sort-dropdown';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAOrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface SortOption {
|
|
2
|
+
value: string;
|
|
3
|
+
label: string;
|
|
4
|
+
}
|
|
5
|
+
export interface SortDropdownProps {
|
|
6
|
+
options: SortOption[];
|
|
7
|
+
sortField: string;
|
|
8
|
+
sortOrder: 'asc' | 'desc';
|
|
9
|
+
onSortChange: (field: string, order: 'asc' | 'desc') => void;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function SortDropdown({ options, sortField, sortOrder, onSortChange, className, }: SortDropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=sort-dropdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort-dropdown.d.ts","sourceRoot":"","sources":["../../src/filters/sort-dropdown.tsx"],"names":[],"mappings":"AAcA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;IAC1B,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,SAAS,EACT,SAAS,EACT,YAAY,EACZ,SAAS,GACV,EAAE,iBAAiB,2CAyDnB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { ArrowUpDown } from 'lucide-react';
|
|
4
|
+
import { Button } from '../components/ui/button';
|
|
5
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '../primitives/DropdownMenu';
|
|
6
|
+
import { cn } from '../primitives/utils';
|
|
7
|
+
export function SortDropdown({ options, sortField, sortOrder, onSortChange, className, }) {
|
|
8
|
+
return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", size: "sm", className: cn('gap-2', className), children: [_jsx(ArrowUpDown, { className: "h-4 w-4", "aria-hidden": "true" }), "Sort"] }) }), _jsxs(DropdownMenuContent, { align: "start", children: [_jsx(DropdownMenuLabel, { children: "Sort By" }), _jsx(DropdownMenuSeparator, {}), options.map((option) => (_jsxs(DropdownMenuItem, { onClick: () => {
|
|
9
|
+
if (sortField === option.value) {
|
|
10
|
+
// Already selected — toggle order
|
|
11
|
+
onSortChange(option.value, sortOrder === 'asc' ? 'desc' : 'asc');
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
onSortChange(option.value, sortOrder);
|
|
15
|
+
}
|
|
16
|
+
}, "aria-current": sortField === option.value ? 'true' : undefined, children: [option.label, sortField === option.value && (_jsx("span", { className: "ml-1", "aria-hidden": "true", children: sortOrder === 'asc' ? '↑' : '↓' })), _jsx("span", { className: "sr-only", children: sortField === option.value
|
|
17
|
+
? `, sorted ${sortOrder === 'asc' ? 'ascending' : 'descending'}`
|
|
18
|
+
: '' })] }, option.value))), _jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuItem, { onClick: () => onSortChange(sortField, sortOrder === 'asc' ? 'desc' : 'asc'), children: sortOrder === 'asc' ? (_jsxs(_Fragment, { children: ["Ascending ", _jsx("span", { "aria-hidden": "true", children: "\u2191" }), _jsx("span", { className: "sr-only", children: "(click to switch to descending)" })] })) : (_jsxs(_Fragment, { children: ["Descending ", _jsx("span", { "aria-hidden": "true", children: "\u2193" }), _jsx("span", { className: "sr-only", children: "(click to switch to ascending)" })] })) })] })] }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=sort-dropdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort-dropdown.js","sourceRoot":"","sources":["../../src/filters/sort-dropdown.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAezC,MAAM,UAAU,YAAY,CAAC,EAC3B,OAAO,EACP,SAAS,EACT,SAAS,EACT,YAAY,EACZ,SAAS,GACS;IAClB,OAAO,CACL,MAAC,YAAY,eACX,KAAC,mBAAmB,IAAC,OAAO,kBAC1B,MAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,aACnE,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,iBAAa,MAAM,GAAG,YAE/C,GACW,EACtB,MAAC,mBAAmB,IAAC,KAAK,EAAC,OAAO,aAChC,KAAC,iBAAiB,0BAA4B,EAC9C,KAAC,qBAAqB,KAAG,EACxB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,MAAC,gBAAgB,IAEf,OAAO,EAAE,GAAG,EAAE;4BACZ,IAAI,SAAS,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;gCAC/B,kCAAkC;gCAClC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;4BACnE,CAAC;iCAAM,CAAC;gCACN,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;4BACxC,CAAC;wBACH,CAAC,kBACa,SAAS,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,aAE5D,MAAM,CAAC,KAAK,EACZ,SAAS,KAAK,MAAM,CAAC,KAAK,IAAI,CAC7B,eAAM,SAAS,EAAC,MAAM,iBAAa,MAAM,YACtC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAC3B,CACR,EACD,eAAM,SAAS,EAAC,SAAS,YACtB,SAAS,KAAK,MAAM,CAAC,KAAK;oCACzB,CAAC,CAAC,YAAY,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE;oCAChE,CAAC,CAAC,EAAE,GACD,KArBF,MAAM,CAAC,KAAK,CAsBA,CACpB,CAAC,EACF,KAAC,qBAAqB,KAAG,EACzB,KAAC,gBAAgB,IACf,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,YAE3E,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CACrB,4CACY,8BAAkB,MAAM,uBAAS,EAC3C,eAAM,SAAS,EAAC,SAAS,gDAAuC,IAC/D,CACJ,CAAC,CAAC,CAAC,CACF,6CACa,8BAAkB,MAAM,uBAAS,EAC5C,eAAM,SAAS,EAAC,SAAS,+CAAsC,IAC9D,CACJ,GACgB,IACC,IACT,CAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface AvailableTag {
|
|
2
|
+
name: string;
|
|
3
|
+
artifact_count: number;
|
|
4
|
+
color?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface TagFilterPopoverProps {
|
|
7
|
+
selectedTags: string[];
|
|
8
|
+
onChange: (tags: string[]) => void;
|
|
9
|
+
/** Tags to display in the popover */
|
|
10
|
+
availableTags: AvailableTag[];
|
|
11
|
+
className?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Tag filter popover component with search and multi-select.
|
|
15
|
+
*
|
|
16
|
+
* Shows a popover with all available tags and their artifact counts.
|
|
17
|
+
* Allows multi-select of tags for filtering with a search box.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* const [selectedTags, setSelectedTags] = useState<string[]>([]);
|
|
22
|
+
* <TagFilterPopover selectedTags={selectedTags} onChange={setSelectedTags} availableTags={tags} />
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function TagFilterPopover({ selectedTags, onChange, availableTags, className, }: TagFilterPopoverProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
/**
|
|
27
|
+
* Inline filter bar showing selected tags with remove buttons.
|
|
28
|
+
*
|
|
29
|
+
* Only visible when tags are selected. Shows each selected tag
|
|
30
|
+
* with an X button to remove it, plus a "Clear all" button.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```tsx
|
|
34
|
+
* const [selectedTags, setSelectedTags] = useState<string[]>(['tag1', 'tag2']);
|
|
35
|
+
* <TagFilterBar selectedTags={selectedTags} onChange={setSelectedTags} availableTags={tags} />
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function TagFilterBar({ selectedTags, onChange, availableTags, className, }: TagFilterPopoverProps): import("react/jsx-runtime").JSX.Element | null;
|
|
39
|
+
//# sourceMappingURL=tag-filter-popover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag-filter-popover.d.ts","sourceRoot":"","sources":["../../src/filters/tag-filter-popover.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,qCAAqC;IACrC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,SAAS,GACV,EAAE,qBAAqB,2CAqGvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,EAC3B,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,SAAS,GACV,EAAE,qBAAqB,kDAuBvB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Filter, X, Check, Search } from 'lucide-react';
|
|
5
|
+
import { Button } from '../components/ui/button';
|
|
6
|
+
import { Popover, PopoverContent, PopoverTrigger } from '../primitives/Popover';
|
|
7
|
+
import { Badge } from '../primitives/Badge';
|
|
8
|
+
import { Input } from '../primitives/Input';
|
|
9
|
+
import { ScrollArea } from '../primitives/ScrollArea';
|
|
10
|
+
import { cn } from '../primitives/utils';
|
|
11
|
+
/**
|
|
12
|
+
* Tag filter popover component with search and multi-select.
|
|
13
|
+
*
|
|
14
|
+
* Shows a popover with all available tags and their artifact counts.
|
|
15
|
+
* Allows multi-select of tags for filtering with a search box.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* const [selectedTags, setSelectedTags] = useState<string[]>([]);
|
|
20
|
+
* <TagFilterPopover selectedTags={selectedTags} onChange={setSelectedTags} availableTags={tags} />
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function TagFilterPopover({ selectedTags, onChange, availableTags, className, }) {
|
|
24
|
+
const [open, setOpen] = React.useState(false);
|
|
25
|
+
const [search, setSearch] = React.useState('');
|
|
26
|
+
// Filter tags by search, and only show tags that have at least one artifact
|
|
27
|
+
const filteredTags = React.useMemo(() => {
|
|
28
|
+
let result = availableTags.filter((tag) => (tag.artifact_count ?? 0) > 0);
|
|
29
|
+
if (search) {
|
|
30
|
+
result = result.filter((tag) => tag.name.toLowerCase().includes(search.toLowerCase()));
|
|
31
|
+
}
|
|
32
|
+
return result.sort((a, b) => a.name.localeCompare(b.name));
|
|
33
|
+
}, [availableTags, search]);
|
|
34
|
+
// Toggle tag by name
|
|
35
|
+
const toggleTag = (tagName) => {
|
|
36
|
+
if (selectedTags.includes(tagName)) {
|
|
37
|
+
onChange(selectedTags.filter((name) => name !== tagName));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
onChange([...selectedTags, tagName]);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const clearAll = () => {
|
|
44
|
+
onChange([]);
|
|
45
|
+
setSearch('');
|
|
46
|
+
};
|
|
47
|
+
return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", size: "sm", className: cn('gap-2', className), children: [_jsx(Filter, { className: "h-4 w-4" }), "Tags", selectedTags.length > 0 && (_jsx(Badge, { variant: "secondary", className: "ml-1 rounded-full px-2", children: selectedTags.length }))] }) }), _jsxs(PopoverContent, { className: "w-72 p-0", align: "start", children: [_jsxs("div", { className: "border-b p-3", children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsx("span", { className: "text-sm font-medium", children: "Filter by tags" }), selectedTags.length > 0 && (_jsx(Button, { variant: "ghost", size: "sm", onClick: clearAll, className: "h-6 px-2 text-xs", children: "Clear all" }))] }), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-2 top-2.5 h-4 w-4 text-muted-foreground" }), _jsx(Input, { placeholder: "Search tags...", value: search, onChange: (e) => setSearch(e.target.value), className: "h-9 pl-8" })] })] }), _jsx(ScrollArea, { className: "h-60", children: _jsx("div", { className: "p-2", children: filteredTags.length === 0 ? (_jsx("div", { className: "py-4 text-center text-sm text-muted-foreground", children: "No tags found" })) : (filteredTags.map((tag) => {
|
|
48
|
+
const isSelected = selectedTags.includes(tag.name);
|
|
49
|
+
return (_jsxs("div", { className: cn('flex cursor-pointer items-center justify-between rounded-md px-2 py-1.5 hover:bg-accent', isSelected && 'bg-accent'), onClick: () => toggleTag(tag.name), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: cn('flex h-4 w-4 items-center justify-center rounded border', isSelected ? 'border-primary bg-primary' : 'border-input'), children: isSelected && _jsx(Check, { className: "h-3 w-3 text-primary-foreground" }) }), _jsx(Badge, { variant: "secondary", colorStyle: tag.color, children: tag.name })] }), tag.artifact_count !== undefined && (_jsx("span", { className: "text-xs text-muted-foreground", children: tag.artifact_count }))] }, tag.name));
|
|
50
|
+
})) }) })] })] }));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Inline filter bar showing selected tags with remove buttons.
|
|
54
|
+
*
|
|
55
|
+
* Only visible when tags are selected. Shows each selected tag
|
|
56
|
+
* with an X button to remove it, plus a "Clear all" button.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```tsx
|
|
60
|
+
* const [selectedTags, setSelectedTags] = useState<string[]>(['tag1', 'tag2']);
|
|
61
|
+
* <TagFilterBar selectedTags={selectedTags} onChange={setSelectedTags} availableTags={tags} />
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export function TagFilterBar({ selectedTags, onChange, availableTags, className, }) {
|
|
65
|
+
if (selectedTags.length === 0)
|
|
66
|
+
return null;
|
|
67
|
+
return (_jsxs("div", { className: cn('flex flex-wrap items-center gap-2', className), children: [_jsx("span", { className: "text-sm text-muted-foreground", children: "Filtering by:" }), selectedTags.map((tagName) => {
|
|
68
|
+
const tagInfo = availableTags.find((t) => t.name === tagName);
|
|
69
|
+
return (_jsxs(Badge, { variant: "secondary", colorStyle: tagInfo?.color, className: "gap-1", children: [tagName, _jsx(X, { className: "h-3 w-3 cursor-pointer hover:opacity-70", onClick: () => onChange(selectedTags.filter((name) => name !== tagName)) })] }, tagName));
|
|
70
|
+
}), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => onChange([]), className: "h-6 text-xs", children: "Clear all" })] }));
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=tag-filter-popover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag-filter-popover.js","sourceRoot":"","sources":["../../src/filters/tag-filter-popover.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAgBzC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,SAAS,GACa;IACtB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE/C,4EAA4E;IAC5E,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACtC,IAAI,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IAE5B,qBAAqB;IACrB,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,EAAE;QACpC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,CAAC,GAAG,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,OAAO,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,aACxC,KAAC,cAAc,IAAC,OAAO,kBACrB,MAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,EAAC,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,aACnE,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,GAAG,UAE7B,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1B,KAAC,KAAK,IAAC,OAAO,EAAC,WAAW,EAAC,SAAS,EAAC,wBAAwB,YAC1D,YAAY,CAAC,MAAM,GACd,CACT,IACM,GACM,EACjB,MAAC,cAAc,IAAC,SAAS,EAAC,UAAU,EAAC,KAAK,EAAC,OAAO,aAChD,eAAK,SAAS,EAAC,cAAc,aAC3B,eAAK,SAAS,EAAC,wCAAwC,aACrD,eAAM,SAAS,EAAC,qBAAqB,+BAAsB,EAC1D,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1B,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAC,kBAAkB,0BAExE,CACV,IACG,EACN,eAAK,SAAS,EAAC,UAAU,aACvB,KAAC,MAAM,IAAC,SAAS,EAAC,uDAAuD,GAAG,EAC5E,KAAC,KAAK,IACJ,WAAW,EAAC,gBAAgB,EAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1C,SAAS,EAAC,UAAU,GACpB,IACE,IACF,EACN,KAAC,UAAU,IAAC,SAAS,EAAC,MAAM,YAC1B,cAAK,SAAS,EAAC,KAAK,YACjB,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC3B,cAAK,SAAS,EAAC,gDAAgD,8BAAoB,CACpF,CAAC,CAAC,CAAC,CACF,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gCACvB,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gCACnD,OAAO,CACL,eAEE,SAAS,EAAE,EAAE,CACX,yFAAyF,EACzF,UAAU,IAAI,WAAW,CAC1B,EACD,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,aAElC,eAAK,SAAS,EAAC,yBAAyB,aACtC,cACE,SAAS,EAAE,EAAE,CACX,yDAAyD,EACzD,UAAU,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,cAAc,CAC1D,YAEA,UAAU,IAAI,KAAC,KAAK,IAAC,SAAS,EAAC,iCAAiC,GAAG,GAChE,EACN,KAAC,KAAK,IAAC,OAAO,EAAC,WAAW,EAAC,UAAU,EAAE,GAAG,CAAC,KAAK,YAC7C,GAAG,CAAC,IAAI,GACH,IACJ,EACL,GAAG,CAAC,cAAc,KAAK,SAAS,IAAI,CACnC,eAAM,SAAS,EAAC,+BAA+B,YAAE,GAAG,CAAC,cAAc,GAAQ,CAC5E,KAtBI,GAAG,CAAC,IAAI,CAuBT,CACP,CAAC;4BACJ,CAAC,CAAC,CACH,GACG,GACK,IACE,IACT,CACX,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,SAAS,GACa;IACtB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,mCAAmC,EAAE,SAAS,CAAC,aAChE,eAAM,SAAS,EAAC,+BAA+B,8BAAqB,EACnE,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBAC9D,OAAO,CACL,MAAC,KAAK,IAAe,OAAO,EAAC,WAAW,EAAC,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAC,OAAO,aACnF,OAAO,EACR,KAAC,CAAC,IACA,SAAS,EAAC,yCAAyC,EACnD,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GACxE,KALQ,OAAO,CAMX,CACT,CAAC;YACJ,CAAC,CAAC,EACF,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,EAAC,aAAa,0BAE7E,IACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface AvailableTool {
|
|
2
|
+
name: string;
|
|
3
|
+
artifact_count: number;
|
|
4
|
+
}
|
|
5
|
+
export interface ToolFilterPopoverProps {
|
|
6
|
+
selectedTools: string[];
|
|
7
|
+
onChange: (tools: string[]) => void;
|
|
8
|
+
/** Tools to display in the popover */
|
|
9
|
+
availableTools: AvailableTool[];
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Tool filter popover component with search and multi-select.
|
|
14
|
+
*
|
|
15
|
+
* Shows a popover with all available tools and their artifact counts.
|
|
16
|
+
* Allows multi-select of tools for filtering with a search box.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* const [selectedTools, setSelectedTools] = useState<string[]>([]);
|
|
21
|
+
* <ToolFilterPopover selectedTools={selectedTools} onChange={setSelectedTools} availableTools={tools} />
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function ToolFilterPopover({ selectedTools, onChange, availableTools, className, }: ToolFilterPopoverProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
/**
|
|
26
|
+
* Inline filter bar showing selected tools with remove buttons.
|
|
27
|
+
*
|
|
28
|
+
* Only visible when tools are selected. Shows each selected tool
|
|
29
|
+
* with an X button to remove it, plus a "Clear all" button.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* const [selectedTools, setSelectedTools] = useState<string[]>(['Read', 'Write']);
|
|
34
|
+
* <ToolFilterBar selectedTools={selectedTools} onChange={setSelectedTools} />
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function ToolFilterBar({ selectedTools, onChange, className, }: {
|
|
38
|
+
selectedTools: string[];
|
|
39
|
+
onChange: (tools: string[]) => void;
|
|
40
|
+
className?: string;
|
|
41
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
42
|
+
//# sourceMappingURL=tool-filter-popover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-filter-popover.d.ts","sourceRoot":"","sources":["../../src/filters/tool-filter-popover.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpC,sCAAsC;IACtC,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,aAAa,EACb,QAAQ,EACR,cAAc,EACd,SAAS,GACV,EAAE,sBAAsB,2CAkGxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAC5B,aAAa,EACb,QAAQ,EACR,SAAS,GACV,EAAE;IACD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,kDAoBA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Wrench, X, Check, Search } from 'lucide-react';
|
|
5
|
+
import { Button } from '../components/ui/button';
|
|
6
|
+
import { Popover, PopoverContent, PopoverTrigger } from '../primitives/Popover';
|
|
7
|
+
import { Badge } from '../primitives/Badge';
|
|
8
|
+
import { Input } from '../primitives/Input';
|
|
9
|
+
import { ScrollArea } from '../primitives/ScrollArea';
|
|
10
|
+
import { cn } from '../primitives/utils';
|
|
11
|
+
/**
|
|
12
|
+
* Tool filter popover component with search and multi-select.
|
|
13
|
+
*
|
|
14
|
+
* Shows a popover with all available tools and their artifact counts.
|
|
15
|
+
* Allows multi-select of tools for filtering with a search box.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* const [selectedTools, setSelectedTools] = useState<string[]>([]);
|
|
20
|
+
* <ToolFilterPopover selectedTools={selectedTools} onChange={setSelectedTools} availableTools={tools} />
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function ToolFilterPopover({ selectedTools, onChange, availableTools, className, }) {
|
|
24
|
+
const [open, setOpen] = React.useState(false);
|
|
25
|
+
const [search, setSearch] = React.useState('');
|
|
26
|
+
// Filter tools by search
|
|
27
|
+
const filteredTools = React.useMemo(() => {
|
|
28
|
+
if (!search)
|
|
29
|
+
return availableTools;
|
|
30
|
+
return availableTools.filter((tool) => tool.name.toLowerCase().includes(search.toLowerCase()));
|
|
31
|
+
}, [availableTools, search]);
|
|
32
|
+
// Toggle tool by name
|
|
33
|
+
const toggleTool = (toolName) => {
|
|
34
|
+
if (selectedTools.includes(toolName)) {
|
|
35
|
+
onChange(selectedTools.filter((name) => name !== toolName));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
onChange([...selectedTools, toolName]);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const clearAll = () => {
|
|
42
|
+
onChange([]);
|
|
43
|
+
setSearch('');
|
|
44
|
+
};
|
|
45
|
+
return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", size: "sm", className: cn('gap-2', className), children: [_jsx(Wrench, { className: "h-4 w-4" }), "Tools", selectedTools.length > 0 && (_jsx(Badge, { variant: "secondary", className: "ml-1 rounded-full px-2", children: selectedTools.length }))] }) }), _jsxs(PopoverContent, { className: "w-72 p-0", align: "start", children: [_jsxs("div", { className: "border-b p-3", children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsx("span", { className: "text-sm font-medium", children: "Filter by tools" }), selectedTools.length > 0 && (_jsx(Button, { variant: "ghost", size: "sm", onClick: clearAll, className: "h-6 px-2 text-xs", children: "Clear all" }))] }), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-2 top-2.5 h-4 w-4 text-muted-foreground" }), _jsx(Input, { placeholder: "Search tools...", value: search, onChange: (e) => setSearch(e.target.value), className: "h-9 pl-8" })] })] }), _jsx(ScrollArea, { className: "h-60", children: _jsx("div", { className: "p-2", children: filteredTools.length === 0 ? (_jsx("div", { className: "py-4 text-center text-sm text-muted-foreground", children: "No tools found" })) : (filteredTools.map((tool) => {
|
|
46
|
+
const isSelected = selectedTools.includes(tool.name);
|
|
47
|
+
return (_jsxs("div", { className: cn('flex cursor-pointer items-center justify-between rounded-md px-2 py-1.5 hover:bg-accent', isSelected && 'bg-accent'), onClick: () => toggleTool(tool.name), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: cn('flex h-4 w-4 items-center justify-center rounded border', isSelected ? 'border-primary bg-primary' : 'border-input'), children: isSelected && _jsx(Check, { className: "h-3 w-3 text-primary-foreground" }) }), _jsx("span", { className: "font-mono text-sm", children: tool.name })] }), tool.artifact_count > 0 && (_jsx("span", { className: "text-xs text-muted-foreground", children: tool.artifact_count }))] }, tool.name));
|
|
48
|
+
})) }) })] })] }));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Inline filter bar showing selected tools with remove buttons.
|
|
52
|
+
*
|
|
53
|
+
* Only visible when tools are selected. Shows each selected tool
|
|
54
|
+
* with an X button to remove it, plus a "Clear all" button.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```tsx
|
|
58
|
+
* const [selectedTools, setSelectedTools] = useState<string[]>(['Read', 'Write']);
|
|
59
|
+
* <ToolFilterBar selectedTools={selectedTools} onChange={setSelectedTools} />
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export function ToolFilterBar({ selectedTools, onChange, className, }) {
|
|
63
|
+
if (selectedTools.length === 0)
|
|
64
|
+
return null;
|
|
65
|
+
return (_jsxs("div", { className: cn('flex flex-wrap items-center gap-2', className), children: [_jsx("span", { className: "text-sm text-muted-foreground", children: "Tools:" }), selectedTools.map((toolName) => (_jsxs(Badge, { variant: "secondary", className: "gap-1 font-mono", children: [toolName, _jsx(X, { className: "h-3 w-3 cursor-pointer hover:opacity-70", onClick: () => onChange(selectedTools.filter((name) => name !== toolName)) })] }, toolName))), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => onChange([]), className: "h-6 text-xs", children: "Clear all" })] }));
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=tool-filter-popover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-filter-popover.js","sourceRoot":"","sources":["../../src/filters/tool-filter-popover.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debounce a value by delaying updates until the specified delay has passed.
|
|
3
|
+
*
|
|
4
|
+
* @param value - The value to debounce
|
|
5
|
+
* @param delay - Delay in milliseconds (default: 300ms)
|
|
6
|
+
* @returns The debounced value
|
|
7
|
+
*/
|
|
8
|
+
export declare function useDebounce<T>(value: T, delay?: number): T;
|
|
9
|
+
//# sourceMappingURL=use-debounce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-debounce.d.ts","sourceRoot":"","sources":["../../src/hooks/use-debounce.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAE,MAAY,GAAG,CAAC,CAc/D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Debounce a value by delaying updates until the specified delay has passed.
|
|
4
|
+
*
|
|
5
|
+
* @param value - The value to debounce
|
|
6
|
+
* @param delay - Delay in milliseconds (default: 300ms)
|
|
7
|
+
* @returns The debounced value
|
|
8
|
+
*/
|
|
9
|
+
export function useDebounce(value, delay = 300) {
|
|
10
|
+
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const timer = setTimeout(() => {
|
|
13
|
+
setDebouncedValue(value);
|
|
14
|
+
}, delay);
|
|
15
|
+
return () => {
|
|
16
|
+
clearTimeout(timer);
|
|
17
|
+
};
|
|
18
|
+
}, [value, delay]);
|
|
19
|
+
return debouncedValue;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=use-debounce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-debounce.js","sourceRoot":"","sources":["../../src/hooks/use-debounce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAI,KAAQ,EAAE,QAAgB,GAAG;IAC1D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAI,KAAK,CAAC,CAAC;IAE/D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAEnB,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface UseIntersectionObserverOptions {
|
|
2
|
+
threshold?: number;
|
|
3
|
+
rootMargin?: string;
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface UseIntersectionObserverResult<T extends HTMLElement = HTMLDivElement> {
|
|
7
|
+
targetRef: React.RefObject<T | null>;
|
|
8
|
+
isIntersecting: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function useIntersectionObserver<T extends HTMLElement = HTMLDivElement>(options?: UseIntersectionObserverOptions): UseIntersectionObserverResult<T>;
|
|
11
|
+
//# sourceMappingURL=use-intersection-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-intersection-observer.d.ts","sourceRoot":"","sources":["../../src/hooks/use-intersection-observer.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,8BAA8B;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,6BAA6B,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc;IACnF,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACrC,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAC5E,OAAO,GAAE,8BAAmC,GAC3C,6BAA6B,CAAC,CAAC,CAAC,CA8BlC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
export function useIntersectionObserver(options = {}) {
|
|
3
|
+
const { threshold = 0, rootMargin = '100px', enabled = true } = options;
|
|
4
|
+
const [isIntersecting, setIsIntersecting] = useState(false);
|
|
5
|
+
const targetRef = useRef(null);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const target = targetRef.current;
|
|
8
|
+
if (!target || !enabled) {
|
|
9
|
+
setIsIntersecting(false);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const observer = new IntersectionObserver((entries) => {
|
|
13
|
+
const entry = entries[0];
|
|
14
|
+
if (entry) {
|
|
15
|
+
setIsIntersecting(entry.isIntersecting);
|
|
16
|
+
}
|
|
17
|
+
}, { threshold, rootMargin });
|
|
18
|
+
observer.observe(target);
|
|
19
|
+
return () => {
|
|
20
|
+
observer.disconnect();
|
|
21
|
+
};
|
|
22
|
+
}, [threshold, rootMargin, enabled]);
|
|
23
|
+
return { targetRef, isIntersecting };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=use-intersection-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-intersection-observer.js","sourceRoot":"","sources":["../../src/hooks/use-intersection-observer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAapD,MAAM,UAAU,uBAAuB,CACrC,UAA0C,EAAE;IAE5C,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACxE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAI,IAAI,CAAC,CAAC;IAElC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CACvC,CAAC,OAAO,EAAE,EAAE;YACV,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,KAAK,EAAE,CAAC;gBACV,iBAAiB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,EACD,EAAE,SAAS,EAAE,UAAU,EAAE,CAC1B,CAAC;QAEF,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEzB,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAErC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AACvC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './content-viewer';
|
|
2
|
+
export * from './diff';
|
|
3
|
+
export * from './editor';
|
|
4
|
+
export * from './display';
|
|
5
|
+
export * from './primitives';
|
|
6
|
+
export * from './utils';
|
|
7
|
+
export * from './bulk-actions';
|
|
8
|
+
export type { FileNode } from './types';
|
|
9
|
+
export type { FileTreeEntry, FileTreeResponse, FileContentResponse } from './types';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,kBAAkB,CAAC;AACjC,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAK/B,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// @miethe/ui
|
|
2
|
+
// Public API — re-exports from all submodule barrels
|
|
3
|
+
export * from './content-viewer';
|
|
4
|
+
export * from './diff';
|
|
5
|
+
export * from './editor';
|
|
6
|
+
export * from './display';
|
|
7
|
+
export * from './primitives';
|
|
8
|
+
export * from './utils';
|
|
9
|
+
export * from './bulk-actions';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,qDAAqD;AAErD,cAAc,kBAAkB,CAAC;AACjC,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC"}
|