@brainfish-ai/components 0.13.6 → 0.13.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/colors/blue.d.ts +13 -0
- package/dist/colors/customColor.d.ts +4 -0
- package/dist/colors/dark.d.ts +13 -0
- package/dist/colors/green.d.ts +13 -0
- package/dist/colors/index.d.ts +128 -0
- package/dist/colors/orange.d.ts +13 -0
- package/dist/colors/pink.d.ts +13 -0
- package/dist/colors/primary.d.ts +20 -0
- package/dist/colors/purple.d.ts +13 -0
- package/dist/colors/red.d.ts +13 -0
- package/dist/colors/yellow.d.ts +13 -0
- package/dist/components/chat-search/Answer.d.ts +29 -0
- package/dist/components/chat-search/AnswerActions.d.ts +13 -0
- package/dist/components/chat-search/AnswerBlock.d.ts +8 -0
- package/dist/components/chat-search/ChatSearch.d.ts +11 -0
- package/dist/components/chat-search/ChatSearchContext.d.ts +34 -0
- package/dist/components/chat-search/FollowUpQuestions.d.ts +7 -0
- package/dist/components/chat-search/FollowUpSearchBar.d.ts +11 -0
- package/dist/components/chat-search/Header.d.ts +9 -0
- package/dist/components/chat-search/LoadingConversation.d.ts +2 -0
- package/dist/components/chat-search/LoadingSkeleton.d.ts +6 -0
- package/dist/components/chat-search/NextBestActions.d.ts +8 -0
- package/dist/components/chat-search/PrimarySearch.d.ts +29 -0
- package/dist/components/chat-search/ScrollToBottomArrow.d.ts +6 -0
- package/dist/components/chat-search/Suggestions.d.ts +9 -0
- package/dist/components/chat-search/TimelineNavigation.d.ts +9 -0
- package/dist/components/chat-search/blocks/ActionButtons.d.ts +5 -0
- package/dist/components/chat-search/blocks/ActionInputForm.d.ts +20 -0
- package/dist/components/chat-search/blocks/MarkdownText.d.ts +8 -0
- package/dist/components/chat-search/blocks/utils.d.ts +15 -0
- package/dist/components/chat-search/helpers/excuteClientAction.d.ts +9 -0
- package/dist/components/chat-search/helpers/nextBestActions.d.ts +7 -0
- package/dist/components/chat-search/hooks/index.d.ts +7 -0
- package/dist/components/chat-search/hooks/useAccessibleColor.d.ts +1 -0
- package/dist/components/chat-search/hooks/useAnswerList.d.ts +217 -0
- package/dist/components/chat-search/hooks/useConversationId.d.ts +5 -0
- package/dist/components/chat-search/hooks/useConversationLoader.d.ts +17 -0
- package/dist/components/chat-search/hooks/useDarkMode.d.ts +1 -0
- package/dist/components/chat-search/hooks/useIsChatSearchDirty.d.ts +1 -0
- package/dist/components/chat-search/hooks/useScrollManager.d.ts +5 -0
- package/dist/components/chat-search/hooks/useSubscriptionManager.d.ts +4 -0
- package/dist/components/chat-search/hooks/useUrlManager.d.ts +8 -0
- package/dist/components/chat-search/index.d.ts +5 -0
- package/dist/components/chat-search/text-config.d.ts +3 -0
- package/dist/components/chat-search/theme.d.ts +0 -0
- package/dist/components/chat-search/types.d.ts +253 -0
- package/dist/{combobox.d.ts → components/combobox/combobox.d.ts} +14 -18
- package/dist/components/combobox/index.d.ts +1 -0
- package/dist/components/data-table/data-table.d.ts +17 -0
- package/dist/components/data-table/index.d.ts +2 -0
- package/dist/{date-picker.d.ts → components/date-picker/date-picker.d.ts} +9 -12
- package/dist/components/date-picker/index.d.ts +1 -0
- package/dist/components/feedback/feedback-reason.d.ts +10 -0
- package/dist/{feedback.d.ts → components/feedback/feedback.d.ts} +17 -21
- package/dist/components/feedback/index.d.ts +1 -0
- package/dist/components/file-upload/file-upload-status.d.ts +17 -0
- package/dist/components/file-upload/file-upload.d.ts +4 -0
- package/dist/components/file-upload/index.d.ts +4 -0
- package/dist/components/file-upload/types.d.ts +18 -0
- package/dist/components/file-upload/utils.d.ts +1 -0
- package/dist/components/filter/components/CustomValueInput.d.ts +11 -0
- package/dist/components/filter/components/MultiSelectDropdown.d.ts +10 -0
- package/dist/components/filter/components/SingleSelectDropdown.d.ts +9 -0
- package/dist/components/filter/filter.d.ts +6 -0
- package/dist/components/filter/filters.d.ts +12 -0
- package/dist/components/filter/hooks.d.ts +9 -0
- package/dist/components/filter/index.d.ts +3 -0
- package/dist/{filter.d.ts → components/filter/types.d.ts} +59 -82
- package/dist/components/generating-star/generating-star.d.ts +6 -0
- package/dist/components/generating-star/index.d.ts +2 -0
- package/dist/components/markdown/CodeBlock.d.ts +7 -0
- package/dist/components/markdown/FormattedMessage.d.ts +14 -0
- package/dist/components/markdown/Frame.d.ts +10 -0
- package/dist/components/markdown/MemoizedReactMarkdown.d.ts +6 -0
- package/dist/components/markdown/MermaidDiagram.d.ts +6 -0
- package/dist/components/markdown/ZoomableImage.d.ts +7 -0
- package/dist/components/markdown/embeds/Loom.d.ts +7 -0
- package/dist/components/markdown/embeds/NativeVideo.d.ts +6 -0
- package/dist/components/markdown/embeds/Supademo.d.ts +7 -0
- package/dist/components/markdown/embeds/Typeform.d.ts +7 -0
- package/dist/components/markdown/embeds/Vimeo.d.ts +7 -0
- package/dist/components/markdown/embeds/Wistia.d.ts +7 -0
- package/dist/components/markdown/embeds/Youtube.d.ts +7 -0
- package/dist/components/markdown/embeds/index.d.ts +9 -0
- package/dist/components/markdown/index.d.ts +6 -0
- package/dist/components/markdown/utils/codeblock.d.ts +6 -0
- package/dist/components/markdown/utils/stripNewLines.d.ts +1 -0
- package/dist/components/select/index.d.ts +1 -0
- package/dist/{select.d.ts → components/select/simpleSelect.d.ts} +15 -20
- package/dist/env.d.ts +5 -0
- package/dist/esm/chunks/{ChatSearch.D_zJGwAf.js → ChatSearch.CxwRDkGx.js} +55 -24
- package/dist/esm/chunks/ChatSearch.CxwRDkGx.js.map +1 -0
- package/dist/esm/chunks/{FormattedMessage.D94rlhro.js → FormattedMessage.CpTetIzd.js} +146 -14
- package/dist/esm/chunks/FormattedMessage.CpTetIzd.js.map +1 -0
- package/dist/esm/chunks/{combobox.D30-HM1I.js → combobox.B5aw7PrS.js} +2 -2
- package/dist/esm/chunks/{combobox.D30-HM1I.js.map → combobox.B5aw7PrS.js.map} +1 -1
- package/dist/esm/chunks/{data-table.CeeSYokg.js → data-table.qS51pU0z.js} +2 -2
- package/dist/esm/chunks/{data-table.CeeSYokg.js.map → data-table.qS51pU0z.js.map} +1 -1
- package/dist/esm/chunks/{date-picker.WGre3lsB.js → date-picker.DqcdwXZS.js} +2 -2
- package/dist/esm/chunks/{date-picker.WGre3lsB.js.map → date-picker.DqcdwXZS.js.map} +1 -1
- package/dist/esm/chunks/{filters.Dx9TXuJ4.js → filters.Bd9OruMH.js} +2 -2
- package/dist/esm/chunks/{filters.Dx9TXuJ4.js.map → filters.Bd9OruMH.js.map} +1 -1
- package/dist/esm/chunks/{generating-star.C6eGHpse.js → generating-star.B0RUXRff.js} +2 -2
- package/dist/esm/chunks/{generating-star.C6eGHpse.js.map → generating-star.B0RUXRff.js.map} +1 -1
- package/dist/esm/chunks/{simpleSelect.Bzw8xrbM.js → simpleSelect.BfAgKOea.js} +2 -2
- package/dist/esm/chunks/{simpleSelect.Bzw8xrbM.js.map → simpleSelect.BfAgKOea.js.map} +1 -1
- package/dist/esm/chunks/{utils.DmKr1Ojo.js → utils.DaMF_LVC.js} +2 -3
- package/dist/esm/chunks/utils.DaMF_LVC.js.map +1 -0
- package/dist/esm/components/chat-search.js +1 -1
- package/dist/esm/components/combobox.js +1 -1
- package/dist/esm/components/data-table.js +1 -1
- package/dist/esm/components/date-picker.js +1 -1
- package/dist/esm/components/filter.js +1 -1
- package/dist/esm/components/generating-star.js +1 -1
- package/dist/esm/components/markdown.js +1 -1
- package/dist/esm/components/select.js +1 -1
- package/dist/esm/components/ui/accordion.js +1 -1
- package/dist/esm/components/ui/accordion.js.map +1 -1
- package/dist/esm/components/ui/badge.js +1 -1
- package/dist/esm/components/ui/button.js +1 -1
- package/dist/esm/components/ui/calendar.js +1 -1
- package/dist/esm/components/ui/card.js +1 -1
- package/dist/esm/components/ui/command.js +1 -1
- package/dist/esm/components/ui/dialog.js +1 -1
- package/dist/esm/components/ui/dialog.js.map +1 -1
- package/dist/esm/components/ui/dropdown-menu.js +1 -1
- package/dist/esm/components/ui/input.js +1 -1
- package/dist/esm/components/ui/label.js +1 -1
- package/dist/esm/components/ui/popover.js +1 -1
- package/dist/esm/components/ui/progress.js +1 -1
- package/dist/esm/components/ui/scroll-area.js +1 -1
- package/dist/esm/components/ui/select.js +1 -1
- package/dist/esm/components/ui/switch.js +1 -1
- package/dist/esm/components/ui/table.js +1 -1
- package/dist/esm/components/ui/textarea.js +1 -1
- package/dist/esm/components/ui/tooltip.js +1 -1
- package/dist/esm/index.css +1 -1
- package/dist/esm/index.js +8 -8
- package/dist/index.d.ts +27 -1063
- package/dist/lib/addUtmParams.d.ts +20 -0
- package/dist/lib/api.d.ts +96 -0
- package/dist/lib/feature-flags.d.ts +9 -0
- package/dist/lib/features.d.ts +3 -0
- package/dist/lib/fetchClient.d.ts +19 -0
- package/dist/lib/getContentType.d.ts +1 -0
- package/dist/lib/hooks.d.ts +15 -0
- package/dist/lib/utils.d.ts +8 -0
- package/dist/stats.html +1 -1
- package/package.json +8 -2
- package/dist/accordion.d.ts +0 -12
- package/dist/badge.d.ts +0 -14
- package/dist/button.d.ts +0 -16
- package/dist/calendar.d.ts +0 -12
- package/dist/card.d.ts +0 -17
- package/dist/chat-search.d.ts +0 -414
- package/dist/collapsible.d.ts +0 -10
- package/dist/command.d.ts +0 -90
- package/dist/components/chat-search.d.ts +0 -2
- package/dist/components/combobox.d.ts +0 -2
- package/dist/components/data-table.d.ts +0 -2
- package/dist/components/date-picker.d.ts +0 -2
- package/dist/components/feedback.d.ts +0 -2
- package/dist/components/filter.d.ts +0 -2
- package/dist/components/generating-star.d.ts +0 -6
- package/dist/components/markdown.d.ts +0 -2
- package/dist/components/select.d.ts +0 -2
- package/dist/data-table.d.ts +0 -23
- package/dist/dialog.d.ts +0 -30
- package/dist/dropdown-menu.d.ts +0 -43
- package/dist/esm/chunks/ChatSearch.D_zJGwAf.js.map +0 -1
- package/dist/esm/chunks/FormattedMessage.D94rlhro.js.map +0 -1
- package/dist/esm/chunks/utils.DmKr1Ojo.js.map +0 -1
- package/dist/generating-star.d.ts +0 -10
- package/dist/icon.d.ts +0 -26
- package/dist/input.d.ts +0 -11
- package/dist/label.d.ts +0 -8
- package/dist/markdown.d.ts +0 -54
- package/dist/popover.d.ts +0 -12
- package/dist/progress.d.ts +0 -8
- package/dist/scroll-area.d.ts +0 -8
- package/dist/switch.d.ts +0 -6
- package/dist/table.d.ts +0 -19
- package/dist/textarea.d.ts +0 -5
- package/dist/tooltip.d.ts +0 -18
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { CaretUpDown, Check } from '@phosphor-icons/react';
|
|
3
|
-
import { c as cn } from './utils.
|
|
3
|
+
import { c as cn } from './utils.DaMF_LVC.js';
|
|
4
4
|
import { Button } from '../components/ui/button.js';
|
|
5
5
|
import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../components/ui/command.js';
|
|
6
6
|
import { Popover, PopoverTrigger, PopoverContent } from '../components/ui/popover.js';
|
|
@@ -62,4 +62,4 @@ function Combobox({
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
export { Combobox as C };
|
|
65
|
-
//# sourceMappingURL=combobox.
|
|
65
|
+
//# sourceMappingURL=combobox.B5aw7PrS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.
|
|
1
|
+
{"version":3,"file":"combobox.B5aw7PrS.js","sources":["../../../src/components/combobox/combobox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Check, CaretUpDown } from '@phosphor-icons/react';\n\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nexport interface ComboboxProps {\n options: {\n value: string;\n label: string;\n }[];\n defaultValueLabel: string;\n placeholder: string;\n noResultsLabel: string;\n className?: string;\n // callback on open\n onOpenChange?: (open: boolean) => void;\n // callback on value change\n onChange?: (value: string) => void;\n}\n\nexport function Combobox({\n options,\n defaultValueLabel,\n placeholder,\n noResultsLabel,\n className,\n onOpenChange,\n onChange,\n}: ComboboxProps) {\n const [open, setOpen] = React.useState(false);\n const [value, setValue] = React.useState('');\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const [triggerWidth, setTriggerWidth] = React.useState<number | null>(null);\n\n // Update width when popover opens\n const handleOpenChange = (isOpen: boolean) => {\n if (isOpen && triggerRef.current) {\n setTriggerWidth(triggerRef.current.offsetWidth);\n }\n setOpen(isOpen);\n onOpenChange?.(isOpen);\n };\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <Button\n ref={triggerRef}\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n className={cn('w-full justify-between', className)}\n >\n {value ? options.find((option) => option.value === value)?.label : defaultValueLabel}\n <CaretUpDown className=\"opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"p-0\"\n style={{\n width: triggerWidth ? `${triggerWidth}px` : 'auto',\n }}\n >\n <Command>\n <CommandInput placeholder={placeholder} />\n <CommandList>\n <CommandEmpty>{noResultsLabel}</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value}\n value={option.value}\n onSelect={(currentValue) => {\n setValue(currentValue === value ? '' : currentValue);\n setOpen(false);\n onChange?.(currentValue);\n }}\n >\n {option.label}\n <Check className={cn('ml-auto', value === option.value ? 'opacity-100' : 'opacity-0')} />\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import React__default, { useCallback } from 'react';
|
|
|
2
2
|
import { useReactTable, getSortedRowModel, getExpandedRowModel, getFilteredRowModel, getPaginationRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
|
|
3
3
|
import { AnimatePresence, motion } from 'framer-motion';
|
|
4
4
|
import { TableRow, TableCell, Table, TableHeader, TableHead, TableBody } from '../components/ui/table.js';
|
|
5
|
-
import { c as cn } from './utils.
|
|
5
|
+
import { c as cn } from './utils.DaMF_LVC.js';
|
|
6
6
|
|
|
7
7
|
const Skeleton = ({ className, ...props }) => /* @__PURE__ */ React__default.createElement("div", { className: cn("animate-original-pulse rounded-md bg-muted", className), ...props });
|
|
8
8
|
const accordionVariants = {
|
|
@@ -106,4 +106,4 @@ function DataTable({
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
export { DataTable as D };
|
|
109
|
-
//# sourceMappingURL=data-table.
|
|
109
|
+
//# sourceMappingURL=data-table.qS51pU0z.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.CeeSYokg.js","sources":["../../../src/components/data-table/data-table.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport {\n ColumnDef,\n flexRender,\n getCoreRowModel,\n useReactTable,\n ExpandedState,\n SortingState,\n getPaginationRowModel,\n getFilteredRowModel,\n getExpandedRowModel,\n getSortedRowModel,\n Row,\n} from '@tanstack/react-table';\nimport { motion, AnimatePresence } from 'framer-motion';\n\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table';\n\nimport { cn } from '@/lib/utils';\n\n// Skeleton component for loading state\nconst Skeleton = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('animate-original-pulse rounded-md bg-muted', className)} {...props} />\n);\n\n// Framer Motion Accordion Variants for bouncy accordion effect\nconst accordionVariants = {\n initial: {\n height: 0,\n },\n animate: {\n height: 'auto',\n transition: {\n height: {\n type: 'spring',\n stiffness: 450, // increase to make it more stiff (less bouncy), therefore increasing the speed of the animation\n damping: 20, // increase to make it more dampened and slow\n },\n },\n },\n exit: {\n height: 0,\n transition: {\n height: {\n duration: 0.1,\n ease: 'linear',\n },\n },\n },\n};\n\nexport type ExtendedColumnDef<TData, TValue = unknown> = ColumnDef<TData, TValue> & {\n expandedContent?: (row: Row<TData>) => React.ReactNode;\n};\n\nexport interface DataTableProps<TData, TValue> extends React.HTMLAttributes<HTMLDivElement> {\n columns: ExtendedColumnDef<TData, TValue>[];\n data: TData[];\n getRowCanExpand?: (row: Row<TData>) => boolean;\n className?: string;\n expandeRowClassName?: string;\n isLoading?: boolean;\n skeletonRowCount?: number;\n}\n\nexport function DataTable<TData extends Record<string, any> & { id?: string | number }, TValue>({\n columns,\n data,\n getRowCanExpand = () => true,\n className,\n expandeRowClassName,\n isLoading = false,\n skeletonRowCount = 10,\n ...props\n}: DataTableProps<TData, TValue>) {\n const [expanded, setExpanded] = React.useState<ExpandedState>({});\n const [sorting, setSorting] = React.useState<SortingState>([]);\n\n // Reset expanded state when data changes. Collapse all rows when data changes.\n React.useEffect(() => {\n setExpanded({});\n }, [data]);\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n state: {\n expanded,\n sorting,\n },\n onExpandedChange: setExpanded,\n onSortingChange: setSorting,\n getRowCanExpand: columns.some((col) => col.expandedContent) ? getRowCanExpand : undefined,\n getPaginationRowModel: getPaginationRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSortedRowModel: getSortedRowModel(),\n });\n\n // Render the skeleton rows for loading state\n const renderSkeletonRows = useCallback(() => {\n return Array.from({ length: skeletonRowCount }).map((_, index) => (\n <TableRow key={`skeleton-${index}`}>\n {columns.map((column, colIndex) => (\n <TableCell\n key={`skeleton-cell-${index}-${colIndex}`}\n className=\"first:pl-4 last:pr-4 py-4\"\n style={{ width: column.size }}\n >\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ));\n }, [skeletonRowCount, columns]);\n\n // Render the table rows\n const renderTableRows = useCallback(() => {\n return table.getRowModel().rows.map((row) => (\n <React.Fragment key={row.original.id || row.id}>\n <TableRow\n data-state={row.getIsSelected() && 'selected'}\n className={cn(row.getIsExpanded() && 'custom-dashed-border-b')}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} className=\"first:pl-4 last:pr-4 py-4\" style={{ width: cell.column.getSize() }}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n <AnimatePresence initial={false}>\n {row.getIsExpanded() &&\n (() => {\n // Find the first column with expandedContent\n const expandedColumn = columns.find((col) => col.expandedContent);\n\n return expandedColumn?.expandedContent ? (\n <TableRow key={`${row.id}-expanded`}>\n <TableCell\n colSpan={row.getVisibleCells().length}\n className={cn('first:pl-4 last:pr-4 py-4 overflow-hidden', expandeRowClassName)}\n >\n <motion.div variants={accordionVariants} initial=\"initial\" animate=\"animate\" exit=\"exit\">\n {expandedColumn.expandedContent(row)}\n </motion.div>\n </TableCell>\n </TableRow>\n ) : null;\n })()}\n </AnimatePresence>\n </React.Fragment>\n ));\n }, [table, columns, expandeRowClassName]);\n\n const hasResults = table.getRowModel().rows?.length;\n\n return (\n <div className={cn('overflow-hidden rounded-md border border-border bg-card', className)} {...props}>\n <Table className=\"overflow-hidden\">\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className=\"space-x-4 first:pl-4 last:pr-4 py-4 text-current\"\n style={{ width: header.getSize() }}\n >\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {isLoading ? (\n renderSkeletonRows()\n ) : hasResults ? (\n renderTableRows()\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n No results.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n );\n}\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-table.qS51pU0z.js","sources":["../../../src/components/data-table/data-table.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport {\n ColumnDef,\n flexRender,\n getCoreRowModel,\n useReactTable,\n ExpandedState,\n SortingState,\n getPaginationRowModel,\n getFilteredRowModel,\n getExpandedRowModel,\n getSortedRowModel,\n Row,\n} from '@tanstack/react-table';\nimport { motion, AnimatePresence } from 'framer-motion';\n\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table';\n\nimport { cn } from '@/lib/utils';\n\n// Skeleton component for loading state\nconst Skeleton = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('animate-original-pulse rounded-md bg-muted', className)} {...props} />\n);\n\n// Framer Motion Accordion Variants for bouncy accordion effect\nconst accordionVariants = {\n initial: {\n height: 0,\n },\n animate: {\n height: 'auto',\n transition: {\n height: {\n type: 'spring',\n stiffness: 450, // increase to make it more stiff (less bouncy), therefore increasing the speed of the animation\n damping: 20, // increase to make it more dampened and slow\n },\n },\n },\n exit: {\n height: 0,\n transition: {\n height: {\n duration: 0.1,\n ease: 'linear',\n },\n },\n },\n};\n\nexport type ExtendedColumnDef<TData, TValue = unknown> = ColumnDef<TData, TValue> & {\n expandedContent?: (row: Row<TData>) => React.ReactNode;\n};\n\nexport interface DataTableProps<TData, TValue> extends React.HTMLAttributes<HTMLDivElement> {\n columns: ExtendedColumnDef<TData, TValue>[];\n data: TData[];\n getRowCanExpand?: (row: Row<TData>) => boolean;\n className?: string;\n expandeRowClassName?: string;\n isLoading?: boolean;\n skeletonRowCount?: number;\n}\n\nexport function DataTable<TData extends Record<string, any> & { id?: string | number }, TValue>({\n columns,\n data,\n getRowCanExpand = () => true,\n className,\n expandeRowClassName,\n isLoading = false,\n skeletonRowCount = 10,\n ...props\n}: DataTableProps<TData, TValue>) {\n const [expanded, setExpanded] = React.useState<ExpandedState>({});\n const [sorting, setSorting] = React.useState<SortingState>([]);\n\n // Reset expanded state when data changes. Collapse all rows when data changes.\n React.useEffect(() => {\n setExpanded({});\n }, [data]);\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n state: {\n expanded,\n sorting,\n },\n onExpandedChange: setExpanded,\n onSortingChange: setSorting,\n getRowCanExpand: columns.some((col) => col.expandedContent) ? getRowCanExpand : undefined,\n getPaginationRowModel: getPaginationRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n getSortedRowModel: getSortedRowModel(),\n });\n\n // Render the skeleton rows for loading state\n const renderSkeletonRows = useCallback(() => {\n return Array.from({ length: skeletonRowCount }).map((_, index) => (\n <TableRow key={`skeleton-${index}`}>\n {columns.map((column, colIndex) => (\n <TableCell\n key={`skeleton-cell-${index}-${colIndex}`}\n className=\"first:pl-4 last:pr-4 py-4\"\n style={{ width: column.size }}\n >\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ));\n }, [skeletonRowCount, columns]);\n\n // Render the table rows\n const renderTableRows = useCallback(() => {\n return table.getRowModel().rows.map((row) => (\n <React.Fragment key={row.original.id || row.id}>\n <TableRow\n data-state={row.getIsSelected() && 'selected'}\n className={cn(row.getIsExpanded() && 'custom-dashed-border-b')}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} className=\"first:pl-4 last:pr-4 py-4\" style={{ width: cell.column.getSize() }}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n <AnimatePresence initial={false}>\n {row.getIsExpanded() &&\n (() => {\n // Find the first column with expandedContent\n const expandedColumn = columns.find((col) => col.expandedContent);\n\n return expandedColumn?.expandedContent ? (\n <TableRow key={`${row.id}-expanded`}>\n <TableCell\n colSpan={row.getVisibleCells().length}\n className={cn('first:pl-4 last:pr-4 py-4 overflow-hidden', expandeRowClassName)}\n >\n <motion.div variants={accordionVariants} initial=\"initial\" animate=\"animate\" exit=\"exit\">\n {expandedColumn.expandedContent(row)}\n </motion.div>\n </TableCell>\n </TableRow>\n ) : null;\n })()}\n </AnimatePresence>\n </React.Fragment>\n ));\n }, [table, columns, expandeRowClassName]);\n\n const hasResults = table.getRowModel().rows?.length;\n\n return (\n <div className={cn('overflow-hidden rounded-md border border-border bg-card', className)} {...props}>\n <Table className=\"overflow-hidden\">\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className=\"space-x-4 first:pl-4 last:pr-4 py-4 text-current\"\n style={{ width: header.getSize() }}\n >\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {isLoading ? (\n renderSkeletonRows()\n ) : hasResults ? (\n renderTableRows()\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n No results.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n );\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { format } from 'date-fns';
|
|
3
3
|
import { CalendarBlank } from '@phosphor-icons/react';
|
|
4
|
-
import { c as cn } from './utils.
|
|
4
|
+
import { c as cn } from './utils.DaMF_LVC.js';
|
|
5
5
|
import { Button } from '../components/ui/button.js';
|
|
6
6
|
import { Calendar } from '../components/ui/calendar.js';
|
|
7
7
|
import { Popover, PopoverTrigger, PopoverContent } from '../components/ui/popover.js';
|
|
@@ -23,4 +23,4 @@ import '../date-picker.css';function DatePicker({ date, setDate, className, plac
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export { DatePicker as D };
|
|
26
|
-
//# sourceMappingURL=date-picker.
|
|
26
|
+
//# sourceMappingURL=date-picker.DqcdwXZS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker.
|
|
1
|
+
{"version":3,"file":"date-picker.DqcdwXZS.js","sources":["../../../src/components/date-picker/date-picker.tsx"],"sourcesContent":["import * as React from 'react';\nimport { format } from 'date-fns';\nimport { CalendarBlank as CalendarIcon } from '@phosphor-icons/react';\n\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport '../ui/calendar.css';\n\ninterface DatePickerProps {\n date: Date | undefined;\n setDate: (date: Date | undefined) => void;\n className?: string;\n placeholder?: string;\n}\n\nexport function DatePicker({ date, setDate, className, placeholder = 'Select date' }: DatePickerProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n 'w-full justify-start text-left font-normal text-base',\n !date && 'text-muted-foreground',\n className,\n )}\n >\n <CalendarIcon className=\"mr-2 !w-5 !h-5\" />\n {date ? format(date, 'PPP') : placeholder}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0 z-[9999]\">\n <Calendar mode=\"single\" selected={date} onSelect={setDate} className=\"single-date-picker-calendar\" />\n </PopoverContent>\n </Popover>\n );\n}\n"],"names":["CalendarIcon"],"mappings":";;;;;;;;AAiBO,SAAS,WAAW,EAAE,IAAA,EAAM,SAAS,SAAW,EAAA,WAAA,GAAc,eAAkC,EAAA;AACrG,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,cAAA,EAAA,EAAe,SAAO,IACrB,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,SAAA;AAAA,MACR,SAAW,EAAA,EAAA;AAAA,QACT,sDAAA;AAAA,QACA,CAAC,IAAQ,IAAA,uBAAA;AAAA,QACT;AAAA;AACF,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA,CAACA,aAAa,EAAA,EAAA,SAAA,EAAU,gBAAiB,EAAA,CAAA;AAAA,IACxC,IAAO,GAAA,MAAA,CAAO,IAAM,EAAA,KAAK,CAAI,GAAA;AAAA,GAElC,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,cAAe,EAAA,EAAA,SAAA,EAAU,yCACvB,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,IAAK,EAAA,QAAA,EAAS,UAAU,IAAM,EAAA,QAAA,EAAU,SAAS,SAAU,EAAA,6BAAA,EAA8B,CACrG,CACF,CAAA;AAEJ;;;;"}
|
|
@@ -5,7 +5,7 @@ import { Button } from '../components/ui/button.js';
|
|
|
5
5
|
import { Input } from '../components/ui/input.js';
|
|
6
6
|
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from '../components/ui/dropdown-menu.js';
|
|
7
7
|
import { Popover, PopoverTrigger, PopoverContent } from '../components/ui/popover.js';
|
|
8
|
-
import { c as cn } from './utils.
|
|
8
|
+
import { c as cn } from './utils.DaMF_LVC.js';
|
|
9
9
|
|
|
10
10
|
var Operator = /* @__PURE__ */ ((Operator2) => {
|
|
11
11
|
Operator2["IS"] = "is";
|
|
@@ -565,4 +565,4 @@ const Filters = ({
|
|
|
565
565
|
};
|
|
566
566
|
|
|
567
567
|
export { Filter as F, Operator as O, Filters as a };
|
|
568
|
-
//# sourceMappingURL=filters.
|
|
568
|
+
//# sourceMappingURL=filters.Bd9OruMH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.Dx9TXuJ4.js","sources":["../../../src/components/filter/types.ts","../../../src/components/filter/hooks.ts","../../../src/components/filter/components/CustomValueInput.tsx","../../../src/components/filter/components/MultiSelectDropdown.tsx","../../../src/components/filter/components/SingleSelectDropdown.tsx","../../../src/components/filter/filter.tsx","../../../src/components/filter/filters.tsx"],"sourcesContent":["// Types\nexport interface FilterOption {\n id: string;\n label: string;\n}\n\nexport enum Operator {\n IS = 'is',\n IS_NOT = 'is not',\n CONTAINS = 'contains',\n DOES_NOT_CONTAIN = 'does not contain',\n STARTS_WITH = 'starts with',\n}\n\nexport interface FilterValue {\n id: string | number;\n source?: string;\n operator?: Operator;\n value?: string | string[];\n}\n\n/**\n * Filter rules for each source\n * How this works:\n * - You can define the rules for each source\n * - The rules are used to determine the available operators and value type\n * - The input type is used to determine the type of input displayed in when the dropdown is opened\n * - The getValueOptions function is used to determine the available options for the value\n * - multiSelect determines if multiple values can be selected for dropdown type\n *\n * @example\n * {\n * 'sourceId': {\n * operators: [\n * { id: 'is', label: 'is' },\n * { id: 'is not', label: 'is not' },\n * ],\n * inputType: 'dropdown' | 'custom',\n * multiSelect?: boolean,\n * getValueOptions?: () => FilterOption[],\n * },\n * }\n */\nexport interface FilterRules {\n [sourceId: string]: {\n operators: FilterOption[];\n inputType: 'dropdown' | 'custom';\n multiSelect?: boolean;\n getValueOptions?: () => FilterOption[];\n };\n}\n\nexport interface FilterProps {\n filter: FilterValue;\n sourceOptions: FilterOption[];\n rules: FilterRules;\n onSourceChange?: (sourceId: string) => void;\n onRemoveFilter: (id: string | number) => void;\n onFilterChange: (filter: FilterValue) => void;\n selectPlaceholder?: string;\n customValuePlaceholder?: string;\n customValueButtonLabel?: string;\n sourceFirstMessage?: string;\n}\n","import { FilterValue } from './types';\n\nexport const useMultiSelectHelpers = (\n internalFilter: FilterValue,\n valueOptions: Array<{ id: string; label: string }>,\n selectPlaceholder: string,\n) => {\n const getSelectedValues = (): string[] => {\n if (Array.isArray(internalFilter.value)) {\n return internalFilter.value;\n }\n\n return internalFilter.value ? [internalFilter.value] : [];\n };\n\n const isValueSelected = (valueId: string): boolean => {\n const selectedValues = getSelectedValues();\n\n return selectedValues.includes(valueId);\n };\n\n const getDisplayValue = (): string => {\n const selectedValues = getSelectedValues();\n if (selectedValues.length === 0) return selectPlaceholder;\n if (selectedValues.length === 1) {\n const option = valueOptions.find((opt) => opt.id === selectedValues[0]);\n\n return option?.label || selectedValues[0];\n }\n\n return `${selectedValues.length} selected`;\n };\n\n return {\n getSelectedValues,\n isValueSelected,\n getDisplayValue,\n };\n};\n","import React, { useRef } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\n\ninterface CustomValueInputProps {\n inputValue: string;\n setInputValue: (value: string) => void;\n customValuePlaceholder: string;\n customValueButtonLabel: string;\n onSubmit: () => void;\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement | HTMLButtonElement>, isInput: boolean) => void;\n}\n\nexport const CustomValueInput: React.FC<CustomValueInputProps> = ({\n inputValue,\n setInputValue,\n customValuePlaceholder,\n customValueButtonLabel,\n onSubmit,\n handleKeyDown,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n return (\n <form\n className=\"p-3\"\n onSubmit={(e) => {\n e.preventDefault();\n onSubmit();\n }}\n >\n <Input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n placeholder={customValuePlaceholder}\n className=\"mb-2\"\n onKeyDown={(e) => handleKeyDown(e, true)}\n />\n <Button\n type=\"submit\"\n variant=\"dark\"\n className=\"w-full\"\n onKeyDown={(e) => handleKeyDown(e, false)}\n data-custom-submit-button\n >\n {customValueButtonLabel}\n </Button>\n </form>\n );\n};\n","import React, { useState, useRef } from 'react';\nimport { Check } from '@phosphor-icons/react';\n\nimport { FilterValue, FilterOption } from '../types';\n\nimport { Button } from '@/components/ui/button';\n\ninterface MultiSelectDropdownProps {\n internalFilter: FilterValue;\n valueOptions: FilterOption[];\n onConfirm: (selectedValues: string[]) => void;\n onClose: () => void;\n}\n\nconst getInitialValues = (value: FilterValue['value']): string[] => {\n if (Array.isArray(value)) {\n return value;\n } else if (value) {\n return [value];\n }\n\n return [];\n};\n\nexport const MultiSelectDropdown: React.FC<MultiSelectDropdownProps> = ({\n internalFilter,\n valueOptions,\n onConfirm,\n onClose,\n}) => {\n const [pendingValues, setPendingValues] = useState<string[]>(() => getInitialValues(internalFilter.value));\n const [announcement, setAnnouncement] = useState<string>('');\n const buttonRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const applyButtonRef = useRef<HTMLButtonElement>(null);\n\n const handleValueToggle = (valueId: string) => {\n const option = valueOptions.find((opt) => opt.id === valueId);\n const isCurrentlySelected = pendingValues.includes(valueId);\n\n setPendingValues((prev) => {\n const newValues = prev.includes(valueId) ? prev.filter((id) => id !== valueId) : [...prev, valueId];\n\n // Announce the change\n if (option) {\n const action = isCurrentlySelected ? 'deselected' : 'selected';\n setAnnouncement(`${option.label} ${action}.`);\n }\n\n return newValues;\n });\n };\n\n const handleConfirm = () => {\n onConfirm(pendingValues);\n onClose();\n };\n\n const isValueSelected = (valueId: string): boolean => {\n return pendingValues.includes(valueId);\n };\n\n const focusButton = (index: number) => {\n if (index < valueOptions.length) {\n buttonRefs.current[index]?.focus();\n } else {\n applyButtonRef.current?.focus();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const nextIndex = Math.min(index + 1, valueOptions.length);\n focusButton(nextIndex);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prevIndex = Math.max(index - 1, 0);\n focusButton(prevIndex);\n break;\n }\n case 'Enter':\n case 'Spacebar':\n e.preventDefault();\n if (index < valueOptions.length) {\n // If the user is selecting an option\n handleValueToggle(valueOptions[index].id);\n } else {\n // If the user is selecting the apply button\n handleConfirm();\n }\n break;\n case 'Escape':\n e.preventDefault();\n onClose();\n break;\n }\n };\n\n return (\n <div className=\"py-1\" role=\"listbox\" aria-multiselectable=\"true\">\n {/* Screen reader announcements */}\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {announcement}\n </div>\n\n {valueOptions.map((option, index) => (\n <button\n key={option.id}\n ref={(el) => (buttonRefs.current[index] = el)}\n type=\"button\"\n className=\"relative flex w-full text-left cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\"\n onClick={() => handleValueToggle(option.id)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n role=\"option\"\n aria-selected={isValueSelected(option.id)}\n >\n {isValueSelected(option.id) && <Check size={14} className=\"mr-2\" />}\n {!isValueSelected(option.id) && <span className=\"mr-2 w-3.5\" />}\n {option.label}\n </button>\n ))}\n\n <div className=\"border-t border-border mt-1 pt-2 px-2 pb-2\">\n <Button\n ref={applyButtonRef}\n onClick={handleConfirm}\n size=\"sm\"\n className=\"w-full\"\n disabled={pendingValues.length === 0}\n onKeyDown={(e) => handleKeyDown(e, valueOptions.length)}\n >\n Apply ({pendingValues.length} selected)\n </Button>\n </div>\n </div>\n );\n};\n","import React, { useRef } from 'react';\nimport { Check } from '@phosphor-icons/react';\n\nimport { FilterOption } from '../types';\n\ninterface SingleSelectDropdownProps {\n valueOptions: FilterOption[];\n isValueSelected: (valueId: string) => boolean;\n onValueSelect: (valueId: string) => void;\n}\n\nexport const SingleSelectDropdown: React.FC<SingleSelectDropdownProps> = ({\n valueOptions,\n isValueSelected,\n onValueSelect,\n}) => {\n const buttonRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const focusButton = (index: number) => {\n buttonRefs.current[index]?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const nextIndex = Math.min(index + 1, valueOptions.length - 1);\n focusButton(nextIndex);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prevIndex = Math.max(index - 1, 0);\n focusButton(prevIndex);\n break;\n }\n case 'Enter':\n case 'Spacebar':\n e.preventDefault();\n onValueSelect(valueOptions[index].id);\n break;\n }\n };\n\n return (\n <div className=\"py-1\" role=\"listbox\">\n {valueOptions.map((option, index) => (\n <button\n key={option.id}\n ref={(el) => (buttonRefs.current[index] = el)}\n type=\"button\"\n className=\"relative flex w-full text-left cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\"\n onClick={() => onValueSelect(option.id)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n >\n {isValueSelected(option.id) && <Check size={14} className=\"mr-2\" />}\n {!isValueSelected(option.id) && <span className=\"mr-2 w-3.5\" />}\n {option.label}\n </button>\n ))}\n </div>\n );\n};\n","import React, { useState, useEffect, forwardRef, useRef, useImperativeHandle } from 'react';\nimport { Check, XCircle } from '@phosphor-icons/react';\n\nimport { FilterProps, FilterValue, Operator } from './types';\nimport { useMultiSelectHelpers } from './hooks';\nimport { CustomValueInput } from './components/CustomValueInput';\nimport { MultiSelectDropdown } from './components/MultiSelectDropdown';\nimport { SingleSelectDropdown } from './components/SingleSelectDropdown';\n\nimport { Button } from '@/components/ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nconst Filter = forwardRef<{ focus: () => void }, FilterProps>(\n (\n {\n filter,\n sourceOptions,\n rules,\n onSourceChange,\n onRemoveFilter,\n onFilterChange,\n selectPlaceholder = 'Select a value',\n customValuePlaceholder = 'Enter custom value',\n customValueButtonLabel = 'Done',\n sourceFirstMessage = 'Please select a source first',\n }: FilterProps,\n ref,\n ) => {\n // State\n const [internalFilter, setInternalFilter] = useState<FilterValue>({\n id: filter.id,\n source: filter.source,\n operator: filter.operator || Operator.IS,\n value: filter.value,\n });\n const [inputValue, setInputValue] = useState('');\n const [openDropdownType, setOpenDropdownType] = useState<'source' | 'operator' | 'value' | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const sourceButtonRef = useRef<HTMLButtonElement>(null);\n const divRef = useRef<HTMLDivElement>(null);\n\n // Expose focus method\n useImperativeHandle(ref, () => ({\n focus: () => {\n sourceButtonRef.current?.focus();\n },\n }));\n\n // Get current rules for selected source\n const currentRules = internalFilter.source ? rules[internalFilter.source] : undefined;\n const operatorOptions = currentRules?.operators || [];\n const isMultiSelect = currentRules?.multiSelect || false;\n let inputType = currentRules?.inputType || 'dropdown';\n if (internalFilter.operator === Operator.CONTAINS || internalFilter.operator === Operator.DOES_NOT_CONTAIN) {\n inputType = 'custom';\n }\n const valueOptions = currentRules?.getValueOptions ? currentRules.getValueOptions() : [];\n\n // Multi-select helpers\n const { getSelectedValues, isValueSelected, getDisplayValue } = useMultiSelectHelpers(\n internalFilter,\n valueOptions,\n selectPlaceholder,\n );\n\n // Auto-focus input when dropdown opens and custom input is needed\n useEffect(() => {\n if (openDropdownType === 'value' && inputType === 'custom') {\n const timeoutId = setTimeout(() => inputRef.current?.focus(), 50);\n\n return () => clearTimeout(timeoutId);\n }\n\n return undefined;\n }, [openDropdownType, inputType]);\n\n // Sync with external state\n useEffect(() => {\n setInternalFilter({\n id: filter.id,\n source: filter.source,\n operator: filter.operator || Operator.IS,\n value: filter.value,\n });\n }, [filter]);\n\n // Helper function to check if filter is complete and trigger onChange\n const checkAndTriggerChange = (newFilter: FilterValue) => {\n const hasValue = Array.isArray(newFilter.value) ? newFilter.value.length > 0 : !!newFilter.value?.trim();\n\n const isComplete = newFilter.source && newFilter.operator && hasValue;\n\n if (isComplete) {\n onFilterChange(newFilter);\n }\n };\n\n // Handle field updates\n const updateFilterField = (field: keyof FilterValue, value: string) => {\n const newFilter: FilterValue = { ...internalFilter, [field]: value };\n\n // Special handling for source changes\n if (field === 'source') {\n const sourceRules = rules[value];\n newFilter.operator = sourceRules?.operators[0]?.id as Operator;\n newFilter.value = sourceRules?.multiSelect ? [] : '';\n }\n // If operator changes, also clear value if inputType is dropdown\n if (field === 'operator') {\n if (internalFilter.source) {\n const sourceRules = rules[internalFilter.source];\n if (sourceRules?.inputType === 'dropdown') {\n newFilter.value = sourceRules?.multiSelect ? [] : '';\n }\n }\n }\n\n setInternalFilter(newFilter);\n checkAndTriggerChange(newFilter);\n\n if (!isMultiSelect || field !== 'value') {\n setOpenDropdownType(null);\n }\n };\n\n // Handle multi-select value changes\n const handleValueToggle = (valueId: string) => {\n const selectedValues = getSelectedValues();\n let newValues: string[];\n\n if (isMultiSelect) {\n if (selectedValues.includes(valueId)) {\n newValues = selectedValues.filter((id) => id !== valueId);\n } else {\n newValues = [...selectedValues, valueId];\n }\n } else {\n newValues = [valueId];\n }\n\n const newFilter = {\n ...internalFilter,\n value: isMultiSelect ? newValues : newValues[0] || '',\n };\n\n setInternalFilter(newFilter);\n checkAndTriggerChange(newFilter);\n\n // Close dropdown for single select, keep open for multi-select\n if (!isMultiSelect) {\n setOpenDropdownType(null);\n }\n };\n\n // Handle multi-select confirmation\n const handleMultiSelectConfirm = (selectedValues: string[]) => {\n const newFilter = {\n ...internalFilter,\n value: selectedValues,\n };\n\n setInternalFilter(newFilter);\n\n // Trigger onChange if filter is complete\n const isComplete = newFilter.source && newFilter.operator && selectedValues.length > 0;\n if (isComplete) onFilterChange(newFilter);\n\n setOpenDropdownType(null);\n };\n\n // Handle custom value submission\n const handleCustomValueSubmit = () => {\n if (inputValue.trim()) {\n const newFilter = { ...internalFilter, value: inputValue.trim() };\n setInternalFilter(newFilter);\n setInputValue('');\n setOpenDropdownType(null);\n if (newFilter.source && newFilter.operator && newFilter.value) {\n onFilterChange(newFilter);\n }\n }\n };\n\n // Tab trap handlers\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement | HTMLButtonElement>, isInput: boolean) => {\n if (e.key === 'Escape') {\n setOpenDropdownType(null);\n\n return;\n }\n if (e.key === 'Tab') {\n if (isInput && !e.shiftKey) {\n e.preventDefault();\n const button = document.querySelector('[data-custom-submit-button]') as HTMLButtonElement;\n button?.focus();\n } else if (!isInput) {\n e.preventDefault();\n inputRef.current?.focus();\n }\n }\n };\n\n return (\n <div className=\"inline-flex items-center rounded-full border border-foreground h-8 overflow-visible\" ref={divRef}>\n {/* Source Dropdown */}\n <DropdownMenu\n open={openDropdownType === 'source'}\n onOpenChange={(open) => setOpenDropdownType(open ? 'source' : null)}\n modal={false}\n >\n <DropdownMenuTrigger asChild>\n <button\n ref={sourceButtonRef}\n type=\"button\"\n className=\"flex items-center px-2 py-1 text-sm font-bold border-r border-[#a3a3a3] hover:bg-black/5 text-foreground rounded-l-full\"\n >\n {sourceOptions.find((opt) => opt.id === internalFilter.source)?.label ||\n sourceOptions[0]?.label ||\n selectPlaceholder}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-48\">\n {sourceOptions.map((option) => (\n <DropdownMenuItem\n key={option.id}\n className=\"flex items-center\"\n onSelect={() => {\n updateFilterField('source', option.id);\n onSourceChange?.(option.id);\n }}\n >\n {option.id === internalFilter.source && <Check size={14} className=\"mr-2\" />}\n {option.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Operator Dropdown */}\n <DropdownMenu\n open={openDropdownType === 'operator'}\n onOpenChange={(open) => setOpenDropdownType(open ? 'operator' : null)}\n modal={false}\n >\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"flex items-center px-2 py-1 text-sm border-r border-[#a3a3a3] hover:bg-black/5\"\n >\n {operatorOptions.find((opt) => opt.id === internalFilter.operator)?.label || selectPlaceholder}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-48\">\n {operatorOptions.map((option) => (\n <DropdownMenuItem\n key={option.id}\n className=\"flex items-center\"\n onSelect={() => updateFilterField('operator', option.id)}\n >\n {option.id === internalFilter.operator && <Check size={14} className=\"mr-2\" />}\n {option.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Value Popover */}\n <Popover\n open={openDropdownType === 'value'}\n onOpenChange={(open) => setOpenDropdownType(open ? 'value' : null)}\n >\n <PopoverTrigger asChild>\n <button type=\"button\" className=\"flex items-center px-2 py-1 text-sm font-bold hover:bg-black/5\">\n {getDisplayValue()}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-64 p-0\">\n {inputType === 'custom' && (\n <div className=\"p-3\">\n <CustomValueInput\n inputValue={inputValue}\n setInputValue={setInputValue}\n customValuePlaceholder={customValuePlaceholder}\n customValueButtonLabel={customValueButtonLabel}\n onSubmit={handleCustomValueSubmit}\n handleKeyDown={handleKeyDown}\n />\n </div>\n )}\n {inputType === 'dropdown' && (\n <>\n {internalFilter.source ? (\n <>\n {isMultiSelect ? (\n <MultiSelectDropdown\n internalFilter={internalFilter}\n valueOptions={valueOptions}\n onConfirm={handleMultiSelectConfirm}\n onClose={() => setOpenDropdownType(null)}\n />\n ) : (\n <SingleSelectDropdown\n valueOptions={valueOptions}\n isValueSelected={isValueSelected}\n onValueSelect={handleValueToggle}\n />\n )}\n </>\n ) : (\n <div className=\"p-3 text-sm text-gray-500\">{sourceFirstMessage}</div>\n )}\n </>\n )}\n </PopoverContent>\n </Popover>\n\n {/* Remove button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n setInternalFilter({ id: filter.id });\n setOpenDropdownType(null);\n onRemoveFilter(filter.id);\n }}\n className=\"p-2 hover:bg-black/10 rounded-none rounded-r-full\"\n aria-label=\"Remove filter\"\n >\n <XCircle size={16} weight=\"fill\" />\n </Button>\n </div>\n );\n },\n);\n\nFilter.displayName = 'Filter';\n\nexport { Filter };\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Plus } from '@phosphor-icons/react';\nimport { createId } from '@paralleldrive/cuid2';\n\nimport { Filter, FilterOption, FilterRules, FilterValue, Operator } from './index';\nimport { Button } from '../ui/button';\n\nimport { cn } from '@/lib/utils';\n\ninterface FiltersProps extends React.HTMLAttributes<HTMLDivElement> {\n filters: FilterValue[];\n onFilterChange: (filter: FilterValue) => void;\n onFilterRemove: (filterId: string | number) => void;\n onFilterAdd?: (filter: FilterValue) => void;\n sourceOptions: FilterOption[];\n rules: FilterRules;\n}\n\nconst Filters = ({\n filters,\n onFilterChange,\n onFilterRemove,\n onFilterAdd,\n sourceOptions,\n rules,\n className,\n}: FiltersProps) => {\n const [internalFilters, setInternalFilters] = useState<FilterValue[]>(filters || []);\n const filterRefs = useRef<{ [key: string]: { focus: () => void } | null }>({});\n\n // Sync internal state with props\n useEffect(() => {\n setInternalFilters(filters || []);\n }, [filters]);\n\n // Get sources that are already in use\n const usedSources = internalFilters.map((filter) => filter.source).filter(Boolean);\n\n // Get available sources that haven't been used yet\n const availableSources = sourceOptions.filter((option) => {\n // If the source has multiSelect enabled, filter out used sources\n if (rules[option.id]?.multiSelect) {\n return !usedSources.includes(option.id);\n }\n\n // If multiSelect is false or undefined, allow the source to be used multiple times\n return sourceOptions;\n });\n\n // Check if we can add more filters\n const canAddFilter = availableSources.length > 0;\n\n const handleAddFilter = () => {\n if (!canAddFilter) return;\n\n const newFilter = {\n id: createId(),\n source: availableSources[0].id,\n operator: Operator.IS,\n value: rules[availableSources[0].id]?.multiSelect ? [] : '',\n };\n\n const newFilters = [...internalFilters, newFilter];\n setInternalFilters(newFilters);\n\n // Focus the new filter after it's rendered\n requestAnimationFrame(() => {\n filterRefs.current[newFilter.id]?.focus();\n });\n\n // Notify parent if callback provided\n onFilterAdd?.(newFilter);\n };\n\n const handleRemoveFilter = (filter: FilterValue) => {\n const newFilters = internalFilters.filter((f) => f.id !== filter.id);\n setInternalFilters(newFilters);\n onFilterRemove(filter.id);\n };\n\n return (\n <fieldset className={cn('flex flex-wrap gap-2', className)}>\n <legend className=\"sr-only\">Filters</legend>\n {internalFilters?.map((filter) => {\n // For each filter, include available sources plus its own current source\n const filterSourceOptions = sourceOptions.filter(\n (option) =>\n !usedSources.includes(option.id) || // Available sources\n option.id === filter.source, // Or its own current source\n );\n\n return (\n <Filter\n key={filter.id}\n ref={(ref) => {\n filterRefs.current[filter.id] = ref;\n }}\n filter={filter}\n sourceOptions={filterSourceOptions}\n rules={rules}\n onRemoveFilter={() => handleRemoveFilter(filter)}\n onFilterChange={onFilterChange}\n />\n );\n })}\n {canAddFilter && (\n <Button\n onClick={handleAddFilter}\n variant=\"ghost\"\n className=\"border border-foreground rounded-full gap-1\"\n size=\"sm\"\n title=\"Add filter\"\n >\n <Plus size={16} />\n Add filter\n </Button>\n )}\n </fieldset>\n );\n};\n\nexport { Filters };\n"],"names":["Operator","React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filters.Bd9OruMH.js","sources":["../../../src/components/filter/types.ts","../../../src/components/filter/hooks.ts","../../../src/components/filter/components/CustomValueInput.tsx","../../../src/components/filter/components/MultiSelectDropdown.tsx","../../../src/components/filter/components/SingleSelectDropdown.tsx","../../../src/components/filter/filter.tsx","../../../src/components/filter/filters.tsx"],"sourcesContent":["// Types\nexport interface FilterOption {\n id: string;\n label: string;\n}\n\nexport enum Operator {\n IS = 'is',\n IS_NOT = 'is not',\n CONTAINS = 'contains',\n DOES_NOT_CONTAIN = 'does not contain',\n STARTS_WITH = 'starts with',\n}\n\nexport interface FilterValue {\n id: string | number;\n source?: string;\n operator?: Operator;\n value?: string | string[];\n}\n\n/**\n * Filter rules for each source\n * How this works:\n * - You can define the rules for each source\n * - The rules are used to determine the available operators and value type\n * - The input type is used to determine the type of input displayed in when the dropdown is opened\n * - The getValueOptions function is used to determine the available options for the value\n * - multiSelect determines if multiple values can be selected for dropdown type\n *\n * @example\n * {\n * 'sourceId': {\n * operators: [\n * { id: 'is', label: 'is' },\n * { id: 'is not', label: 'is not' },\n * ],\n * inputType: 'dropdown' | 'custom',\n * multiSelect?: boolean,\n * getValueOptions?: () => FilterOption[],\n * },\n * }\n */\nexport interface FilterRules {\n [sourceId: string]: {\n operators: FilterOption[];\n inputType: 'dropdown' | 'custom';\n multiSelect?: boolean;\n getValueOptions?: () => FilterOption[];\n };\n}\n\nexport interface FilterProps {\n filter: FilterValue;\n sourceOptions: FilterOption[];\n rules: FilterRules;\n onSourceChange?: (sourceId: string) => void;\n onRemoveFilter: (id: string | number) => void;\n onFilterChange: (filter: FilterValue) => void;\n selectPlaceholder?: string;\n customValuePlaceholder?: string;\n customValueButtonLabel?: string;\n sourceFirstMessage?: string;\n}\n","import { FilterValue } from './types';\n\nexport const useMultiSelectHelpers = (\n internalFilter: FilterValue,\n valueOptions: Array<{ id: string; label: string }>,\n selectPlaceholder: string,\n) => {\n const getSelectedValues = (): string[] => {\n if (Array.isArray(internalFilter.value)) {\n return internalFilter.value;\n }\n\n return internalFilter.value ? [internalFilter.value] : [];\n };\n\n const isValueSelected = (valueId: string): boolean => {\n const selectedValues = getSelectedValues();\n\n return selectedValues.includes(valueId);\n };\n\n const getDisplayValue = (): string => {\n const selectedValues = getSelectedValues();\n if (selectedValues.length === 0) return selectPlaceholder;\n if (selectedValues.length === 1) {\n const option = valueOptions.find((opt) => opt.id === selectedValues[0]);\n\n return option?.label || selectedValues[0];\n }\n\n return `${selectedValues.length} selected`;\n };\n\n return {\n getSelectedValues,\n isValueSelected,\n getDisplayValue,\n };\n};\n","import React, { useRef } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\n\ninterface CustomValueInputProps {\n inputValue: string;\n setInputValue: (value: string) => void;\n customValuePlaceholder: string;\n customValueButtonLabel: string;\n onSubmit: () => void;\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement | HTMLButtonElement>, isInput: boolean) => void;\n}\n\nexport const CustomValueInput: React.FC<CustomValueInputProps> = ({\n inputValue,\n setInputValue,\n customValuePlaceholder,\n customValueButtonLabel,\n onSubmit,\n handleKeyDown,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n return (\n <form\n className=\"p-3\"\n onSubmit={(e) => {\n e.preventDefault();\n onSubmit();\n }}\n >\n <Input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n placeholder={customValuePlaceholder}\n className=\"mb-2\"\n onKeyDown={(e) => handleKeyDown(e, true)}\n />\n <Button\n type=\"submit\"\n variant=\"dark\"\n className=\"w-full\"\n onKeyDown={(e) => handleKeyDown(e, false)}\n data-custom-submit-button\n >\n {customValueButtonLabel}\n </Button>\n </form>\n );\n};\n","import React, { useState, useRef } from 'react';\nimport { Check } from '@phosphor-icons/react';\n\nimport { FilterValue, FilterOption } from '../types';\n\nimport { Button } from '@/components/ui/button';\n\ninterface MultiSelectDropdownProps {\n internalFilter: FilterValue;\n valueOptions: FilterOption[];\n onConfirm: (selectedValues: string[]) => void;\n onClose: () => void;\n}\n\nconst getInitialValues = (value: FilterValue['value']): string[] => {\n if (Array.isArray(value)) {\n return value;\n } else if (value) {\n return [value];\n }\n\n return [];\n};\n\nexport const MultiSelectDropdown: React.FC<MultiSelectDropdownProps> = ({\n internalFilter,\n valueOptions,\n onConfirm,\n onClose,\n}) => {\n const [pendingValues, setPendingValues] = useState<string[]>(() => getInitialValues(internalFilter.value));\n const [announcement, setAnnouncement] = useState<string>('');\n const buttonRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const applyButtonRef = useRef<HTMLButtonElement>(null);\n\n const handleValueToggle = (valueId: string) => {\n const option = valueOptions.find((opt) => opt.id === valueId);\n const isCurrentlySelected = pendingValues.includes(valueId);\n\n setPendingValues((prev) => {\n const newValues = prev.includes(valueId) ? prev.filter((id) => id !== valueId) : [...prev, valueId];\n\n // Announce the change\n if (option) {\n const action = isCurrentlySelected ? 'deselected' : 'selected';\n setAnnouncement(`${option.label} ${action}.`);\n }\n\n return newValues;\n });\n };\n\n const handleConfirm = () => {\n onConfirm(pendingValues);\n onClose();\n };\n\n const isValueSelected = (valueId: string): boolean => {\n return pendingValues.includes(valueId);\n };\n\n const focusButton = (index: number) => {\n if (index < valueOptions.length) {\n buttonRefs.current[index]?.focus();\n } else {\n applyButtonRef.current?.focus();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const nextIndex = Math.min(index + 1, valueOptions.length);\n focusButton(nextIndex);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prevIndex = Math.max(index - 1, 0);\n focusButton(prevIndex);\n break;\n }\n case 'Enter':\n case 'Spacebar':\n e.preventDefault();\n if (index < valueOptions.length) {\n // If the user is selecting an option\n handleValueToggle(valueOptions[index].id);\n } else {\n // If the user is selecting the apply button\n handleConfirm();\n }\n break;\n case 'Escape':\n e.preventDefault();\n onClose();\n break;\n }\n };\n\n return (\n <div className=\"py-1\" role=\"listbox\" aria-multiselectable=\"true\">\n {/* Screen reader announcements */}\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n {announcement}\n </div>\n\n {valueOptions.map((option, index) => (\n <button\n key={option.id}\n ref={(el) => (buttonRefs.current[index] = el)}\n type=\"button\"\n className=\"relative flex w-full text-left cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\"\n onClick={() => handleValueToggle(option.id)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n role=\"option\"\n aria-selected={isValueSelected(option.id)}\n >\n {isValueSelected(option.id) && <Check size={14} className=\"mr-2\" />}\n {!isValueSelected(option.id) && <span className=\"mr-2 w-3.5\" />}\n {option.label}\n </button>\n ))}\n\n <div className=\"border-t border-border mt-1 pt-2 px-2 pb-2\">\n <Button\n ref={applyButtonRef}\n onClick={handleConfirm}\n size=\"sm\"\n className=\"w-full\"\n disabled={pendingValues.length === 0}\n onKeyDown={(e) => handleKeyDown(e, valueOptions.length)}\n >\n Apply ({pendingValues.length} selected)\n </Button>\n </div>\n </div>\n );\n};\n","import React, { useRef } from 'react';\nimport { Check } from '@phosphor-icons/react';\n\nimport { FilterOption } from '../types';\n\ninterface SingleSelectDropdownProps {\n valueOptions: FilterOption[];\n isValueSelected: (valueId: string) => boolean;\n onValueSelect: (valueId: string) => void;\n}\n\nexport const SingleSelectDropdown: React.FC<SingleSelectDropdownProps> = ({\n valueOptions,\n isValueSelected,\n onValueSelect,\n}) => {\n const buttonRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const focusButton = (index: number) => {\n buttonRefs.current[index]?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const nextIndex = Math.min(index + 1, valueOptions.length - 1);\n focusButton(nextIndex);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prevIndex = Math.max(index - 1, 0);\n focusButton(prevIndex);\n break;\n }\n case 'Enter':\n case 'Spacebar':\n e.preventDefault();\n onValueSelect(valueOptions[index].id);\n break;\n }\n };\n\n return (\n <div className=\"py-1\" role=\"listbox\">\n {valueOptions.map((option, index) => (\n <button\n key={option.id}\n ref={(el) => (buttonRefs.current[index] = el)}\n type=\"button\"\n className=\"relative flex w-full text-left cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\"\n onClick={() => onValueSelect(option.id)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n >\n {isValueSelected(option.id) && <Check size={14} className=\"mr-2\" />}\n {!isValueSelected(option.id) && <span className=\"mr-2 w-3.5\" />}\n {option.label}\n </button>\n ))}\n </div>\n );\n};\n","import React, { useState, useEffect, forwardRef, useRef, useImperativeHandle } from 'react';\nimport { Check, XCircle } from '@phosphor-icons/react';\n\nimport { FilterProps, FilterValue, Operator } from './types';\nimport { useMultiSelectHelpers } from './hooks';\nimport { CustomValueInput } from './components/CustomValueInput';\nimport { MultiSelectDropdown } from './components/MultiSelectDropdown';\nimport { SingleSelectDropdown } from './components/SingleSelectDropdown';\n\nimport { Button } from '@/components/ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\n\nconst Filter = forwardRef<{ focus: () => void }, FilterProps>(\n (\n {\n filter,\n sourceOptions,\n rules,\n onSourceChange,\n onRemoveFilter,\n onFilterChange,\n selectPlaceholder = 'Select a value',\n customValuePlaceholder = 'Enter custom value',\n customValueButtonLabel = 'Done',\n sourceFirstMessage = 'Please select a source first',\n }: FilterProps,\n ref,\n ) => {\n // State\n const [internalFilter, setInternalFilter] = useState<FilterValue>({\n id: filter.id,\n source: filter.source,\n operator: filter.operator || Operator.IS,\n value: filter.value,\n });\n const [inputValue, setInputValue] = useState('');\n const [openDropdownType, setOpenDropdownType] = useState<'source' | 'operator' | 'value' | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const sourceButtonRef = useRef<HTMLButtonElement>(null);\n const divRef = useRef<HTMLDivElement>(null);\n\n // Expose focus method\n useImperativeHandle(ref, () => ({\n focus: () => {\n sourceButtonRef.current?.focus();\n },\n }));\n\n // Get current rules for selected source\n const currentRules = internalFilter.source ? rules[internalFilter.source] : undefined;\n const operatorOptions = currentRules?.operators || [];\n const isMultiSelect = currentRules?.multiSelect || false;\n let inputType = currentRules?.inputType || 'dropdown';\n if (internalFilter.operator === Operator.CONTAINS || internalFilter.operator === Operator.DOES_NOT_CONTAIN) {\n inputType = 'custom';\n }\n const valueOptions = currentRules?.getValueOptions ? currentRules.getValueOptions() : [];\n\n // Multi-select helpers\n const { getSelectedValues, isValueSelected, getDisplayValue } = useMultiSelectHelpers(\n internalFilter,\n valueOptions,\n selectPlaceholder,\n );\n\n // Auto-focus input when dropdown opens and custom input is needed\n useEffect(() => {\n if (openDropdownType === 'value' && inputType === 'custom') {\n const timeoutId = setTimeout(() => inputRef.current?.focus(), 50);\n\n return () => clearTimeout(timeoutId);\n }\n\n return undefined;\n }, [openDropdownType, inputType]);\n\n // Sync with external state\n useEffect(() => {\n setInternalFilter({\n id: filter.id,\n source: filter.source,\n operator: filter.operator || Operator.IS,\n value: filter.value,\n });\n }, [filter]);\n\n // Helper function to check if filter is complete and trigger onChange\n const checkAndTriggerChange = (newFilter: FilterValue) => {\n const hasValue = Array.isArray(newFilter.value) ? newFilter.value.length > 0 : !!newFilter.value?.trim();\n\n const isComplete = newFilter.source && newFilter.operator && hasValue;\n\n if (isComplete) {\n onFilterChange(newFilter);\n }\n };\n\n // Handle field updates\n const updateFilterField = (field: keyof FilterValue, value: string) => {\n const newFilter: FilterValue = { ...internalFilter, [field]: value };\n\n // Special handling for source changes\n if (field === 'source') {\n const sourceRules = rules[value];\n newFilter.operator = sourceRules?.operators[0]?.id as Operator;\n newFilter.value = sourceRules?.multiSelect ? [] : '';\n }\n // If operator changes, also clear value if inputType is dropdown\n if (field === 'operator') {\n if (internalFilter.source) {\n const sourceRules = rules[internalFilter.source];\n if (sourceRules?.inputType === 'dropdown') {\n newFilter.value = sourceRules?.multiSelect ? [] : '';\n }\n }\n }\n\n setInternalFilter(newFilter);\n checkAndTriggerChange(newFilter);\n\n if (!isMultiSelect || field !== 'value') {\n setOpenDropdownType(null);\n }\n };\n\n // Handle multi-select value changes\n const handleValueToggle = (valueId: string) => {\n const selectedValues = getSelectedValues();\n let newValues: string[];\n\n if (isMultiSelect) {\n if (selectedValues.includes(valueId)) {\n newValues = selectedValues.filter((id) => id !== valueId);\n } else {\n newValues = [...selectedValues, valueId];\n }\n } else {\n newValues = [valueId];\n }\n\n const newFilter = {\n ...internalFilter,\n value: isMultiSelect ? newValues : newValues[0] || '',\n };\n\n setInternalFilter(newFilter);\n checkAndTriggerChange(newFilter);\n\n // Close dropdown for single select, keep open for multi-select\n if (!isMultiSelect) {\n setOpenDropdownType(null);\n }\n };\n\n // Handle multi-select confirmation\n const handleMultiSelectConfirm = (selectedValues: string[]) => {\n const newFilter = {\n ...internalFilter,\n value: selectedValues,\n };\n\n setInternalFilter(newFilter);\n\n // Trigger onChange if filter is complete\n const isComplete = newFilter.source && newFilter.operator && selectedValues.length > 0;\n if (isComplete) onFilterChange(newFilter);\n\n setOpenDropdownType(null);\n };\n\n // Handle custom value submission\n const handleCustomValueSubmit = () => {\n if (inputValue.trim()) {\n const newFilter = { ...internalFilter, value: inputValue.trim() };\n setInternalFilter(newFilter);\n setInputValue('');\n setOpenDropdownType(null);\n if (newFilter.source && newFilter.operator && newFilter.value) {\n onFilterChange(newFilter);\n }\n }\n };\n\n // Tab trap handlers\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement | HTMLButtonElement>, isInput: boolean) => {\n if (e.key === 'Escape') {\n setOpenDropdownType(null);\n\n return;\n }\n if (e.key === 'Tab') {\n if (isInput && !e.shiftKey) {\n e.preventDefault();\n const button = document.querySelector('[data-custom-submit-button]') as HTMLButtonElement;\n button?.focus();\n } else if (!isInput) {\n e.preventDefault();\n inputRef.current?.focus();\n }\n }\n };\n\n return (\n <div className=\"inline-flex items-center rounded-full border border-foreground h-8 overflow-visible\" ref={divRef}>\n {/* Source Dropdown */}\n <DropdownMenu\n open={openDropdownType === 'source'}\n onOpenChange={(open) => setOpenDropdownType(open ? 'source' : null)}\n modal={false}\n >\n <DropdownMenuTrigger asChild>\n <button\n ref={sourceButtonRef}\n type=\"button\"\n className=\"flex items-center px-2 py-1 text-sm font-bold border-r border-[#a3a3a3] hover:bg-black/5 text-foreground rounded-l-full\"\n >\n {sourceOptions.find((opt) => opt.id === internalFilter.source)?.label ||\n sourceOptions[0]?.label ||\n selectPlaceholder}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-48\">\n {sourceOptions.map((option) => (\n <DropdownMenuItem\n key={option.id}\n className=\"flex items-center\"\n onSelect={() => {\n updateFilterField('source', option.id);\n onSourceChange?.(option.id);\n }}\n >\n {option.id === internalFilter.source && <Check size={14} className=\"mr-2\" />}\n {option.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Operator Dropdown */}\n <DropdownMenu\n open={openDropdownType === 'operator'}\n onOpenChange={(open) => setOpenDropdownType(open ? 'operator' : null)}\n modal={false}\n >\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"flex items-center px-2 py-1 text-sm border-r border-[#a3a3a3] hover:bg-black/5\"\n >\n {operatorOptions.find((opt) => opt.id === internalFilter.operator)?.label || selectPlaceholder}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-48\">\n {operatorOptions.map((option) => (\n <DropdownMenuItem\n key={option.id}\n className=\"flex items-center\"\n onSelect={() => updateFilterField('operator', option.id)}\n >\n {option.id === internalFilter.operator && <Check size={14} className=\"mr-2\" />}\n {option.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Value Popover */}\n <Popover\n open={openDropdownType === 'value'}\n onOpenChange={(open) => setOpenDropdownType(open ? 'value' : null)}\n >\n <PopoverTrigger asChild>\n <button type=\"button\" className=\"flex items-center px-2 py-1 text-sm font-bold hover:bg-black/5\">\n {getDisplayValue()}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-64 p-0\">\n {inputType === 'custom' && (\n <div className=\"p-3\">\n <CustomValueInput\n inputValue={inputValue}\n setInputValue={setInputValue}\n customValuePlaceholder={customValuePlaceholder}\n customValueButtonLabel={customValueButtonLabel}\n onSubmit={handleCustomValueSubmit}\n handleKeyDown={handleKeyDown}\n />\n </div>\n )}\n {inputType === 'dropdown' && (\n <>\n {internalFilter.source ? (\n <>\n {isMultiSelect ? (\n <MultiSelectDropdown\n internalFilter={internalFilter}\n valueOptions={valueOptions}\n onConfirm={handleMultiSelectConfirm}\n onClose={() => setOpenDropdownType(null)}\n />\n ) : (\n <SingleSelectDropdown\n valueOptions={valueOptions}\n isValueSelected={isValueSelected}\n onValueSelect={handleValueToggle}\n />\n )}\n </>\n ) : (\n <div className=\"p-3 text-sm text-gray-500\">{sourceFirstMessage}</div>\n )}\n </>\n )}\n </PopoverContent>\n </Popover>\n\n {/* Remove button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n setInternalFilter({ id: filter.id });\n setOpenDropdownType(null);\n onRemoveFilter(filter.id);\n }}\n className=\"p-2 hover:bg-black/10 rounded-none rounded-r-full\"\n aria-label=\"Remove filter\"\n >\n <XCircle size={16} weight=\"fill\" />\n </Button>\n </div>\n );\n },\n);\n\nFilter.displayName = 'Filter';\n\nexport { Filter };\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Plus } from '@phosphor-icons/react';\nimport { createId } from '@paralleldrive/cuid2';\n\nimport { Filter, FilterOption, FilterRules, FilterValue, Operator } from './index';\nimport { Button } from '../ui/button';\n\nimport { cn } from '@/lib/utils';\n\ninterface FiltersProps extends React.HTMLAttributes<HTMLDivElement> {\n filters: FilterValue[];\n onFilterChange: (filter: FilterValue) => void;\n onFilterRemove: (filterId: string | number) => void;\n onFilterAdd?: (filter: FilterValue) => void;\n sourceOptions: FilterOption[];\n rules: FilterRules;\n}\n\nconst Filters = ({\n filters,\n onFilterChange,\n onFilterRemove,\n onFilterAdd,\n sourceOptions,\n rules,\n className,\n}: FiltersProps) => {\n const [internalFilters, setInternalFilters] = useState<FilterValue[]>(filters || []);\n const filterRefs = useRef<{ [key: string]: { focus: () => void } | null }>({});\n\n // Sync internal state with props\n useEffect(() => {\n setInternalFilters(filters || []);\n }, [filters]);\n\n // Get sources that are already in use\n const usedSources = internalFilters.map((filter) => filter.source).filter(Boolean);\n\n // Get available sources that haven't been used yet\n const availableSources = sourceOptions.filter((option) => {\n // If the source has multiSelect enabled, filter out used sources\n if (rules[option.id]?.multiSelect) {\n return !usedSources.includes(option.id);\n }\n\n // If multiSelect is false or undefined, allow the source to be used multiple times\n return sourceOptions;\n });\n\n // Check if we can add more filters\n const canAddFilter = availableSources.length > 0;\n\n const handleAddFilter = () => {\n if (!canAddFilter) return;\n\n const newFilter = {\n id: createId(),\n source: availableSources[0].id,\n operator: Operator.IS,\n value: rules[availableSources[0].id]?.multiSelect ? [] : '',\n };\n\n const newFilters = [...internalFilters, newFilter];\n setInternalFilters(newFilters);\n\n // Focus the new filter after it's rendered\n requestAnimationFrame(() => {\n filterRefs.current[newFilter.id]?.focus();\n });\n\n // Notify parent if callback provided\n onFilterAdd?.(newFilter);\n };\n\n const handleRemoveFilter = (filter: FilterValue) => {\n const newFilters = internalFilters.filter((f) => f.id !== filter.id);\n setInternalFilters(newFilters);\n onFilterRemove(filter.id);\n };\n\n return (\n <fieldset className={cn('flex flex-wrap gap-2', className)}>\n <legend className=\"sr-only\">Filters</legend>\n {internalFilters?.map((filter) => {\n // For each filter, include available sources plus its own current source\n const filterSourceOptions = sourceOptions.filter(\n (option) =>\n !usedSources.includes(option.id) || // Available sources\n option.id === filter.source, // Or its own current source\n );\n\n return (\n <Filter\n key={filter.id}\n ref={(ref) => {\n filterRefs.current[filter.id] = ref;\n }}\n filter={filter}\n sourceOptions={filterSourceOptions}\n rules={rules}\n onRemoveFilter={() => handleRemoveFilter(filter)}\n onFilterChange={onFilterChange}\n />\n );\n })}\n {canAddFilter && (\n <Button\n onClick={handleAddFilter}\n variant=\"ghost\"\n className=\"border border-foreground rounded-full gap-1\"\n size=\"sm\"\n title=\"Add filter\"\n >\n <Plus size={16} />\n Add filter\n </Button>\n )}\n </fieldset>\n );\n};\n\nexport { Filters };\n"],"names":["Operator","React"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React__default, { useState, useEffect } from 'react';
|
|
2
|
-
import { g as getLuminance, c as cn } from './utils.
|
|
2
|
+
import { g as getLuminance, c as cn } from './utils.DaMF_LVC.js';
|
|
3
3
|
|
|
4
4
|
const useDarkMode = () => {
|
|
5
5
|
const [isDarkMode, setIsDarkMode] = useState(() => document.documentElement.classList.contains("dark"));
|
|
@@ -103,4 +103,4 @@ const GeneratingStar = ({ loading, className, ...props }) => {
|
|
|
103
103
|
};
|
|
104
104
|
|
|
105
105
|
export { GeneratingStar as G };
|
|
106
|
-
//# sourceMappingURL=generating-star.
|
|
106
|
+
//# sourceMappingURL=generating-star.B0RUXRff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generating-star.
|
|
1
|
+
{"version":3,"file":"generating-star.B0RUXRff.js","sources":["../../../src/components/chat-search/hooks/useDarkMode.ts","../../../src/components/chat-search/hooks/useAccessibleColor.ts","../../../src/components/generating-star/generating-star.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport const useDarkMode = () => {\n const [isDarkMode, setIsDarkMode] = useState(() => document.documentElement.classList.contains('dark'));\n\n useEffect(() => {\n const observer = new MutationObserver(() => {\n setIsDarkMode(document.documentElement.classList.contains('dark'));\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n return () => observer.disconnect();\n }, []);\n\n return isDarkMode;\n};\n","import { useEffect, useState } from 'react';\n\nimport { useDarkMode } from './useDarkMode';\n\nimport { getLuminance } from '@/lib/utils';\n\nexport const useAccessibleColor = (primaryColorVar: string, primaryForegroundVar: string) => {\n const [foregroundColor, setForegroundColor] = useState(`rgb(var(${primaryForegroundVar}))`);\n const isDarkMode = useDarkMode();\n\n useEffect(() => {\n const primaryColor = getComputedStyle(document.documentElement).getPropertyValue(primaryColorVar).trim();\n const rgbMatch = primaryColor.match(/^(\\d+)\\s+(\\d+)\\s+(\\d+)$/);\n\n if (rgbMatch) {\n const luminance = getLuminance(rgbMatch.slice(1).join(','));\n if (luminance <= 0.5) {\n setForegroundColor(isDarkMode ? `rgb(var(--bfc-ring))` : `rgb(var(${primaryColorVar}))`);\n } else {\n setForegroundColor(isDarkMode ? `rgb(var(${primaryColorVar}))` : `rgb(var(${primaryForegroundVar}))`);\n }\n }\n }, [primaryColorVar, primaryForegroundVar, isDarkMode]);\n\n return foregroundColor;\n};\n","import React from 'react';\n\nimport { useAccessibleColor } from '../chat-search/hooks';\n\nimport { cn } from '@/lib/utils';\n\nexport interface GeneratingStarProps extends React.HTMLAttributes<SVGElement> {\n loading: boolean;\n}\n\nconst GeneratingStar = ({ loading, className, ...props }: GeneratingStarProps) => {\n const strokeColor = useAccessibleColor('--bfc-primary', '--bfc-border');\n\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn('min-w-5', className)}\n {...props}\n >\n <path\n className={loading ? 'animate-spin' : ''}\n d=\"M7.54672 16.0031L2.66234 14.2031C2.51881 14.1498 2.39502 14.0539 2.3076 13.9282C2.22019 13.8025 2.17333 13.6531 2.17333 13.5C2.17333 13.3469 2.22019 13.1975 2.3076 13.0718C2.39502 12.9461 2.51881 12.8501 2.66234 12.7969L7.54672 10.9969C7.64981 10.9589 7.74344 10.899 7.82113 10.8213C7.89882 10.7436 7.95873 10.65 7.99672 10.5469L9.79672 5.66249C9.84999 5.51896 9.94592 5.39517 10.0716 5.30775C10.1973 5.22033 10.3467 5.17348 10.4998 5.17348C10.6529 5.17348 10.8024 5.22033 10.9281 5.30775C11.0538 5.39517 11.1497 5.51896 11.203 5.66249L13.003 10.5469C13.041 10.65 13.1009 10.7436 13.1786 10.8213C13.2562 10.899 13.3499 10.9589 13.453 10.9969L18.3373 12.7969C18.4809 12.8501 18.6047 12.9461 18.6921 13.0718C18.7795 13.1975 18.8264 13.3469 18.8264 13.5C18.8264 13.6531 18.7795 13.8025 18.6921 13.9282C18.6047 14.0539 18.4809 14.1498 18.3373 14.2031L13.453 16.0031C13.3499 16.0411 13.2562 16.101 13.1786 16.1787C13.1009 16.2564 13.041 16.35 13.003 16.4531L11.203 21.3375C11.1497 21.481 11.0538 21.6048 10.9281 21.6922C10.8024 21.7796 10.6529 21.8265 10.4998 21.8265C10.3467 21.8265 10.1973 21.7796 10.0716 21.6922C9.94592 21.6048 9.84999 21.481 9.79672 21.3375L7.99672 16.4531C7.95873 16.35 7.89882 16.2564 7.82113 16.1787C7.74344 16.101 7.64981 16.0411 7.54672 16.0031Z\"\n stroke={strokeColor}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n fill=\"rgb(var(--bfc-primary))\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M18.7497 3.75L14.2497 3.75\"\n stroke=\"rgb(var(--bfc-primary))\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16.4999 6V1.5\"\n stroke=\"rgb(var(--bfc-primary))\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M22.4999 8.25001H19.4999\"\n stroke=\"rgb(var(--bfc-primary))\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M20.9998 9.75002V6.75002\"\n stroke=\"rgb(var(--bfc-primary))\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default GeneratingStar;\n"],"names":["React"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { c as cn } from './utils.
|
|
2
|
+
import { c as cn } from './utils.DaMF_LVC.js';
|
|
3
3
|
import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '../components/ui/select.js';
|
|
4
4
|
|
|
5
5
|
function SimpleSelect({
|
|
@@ -20,4 +20,4 @@ function SimpleSelect({
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export { SimpleSelect as S };
|
|
23
|
-
//# sourceMappingURL=simpleSelect.
|
|
23
|
+
//# sourceMappingURL=simpleSelect.BfAgKOea.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simpleSelect.
|
|
1
|
+
{"version":3,"file":"simpleSelect.BfAgKOea.js","sources":["../../../src/components/select/simpleSelect.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\nimport {\n Select as SelectComponent,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\n\nexport type SelectOption = {\n label: string;\n value: string;\n};\n\nexport interface SimpleSelectProps {\n options: SelectOption[];\n value?: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n appendToBody?: boolean;\n}\n\nexport function SimpleSelect({\n options,\n value,\n onChange,\n placeholder = 'Select...',\n disabled = false,\n className,\n appendToBody = false,\n}: SimpleSelectProps) {\n const handleValueChange = (newValue: string) => {\n if (onChange) {\n onChange(newValue);\n }\n };\n\n return (\n <SelectComponent value={value} onValueChange={handleValueChange} disabled={disabled}>\n <SelectTrigger className={cn('w-full', className)}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent appendToBody={appendToBody}>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </SelectComponent>\n );\n}\n"],"names":["SelectComponent"],"mappings":";;;;AA0BO,SAAS,YAAa,CAAA;AAAA,EAC3B,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAc,GAAA,WAAA;AAAA,EACd,QAAW,GAAA,KAAA;AAAA,EACX,SAAA;AAAA,EACA,YAAe,GAAA;AACjB,CAAsB,EAAA;AACpB,EAAM,MAAA,iBAAA,GAAoB,CAAC,QAAqB,KAAA;AAC9C,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,QAAA,CAAS,QAAQ,CAAA;AAAA;AACnB,GACF;AAEA,EAAA,2CACGA,MAAgB,EAAA,EAAA,KAAA,EAAc,aAAe,EAAA,iBAAA,EAAmB,4BAC9D,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,EAAc,SAAW,EAAA,EAAA,CAAG,UAAU,SAAS,CAAA,EAAA,kBAC7C,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,aAA0B,CACzC,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,EAAc,gBACZ,OAAQ,CAAA,GAAA,CAAI,CAAC,MAAA,yCACX,UAAW,EAAA,EAAA,GAAA,EAAK,MAAO,CAAA,KAAA,EAAO,OAAO,MAAO,CAAA,KAAA,EAAA,EAC1C,OAAO,KACV,CACD,CACH,CACF,CAAA;AAEJ;;;;"}
|
|
@@ -14,8 +14,7 @@ function isAnswerUncertain(response) {
|
|
|
14
14
|
/it(?:['\u2018\u2019]s| is) unclear/i,
|
|
15
15
|
/cannot determine/i,
|
|
16
16
|
/hard to say/i,
|
|
17
|
-
/difficult to determine/i
|
|
18
|
-
/need more information/i
|
|
17
|
+
/difficult to determine/i
|
|
19
18
|
],
|
|
20
19
|
es: [/no (?:lo )?sé/i, /no estoy seguro/i, /no es claro/i, /desconocido/i],
|
|
21
20
|
fr: [/je ne sais pas/i, /je ne suis pas sûr/i, /ce n'est pas clair/i, /inconnu/i],
|
|
@@ -51,4 +50,4 @@ function getLuminance(rgb) {
|
|
|
51
50
|
}
|
|
52
51
|
|
|
53
52
|
export { cn as c, getLuminance as g, isAnswerUncertain as i };
|
|
54
|
-
//# sourceMappingURL=utils.
|
|
53
|
+
//# sourceMappingURL=utils.DaMF_LVC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.DaMF_LVC.js","sources":["../../../src/lib/utils.ts"],"sourcesContent":["import { useRef } from 'react';\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nlet globalId = 0;\nconst genId = () => ++globalId;\n\nexport function useId(prefix?: string): string {\n const idRef = useRef<string>();\n if (idRef.current === undefined) {\n idRef.current = `${prefix || 'id'}-${genId()}`;\n }\n\n return idRef.current;\n}\n\nexport function isAnswerUncertain(response: string): { uncertain: boolean; language: string | null } {\n // Define uncertainty patterns for various languages\n const uncertaintyPatternsByLanguage: Record<string, RegExp[]> = {\n en: [\n /i(?:\\s|['\\u2018\\u2019])?m(?:\\s+really)?\\s+not\\s+sure/i,\n /i(?:\\s+am)?(?:\\s+really)?\\s+not\\s+sure/i,\n /i\\s+(?:really\\s+)?don(?:['\\u2018\\u2019])?t\\s+know/i,\n /it(?:['\\u2018\\u2019]s| is) unclear/i,\n /cannot determine/i,\n /hard to say/i,\n /difficult to determine/i,\n ],\n es: [/no (?:lo )?sé/i, /no estoy seguro/i, /no es claro/i, /desconocido/i],\n fr: [/je ne sais pas/i, /je ne suis pas sûr/i, /ce n'est pas clair/i, /inconnu/i],\n de: [/ich weiß nicht/i, /ich bin nicht sicher/i, /es ist unklar/i, /unbekannt/i],\n it: [/non lo so/i, /non sono sicuro/i, /non è chiaro/i, /sconosciuto/i],\n pt: [/não sei/i, /não tenho certeza/i, /não está claro/i, /desconhecido/i],\n nl: [/ik weet het niet/i, /ik weet niet zeker/i, /het is onduidelijk/i, /onbekend/i],\n pl: [/nie wiem/i, /nie jestem pewien/i, /to nie jest jasne/i, /nieznany/i],\n ru: [/я не знаю/i, /я не уверен/i, /это не ясно/i, /неизвестно/i],\n ja: [/知りません/i, /よくわからない/i, /不明です/i, /未知/i],\n ko: [/모릅니다/i, /잘 모르겠습니다/i, /불확실합니다/i, /알 수 없음/i],\n zh: [/我不知道/i, /我不确定/i, /不清楚/i, /未知/i],\n 'zh-TW': [/我不知道/i, /我不確定/i, /不清楚/i, /未知/i],\n };\n\n let earliestMatch: { index: number; language: string } | null = null;\n\n // Find the earliest match across all languages\n for (const [language, patterns] of Object.entries(uncertaintyPatternsByLanguage)) {\n for (const pattern of patterns) {\n const match = response.match(pattern);\n if (match && (earliestMatch === null || match.index! < earliestMatch.index)) {\n earliestMatch = { index: match.index!, language };\n }\n }\n }\n\n return earliestMatch ? { uncertain: true, language: earliestMatch.language } : { uncertain: false, language: null };\n}\n\nexport function getLuminance(rgb: string): number {\n const [r, g, b] = rgb.split(',').map(Number);\n const [R, G, B] = [r, g, b].map((v) => {\n v /= 255;\n\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { C as ChatSearch, a as ChatSearchProvider, u as useChatSearch, b as useIsChatSearchDirty } from '../chunks/ChatSearch.
|
|
1
|
+
export { C as ChatSearch, a as ChatSearchProvider, u as useChatSearch, b as useIsChatSearchDirty } from '../chunks/ChatSearch.CxwRDkGx.js';
|
|
2
2
|
//# sourceMappingURL=chat-search.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { C as Combobox } from '../chunks/combobox.
|
|
1
|
+
export { C as Combobox } from '../chunks/combobox.B5aw7PrS.js';
|
|
2
2
|
//# sourceMappingURL=combobox.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { D as DataTable } from '../chunks/data-table.
|
|
1
|
+
export { D as DataTable } from '../chunks/data-table.qS51pU0z.js';
|
|
2
2
|
//# sourceMappingURL=data-table.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { D as DatePicker } from '../chunks/date-picker.
|
|
1
|
+
export { D as DatePicker } from '../chunks/date-picker.DqcdwXZS.js';
|
|
2
2
|
//# sourceMappingURL=date-picker.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { F as Filter, a as Filters, O as Operator } from '../chunks/filters.
|
|
1
|
+
export { F as Filter, a as Filters, O as Operator } from '../chunks/filters.Bd9OruMH.js';
|
|
2
2
|
//# sourceMappingURL=filter.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { G as default } from '../chunks/generating-star.
|
|
1
|
+
export { G as default } from '../chunks/generating-star.B0RUXRff.js';
|
|
2
2
|
//# sourceMappingURL=generating-star.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { C as CodeBlock, F as FormattedMessage, M as MemoizedReactMarkdown, a as MermaidDiagram, Z as ZoomableImage } from '../chunks/FormattedMessage.
|
|
1
|
+
export { C as CodeBlock, F as FormattedMessage, M as MemoizedReactMarkdown, a as MermaidDiagram, Z as ZoomableImage } from '../chunks/FormattedMessage.CpTetIzd.js';
|
|
2
2
|
//# sourceMappingURL=markdown.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { S as SimpleSelect } from '../chunks/simpleSelect.
|
|
1
|
+
export { S as SimpleSelect } from '../chunks/simpleSelect.BfAgKOea.js';
|
|
2
2
|
//# sourceMappingURL=select.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import * as AccordionPrimitive from '@radix-ui/react-accordion';
|
|
3
3
|
import { CaretDown } from '@phosphor-icons/react';
|
|
4
|
-
import { c as cn } from '../../chunks/utils.
|
|
4
|
+
import { c as cn } from '../../chunks/utils.DaMF_LVC.js';
|
|
5
5
|
|
|
6
6
|
function Accordion({ ...props }) {
|
|
7
7
|
return /* @__PURE__ */ React.createElement(AccordionPrimitive.Root, { "data-slot": "accordion", ...props });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.js","sources":["../../../../src/components/ui/accordion.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"accordion.js","sources":["../../../../src/components/ui/accordion.tsx"],"sourcesContent":["import * as React from 'react';\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { CaretDown } from '@phosphor-icons/react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Accordion({ ...props }: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />;\n}\n\nfunction AccordionItem({ className, ...props }: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn('border-b last:border-b-0', className)}\n {...props}\n />\n );\n}\n\nfunction AccordionTrigger({ className, children, ...props }: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n 'focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180',\n className,\n )}\n {...props}\n >\n {children}\n <CaretDown className=\"text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nfunction AccordionContent({ className, children, ...props }: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm\"\n {...props}\n >\n <div className={cn('pt-0 pb-4', className)}>{children}</div>\n </AccordionPrimitive.Content>\n );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n"],"names":[],"mappings":";;;;;AAMA,SAAS,SAAU,CAAA,EAAE,GAAG,KAAA,EAA+D,EAAA;AACrF,EAAA,2CAAQ,kBAAmB,CAAA,IAAA,EAAnB,EAAwB,WAAU,EAAA,WAAA,EAAa,GAAG,KAAO,EAAA,CAAA;AACnE;AAEA,SAAS,aAAc,CAAA,EAAE,SAAW,EAAA,GAAG,OAA+D,EAAA;AACpG,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,kBAAmB,CAAA,IAAA;AAAA,IAAnB;AAAA,MACC,WAAU,EAAA,gBAAA;AAAA,MACV,SAAA,EAAW,EAAG,CAAA,0BAAA,EAA4B,SAAS,CAAA;AAAA,MAClD,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,iBAAiB,EAAE,SAAA,EAAW,QAAU,EAAA,GAAG,OAAkE,EAAA;AACpH,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,kBAAA,CAAmB,MAAnB,EAAA,EAA0B,WAAU,MACnC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,kBAAmB,CAAA,OAAA;AAAA,IAAnB;AAAA,MACC,WAAU,EAAA,mBAAA;AAAA,MACV,SAAW,EAAA,EAAA;AAAA,QACT,4SAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA,KAAA;AAAA,IAEH,QAAA;AAAA,oBACD,KAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,SAAA,EAAU,6GAA8G,EAAA;AAAA,GAEvI,CAAA;AAEJ;AAEA,SAAS,iBAAiB,EAAE,SAAA,EAAW,QAAU,EAAA,GAAG,OAAkE,EAAA;AACpH,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,kBAAmB,CAAA,OAAA;AAAA,IAAnB;AAAA,MACC,WAAU,EAAA,mBAAA;AAAA,MACV,SAAU,EAAA,2GAAA;AAAA,MACT,GAAG;AAAA,KAAA;AAAA,wCAEH,KAAI,EAAA,EAAA,SAAA,EAAW,GAAG,WAAa,EAAA,SAAS,KAAI,QAAS;AAAA,GACxD;AAEJ;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { cva } from 'class-variance-authority';
|
|
3
|
-
import { c as cn } from '../../chunks/utils.
|
|
3
|
+
import { c as cn } from '../../chunks/utils.DaMF_LVC.js';
|
|
4
4
|
|
|
5
5
|
const badgeVariants = cva(
|
|
6
6
|
"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|