@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.
Files changed (251) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/README.md +1536 -0
  3. package/dist/bulk-actions/Button.d.ts +28 -0
  4. package/dist/bulk-actions/Button.d.ts.map +1 -0
  5. package/dist/bulk-actions/Button.js +45 -0
  6. package/dist/bulk-actions/Button.js.map +1 -0
  7. package/dist/bulk-actions/bulk-action-bar.d.ts +91 -0
  8. package/dist/bulk-actions/bulk-action-bar.d.ts.map +1 -0
  9. package/dist/bulk-actions/bulk-action-bar.js +94 -0
  10. package/dist/bulk-actions/bulk-action-bar.js.map +1 -0
  11. package/dist/bulk-actions/index.d.ts +5 -0
  12. package/dist/bulk-actions/index.d.ts.map +1 -0
  13. package/dist/bulk-actions/index.js +7 -0
  14. package/dist/bulk-actions/index.js.map +1 -0
  15. package/dist/bulk-actions/utils.d.ts +6 -0
  16. package/dist/bulk-actions/utils.d.ts.map +1 -0
  17. package/dist/bulk-actions/utils.js +9 -0
  18. package/dist/bulk-actions/utils.js.map +1 -0
  19. package/dist/components/ui/alert.d.ts +9 -0
  20. package/dist/components/ui/alert.d.ts.map +1 -0
  21. package/dist/components/ui/alert.js +23 -0
  22. package/dist/components/ui/alert.js.map +1 -0
  23. package/dist/components/ui/button.d.ts +12 -0
  24. package/dist/components/ui/button.d.ts.map +1 -0
  25. package/dist/components/ui/button.js +34 -0
  26. package/dist/components/ui/button.js.map +1 -0
  27. package/dist/components/ui/collapsible.d.ts +6 -0
  28. package/dist/components/ui/collapsible.d.ts.map +1 -0
  29. package/dist/components/ui/collapsible.js +7 -0
  30. package/dist/components/ui/collapsible.js.map +1 -0
  31. package/dist/components/ui/skeleton.d.ts +4 -0
  32. package/dist/components/ui/skeleton.d.ts.map +1 -0
  33. package/dist/components/ui/skeleton.js +7 -0
  34. package/dist/components/ui/skeleton.js.map +1 -0
  35. package/dist/content-viewer/ContentPane.d.ts +107 -0
  36. package/dist/content-viewer/ContentPane.d.ts.map +1 -0
  37. package/dist/content-viewer/ContentPane.js +247 -0
  38. package/dist/content-viewer/ContentPane.js.map +1 -0
  39. package/dist/content-viewer/ContentViewerProvider.d.ts +83 -0
  40. package/dist/content-viewer/ContentViewerProvider.d.ts.map +1 -0
  41. package/dist/content-viewer/ContentViewerProvider.js +92 -0
  42. package/dist/content-viewer/ContentViewerProvider.js.map +1 -0
  43. package/dist/content-viewer/FileTree.d.ts +71 -0
  44. package/dist/content-viewer/FileTree.d.ts.map +1 -0
  45. package/dist/content-viewer/FileTree.js +294 -0
  46. package/dist/content-viewer/FileTree.js.map +1 -0
  47. package/dist/content-viewer/adapters.d.ts +101 -0
  48. package/dist/content-viewer/adapters.d.ts.map +1 -0
  49. package/dist/content-viewer/adapters.js +32 -0
  50. package/dist/content-viewer/adapters.js.map +1 -0
  51. package/dist/content-viewer/index.d.ts +8 -0
  52. package/dist/content-viewer/index.d.ts.map +1 -0
  53. package/dist/content-viewer/index.js +5 -0
  54. package/dist/content-viewer/index.js.map +1 -0
  55. package/dist/diff/DiffViewer.d.ts +112 -0
  56. package/dist/diff/DiffViewer.d.ts.map +1 -0
  57. package/dist/diff/DiffViewer.js +414 -0
  58. package/dist/diff/DiffViewer.js.map +1 -0
  59. package/dist/diff/diff.d.ts +32 -0
  60. package/dist/diff/diff.d.ts.map +1 -0
  61. package/dist/diff/diff.js +8 -0
  62. package/dist/diff/diff.js.map +1 -0
  63. package/dist/diff/index.d.ts +4 -0
  64. package/dist/diff/index.d.ts.map +1 -0
  65. package/dist/diff/index.js +3 -0
  66. package/dist/diff/index.js.map +1 -0
  67. package/dist/display/FilePreviewPane.d.ts +31 -0
  68. package/dist/display/FilePreviewPane.d.ts.map +1 -0
  69. package/dist/display/FilePreviewPane.js +144 -0
  70. package/dist/display/FilePreviewPane.js.map +1 -0
  71. package/dist/display/FrontmatterDisplay.d.ts +33 -0
  72. package/dist/display/FrontmatterDisplay.d.ts.map +1 -0
  73. package/dist/display/FrontmatterDisplay.js +79 -0
  74. package/dist/display/FrontmatterDisplay.js.map +1 -0
  75. package/dist/display/index.d.ts +5 -0
  76. package/dist/display/index.d.ts.map +1 -0
  77. package/dist/display/index.js +4 -0
  78. package/dist/display/index.js.map +1 -0
  79. package/dist/editor/MarkdownEditor.d.ts +28 -0
  80. package/dist/editor/MarkdownEditor.d.ts.map +1 -0
  81. package/dist/editor/MarkdownEditor.js +160 -0
  82. package/dist/editor/MarkdownEditor.js.map +1 -0
  83. package/dist/editor/SplitPreview.d.ts +28 -0
  84. package/dist/editor/SplitPreview.d.ts.map +1 -0
  85. package/dist/editor/SplitPreview.js +34 -0
  86. package/dist/editor/SplitPreview.js.map +1 -0
  87. package/dist/editor/index.d.ts +5 -0
  88. package/dist/editor/index.d.ts.map +1 -0
  89. package/dist/editor/index.js +4 -0
  90. package/dist/editor/index.js.map +1 -0
  91. package/dist/filters/filters-dropdown.d.ts +24 -0
  92. package/dist/filters/filters-dropdown.d.ts.map +1 -0
  93. package/dist/filters/filters-dropdown.js +36 -0
  94. package/dist/filters/filters-dropdown.js.map +1 -0
  95. package/dist/filters/index.d.ts +9 -0
  96. package/dist/filters/index.d.ts.map +1 -0
  97. package/dist/filters/index.js +5 -0
  98. package/dist/filters/index.js.map +1 -0
  99. package/dist/filters/sort-dropdown.d.ts +13 -0
  100. package/dist/filters/sort-dropdown.d.ts.map +1 -0
  101. package/dist/filters/sort-dropdown.js +20 -0
  102. package/dist/filters/sort-dropdown.js.map +1 -0
  103. package/dist/filters/tag-filter-popover.d.ts +39 -0
  104. package/dist/filters/tag-filter-popover.d.ts.map +1 -0
  105. package/dist/filters/tag-filter-popover.js +72 -0
  106. package/dist/filters/tag-filter-popover.js.map +1 -0
  107. package/dist/filters/tool-filter-popover.d.ts +42 -0
  108. package/dist/filters/tool-filter-popover.d.ts.map +1 -0
  109. package/dist/filters/tool-filter-popover.js +67 -0
  110. package/dist/filters/tool-filter-popover.js.map +1 -0
  111. package/dist/hooks/use-debounce.d.ts +9 -0
  112. package/dist/hooks/use-debounce.d.ts.map +1 -0
  113. package/dist/hooks/use-debounce.js +21 -0
  114. package/dist/hooks/use-debounce.js.map +1 -0
  115. package/dist/hooks/use-intersection-observer.d.ts +11 -0
  116. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  117. package/dist/hooks/use-intersection-observer.js +25 -0
  118. package/dist/hooks/use-intersection-observer.js.map +1 -0
  119. package/dist/index.d.ts +10 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +10 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/pickers/EntityPickerDialog.d.ts +233 -0
  124. package/dist/pickers/EntityPickerDialog.d.ts.map +1 -0
  125. package/dist/pickers/EntityPickerDialog.js +355 -0
  126. package/dist/pickers/EntityPickerDialog.js.map +1 -0
  127. package/dist/pickers/EntityPickerViewToggle.d.ts +8 -0
  128. package/dist/pickers/EntityPickerViewToggle.d.ts.map +1 -0
  129. package/dist/pickers/EntityPickerViewToggle.js +17 -0
  130. package/dist/pickers/EntityPickerViewToggle.js.map +1 -0
  131. package/dist/pickers/index.d.ts +5 -0
  132. package/dist/pickers/index.d.ts.map +1 -0
  133. package/dist/pickers/index.js +3 -0
  134. package/dist/pickers/index.js.map +1 -0
  135. package/dist/primitives/Badge.d.ts +16 -0
  136. package/dist/primitives/Badge.d.ts.map +1 -0
  137. package/dist/primitives/Badge.js +43 -0
  138. package/dist/primitives/Badge.js.map +1 -0
  139. package/dist/primitives/BaseArtifactModal.d.ts +114 -0
  140. package/dist/primitives/BaseArtifactModal.d.ts.map +1 -0
  141. package/dist/primitives/BaseArtifactModal.js +76 -0
  142. package/dist/primitives/BaseArtifactModal.js.map +1 -0
  143. package/dist/primitives/Dialog.d.ts +20 -0
  144. package/dist/primitives/Dialog.d.ts.map +1 -0
  145. package/dist/primitives/Dialog.js +24 -0
  146. package/dist/primitives/Dialog.js.map +1 -0
  147. package/dist/primitives/DropdownMenu.d.ts +28 -0
  148. package/dist/primitives/DropdownMenu.d.ts.map +1 -0
  149. package/dist/primitives/DropdownMenu.js +34 -0
  150. package/dist/primitives/DropdownMenu.js.map +1 -0
  151. package/dist/primitives/EnterpriseOwnerBadge.d.ts +9 -0
  152. package/dist/primitives/EnterpriseOwnerBadge.d.ts.map +1 -0
  153. package/dist/primitives/EnterpriseOwnerBadge.js +12 -0
  154. package/dist/primitives/EnterpriseOwnerBadge.js.map +1 -0
  155. package/dist/primitives/GroupedSelect.d.ts +30 -0
  156. package/dist/primitives/GroupedSelect.d.ts.map +1 -0
  157. package/dist/primitives/GroupedSelect.js +47 -0
  158. package/dist/primitives/GroupedSelect.js.map +1 -0
  159. package/dist/primitives/Input.d.ts +6 -0
  160. package/dist/primitives/Input.d.ts.map +1 -0
  161. package/dist/primitives/Input.js +9 -0
  162. package/dist/primitives/Input.js.map +1 -0
  163. package/dist/primitives/LockIcon.d.ts +11 -0
  164. package/dist/primitives/LockIcon.d.ts.map +1 -0
  165. package/dist/primitives/LockIcon.js +15 -0
  166. package/dist/primitives/LockIcon.js.map +1 -0
  167. package/dist/primitives/MaskedSecretInput.d.ts +16 -0
  168. package/dist/primitives/MaskedSecretInput.d.ts.map +1 -0
  169. package/dist/primitives/MaskedSecretInput.js +42 -0
  170. package/dist/primitives/MaskedSecretInput.js.map +1 -0
  171. package/dist/primitives/ModalHeader.d.ts +66 -0
  172. package/dist/primitives/ModalHeader.d.ts.map +1 -0
  173. package/dist/primitives/ModalHeader.js +58 -0
  174. package/dist/primitives/ModalHeader.js.map +1 -0
  175. package/dist/primitives/Popover.d.ts +9 -0
  176. package/dist/primitives/Popover.d.ts.map +1 -0
  177. package/dist/primitives/Popover.js +13 -0
  178. package/dist/primitives/Popover.js.map +1 -0
  179. package/dist/primitives/ScrollArea.d.ts +6 -0
  180. package/dist/primitives/ScrollArea.d.ts.map +1 -0
  181. package/dist/primitives/ScrollArea.js +11 -0
  182. package/dist/primitives/ScrollArea.js.map +1 -0
  183. package/dist/primitives/SearchableCombobox.d.ts +30 -0
  184. package/dist/primitives/SearchableCombobox.d.ts.map +1 -0
  185. package/dist/primitives/SearchableCombobox.js +124 -0
  186. package/dist/primitives/SearchableCombobox.js.map +1 -0
  187. package/dist/primitives/SearchablePickerDialog.d.ts +20 -0
  188. package/dist/primitives/SearchablePickerDialog.d.ts.map +1 -0
  189. package/dist/primitives/SearchablePickerDialog.js +78 -0
  190. package/dist/primitives/SearchablePickerDialog.js.map +1 -0
  191. package/dist/primitives/StatusBadge.d.ts +21 -0
  192. package/dist/primitives/StatusBadge.d.ts.map +1 -0
  193. package/dist/primitives/StatusBadge.js +25 -0
  194. package/dist/primitives/StatusBadge.js.map +1 -0
  195. package/dist/primitives/TabNavigation.d.ts +68 -0
  196. package/dist/primitives/TabNavigation.d.ts.map +1 -0
  197. package/dist/primitives/TabNavigation.js +74 -0
  198. package/dist/primitives/TabNavigation.js.map +1 -0
  199. package/dist/primitives/Tabs.d.ts +8 -0
  200. package/dist/primitives/Tabs.d.ts.map +1 -0
  201. package/dist/primitives/Tabs.js +14 -0
  202. package/dist/primitives/Tabs.js.map +1 -0
  203. package/dist/primitives/Tooltip.d.ts +8 -0
  204. package/dist/primitives/Tooltip.d.ts.map +1 -0
  205. package/dist/primitives/Tooltip.js +12 -0
  206. package/dist/primitives/Tooltip.js.map +1 -0
  207. package/dist/primitives/VerticalTabNavigation.d.ts +75 -0
  208. package/dist/primitives/VerticalTabNavigation.d.ts.map +1 -0
  209. package/dist/primitives/VerticalTabNavigation.js +166 -0
  210. package/dist/primitives/VerticalTabNavigation.js.map +1 -0
  211. package/dist/primitives/ViewModeToggle.d.ts +12 -0
  212. package/dist/primitives/ViewModeToggle.d.ts.map +1 -0
  213. package/dist/primitives/ViewModeToggle.js +56 -0
  214. package/dist/primitives/ViewModeToggle.js.map +1 -0
  215. package/dist/primitives/WizardShell.d.ts +81 -0
  216. package/dist/primitives/WizardShell.d.ts.map +1 -0
  217. package/dist/primitives/WizardShell.js +73 -0
  218. package/dist/primitives/WizardShell.js.map +1 -0
  219. package/dist/primitives/index.d.ts +38 -0
  220. package/dist/primitives/index.d.ts.map +1 -0
  221. package/dist/primitives/index.js +24 -0
  222. package/dist/primitives/index.js.map +1 -0
  223. package/dist/primitives/utils.d.ts +6 -0
  224. package/dist/primitives/utils.d.ts.map +1 -0
  225. package/dist/primitives/utils.js +9 -0
  226. package/dist/primitives/utils.js.map +1 -0
  227. package/dist/types/index.d.ts +63 -0
  228. package/dist/types/index.d.ts.map +1 -0
  229. package/dist/types/index.js +9 -0
  230. package/dist/types/index.js.map +1 -0
  231. package/dist/utils/frontmatter.d.ts +63 -0
  232. package/dist/utils/frontmatter.d.ts.map +1 -0
  233. package/dist/utils/frontmatter.js +345 -0
  234. package/dist/utils/frontmatter.js.map +1 -0
  235. package/dist/utils/index.d.ts +6 -0
  236. package/dist/utils/index.d.ts.map +1 -0
  237. package/dist/utils/index.js +6 -0
  238. package/dist/utils/index.js.map +1 -0
  239. package/dist/utils/perf-marks.d.ts +28 -0
  240. package/dist/utils/perf-marks.d.ts.map +1 -0
  241. package/dist/utils/perf-marks.js +45 -0
  242. package/dist/utils/perf-marks.js.map +1 -0
  243. package/dist/utils/readme-utils.d.ts +67 -0
  244. package/dist/utils/readme-utils.d.ts.map +1 -0
  245. package/dist/utils/readme-utils.js +164 -0
  246. package/dist/utils/readme-utils.js.map +1 -0
  247. package/dist/utils/type-colors.d.ts +70 -0
  248. package/dist/utils/type-colors.d.ts.map +1 -0
  249. package/dist/utils/type-colors.js +118 -0
  250. package/dist/utils/type-colors.js.map +1 -0
  251. 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":"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"}
@@ -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"}
@@ -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"}