@jarllyng/nostromo 3.12.2 → 3.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/chunk-CH5LTBAG.js +3 -0
  2. package/dist/chunk-CH5LTBAG.js.map +1 -0
  3. package/dist/chunk-HCO4XKPM.js +3 -0
  4. package/dist/chunk-HCO4XKPM.js.map +1 -0
  5. package/dist/chunk-JTHW25XF.cjs +3 -0
  6. package/dist/chunk-JTHW25XF.cjs.map +1 -0
  7. package/dist/chunk-KASVYULP.cjs +3 -0
  8. package/dist/chunk-KASVYULP.cjs.map +1 -0
  9. package/dist/chunk-UC577SR4.cjs +3 -0
  10. package/dist/chunk-UC577SR4.cjs.map +1 -0
  11. package/dist/chunk-YC6ALHAZ.js +3 -0
  12. package/dist/chunk-YC6ALHAZ.js.map +1 -0
  13. package/dist/components/core/data-table.cjs +1 -1
  14. package/dist/components/core/data-table.d.cts +22 -1
  15. package/dist/components/core/data-table.d.ts +22 -1
  16. package/dist/components/core/data-table.js +1 -1
  17. package/dist/components/core/table.cjs +1 -1
  18. package/dist/components/core/table.d.cts +10 -0
  19. package/dist/components/core/table.d.ts +10 -0
  20. package/dist/components/core/table.js +1 -1
  21. package/dist/components/core/toast.cjs +1 -1
  22. package/dist/components/core/toast.d.cts +59 -1
  23. package/dist/components/core/toast.d.ts +59 -1
  24. package/dist/components/core/toast.js +1 -1
  25. package/dist/index.cjs +1 -1
  26. package/dist/index.d.cts +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +1 -1
  29. package/package.json +3 -3
  30. package/dist/chunk-5Z3MYAVM.cjs +0 -3
  31. package/dist/chunk-5Z3MYAVM.cjs.map +0 -1
  32. package/dist/chunk-AYEM2M4H.cjs +0 -3
  33. package/dist/chunk-AYEM2M4H.cjs.map +0 -1
  34. package/dist/chunk-UIEGBT4T.js +0 -3
  35. package/dist/chunk-UIEGBT4T.js.map +0 -1
  36. package/dist/chunk-VNDL67OG.cjs +0 -3
  37. package/dist/chunk-VNDL67OG.cjs.map +0 -1
  38. package/dist/chunk-WO3KCAN6.js +0 -3
  39. package/dist/chunk-WO3KCAN6.js.map +0 -1
  40. package/dist/chunk-XJJJEWSU.js +0 -3
  41. package/dist/chunk-XJJJEWSU.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/core/table.tsx"],"names":["tableVariants","cva","tableHeaderVariants","tableRowVariants","tableCellVariants","TableComponent","data","columns","loading","emptyText","className","variant","size","rowKey","onRowClick","onSort","controlledSortColumn","controlledSortDirection","pagination","selection","caption","props","ref","internalSortState","setInternalSortState","useState","isControlled","sortState","handleSort","column","newDirection","getRowKey","record","index","isRowDisabled","selectableKeys","key","recordsForKeys","keys","isRowSelected","handleRowSelection","checked","newSelectedKeys","k","handleSelectAll","others","selectedOnPage","isAllSelected","isIndeterminate","React","cn","TableHeader","TableRow","input","TableBody","TableCell","e","TableForwardRef","Table","children","onClick","selected","colSpan","rowSpan","TableHead"],"mappings":"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","file":"chunk-UC577SR4.cjs","sourcesContent":["import React, { useState } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\n\n// Table variants\nconst tableVariants = cva(\n \"w-full border-collapse transition-all duration-200\",\n {\n variants: {\n variant: {\n default: \"border border-border shadow-sm hover:shadow-md\",\n striped: \"border border-border shadow-sm hover:shadow-md\",\n bordered: \"border-2 border-border shadow-md hover:shadow-lg\",\n hover: \"border border-border shadow-sm hover:shadow-md\",\n elevated: \"border border-border shadow-lg hover:shadow-xl\",\n interactive:\n \"border border-border shadow-sm hover:shadow-md hover:border-primary\",\n },\n size: {\n sm: \"text-xs sm:text-sm\",\n md: \"text-sm sm:text-base\",\n lg: \"text-base sm:text-lg\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n },\n);\n\nconst tableHeaderVariants = cva(\n \"font-medium text-left transition-all duration-200\",\n {\n variants: {\n variant: {\n default: \"bg-muted text-foreground hover:bg-muted/80\",\n striped: \"bg-muted text-foreground hover:bg-muted/80\",\n bordered: \"bg-muted text-foreground hover:bg-muted/80\",\n hover: \"bg-muted text-foreground hover:bg-muted/80\",\n elevated: \"bg-muted text-foreground hover:bg-muted/80\",\n interactive:\n \"bg-muted text-foreground hover:bg-primary/10 hover:text-primary\",\n },\n size: {\n sm: \"px-2 py-1 sm:px-3 sm:py-2\",\n md: \"px-3 py-2 sm:px-4 sm:py-3\",\n lg: \"px-4 py-3 sm:px-6 sm:py-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n },\n);\n\n/**\n * Row-level variants.\n *\n * `striped` has to live here, not on the cell: `even:` selects the even sibling\n * among *cells within a row*, so applying it there striped columns instead of\n * rows - and TableRow ignored the variant entirely, so nothing showed at all.\n */\nconst tableRowVariants = cva(\"border-b border-border transition-colors\", {\n variants: {\n variant: {\n default: \"hover:bg-muted/50\",\n striped: \"even:bg-muted/50 hover:bg-muted/80\",\n bordered: \"hover:bg-muted/50\",\n hover: \"hover:bg-muted/50\",\n elevated: \"hover:bg-muted/80\",\n interactive: \"hover:bg-primary/10 hover:text-primary\",\n },\n },\n defaultVariants: { variant: \"default\" },\n});\n\nconst tableCellVariants = cva(\"border-border transition-all duration-200\", {\n variants: {\n variant: {\n default: \"border-b border-border hover:bg-muted/50\",\n striped: \"border-b border-border hover:bg-muted/80\",\n bordered: \"border border-border hover:bg-muted/50\",\n hover: \"border-b border-border hover:bg-muted/50\",\n elevated: \"border-b border-border hover:bg-muted/80\",\n interactive:\n \"border-b border-border hover:bg-primary/10 hover:text-primary\",\n },\n size: {\n sm: \"px-2 py-1 sm:px-3 sm:py-2\",\n md: \"px-3 py-2 sm:px-4 sm:py-3\",\n lg: \"px-4 py-3 sm:px-6 sm:py-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n },\n});\n\n// Types\nexport interface TableColumn<T = Record<string, unknown>> {\n key: string;\n title: string;\n dataIndex?: keyof T;\n render?: (value: unknown, record: T, index: number) => React.ReactNode;\n sortable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n className?: string;\n}\n\nexport interface TableProps<T = Record<string, unknown>> extends VariantProps<\n typeof tableVariants\n> {\n data: T[];\n columns: TableColumn<T>[];\n loading?: boolean;\n emptyText?: string;\n caption?: string;\n className?: string;\n rowKey?: keyof T | ((record: T) => string | number);\n onRowClick?: (record: T, index: number) => void;\n onSort?: (column: TableColumn<T>, direction: \"asc\" | \"desc\") => void;\n sortColumn?: string;\n sortDirection?: \"asc\" | \"desc\";\n pagination?: {\n current: number;\n pageSize: number;\n total: number;\n onChange: (page: number, pageSize: number) => void;\n showSizeChanger?: boolean;\n showQuickJumper?: boolean;\n };\n selection?: {\n selectedRowKeys: (string | number)[];\n /**\n * `selectedRowKeys` is the complete selection, including keys for records on\n * other pages. `selectedRows` is only the subset present in `data`, because\n * the component has never been given the rest. Paginating server-side means\n * keeping your own key-to-record map and treating the keys as authoritative.\n */\n onChange: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;\n /**\n * A disabled row cannot be selected individually, and select-all skips it\n * rather than selecting it on the consumer's behalf.\n */\n getCheckboxProps?: (record: T) => { disabled?: boolean };\n };\n}\n\nexport interface TableHeaderProps extends VariantProps<\n typeof tableHeaderVariants\n> {\n className?: string;\n children: React.ReactNode;\n}\n\nexport interface TableBodyProps {\n className?: string;\n children: React.ReactNode;\n}\n\nexport interface TableRowProps extends VariantProps<typeof tableRowVariants> {\n className?: string;\n children: React.ReactNode;\n onClick?: () => void;\n selected?: boolean;\n}\n\nexport interface TableCellProps extends VariantProps<typeof tableCellVariants> {\n className?: string;\n children: React.ReactNode;\n colSpan?: number;\n rowSpan?: number;\n}\n\n// Table Components\nfunction TableComponent<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(\n {\n data,\n columns,\n loading = false,\n emptyText = \"No data\",\n className,\n variant,\n size,\n rowKey = \"id\",\n onRowClick,\n onSort,\n sortColumn: controlledSortColumn,\n sortDirection: controlledSortDirection,\n pagination,\n selection,\n caption,\n ...props\n }: TableProps<T>,\n ref: React.Ref<HTMLTableElement>,\n) {\n // Use controlled props if provided, otherwise use internal state\n const [internalSortState, setInternalSortState] = useState<{\n column: string;\n direction: \"asc\" | \"desc\";\n } | null>(null);\n\n // Determine current sort state (controlled takes precedence)\n const isControlled = controlledSortColumn !== undefined;\n const sortState =\n isControlled && controlledSortColumn\n ? {\n column: controlledSortColumn,\n direction: controlledSortDirection || \"asc\",\n }\n : internalSortState;\n\n // Sync internal state with controlled props when they change\n // Sync internal state with controlled props when they change\n // Note: unneeded re-render caused by resetting state. We derive sortState above so stale internal state is ignored.\n /* \n useEffect(() => {\n if (isControlled && controlledSortColumn) {\n setInternalSortState(null);\n }\n }, [isControlled, controlledSortColumn]); \n */\n\n const handleSort = (column: TableColumn<T>) => {\n if (!column.sortable) return;\n\n const newDirection =\n sortState?.column === column.key && sortState?.direction === \"asc\"\n ? \"desc\"\n : \"asc\";\n\n // Only update internal state if not controlled\n if (!isControlled) {\n setInternalSortState({ column: column.key, direction: newDirection });\n }\n\n // Always call onSort callback for controlled usage\n onSort?.(column, newDirection);\n };\n\n /**\n * Nullish, not falsy.\n *\n * `record[rowKey] || index` reads a record with `id: 0` as having no key and\n * falls back to its position, so a zero-keyed row at index 1 reported itself as\n * key `1` - which is a different record's id. Empty string is a legitimate key\n * for the same reason.\n */\n const getRowKey = (record: T, index: number): string | number => {\n if (typeof rowKey === \"function\") {\n return rowKey(record);\n }\n return (record[rowKey] as string | number | undefined) ?? index;\n };\n\n const isRowDisabled = (record: T): boolean =>\n selection?.getCheckboxProps?.(record).disabled === true;\n\n /**\n * The rows on this page that a checkbox can actually act on.\n *\n * Everything below is expressed in terms of these rather than in terms of\n * `data.length` or `selectedRowKeys.length`. Selection is a list of keys that\n * may name records on other pages, so comparing its length to the number of\n * visible rows answered a question nobody asked: with two rows on screen and\n * two rows selected elsewhere, \"select all\" showed as checked.\n */\n const selectableKeys = selection\n ? data\n .map((record, index) => ({ record, key: getRowKey(record, index) }))\n .filter(({ record }) => !isRowDisabled(record))\n .map(({ key }) => key)\n : [];\n\n /**\n * The records behind a set of keys, as far as this page can tell.\n *\n * A key belonging to another page cannot be resolved here, because the\n * component has only been given the current page. The keys are the complete\n * answer; the records are the subset that is on screen. Documented on the prop,\n * because a consumer paginating server-side has to keep its own map.\n */\n const recordsForKeys = (keys: (string | number)[]): T[] =>\n data.filter((record, index) => keys.includes(getRowKey(record, index)));\n\n const isRowSelected = (record: T, index: number): boolean => {\n if (!selection) return false;\n const key = getRowKey(record, index);\n return selection.selectedRowKeys.includes(key);\n };\n\n const handleRowSelection = (\n record: T,\n index: number,\n checked: boolean,\n ): void => {\n if (!selection || isRowDisabled(record)) return;\n\n const key = getRowKey(record, index);\n const newSelectedKeys = checked\n ? selection.selectedRowKeys.includes(key)\n ? selection.selectedRowKeys\n : [...selection.selectedRowKeys, key]\n : selection.selectedRowKeys.filter((k) => k !== key);\n\n selection.onChange(newSelectedKeys, recordsForKeys(newSelectedKeys));\n };\n\n /**\n * Adds or removes this page's selectable rows, and leaves every other key\n * alone.\n *\n * It used to replace the whole selection with either every visible key or\n * nothing, so paging through a table and pressing select-all on the second page\n * silently discarded the first page's selection - and it included rows the\n * consumer had disabled.\n */\n const handleSelectAll = (checked: boolean) => {\n if (!selection) return;\n\n const others = selection.selectedRowKeys.filter(\n (key) => !selectableKeys.includes(key),\n );\n const newSelectedKeys = checked ? [...others, ...selectableKeys] : others;\n\n selection.onChange(newSelectedKeys, recordsForKeys(newSelectedKeys));\n };\n\n const selectedOnPage = selectableKeys.filter((key) =>\n selection?.selectedRowKeys.includes(key),\n );\n\n const isAllSelected =\n selection &&\n selectableKeys.length > 0 &&\n selectedOnPage.length === selectableKeys.length;\n\n const isIndeterminate =\n selection &&\n selectedOnPage.length > 0 &&\n selectedOnPage.length < selectableKeys.length;\n\n return (\n <div className=\"w-full overflow-x-auto\">\n <div className=\"min-w-full\">\n <table\n ref={ref}\n className={cn(tableVariants({ variant, size }), className)}\n {...props}\n >\n {caption && <caption className=\"sr-only\">{caption}</caption>}\n <TableHeader>\n <TableRow>\n {selection && (\n <th\n className={cn(tableCellVariants({ variant, size }))}\n scope=\"col\"\n role=\"columnheader\"\n >\n <input\n type=\"checkbox\"\n checked={isAllSelected}\n ref={(input) => {\n if (input) input.indeterminate = isIndeterminate || false;\n }}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className=\"rounded border-input text-primary focus:ring-ring\"\n aria-label=\"Select all rows\"\n />\n </th>\n )}\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n tableCellVariants({ variant, size }),\n column.className,\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n )}\n scope=\"col\"\n role=\"columnheader\"\n {...(column.width && { style: { width: column.width } })}\n >\n <div className=\"flex items-center gap-2\">\n <span>{column.title}</span>\n {column.sortable && (\n <button\n type=\"button\"\n onClick={() => handleSort(column)}\n className=\"flex flex-col text-muted-foreground hover:text-foreground\"\n aria-label={`Sort by ${column.title}`}\n >\n <svg\n className={cn(\n \"w-3 h-3\",\n sortState?.column === column.key &&\n sortState?.direction === \"asc\"\n ? \"text-primary\"\n : \"text-muted-foreground\",\n )}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path d=\"M5 8l5-5 5 5H5z\" />\n </svg>\n <svg\n className={cn(\n \"w-3 h-3 -mt-1\",\n sortState?.column === column.key &&\n sortState?.direction === \"desc\"\n ? \"text-primary\"\n : \"text-muted-foreground\",\n )}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path d=\"M5 12l5 5 5-5H5z\" />\n </svg>\n </button>\n )}\n </div>\n </th>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell\n colSpan={columns.length + (selection ? 1 : 0)}\n variant={variant}\n size={size}\n className=\"text-center py-8\"\n >\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-primary\"></div>\n <span>Loading...</span>\n </div>\n </TableCell>\n </TableRow>\n ) : data.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={columns.length + (selection ? 1 : 0)}\n variant={variant}\n size={size}\n className=\"text-center py-8 text-muted-foreground\"\n >\n {emptyText}\n </TableCell>\n </TableRow>\n ) : (\n data.map((record, index) => (\n <TableRow\n key={getRowKey(record, index)}\n variant={variant}\n onClick={() => onRowClick?.(record, index)}\n selected={isRowSelected(record, index)}\n >\n {selection && (\n <TableCell variant={variant} size={size}>\n <input\n type=\"checkbox\"\n checked={isRowSelected(record, index)}\n onChange={(e) =>\n handleRowSelection(record, index, e.target.checked)\n }\n className=\"rounded border-input text-primary focus:ring-ring\"\n aria-label={`Select row ${index + 1}`}\n {...selection.getCheckboxProps?.(record)}\n />\n </TableCell>\n )}\n {columns.map((column) => (\n <TableCell\n key={column.key}\n variant={variant}\n size={size}\n className={cn(\n column.className,\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n )}\n >\n {column.render\n ? column.render(\n column.dataIndex\n ? record[column.dataIndex]\n : record,\n record,\n index,\n )\n : column.dataIndex\n ? (record[column.dataIndex] as React.ReactNode)\n : ((record as Record<string, unknown>)[\n column.key\n ] as React.ReactNode)}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </table>\n </div>\n\n {pagination && (\n <div className=\"flex flex-col sm:flex-row items-center justify-between mt-4 px-2 sm:px-4 py-3 bg-card border-t border-border gap-2 sm:gap-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-muted-foreground\">\n Showing {(pagination.current - 1) * pagination.pageSize + 1} to{\" \"}\n {Math.min(\n pagination.current * pagination.pageSize,\n pagination.total,\n )}{\" \"}\n of {pagination.total} results\n </span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {pagination.showSizeChanger && (\n <select\n value={pagination.pageSize}\n onChange={(e) => pagination.onChange(1, Number(e.target.value))}\n className=\"rounded border-input bg-background text-sm\"\n aria-label=\"Select page size\"\n >\n <option value={10}>10 / page</option>\n <option value={20}>20 / page</option>\n <option value={50}>50 / page</option>\n <option value={100}>100 / page</option>\n </select>\n )}\n\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() =>\n pagination.onChange(\n pagination.current - 1,\n pagination.pageSize,\n )\n }\n disabled={pagination.current <= 1}\n className=\"px-3 py-1 text-sm border border-input rounded hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed\"\n aria-label=\"Go to previous page\"\n >\n Previous\n </button>\n\n <span className=\"px-3 py-1 text-sm\">\n Page {pagination.current} of{\" \"}\n {Math.ceil(pagination.total / pagination.pageSize)}\n </span>\n\n <button\n type=\"button\"\n onClick={() =>\n pagination.onChange(\n pagination.current + 1,\n pagination.pageSize,\n )\n }\n disabled={\n pagination.current >=\n Math.ceil(pagination.total / pagination.pageSize)\n }\n className=\"px-3 py-1 text-sm border border-input rounded hover:bg-muted disabled:opacity-50 disabled:cursor-not-allowed\"\n aria-label=\"Go to next page\"\n >\n Next\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nconst TableForwardRef = React.forwardRef(TableComponent) as <\n T extends Record<string, unknown> = Record<string, unknown>,\n>(\n props: TableProps<T> & { ref?: React.Ref<HTMLTableElement> },\n) => React.ReactElement;\n\n(\n TableForwardRef as React.ComponentType<TableProps<unknown>> & {\n displayName?: string;\n }\n).displayName = \"Table\";\n\nexport const Table = TableForwardRef;\n\nexport const TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n TableHeaderProps\n>(({ className, variant, size, children, ...props }, ref) => (\n <thead\n ref={ref}\n className={cn(tableHeaderVariants({ variant, size }), className)}\n {...props}\n >\n {children}\n </thead>\n));\n\nTableHeader.displayName = \"TableHeader\";\n\nexport const TableBody = React.forwardRef<\n HTMLTableSectionElement,\n TableBodyProps\n>(({ className, children, ...props }, ref) => (\n <tbody ref={ref} className={cn(className)} {...props}>\n {children}\n </tbody>\n));\n\nTableBody.displayName = \"TableBody\";\n\nexport const TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, children, onClick, selected, variant, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n tableRowVariants({ variant }),\n selected && \"bg-primary/10\",\n onClick && \"cursor-pointer\",\n className,\n )}\n onClick={onClick}\n {...props}\n >\n {children}\n </tr>\n ),\n);\n\nTableRow.displayName = \"TableRow\";\n\nexport const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, children, variant, size, colSpan, rowSpan, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(tableCellVariants({ variant, size }), className)}\n colSpan={colSpan}\n rowSpan={rowSpan}\n {...props}\n >\n {children}\n </td>\n ),\n);\n\nTableCell.displayName = \"TableCell\";\n\nexport const TableHead = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, children, variant, size, colSpan, rowSpan, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n tableCellVariants({ variant, size }),\n \"font-medium\",\n className,\n )}\n colSpan={colSpan}\n rowSpan={rowSpan}\n {...props}\n >\n {children}\n </th>\n ),\n);\n\nTableHead.displayName = \"TableHead\";\n\n// Export variants for external use\nexport { tableVariants, tableHeaderVariants, tableCellVariants };\n"]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import {d}from'./chunk-HCO4XKPM.js';import {b}from'./chunk-HD3TMQPR.js';import {a}from'./chunk-COXN6XBA.js';import {a as a$1}from'./chunk-AC2JBXHQ.js';import t,{useState,useMemo,useCallback}from'react';import {cva}from'class-variance-authority';function se(o){return typeof o=="boolean"?o:typeof o=="string"?o!=="false"&&o!=="":!!o}function ie(o){return o==null?"":String(o)}var Ie=cva("flex flex-wrap items-center gap-2 p-4 bg-muted border-b border-border",{variants:{variant:{default:"bg-muted",compact:"p-2 bg-card",minimal:"p-2 bg-transparent border-0"}},defaultVariants:{variant:"default"}});function ue({data:o,columns:C,searchable:D=true,searchPlaceholder:le="Search...",searchKeys:j,onSearch:P,searchTerm:E,onSearchTermChange:K,filterable:T=false,manualSearch:Y=false,manualFiltering:_=false,manualSorting:q=false,filters:b$1=[],onFilter:V,columnFilters:G,onColumnFiltersChange:H,defaultSortColumn:de,defaultSortDirection:ce="asc",sortColumn:J,sortDirection:ge,onSortChange:Q,defaultPageSize:me=10,showPagination:y=true,currentPage:U,pageSize:W,onPageChange:X,onPageSizeChange:z,totalItems:i,showSearch:Z=true,showFilters:R=true,filterBarClassName:fe,searchBarClassName:pe,rowKey:be="id",emptyText:ye="No data found",...he}){let B=E!==void 0,$=G!==void 0,w=J!==void 0,a=U!==void 0,[ke,xe]=useState(""),m=B?E:ke,ee=useMemo(()=>B?e=>K?.(e):xe,[B,K]),[Ce,ve]=useState({}),c=$?G:Ce,M=useMemo(()=>$?e=>H?.(e):ve,[$,H]),[Se,Te]=useState(de),[we,Ne]=useState(ce),v=w?J:Se,A=w?ge:we,ne=Te,re=Ne,[Fe,De]=useState(1),[Pe,Ve]=useState(me),f=a?U:Fe,s=W!==void 0?W:Pe,p=useMemo(()=>a?e=>X?.(e):De,[a,X]),te=useMemo(()=>z?e=>z(e):Ve,[z]),h=useMemo(()=>{if(Y||!D||!m.trim())return o;let e=m.toLowerCase(),r=j||C.map(n=>n.dataIndex||n.key).filter(Boolean);return o.filter(n=>r.some(u=>{let l=n[u];return l==null?false:String(l).toLowerCase().includes(e)}))},[o,m,D,j,C,Y]),k=useMemo(()=>_||!T||b$1.length===0||Object.keys(c).length===0?h:h.filter(e=>b$1.every(r=>{let n=c[r.key];if(n==null||n==="")return true;if(r.filterFn)return r.filterFn(n,e);let u=e[r.key];switch(r.type){case "text":return String(u).toLowerCase().includes(String(n).toLowerCase());case "number":{let l=Number(n);return Number.isNaN(l)?true:Number(u)===l}case "boolean":return !!u===se(n);case "select":return String(u)===String(n);default:return String(u).includes(String(n))}})),[h,c,T,b$1,_]),d$1=useMemo(()=>{if(q||!v)return k;let e=[...k],r=C.find(n=>n.key===v);return !r||!r.sortable||e.sort((n,u)=>{let l=r.dataIndex?n[r.dataIndex]:n[r.key],S=r.dataIndex?u[r.dataIndex]:u[r.key];if(l==null)return 1;if(S==null)return -1;let N=0;return typeof l=="number"&&typeof S=="number"?N=l-S:N=String(l).localeCompare(String(S)),A==="asc"?N:-N}),e},[k,v,A,C,q]),ze=useMemo(()=>{if(!y||a&&i!==void 0)return d$1;let e=(f-1)*s,r=e+s;return d$1.slice(e,r)},[d$1,f,s,y,a,i]);useMemo(()=>y?Math.ceil(a&&i!==void 0?i/s:d$1.length/s):1,[y,a,i,s,d$1.length]);let Be=useCallback(e=>{ee(e),a||p(1);},[ee,p,a]),I=useCallback((e,r)=>{let n={...c,[e]:r};M(n),a||p(1);},[c,M,p,a]),$e=useCallback((e,r)=>{if(w){Q?.(e.key,r);return}ne(e.key),re(r);},[w,Q,ne,re]),Me=useCallback((e,r)=>{p(e),r!==s&&(te(r),p(1));},[s,p,te]);return t.useEffect(()=>{P&&P(m,h);},[m,h,P]),t.useEffect(()=>{V&&V(c,k);},[c,k,V]),t.createElement("div",{className:"w-full"},(Z||R&&T&&b$1.length>0)&&t.createElement("div",{className:a$1(Ie(),fe)},Z&&D&&t.createElement("div",{className:a$1("flex-1 min-w-[200px]",pe)},t.createElement(b,{type:"text",placeholder:le,value:m,onChange:e=>Be(e.target.value),className:"w-full","aria-label":"Search table"})),R&&T&&b$1.length>0&&t.createElement("div",{className:"flex flex-wrap items-center gap-2"},b$1.map(e=>{let r=c[e.key];return e.type==="boolean"?t.createElement("select",{key:e.key,value:r==null?"":se(r)?"true":"false",onChange:n=>I(e.key,n.target.value===""?void 0:n.target.value==="true"),className:"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary","aria-label":`Filter by ${e.key}`},t.createElement("option",{value:""},"All ",e.key),t.createElement("option",{value:"true"},e.placeholder?`${e.placeholder}: yes`:"Yes"),t.createElement("option",{value:"false"},e.placeholder?`${e.placeholder}: no`:"No")):e.type==="select"&&e.options?t.createElement("select",{key:e.key,value:ie(r),onChange:n=>I(e.key,n.target.value||void 0),className:"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary","aria-label":`Filter by ${e.key}`},t.createElement("option",{value:""},"All ",e.key),e.options.map(n=>t.createElement("option",{key:n.value,value:String(n.value)},n.label))):t.createElement(b,{key:e.key,type:e.type==="number"?"number":"text",placeholder:e.placeholder||`Filter ${e.key}...`,value:ie(r),onChange:n=>I(e.key,n.target.value===""?void 0:e.type==="number"?Number(n.target.value):n.target.value),className:"min-w-[150px]","aria-label":`Filter by ${e.key}`})}),Object.keys(c).length>0&&t.createElement("button",{type:"button",onClick:()=>M({}),className:"px-3 py-2 text-sm text-muted-foreground hover:text-foreground underline","aria-label":"Clear all filters"},"Clear filters"))),t.createElement(d,{...he,data:ze,columns:C,rowKey:be,emptyText:ye,...v&&{sortColumn:v,sortDirection:A},onSort:$e,...y&&{pagination:{current:f,pageSize:s,total:a&&i!==void 0?i:d$1.length,onChange:Me,showSizeChanger:true}}}),y&&(a&&i!==void 0?i>0:d$1.length>0)&&t.createElement("div",{className:"mt-2 px-4 py-2 text-sm text-muted-foreground"},a&&i!==void 0?t.createElement(t.Fragment,null,"Showing ",(f-1)*s+1," to"," ",Math.min(f*s,i)," of ",i," ","results",m&&" (filtered)"):t.createElement(t.Fragment,null,"Showing ",(f-1)*s+1," to"," ",Math.min(f*s,d$1.length)," of"," ",d$1.length," results",m&&` (filtered from ${o.length} total)`)))}ue.displayName="DataTable";var He=a(ue);export{ue as a,He as b};//# sourceMappingURL=chunk-YC6ALHAZ.js.map
3
+ //# sourceMappingURL=chunk-YC6ALHAZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/core/data-table.tsx"],"names":["asBoolean","value","inputValue","filterBarVariants","cva","DataTable","initialData","columns","searchable","searchPlaceholder","searchKeys","onSearch","controlledSearchTerm","onSearchTermChange","filterable","manualSearch","manualFiltering","manualSorting","filters","onFilter","controlledColumnFilters","onColumnFiltersChange","defaultSortColumn","defaultSortDirection","controlledSortColumn","controlledSortDirection","onSortChange","defaultPageSize","showPagination","controlledCurrentPage","controlledPageSize","onPageChange","onPageSizeChange","totalItems","showSearch","showFilters","filterBarClassName","searchBarClassName","rowKey","emptyText","tableProps","isControlledSearch","isControlledFilters","isControlledSort","isControlledPagination","internalSearchTerm","setInternalSearchTerm","useState","searchTerm","setSearchTerm","useMemo","internalColumnFilters","setInternalColumnFilters","columnFilters","setColumnFilters","internalSortColumn","setInternalSortColumn","internalSortDirection","setInternalSortDirection","sortColumn","sortDirection","setSortColumn","setSortDirection","internalCurrentPage","setInternalCurrentPage","internalPageSize","setInternalPageSize","currentPage","pageSize","setCurrentPage","page","setPageSize","size","searchFilteredData","term","keys","col","record","key","filterFilteredData","filter","filterValue","recordValue","wanted","sortedData","sorted","column","a","b","aValue","bValue","comparison","paginatedData","startIndex","endIndex","handleSearch","useCallback","handleFilterChange","newFilters","handleSort","direction","handlePageChange","newPageSize","React","cn","Input","e","option","Table","DataTableMemoized","memo"],"mappings":"qPAoGA,SAASA,EAAAA,CAAUC,EAAyB,CAC1C,OAAI,OAAOA,CAAAA,EAAU,SAAA,CAAkBA,CAAAA,CACnC,OAAOA,CAAAA,EAAU,SAAiBA,CAAAA,GAAU,OAAA,EAAWA,CAAAA,GAAU,EAAA,CAC9D,EAAQA,CACjB,CAGA,SAASC,EAAAA,CAAWD,EAAwB,CAC1C,OAA8BA,CAAAA,EAAU,IAAA,CAAO,EAAA,CAAK,MAAA,CAAOA,CAAK,CAClE,CAGA,IAAME,EAAAA,CAAoBC,GAAAA,CACxB,uEAAA,CACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,QAAS,UAAA,CACT,OAAA,CAAS,aAAA,CACT,OAAA,CAAS,6BACX,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,SACX,CACF,CACF,EAEO,SAASC,EAAAA,CAEd,CACA,IAAA,CAAMC,EACN,OAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,IAAA,CACb,iBAAA,CAAAC,EAAAA,CAAoB,WAAA,CACpB,WAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,UAAA,CAAYC,EACZ,kBAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,MACb,YAAA,CAAAC,CAAAA,CAAe,KAAA,CACf,eAAA,CAAAC,CAAAA,CAAkB,KAAA,CAClB,aAAA,CAAAC,CAAAA,CAAgB,MAChB,OAAA,CAAAC,GAAAA,CAAU,EAAC,CACX,SAAAC,CAAAA,CACA,aAAA,CAAeC,CAAAA,CACf,qBAAA,CAAAC,EACA,iBAAA,CAAAC,EAAAA,CACA,oBAAA,CAAAC,EAAAA,CAAuB,KAAA,CACvB,UAAA,CAAYC,CAAAA,CACZ,aAAA,CAAeC,GACf,YAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,EAAAA,CAAkB,GAClB,cAAA,CAAAC,CAAAA,CAAiB,IAAA,CACjB,WAAA,CAAaC,EACb,QAAA,CAAUC,CAAAA,CACV,YAAA,CAAAC,CAAAA,CACA,gBAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,WAAAC,CAAAA,CAAa,IAAA,CACb,WAAA,CAAAC,CAAAA,CAAc,KACd,kBAAA,CAAAC,EAAAA,CACA,kBAAA,CAAAC,EAAAA,CACA,OAAAC,EAAAA,CAAS,IAAA,CACT,SAAA,CAAAC,EAAAA,CAAY,eAAA,CACZ,GAAGC,EACL,CAAA,CAAsB,CAEpB,IAAMC,CAAAA,CAAqB7B,CAAAA,GAAyB,MAAA,CAC9C8B,EAAsBtB,CAAAA,GAA4B,MAAA,CAClDuB,CAAAA,CAAmBnB,CAAAA,GAAyB,OAC5CoB,CAAAA,CAAyBf,CAAAA,GAA0B,MAAA,CAGnD,CAACgB,EAAAA,CAAoBC,EAAqB,CAAA,CAAIC,QAAAA,CAAS,EAAE,CAAA,CACzDC,CAAAA,CAAaP,CAAAA,CACf7B,CAAAA,CACAiC,GACEI,EAAAA,CAAgBC,OAAAA,CACpB,IACET,CAAAA,CACKxC,GAAkBY,CAAAA,GAAqBZ,CAAK,CAAA,CAC7C6C,EAAAA,CACN,CAACL,CAAAA,CAAoB5B,CAAkB,CACzC,EAGM,CAACsC,EAAAA,CAAuBC,EAAwB,CAAA,CAAIL,SAExD,EAAE,CAAA,CACEM,CAAAA,CAAgBX,EAClBtB,CAAAA,CACA+B,EAAAA,CACEG,CAAAA,CAAmBJ,OAAAA,CACvB,IACER,CAAAA,CACKxB,CAAAA,EAAqCG,CAAAA,GAAwBH,CAAO,CAAA,CACrEkC,EAAAA,CACN,CAACV,CAAAA,CAAqBrB,CAAqB,CAC7C,CAAA,CAGM,CAACkC,EAAAA,CAAoBC,EAAqB,CAAA,CAAIT,QAAAA,CAElDzB,EAAiB,CAAA,CACb,CAACmC,EAAAA,CAAuBC,EAAwB,CAAA,CAAIX,SAExDxB,EAAoB,CAAA,CAChBoC,CAAAA,CAAahB,CAAAA,CACfnB,EACA+B,EAAAA,CACEK,CAAAA,CAAgBjB,CAAAA,CAClBlB,EAAAA,CACAgC,GAIEI,EAAAA,CAAgBL,EAAAA,CAChBM,EAAAA,CAAmBJ,EAAAA,CAGnB,CAACK,EAAAA,CAAqBC,EAAsB,CAAA,CAAIjB,SAAS,CAAC,CAAA,CAC1D,CAACkB,EAAAA,CAAkBC,EAAmB,CAAA,CAAInB,QAAAA,CAASpB,EAAe,CAAA,CAClEwC,EAAcvB,CAAAA,CAChBf,CAAAA,CACAkC,EAAAA,CACEK,CAAAA,CACJtC,CAAAA,GAAuB,MAAA,CAAYA,CAAAA,CAAqBmC,EAAAA,CACpDI,EAAiBnB,OAAAA,CACrB,IACEN,CAAAA,CACK0B,CAAAA,EAAiBvC,IAAeuC,CAAI,CAAA,CACrCN,EAAAA,CACN,CAACpB,EAAwBb,CAAY,CACvC,CAAA,CACMwC,EAAAA,CAAcrB,QAClB,IACElB,CAAAA,CACKwC,CAAAA,EAAiBxC,CAAAA,CAAiBwC,CAAI,CAAA,CACvCN,EAAAA,CACN,CAAClC,CAAgB,CACnB,CAAA,CAGMyC,CAAAA,CAAqBvB,OAAAA,CAAQ,IAAM,CAIvC,GADInC,CAAAA,EACA,CAACP,CAAAA,EAAc,CAACwC,CAAAA,CAAW,IAAA,EAAK,CAClC,OAAO1C,CAAAA,CAGT,IAAMoE,CAAAA,CAAO1B,CAAAA,CAAW,aAAY,CAC9B2B,CAAAA,CACJjE,CAAAA,EACAH,CAAAA,CAAQ,IAAKqE,CAAAA,EAAQA,CAAAA,CAAI,SAAA,EAAaA,CAAAA,CAAI,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,EAE/D,OAAOtE,CAAAA,CAAY,MAAA,CAAQuE,CAAAA,EAClBF,EAAK,IAAA,CAAMG,CAAAA,EAAQ,CACxB,IAAM7E,EAEC4E,CAAAA,CAAmCC,CAAG,CAAA,CAG7C,OAAI7E,CAAAA,EAAU,IAAA,CAAoC,KAAA,CAE3C,MAAA,CAAOA,CAAK,CAAA,CAAE,WAAA,EAAY,CAAE,QAAA,CAASyE,CAAI,CAClD,CAAC,CACF,CACH,EAAG,CAACpE,CAAAA,CAAa0C,CAAAA,CAAYxC,CAAAA,CAAYE,CAAAA,CAAYH,CAAAA,CAASQ,CAAY,CAAC,EAGrEgE,CAAAA,CAAqB7B,OAAAA,CAAQ,IAC7BlC,CAAAA,EAEF,CAACF,CAAAA,EACDI,GAAAA,CAAQ,MAAA,GAAW,CAAA,EACnB,OAAO,IAAA,CAAKmC,CAAa,CAAA,CAAE,MAAA,GAAW,CAAA,CAE/BoB,CAAAA,CAGFA,CAAAA,CAAmB,MAAA,CAAQI,GACzB3D,GAAAA,CAAQ,KAAA,CAAO8D,CAAAA,EAAW,CAC/B,IAAMC,CAAAA,CAAc5B,CAAAA,CAAc2B,CAAAA,CAAO,GAAG,EAG5C,GAEEC,CAAAA,EAAgB,IAAA,EAChBA,CAAAA,GAAgB,EAAA,CAEhB,OAAO,KAAA,CAIT,GAAID,EAAO,QAAA,CACT,OAAOA,CAAAA,CAAO,QAAA,CAASC,EAAaJ,CAAM,CAAA,CAI5C,IAAMK,CAAAA,CAAeL,EAAmCG,CAAAA,CAAO,GAAG,CAAA,CAElE,OAAQA,CAAAA,CAAO,IAAA,EACb,KAAK,OACH,OAAO,MAAA,CAAOE,CAAW,CAAA,CACtB,aAAY,CACZ,QAAA,CAAS,MAAA,CAAOD,CAAW,EAAE,WAAA,EAAa,CAAA,CAC/C,KAAK,SAAU,CAIb,IAAME,CAAAA,CAAS,MAAA,CAAOF,CAAW,CAAA,CACjC,OAAI,MAAA,CAAO,KAAA,CAAME,CAAM,CAAA,CAAU,IAAA,CAC1B,MAAA,CAAOD,CAAW,IAAMC,CACjC,CACA,KAAK,SAAA,CAKH,OAAO,CAAA,CAAQD,CAAAA,GAAiBlF,EAAAA,CAAUiF,CAAW,CAAA,CACvD,KAAK,QAAA,CACH,OAAO,OAAOC,CAAW,CAAA,GAAM,MAAA,CAAOD,CAAW,EACnD,QACE,OAAO,MAAA,CAAOC,CAAW,CAAA,CAAE,QAAA,CAAS,MAAA,CAAOD,CAAW,CAAC,CAC3D,CACF,CAAC,CACF,EACA,CAACR,CAAAA,CAAoBpB,CAAAA,CAAevC,CAAAA,CAAYI,IAASF,CAAe,CAAC,CAAA,CAGtEoE,GAAAA,CAAalC,OAAAA,CAAQ,IAAM,CAI/B,GADIjC,GACA,CAAC0C,CAAAA,CACH,OAAOoB,CAAAA,CAGT,IAAMM,CAAAA,CAAS,CAAC,GAAGN,CAAkB,EAC/BO,CAAAA,CAAS/E,CAAAA,CAAQ,IAAA,CAAMqE,CAAAA,EAAQA,CAAAA,CAAI,GAAA,GAAQjB,CAAU,CAAA,CAE3D,OAAI,CAAC2B,CAAAA,EAAU,CAACA,CAAAA,CAAO,UAIvBD,CAAAA,CAAO,IAAA,CAAK,CAACE,CAAAA,CAAGC,IAAM,CACpB,IAAMC,CAAAA,CAASH,CAAAA,CAAO,SAAA,CAClBC,CAAAA,CAAED,CAAAA,CAAO,SAAS,EACjBC,CAAAA,CAA8BD,CAAAA,CAAO,GAAG,CAAA,CACvCI,EAASJ,CAAAA,CAAO,SAAA,CAClBE,CAAAA,CAAEF,CAAAA,CAAO,SAAS,CAAA,CACjBE,CAAAA,CAA8BF,CAAAA,CAAO,GAAG,CAAA,CAG7C,GAAIG,CAAAA,EAAW,IAAA,CAA8B,OAAO,CAAA,CACpD,GAAIC,CAAAA,EAAW,IAAA,CAA8B,OAAO,GAAA,CAGpD,IAAIC,CAAAA,CAAa,CAAA,CACjB,OAAI,OAAOF,CAAAA,EAAW,QAAA,EAAY,OAAOC,CAAAA,EAAW,QAAA,CAClDC,CAAAA,CAAaF,CAAAA,CAASC,EAEtBC,CAAAA,CAAa,MAAA,CAAOF,CAAM,CAAA,CAAE,cAAc,MAAA,CAAOC,CAAM,CAAC,CAAA,CAGnD9B,IAAkB,KAAA,CAAQ+B,CAAAA,CAAa,CAACA,CACjD,CAAC,CAAA,CAEMN,CACT,CAAA,CAAG,CAACN,EAAoBpB,CAAAA,CAAYC,CAAAA,CAAerD,CAAAA,CAASU,CAAa,CAAC,CAAA,CAKpE2E,EAAAA,CAAgB1C,OAAAA,CAAQ,IAAM,CAMlC,GALI,CAACtB,CAAAA,EAKDgB,CAAAA,EAA0BX,CAAAA,GAAe,MAAA,CAC3C,OAAOmD,GAAAA,CAIT,IAAMS,CAAAA,CAAAA,CAAc1B,CAAAA,CAAc,CAAA,EAAKC,CAAAA,CACjC0B,EAAWD,CAAAA,CAAazB,CAAAA,CAE9B,OAAOgB,GAAAA,CAAW,MAAMS,CAAAA,CAAYC,CAAQ,CAC9C,CAAA,CAAG,CACDV,GAAAA,CACAjB,CAAAA,CACAC,CAAAA,CACAxC,EACAgB,CAAAA,CACAX,CACF,CAAC,CAAA,CAKmBiB,OAAAA,CAAQ,IACrBtB,CAAAA,CAEI,IAAA,CAAK,KADVgB,CAAAA,EAA0BX,CAAAA,GAAe,MAAA,CAC1BA,CAAAA,CAAamC,CAAAA,CAEfgB,GAAAA,CAAW,MAAA,CAAShB,CAFG,EAFZ,CAAA,CAK3B,CACDxC,CAAAA,CACAgB,CAAAA,CACAX,EACAmC,CAAAA,CACAgB,GAAAA,CAAW,MACb,CAAC,MAGKW,EAAAA,CAAeC,WAAAA,CAClB/F,CAAAA,EAAkB,CACjBgD,EAAAA,CAAchD,CAAK,CAAA,CACd2C,CAAAA,EACHyB,EAAe,CAAC,EAEpB,CAAA,CACA,CAACpB,GAAeoB,CAAAA,CAAgBzB,CAAsB,CACxD,CAAA,CAEMqD,EAAqBD,WAAAA,CACzB,CAAClB,CAAAA,CAAa7E,CAAAA,GAAmB,CAC/B,IAAMiG,CAAAA,CAAa,CACjB,GAAG7C,CAAAA,CACH,CAACyB,CAAG,EAAG7E,CACT,CAAA,CACAqD,CAAAA,CAAiB4C,CAAU,CAAA,CACtBtD,GACHyB,CAAAA,CAAe,CAAC,EAEpB,CAAA,CACA,CAAChB,CAAAA,CAAeC,CAAAA,CAAkBe,CAAAA,CAAgBzB,CAAsB,CAC1E,CAAA,CAeMuD,EAAAA,CAAaH,WAAAA,CACjB,CAACV,CAAAA,CAAwBc,CAAAA,GAA8B,CACrD,GAAIzD,EAAkB,CACpBjB,CAAAA,GAAe4D,CAAAA,CAAO,GAAA,CAAKc,CAAS,CAAA,CACpC,MACF,CACAvC,GAAcyB,CAAAA,CAAO,GAAG,CAAA,CACxBxB,EAAAA,CAAiBsC,CAAS,EAC5B,CAAA,CACA,CAACzD,CAAAA,CAAkBjB,EAAcmC,EAAAA,CAAeC,EAAgB,CAClE,CAAA,CAEMuC,GAAmBL,WAAAA,CACvB,CAAC1B,CAAAA,CAAcgC,CAAAA,GAAwB,CACrCjC,CAAAA,CAAeC,CAAI,CAAA,CACfgC,CAAAA,GAAgBlC,IAClBG,EAAAA,CAAY+B,CAAW,CAAA,CACvBjC,CAAAA,CAAe,CAAC,CAAA,EAEpB,CAAA,CACA,CAACD,CAAAA,CAAUC,CAAAA,CAAgBE,EAAW,CACxC,EAGA,OAAAgC,CAAAA,CAAM,SAAA,CAAU,IAAM,CAChB5F,GACFA,CAAAA,CAASqC,CAAAA,CAAYyB,CAAkB,EAE3C,EAAG,CAACzB,CAAAA,CAAYyB,CAAAA,CAAoB9D,CAAQ,CAAC,CAAA,CAE7C4F,CAAAA,CAAM,SAAA,CAAU,IAAM,CAChBpF,CAAAA,EACFA,CAAAA,CAASkC,CAAAA,CAAe0B,CAAkB,EAE9C,CAAA,CAAG,CAAC1B,CAAAA,CAAe0B,EAAoB5D,CAAQ,CAAC,CAAA,CAG9CoF,CAAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,QAAA,CAAA,CAAA,CAEXrE,GAAeC,CAAAA,EAAerB,CAAAA,EAAcI,GAAAA,CAAQ,MAAA,CAAS,IAC7DqF,CAAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,IAAGrG,EAAAA,EAAkB,CAAGiC,EAAkB,CAAA,CAAA,CAEvDF,CAAAA,EAAc1B,CAAAA,EACb+F,CAAAA,CAAA,aAAA,CAAC,OAAI,SAAA,CAAWC,GAAAA,CAAG,sBAAA,CAAwBnE,EAAkB,GAC3DkE,CAAAA,CAAA,aAAA,CAACE,CAAAA,CAAA,CACC,KAAK,MAAA,CACL,WAAA,CAAahG,EAAAA,CACb,KAAA,CAAOuC,CAAAA,CACP,QAAA,CAAW,CAAA,EAAM+C,EAAAA,CAAa,EAAE,MAAA,CAAO,KAAK,CAAA,CAC5C,SAAA,CAAU,SACV,YAAA,CAAW,cAAA,CACb,CACF,CAAA,CAID5D,GAAerB,CAAAA,EAAcI,GAAAA,CAAQ,MAAA,CAAS,CAAA,EAC7CqF,CAAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qCACZrF,GAAAA,CAAQ,GAAA,CAAK8D,CAAAA,EAAW,CACvB,IAAMC,CAAAA,CAAc5B,CAAAA,CAAc2B,CAAAA,CAAO,GAAG,EAK5C,OAAIA,CAAAA,CAAO,IAAA,GAAS,SAAA,CAEhBuB,CAAAA,CAAA,aAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKvB,EAAO,GAAA,CACZ,KAAA,CAC+BC,CAAAA,EAAgB,IAAA,CACzC,GACAjF,EAAAA,CAAUiF,CAAW,CAAA,CACnB,MAAA,CACA,QAER,QAAA,CAAWyB,CAAAA,EACTT,CAAAA,CACEjB,CAAAA,CAAO,IACP0B,CAAAA,CAAE,MAAA,CAAO,KAAA,GAAU,EAAA,CACf,OACAA,CAAAA,CAAE,MAAA,CAAO,KAAA,GAAU,MACzB,EAEF,SAAA,CAAU,uHAAA,CACV,YAAA,CAAY,CAAA,UAAA,EAAa1B,EAAO,GAAG,CAAA,CAAA,CAAA,CAEnCuB,CAAAA,CAAA,aAAA,CAAC,QAAA,CAAA,CAAO,KAAA,CAAM,EAAA,CAAA,CAAG,MAAA,CAAKvB,EAAO,GAAI,CAAA,CACjCuB,CAAAA,CAAA,aAAA,CAAC,UAAO,KAAA,CAAM,MAAA,CAAA,CACXvB,CAAAA,CAAO,WAAA,CACJ,GAAGA,CAAAA,CAAO,WAAW,CAAA,KAAA,CAAA,CACrB,KACN,CAAA,CACAuB,CAAAA,CAAA,aAAA,CAAC,QAAA,CAAA,CAAO,MAAM,OAAA,CAAA,CACXvB,CAAAA,CAAO,WAAA,CACJ,CAAA,EAAGA,EAAO,WAAW,CAAA,IAAA,CAAA,CACrB,IACN,CACF,EAIAA,CAAAA,CAAO,IAAA,GAAS,QAAA,EAAYA,CAAAA,CAAO,OAAA,CAEnCuB,CAAAA,CAAA,aAAA,CAAC,QAAA,CAAA,CACC,IAAKvB,CAAAA,CAAO,GAAA,CACZ,KAAA,CAAO9E,EAAAA,CAAW+E,CAAW,CAAA,CAC7B,QAAA,CAAWyB,CAAAA,EACTT,CAAAA,CACEjB,EAAO,GAAA,CACP0B,CAAAA,CAAE,MAAA,CAAO,KAAA,EAAS,MACpB,CAAA,CAEF,SAAA,CAAU,uHAAA,CACV,aAAY,CAAA,UAAA,EAAa1B,CAAAA,CAAO,GAAG,CAAA,CAAA,CAAA,CAEnCuB,EAAA,aAAA,CAAC,QAAA,CAAA,CAAO,KAAA,CAAM,EAAA,CAAA,CAAG,OAAKvB,CAAAA,CAAO,GAAI,CAAA,CAChCA,CAAAA,CAAO,OAAA,CAAQ,GAAA,CAAK2B,CAAAA,EACnBJ,CAAAA,CAAA,cAAC,QAAA,CAAA,CAAO,GAAA,CAAKI,CAAAA,CAAO,KAAA,CAAO,MAAO,MAAA,CAAOA,CAAAA,CAAO,KAAK,CAAA,CAAA,CAClDA,EAAO,KACV,CACD,CACH,CAAA,CAKFJ,CAAAA,CAAA,aAAA,CAACE,CAAAA,CAAA,CACC,IAAKzB,CAAAA,CAAO,GAAA,CACZ,IAAA,CAAMA,CAAAA,CAAO,OAAS,QAAA,CAAW,QAAA,CAAW,MAAA,CAC5C,WAAA,CACEA,EAAO,WAAA,EAAe,CAAA,OAAA,EAAUA,CAAAA,CAAO,GAAG,CAAA,GAAA,CAAA,CAK5C,KAAA,CAAO9E,EAAAA,CAAW+E,CAAW,EAC7B,QAAA,CAAWyB,CAAAA,EACTT,CAAAA,CACEjB,CAAAA,CAAO,IAGP0B,CAAAA,CAAE,MAAA,CAAO,KAAA,GAAU,EAAA,CACf,OACA1B,CAAAA,CAAO,IAAA,GAAS,QAAA,CACd,MAAA,CAAO0B,EAAE,MAAA,CAAO,KAAK,CAAA,CACrBA,CAAAA,CAAE,OAAO,KACjB,CAAA,CAEF,SAAA,CAAU,eAAA,CACV,aAAY,CAAA,UAAA,EAAa1B,CAAAA,CAAO,GAAG,CAAA,CAAA,CACrC,CAEJ,CAAC,CAAA,CAGA,MAAA,CAAO,IAAA,CAAK3B,CAAa,CAAA,CAAE,MAAA,CAAS,CAAA,EACnCkD,EAAA,aAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,QAAS,IAAMjD,CAAAA,CAAiB,EAAE,EAClC,SAAA,CAAU,yEAAA,CACV,YAAA,CAAW,mBAAA,CAAA,CACZ,eAED,CAEJ,CAEJ,CAAA,CAIFiD,EAAA,aAAA,CAACK,CAAAA,CAAA,CACE,GAAGpE,GACJ,IAAA,CAAMoD,EAAAA,CACN,OAAA,CAASrF,CAAAA,CACT,OAAQ+B,EAAAA,CACR,SAAA,CAAWC,EAAAA,CACV,GAAIoB,CAAAA,EAAc,CACjB,UAAA,CAAAA,CAAAA,CACA,cAAAC,CACF,CAAA,CACA,MAAA,CAAQuC,EAAAA,CACP,GAAIvE,CAAAA,EAAkB,CACrB,UAAA,CAAY,CACV,QAASuC,CAAAA,CACT,QAAA,CAAUC,CAAAA,CACV,KAAA,CACExB,CAAAA,EAA0BX,CAAAA,GAAe,MAAA,CACrCA,CAAAA,CACAmD,IAAW,MAAA,CACjB,QAAA,CAAUiB,EAAAA,CACV,eAAA,CAAiB,IACnB,CACF,CAAA,CACF,CAAA,CAGCzE,CAAAA,GACEgB,GAA0BX,CAAAA,GAAe,MAAA,CACtCA,CAAAA,CAAa,CAAA,CACbmD,GAAAA,CAAW,MAAA,CAAS,CAAA,CAAA,EACtBmB,CAAAA,CAAA,cAAC,KAAA,CAAA,CAAI,SAAA,CAAU,8CAAA,CAAA,CACZ3D,CAAAA,EAA0BX,IAAe,MAAA,CACxCsE,CAAAA,CAAA,aAAA,CAAAA,CAAAA,CAAA,cAAE,UAAA,CAAA,CACUpC,CAAAA,CAAc,CAAA,EAAKC,CAAAA,CAAW,CAAA,CAAE,KAAA,CAAI,GAAA,CAC7C,IAAA,CAAK,IAAID,CAAAA,CAAcC,CAAAA,CAAUnC,CAAU,CAAA,CAAE,OAAKA,CAAAA,CAAY,GAAA,CAAI,SAAA,CAElEe,CAAAA,EAAc,aACjB,CAAA,CAEAuD,CAAAA,CAAA,aAAA,CAAAA,CAAAA,CAAA,QAAA,CAAA,IAAA,CAAE,UAAA,CAAA,CACUpC,CAAAA,CAAc,CAAA,EAAKC,EAAW,CAAA,CAAE,KAAA,CAAI,GAAA,CAC7C,IAAA,CAAK,IAAID,CAAAA,CAAcC,CAAAA,CAAUgB,GAAAA,CAAW,MAAM,EAAE,KAAA,CAAI,GAAA,CACxDA,GAAAA,CAAW,MAAA,CAAO,WAClBpC,CAAAA,EAAc,CAAA,gBAAA,EAAmB1C,CAAAA,CAAY,MAAM,SACtD,CAEJ,CAEN,CAEJ,CAEAD,GAAU,WAAA,CAAc,WAAA,CAIjB,IAAMwG,EAAAA,CAAoBC,EAAKzG,EAAS","file":"chunk-YC6ALHAZ.js","sourcesContent":["import React, { useState, useMemo, useCallback } from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { memo } from \"../../lib/memo\";\nimport { Table, TableColumn, TableProps } from \"./table\";\nimport { Input } from \"./input\";\n\n// Filter types\nexport type FilterType = \"text\" | \"select\" | \"number\" | \"date\" | \"boolean\";\n\nexport interface ColumnFilter<T = Record<string, unknown>> {\n key: string;\n type: FilterType;\n options?: Array<{ label: string; value: string | number }>;\n placeholder?: string;\n filterFn?: (value: unknown, record: T) => boolean;\n}\n\nexport interface DataTableProps<T = Record<string, unknown>> extends Omit<\n TableProps<T>,\n \"data\" | \"onSort\" | \"sortColumn\" | \"sortDirection\"\n> {\n data: T[];\n columns: TableColumn<T>[];\n\n // Search\n searchable?: boolean;\n searchPlaceholder?: string;\n searchKeys?: Array<keyof T | string>;\n onSearch?: (searchTerm: string, filteredData: T[]) => void;\n\n // Controlled search (for server-side filtering)\n searchTerm?: string;\n onSearchTermChange?: (searchTerm: string) => void;\n\n // Filtering\n filterable?: boolean;\n filters?: ColumnFilter<T>[];\n onFilter?: (filters: Record<string, unknown>, filteredData: T[]) => void;\n\n // Controlled filters (for server-side filtering)\n columnFilters?: Record<string, unknown>;\n onColumnFiltersChange?: (filters: Record<string, unknown>) => void;\n\n // Sorting (enhanced)\n defaultSortColumn?: string;\n defaultSortDirection?: \"asc\" | \"desc\";\n\n // Controlled sorting (for server-side sorting)\n sortColumn?: string;\n sortDirection?: \"asc\" | \"desc\";\n onSortChange?: (column: string, direction: \"asc\" | \"desc\") => void;\n\n // Pagination (enhanced)\n defaultPageSize?: number;\n showPagination?: boolean;\n\n // Controlled pagination (for server-side pagination)\n currentPage?: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n totalItems?: number; // Required for server-side pagination\n\n /**\n * Who does the work.\n *\n * Passing `searchTerm`, `columnFilters` or `sortColumn` makes DataTable\n * controlled - it stops owning that piece of state - but it kept filtering and\n * sorting the rows you gave it anyway. For a server-backed table that is\n * actively wrong: a server searching without accent distinctions returns\n * `{ name: \"José\" }` for the query `jose`, and the local substring filter then\n * threw the row away while `totalItems` still counted it. Controlled sorting\n * likewise reordered the page the server had already ordered.\n *\n * Controlled state and processing ownership are separate questions now. Set\n * these when the rows arriving in `data` are already searched, filtered or\n * sorted; the callbacks still fire so you know what the user asked for.\n *\n * Pagination has always worked this way, under a different name: it is manual\n * when `currentPage` and `totalItems` are both given.\n */\n manualSearch?: boolean;\n manualFiltering?: boolean;\n manualSorting?: boolean;\n\n // UI\n showSearch?: boolean;\n showFilters?: boolean;\n filterBarClassName?: string;\n searchBarClassName?: string;\n}\n\n/**\n * What a boolean filter value means, from a control or from a consumer.\n *\n * The select below emits real booleans, but a controlled `columnFilters` may hold\n * whatever the consumer put there, and \"false\" arriving as a string used to mean\n * true.\n */\nfunction asBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value !== \"false\" && value !== \"\";\n return Boolean(value);\n}\n\n/** Empty for a value that is absent, and \"0\" or \"false\" when that is the value. */\nfunction inputValue(value: unknown): string {\n return value === undefined || value === null ? \"\" : String(value);\n}\n\n// Filter bar component\nconst filterBarVariants = cva(\n \"flex flex-wrap items-center gap-2 p-4 bg-muted border-b border-border\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n compact: \"p-2 bg-card\",\n minimal: \"p-2 bg-transparent border-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport function DataTable<\n T extends Record<string, unknown> = Record<string, unknown>,\n>({\n data: initialData,\n columns,\n searchable = true,\n searchPlaceholder = \"Search...\",\n searchKeys,\n onSearch,\n searchTerm: controlledSearchTerm,\n onSearchTermChange,\n filterable = false,\n manualSearch = false,\n manualFiltering = false,\n manualSorting = false,\n filters = [],\n onFilter,\n columnFilters: controlledColumnFilters,\n onColumnFiltersChange,\n defaultSortColumn,\n defaultSortDirection = \"asc\",\n sortColumn: controlledSortColumn,\n sortDirection: controlledSortDirection,\n onSortChange,\n defaultPageSize = 10,\n showPagination = true,\n currentPage: controlledCurrentPage,\n pageSize: controlledPageSize,\n onPageChange,\n onPageSizeChange,\n totalItems,\n showSearch = true,\n showFilters = true,\n filterBarClassName,\n searchBarClassName,\n rowKey = \"id\",\n emptyText = \"No data found\",\n ...tableProps\n}: DataTableProps<T>) {\n // Determine if component is in controlled mode\n const isControlledSearch = controlledSearchTerm !== undefined;\n const isControlledFilters = controlledColumnFilters !== undefined;\n const isControlledSort = controlledSortColumn !== undefined;\n const isControlledPagination = controlledCurrentPage !== undefined;\n\n // Search state (controlled or uncontrolled)\n const [internalSearchTerm, setInternalSearchTerm] = useState(\"\");\n const searchTerm = isControlledSearch\n ? controlledSearchTerm\n : internalSearchTerm;\n const setSearchTerm = useMemo(\n () =>\n isControlledSearch\n ? (value: string) => onSearchTermChange?.(value)\n : setInternalSearchTerm,\n [isControlledSearch, onSearchTermChange],\n );\n\n // Filter state (controlled or uncontrolled)\n const [internalColumnFilters, setInternalColumnFilters] = useState<\n Record<string, unknown>\n >({});\n const columnFilters = isControlledFilters\n ? controlledColumnFilters\n : internalColumnFilters;\n const setColumnFilters = useMemo(\n () =>\n isControlledFilters\n ? (filters: Record<string, unknown>) => onColumnFiltersChange?.(filters)\n : setInternalColumnFilters,\n [isControlledFilters, onColumnFiltersChange],\n );\n\n // Sort state (controlled or uncontrolled)\n const [internalSortColumn, setInternalSortColumn] = useState<\n string | undefined\n >(defaultSortColumn);\n const [internalSortDirection, setInternalSortDirection] = useState<\n \"asc\" | \"desc\"\n >(defaultSortDirection);\n const sortColumn = isControlledSort\n ? controlledSortColumn\n : internalSortColumn;\n const sortDirection = isControlledSort\n ? controlledSortDirection\n : internalSortDirection;\n // Only the uncontrolled path uses these. A controlled table goes through\n // `handleSort`, which emits both values at once - see the comment there for\n // what the controlled versions of these used to do.\n const setSortColumn = setInternalSortColumn;\n const setSortDirection = setInternalSortDirection;\n\n // Pagination state (controlled or uncontrolled)\n const [internalCurrentPage, setInternalCurrentPage] = useState(1);\n const [internalPageSize, setInternalPageSize] = useState(defaultPageSize);\n const currentPage = isControlledPagination\n ? controlledCurrentPage\n : internalCurrentPage;\n const pageSize =\n controlledPageSize !== undefined ? controlledPageSize : internalPageSize;\n const setCurrentPage = useMemo(\n () =>\n isControlledPagination\n ? (page: number) => onPageChange?.(page)\n : setInternalCurrentPage,\n [isControlledPagination, onPageChange],\n );\n const setPageSize = useMemo(\n () =>\n onPageSizeChange\n ? (size: number) => onPageSizeChange(size)\n : setInternalPageSize,\n [onPageSizeChange],\n );\n\n // Apply search\n const searchFilteredData = useMemo(() => {\n // The rows already are the search result; searching them again would only\n // remove what the server decided to include.\n if (manualSearch) return initialData;\n if (!searchable || !searchTerm.trim()) {\n return initialData;\n }\n\n const term = searchTerm.toLowerCase();\n const keys =\n searchKeys ||\n columns.map((col) => col.dataIndex || col.key).filter(Boolean);\n\n return initialData.filter((record) => {\n return keys.some((key) => {\n const value =\n typeof key === \"string\"\n ? (record as Record<string, unknown>)[key]\n : record[key as keyof T];\n\n if (value === null || value === undefined) return false;\n\n return String(value).toLowerCase().includes(term);\n });\n });\n }, [initialData, searchTerm, searchable, searchKeys, columns, manualSearch]);\n\n // Apply column filters\n const filterFilteredData = useMemo(() => {\n if (manualFiltering) return searchFilteredData;\n if (\n !filterable ||\n filters.length === 0 ||\n Object.keys(columnFilters).length === 0\n ) {\n return searchFilteredData;\n }\n\n return searchFilteredData.filter((record) => {\n return filters.every((filter) => {\n const filterValue = columnFilters[filter.key];\n\n // Skip if no filter value\n if (\n filterValue === undefined ||\n filterValue === null ||\n filterValue === \"\"\n ) {\n return true;\n }\n\n // Use custom filter function if provided\n if (filter.filterFn) {\n return filter.filterFn(filterValue, record);\n }\n\n // Default filtering logic\n const recordValue = (record as Record<string, unknown>)[filter.key];\n\n switch (filter.type) {\n case \"text\":\n return String(recordValue)\n .toLowerCase()\n .includes(String(filterValue).toLowerCase());\n case \"number\": {\n // A filter value that is not a number matches nothing rather than\n // matching zero. `Number(\"\")` is 0, which is how a cleared input used\n // to leave only the zero-valued rows on screen.\n const wanted = Number(filterValue);\n if (Number.isNaN(wanted)) return true;\n return Number(recordValue) === wanted;\n }\n case \"boolean\":\n // Not `Boolean(filterValue)`. The control used to be a text input, so\n // typing \"false\" gave the string \"false\", and `Boolean(\"false\")` is\n // true - the filter selected exactly the records it was asked to\n // exclude.\n return Boolean(recordValue) === asBoolean(filterValue);\n case \"select\":\n return String(recordValue) === String(filterValue);\n default:\n return String(recordValue).includes(String(filterValue));\n }\n });\n });\n }, [searchFilteredData, columnFilters, filterable, filters, manualFiltering]);\n\n // Apply sorting\n const sortedData = useMemo(() => {\n // Keep the order the server sent. Re-sorting a page it has already ordered\n // produces a different order, not the same one.\n if (manualSorting) return filterFilteredData;\n if (!sortColumn) {\n return filterFilteredData;\n }\n\n const sorted = [...filterFilteredData];\n const column = columns.find((col) => col.key === sortColumn);\n\n if (!column || !column.sortable) {\n return sorted;\n }\n\n sorted.sort((a, b) => {\n const aValue = column.dataIndex\n ? a[column.dataIndex]\n : (a as Record<string, unknown>)[column.key];\n const bValue = column.dataIndex\n ? b[column.dataIndex]\n : (b as Record<string, unknown>)[column.key];\n\n // Handle null/undefined\n if (aValue === null || aValue === undefined) return 1;\n if (bValue === null || bValue === undefined) return -1;\n\n // Compare values\n let comparison = 0;\n if (typeof aValue === \"number\" && typeof bValue === \"number\") {\n comparison = aValue - bValue;\n } else {\n comparison = String(aValue).localeCompare(String(bValue));\n }\n\n return sortDirection === \"asc\" ? comparison : -comparison;\n });\n\n return sorted;\n }, [filterFilteredData, sortColumn, sortDirection, columns, manualSorting]);\n\n // Apply pagination\n // In controlled mode with server-side pagination, use provided data directly\n // In uncontrolled mode, slice the data client-side\n const paginatedData = useMemo(() => {\n if (!showPagination) {\n return sortedData;\n }\n\n // If in controlled pagination mode with totalItems, assume data is already paginated\n if (isControlledPagination && totalItems !== undefined) {\n return sortedData; // Data is already paginated server-side\n }\n\n // Client-side pagination\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n\n return sortedData.slice(startIndex, endIndex);\n }, [\n sortedData,\n currentPage,\n pageSize,\n showPagination,\n isControlledPagination,\n totalItems,\n ]);\n\n // Calculate total pages for pagination display\n // Note: Currently not used but kept for future pagination UI enhancements\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _totalPages = useMemo(() => {\n if (!showPagination) return 1;\n if (isControlledPagination && totalItems !== undefined) {\n return Math.ceil(totalItems / pageSize);\n }\n return Math.ceil(sortedData.length / pageSize);\n }, [\n showPagination,\n isControlledPagination,\n totalItems,\n pageSize,\n sortedData.length,\n ]);\n\n // Callbacks\n const handleSearch = useCallback(\n (value: string) => {\n setSearchTerm(value);\n if (!isControlledPagination) {\n setCurrentPage(1); // Reset to first page on search (only in uncontrolled mode)\n }\n },\n [setSearchTerm, setCurrentPage, isControlledPagination],\n );\n\n const handleFilterChange = useCallback(\n (key: string, value: unknown) => {\n const newFilters = {\n ...columnFilters,\n [key]: value,\n };\n setColumnFilters(newFilters);\n if (!isControlledPagination) {\n setCurrentPage(1); // Reset to first page on filter (only in uncontrolled mode)\n }\n },\n [columnFilters, setColumnFilters, setCurrentPage, isControlledPagination],\n );\n\n /**\n * One callback per click, carrying both new values.\n *\n * The controlled setters each emitted `onSortChange` on their own, and each one\n * read the *other* value from the render it was created in. Clicking \"Age\" on a\n * table sorted by name descending produced `(\"age\", \"desc\")` immediately\n * followed by `(\"name\", \"asc\")` - two requests, the second of which put the old\n * column back. A consumer writing both values from the callback, which is what\n * the docs show, ended up where it started.\n *\n * It also never fired at all for a controlled table that started unsorted,\n * because the setter guarded on an existing column and direction.\n */\n const handleSort = useCallback(\n (column: TableColumn<T>, direction: \"asc\" | \"desc\") => {\n if (isControlledSort) {\n onSortChange?.(column.key, direction);\n return;\n }\n setSortColumn(column.key);\n setSortDirection(direction);\n },\n [isControlledSort, onSortChange, setSortColumn, setSortDirection],\n );\n\n const handlePageChange = useCallback(\n (page: number, newPageSize: number) => {\n setCurrentPage(page);\n if (newPageSize !== pageSize) {\n setPageSize(newPageSize);\n setCurrentPage(1); // Reset to first page when page size changes\n }\n },\n [pageSize, setCurrentPage, setPageSize],\n );\n\n // Notify callbacks\n React.useEffect(() => {\n if (onSearch) {\n onSearch(searchTerm, searchFilteredData);\n }\n }, [searchTerm, searchFilteredData, onSearch]);\n\n React.useEffect(() => {\n if (onFilter) {\n onFilter(columnFilters, filterFilteredData);\n }\n }, [columnFilters, filterFilteredData, onFilter]);\n\n return (\n <div className=\"w-full\">\n {/* Search and Filter Bar */}\n {(showSearch || (showFilters && filterable && filters.length > 0)) && (\n <div className={cn(filterBarVariants(), filterBarClassName)}>\n {/* Search */}\n {showSearch && searchable && (\n <div className={cn(\"flex-1 min-w-[200px]\", searchBarClassName)}>\n <Input\n type=\"text\"\n placeholder={searchPlaceholder}\n value={searchTerm}\n onChange={(e) => handleSearch(e.target.value)}\n className=\"w-full\"\n aria-label=\"Search table\"\n />\n </div>\n )}\n\n {/* Column Filters */}\n {showFilters && filterable && filters.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {filters.map((filter) => {\n const filterValue = columnFilters[filter.key];\n\n // A boolean needs three states - either value, or no filter -\n // which a text box cannot express. It used to be one, and typing\n // \"false\" selected the records where the value was true.\n if (filter.type === \"boolean\") {\n return (\n <select\n key={filter.key}\n value={\n filterValue === undefined || filterValue === null\n ? \"\"\n : asBoolean(filterValue)\n ? \"true\"\n : \"false\"\n }\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n e.target.value === \"\"\n ? undefined\n : e.target.value === \"true\",\n )\n }\n className=\"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary\"\n aria-label={`Filter by ${filter.key}`}\n >\n <option value=\"\">All {filter.key}</option>\n <option value=\"true\">\n {filter.placeholder\n ? `${filter.placeholder}: yes`\n : \"Yes\"}\n </option>\n <option value=\"false\">\n {filter.placeholder\n ? `${filter.placeholder}: no`\n : \"No\"}\n </option>\n </select>\n );\n }\n\n if (filter.type === \"select\" && filter.options) {\n return (\n <select\n key={filter.key}\n value={inputValue(filterValue)}\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n e.target.value || undefined,\n )\n }\n className=\"rounded-md border border-input px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-primary\"\n aria-label={`Filter by ${filter.key}`}\n >\n <option value=\"\">All {filter.key}</option>\n {filter.options.map((option) => (\n <option key={option.value} value={String(option.value)}>\n {option.label}\n </option>\n ))}\n </select>\n );\n }\n\n return (\n <Input\n key={filter.key}\n type={filter.type === \"number\" ? \"number\" : \"text\"}\n placeholder={\n filter.placeholder || `Filter ${filter.key}...`\n }\n // `String(filterValue || \"\")` blanked a legitimate 0 and a\n // legitimate false, so the box disagreed with the filter it\n // was showing.\n value={inputValue(filterValue)}\n onChange={(e) =>\n handleFilterChange(\n filter.key,\n // An emptied box is no filter. `Number(\"\")` is 0, which\n // used to leave only the zero-valued rows behind.\n e.target.value === \"\"\n ? undefined\n : filter.type === \"number\"\n ? Number(e.target.value)\n : e.target.value,\n )\n }\n className=\"min-w-[150px]\"\n aria-label={`Filter by ${filter.key}`}\n />\n );\n })}\n\n {/* Clear Filters */}\n {Object.keys(columnFilters).length > 0 && (\n <button\n type=\"button\"\n onClick={() => setColumnFilters({})}\n className=\"px-3 py-2 text-sm text-muted-foreground hover:text-foreground underline\"\n aria-label=\"Clear all filters\"\n >\n Clear filters\n </button>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Table */}\n <Table\n {...tableProps}\n data={paginatedData}\n columns={columns}\n rowKey={rowKey}\n emptyText={emptyText}\n {...(sortColumn && {\n sortColumn,\n sortDirection,\n })}\n onSort={handleSort}\n {...(showPagination && {\n pagination: {\n current: currentPage,\n pageSize: pageSize,\n total:\n isControlledPagination && totalItems !== undefined\n ? totalItems\n : sortedData.length,\n onChange: handlePageChange,\n showSizeChanger: true,\n },\n })}\n />\n\n {/* Results Summary */}\n {showPagination &&\n (isControlledPagination && totalItems !== undefined\n ? totalItems > 0\n : sortedData.length > 0) && (\n <div className=\"mt-2 px-4 py-2 text-sm text-muted-foreground\">\n {isControlledPagination && totalItems !== undefined ? (\n <>\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\n {Math.min(currentPage * pageSize, totalItems)} of {totalItems}{\" \"}\n results\n {searchTerm && \" (filtered)\"}\n </>\n ) : (\n <>\n Showing {(currentPage - 1) * pageSize + 1} to{\" \"}\n {Math.min(currentPage * pageSize, sortedData.length)} of{\" \"}\n {sortedData.length} results\n {searchTerm && ` (filtered from ${initialData.length} total)`}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\nDataTable.displayName = \"DataTable\";\n\n// Memoize DataTable for performance optimization\n// DataTable is a complex component with filtering, sorting, and pagination\nexport const DataTableMemoized = memo(DataTable) as typeof DataTable;\n"]}
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- 'use strict';var chunkAYEM2M4H_cjs=require('../../chunk-AYEM2M4H.cjs');require('../../chunk-VNDL67OG.cjs'),require('../../chunk-FUENXWR7.cjs'),require('../../chunk-7SPPGTBT.cjs'),require('../../chunk-ITRGJNWL.cjs');Object.defineProperty(exports,"DataTable",{enumerable:true,get:function(){return chunkAYEM2M4H_cjs.a}});Object.defineProperty(exports,"DataTableMemoized",{enumerable:true,get:function(){return chunkAYEM2M4H_cjs.b}});//# sourceMappingURL=data-table.cjs.map
2
+ 'use strict';var chunkKASVYULP_cjs=require('../../chunk-KASVYULP.cjs');require('../../chunk-UC577SR4.cjs'),require('../../chunk-FUENXWR7.cjs'),require('../../chunk-7SPPGTBT.cjs'),require('../../chunk-ITRGJNWL.cjs');Object.defineProperty(exports,"DataTable",{enumerable:true,get:function(){return chunkKASVYULP_cjs.a}});Object.defineProperty(exports,"DataTableMemoized",{enumerable:true,get:function(){return chunkKASVYULP_cjs.b}});//# sourceMappingURL=data-table.cjs.map
3
3
  //# sourceMappingURL=data-table.cjs.map
@@ -40,12 +40,33 @@ interface DataTableProps<T = Record<string, unknown>> extends Omit<TableProps<T>
40
40
  onPageChange?: (page: number) => void;
41
41
  onPageSizeChange?: (size: number) => void;
42
42
  totalItems?: number;
43
+ /**
44
+ * Who does the work.
45
+ *
46
+ * Passing `searchTerm`, `columnFilters` or `sortColumn` makes DataTable
47
+ * controlled - it stops owning that piece of state - but it kept filtering and
48
+ * sorting the rows you gave it anyway. For a server-backed table that is
49
+ * actively wrong: a server searching without accent distinctions returns
50
+ * `{ name: "José" }` for the query `jose`, and the local substring filter then
51
+ * threw the row away while `totalItems` still counted it. Controlled sorting
52
+ * likewise reordered the page the server had already ordered.
53
+ *
54
+ * Controlled state and processing ownership are separate questions now. Set
55
+ * these when the rows arriving in `data` are already searched, filtered or
56
+ * sorted; the callbacks still fire so you know what the user asked for.
57
+ *
58
+ * Pagination has always worked this way, under a different name: it is manual
59
+ * when `currentPage` and `totalItems` are both given.
60
+ */
61
+ manualSearch?: boolean;
62
+ manualFiltering?: boolean;
63
+ manualSorting?: boolean;
43
64
  showSearch?: boolean;
44
65
  showFilters?: boolean;
45
66
  filterBarClassName?: string;
46
67
  searchBarClassName?: string;
47
68
  }
48
- declare function DataTable<T extends Record<string, unknown> = Record<string, unknown>>({ data: initialData, columns, searchable, searchPlaceholder, searchKeys, onSearch, searchTerm: controlledSearchTerm, onSearchTermChange, filterable, filters, onFilter, columnFilters: controlledColumnFilters, onColumnFiltersChange, defaultSortColumn, defaultSortDirection, sortColumn: controlledSortColumn, sortDirection: controlledSortDirection, onSortChange, defaultPageSize, showPagination, currentPage: controlledCurrentPage, pageSize: controlledPageSize, onPageChange, onPageSizeChange, totalItems, showSearch, showFilters, filterBarClassName, searchBarClassName, rowKey, emptyText, ...tableProps }: DataTableProps<T>): React__default.JSX.Element;
69
+ declare function DataTable<T extends Record<string, unknown> = Record<string, unknown>>({ data: initialData, columns, searchable, searchPlaceholder, searchKeys, onSearch, searchTerm: controlledSearchTerm, onSearchTermChange, filterable, manualSearch, manualFiltering, manualSorting, filters, onFilter, columnFilters: controlledColumnFilters, onColumnFiltersChange, defaultSortColumn, defaultSortDirection, sortColumn: controlledSortColumn, sortDirection: controlledSortDirection, onSortChange, defaultPageSize, showPagination, currentPage: controlledCurrentPage, pageSize: controlledPageSize, onPageChange, onPageSizeChange, totalItems, showSearch, showFilters, filterBarClassName, searchBarClassName, rowKey, emptyText, ...tableProps }: DataTableProps<T>): React__default.JSX.Element;
49
70
  declare namespace DataTable {
50
71
  var displayName: string;
51
72
  }
@@ -40,12 +40,33 @@ interface DataTableProps<T = Record<string, unknown>> extends Omit<TableProps<T>
40
40
  onPageChange?: (page: number) => void;
41
41
  onPageSizeChange?: (size: number) => void;
42
42
  totalItems?: number;
43
+ /**
44
+ * Who does the work.
45
+ *
46
+ * Passing `searchTerm`, `columnFilters` or `sortColumn` makes DataTable
47
+ * controlled - it stops owning that piece of state - but it kept filtering and
48
+ * sorting the rows you gave it anyway. For a server-backed table that is
49
+ * actively wrong: a server searching without accent distinctions returns
50
+ * `{ name: "José" }` for the query `jose`, and the local substring filter then
51
+ * threw the row away while `totalItems` still counted it. Controlled sorting
52
+ * likewise reordered the page the server had already ordered.
53
+ *
54
+ * Controlled state and processing ownership are separate questions now. Set
55
+ * these when the rows arriving in `data` are already searched, filtered or
56
+ * sorted; the callbacks still fire so you know what the user asked for.
57
+ *
58
+ * Pagination has always worked this way, under a different name: it is manual
59
+ * when `currentPage` and `totalItems` are both given.
60
+ */
61
+ manualSearch?: boolean;
62
+ manualFiltering?: boolean;
63
+ manualSorting?: boolean;
43
64
  showSearch?: boolean;
44
65
  showFilters?: boolean;
45
66
  filterBarClassName?: string;
46
67
  searchBarClassName?: string;
47
68
  }
48
- declare function DataTable<T extends Record<string, unknown> = Record<string, unknown>>({ data: initialData, columns, searchable, searchPlaceholder, searchKeys, onSearch, searchTerm: controlledSearchTerm, onSearchTermChange, filterable, filters, onFilter, columnFilters: controlledColumnFilters, onColumnFiltersChange, defaultSortColumn, defaultSortDirection, sortColumn: controlledSortColumn, sortDirection: controlledSortDirection, onSortChange, defaultPageSize, showPagination, currentPage: controlledCurrentPage, pageSize: controlledPageSize, onPageChange, onPageSizeChange, totalItems, showSearch, showFilters, filterBarClassName, searchBarClassName, rowKey, emptyText, ...tableProps }: DataTableProps<T>): React__default.JSX.Element;
69
+ declare function DataTable<T extends Record<string, unknown> = Record<string, unknown>>({ data: initialData, columns, searchable, searchPlaceholder, searchKeys, onSearch, searchTerm: controlledSearchTerm, onSearchTermChange, filterable, manualSearch, manualFiltering, manualSorting, filters, onFilter, columnFilters: controlledColumnFilters, onColumnFiltersChange, defaultSortColumn, defaultSortDirection, sortColumn: controlledSortColumn, sortDirection: controlledSortDirection, onSortChange, defaultPageSize, showPagination, currentPage: controlledCurrentPage, pageSize: controlledPageSize, onPageChange, onPageSizeChange, totalItems, showSearch, showFilters, filterBarClassName, searchBarClassName, rowKey, emptyText, ...tableProps }: DataTableProps<T>): React__default.JSX.Element;
49
70
  declare namespace DataTable {
50
71
  var displayName: string;
51
72
  }
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- export{a as DataTable,b as DataTableMemoized}from'../../chunk-XJJJEWSU.js';import'../../chunk-UIEGBT4T.js';import'../../chunk-HD3TMQPR.js';import'../../chunk-COXN6XBA.js';import'../../chunk-AC2JBXHQ.js';//# sourceMappingURL=data-table.js.map
2
+ export{a as DataTable,b as DataTableMemoized}from'../../chunk-YC6ALHAZ.js';import'../../chunk-HCO4XKPM.js';import'../../chunk-HD3TMQPR.js';import'../../chunk-COXN6XBA.js';import'../../chunk-AC2JBXHQ.js';//# sourceMappingURL=data-table.js.map
3
3
  //# sourceMappingURL=data-table.js.map
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- 'use strict';var chunkVNDL67OG_cjs=require('../../chunk-VNDL67OG.cjs');require('../../chunk-ITRGJNWL.cjs');Object.defineProperty(exports,"Table",{enumerable:true,get:function(){return chunkVNDL67OG_cjs.d}});Object.defineProperty(exports,"TableBody",{enumerable:true,get:function(){return chunkVNDL67OG_cjs.f}});Object.defineProperty(exports,"TableCell",{enumerable:true,get:function(){return chunkVNDL67OG_cjs.h}});Object.defineProperty(exports,"TableHead",{enumerable:true,get:function(){return chunkVNDL67OG_cjs.i}});Object.defineProperty(exports,"TableHeader",{enumerable:true,get:function(){return chunkVNDL67OG_cjs.e}});Object.defineProperty(exports,"TableRow",{enumerable:true,get:function(){return chunkVNDL67OG_cjs.g}});Object.defineProperty(exports,"tableCellVariants",{enumerable:true,get:function(){return chunkVNDL67OG_cjs.c}});Object.defineProperty(exports,"tableHeaderVariants",{enumerable:true,get:function(){return chunkVNDL67OG_cjs.b}});Object.defineProperty(exports,"tableVariants",{enumerable:true,get:function(){return chunkVNDL67OG_cjs.a}});//# sourceMappingURL=table.cjs.map
2
+ 'use strict';var chunkUC577SR4_cjs=require('../../chunk-UC577SR4.cjs');require('../../chunk-ITRGJNWL.cjs');Object.defineProperty(exports,"Table",{enumerable:true,get:function(){return chunkUC577SR4_cjs.d}});Object.defineProperty(exports,"TableBody",{enumerable:true,get:function(){return chunkUC577SR4_cjs.f}});Object.defineProperty(exports,"TableCell",{enumerable:true,get:function(){return chunkUC577SR4_cjs.h}});Object.defineProperty(exports,"TableHead",{enumerable:true,get:function(){return chunkUC577SR4_cjs.i}});Object.defineProperty(exports,"TableHeader",{enumerable:true,get:function(){return chunkUC577SR4_cjs.e}});Object.defineProperty(exports,"TableRow",{enumerable:true,get:function(){return chunkUC577SR4_cjs.g}});Object.defineProperty(exports,"tableCellVariants",{enumerable:true,get:function(){return chunkUC577SR4_cjs.c}});Object.defineProperty(exports,"tableHeaderVariants",{enumerable:true,get:function(){return chunkUC577SR4_cjs.b}});Object.defineProperty(exports,"tableVariants",{enumerable:true,get:function(){return chunkUC577SR4_cjs.a}});//# sourceMappingURL=table.cjs.map
3
3
  //# sourceMappingURL=table.cjs.map
@@ -56,7 +56,17 @@ interface TableProps<T = Record<string, unknown>> extends VariantProps<typeof ta
56
56
  };
57
57
  selection?: {
58
58
  selectedRowKeys: (string | number)[];
59
+ /**
60
+ * `selectedRowKeys` is the complete selection, including keys for records on
61
+ * other pages. `selectedRows` is only the subset present in `data`, because
62
+ * the component has never been given the rest. Paginating server-side means
63
+ * keeping your own key-to-record map and treating the keys as authoritative.
64
+ */
59
65
  onChange: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;
66
+ /**
67
+ * A disabled row cannot be selected individually, and select-all skips it
68
+ * rather than selecting it on the consumer's behalf.
69
+ */
60
70
  getCheckboxProps?: (record: T) => {
61
71
  disabled?: boolean;
62
72
  };
@@ -56,7 +56,17 @@ interface TableProps<T = Record<string, unknown>> extends VariantProps<typeof ta
56
56
  };
57
57
  selection?: {
58
58
  selectedRowKeys: (string | number)[];
59
+ /**
60
+ * `selectedRowKeys` is the complete selection, including keys for records on
61
+ * other pages. `selectedRows` is only the subset present in `data`, because
62
+ * the component has never been given the rest. Paginating server-side means
63
+ * keeping your own key-to-record map and treating the keys as authoritative.
64
+ */
59
65
  onChange: (selectedRowKeys: (string | number)[], selectedRows: T[]) => void;
66
+ /**
67
+ * A disabled row cannot be selected individually, and select-all skips it
68
+ * rather than selecting it on the consumer's behalf.
69
+ */
60
70
  getCheckboxProps?: (record: T) => {
61
71
  disabled?: boolean;
62
72
  };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- export{d as Table,f as TableBody,h as TableCell,i as TableHead,e as TableHeader,g as TableRow,c as tableCellVariants,b as tableHeaderVariants,a as tableVariants}from'../../chunk-UIEGBT4T.js';import'../../chunk-AC2JBXHQ.js';//# sourceMappingURL=table.js.map
2
+ export{d as Table,f as TableBody,h as TableCell,i as TableHead,e as TableHeader,g as TableRow,c as tableCellVariants,b as tableHeaderVariants,a as tableVariants}from'../../chunk-HCO4XKPM.js';import'../../chunk-AC2JBXHQ.js';//# sourceMappingURL=table.js.map
3
3
  //# sourceMappingURL=table.js.map
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- 'use strict';var chunk5Z3MYAVM_cjs=require('../../chunk-5Z3MYAVM.cjs');require('../../chunk-7SPPGTBT.cjs'),require('../../chunk-ITRGJNWL.cjs');Object.defineProperty(exports,"Toast",{enumerable:true,get:function(){return chunk5Z3MYAVM_cjs.e}});Object.defineProperty(exports,"ToastProvider",{enumerable:true,get:function(){return chunk5Z3MYAVM_cjs.d}});Object.defineProperty(exports,"toastIconVariants",{enumerable:true,get:function(){return chunk5Z3MYAVM_cjs.b}});Object.defineProperty(exports,"toastVariants",{enumerable:true,get:function(){return chunk5Z3MYAVM_cjs.a}});Object.defineProperty(exports,"useToast",{enumerable:true,get:function(){return chunk5Z3MYAVM_cjs.c}});Object.defineProperty(exports,"useToastNotification",{enumerable:true,get:function(){return chunk5Z3MYAVM_cjs.f}});//# sourceMappingURL=toast.cjs.map
2
+ 'use strict';var chunkJTHW25XF_cjs=require('../../chunk-JTHW25XF.cjs');require('../../chunk-7SPPGTBT.cjs'),require('../../chunk-ITRGJNWL.cjs');Object.defineProperty(exports,"Toast",{enumerable:true,get:function(){return chunkJTHW25XF_cjs.e}});Object.defineProperty(exports,"ToastProvider",{enumerable:true,get:function(){return chunkJTHW25XF_cjs.d}});Object.defineProperty(exports,"toastIconVariants",{enumerable:true,get:function(){return chunkJTHW25XF_cjs.b}});Object.defineProperty(exports,"toastVariants",{enumerable:true,get:function(){return chunkJTHW25XF_cjs.a}});Object.defineProperty(exports,"useToast",{enumerable:true,get:function(){return chunkJTHW25XF_cjs.c}});Object.defineProperty(exports,"useToastNotification",{enumerable:true,get:function(){return chunkJTHW25XF_cjs.f}});//# sourceMappingURL=toast.cjs.map
3
3
  //# sourceMappingURL=toast.cjs.map
@@ -2,6 +2,55 @@ import * as class_variance_authority_types from 'class-variance-authority/types'
2
2
  import React__default from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
+ /**
6
+ * Notifications, and the provider that owns them.
7
+ *
8
+ * Three things about this component are worth reading before changing it.
9
+ *
10
+ * ## The viewport positions, the toast does not
11
+ *
12
+ * A `ToastProvider` renders one `ToastViewport` per position: a fixed, bounded
13
+ * column that stacks its children in normal flex flow with a gap. The toasts
14
+ * inside it are ordinary block elements.
15
+ *
16
+ * Every toast used to position itself instead, with `fixed right-4` plus `w-full`
17
+ * and a `translateY(index * 8px)` for stacking. Both halves were wrong. `w-full`
18
+ * against a fixed right offset made a 1200px-wide box starting at x=-16, so the
19
+ * notification ran off the left edge of the window; and 8px of offset for a box
20
+ * about 94px tall meant the second notification covered nearly all of the first.
21
+ *
22
+ * A standalone `<Toast position="top-right">` still positions itself, because
23
+ * that is a supported way to use it. `ToastViewportContext` is how a toast knows
24
+ * which of the two it is in.
25
+ *
26
+ * ## One dismissal path
27
+ *
28
+ * Closing a toast used to leave it in the provider's `toasts` array forever: the
29
+ * component unmounted itself and nothing told the provider. A persistent toast
30
+ * dismissed ten times left ten invisible entries behind.
31
+ *
32
+ * Now every route - the close button, the timeout, `dismiss(id)`, `clear()` -
33
+ * goes through the same two steps. `removeToast` marks the toast as dismissing,
34
+ * which starts its exit animation; when the animation ends the toast reports back
35
+ * and the provider drops it from state. `onClose` fires exactly once, guarded by
36
+ * a ref, whichever route was taken.
37
+ *
38
+ * There is also exactly one timer per toast. Inside a viewport the provider owns
39
+ * it; standalone, the toast owns its own. Previously both ran, and the provider's
40
+ * could remove a toast before its own exit finished.
41
+ *
42
+ * ## Announcement is the default, not an opt-in
43
+ *
44
+ * A toast carries `role="status"` and `aria-live="polite"`, or `role="alert"` and
45
+ * `aria-live="assertive"` for the error variant, so a message that appears
46
+ * without warning is announced without the caller arranging anything. It is also
47
+ * `aria-atomic`, so the title and description are read as one message rather than
48
+ * as two arrivals. Pass `role` or `aria-live` to override either.
49
+ *
50
+ * Focus is deliberately not moved. A notification that steals focus interrupts
51
+ * whatever the reader was doing, which is worse than the problem it solves; the
52
+ * close button and any action stay reachable by Tab.
53
+ */
5
54
  declare const toastVariants: (props?: ({
6
55
  variant?: "default" | "success" | "error" | "warning" | "info" | null | undefined;
7
56
  position?: "top-left" | "top-center" | "top-right" | "bottom-left" | "bottom-center" | "bottom-right" | null | undefined;
@@ -10,6 +59,7 @@ declare const toastVariants: (props?: ({
10
59
  declare const toastIconVariants: (props?: ({
11
60
  variant?: "default" | "success" | "error" | "warning" | "info" | null | undefined;
12
61
  } & class_variance_authority_types.ClassProp) | undefined) => string;
62
+ type ToastPosition = "top-left" | "top-center" | "top-right" | "bottom-left" | "bottom-center" | "bottom-right";
13
63
  interface ToastProps extends VariantProps<typeof toastVariants>, React__default.HTMLAttributes<HTMLDivElement> {
14
64
  id?: string;
15
65
  title?: string;
@@ -24,6 +74,14 @@ interface ToastProps extends VariantProps<typeof toastVariants>, React__default.
24
74
  children?: React__default.ReactNode;
25
75
  appearDelay?: number;
26
76
  animationMs?: number;
77
+ /**
78
+ * Internal. Set by the viewport to start the exit animation, so that a
79
+ * programmatic `dismiss(id)` animates out like a click on the close button
80
+ * rather than vanishing.
81
+ */
82
+ dismissing?: boolean;
83
+ /** Internal. Told to the provider when the exit animation has finished. */
84
+ onExited?: () => void;
27
85
  }
28
86
  interface ToastContextType {
29
87
  toasts: ToastProps[];
@@ -47,4 +105,4 @@ declare const useToastNotification: () => {
47
105
  clear: () => void;
48
106
  };
49
107
 
50
- export { Toast, type ToastContextType, type ToastProps, ToastProvider, toastIconVariants, toastVariants, useToast, useToastNotification };
108
+ export { Toast, type ToastContextType, type ToastPosition, type ToastProps, ToastProvider, toastIconVariants, toastVariants, useToast, useToastNotification };
@@ -2,6 +2,55 @@ import * as class_variance_authority_types from 'class-variance-authority/types'
2
2
  import React__default from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
+ /**
6
+ * Notifications, and the provider that owns them.
7
+ *
8
+ * Three things about this component are worth reading before changing it.
9
+ *
10
+ * ## The viewport positions, the toast does not
11
+ *
12
+ * A `ToastProvider` renders one `ToastViewport` per position: a fixed, bounded
13
+ * column that stacks its children in normal flex flow with a gap. The toasts
14
+ * inside it are ordinary block elements.
15
+ *
16
+ * Every toast used to position itself instead, with `fixed right-4` plus `w-full`
17
+ * and a `translateY(index * 8px)` for stacking. Both halves were wrong. `w-full`
18
+ * against a fixed right offset made a 1200px-wide box starting at x=-16, so the
19
+ * notification ran off the left edge of the window; and 8px of offset for a box
20
+ * about 94px tall meant the second notification covered nearly all of the first.
21
+ *
22
+ * A standalone `<Toast position="top-right">` still positions itself, because
23
+ * that is a supported way to use it. `ToastViewportContext` is how a toast knows
24
+ * which of the two it is in.
25
+ *
26
+ * ## One dismissal path
27
+ *
28
+ * Closing a toast used to leave it in the provider's `toasts` array forever: the
29
+ * component unmounted itself and nothing told the provider. A persistent toast
30
+ * dismissed ten times left ten invisible entries behind.
31
+ *
32
+ * Now every route - the close button, the timeout, `dismiss(id)`, `clear()` -
33
+ * goes through the same two steps. `removeToast` marks the toast as dismissing,
34
+ * which starts its exit animation; when the animation ends the toast reports back
35
+ * and the provider drops it from state. `onClose` fires exactly once, guarded by
36
+ * a ref, whichever route was taken.
37
+ *
38
+ * There is also exactly one timer per toast. Inside a viewport the provider owns
39
+ * it; standalone, the toast owns its own. Previously both ran, and the provider's
40
+ * could remove a toast before its own exit finished.
41
+ *
42
+ * ## Announcement is the default, not an opt-in
43
+ *
44
+ * A toast carries `role="status"` and `aria-live="polite"`, or `role="alert"` and
45
+ * `aria-live="assertive"` for the error variant, so a message that appears
46
+ * without warning is announced without the caller arranging anything. It is also
47
+ * `aria-atomic`, so the title and description are read as one message rather than
48
+ * as two arrivals. Pass `role` or `aria-live` to override either.
49
+ *
50
+ * Focus is deliberately not moved. A notification that steals focus interrupts
51
+ * whatever the reader was doing, which is worse than the problem it solves; the
52
+ * close button and any action stay reachable by Tab.
53
+ */
5
54
  declare const toastVariants: (props?: ({
6
55
  variant?: "default" | "success" | "error" | "warning" | "info" | null | undefined;
7
56
  position?: "top-left" | "top-center" | "top-right" | "bottom-left" | "bottom-center" | "bottom-right" | null | undefined;
@@ -10,6 +59,7 @@ declare const toastVariants: (props?: ({
10
59
  declare const toastIconVariants: (props?: ({
11
60
  variant?: "default" | "success" | "error" | "warning" | "info" | null | undefined;
12
61
  } & class_variance_authority_types.ClassProp) | undefined) => string;
62
+ type ToastPosition = "top-left" | "top-center" | "top-right" | "bottom-left" | "bottom-center" | "bottom-right";
13
63
  interface ToastProps extends VariantProps<typeof toastVariants>, React__default.HTMLAttributes<HTMLDivElement> {
14
64
  id?: string;
15
65
  title?: string;
@@ -24,6 +74,14 @@ interface ToastProps extends VariantProps<typeof toastVariants>, React__default.
24
74
  children?: React__default.ReactNode;
25
75
  appearDelay?: number;
26
76
  animationMs?: number;
77
+ /**
78
+ * Internal. Set by the viewport to start the exit animation, so that a
79
+ * programmatic `dismiss(id)` animates out like a click on the close button
80
+ * rather than vanishing.
81
+ */
82
+ dismissing?: boolean;
83
+ /** Internal. Told to the provider when the exit animation has finished. */
84
+ onExited?: () => void;
27
85
  }
28
86
  interface ToastContextType {
29
87
  toasts: ToastProps[];
@@ -47,4 +105,4 @@ declare const useToastNotification: () => {
47
105
  clear: () => void;
48
106
  };
49
107
 
50
- export { Toast, type ToastContextType, type ToastProps, ToastProvider, toastIconVariants, toastVariants, useToast, useToastNotification };
108
+ export { Toast, type ToastContextType, type ToastPosition, type ToastProps, ToastProvider, toastIconVariants, toastVariants, useToast, useToastNotification };
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- export{e as Toast,d as ToastProvider,b as toastIconVariants,a as toastVariants,c as useToast,f as useToastNotification}from'../../chunk-WO3KCAN6.js';import'../../chunk-COXN6XBA.js';import'../../chunk-AC2JBXHQ.js';//# sourceMappingURL=toast.js.map
2
+ export{e as Toast,d as ToastProvider,b as toastIconVariants,a as toastVariants,c as useToast,f as useToastNotification}from'../../chunk-CH5LTBAG.js';import'../../chunk-COXN6XBA.js';import'../../chunk-AC2JBXHQ.js';//# sourceMappingURL=toast.js.map
3
3
  //# sourceMappingURL=toast.js.map